]> git.pld-linux.org Git - packages/brltty.git/blame - brltty.spec
- unified
[packages/brltty.git] / brltty.spec
CommitLineData
3704768a 1# TODO:
6913fe15
SS
2# - ocaml bcond is useless now:
3# Cannot find ocamlfind.
4# BrlAPI Caml bindings will be compiled but not installed.
09255552 5# - check java stuff
ac744b8d 6# - create bcond to build with minimal deps (wo ncurses,gpm,at-spi*)
3704768a 7#
608626ec
SS
8# Conditional build:
9%bcond_without apidocs # documentation generated with doxygen
09255552 10%bcond_with java # java bindings
6913fe15 11%bcond_with ocaml # ocaml bindings (NFY)
0bb357f1
SS
12%bcond_without python # python bindings
13%bcond_without tcl # tcl bindings
eb77b64b 14%bcond_without x # build X11-based utilities
608626ec 15#
9b20373a 16Summary: Braille display driver for Linux/Unix
8731bfde 17Summary(pl.UTF-8): Sterownik do wyświetlaczy Braille'a
91162002 18Name: brltty
18f080b9 19Version: 3.9
20Release: 1
9b20373a 21Group: Daemons
91162002 22License: GPL
91162002 23Source0: http://mielke.cc/brltty/releases/%{name}-%{version}.tar.gz
18f080b9 24# Source0-md5: 7ce54ba2d38b7c220870e8c781f36743
1a7665e9 25URL: http://mielke.cc/brltty/
ac744b8d 26BuildRequires: at-spi-devel
91162002 27BuildRequires: autoconf >= 2.53
664a738b 28BuildRequires: automake
91162002 29BuildRequires: bison
3704768a 30#BuildRequires: bluez-devel
608626ec 31%{?with_apidocs:BuildRequires: doxygen}
915167f5 32BuildRequires: gpm-devel
09255552 33%{?with_java:BuildRequires: jdk}
eb77b64b 34BuildRequires: ncurses-devel
6913fe15 35%{?with_ocaml:BuildRequires: ocaml}
ac744b8d 36BuildRequires: pkgconfig
0bb357f1
SS
37%{?with_python:BuildRequires: python-Pyrex}
38%{?with_python:BuildRequires: rpm-pythonprov}
39%{?with_tcl:BuildRequires: tcl}
eb77b64b
SS
40%{?with_x:BuildRequires: xorg-lib-libXaw-devel}
41%{?with_x:BuildRequires: xorg-lib-libXtst-devel}
91162002 42BuildRoot: %{tmpdir}/%{name}-%{version}-root-%(id -u -n)
43
44%description
45BRLTTY is a background process (daemon) which provides access to the
46Linux/Unix console (when in text mode) for a blind person using a
33e3c5f9 47refreshable Braille display. It drives the Braille display, and
3b0ec988 48provides complete screen review functionality. Some speech capability
91162002 49has also been incorporated.
50
54f59947
JR
51%description -l pl.UTF-8
52BRLTTY jest demonem, który udostępnia dostęp do linuksowej konsoli (w
53trybie tekstowym) dla niewidomych używających wyświetlaczy Braille'a z
54odświeżaniem (refreshable Braille display). BRLTTY steruje
55wyświetlaczem Braille'a i dostarcza funkcjonalność całkowitego
56przeglądu ekranu. Do tego pakietu została włączona możliwość syntezy
9b20373a 57mowy.
91162002 58
59%package -n brlapi
9b20373a 60Summary: Application Programming Interface for BRLTTY
8731bfde 61Summary(pl.UTF-8): API do BRLTTY
3b0ec988 62Group: Applications/System
91162002 63
64%description -n brlapi
65This package provides the run-time support for the Application
66Programming Interface to BRLTTY.
67
9b20373a 68Install this package if you have an application which directly
69accesses a refreshable Braille display.
91162002 70
54f59947
JR
71%description -n brlapi -l pl.UTF-8
72Ten pakiet zawiera środowisko uruchomieniowe dla programów
73korzystających z API BRLTTY.
91162002 74
54f59947
JR
75Zainstaluj ten pakiet jeśli masz aplikację, która bezpośrednio używa
76wyświetlacza Braille'a z odświeżaniem.
91162002 77
78%package -n brlapi-devel
9b20373a 79Summary: Headers and documentation for BrlAPI
8731bfde 80Summary(pl.UTF-8): Pliki nagłówkowe i dokumentacja do BrlAPI
3b0ec988 81Group: Development/Libraries
664a738b 82Requires: brlapi = %{version}-%{release}
91162002 83
84%description -n brlapi-devel
9b20373a 85This package provides the header files, shared object linker
86reference, and reference documentation for BrlAPI (the Application
3b0ec988 87Programming Interface to BRLTTY). It enables the implementation of
9b20373a 88applications which take direct advantage of a refreshable Braille
89display in order to present information in ways which are more
90appropriate for blind users and/or to provide user interfaces which
91are more specifically atuned to their needs.
91162002 92
3b0ec988 93Install this package if you're developing or maintaining an
94application which directly accesses a refreshable Braille display.
91162002 95
54f59947
JR
96%description -n brlapi-devel -l pl.UTF-8
97Ten pakiet zawiera pliki nagłówkowe oraz dokumentację do BrlAPI (API
98do BRLTTY). BrlAPI pozwala implementować aplikacje, które bezpośrednio
99korzystają z wyświetlaczy Braille'a dostarczając interfejs użytkownika
100bardziej przystosowany dla osób niewidomych.
91162002 101
54f59947
JR
102Zainstaluj ten pakiet, jeśli tworzysz lub nadzorujesz aplikację
103korzystającą bezpośrednio z odświeżalnych wyświetlaczy Braille'a.
91162002 104
105%package -n brlapi-static
9b20373a 106Summary: Static BrlAPI library
8731bfde 107Summary(pl.UTF-8): Statyczna biblioteka BrlAPI
3b0ec988 108Group: Development/Libraries
664a738b 109Requires: brlapi-devel = %{version}-%{release}
91162002 110
111%description -n brlapi-static
9b20373a 112This is package with static BrlAPI library.
91162002 113
54f59947
JR
114%description -n brlapi-static -l pl.UTF-8
115Ten pakiet zawiera statyczną wersję biblioteki BrlAPI.
91162002 116
608626ec
SS
117%package -n brlapi-apidocs
118Summary: BrlAPI documentation
119Summary(pl.UTF-8): Documentacja BrlAPI
120Group: Documentation
121
122%description -n brlapi-apidocs
123Documentation for BrlAPI in HTML format generated from brltty
124sources by doxygen.
125
126%description -n brlapi-apidocs -l pl.UTF-8
127Dokumentacja BrlAPI w formacie HTML generowane ze
128źrodeł brltty przez doxygen.
129
09255552
SS
130%package -n brlapi-java
131Summary: BrlAPI library for Java
132Summary(pl.UTF-8): Biblioteka BrlAPI dla Javy
133Group: Libraries
134Requires: brlapi = %{version}-%{release}
135
136%description -n brlapi-java
137BrlAPI library for Java.
138
139%description -n brlapi-java -l pl.UTF-8
140Biblioteka BrlAPI dla Javy.
141
0bb357f1
SS
142%package -n python-brlapi
143Summary: Python interface to BrlAPI
144Summary(pl.UTF-8): Pythonowy interfejs do BrlAPI
145Group: Libraries
146Requires: brlapi = %{version}-%{release}
147
148%description -n python-brlapi
149Python interface to BrlAPI.
150
151%description -n python-brlapi -l pl.UTF-8
152Pythonowy interfejs do BrlAPI.
153
154%package -n brlapi-tcl
155Summary: BrlAPI library for Tcl
156Summary(pl.UTF-8): Biblioteka BrlAPI dla Tcl
157Group: Libraries
158Requires: brlapi = %{version}-%{release}
159
160%description -n brlapi-tcl
161BrlAPI library for Tcl.
162
163%description -n brlapi-tcl -l pl.UTF-8
164Biblioteka BrlAPI dla Tcl.
165
91162002 166%prep
167%setup -q
168
169%build
664a738b
JB
170%{__aclocal}
171%{__autoconf}
172cp -f /usr/share/automake/config.sub acdir
915167f5 173CFLAGS="%{rpmcflags} -I/usr/include/ncurses"
664a738b
JB
174%configure \
175 --with-install-root="$RPM_BUILD_ROOT" \
91162002 176 --disable-tainted-components \
f50dc761 177 %{!?with_java:--disable-java-bindings} \
91162002 178 --enable-api
179%{__make}
180
181directory="doc"
182mkdir -p "$directory"
183for file in `find . \( -path "./$directory" -o -path ./Documents \) -prune -o \( -name 'README*' -o -name '*.txt' -o -name '*.html' -o -name '*.sgml' -o \( -path "./Bootdisks/*" -type f -perm +ugo=x \) \) -print`
184do
9b20373a 185 mkdir -p "$directory/${file%/*}"
186 cp -rp "$file" "$directory/$file"
91162002 187done
188
189%install
190rm -rf $RPM_BUILD_ROOT
191%{__make} install
3b0ec988 192install Documents/brltty.conf $RPM_BUILD_ROOT%{_sysconfdir}
91162002 193
194%clean
195rm -rf $RPM_BUILD_ROOT
196
197%pre
198# The pre-install scriptlet.
199
200# If a configuration file already exists then rpm installs the new one as
201# <path>.rpmnew. If this is done then the .rpmnew file is overwritten if it
202# already exists.
203
204# There's no explicit way to tell if a configuration file has been installed
205# as itself or as a .rpmnew file. The way we'll figure it out, therefore, is by
3b0ec988 206# erasing the .rpmnew file now so that we can see if it gets created later.
91162002 207rm -f "%{_sysconfdir}/brltty.conf.rpmnew"
208
209%post
210# The post-install scriptlet.
211
212# If BRLTTY's boot parameter has been specified then update the just installed
213# configuration file template to reflect the options supplied thereby.
214
215# First, we need to determine which file to update. If there's a .rpmnew file
216# then update it since a previous configuration file must already have existed.
217file="%{_sysconfdir}/brltty.conf"
218new="${file}.rpmnew"
219[ -f "${new}" ] && file="${new}"
220
221# Update the configuration file template via the Bootdisks/bp2cf script.
222# Include it right within this scriptlet so that it needn't be installed.
223# Imbed it within a subshell to ensure that it won't impact this scriptlet.
224(
c247b245 225 # First, set bp2cf's command line arguments.
226 set -- -u -f "${file}"
91162002 227
228#!/bin/sh
229###############################################################################
230# BRLTTY - A background process providing access to the Linux console (when in
9b20373a 231# text mode) for a blind person using a refreshable Braille display.
91162002 232#
233# Copyright (C) 1995-2003 by The BRLTTY Team. All rights reserved.
234#
235# BRLTTY comes with ABSOLUTELY NO WARRANTY.
236#
237# This is free software, placed under the terms of the
238# GNU General Public License, as published by the Free Software
239# Foundation. Please see the file COPYING for details.
240#
241# Web Page: http://mielke.cc/brltty/
242#
243# This software is maintained by Dave Mielke <dave@mielke.cc>.
244###############################################################################
245
246# Convert the boot parameter to configuration file directives.
247# If /proc is mounted then use the brltty= boot parameter in /proc/cmdline.
248# If /proc is not mounted then use the brltty environment variable.
249# Invoke with -h for usage information.
250
251programName="${0##*/}"
252programMessage()
253{
c247b245 254 echo 2>&1 "${programName}: ${1}"
91162002 255}
256syntaxError()
257{
c247b245 258 programMessage "${1}"
259 exit 2
91162002 260}
261internalError()
262{
c247b245 263 programMessage "${1}"
264 exit 3
91162002 265}
266
267configurationFile=""
268requestedAction=create
269deviceTranslation=none
270requestedParameter=""
271OPTIND=1
272while getopts ":f:cundop:h" option
273do
c247b245 274 case "${option}" in
275 f) configurationFile="${OPTARG}";;
276 c) requestedAction=create;;
277 u) requestedAction=update;;
278 n) deviceTranslation=none;;
279 d) deviceTranslation=devfs;;
280 o) deviceTranslation=old;;
281 p) requestedParameter="${OPTARG}";;
282 h)
283 cat <<EOF
91162002 284Usage: ${programName} [option ...]
285-f file The configuration file to create/update.
286-c Create the configuration file (write to stdout if no -f).
287-u Update the configuration file (copying from stdin to stdout if no -f).
288-n Do not translate device paths.
289-d Do old-style to devfs device path translation.
290-o Do devfs to old-style device path translation.
291-p [driver][,[device][,[table]]]
292 Explicitly specify the boot parameter.
293-h Display this usage summary.
294EOF
c247b245 295 exit 0
296 ;;
297 \?) syntaxError "unknown option: -${OPTARG}";;
298 :) syntaxError "missing value: -${OPTARG}";;
299 *) internalError "unimplemented option: -${option}";;
300 esac
91162002 301done
302shift "`expr $OPTIND - 1`"
303[ "${#}" -eq 0 ] || syntaxError "too many parameters."
304
c247b245 305case "${requestedAction}" in
306 create)
307 putConfigurationLine()
308 {
309 echo "${1}" || exit 4
310 }
311 startConfigurationFile()
312 {
313 [ -n "${configurationFile}" ] && exec >"${configurationFile}"
314 putConfigurationLine "`makeHeaderLine Created`"
315 putConfigurationLine "`makeParameterLine`"
316 putConfigurationLine ""
317 }
318 putConfigurationDirective()
319 {
320 putConfigurationLine "${1} ${2}"
321 }
322 finalizeConfigurationFile()
323 {
324 :
325 }
326 ;;
327 update)
328 putSedCommand()
329 {
330 sedScript="${sedScript}
91162002 331${1}"
c247b245 332 }
333 startConfigurationFile()
334 {
106ddbb5 335 if [ -n "${configurationFile}" ]; then
c247b245 336 [ -e "${configurationFile}" ] || syntaxError "file not found: ${configurationFile}"
337 [ -f "${configurationFile}" ] || syntaxError "not a file: ${configurationFile}"
338 [ -r "${configurationFile}" ] || syntaxError "file not readable: ${configurationFile}"
339 [ -w "${configurationFile}" ] || syntaxError "file not writable: ${configurationFile}"
340 outputFile="${configurationFile}.new"
341 exec <"${configurationFile}" >"${outputFile}"
342 fi
343 sedScript=""
344 putSedCommand "1i\\
91162002 345`makeHeaderLine Updated`\\
346`makeParameterLine`\\
347"
c247b245 348 }
349 putConfigurationDirective()
350 {
351 value="`echo "${2}" | sed -e 's%\\([/\\]\\)%\\\\\\1%g'`"
352 putSedCommand "/^ *#\\(${1} .*\\)/s//\\1/"
353 putSedCommand "/^ *\\(${1}\\) .*/s//\\1 ${value}/"
354 }
355 finalizeConfigurationFile()
356 {
357 sed -e "${sedScript}"
358 [ -n "${outputFile}" ] && mv -f "${outputFile}" "${configurationFile}"
359 }
360 ;;
361 *) internalError "unimplemented action: ${requestedAction}";;
91162002 362esac
363
364translateDevice_none()
365{
c247b245 366 :
91162002 367}
368translateDevice_devfs()
369{
c247b245 370 minor="${device#ttyS}"
106ddbb5 371 if [ "${minor}" != "${device}" ]; then
c247b245 372 device="tts/${minor}"
373 return 0
374 fi
375 minor="${device#lp}"
106ddbb5 376 if [ "${minor}" != "${device}" ]; then
c247b245 377 device="printers/${minor}"
378 return 0
379 fi
380 programMessage "unsupported old-style device: ${device}"
91162002 381}
382translateDevice_old()
383{
c247b245 384 major="${device%%/*}"
106ddbb5 385 if [ "${major}" != "${device}" ]; then
c247b245 386 minor="${device#*/}"
387 case "${major}" in
388 tts) devfs="ttyS${minor}";;
389 printers) devfs="lp${minor}";;
390 esac
391 fi
106ddbb5 392 if [ -n "${devfs}" ]; then
c247b245 393 device="${devfs}"
394 else
395 programMessage "unsupported devfs device: ${device}"
396 fi
91162002 397}
398
399makeHeaderLine()
400{
c247b245 401 echo "# ${1} by brltty-bp2cf`date +' on %Y-%m-%d at %H:%M:%S %Z (UTC%z)'`."
91162002 402}
403makeParameterLine()
404{
c247b245 405 echo "# Boot Parameter:${bootParameter}"
91162002 406}
407putConfigurationFile()
408{
c247b245 409 startConfigurationFile
410 [ -n "${brailleDriver}" ] && putConfigurationDirective "braille-driver" "${brailleDriver}"
411 [ -n "${brailleDevice}" ] && {
412 device="`echo "${brailleDevice}" | sed -e 's%//*%/%g' -e 's%^/dev/%%'`"
106ddbb5 413 if [ "${device#/}" = "${device}" ]; then
c247b245 414 translateDevice_${deviceTranslation}
415 fi
416 putConfigurationDirective "braille-device" "${device}"
417 }
418 [ -n "${textTable}" ] && putConfigurationDirective "text-table" "${textTable}"
419 finalizeConfigurationFile
91162002 420}
421parseBootParameter()
422{
c247b245 423 bootParameter="${bootParameter} ${1}"
424 number=1
106ddbb5 425 while [ "${number}" -le 3 ]; do
c247b245 426 cut="cut -d, -f${number}"
427 [ "${number}" -gt 1 ] && cut="${cut} -s"
428 operand="`echo ${1} | ${cut}`"
106ddbb5 429 if [ -n "${operand}" ]; then
c247b245 430 case "${number}" in
431 1) brailleDriver="${operand}";;
432 2) brailleDevice="${operand}";;
433 3) textTable="${operand}";;
434 esac
435 fi
436 number="`expr ${number} + 1`"
437 done
91162002 438}
439putBootParameter()
440{
c247b245 441 parseBootParameter "${1}"
442 putConfigurationFile
91162002 443}
444parseBootCommand()
445{
c247b245 446 found=false
106ddbb5 447 while [ "${#}" -gt 0 ]; do
c247b245 448 case "${1}" in
449 "brltty="*)
450 found=true
451 parseBootParameter "${1#*=}"
452 ;;
453 esac
454 shift
455 done
456 "${found}" && putConfigurationFile
91162002 457}
458
459brailleDriver=""
460brailleDevice=""
461textTable=""
462bootCommandFile="/proc/cmdline"
106ddbb5 463if [ -n "${requestedParameter}" ]; then
c247b245 464 putBootParameter "${requestedParameter}"
106ddbb5 465elif [ -f "${bootCommandFile}" ]; then
c247b245 466 parseBootCommand `cat "${bootCommandFile}"`
106ddbb5 467elif [ -n "${brltty}" ]; then
c247b245 468 putBootParameter "${brltty}"
91162002 469fi
470exit 0
471)
472
9b20373a 473%post -n brlapi -p /sbin/ldconfig
474%postun -n brlapi -p /sbin/ldconfig
91162002 475
476%files
477%defattr(644,root,root,755)
c0ab824f
SS
478%doc Documents/{Manual-BRLTTY/English/BRLTTY*,ChangeLog,HISTORY,TODO}
479%doc doc/{Bindings,Bootdisks,BrailleDrivers,BrailleTables,ContractionTables,Patches,README,SpeechDrivers}
91162002 480%attr(755,root,root) %{_bindir}/brltty
c0ab824f
SS
481%attr(755,root,root) %{_bindir}/brltty-install
482%attr(755,root,root) %{_bindir}/brltty-config
18f080b9 483%attr(755,root,root) %{_bindir}/vstp
eb77b64b 484%{?with_x:%attr(755,root,root) %{_bindir}/xbrlapi}
91162002 485%dir %{_libdir}/brltty
c0ab824f
SS
486%attr(755,root,root) %{_libdir}/brltty/libbrlttybal.so
487%attr(755,root,root) %{_libdir}/brltty/libbrlttybat.so
488%attr(755,root,root) %{_libdir}/brltty/libbrlttybba.so
489%attr(755,root,root) %{_libdir}/brltty/libbrlttybbd.so
490%attr(755,root,root) %{_libdir}/brltty/libbrlttybbl.so
491%attr(755,root,root) %{_libdir}/brltty/libbrlttybbm.so
492%attr(755,root,root) %{_libdir}/brltty/libbrlttybbn.so
493%attr(755,root,root) %{_libdir}/brltty/libbrlttybcb.so
494%attr(755,root,root) %{_libdir}/brltty/libbrlttybec.so
495%attr(755,root,root) %{_libdir}/brltty/libbrlttybeu.so
496%attr(755,root,root) %{_libdir}/brltty/libbrlttybfs.so
497%attr(755,root,root) %{_libdir}/brltty/libbrlttybht.so
498%attr(755,root,root) %{_libdir}/brltty/libbrlttybil.so
499%attr(755,root,root) %{_libdir}/brltty/libbrlttyblt.so
500%attr(755,root,root) %{_libdir}/brltty/libbrlttybmb.so
501%attr(755,root,root) %{_libdir}/brltty/libbrlttybmd.so
502%attr(755,root,root) %{_libdir}/brltty/libbrlttybmn.so
503%attr(755,root,root) %{_libdir}/brltty/libbrlttybpm.so
504%attr(755,root,root) %{_libdir}/brltty/libbrlttybtn.so
505%attr(755,root,root) %{_libdir}/brltty/libbrlttybts.so
506%attr(755,root,root) %{_libdir}/brltty/libbrlttybtt.so
507%attr(755,root,root) %{_libdir}/brltty/libbrlttybvd.so
508%attr(755,root,root) %{_libdir}/brltty/libbrlttybvo.so
509%attr(755,root,root) %{_libdir}/brltty/libbrlttybvr.so
510%attr(755,root,root) %{_libdir}/brltty/libbrlttybvs.so
eb77b64b 511%{?with_x:%attr(755,root,root) %{_libdir}/brltty/libbrlttybxw.so}
c0ab824f
SS
512%attr(755,root,root) %{_libdir}/brltty/libbrlttysal.so
513%attr(755,root,root) %{_libdir}/brltty/libbrlttysbl.so
514%attr(755,root,root) %{_libdir}/brltty/libbrlttyscb.so
515%attr(755,root,root) %{_libdir}/brltty/libbrlttyses.so
516%attr(755,root,root) %{_libdir}/brltty/libbrlttysfv.so
517%attr(755,root,root) %{_libdir}/brltty/libbrlttysgs.so
ac744b8d 518%attr(755,root,root) %{_libdir}/brltty/libbrlttyxas.so
c0ab824f
SS
519%attr(755,root,root) %{_libdir}/brltty/libbrlttyxlx.so
520%attr(755,root,root) %{_libdir}/brltty/libbrlttyxsc.so
91162002 521%{_sysconfdir}/brltty
1c33f0ca 522%config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/brltty.conf
c0ab824f
SS
523%{_mandir}/man1/brltty.1*
524%{_mandir}/man1/vstp.1*
91162002 525
526%files -n brlapi
527%defattr(644,root,root,755)
c0ab824f
SS
528%attr(755,root,root) %{_libdir}/libbrlapi.so.0.5
529%attr(755,root,root) %{_libdir}/libbrlapi.so.0.5.1
0bb357f1 530%dir %{_libdir}/brlapi-0.5.1
91162002 531
532%files -n brlapi-devel
533%defattr(644,root,root,755)
608626ec
SS
534%doc Documents/README.Gnopernicus
535%doc Documents/Manual-BrlAPI/English/BrlAPI*
1c33f0ca 536%attr(755,root,root) %{_libdir}/libbrlapi.so
91162002 537%{_includedir}/brltty
18f080b9 538%{_includedir}/brlapi*.h
664a738b 539%{_mandir}/man3/*
91162002 540
541%files -n brlapi-static
542%defattr(644,root,root,755)
543%{_libdir}/libbrlapi.a
608626ec 544
09255552 545%if %{with apidocs}
608626ec
SS
546%files -n brlapi-apidocs
547%defattr(644,root,root,755)
548%doc Documents/BrlAPIref/html/*
09255552
SS
549%endif
550
551%if %{with java}
552%files -n brlapi-java
553%defattr(644,root,root,755)
554%{_libdir}/java/libbrlapi_java.so
555%{_javadir}/brlapi.jar
556%endif
0bb357f1
SS
557
558%if %{with python}
559%files -n python-brlapi
560%defattr(644,root,root,755)
561%{py_sitedir}/Brlapi-*.egg-info
562%attr(755,root,root) %{py_sitedir}/brlapi.so
563%endif
564
565%if %{with tcl}
566%files -n brlapi-tcl
567%defattr(644,root,root,755)
568%attr(755,root,root) %{_libdir}/brlapi-0.5.1/libbrlapi_tcl.so
569%{_libdir}/brlapi-0.5.1/pkgIndex.tcl
570%endif
This page took 0.150237 seconds and 4 git commands to generate.