1da2e3ebdSchin######################################################################## 2da2e3ebdSchin# # 3da2e3ebdSchin# This software is part of the ast package # 4*3e14f97fSRoger A. Faulkner# Copyright (c) 1982-2010 AT&T Intellectual Property # 5da2e3ebdSchin# and is licensed under the # 6da2e3ebdSchin# Common Public License, Version 1.0 # 77c2fbfb3SApril Chin# by AT&T Intellectual Property # 8da2e3ebdSchin# # 9da2e3ebdSchin# A copy of the License is available at # 10da2e3ebdSchin# http://www.opensource.org/licenses/cpl1.0.txt # 11da2e3ebdSchin# (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) # 12da2e3ebdSchin# # 13da2e3ebdSchin# Information and Software Systems Research # 14da2e3ebdSchin# AT&T Research # 15da2e3ebdSchin# Florham Park NJ # 16da2e3ebdSchin# # 17da2e3ebdSchin# David Korn <dgk@research.att.com> # 18da2e3ebdSchin# # 19da2e3ebdSchin######################################################################## 20da2e3ebdSchinfunction err_exit 21da2e3ebdSchin{ 22da2e3ebdSchin print -u2 -n "\t" 23da2e3ebdSchin print -u2 -r ${Command}[$1]: "${@:2}" 24da2e3ebdSchin let Errors+=1 25da2e3ebdSchin} 26da2e3ebdSchinalias err_exit='err_exit $LINENO' 27da2e3ebdSchin 28da2e3ebdSchininteger Errors=0 29da2e3ebdSchinCommand=${0##*/} 307c2fbfb3SApril Chin 3134f9b3eeSRoland Mainzulimit -c 0 3234f9b3eeSRoland Mainz 3334f9b3eeSRoland Mainztmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; } 3434f9b3eeSRoland Mainztrap "cd /; rm -rf $tmp" EXIT 357c2fbfb3SApril Chin 36da2e3ebdSchininteger foo=33 37da2e3ebdSchinbar=bye 38da2e3ebdSchin# check for global variables and $0 39da2e3ebdSchinfunction foobar 40da2e3ebdSchin{ 41da2e3ebdSchin case $1 in 42da2e3ebdSchin 1) print -r - "$foo" "$bar";; 43da2e3ebdSchin 2) print -r - "$0";; 44da2e3ebdSchin 3) typeset foo=foo 45da2e3ebdSchin integer bar=10 46da2e3ebdSchin print -r - "$foo" "$bar";; 47da2e3ebdSchin 4) trap 'foo=36' EXIT 48da2e3ebdSchin typeset foo=20;; 49da2e3ebdSchin esac 50da2e3ebdSchin} 51da2e3ebdSchinfunction print 52da2e3ebdSchin{ 53da2e3ebdSchin command print hi 54da2e3ebdSchin} 55da2e3ebdSchinif [[ $(print) != hi ]] 56da2e3ebdSchinthen err_exit "command print not working inside print function" 57da2e3ebdSchinfi 58da2e3ebdSchinunset -f print 59da2e3ebdSchin 60da2e3ebdSchinif [[ $(foobar 1) != '33 bye' ]] 61da2e3ebdSchinthen err_exit 'global variables not correct' 62da2e3ebdSchinfi 63da2e3ebdSchin 64da2e3ebdSchinif [[ $(foobar 2) != 'foobar' ]] 65da2e3ebdSchinthen err_exit '$0 not correct' 66da2e3ebdSchinfi 67da2e3ebdSchin 68da2e3ebdSchinif [[ $(bar=foo foobar 1) != '33 foo' ]] 69da2e3ebdSchinthen err_exit 'environment override not correct' 70da2e3ebdSchinfi 71da2e3ebdSchinif [[ $bar == foo ]] 72da2e3ebdSchinthen err_exit 'scoping error' 73da2e3ebdSchinfi 74da2e3ebdSchin 75da2e3ebdSchinif [[ $(foobar 3) != 'foo 10' ]] 76da2e3ebdSchinthen err_exit non-local variables 77da2e3ebdSchinfi 78da2e3ebdSchin 79da2e3ebdSchinfoobar 4 80da2e3ebdSchinif [[ $foo != 36 ]] 81da2e3ebdSchinthen err_exit EXIT trap in wrong scope 82da2e3ebdSchinfi 83da2e3ebdSchinunset -f foobar || err_exit "cannot unset function foobar" 84da2e3ebdSchintypeset -f foobar>/dev/null && err_exit "typeset -f has incorrect exit status" 85da2e3ebdSchin 86da2e3ebdSchinfunction foobar 87da2e3ebdSchin{ 88da2e3ebdSchin (return 0) 89da2e3ebdSchin} 9034f9b3eeSRoland Mainz> $tmp/test1 91da2e3ebdSchin{ 92da2e3ebdSchinfoobar 9334f9b3eeSRoland Mainzif [ -r $tmp/test1 ] 9434f9b3eeSRoland Mainzthen rm -r $tmp/test1 95da2e3ebdSchinelse err_exit 'return within subshell inside function error' 96da2e3ebdSchinfi 97da2e3ebdSchin} 98da2e3ebdSchinabc() print hi 99da2e3ebdSchinif [[ $(abc) != hi ]] 100da2e3ebdSchinthen err_exit 'abc() print hi not working' 101da2e3ebdSchinfi 102da2e3ebdSchin( unset -f abc ) 103da2e3ebdSchinif [[ $(abc 2>/dev/null) != hi ]] 104da2e3ebdSchinthen err_exit 'abc() print hi not working after subshell unset' 105da2e3ebdSchinfi 106da2e3ebdSchin( 107da2e3ebdSchin function f 108da2e3ebdSchin { 109da2e3ebdSchin exit 1 110da2e3ebdSchin } 111da2e3ebdSchin f 112da2e3ebdSchin err_exit 'exit from function not working' 113da2e3ebdSchin) 114da2e3ebdSchinunset -f foo 115da2e3ebdSchinfunction foo 116da2e3ebdSchin{ 117da2e3ebdSchin x=2 118da2e3ebdSchin ( 119da2e3ebdSchin x=3 1207c2fbfb3SApril Chin cd $tmp 121da2e3ebdSchin print bar 122da2e3ebdSchin ) 123da2e3ebdSchin if [[ $x != 2 ]] 124da2e3ebdSchin then err_exit 'value of x not restored after subshell inside function' 125da2e3ebdSchin fi 126da2e3ebdSchin} 127da2e3ebdSchinx=1 128da2e3ebdSchindir=$PWD 129da2e3ebdSchinif [[ $(foo) != bar ]] 130da2e3ebdSchinthen err_exit 'cd inside nested subshell not working' 131da2e3ebdSchinfi 132da2e3ebdSchinif [[ $PWD != "$dir" ]] 133da2e3ebdSchinthen err_exit 'cd inside nested subshell changes $PWD' 134da2e3ebdSchinfi 135da2e3ebdSchinfun() /bin/echo hello 136da2e3ebdSchinif [[ $(fun) != hello ]] 137da2e3ebdSchinthen err_exit one line functions not working 138da2e3ebdSchinfi 13934f9b3eeSRoland Mainzcat > $tmp/script <<-\! 140da2e3ebdSchin print -r -- "$1" 141da2e3ebdSchin! 14234f9b3eeSRoland Mainzchmod +x $tmp/script 143da2e3ebdSchinfunction passargs 144da2e3ebdSchin{ 14534f9b3eeSRoland Mainz $tmp/script "$@" 146da2e3ebdSchin} 147da2e3ebdSchinif [[ $(passargs one) != one ]] 148da2e3ebdSchinthen err_exit 'passing args from functions to scripts not working' 149da2e3ebdSchinfi 15034f9b3eeSRoland Mainzcat > $tmp/script <<-\! 151da2e3ebdSchin trap 'exit 0' EXIT 152da2e3ebdSchin function foo 153da2e3ebdSchin { 154da2e3ebdSchin /tmp > /dev/null 2>&1 155da2e3ebdSchin } 156da2e3ebdSchin foo 157da2e3ebdSchin! 15834f9b3eeSRoland Mainzif ! $tmp/script 159da2e3ebdSchinthen err_exit 'exit trap incorrectly triggered' 160da2e3ebdSchinfi 16134f9b3eeSRoland Mainzif ! $SHELL -c $tmp/script 162da2e3ebdSchinthen err_exit 'exit trap incorrectly triggered when invoked with -c' 163da2e3ebdSchinfi 16434f9b3eeSRoland Mainz$SHELL -c "trap 'rm $tmp/script' EXIT" 16534f9b3eeSRoland Mainzif [[ -f $tmp/script ]] 166da2e3ebdSchinthen err_exit 'exit trap not triggered when invoked with -c' 167da2e3ebdSchinfi 16834f9b3eeSRoland Mainzcat > $tmp/script <<- \EOF 169da2e3ebdSchin foobar() 170da2e3ebdSchin { 171da2e3ebdSchin return 172da2e3ebdSchin } 173da2e3ebdSchin shift 174da2e3ebdSchin foobar 175da2e3ebdSchin print -r -- "$1" 176da2e3ebdSchinEOF 17734f9b3eeSRoland Mainzchmod +x $tmp/script 17834f9b3eeSRoland Mainzif [[ $( $SHELL $tmp/script arg1 arg2) != arg2 ]] 179da2e3ebdSchinthen err_exit 'arguments not restored by posix functions' 180da2e3ebdSchinfi 181da2e3ebdSchinfunction foo 182da2e3ebdSchin{ 183da2e3ebdSchin print hello 184da2e3ebdSchin} 185da2e3ebdSchin( 186da2e3ebdSchin function foo 187da2e3ebdSchin { 188da2e3ebdSchin print bar 189da2e3ebdSchin } 190da2e3ebdSchin if [[ $(foo) != bar ]] 191da2e3ebdSchin then err_exit 'function definitions inside subshells not working' 192da2e3ebdSchin fi 193da2e3ebdSchin) 194da2e3ebdSchinif [[ $(foo) != hello ]] 195da2e3ebdSchinthen err_exit 'function definitions inside subshells not restored' 196da2e3ebdSchinfi 197da2e3ebdSchinunset -f foo bar 198da2e3ebdSchinfunction bar 199da2e3ebdSchin{ 200da2e3ebdSchin print "$y" 201da2e3ebdSchin} 202da2e3ebdSchin 203da2e3ebdSchinfunction foo 204da2e3ebdSchin{ 205da2e3ebdSchin typeset x=3 206da2e3ebdSchin y=$x bar 207da2e3ebdSchin} 208da2e3ebdSchinx=1 209da2e3ebdSchinif [[ $(foo) != 3 ]] 210da2e3ebdSchinthen err_exit 'variable assignment list not using parent scope' 211da2e3ebdSchinfi 21234f9b3eeSRoland Mainzunset -f foobar 21334f9b3eeSRoland Mainzcat > $tmp/foobar <<! 21434f9b3eeSRoland Mainzfunction foobar 215da2e3ebdSchin{ 216da2e3ebdSchin print foo 217da2e3ebdSchin} 218da2e3ebdSchin! 21934f9b3eeSRoland Mainzchmod +x $tmp/foobar 2207c2fbfb3SApril ChinFPATH=$tmp 22134f9b3eeSRoland Mainzautoload foobar 22234f9b3eeSRoland Mainzif [[ $(foobar 2>/dev/null) != foo ]] 223da2e3ebdSchinthen err_exit 'autoload not working' 224da2e3ebdSchinfi 225da2e3ebdSchinunset -f foobar 226da2e3ebdSchinfunction foobar 227da2e3ebdSchin{ 228da2e3ebdSchin typeset -r x=3 229da2e3ebdSchin return 0 230da2e3ebdSchin} 231da2e3ebdSchin( foobar ) 2> /dev/null || err_exit "cannot unset readonly variable in function" 232da2e3ebdSchinif $SHELL -n 2> /dev/null <<-! 233da2e3ebdSchin abc() 234da2e3ebdSchin ! 235da2e3ebdSchinthen err_exit 'abc() without a function body is not a syntax error' 236da2e3ebdSchinfi 237da2e3ebdSchinfunction winpath 238da2e3ebdSchin{ 239da2e3ebdSchin usage='q pathname ...' 240da2e3ebdSchin typeset var format=s 241da2e3ebdSchin while getopts "$usage" var 242da2e3ebdSchin do case $var in 243da2e3ebdSchin q) format=q;; 244da2e3ebdSchin esac 245da2e3ebdSchin done 246da2e3ebdSchin print done 247da2e3ebdSchin} 248da2e3ebdSchinif [[ $( (winpath --man 2>/dev/null); print ok) != ok ]] 249da2e3ebdSchinthen err_exit 'getopts --man in functions not working' 250da2e3ebdSchinfi 251da2e3ebdSchinif [[ $( (winpath -z 2>/dev/null); print ok) != ok ]] 252da2e3ebdSchinthen err_exit 'getopts with bad option in functions not working' 253da2e3ebdSchinfi 254da2e3ebdSchinunset -f x 255da2e3ebdSchinfunction x 256da2e3ebdSchin{ 257da2e3ebdSchin print "$@" 258da2e3ebdSchin} 259da2e3ebdSchintypeset -ft x 260da2e3ebdSchinif [[ $(x x=y 2>/dev/null) != x=y ]] 261da2e3ebdSchinthen err_exit 'name=value pair args not passed to traced functions' 262da2e3ebdSchinfi 263da2e3ebdSchinfunction bad 264da2e3ebdSchin{ 265da2e3ebdSchin false 266da2e3ebdSchin} 267da2e3ebdSchintrap 'val=false' ERR 268da2e3ebdSchinval=true 269da2e3ebdSchinbad 270da2e3ebdSchinif [[ $val != false ]] 271da2e3ebdSchinthen err_exit 'set -e not working for functions' 272da2e3ebdSchinfi 273da2e3ebdSchinfunction bad 274da2e3ebdSchin{ 275da2e3ebdSchin false 276da2e3ebdSchin return 0 277da2e3ebdSchin} 278da2e3ebdSchinval=true 279da2e3ebdSchinbad 280da2e3ebdSchinif [[ $val != true ]] 281da2e3ebdSchinthen err_exit 'set -e not disabled for functions' 282da2e3ebdSchinfi 283da2e3ebdSchinbad() 284da2e3ebdSchin{ 285da2e3ebdSchin false 286da2e3ebdSchin return 0 287da2e3ebdSchin} 288da2e3ebdSchinval=true 289da2e3ebdSchinbad 290da2e3ebdSchinif [[ $val != false ]] 291da2e3ebdSchinthen err_exit 'set -e not inherited for posix functions' 292da2e3ebdSchinfi 2937c2fbfb3SApril Chintrap - ERR 2947c2fbfb3SApril Chin 295da2e3ebdSchinfunction myexport 296da2e3ebdSchin{ 297da2e3ebdSchin nameref var=$1 298da2e3ebdSchin if (( $# > 1 )) 299da2e3ebdSchin then export $1=$2 300da2e3ebdSchin fi 301da2e3ebdSchin if (( $# > 2 )) 302da2e3ebdSchin then print $(myexport "$1" "$3" ) 303da2e3ebdSchin return 304da2e3ebdSchin fi 305da2e3ebdSchin typeset val 306da2e3ebdSchin val=$(export | grep "^$1=") 307da2e3ebdSchin print ${val#"$1="} 308da2e3ebdSchin} 309da2e3ebdSchinexport dgk=base 3107c2fbfb3SApril Chinval=$(myexport dgk fun) 3117c2fbfb3SApril Chinif [[ $val != fun ]] 3127c2fbfb3SApril Chinthen err_exit "export inside function not working -- expected 'fun', got '$val'" 313da2e3ebdSchinfi 3147c2fbfb3SApril Chinval=$(export | sed -e '/^dgk=/!d' -e 's/^dgk=//') 3157c2fbfb3SApril Chinif [[ $val != base ]] 3167c2fbfb3SApril Chinthen err_exit "export not restored after function call -- expected 'base', got '$val'" 317da2e3ebdSchinfi 3187c2fbfb3SApril Chinval=$(myexport dgk fun fun2) 3197c2fbfb3SApril Chinif [[ $val != fun2 ]] 3207c2fbfb3SApril Chinthen err_exit "export inside function not working with recursive function -- expected 'fun2', got '$val'" 321da2e3ebdSchinfi 3227c2fbfb3SApril Chinval=$(export | sed -e '/^dgk=/!d' -e 's/^dgk=//') 3237c2fbfb3SApril Chinif [[ $val != base ]] 3247c2fbfb3SApril Chinthen err_exit "export not restored after recursive function call -- expected 'base', got '$val'" 325da2e3ebdSchinfi 3267c2fbfb3SApril Chinval=$(dgk=try3 myexport dgk) 3277c2fbfb3SApril Chinif [[ $val != try3 ]] 3287c2fbfb3SApril Chinthen err_exit "name=value not added to export list with function call -- expected 'try3', got '$val'" 329da2e3ebdSchinfi 3307c2fbfb3SApril Chinval=$(export | sed -e '/^dgk=/!d' -e 's/^dgk=//') 3317c2fbfb3SApril Chinif [[ $val != base ]] 3327c2fbfb3SApril Chinthen err_exit "export not restored name=value function call -- expected 'base', got '$val'" 333da2e3ebdSchinfi 334da2e3ebdSchinunset zzz 3357c2fbfb3SApril Chinval=$(myexport zzz fun) 3367c2fbfb3SApril Chinif [[ $val != fun ]] 3377c2fbfb3SApril Chinthen err_exit "export inside function not working -- expected 'fun', got '$val'" 338da2e3ebdSchinfi 3397c2fbfb3SApril Chinval=$(export | sed -e '/^zzz=/!d' -e 's/^zzz=//') 3407c2fbfb3SApril Chinif [[ $val ]] 3417c2fbfb3SApril Chinthen err_exit "unset varaible exported after function call -- expected '', got '$val'" 342da2e3ebdSchinfi 3437c2fbfb3SApril Chin 344da2e3ebdSchinunset zzz 345da2e3ebdSchintypeset -u zzz 346da2e3ebdSchinfunction foo 347da2e3ebdSchin{ 348da2e3ebdSchin zzz=abc 349da2e3ebdSchin print $zzz 350da2e3ebdSchin} 351da2e3ebdSchinif [[ $(foo)$(foo) != ABCABC ]] 352da2e3ebdSchinthen err_exit 'attributes on unset variables not saved/restored' 353da2e3ebdSchinfi 354da2e3ebdSchinfunction xpd { 355da2e3ebdSchin typeset i j=$1 356da2e3ebdSchin for i 357da2e3ebdSchin do print i=$i j=$j 358da2e3ebdSchin [[ $i == a ]] && xpd b 359da2e3ebdSchin done 360da2e3ebdSchin } 361da2e3ebdSchinif [[ $(xpd a c) != $'i=a j=a\ni=b j=b\ni=c j=a' ]] 362da2e3ebdSchinthen err_exit 'for loop function optimization error' 363da2e3ebdSchinfi 364da2e3ebdSchin 365da2e3ebdSchintypeset -A visited 366da2e3ebdSchininteger level=0 367da2e3ebdSchinfunction closure 368da2e3ebdSchin{ 369da2e3ebdSchin (( $# > 5 )) && return 1 370da2e3ebdSchin ((level < 2)) && ((level++)) 371da2e3ebdSchin typeset tmp r=0 372da2e3ebdSchin visited[$1]=1 373da2e3ebdSchin 374da2e3ebdSchin for tmp in $level _$level 375da2e3ebdSchin do 376da2e3ebdSchin [[ ${visited[$tmp]} == 1 ]] && continue 377da2e3ebdSchin closure $tmp $* || r=1 378da2e3ebdSchin done 379da2e3ebdSchin return $r 380da2e3ebdSchin} 381da2e3ebdSchinclosure 0 || err_exit -u2 'for loop function optimization bug2' 38234f9b3eeSRoland Mainzdir=$tmp/dir 38334f9b3eeSRoland Mainzmkdir $dir 38434f9b3eeSRoland Mainzcd $dir || { err_exit "cd $dir failed"; exit 1; } 38534f9b3eeSRoland Mainz 38634f9b3eeSRoland Mainz( 38734f9b3eeSRoland Mainz function a { 38834f9b3eeSRoland Mainz print a 38934f9b3eeSRoland Mainz } 39034f9b3eeSRoland Mainz function b { 39134f9b3eeSRoland Mainz print 1 39234f9b3eeSRoland Mainz a 39334f9b3eeSRoland Mainz print 2 39434f9b3eeSRoland Mainz } > /dev/null 39534f9b3eeSRoland Mainz typeset -ft a b 39634f9b3eeSRoland Mainz PS4=X 39734f9b3eeSRoland Mainz b 39834f9b3eeSRoland Mainz) > file 2>&1 39934f9b3eeSRoland Mainz[[ $(<file) == *'Xprint 2'* ]] || err_exit 'function trace disabled by function call' 40034f9b3eeSRoland Mainzrm -f file 40134f9b3eeSRoland Mainz 402da2e3ebdSchinprint 'false' > try 403da2e3ebdSchinchmod +x try 404da2e3ebdSchincat > tst <<- EOF 405da2e3ebdSchin function ignore 406da2e3ebdSchin { 407da2e3ebdSchin ./try 408da2e3ebdSchin return 0 409da2e3ebdSchin } 410da2e3ebdSchin trap "print error; exit 1" ERR 411da2e3ebdSchin ignore 412da2e3ebdSchinEOF 413da2e3ebdSchinif [[ $($SHELL < tst) == error ]] 414da2e3ebdSchinthen err_exit 'ERR trap not cleared' 415da2e3ebdSchinfi 41634f9b3eeSRoland MainzFPATH=$dir 41734f9b3eeSRoland Mainzprint ': This does nothing' > foobar 41834f9b3eeSRoland Mainzchmod +x foobar 419da2e3ebdSchinunset -f foobar 420da2e3ebdSchin{ foobar; } 2>/dev/null 42134f9b3eeSRoland Mainzgot=$? 42234f9b3eeSRoland Mainzexp=126 42334f9b3eeSRoland Mainzif [[ $got != $exp ]] 42434f9b3eeSRoland Mainzthen err_exit "function file without function definition processes wrong error -- expected '$exp', got '$got'" 425da2e3ebdSchinfi 426da2e3ebdSchinprint 'set a b c' > dotscript 427da2e3ebdSchin[[ $(PATH=$PATH: $SHELL -c '. dotscript;print $#') == 3 ]] || err_exit 'positional parameters not preserved with . script without arguments' 428da2e3ebdSchincd ~- || err_exit "cd back failed" 429da2e3ebdSchinfunction errcheck 430da2e3ebdSchin{ 431da2e3ebdSchin trap 'print ERR; return 1' ERR 432da2e3ebdSchin false 433da2e3ebdSchin print ok 434da2e3ebdSchin} 435da2e3ebdSchinerr=$(errcheck) 436da2e3ebdSchin[[ $err == ERR ]] || err_exit 'trap on ERR not working in a function' 437da2e3ebdSchinx="$( 438da2e3ebdSchin function foobar 439da2e3ebdSchin { 440da2e3ebdSchin print ok 441da2e3ebdSchin } 442da2e3ebdSchin typeset -f foobar 443da2e3ebdSchin)" 444da2e3ebdSchineval "$x" || err_exit 'typeset -f generates syntax error' 445da2e3ebdSchin[[ $(foobar) != ok ]] && err_exit 'typeset -f not generating function' 446da2e3ebdSchinunset -f a b c 447da2e3ebdSchina() 448da2e3ebdSchin{ 449da2e3ebdSchin b 450da2e3ebdSchin b 451da2e3ebdSchin print ${.sh.fun} 452da2e3ebdSchin} 453da2e3ebdSchinb() { : ;} 454da2e3ebdSchin[[ $(a) == a ]] || err_exit '.sh.fun not set correctly in a function' 455da2e3ebdSchinprint $'a(){\ndate\n}' | $SHELL 2> /dev/null || err_exit 'parser error in a(){;date;}' 45634f9b3eeSRoland Mainzcat > $tmp/data1 << '++EOF' 457da2e3ebdSchin 1 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 458da2e3ebdSchin 2 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 459da2e3ebdSchin 3 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 460da2e3ebdSchin 4 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 461da2e3ebdSchin 5 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 462da2e3ebdSchin 6 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 463da2e3ebdSchin 7 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 464da2e3ebdSchin 8 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 465da2e3ebdSchin 9 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 466da2e3ebdSchin 10 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 467da2e3ebdSchin 11 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 468da2e3ebdSchin 12 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 469da2e3ebdSchin 13 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 470da2e3ebdSchin 14 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 471da2e3ebdSchin 15 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 472da2e3ebdSchin 16 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 473da2e3ebdSchin 17 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 474da2e3ebdSchin 18 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 475da2e3ebdSchin 19 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 476da2e3ebdSchin 20 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 477da2e3ebdSchin++EOF 47834f9b3eeSRoland Mainzcat > $tmp/script << '++EOF' 479da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 480da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 481da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 482da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 483da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 484da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 485da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 486da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 487da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 488da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 489da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 490da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 491da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 492da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 493da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 494da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 495da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 496da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 497da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 498da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 499da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 500da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 501da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 502da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 503da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 504da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 505da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 506da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 507da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 508da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 509da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 510da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 511da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 512da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 513da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 514da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 515da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 516da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 517da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 518da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 519da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 520da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 521da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 522da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 523da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 524da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 525da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 526da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 527da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 528da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 529da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 530da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 531da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 532da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 533da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 534da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 535da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 536da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 537da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 538da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 539da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 540da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 541da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 542da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 543da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 544da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 545da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 546da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 547da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 548da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 549da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 550da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 551da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 552da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 553da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 554da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 555da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 556da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 557da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 558da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 559da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 560da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 561da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 562da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 563da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 564da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 565da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 566da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 567da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 568da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 569da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 570da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 571da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 572da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 573da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 574da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 575da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 576da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 577da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 578da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 579da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 580da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 581da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 582da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 583da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 584da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 585da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 586da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 587da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 588da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 589da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 590da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 591da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 592da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 593da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 594da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 595da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 596da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 597da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 598da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 599da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 600da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 601da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 602da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 603da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 604da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 605da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 606da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 607da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 608da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 609da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 610da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 611da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 612da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 613da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 614da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 615da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 616da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 617da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 618da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 619da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 620da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 621da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 622da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 623da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 624da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 625da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 626da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 627da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 628da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 629da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 630da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 631da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 632da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 633da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 634da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 635da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 636da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 637da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 638da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 639da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 640da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 641da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 642da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 643da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 644da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 645da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 646da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 647da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 648da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 649da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 650da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 651da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 652da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 653da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 654da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 655da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 656da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 657da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 658da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 659da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 660da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 661da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 662da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 663da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 664da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 665da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 666da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 667da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 668da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 669da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 670da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 671da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 672da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 673da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 674da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 675da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 676da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 677da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 678da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 679da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 680da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 681da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 682da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 683da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 684da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 685da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 686da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 687da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 688da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 689da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 690da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 691da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 692da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 693da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 694da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 695da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 696da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 697da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 698da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 699da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 700da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 701da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 702da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 703da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 704da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 705da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 706da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 707da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 708da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 709da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 710da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 711da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 712da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 713da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 714da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 715da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 716da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 717da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 718da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 719da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 720da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 721da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 722da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 723da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 724da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 725da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 726da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 727da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 728da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 729da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 730da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 731da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 732da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 733da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 734da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 735da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 736da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 737da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 738da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 739da2e3ebdSchin 740da2e3ebdSchinf() 741da2e3ebdSchin{ 742da2e3ebdSchincat <<\M 743da2e3ebdSchin++EOF 74434f9b3eeSRoland Mainzcat $tmp/data1 >> $tmp/script 74534f9b3eeSRoland Mainzprintf 'M\n}\n\nf\n\n' >> $tmp/script 74634f9b3eeSRoland Mainz$SHELL -c $tmp/script > $tmp/data2 74734f9b3eeSRoland Mainzcmp -s $tmp/data[12] || err_exit 'error with long functions' 748da2e3ebdSchinv=1 749da2e3ebdSchinfunction f 750da2e3ebdSchin{ 751da2e3ebdSchin typeset i 752da2e3ebdSchin for i in 0 1 753da2e3ebdSchin do typeset v 754da2e3ebdSchin v=$i 755da2e3ebdSchin [[ $v == $i ]] || return 1 756da2e3ebdSchin done 757da2e3ebdSchin} 758da2e3ebdSchinf || err_exit "typeset optimization bug" 759da2e3ebdSchinfunction f 760da2e3ebdSchin{ 761da2e3ebdSchin print -r -- "$foo$bar" 762da2e3ebdSchin} 763da2e3ebdSchinfunction g 764da2e3ebdSchin{ 765da2e3ebdSchin print -r -- $(bar=bam f) 766da2e3ebdSchin} 767da2e3ebdSchinunset foo bar 768da2e3ebdSchin[[ $(foo=hello g) == hellobam ]] || err_exit 'function exports not passed on' 769da2e3ebdSchin[[ $(bar=hello g) == bam ]] || err_exit 'function exports not overridden' 770da2e3ebdSchinunset -f foo 771da2e3ebdSchinfunction foo 772da2e3ebdSchin{ 773da2e3ebdSchin typeset line=$1 774da2e3ebdSchin set +n 775da2e3ebdSchin while [[ $line ]] 776da2e3ebdSchin do if [[ ! $varname ]] 777da2e3ebdSchin then varname=${line%% *} 778da2e3ebdSchin line=${line##"$varname"?( )} 779da2e3ebdSchin [[ $line ]] && continue 780da2e3ebdSchin else print ok 781da2e3ebdSchin return 782da2e3ebdSchin fi 783da2e3ebdSchin varname= 784da2e3ebdSchin done 785da2e3ebdSchin} 786da2e3ebdSchin[[ $(foo 'NUMBERED RECORDSIZE') == ok ]] || err_exit 'optimization error with undefined variable' 7877c2fbfb3SApril Chinunset x 7887c2fbfb3SApril Chinx=$( 7897c2fbfb3SApril Chin set -e 7907c2fbfb3SApril Chin integer count=0 7917c2fbfb3SApril Chin function err_f 7927c2fbfb3SApril Chin { 7937c2fbfb3SApril Chin if ((count++==3)) 7947c2fbfb3SApril Chin then print failed 7957c2fbfb3SApril Chin else false 7967c2fbfb3SApril Chin fi 7977c2fbfb3SApril Chin } 7987c2fbfb3SApril Chin trap 'err_f' ERR 7997c2fbfb3SApril Chin false 8007c2fbfb3SApril Chin) 8017c2fbfb3SApril Chin[[ $x == failed ]] && err_exit 'ERR trap executed multiple times' 8027c2fbfb3SApril Chinexport environment 8037c2fbfb3SApril Chintypeset global 8047c2fbfb3SApril Chinfunction f 8057c2fbfb3SApril Chin{ 8067c2fbfb3SApril Chin typeset i t local 8077c2fbfb3SApril Chin 8087c2fbfb3SApril Chin for i 8097c2fbfb3SApril Chin do case $i in 8107c2fbfb3SApril Chin [-+]*) set "$@" 8117c2fbfb3SApril Chin continue 8127c2fbfb3SApril Chin ;; 8137c2fbfb3SApril Chin local) local=f 8147c2fbfb3SApril Chin t=$(typeset +f $local) 8157c2fbfb3SApril Chin ;; 8167c2fbfb3SApril Chin global) global=f 8177c2fbfb3SApril Chin t=$(typeset +f $global) 8187c2fbfb3SApril Chin ;; 8197c2fbfb3SApril Chin environment) 8207c2fbfb3SApril Chin environment=f 8217c2fbfb3SApril Chin t=$(typeset +f $environment) 8227c2fbfb3SApril Chin ;; 8237c2fbfb3SApril Chin literal)t=$(typeset +f f) 8247c2fbfb3SApril Chin ;; 8257c2fbfb3SApril Chin positional) 8267c2fbfb3SApril Chin set -- f 8277c2fbfb3SApril Chin t=$(typeset +f $1) 8287c2fbfb3SApril Chin ;; 8297c2fbfb3SApril Chin esac 8307c2fbfb3SApril Chin [[ $t ]] || err_exit "typeset +f \$$i failed" 8317c2fbfb3SApril Chin done 8327c2fbfb3SApril Chin} 8337c2fbfb3SApril Chinf local global environment literal positional 8347c2fbfb3SApril Chin$SHELL -c ' 83534f9b3eeSRoland Mainz print exit 0 > '$tmp'/script 83634f9b3eeSRoland Mainz chmod +x '$tmp'/script 8377c2fbfb3SApril Chin unset var 8387c2fbfb3SApril Chin var=( ident=1 ) 8397c2fbfb3SApril Chin function fun 8407c2fbfb3SApril Chin { 84134f9b3eeSRoland Mainz PATH='$tmp' script 8427c2fbfb3SApril Chin } 8437c2fbfb3SApril Chin fun 8447c2fbfb3SApril Chin' || err_exit "compound variable cleanup before script exec failed" 8457c2fbfb3SApril Chin( $SHELL << \++EOF++ 8467c2fbfb3SApril Chinfunction main 8477c2fbfb3SApril Chin{ 8487c2fbfb3SApril Chin typeset key 8497c2fbfb3SApril Chin typeset -A entry 8507c2fbfb3SApril Chin entry[a]=( value=aaa ) 8517c2fbfb3SApril Chin} 8527c2fbfb3SApril Chinmain 8537c2fbfb3SApril Chin++EOF++ 8547c2fbfb3SApril Chin) 2> /dev/null || err_exit 'function main fails' 8557c2fbfb3SApril Chinoptind=$OPTIND 8567c2fbfb3SApril Chinsub() 8577c2fbfb3SApril Chin{ 8587c2fbfb3SApril Chin ( 8597c2fbfb3SApril Chin OPTIND=1 8607c2fbfb3SApril Chin while getopts :abc OPTION "$@" 8617c2fbfb3SApril Chin do print OPTIND=$OPTIND 8627c2fbfb3SApril Chin done 8637c2fbfb3SApril Chin ) 8647c2fbfb3SApril Chin} 8657c2fbfb3SApril Chin[[ $(sub -a) == OPTIND=2 ]] || err_exit 'OPTIND should be 2' 8667c2fbfb3SApril Chin[[ $(sub -a) == OPTIND=2 ]] || err_exit 'OPTIND should be 2 again' 8677c2fbfb3SApril Chin[[ $OPTIND == "$optind" ]] || err_exit 'OPTIND should be 1' 8687c2fbfb3SApril Chin 8697c2fbfb3SApril Chinfunction bar 8707c2fbfb3SApril Chin{ 8717c2fbfb3SApril Chin [[ -o nounset ]] && err_exit 'nounset option should not be inherited' 8727c2fbfb3SApril Chin} 8737c2fbfb3SApril Chinfunction foo 8747c2fbfb3SApril Chin{ 8757c2fbfb3SApril Chin set -o nounset 8767c2fbfb3SApril Chin bar 8777c2fbfb3SApril Chin} 8787c2fbfb3SApril Chinset +o nounset 8797c2fbfb3SApril Chinfoo 8807c2fbfb3SApril Chinfunction red 8817c2fbfb3SApril Chin{ 8827c2fbfb3SApril Chin integer -S d=0 8837c2fbfb3SApril Chin printf 'red_one %d\n' d 8847c2fbfb3SApril Chin (( d++ )) 8857c2fbfb3SApril Chin return 0 8867c2fbfb3SApril Chin} 8877c2fbfb3SApril Chin[[ ${ red } != 'red_one 0' ]] && err_exit 'expected red_one 0' 8887c2fbfb3SApril Chin[[ ${ red } != 'red_one 1' ]] && err_exit 'expected red_one 1' 8897c2fbfb3SApril Chinxyz=$0 8907c2fbfb3SApril Chinfunction traceback 8917c2fbfb3SApril Chin{ 8927c2fbfb3SApril Chin integer .level=.sh.level 8937c2fbfb3SApril Chin while((--.level>=0)) 8947c2fbfb3SApril Chin do 8957c2fbfb3SApril Chin ((.sh.level = .level)) 8967c2fbfb3SApril Chin [[ $xyz == "$0" ]] || err_exit "\$xyz=$xyz does not match $0 on level ${.level}" 8977c2fbfb3SApril Chin [[ ${.sh.lineno} == "$1" ]] || err_exit "\${.sh.lineno}=${.sh.lineno} does not match $1 on level ${.level}" 8987c2fbfb3SApril Chin done 8997c2fbfb3SApril Chin} 9007c2fbfb3SApril Chin 9017c2fbfb3SApril Chinfunction foo 9027c2fbfb3SApril Chin{ 9037c2fbfb3SApril Chin typeset xyz=foo 9047c2fbfb3SApril Chin set -- $((LINENO+1)) 9057c2fbfb3SApril Chin bar $LINENO "$1" 9067c2fbfb3SApril Chin} 9077c2fbfb3SApril Chin 9087c2fbfb3SApril Chinfunction bar 9097c2fbfb3SApril Chin{ 9107c2fbfb3SApril Chin typeset xyz=bar 9117c2fbfb3SApril Chin set -- $((LINENO+2)) 9127c2fbfb3SApril Chin trap 'traceback $LINENO' DEBUG 9137c2fbfb3SApril Chin : $LINENO "$1" 9147c2fbfb3SApril Chin} 9157c2fbfb3SApril Chin 9167c2fbfb3SApril Chinset -- $((LINENO+1)) 9177c2fbfb3SApril Chinfoo $LINENO 9187c2fbfb3SApril Chinfunction .sh.fun.set 9197c2fbfb3SApril Chin{ 9207c2fbfb3SApril Chin print -r -- "${.sh.value}" 9217c2fbfb3SApril Chin} 9227c2fbfb3SApril Chinfunction abc 9237c2fbfb3SApril Chin{ 9247c2fbfb3SApril Chin : 9257c2fbfb3SApril Chin} 9267c2fbfb3SApril Chindef() 9277c2fbfb3SApril Chin{ 9287c2fbfb3SApril Chin : 9297c2fbfb3SApril Chin} 9307c2fbfb3SApril Chin[[ $(abc) == abc ]] || err_exit '.sh.fun.set not capturing function name' 9317c2fbfb3SApril Chin[[ $(def) == def ]] || err_exit '.sh.fun.set not capturing name()' 9327c2fbfb3SApril Chinunset -f .sh.fun.set 9337c2fbfb3SApril Chin 9347c2fbfb3SApril Chin# tests for debug functions 9357c2fbfb3SApril Chinbasefile=${.sh.file} 9367c2fbfb3SApril Chininteger baseline 93734f9b3eeSRoland Mainzcat > $tmp/debug << \+++ 9387c2fbfb3SApril Chin : line 1 9397c2fbfb3SApril Chin 9407c2fbfb3SApril Chin : line 3 9417c2fbfb3SApril Chin+++ 9427c2fbfb3SApril Chin# Print one line in a call stack 9437c2fbfb3SApril Chinfunction _Dbg_print_frame 9447c2fbfb3SApril Chin{ 9457c2fbfb3SApril Chin typeset -i pos=$1 9467c2fbfb3SApril Chin typeset fn=$2 9477c2fbfb3SApril Chin typeset filename="$3" 9487c2fbfb3SApril Chin typeset -i line=$4 9497c2fbfb3SApril Chin typeset arg=$5 9507c2fbfb3SApril Chin shift 5 9517c2fbfb3SApril Chin if ((pos==0)) 9527c2fbfb3SApril Chin then [[ $filename == "$basefile" ]] || err_exit "filename for level 0 is $filename not $basename" 9537c2fbfb3SApril Chin [[ $arg == DEBUG ]] && ((baseline++)) 9547c2fbfb3SApril Chin [[ $line == "$baseline" ]] || err_exit "line number for level 0 is $line not $baseline" 9557c2fbfb3SApril Chin elif ((pos==1)) 95634f9b3eeSRoland Mainz then [[ $filename == "$tmp/debug" ]] || err_exit "filename for level 1 is $filename not $tmp/debug" 9577c2fbfb3SApril Chin [[ $* == 'foo bar' ]] || err_exit "args are '$*', not 'foo bar'" 9587c2fbfb3SApril Chin [[ $line == $arg ]] || err_exit "line number for level 1 is $line not $arg" 9597c2fbfb3SApril Chin else err_exit "level should be 0 or 1 but is $pos" 9607c2fbfb3SApril Chin fi 9617c2fbfb3SApril Chin} 9627c2fbfb3SApril Chin 9637c2fbfb3SApril Chinfunction _Dbg_debug_trap_handler 9647c2fbfb3SApril Chin{ 9657c2fbfb3SApril Chin 9667c2fbfb3SApril Chin integer .level=.sh.level .max=.sh.level-1 9677c2fbfb3SApril Chin while((--.level>=0)) 9687c2fbfb3SApril Chin do 9697c2fbfb3SApril Chin ((.sh.level = .level)) 9707c2fbfb3SApril Chin _Dbg_print_frame "${.level}" "$0" "${.sh.file}" "${.sh.lineno}" "${.sh.command##* }" "$@" 9717c2fbfb3SApril Chin done 9727c2fbfb3SApril Chin} 9737c2fbfb3SApril Chin 9747c2fbfb3SApril Chin((baseline=LINENO+2)) 9757c2fbfb3SApril Chintrap '_Dbg_debug_trap_handler' DEBUG 97634f9b3eeSRoland Mainz. $tmp/debug foo bar 9777c2fbfb3SApril Chintrap '' DEBUG 9787c2fbfb3SApril Chin 9797c2fbfb3SApril Chincaller() { 9807c2fbfb3SApril Chin integer .level=.sh.level .max=.sh.level-1 9817c2fbfb3SApril Chin while((--.level>=0)) 9827c2fbfb3SApril Chin do 9837c2fbfb3SApril Chin ((.sh.level = .level)) 9847c2fbfb3SApril Chin print -r -- "${.sh.lineno}" 9857c2fbfb3SApril Chin done 9867c2fbfb3SApril Chin} 9877c2fbfb3SApril Chinbar() { caller;} 9887c2fbfb3SApril Chinset -- $(bar) 9897c2fbfb3SApril Chin[[ $1 == $2 ]] && err_exit ".sh.inline optimization bug" 9907c2fbfb3SApril Chin( $SHELL -c ' function foo { typeset x=$1;print $1;};z=();z=($(foo bar)) ') 2> /dev/null || err_exit 'using a function to set an array in a command sub fails' 99134f9b3eeSRoland Mainz 99234f9b3eeSRoland Mainz{ 99334f9b3eeSRoland Mainzgot=$( 99434f9b3eeSRoland Mainzs=$(ulimit -s) 99534f9b3eeSRoland Mainzif [[ $s == +([[:digit:]]) ]] && (( s < 16384 )) 99634f9b3eeSRoland Mainzthen ulimit -s 16384 2>/dev/null 99734f9b3eeSRoland Mainzfi 99834f9b3eeSRoland Mainz$SHELL << \+++ 99934f9b3eeSRoland Mainzf() 100034f9b3eeSRoland Mainz{ 100134f9b3eeSRoland Mainz if (($1>1)) 100234f9b3eeSRoland Mainz then x=$(f $(($1-1))) || exit 1 100334f9b3eeSRoland Mainz fi 100434f9b3eeSRoland Mainz return 0 100534f9b3eeSRoland Mainz} 100634f9b3eeSRoland Mainzf 257 && print ok 100734f9b3eeSRoland Mainz+++ 100834f9b3eeSRoland Mainz) 100934f9b3eeSRoland Mainz} 2>/dev/null 101034f9b3eeSRoland Mainz[[ $got == ok ]] || err_exit 'cannot handle comsub depth > 256 in function' 101134f9b3eeSRoland Mainz 101234f9b3eeSRoland Mainztmp1=$tmp/job.1 101334f9b3eeSRoland Mainztmp2=$tmp/job.2 101434f9b3eeSRoland Mainzcat > $tmp1 << +++ 101534f9b3eeSRoland Mainz#! $SHELL 101634f9b3eeSRoland Mainzprint \$\$ 101734f9b3eeSRoland Mainz+++ 101834f9b3eeSRoland Mainzchmod +x $tmp1 101934f9b3eeSRoland Mainzfunction foo 102034f9b3eeSRoland Mainz{ 102134f9b3eeSRoland Mainz typeset pid 102234f9b3eeSRoland Mainz $tmp1 > $tmp2 & pid=$! 102334f9b3eeSRoland Mainz wait $! 102434f9b3eeSRoland Mainz [[ $(< $tmp2) == $pid ]] || err_exit 'wrong pid for & job in function' 102534f9b3eeSRoland Mainz} 102634f9b3eeSRoland Mainzfoo 102734f9b3eeSRoland Mainz# make sure compiled functions work 102834f9b3eeSRoland Mainz[[ $(tmp=$tmp $SHELL <<- \++++ 102934f9b3eeSRoland Mainz cat > $tmp/functions <<- \EOF 103034f9b3eeSRoland Mainz function bar 103134f9b3eeSRoland Mainz { 103234f9b3eeSRoland Mainz print foo 103334f9b3eeSRoland Mainz } 103434f9b3eeSRoland Mainz function foobar 103534f9b3eeSRoland Mainz { 103634f9b3eeSRoland Mainz bar 103734f9b3eeSRoland Mainz } 103834f9b3eeSRoland Mainz EOF 103934f9b3eeSRoland Mainz ${SHCOMP:-${SHELL%/*}/shcomp} $tmp/functions > $tmp/foobar 104034f9b3eeSRoland Mainz rm -f "$tmp/functions" 104134f9b3eeSRoland Mainz chmod +x $tmp/foobar 104234f9b3eeSRoland Mainz rm $tmp/!(dir|foobar) 104334f9b3eeSRoland Mainz FPATH=$tmp 104434f9b3eeSRoland Mainz PATH=$FPATH:$PATH 104534f9b3eeSRoland Mainz foobar 104634f9b3eeSRoland Mainz++++ 104734f9b3eeSRoland Mainz) == foo ]] > /dev/null || err_exit 'functions compiled with shcomp not working' 104834f9b3eeSRoland Mainz# test for functions in shell having side effects. 104934f9b3eeSRoland Mainzunset -f foo foobar bar 105034f9b3eeSRoland Mainzcd "$tmp" 105134f9b3eeSRoland MainzFPATH=$PWD 105234f9b3eeSRoland MainzPATH=$FPATH:$PATH 105334f9b3eeSRoland Mainzcat > foo <<- \EOF 105434f9b3eeSRoland Mainz function bar 105534f9b3eeSRoland Mainz { 105634f9b3eeSRoland Mainz print foobar 105734f9b3eeSRoland Mainz } 105834f9b3eeSRoland Mainz function foo 105934f9b3eeSRoland Mainz { 106034f9b3eeSRoland Mainz bar 106134f9b3eeSRoland Mainz } 106234f9b3eeSRoland MainzEOF 106334f9b3eeSRoland Mainzchmod +x foo 106434f9b3eeSRoland Mainz: $(foo) 106534f9b3eeSRoland Mainz[[ $(typeset +f) == *foo* ]] && err_exit 'function in subshell leaving side effect of function foo' 106634f9b3eeSRoland Mainzunset -f foo bar 106734f9b3eeSRoland Mainz: $(foo) 106834f9b3eeSRoland Mainz[[ $(typeset +f) == *foo* ]] && err_exit 'function in subshell leaving side effects of function foo after reload' 106934f9b3eeSRoland Mainz[[ $(typeset +f) == *bar* ]] && err_exit 'function in subshell leaving side effects of function bar after reload' 107034f9b3eeSRoland Mainz 1071*3e14f97fSRoger A. Faulknerunset -f foo 1072*3e14f97fSRoger A. Faulknertypeset -A bar 1073*3e14f97fSRoger A. Faulknerfunction foo 1074*3e14f97fSRoger A. Faulkner{ 1075*3e14f97fSRoger A. Faulkner typeset -i bar[$1].x 1076*3e14f97fSRoger A. Faulkner bar[$1].x=5 1077*3e14f97fSRoger A. Faulkner} 1078*3e14f97fSRoger A. Faulknerfoo sub 1079*3e14f97fSRoger A. Faulkner[[ ${!bar[@]} == sub ]] || err_exit 'scoping problem with compound array variables' 1080*3e14f97fSRoger A. Faulkner 1081*3e14f97fSRoger A. Faulknerfunction A 1082*3e14f97fSRoger A. Faulkner{ 1083*3e14f97fSRoger A. Faulkner trap "> /dev/null;print TRAP A" EXIT 1084*3e14f97fSRoger A. Faulkner # (( stderr )) && print >&2 1085*3e14f97fSRoger A. Faulkner} 1086*3e14f97fSRoger A. Faulkner 1087*3e14f97fSRoger A. Faulknerfunction B 1088*3e14f97fSRoger A. Faulkner{ 1089*3e14f97fSRoger A. Faulkner trap "> /dev/null;print TRAP B" EXIT 1090*3e14f97fSRoger A. Faulkner A 1091*3e14f97fSRoger A. Faulkner} 1092*3e14f97fSRoger A. Faulkner 1093*3e14f97fSRoger A. Faulknerx=$(B) 1094*3e14f97fSRoger A. Faulkner[[ $x == $'TRAP A\nTRAP B' ]] || err_exit "trap from funtions in subshells fails got" $x 1095*3e14f97fSRoger A. Faulkner 1096da2e3ebdSchinexit $((Errors)) 1097