File manager - Edit - /home/newsbmcs.com/public_html/static/img/logo/memory-model.zip
Back
PK ;u�Z��_� � scripts/checklitmushist.shnu ȯ�� #!/bin/sh # SPDX-License-Identifier: GPL-2.0+ # # Reruns the C-language litmus tests previously run that match the # specified criteria, and compares the result to that of the previous # runs from initlitmushist.sh and/or newlitmushist.sh. # # sh checklitmushist.sh # # Run from the Linux kernel tools/memory-model directory. # See scripts/parseargs.sh for list of arguments. # # Copyright IBM Corporation, 2018 # # Author: Paul E. McKenney <paulmck@linux.vnet.ibm.com> . scripts/parseargs.sh T=/tmp/checklitmushist.sh.$$ trap 'rm -rf $T' 0 mkdir $T if test -d litmus then : else echo Run scripts/initlitmushist.sh first, need litmus repo. exit 1 fi # Create the results directory and populate it with subdirectories. # The initial output is created here to avoid clobbering the output # generated earlier. mkdir $T/results find litmus -type d -print | ( cd $T/results; sed -e 's/^/mkdir -p /' | sh ) # Create the list of litmus tests already run, then remove those that # are excluded by this run's --procs argument. ( cd $LKMM_DESTDIR; find litmus -name '*.litmus.out' -print ) | sed -e 's/\.out$//' | xargs -r grep -L "^P${LKMM_PROCS}"> $T/list-C-already xargs < $T/list-C-already -r grep -L "^P${LKMM_PROCS}" > $T/list-C-short # Redirect output, run tests, then restore destination directory. destdir="$LKMM_DESTDIR" LKMM_DESTDIR=$T/results; export LKMM_DESTDIR scripts/runlitmushist.sh < $T/list-C-short > $T/runlitmushist.sh.out 2>&1 LKMM_DESTDIR="$destdir"; export LKMM_DESTDIR # Move the newly generated .litmus.out files to .litmus.out.new files # in the destination directory. cdir=`pwd` ddir=`awk -v c="$cdir" -v d="$LKMM_DESTDIR" \ 'END { if (d ~ /^\//) print d; else print c "/" d; }' < /dev/null` ( cd $T/results; find litmus -type f -name '*.litmus.out' -print | sed -e 's,^.*$,cp & '"$ddir"'/&.new,' | sh ) sed < $T/list-C-short -e 's,^,'"$LKMM_DESTDIR/"',' | sh scripts/cmplitmushist.sh exit $? PK ;u�Zs� 5� � scripts/initlitmushist.shnu ȯ�� #!/bin/sh # SPDX-License-Identifier: GPL-2.0+ # # Runs the C-language litmus tests matching the specified criteria. # Generates the output for each .litmus file into a corresponding # .litmus.out file, and does not judge the result. # # sh initlitmushist.sh # # Run from the Linux kernel tools/memory-model directory. # See scripts/parseargs.sh for list of arguments. # # This script can consume significant wallclock time and CPU, especially as # the value of --procs rises. On a four-core (eight hardware threads) # 2.5GHz x86 with a one-minute per-run timeout: # # --procs wallclock CPU timeouts tests # 1 0m11.241s 0m1.086s 0 19 # 2 1m12.598s 2m8.459s 2 393 # 3 1m30.007s 6m2.479s 4 2291 # 4 3m26.042s 18m5.139s 9 3217 # 5 4m26.661s 23m54.128s 13 3784 # 6 4m41.900s 26m4.721s 13 4352 # 7 5m51.463s 35m50.868s 13 4626 # 8 10m5.235s 68m43.672s 34 5117 # 9 15m57.80s 105m58.101s 69 5156 # 10 16m14.13s 103m35.009s 69 5165 # 20 27m48.55s 198m3.286s 156 5269 # # Increasing the timeout on the 20-process run to five minutes increases # the runtime to about 90 minutes with the CPU time rising to about # 10 hours. On the other hand, it decreases the number of timeouts to 101. # # Note that there are historical tests for which herd7 will fail # completely, for example, litmus/manual/atomic/C-unlock-wait-00.litmus # contains a call to spin_unlock_wait(), which no longer exists in either # the kernel or LKMM. . scripts/parseargs.sh T=/tmp/initlitmushist.sh.$$ trap 'rm -rf $T' 0 mkdir $T if test -d litmus then : else git clone https://github.com/paulmckrcu/litmus ( cd litmus; git checkout origin/master ) fi # Create any new directories that have appeared in the github litmus # repo since the last run. if test "$LKMM_DESTDIR" != "." then find litmus -type d -print | ( cd "$LKMM_DESTDIR"; sed -e 's/^/mkdir -p /' | sh ) fi # Create a list of the C-language litmus tests with no more than the # specified number of processes (per the --procs argument). find litmus -name '*.litmus' -exec grep -l -m 1 "^C " {} \; > $T/list-C xargs < $T/list-C -r grep -L "^P${LKMM_PROCS}" > $T/list-C-short scripts/runlitmushist.sh < $T/list-C-short exit 0 PK ;u�Z�%sƚ � scripts/checkalllitmus.shnu ȯ�� #!/bin/sh # SPDX-License-Identifier: GPL-2.0+ # # Run herd7 tests on all .litmus files in the litmus-tests directory # and check each file's result against a "Result:" comment within that # litmus test. If the verification result does not match that specified # in the litmus test, this script prints an error message prefixed with # "^^^". It also outputs verification results to a file whose name is # that of the specified litmus test, but with ".out" appended. # # Usage: # checkalllitmus.sh # # Run this in the directory containing the memory model. # # This script makes no attempt to run the litmus tests concurrently. # # Copyright IBM Corporation, 2018 # # Author: Paul E. McKenney <paulmck@linux.vnet.ibm.com> . scripts/parseargs.sh litmusdir=litmus-tests if test -d "$litmusdir" -a -r "$litmusdir" -a -x "$litmusdir" then : else echo ' --- ' error: $litmusdir is not an accessible directory exit 255 fi # Create any new directories that have appeared in the github litmus # repo since the last run. if test "$LKMM_DESTDIR" != "." then find $litmusdir -type d -print | ( cd "$LKMM_DESTDIR"; sed -e 's/^/mkdir -p /' | sh ) fi # Find the checklitmus script. If it is not where we expect it, then # assume that the caller has the PATH environment variable set # appropriately. if test -x scripts/checklitmus.sh then clscript=scripts/checklitmus.sh else clscript=checklitmus.sh fi # Run the script on all the litmus tests in the specified directory ret=0 for i in $litmusdir/*.litmus do if ! $clscript $i then ret=1 fi done if test "$ret" -ne 0 then echo " ^^^ VERIFICATION MISMATCHES" 1>&2 else echo All litmus tests verified as was expected. 1>&2 fi exit $ret PK ;u�Z����� � scripts/checklitmus.shnu ȯ�� #!/bin/sh # SPDX-License-Identifier: GPL-2.0+ # # Run a herd7 test and invokes judgelitmus.sh to check the result against # a "Result:" comment within the litmus test. It also outputs verification # results to a file whose name is that of the specified litmus test, but # with ".out" appended. # # Usage: # checklitmus.sh file.litmus # # Run this in the directory containing the memory model, specifying the # pathname of the litmus test to check. The caller is expected to have # properly set up the LKMM environment variables. # # Copyright IBM Corporation, 2018 # # Author: Paul E. McKenney <paulmck@linux.vnet.ibm.com> litmus=$1 herdoptions=${LKMM_HERD_OPTIONS--conf linux-kernel.cfg} if test -f "$litmus" -a -r "$litmus" then : else echo ' --- ' error: \"$litmus\" is not a readable file exit 255 fi echo Herd options: $herdoptions > $LKMM_DESTDIR/$litmus.out /usr/bin/time $LKMM_TIMEOUT_CMD herd7 $herdoptions $litmus >> $LKMM_DESTDIR/$litmus.out 2>&1 scripts/judgelitmus.sh $litmus PK ;u�Z�|9�B B scripts/checkghlitmus.shnu ȯ�� #!/bin/sh # SPDX-License-Identifier: GPL-2.0+ # # Runs the C-language litmus tests having a maximum number of processes # to run, defaults to 6. # # sh checkghlitmus.sh # # Run from the Linux kernel tools/memory-model directory. See the # parseargs.sh scripts for arguments. . scripts/parseargs.sh T=/tmp/checkghlitmus.sh.$$ trap 'rm -rf $T' 0 mkdir $T # Clone the repository if it is not already present. if test -d litmus then : else git clone https://github.com/paulmckrcu/litmus ( cd litmus; git checkout origin/master ) fi # Create any new directories that have appeared in the github litmus # repo since the last run. if test "$LKMM_DESTDIR" != "." then find litmus -type d -print | ( cd "$LKMM_DESTDIR"; sed -e 's/^/mkdir -p /' | sh ) fi # Create a list of the C-language litmus tests previously run. ( cd $LKMM_DESTDIR; find litmus -name '*.litmus.out' -print ) | sed -e 's/\.out$//' | xargs -r egrep -l '^ \* Result: (Never|Sometimes|Always|DEADLOCK)' | xargs -r grep -L "^P${LKMM_PROCS}"> $T/list-C-already # Create a list of C-language litmus tests with "Result:" commands and # no more than the specified number of processes. find litmus -name '*.litmus' -exec grep -l -m 1 "^C " {} \; > $T/list-C xargs < $T/list-C -r egrep -l '^ \* Result: (Never|Sometimes|Always|DEADLOCK)' > $T/list-C-result xargs < $T/list-C-result -r grep -L "^P${LKMM_PROCS}" > $T/list-C-result-short # Form list of tests without corresponding .litmus.out files sort $T/list-C-already $T/list-C-result-short | uniq -u > $T/list-C-needed # Run any needed tests. if scripts/runlitmushist.sh < $T/list-C-needed > $T/run.stdout 2> $T/run.stderr then errs= else errs=1 fi sed < $T/list-C-result-short -e 's,^,scripts/judgelitmus.sh ,' | sh > $T/judge.stdout 2> $T/judge.stderr if test -n "$errs" then cat $T/run.stderr 1>&2 fi grep '!!!' $T/judge.stdout PK ;u�Z UgI I scripts/parseargs.shnu ȯ�� #!/bin/sh # SPDX-License-Identifier: GPL-2.0+ # # the corresponding .litmus.out file, and does not judge the result. # # . scripts/parseargs.sh # # Include into other Linux kernel tools/memory-model scripts. # # Copyright IBM Corporation, 2018 # # Author: Paul E. McKenney <paulmck@linux.vnet.ibm.com> T=/tmp/parseargs.sh.$$ mkdir $T # Initialize one parameter: initparam name default initparam () { echo if test -z '"$'$1'"' > $T/s echo then >> $T/s echo $1='"'$2'"' >> $T/s echo export $1 >> $T/s echo fi >> $T/s echo $1_DEF='$'$1 >> $T/s . $T/s } initparam LKMM_DESTDIR "." initparam LKMM_HERD_OPTIONS "-conf linux-kernel.cfg" initparam LKMM_JOBS `getconf _NPROCESSORS_ONLN` initparam LKMM_PROCS "3" initparam LKMM_TIMEOUT "1m" scriptname=$0 usagehelp () { echo "Usage $scriptname [ arguments ]" echo " --destdir path (place for .litmus.out, default by .litmus)" echo " --herdopts -conf linux-kernel.cfg ..." echo " --jobs N (number of jobs, default one per CPU)" echo " --procs N (litmus tests with at most this many processes)" echo " --timeout N (herd7 timeout (e.g., 10s, 1m, 2hr, 1d, '')" echo "Defaults: --destdir '$LKMM_DESTDIR_DEF' --herdopts '$LKMM_HERD_OPTIONS_DEF' --jobs '$LKMM_JOBS_DEF' --procs '$LKMM_PROCS_DEF' --timeout '$LKMM_TIMEOUT_DEF'" exit 1 } usage () { usagehelp 1>&2 } # checkarg --argname argtype $# arg mustmatch cannotmatch checkarg () { if test $3 -le 1 then echo $1 needs argument $2 matching \"$5\" usage fi if echo "$4" | grep -q -e "$5" then : else echo $1 $2 \"$4\" must match \"$5\" usage fi if echo "$4" | grep -q -e "$6" then echo $1 $2 \"$4\" must not match \"$6\" usage fi } while test $# -gt 0 do case "$1" in --destdir) checkarg --destdir "(path to directory)" "$#" "$2" '.\+' '^--' LKMM_DESTDIR="$2" mkdir $LKMM_DESTDIR > /dev/null 2>&1 if ! test -e "$LKMM_DESTDIR" then echo "Cannot create directory --destdir '$LKMM_DESTDIR'" usage fi if test -d "$LKMM_DESTDIR" -a -w "$LKMM_DESTDIR" -a -x "$LKMM_DESTDIR" then : else echo "Directory --destdir '$LKMM_DESTDIR' insufficient permissions to create files" usage fi shift ;; --herdopts|--herdopt) checkarg --destdir "(herd7 options)" "$#" "$2" '.*' '^--' LKMM_HERD_OPTIONS="$2" shift ;; -j[1-9]*) njobs="`echo $1 | sed -e 's/^-j//'`" trailchars="`echo $njobs | sed -e 's/[0-9]\+\(.*\)$/\1/'`" if test -n "$trailchars" then echo $1 trailing characters "'$trailchars'" usagehelp fi LKMM_JOBS="`echo $njobs | sed -e 's/^\([0-9]\+\).*$/\1/'`" ;; --jobs|--job|-j) checkarg --jobs "(number)" "$#" "$2" '^[1-9][0-9]\+$' '^--' LKMM_JOBS="$2" shift ;; --procs|--proc) checkarg --procs "(number)" "$#" "$2" '^[0-9]\+$' '^--' LKMM_PROCS="$2" shift ;; --timeout) checkarg --timeout "(timeout spec)" "$#" "$2" '^\([0-9]\+[smhd]\?\|\)$' '^--' LKMM_TIMEOUT="$2" shift ;; *) echo Unknown argument $1 usage ;; esac shift done if test -z "$LKMM_TIMEOUT" then LKMM_TIMEOUT_CMD=""; export LKMM_TIMEOUT_CMD else LKMM_TIMEOUT_CMD="timeout $LKMM_TIMEOUT"; export LKMM_TIMEOUT_CMD fi rm -rf $T PK ;u�Z��ns s scripts/judgelitmus.shnu ȯ�� #!/bin/sh # SPDX-License-Identifier: GPL-2.0+ # # Given a .litmus test and the corresponding .litmus.out file, check # the .litmus.out file against the "Result:" comment to judge whether # the test ran correctly. # # Usage: # judgelitmus.sh file.litmus # # Run this in the directory containing the memory model, specifying the # pathname of the litmus test to check. # # Copyright IBM Corporation, 2018 # # Author: Paul E. McKenney <paulmck@linux.vnet.ibm.com> litmus=$1 if test -f "$litmus" -a -r "$litmus" then : else echo ' --- ' error: \"$litmus\" is not a readable file exit 255 fi if test -f "$LKMM_DESTDIR/$litmus".out -a -r "$LKMM_DESTDIR/$litmus".out then : else echo ' --- ' error: \"$LKMM_DESTDIR/$litmus\".out is not a readable file exit 255 fi if grep -q '^ \* Result: ' $litmus then outcome=`grep -m 1 '^ \* Result: ' $litmus | awk '{ print $3 }'` else outcome=specified fi grep '^Observation' $LKMM_DESTDIR/$litmus.out if grep -q '^Observation' $LKMM_DESTDIR/$litmus.out then : else echo ' !!! Verification error' $litmus if ! grep -q '!!!' $LKMM_DESTDIR/$litmus.out then echo ' !!! Verification error' >> $LKMM_DESTDIR/$litmus.out 2>&1 fi exit 255 fi if test "$outcome" = DEADLOCK then if grep '^Observation' $LKMM_DESTDIR/$litmus.out | grep -q 'Never 0 0$' then ret=0 else echo " !!! Unexpected non-$outcome verification" $litmus if ! grep -q '!!!' $LKMM_DESTDIR/$litmus.out then echo " !!! Unexpected non-$outcome verification" >> $LKMM_DESTDIR/$litmus.out 2>&1 fi ret=1 fi elif grep '^Observation' $LKMM_DESTDIR/$litmus.out | grep -q $outcome || test "$outcome" = Maybe then ret=0 else echo " !!! Unexpected non-$outcome verification" $litmus if ! grep -q '!!!' $LKMM_DESTDIR/$litmus.out then echo " !!! Unexpected non-$outcome verification" >> $LKMM_DESTDIR/$litmus.out 2>&1 fi ret=1 fi tail -2 $LKMM_DESTDIR/$litmus.out | head -1 exit $ret PK ;u�Z2��; ; scripts/newlitmushist.shnu ȯ�� #!/bin/sh # SPDX-License-Identifier: GPL-2.0+ # # Runs the C-language litmus tests matching the specified criteria # that do not already have a corresponding .litmus.out file, and does # not judge the result. # # sh newlitmushist.sh # # Run from the Linux kernel tools/memory-model directory. # See scripts/parseargs.sh for list of arguments. # # Copyright IBM Corporation, 2018 # # Author: Paul E. McKenney <paulmck@linux.vnet.ibm.com> . scripts/parseargs.sh T=/tmp/newlitmushist.sh.$$ trap 'rm -rf $T' 0 mkdir $T if test -d litmus then : else echo Run scripts/initlitmushist.sh first, need litmus repo. exit 1 fi # Create any new directories that have appeared in the github litmus # repo since the last run. if test "$LKMM_DESTDIR" != "." then find litmus -type d -print | ( cd "$LKMM_DESTDIR"; sed -e 's/^/mkdir -p /' | sh ) fi # Create a list of the C-language litmus tests previously run. ( cd $LKMM_DESTDIR; find litmus -name '*.litmus.out' -print ) | sed -e 's/\.out$//' | xargs -r grep -L "^P${LKMM_PROCS}"> $T/list-C-already # Form full list of litmus tests with no more than the specified # number of processes (per the --procs argument). find litmus -name '*.litmus' -exec grep -l -m 1 "^C " {} \; > $T/list-C-all xargs < $T/list-C-all -r grep -L "^P${LKMM_PROCS}" > $T/list-C-short # Form list of new tests. Note: This does not handle litmus-test deletion! sort $T/list-C-already $T/list-C-short | uniq -u > $T/list-C-new # Form list of litmus tests that have changed since the last run. sed < $T/list-C-short -e 's,^.*$,if test & -nt '"$LKMM_DESTDIR"'/&.out; then echo &; fi,' > $T/list-C-script sh $T/list-C-script > $T/list-C-newer # Merge the list of new and of updated litmus tests: These must be (re)run. sort -u $T/list-C-new $T/list-C-newer > $T/list-C-needed scripts/runlitmushist.sh < $T/list-C-needed exit 0 PK ;u�Z�.�|� � scripts/cmplitmushist.shnu ȯ�� #!/bin/sh # SPDX-License-Identifier: GPL-2.0+ # # Compares .out and .out.new files for each name on standard input, # one full pathname per line. Outputs comparison results followed by # a summary. # # sh cmplitmushist.sh T=/tmp/cmplitmushist.sh.$$ trap 'rm -rf $T' 0 mkdir $T # comparetest oldpath newpath perfect=0 obsline=0 noobsline=0 obsresult=0 badcompare=0 comparetest () { grep -v 'maxresident)k\|minor)pagefaults\|^Time' $1 > $T/oldout grep -v 'maxresident)k\|minor)pagefaults\|^Time' $2 > $T/newout if cmp -s $T/oldout $T/newout && grep -q '^Observation' $1 then echo Exact output match: $2 perfect=`expr "$perfect" + 1` return 0 fi grep '^Observation' $1 > $T/oldout grep '^Observation' $2 > $T/newout if test -s $T/oldout -o -s $T/newout then if cmp -s $T/oldout $T/newout then echo Matching Observation result and counts: $2 obsline=`expr "$obsline" + 1` return 0 fi else echo Missing Observation line "(e.g., herd7 timeout)": $2 noobsline=`expr "$noobsline" + 1` return 0 fi grep '^Observation' $1 | awk '{ print $3 }' > $T/oldout grep '^Observation' $2 | awk '{ print $3 }' > $T/newout if cmp -s $T/oldout $T/newout then echo Matching Observation Always/Sometimes/Never result: $2 obsresult=`expr "$obsresult" + 1` return 0 fi echo ' !!!' Result changed: $2 badcompare=`expr "$badcompare" + 1` return 1 } sed -e 's/^.*$/comparetest &.out &.out.new/' > $T/cmpscript . $T/cmpscript > $T/cmpscript.out cat $T/cmpscript.out echo ' ---' Summary: 1>&2 grep '!!!' $T/cmpscript.out 1>&2 if test "$perfect" -ne 0 then echo Exact output matches: $perfect 1>&2 fi if test "$obsline" -ne 0 then echo Matching Observation result and counts: $obsline 1>&2 fi if test "$noobsline" -ne 0 then echo Missing Observation line "(e.g., herd7 timeout)": $noobsline 1>&2 fi if test "$obsresult" -ne 0 then echo Matching Observation Always/Sometimes/Never result: $obsresult 1>&2 fi if test "$badcompare" -ne 0 then echo "!!!" Result changed: $badcompare 1>&2 exit 1 fi exit 0 PK ;u�Zp 5E% % scripts/runlitmushist.shnu ȯ�� #!/bin/bash # SPDX-License-Identifier: GPL-2.0+ # # Runs the C-language litmus tests specified on standard input, using up # to the specified number of CPUs (defaulting to all of them) and placing # the results in the specified directory (defaulting to the same place # the litmus test came from). # # sh runlitmushist.sh # # Run from the Linux kernel tools/memory-model directory. # This script uses environment variables produced by parseargs.sh. # # Copyright IBM Corporation, 2018 # # Author: Paul E. McKenney <paulmck@linux.vnet.ibm.com> T=/tmp/runlitmushist.sh.$$ trap 'rm -rf $T' 0 mkdir $T if test -d litmus then : else echo Directory \"litmus\" missing, aborting run. exit 1 fi # Prefixes for per-CPU scripts for ((i=0;i<$LKMM_JOBS;i++)) do echo dir="$LKMM_DESTDIR" > $T/$i.sh echo T=$T >> $T/$i.sh echo herdoptions=\"$LKMM_HERD_OPTIONS\" >> $T/$i.sh cat << '___EOF___' >> $T/$i.sh runtest () { echo ' ... ' /usr/bin/time $LKMM_TIMEOUT_CMD herd7 $herdoptions $1 '>' $dir/$1.out '2>&1' if /usr/bin/time $LKMM_TIMEOUT_CMD herd7 $herdoptions $1 > $dir/$1.out 2>&1 then if ! grep -q '^Observation ' $dir/$1.out then echo ' !!! Herd failed, no Observation:' $1 fi else exitcode=$? if test "$exitcode" -eq 124 then exitmsg="timed out" else exitmsg="failed, exit code $exitcode" fi echo ' !!! Herd' ${exitmsg}: $1 fi } ___EOF___ done awk -v q="'" -v b='\\' ' { print "echo `grep " q "^P[0-9]" b "+(" q " " $0 " | tail -1 | sed -e " q "s/^P" b "([0-9]" b "+" b ")(.*$/" b "1/" q "` " $0 }' | bash | sort -k1n | awk -v ncpu=$LKMM_JOBS -v t=$T ' { print "runtest " $2 >> t "/" NR % ncpu ".sh"; } END { for (i = 0; i < ncpu; i++) { print "sh " t "/" i ".sh > " t "/" i ".sh.out 2>&1 &"; close(t "/" i ".sh"); } print "wait"; }' | sh cat $T/*.sh.out if grep -q '!!!' $T/*.sh.out then echo ' ---' Summary: 1>&2 grep '!!!' $T/*.sh.out 1>&2 nfail="`grep '!!!' $T/*.sh.out | wc -l`" echo 'Number of failed herd7 runs (e.g., timeout): ' $nfail 1>&2 exit 1 else echo All runs completed successfully. 1>&2 exit 0 fi PK ;u�Z��_� � scripts/checklitmushist.shnu ȯ�� PK ;u�Zs� 5� � � scripts/initlitmushist.shnu ȯ�� PK ;u�Z�%sƚ � scripts/checkalllitmus.shnu ȯ�� PK ;u�Z����� � � scripts/checklitmus.shnu ȯ�� PK ;u�Z�|9�B B scripts/checkghlitmus.shnu ȯ�� PK ;u�Z UgI I �# scripts/parseargs.shnu ȯ�� PK ;u�Z��ns s +0 scripts/judgelitmus.shnu ȯ�� PK ;u�Z2��; ; �7 scripts/newlitmushist.shnu ȯ�� PK ;u�Z�.�|� � g? scripts/cmplitmushist.shnu ȯ�� PK ;u�Zp 5E% % �G scripts/runlitmushist.shnu ȯ�� PK l P
| ver. 1.4 |
Github
|
.
| PHP 8.2.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings