Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Libretro
Citra2018
Commits
e591f852
Commit
e591f852
authored
Mar 17, 2021
by
Libretro-Admin
Browse files
Remove everything not needed for libretro
parent
912af3a5
Pipeline
#17283
failed
Changes
307
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
.appveyor/FindDependencies.ps1
deleted
100644 → 0
View file @
912af3a5
# Set-up Visual Studio Command Prompt environment for PowerShell
pushd
"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\"
cmd
/c
"VsDevCmd.bat -arch=x64 & set"
|
foreach
{
if
(
$_
-match
"="
)
{
$v
=
$_
.
split
(
"="
);
Set-Item
-Force
-Path
"ENV:\
$(
$v
[
0
]
)
"
-Value
"
$(
$v
[
1
]
)
"
}
}
popd
function
Which
(
$search_path
,
$name
)
{
(
$search_path
)
.
Split
(
";"
)
|
Get-ChildItem
-Filter
$name
|
Select
-First
1
-Exp
FullName
}
function
GetDeps
(
$search_path
,
$binary
)
{
((
dumpbin
/dependents
$binary
)
.
Where
({
$_
-match
"dependencies:"
},
"SkipUntil"
)
|
Select-String
"[^ ]*\.dll"
)
.
Matches
|
foreach
{
Which
$search_path
$_
.
Value
}
}
function
RecursivelyGetDeps
(
$search_path
,
$binary
)
{
$final_deps
=
@()
$deps_to_process
=
GetDeps
$search_path
$binary
while
(
$deps_to_process
.
Count
-gt
0
)
{
$current
,
$deps_to_process
=
$deps_to_process
if
(
$final_deps
-contains
$current
)
{
continue
}
# Is this a system dll file?
# We use the same algorithm that cmake uses to determine this.
if
(
$current
-match
"
$(
[
regex
]::
Escape
(
$
env
:
SystemRoot
)
)\\sys"
)
{
continue
}
if
(
$current
-match
"
$(
[
regex
]::
Escape
(
$
env
:
WinDir
)
)\\sys"
)
{
continue
}
if
(
$current
-match
"\\msvc[^\\]+dll"
)
{
continue
}
if
(
$current
-match
"\\api-ms-win-[^\\]+dll"
)
{
continue
}
$final_deps
+=
$current
$new_deps
=
GetDeps
$search_path
$current
$deps_to_process
+=
(
$new_deps
|
?
{
-not
(
$final_deps
-contains
$_
)})
}
return
$final_deps
}
.appveyor/ProcessPdb.ps1
deleted
100644 → 0
View file @
912af3a5
# Generate pdb files for mingw
if
(
$
env
:
BUILD_TYPE
-eq
'mingw'
)
{
Invoke-WebRequest
-Uri
https://raw.githubusercontent.com/citra-emu/ext-windows-bin/master/cv2pdb/cv2pdb.exe
-OutFile
cv2pdb.exe
foreach
(
$exe
in
Get-ChildItem
"
$RELEASE_DIST
"
-Recurse
-Filter
"citra*.exe"
)
{
.
\cv2pdb
$exe
.
FullName
}
}
# Specify source locations in pdb via srcsrv.ini
$srcsrv
=
"SRCSRV: ini ------------------------------------------------
`r`n
"
$srcsrv
+=
"VERSION=2
`r`n
"
$srcsrv
+=
"VERCTRL=http
`r`n
"
$srcsrv
+=
"SRCSRV: variables ------------------------------------------
`r`n
"
$srcsrv
+=
"SRCSRVTRG=https://raw.githubusercontent.com/%var2%/%var3%/%var4%
`r`n
"
$srcsrv
+=
"SRCSRV: source files ---------------------------------------
`r`n
"
foreach
(
$repo
in
@{
"citra-emu/citra"
=
""
"citra-emu/ext-boost"
=
"externals/boost"
"citra-emu/ext-soundtouch"
=
"externals/soundtouch"
"fmtlib/fmt"
=
"externals/fmt"
"herumi/xbyak"
=
"externals/xbyak"
"lsalzman/enet"
=
"externals/enet"
"MerryMage/dynarmic"
=
"externals/dynarmic"
"neobrain/nihstro"
=
"externals/nihstro"
}
.
GetEnumerator
())
{
pushd
cd
$repo
.
Value
$rev
=
git
rev-parse
HEAD
$files
=
git
ls-tree
--name-only
--full-tree
-r
HEAD
foreach
(
$file
in
$files
)
{
$srcsrv
+=
"
$(
pwd
)
\
$
(
$file
-replace
'/'
,
'\'
)
*
$(
$repo
.
Name
)
*
$rev
*
$file
`r`n
"
}
popd
}
$srcsrv
+=
"SRCSRV: end ------------------------------------------------
`r`n
"
Set-Content
-Path
srcsrv.ini
-Value
$srcsrv
foreach
(
$pdb
in
Get-ChildItem
"
$RELEASE_DIST
"
-Recurse
-Filter
"*.pdb"
)
{
&
"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\srcsrv\pdbstr.exe"
-w
-i
:
srcsrv.ini
-p
:
$pdb
.
FullName
-s
:
srcsrv
}
.gitlab-ci.yml
View file @
e591f852
...
...
@@ -9,21 +9,18 @@
variables
:
CORENAME
:
citra2018
EXTRA_PATH
:
src/citra_libretro
CORE_ARGS
:
-DENABLE_LIBRETRO=1 -DENABLE_SDL2=0 -DENABLE_QT=0 -DENABLE_WEB_SERVICE=0
CORE_ARGS
:
variables
:
GIT_SUBMODULE_STRATEGY
:
normal
.core-linux-defs
:
extends
:
.core-defs
variables
:
CORE_ARGS
:
-DENABLE_LIBRETRO=1 -DLIBRETRO_STATIC=1 -DENABLE_SDL2=0 -DENABLE_QT=0 -DENABLE_WEB_SERVICE=0
.core-windows-defs
:
extends
:
.core-defs
variables
:
EXTRA_PATH
:
bin\Release
CORE_ARGS
:
-DENABLE_LIBRETRO=1 -DLIBRETRO_STATIC=1 -DENABLE_SDL2=0 -DENABLE_QT=0 -DENABLE_WEB_SERVICE=0
# Inclusion templates, required for the build to work
include
:
...
...
.travis/clang-format/script.sh
deleted
100755 → 0
View file @
912af3a5
#!/bin/bash -ex
if
grep
-nr
'\s$'
src
*
.yml
*
.txt
*
.md Doxyfile .gitignore .gitmodules .travis
*
dist/
*
.desktop
\
dist/
*
.svg dist/
*
.xml
;
then
echo
Trailing whitespace found, aborting
exit
1
fi
# Default clang-format points to default 3.5 version one
CLANG_FORMAT
=
clang-format-6.0
$CLANG_FORMAT
--version
if
[
"
$TRAVIS_EVENT_TYPE
"
=
"pull_request"
]
;
then
# Get list of every file modified in this pull request
files_to_lint
=
"
$(
git diff
--name-only
--diff-filter
=
ACMRTUXB
$TRAVIS_COMMIT_RANGE
|
grep
'^src/[^.]*[.]\(cpp\|h\)$'
||
true
)
"
else
# Check everything for branch pushes
files_to_lint
=
"
$(
find src/
-name
'*.cpp'
-or
-name
'*.h'
)
"
fi
# Turn off tracing for this because it's too verbose
set
+x
for
f
in
$files_to_lint
;
do
d
=
$(
diff
-u
"
$f
"
<
(
$CLANG_FORMAT
"
$f
"
)
||
true
)
if
!
[
-z
"
$d
"
]
;
then
echo
"!!!
$f
not compliant to coding style, here is the fix:"
echo
"
$d
"
fail
=
1
fi
done
set
-x
if
[
"
$fail
"
=
1
]
;
then
exit
1
fi
.travis/common/post-upload.sh
deleted
100755 → 0
View file @
912af3a5
#!/bin/bash -ex
# Copy documentation
cp
license.txt
"
$REV_NAME
"
cp
README.md
"
$REV_NAME
"
# Copy cross-platform scripting support
cp
-r
dist/scripting
"
$REV_NAME
"
tar
$COMPRESSION_FLAGS
"
$ARCHIVE_NAME
"
"
$REV_NAME
"
# Find out what release we are building
if
[
-z
$TRAVIS_TAG
]
;
then
RELEASE_NAME
=
head
else
RELEASE_NAME
=
$(
echo
$TRAVIS_TAG
|
cut
-d-
-f1
)
if
[
"
$NAME
"
=
"MinGW build"
]
;
then
RELEASE_NAME
=
"
${
RELEASE_NAME
}
-mingw"
fi
fi
mv
"
$REV_NAME
"
$RELEASE_NAME
7z a
"
$REV_NAME
.7z"
$RELEASE_NAME
# move the compiled archive into the artifacts directory to be uploaded by travis releases
mv
"
$ARCHIVE_NAME
"
artifacts/
mv
"
$REV_NAME
.7z"
artifacts/
.travis/common/pre-upload.sh
deleted
100755 → 0
View file @
912af3a5
#!/bin/bash -ex
GITDATE
=
"
`
git show
-s
--date
=
short
--format
=
'%ad'
|
sed
's/-//g'
`
"
GITREV
=
"
`
git show
-s
--format
=
'%h'
`
"
mkdir
-p
artifacts
.travis/common/travis-ci.env
deleted
100644 → 0
View file @
912af3a5
# List of environment variables to be shared with Docker containers
CI
TRAVIS
CONTINUOUS_INTEGRATION
TRAVIS_BRANCH
TRAVIS_BUILD_ID
TRAVIS_BUILD_NUMBER
TRAVIS_COMMIT
TRAVIS_JOB_ID
TRAVIS_JOB_NUMBER
TRAVIS_REPO_SLUG
TRAVIS_TAG
# citra specific flags
ENABLE_COMPATIBILITY_REPORTING
USE_DISCORD_PRESENCE
.travis/linux-frozen/build.sh
deleted
100755 → 0
View file @
912af3a5
#!/bin/bash -ex
mkdir
-p
"
$HOME
/.ccache"
docker pull citraemu/build-environments:linux-frozen
docker run
--env-file
.travis/common/travis-ci.env
-v
$(
pwd
)
:/citra
-v
"
$HOME
/.ccache"
:/root/.ccache citraemu/build-environments:linux-frozen /bin/bash
-ex
/citra/.travis/linux-frozen/docker.sh
.travis/linux-frozen/docker.sh
deleted
100755 → 0
View file @
912af3a5
#!/bin/bash -ex
cd
/citra
mkdir
build
&&
cd
build
cmake ..
-DCMAKE_BUILD_TYPE
=
Release
-DCMAKE_C_COMPILER
=
/usr/lib/ccache/gcc
-DCMAKE_CXX_COMPILER
=
/usr/lib/ccache/g++
-DCITRA_ENABLE_COMPATIBILITY_REPORTING
=
${
ENABLE_COMPATIBILITY_REPORTING
:-
"OFF"
}
-DENABLE_COMPATIBILITY_LIST_DOWNLOAD
=
ON
-DUSE_DISCORD_PRESENCE
=
ON
make
-j4
ctest
-VV
-C
Release
.travis/linux-frozen/install_package.py
deleted
100755 → 0
View file @
912af3a5
#!/usr/bin/python
import
sys
import
re
import
subprocess
from
launchpadlib.launchpad
import
Launchpad
if
sys
.
version_info
[
0
]
>
2
:
xrange
=
range
cachedir
=
'/.launchpadlib/cache/'
launchpad
=
Launchpad
.
login_anonymously
(
'grab build info'
,
'production'
,
cachedir
,
version
=
'devel'
)
processed_packages
=
[]
deb_file_list
=
[]
def
get_url
(
pkg
,
distro
):
build_ref
=
launchpad
.
archives
.
getByReference
(
reference
=
'ubuntu'
).
getPublishedBinaries
(
binary_name
=
pkg
[
0
],
distro_arch_series
=
'https://api.launchpad.net/devel/ubuntu/'
+
distro
+
'/amd64'
,
version
=
pkg
[
1
],
exact_match
=
True
,
order_by_date
=
True
).
entries
[
0
]
build_link
=
build_ref
[
'build_link'
]
deb_name
=
'{}_{}_{}.deb'
.
format
(
pkg
[
0
],
pkg
[
1
],
'amd64'
if
build_ref
[
'architecture_specific'
]
else
'all'
)
deb_link
=
build_link
+
'/+files/'
+
deb_name
return
[
deb_link
,
deb_name
]
def
list_dependencies
(
deb_file
):
t
=
subprocess
.
check_output
(
[
'bash'
,
'-c'
,
'(dpkg -I {} | grep -oP "^ Depends\: \K.*$") || true'
.
format
(
deb_file
)])
deps
=
[
i
.
strip
()
for
i
in
t
.
split
(
','
)]
equals_re
=
re
.
compile
(
r
'^(.*) \(= (.*)\)$'
)
return
[
equals_re
.
sub
(
r
'\1=\2'
,
i
).
split
(
'='
)
for
i
in
filter
(
equals_re
.
match
,
deps
)]
def
get_package
(
pkg
,
distro
):
if
pkg
in
processed_packages
:
return
print
(
'Getting {}...'
.
format
(
pkg
[
0
]))
url
=
get_url
(
pkg
,
distro
)
subprocess
.
check_call
([
'wget'
,
'--quiet'
,
url
[
0
],
'-O'
,
url
[
1
]])
for
dep
in
list_dependencies
(
url
[
1
]):
get_package
(
dep
,
distro
)
processed_packages
.
append
(
pkg
)
deb_file_list
.
append
(
'./'
+
url
[
1
])
for
i
in
xrange
(
1
,
len
(
sys
.
argv
),
3
):
get_package
([
sys
.
argv
[
i
],
sys
.
argv
[
i
+
1
]],
sys
.
argv
[
i
+
2
])
subprocess
.
check_call
(
[
'apt-get'
,
'install'
,
'-y'
,
'--force-yes'
]
+
deb_file_list
)
.travis/linux-mingw/build.sh
deleted
100755 → 0
View file @
912af3a5
#!/bin/bash -ex
mkdir
"
$HOME
/.ccache"
||
true
docker run
--env-file
.travis/common/travis-ci.env
-v
$(
pwd
)
:/citra
-v
"
$HOME
/.ccache"
:/root/.ccache citraemu/build-environments:linux-mingw /bin/bash
-ex
/citra/.travis/linux-mingw/docker.sh
.travis/linux-mingw/deps.sh
deleted
100755 → 0
View file @
912af3a5
#!/bin/sh -ex
docker pull citraemu/build-environments:linux-mingw
.travis/linux-mingw/docker.sh
deleted
100755 → 0
View file @
912af3a5
#!/bin/bash -ex
cd
/citra
# override Travis CI unreasonable ccache size
echo
'max_size = 3.0G'
>
"
$HOME
/.ccache/ccache.conf"
mkdir
build
&&
cd
build
cmake ..
-DCMAKE_TOOLCHAIN_FILE
=
"
$(
pwd
)
/../CMakeModules/MinGWCross.cmake"
-DUSE_CCACHE
=
ON
-DCMAKE_BUILD_TYPE
=
Release
-DENABLE_QT_TRANSLATION
=
ON
-DCITRA_ENABLE_COMPATIBILITY_REPORTING
=
${
ENABLE_COMPATIBILITY_REPORTING
:-
"OFF"
}
-DENABLE_COMPATIBILITY_LIST_DOWNLOAD
=
ON
-DUSE_DISCORD_PRESENCE
=
ON
make
-j4
echo
"Tests skipped"
#ctest -VV -C Release
ccache
-s
echo
'Prepare binaries...'
cd
..
mkdir
package
QT_PLATFORM_DLL_PATH
=
'/usr/x86_64-w64-mingw32/lib/qt5/plugins/platforms/'
find build/
-name
"citra*.exe"
-exec
cp
{}
'package'
\;
# copy Qt plugins
mkdir
package/platforms
cp
"
${
QT_PLATFORM_DLL_PATH
}
/qwindows.dll"
package/platforms/
cp
-rv
"
${
QT_PLATFORM_DLL_PATH
}
/../mediaservice/"
package/
cp
-rv
"
${
QT_PLATFORM_DLL_PATH
}
/../imageformats/"
package/
rm
-f
package/mediaservice/
*
d.dll
for
i
in
package/
*
.exe
;
do
# we need to process pdb here, however, cv2pdb
# does not work here, so we just simply strip all the debug symbols
x86_64-w64-mingw32-strip
"
${
i
}
"
done
pip3
install
pefile
python3 .travis/linux-mingw/scan_dll.py package/
*
.exe
"package/"
.travis/linux-mingw/scan_dll.py
deleted
100755 → 0
View file @
912af3a5
import
pefile
import
sys
import
re
import
os
import
queue
import
shutil
# constant definitions
KNOWN_SYS_DLLS
=
[
'WINMM.DLL'
,
'MSVCRT.DLL'
,
'VERSION.DLL'
,
'MPR.DLL'
,
'DWMAPI.DLL'
,
'UXTHEME.DLL'
,
'DNSAPI.DLL'
,
'IPHLPAPI.DLL'
]
# below is for Ubuntu 18.04 with specified PPA enabled, if you are using
# other distro or different repositories, change the following accordingly
DLL_PATH
=
[
'/usr/x86_64-w64-mingw32/bin/'
,
'/usr/x86_64-w64-mingw32/lib/'
,
'/usr/lib/gcc/x86_64-w64-mingw32/7.3-posix/'
]
missing
=
[]
def
parse_imports
(
file_name
):
results
=
[]
pe
=
pefile
.
PE
(
file_name
,
fast_load
=
True
)
pe
.
parse_data_directories
()
for
entry
in
pe
.
DIRECTORY_ENTRY_IMPORT
:
current
=
entry
.
dll
.
decode
()
current_u
=
current
.
upper
()
# b/c Windows is often case insensitive
# here we filter out system dlls
# dll w/ names like *32.dll are likely to be system dlls
if
current_u
.
upper
()
not
in
KNOWN_SYS_DLLS
and
not
re
.
match
(
string
=
current_u
,
pattern
=
r
'.*32\.DLL'
):
results
.
append
(
current
)
return
results
def
parse_imports_recursive
(
file_name
,
path_list
=
[]):
q
=
queue
.
Queue
()
# create a FIFO queue
# file_name can be a string or a list for the convience
if
isinstance
(
file_name
,
str
):
q
.
put
(
file_name
)
elif
isinstance
(
file_name
,
list
):
for
i
in
file_name
:
q
.
put
(
i
)
full_list
=
[]
while
q
.
qsize
():
current
=
q
.
get_nowait
()
print
(
'> %s'
%
current
)
deps
=
parse_imports
(
current
)
# if this dll does not have any import, ignore it
if
not
deps
:
continue
for
dep
in
deps
:
# the dependency already included in the list, skip
if
dep
in
full_list
:
continue
# find the requested dll in the provided paths
full_path
=
find_dll
(
dep
)
if
not
full_path
:
missing
.
append
(
dep
)
continue
full_list
.
append
(
dep
)
q
.
put
(
full_path
)
path_list
.
append
(
full_path
)
return
full_list
def
find_dll
(
name
):
for
path
in
DLL_PATH
:
for
root
,
_
,
files
in
os
.
walk
(
path
):
for
f
in
files
:
if
name
.
lower
()
==
f
.
lower
():
return
os
.
path
.
join
(
root
,
f
)
def
deploy
(
name
,
dst
,
dry_run
=
False
):
dlls_path
=
[]
parse_imports_recursive
(
name
,
dlls_path
)
for
dll_entry
in
dlls_path
:
if
not
dry_run
:
shutil
.
copy
(
dll_entry
,
dst
)
else
:
print
(
'[Dry-Run] Copy %s to %s'
%
(
dll_entry
,
dst
))
print
(
'Deploy completed.'
)
return
dlls_path
def
main
():
if
len
(
sys
.
argv
)
<
3
:
print
(
'Usage: %s [files to examine ...] [target deploy directory]'
)
return
1
to_deploy
=
sys
.
argv
[
1
:
-
1
]
tgt_dir
=
sys
.
argv
[
-
1
]
if
not
os
.
path
.
isdir
(
tgt_dir
):
print
(
'%s is not a directory.'
%
tgt_dir
)
return
1
print
(
'Scanning dependencies...'
)
deploy
(
to_deploy
,
tgt_dir
)
if
missing
:
print
(
'Following DLLs are not found: %s'
%
(
'
\n
'
.
join
(
missing
)))
return
0
if
__name__
==
'__main__'
:
main
()
.travis/linux-mingw/upload.sh
deleted
100755 → 0
View file @
912af3a5
#!/bin/bash -ex
.
.travis/common/pre-upload.sh
REV_NAME
=
"citra-windows-mingw-
${
GITDATE
}
-
${
GITREV
}
"
ARCHIVE_NAME
=
"
${
REV_NAME
}
.tar.gz"
COMPRESSION_FLAGS
=
"-czvf"
mkdir
"
$REV_NAME
"
# get around the permission issues
cp
-r
package/
*
"
$REV_NAME
"
.
.travis/common/post-upload.sh
.travis/linux/build.sh
deleted
100755 → 0
View file @
912af3a5
#!/bin/bash -ex
mkdir
-p
"
$HOME
/.ccache"
docker run
--env-file
.travis/common/travis-ci.env
-v
$(
pwd
)
:/citra
-v
"
$HOME
/.ccache"
:/root/.ccache citraemu/build-environments:linux-fresh /bin/bash
-ex
/citra/.travis/linux/docker.sh
.travis/linux/deps.sh
deleted
100755 → 0
View file @
912af3a5
#!/bin/sh -ex
docker pull citraemu/build-environments:linux-fresh
.travis/linux/docker.sh
deleted
100755 → 0
View file @
912af3a5
#!/bin/bash -ex
cd
/citra
mkdir
build
&&
cd
build
cmake ..
-DCMAKE_BUILD_TYPE
=
Release
-DCMAKE_C_COMPILER
=
/usr/lib/ccache/gcc
-DCMAKE_CXX_COMPILER
=
/usr/lib/ccache/g++
-DENABLE_QT_TRANSLATION
=
ON
-DCITRA_ENABLE_COMPATIBILITY_REPORTING
=
${
ENABLE_COMPATIBILITY_REPORTING
:-
"OFF"
}
-DENABLE_COMPATIBILITY_LIST_DOWNLOAD
=
ON
-DUSE_DISCORD_PRESENCE
=
ON
make
-j4
ctest
-VV
-C
Release
.travis/linux/upload.sh
deleted
100755 → 0
View file @
912af3a5
#!/bin/bash -ex
.
.travis/common/pre-upload.sh
REV_NAME
=
"citra-linux-
${
GITDATE
}
-
${
GITREV
}
"
ARCHIVE_NAME
=
"
${
REV_NAME
}
.tar.xz"
COMPRESSION_FLAGS
=
"-cJvf"
mkdir
"
$REV_NAME
"
cp
build/bin/citra
"
$REV_NAME
"
cp
build/bin/citra-room
"
$REV_NAME
"
cp
build/bin/citra-qt
"
$REV_NAME
"
# We need icons on Linux for .desktop entries
mkdir
"
$REV_NAME
/dist"
cp
dist/icon.png
"
$REV_NAME
/dist/citra.png"
.
.travis/common/post-upload.sh
.travis/macos/build.sh
deleted
100755 → 0
View file @
912af3a5
#!/bin/bash -ex
set
-o
pipefail
export
MACOSX_DEPLOYMENT_TARGET
=
10.12
export
Qt5_DIR
=
$(
brew
--prefix
)
/opt/qt5
export
PATH
=
"/usr/local/opt/ccache/libexec:
$PATH
"
mkdir
build
&&
cd
build
cmake ..
-DCMAKE_OSX_ARCHITECTURES
=
"x86_64;x86_64h"
-DCMAKE_BUILD_TYPE
=
Release
-DENABLE_QT_TRANSLATION
=
ON
-DCITRA_ENABLE_COMPATIBILITY_REPORTING
=
${
ENABLE_COMPATIBILITY_REPORTING
:-
"OFF"
}
-DENABLE_COMPATIBILITY_LIST_DOWNLOAD
=
ON
-DUSE_DISCORD_PRESENCE
=
ON
make
-j4
ctest
-VV
-C
Release
Prev
1
2
3
4
5
…
16
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment