Deployment to both, dev and staging environments. Automatic contract address update in demo. Refactor sh scripts. .env files splitted on particular enviornments
This commit is contained in:
parent
c3a495e1ea
commit
ed25ca9c68
|
@ -8,6 +8,7 @@ data/
|
||||||
demo/validator*/db
|
demo/validator*/db
|
||||||
demo/validator*/keys
|
demo/validator*/keys
|
||||||
demo/validator*/queue
|
demo/validator*/queue
|
||||||
|
demo/validator*/.keys
|
||||||
demo/ganache_home_db/
|
demo/ganache_home_db/
|
||||||
demo/ganache_side_db/
|
demo/ganache_side_db/
|
||||||
src/deploy/deploy-home/build/
|
src/deploy/deploy-home/build/
|
||||||
|
|
|
@ -3,15 +3,23 @@
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
cd $(dirname "$0")
|
cd $(dirname "$0")
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
# either development or staging
|
||||||
TARGET_NETWORK=${TARGET_NETWORK:=development}
|
TARGET_NETWORK=${TARGET_NETWORK:=development}
|
||||||
|
|
||||||
start_blockchains() {
|
DEPLOY_DIR="`pwd`/src/deploy"
|
||||||
|
DEMO_DIR="`pwd`/demo"
|
||||||
|
|
||||||
|
SIDE_GANACHE_DB="$DEMO_DIR/ganache_side_db"
|
||||||
|
HOME_GANACHE_DB="$DEMO_DIR/ganache_home_db"
|
||||||
|
|
||||||
|
start_dev_blockchain_networks() {
|
||||||
echo "Starting side test blockchain"
|
echo "Starting side test blockchain"
|
||||||
|
|
||||||
docker kill ganache_side > /dev/null 2>&1 || true
|
docker kill ganache_side > /dev/null 2>&1 || true
|
||||||
docker network create blockchain_side > /dev/null 2>&1 || true
|
docker network create blockchain_side > /dev/null 2>&1 || true
|
||||||
docker run -d --network blockchain_side --rm --name ganache_side -v "$side_db_mount_point:/app/db" \
|
docker run -d --network blockchain_side --rm --name ganache_side -v "$SIDE_GANACHE_DB:/app/db" \
|
||||||
trufflesuite/ganache-cli:latest \
|
trufflesuite/ganache-cli:latest \
|
||||||
-m "shrug dwarf easily blade trigger lucky reopen cage lake scatter desk boat" -i 33 -q --db /app/db
|
-m "shrug dwarf easily blade trigger lucky reopen cage lake scatter desk boat" -i 33 -q --db /app/db
|
||||||
|
|
||||||
|
@ -19,91 +27,111 @@ start_blockchains() {
|
||||||
|
|
||||||
docker kill ganache_home > /dev/null 2>&1 || true
|
docker kill ganache_home > /dev/null 2>&1 || true
|
||||||
docker network create blockchain_home > /dev/null 2>&1 || true
|
docker network create blockchain_home > /dev/null 2>&1 || true
|
||||||
docker run -d --network blockchain_home --rm --name ganache_home -v "$home_db_mount_point:/app/db" \
|
docker run -d --network blockchain_home --rm --name ganache_home -v "$HOME_GANACHE_DB:/app/db" \
|
||||||
trufflesuite/ganache-cli:latest \
|
trufflesuite/ganache-cli:latest \
|
||||||
-m "shrug dwarf easily blade trigger lucky reopen cage lake scatter desk boat" -i 44 -q --db /app/db
|
-m "shrug dwarf easily blade trigger lucky reopen cage lake scatter desk boat" -i 44 -q --db /app/db
|
||||||
|
|
||||||
sleep 4
|
sleep 4
|
||||||
}
|
}
|
||||||
|
|
||||||
deploy_all() {
|
deploy_token() {
|
||||||
cd ../src/deploy
|
echo "Compiling and deploying erc20"
|
||||||
|
|
||||||
source .keys
|
echo "Building deploy docker image"
|
||||||
|
docker build -t deploy_test "$DEPLOY_DIR/deploy-test" > /dev/null 2>&1
|
||||||
|
|
||||||
TOKEN_ADDRESS=$(source ./deploy-home/.env; echo "$TOKEN_ADDRESS")
|
echo "Deploying"
|
||||||
|
TOKEN_ADDRESS=$(docker run --network blockchain_home --rm --env-file "$DEPLOY_DIR/deploy-test/.env" -e "PRIVATE_KEY=$PRIVATE_KEY_KOVAN" \
|
||||||
if [[ "$TARGET_NETWORK" == "development" ]] || [[ "$TOKEN_ADDRESS" == "0x" ]]; then
|
deploy_test \
|
||||||
echo "Compiling and deploying erc20"
|
--network "$TARGET_NETWORK" 2>&1 \
|
||||||
|
| grep "contract address" \
|
||||||
cd ./deploy-test
|
| awk '{print $4}')
|
||||||
|
}
|
||||||
echo "Building deploy docker image"
|
|
||||||
docker build -t deploy_test . > /dev/null 2>&1
|
|
||||||
echo "Deploying"
|
|
||||||
TOKEN_ADDRESS=$(docker run --network blockchain_home --rm --env-file .env -e "PRIVATE_KEY=$PRIVATE_KEY_KOVAN" deploy_test --network "$TARGET_NETWORK" 2>&1 \
|
|
||||||
| grep "contract address" \
|
|
||||||
| awk '{print $4}')
|
|
||||||
sed -i 's/TOKEN_ADDRESS=0x$/TOKEN_ADDRESS='"$TOKEN_ADDRESS"'/' ../deploy-home/.env
|
|
||||||
cd ..
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
deploy_bridge() {
|
||||||
echo "Compiling and deploying home part"
|
echo "Compiling and deploying home part"
|
||||||
|
|
||||||
cd ./deploy-home
|
|
||||||
|
|
||||||
echo "Building deploy docker image"
|
echo "Building deploy docker image"
|
||||||
docker build -t deploy_home . > /dev/null 2>&1
|
docker build -t deploy_home "$DEPLOY_DIR/deploy-home" > /dev/null 2>&1
|
||||||
|
|
||||||
echo "Deploying"
|
echo "Deploying"
|
||||||
BRIDGE_ADDRESS=$(docker run --network blockchain_home --rm --env-file .env -e "PRIVATE_KEY=$PRIVATE_KEY_KOVAN" deploy_home --network "$TARGET_NETWORK" 2>&1 \
|
BRIDGE_ADDRESS=$(docker run --network blockchain_home --rm --env-file "$DEPLOY_DIR/deploy-home/.env" -e "PRIVATE_KEY=$PRIVATE_KEY_KOVAN" \
|
||||||
|
deploy_home \
|
||||||
|
--network "$TARGET_NETWORK" 2>&1 \
|
||||||
| grep "contract address" \
|
| grep "contract address" \
|
||||||
| awk '{print $4}')
|
| awk '{print $4}')
|
||||||
|
}
|
||||||
|
|
||||||
|
deploy_db() {
|
||||||
|
|
||||||
echo "Compiling and deploying side part"
|
echo "Compiling and deploying side part"
|
||||||
|
|
||||||
cd ../deploy-side
|
|
||||||
|
|
||||||
echo "Building deploy docker image"
|
echo "Building deploy docker image"
|
||||||
docker build -t deploy_side . > /dev/null 2>&1
|
docker build -t deploy_side "$DEPLOY_DIR/deploy-side" > /dev/null 2>&1
|
||||||
|
|
||||||
echo "Deploying"
|
echo "Deploying"
|
||||||
SHARED_DB_ADDRESS=$(docker run --network blockchain_side --rm --env-file .env -e "PRIVATE_KEY=$PRIVATE_KEY_SOKOL" deploy_side --network "$TARGET_NETWORK" 2>&1 \
|
SHARED_DB_ADDRESS=$(docker run --network blockchain_side --rm --env-file "$DEPLOY_DIR/deploy-side/.env" -e "PRIVATE_KEY=$PRIVATE_KEY_SOKOL" \
|
||||||
|
deploy_side \
|
||||||
|
--network "$TARGET_NETWORK" 2>&1 \
|
||||||
| grep "contract address" \
|
| grep "contract address" \
|
||||||
| awk '{print $4}')
|
| awk '{print $4}')
|
||||||
|
}
|
||||||
|
|
||||||
|
deploy_all() {
|
||||||
|
cd "$DEPLOY_DIR"
|
||||||
|
|
||||||
|
source "$DEPLOY_DIR/.keys"
|
||||||
|
|
||||||
|
TOKEN_ADDRESS=$(source "$DEPLOY_DIR/deploy-home/.env"; echo "$TOKEN_ADDRESS")
|
||||||
|
|
||||||
|
if [[ "$TARGET_NETWORK" == "development" ]] || [[ "$TOKEN_ADDRESS" == "0x" ]]; then
|
||||||
|
deploy_token
|
||||||
|
sed -i 's/TOKEN_ADDRESS=0x$/TOKEN_ADDRESS='"$TOKEN_ADDRESS"'/' "$DEPLOY_DIR/deploy-home/.env"
|
||||||
|
fi
|
||||||
|
|
||||||
|
deploy_bridge
|
||||||
|
deploy_db
|
||||||
|
|
||||||
echo "Token contract address in $TARGET_NETWORK network is $TOKEN_ADDRESS"
|
echo "Token contract address in $TARGET_NETWORK network is $TOKEN_ADDRESS"
|
||||||
echo "Bridge contract address in $TARGET_NETWORK network is $BRIDGE_ADDRESS"
|
echo "Bridge contract address in $TARGET_NETWORK network is $BRIDGE_ADDRESS"
|
||||||
echo "Database contract address in $TARGET_NETWORK side network is $SHARED_DB_ADDRESS"
|
echo "Database contract address in $TARGET_NETWORK side network is $SHARED_DB_ADDRESS"
|
||||||
|
|
||||||
|
echo "Updating deployed contract addresses in demo validators .env.$TARGET_NETWORK configs"
|
||||||
|
for file in "$DEMO_DIR"/validator*/.env."$TARGET_NETWORK"; do
|
||||||
|
sed -i 's/TOKEN_ADDRESS=.*$/TOKEN_ADDRESS='"$TOKEN_ADDRESS"'/' "$file"
|
||||||
|
sed -i 's/BRIDGE_ADDRESS=.*$/BRIDGE_ADDRESS='"$BRIDGE_ADDRESS"'/' "$file"
|
||||||
|
sed -i 's/SHARED_DB_ADDRESS=.*$/SHARED_DB_ADDRESS='"$SHARED_DB_ADDRESS"'/' "$file"
|
||||||
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if [[ "$TARGET_NETWORK" == "development" ]]; then
|
if [[ "$TARGET_NETWORK" == "development" ]]; then
|
||||||
if [[ -z "$(ls -A ganache_side_db)" ]] || [[ -z "$(ls -A ganache_home_db)" ]]; then
|
if [[ ! -d "$SIDE_GANACHE_DB" ]]; then
|
||||||
|
mkdir "$SIDE_GANACHE_DB"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -d "$HOME_GANACHE_DB" ]]; then
|
||||||
|
mkdir "$HOME_GANACHE_DB"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [[ -z "$(ls -A "$SIDE_GANACHE_DB")" ]] || [[ -z "$(ls -A "$HOME_GANACHE_DB")" ]]; then
|
||||||
echo "Starting dev blockchain networks and deploying contracts"
|
echo "Starting dev blockchain networks and deploying contracts"
|
||||||
need_to_deploy=true
|
need_to_deploy=true
|
||||||
else
|
else
|
||||||
echo "Restarting dev blockchain networks"
|
echo "Restarting dev blockchain networks"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
side_db_mount_point="$(pwd)/ganache_side_db"
|
start_dev_blockchain_networks
|
||||||
if [[ ! -d "$side_db_mount_point" ]]; then
|
|
||||||
mkdir "$side_db_mount_point"
|
|
||||||
fi
|
|
||||||
|
|
||||||
home_db_mount_point="$(pwd)/ganache_home_db"
|
|
||||||
if [[ ! -d "$home_db_mount_point" ]]; then
|
|
||||||
mkdir "$home_db_mount_point"
|
|
||||||
fi
|
|
||||||
|
|
||||||
start_blockchains
|
|
||||||
|
|
||||||
if [[ -n "$need_to_deploy" ]]; then
|
if [[ -n "$need_to_deploy" ]]; then
|
||||||
deploy_all
|
deploy_all
|
||||||
|
else
|
||||||
|
echo "Contracts are already deployed, run clean.sh first if you want to redeploy everything"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
echo "Deploying to staging blockchain environment"
|
echo "Deploying to the staging blockchain environment"
|
||||||
|
|
||||||
source ../src/deploy/.keys
|
|
||||||
|
|
||||||
deploy_all
|
deploy_all
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -11,4 +11,7 @@ echo "Starting $NAME"
|
||||||
|
|
||||||
mkdir -p "$NAME"
|
mkdir -p "$NAME"
|
||||||
cd "$NAME"
|
cd "$NAME"
|
||||||
|
if [[ -e .keys ]]; then
|
||||||
|
source .keys
|
||||||
|
fi
|
||||||
docker-compose -p "$NAME" -f ../../src/oracle/docker-compose-test.yml up ${DCU_FLAGS}
|
docker-compose -p "$NAME" -f ../../src/oracle/docker-compose-test.yml up ${DCU_FLAGS}
|
||||||
|
|
|
@ -1,17 +1,8 @@
|
||||||
HOME_RPC_URL=http://ganache_home:8545
|
|
||||||
HOME_CHAIN_ID=44
|
|
||||||
HOME_BRIDGE_ADDRESS=0x44c158FE850821ae69DaF37AADF5c539e9d0025B
|
|
||||||
HOME_TOKEN_ADDRESS=0xd5fE0D28e058D375b0b038fFbB446Da37E85fFdc
|
|
||||||
|
|
||||||
SIDE_RPC_URL=http://ganache_side:8545
|
|
||||||
SIDE_CHAIN_ID=33
|
|
||||||
SIDE_SHARED_DB_ADDRESS=0xd5fE0D28e058D375b0b038fFbB446Da37E85fFdc
|
|
||||||
|
|
||||||
FOREIGN_URL=https://testnet-dex.binance.org/
|
FOREIGN_URL=https://testnet-dex.binance.org/
|
||||||
FOREIGN_CHAIN_ID=Binance-Chain-Nile
|
FOREIGN_CHAIN_ID=Binance-Chain-Nile
|
||||||
FOREIGN_ASSET=KFT-94F
|
FOREIGN_ASSET=KFT-94F
|
||||||
|
|
||||||
VALIDATOR_PRIVATE_KEY=2be3f252e16541bf1bb2d4a517d2bf173e6d09f2d765d32c64dc50515aec63ea
|
#VALIDATOR_PRIVATE_KEY is taken from .keys
|
||||||
|
|
||||||
VOTES_PROXY_PORT=5001
|
VOTES_PROXY_PORT=5001
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
HOME_RPC_URL=http://ganache_home:8545
|
||||||
|
HOME_CHAIN_ID=44
|
||||||
|
HOME_BRIDGE_ADDRESS=0x44c158FE850821ae69DaF37AADF5c539e9d0025B
|
||||||
|
HOME_TOKEN_ADDRESS=0xd5fE0D28e058D375b0b038fFbB446Da37E85fFdc
|
||||||
|
|
||||||
|
SIDE_RPC_URL=http://ganache_side:8545
|
||||||
|
SIDE_CHAIN_ID=33
|
||||||
|
SIDE_SHARED_DB_ADDRESS=0xd5fE0D28e058D375b0b038fFbB446Da37E85fFdc
|
|
@ -0,0 +1,8 @@
|
||||||
|
HOME_RPC_URL=https://kovan.infura.io/v3/5d7bd94c50ed43fab1cb8e74f58678b0
|
||||||
|
HOME_CHAIN_ID=42
|
||||||
|
HOME_BRIDGE_ADDRESS=0x646D46A206c5bb38E925C9Ef148383f317F29466
|
||||||
|
HOME_TOKEN_ADDRESS=0xFe175c723ca2CB997D0EC000309e2da69B173381
|
||||||
|
|
||||||
|
SIDE_RPC_URL=https://sokol.poa.network
|
||||||
|
SIDE_CHAIN_ID=77
|
||||||
|
SIDE_SHARED_DB_ADDRESS=0x6FA32e5fC249476E46D695722eAd9E82F4B316f6
|
|
@ -1,17 +1,8 @@
|
||||||
HOME_RPC_URL=http://ganache_home:8545
|
|
||||||
HOME_CHAIN_ID=44
|
|
||||||
HOME_BRIDGE_ADDRESS=0x44c158FE850821ae69DaF37AADF5c539e9d0025B
|
|
||||||
HOME_TOKEN_ADDRESS=0xd5fE0D28e058D375b0b038fFbB446Da37E85fFdc
|
|
||||||
|
|
||||||
SIDE_RPC_URL=http://ganache_side:8545
|
|
||||||
SIDE_CHAIN_ID=33
|
|
||||||
SIDE_SHARED_DB_ADDRESS=0xd5fE0D28e058D375b0b038fFbB446Da37E85fFdc
|
|
||||||
|
|
||||||
FOREIGN_URL=https://testnet-dex.binance.org/
|
FOREIGN_URL=https://testnet-dex.binance.org/
|
||||||
FOREIGN_CHAIN_ID=Binance-Chain-Nile
|
FOREIGN_CHAIN_ID=Binance-Chain-Nile
|
||||||
FOREIGN_ASSET=KFT-94F
|
FOREIGN_ASSET=KFT-94F
|
||||||
|
|
||||||
VALIDATOR_PRIVATE_KEY=e59d58c77b791f98f10187117374ae9c589d48a62720ec6a5e142b0cc134f685
|
#VALIDATOR_PRIVATE_KEY is taken from .keys
|
||||||
|
|
||||||
VOTES_PROXY_PORT=5002
|
VOTES_PROXY_PORT=5002
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
HOME_RPC_URL=http://ganache_home:8545
|
||||||
|
HOME_CHAIN_ID=44
|
||||||
|
HOME_BRIDGE_ADDRESS=0x44c158FE850821ae69DaF37AADF5c539e9d0025B
|
||||||
|
HOME_TOKEN_ADDRESS=0xd5fE0D28e058D375b0b038fFbB446Da37E85fFdc
|
||||||
|
|
||||||
|
SIDE_RPC_URL=http://ganache_side:8545
|
||||||
|
SIDE_CHAIN_ID=33
|
||||||
|
SIDE_SHARED_DB_ADDRESS=0xd5fE0D28e058D375b0b038fFbB446Da37E85fFdc
|
|
@ -0,0 +1,8 @@
|
||||||
|
HOME_RPC_URL=https://kovan.infura.io/v3/5d7bd94c50ed43fab1cb8e74f58678b0
|
||||||
|
HOME_CHAIN_ID=42
|
||||||
|
HOME_BRIDGE_ADDRESS=0x646D46A206c5bb38E925C9Ef148383f317F29466
|
||||||
|
HOME_TOKEN_ADDRESS=0xFe175c723ca2CB997D0EC000309e2da69B173381
|
||||||
|
|
||||||
|
SIDE_RPC_URL=https://sokol.poa.network
|
||||||
|
SIDE_CHAIN_ID=77
|
||||||
|
SIDE_SHARED_DB_ADDRESS=0x6FA32e5fC249476E46D695722eAd9E82F4B316f6
|
|
@ -1,17 +1,8 @@
|
||||||
HOME_RPC_URL=http://ganache_home:8545
|
|
||||||
HOME_CHAIN_ID=44
|
|
||||||
HOME_BRIDGE_ADDRESS=0x44c158FE850821ae69DaF37AADF5c539e9d0025B
|
|
||||||
HOME_TOKEN_ADDRESS=0xd5fE0D28e058D375b0b038fFbB446Da37E85fFdc
|
|
||||||
|
|
||||||
SIDE_RPC_URL=http://ganache_side:8545
|
|
||||||
SIDE_CHAIN_ID=33
|
|
||||||
SIDE_SHARED_DB_ADDRESS=0xd5fE0D28e058D375b0b038fFbB446Da37E85fFdc
|
|
||||||
|
|
||||||
FOREIGN_URL=https://testnet-dex.binance.org/
|
FOREIGN_URL=https://testnet-dex.binance.org/
|
||||||
FOREIGN_CHAIN_ID=Binance-Chain-Nile
|
FOREIGN_CHAIN_ID=Binance-Chain-Nile
|
||||||
FOREIGN_ASSET=KFT-94F
|
FOREIGN_ASSET=KFT-94F
|
||||||
|
|
||||||
VALIDATOR_PRIVATE_KEY=afaa4d4d6e54d25b0bf0361e3fd6cef562f6311bf6200de2dd0aa4cab63ae3b5
|
#VALIDATOR_PRIVATE_KEY is taken from .keys
|
||||||
|
|
||||||
VOTES_PROXY_PORT=5003
|
VOTES_PROXY_PORT=5003
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
HOME_RPC_URL=http://ganache_home:8545
|
||||||
|
HOME_CHAIN_ID=44
|
||||||
|
HOME_BRIDGE_ADDRESS=0x44c158FE850821ae69DaF37AADF5c539e9d0025B
|
||||||
|
HOME_TOKEN_ADDRESS=0xd5fE0D28e058D375b0b038fFbB446Da37E85fFdc
|
||||||
|
|
||||||
|
SIDE_RPC_URL=http://ganache_side:8545
|
||||||
|
SIDE_CHAIN_ID=33
|
||||||
|
SIDE_SHARED_DB_ADDRESS=0xd5fE0D28e058D375b0b038fFbB446Da37E85fFdc
|
|
@ -0,0 +1,8 @@
|
||||||
|
HOME_RPC_URL=https://kovan.infura.io/v3/5d7bd94c50ed43fab1cb8e74f58678b0
|
||||||
|
HOME_CHAIN_ID=42
|
||||||
|
HOME_BRIDGE_ADDRESS=0x646D46A206c5bb38E925C9Ef148383f317F29466
|
||||||
|
HOME_TOKEN_ADDRESS=0xFe175c723ca2CB997D0EC000309e2da69B173381
|
||||||
|
|
||||||
|
SIDE_RPC_URL=https://sokol.poa.network
|
||||||
|
SIDE_CHAIN_ID=77
|
||||||
|
SIDE_SHARED_DB_ADDRESS=0x6FA32e5fC249476E46D695722eAd9E82F4B316f6
|
|
@ -4,8 +4,9 @@ RPC_URL_DEV=http://ganache_home:8545
|
||||||
#PRIVATE_KEY is taken from PRIVATE_KEY_KOVAN in src/deploy/.keys
|
#PRIVATE_KEY is taken from PRIVATE_KEY_KOVAN in src/deploy/.keys
|
||||||
PRIVATE_KEY_DEV=e2aeb24eaa63102d0c0821717c3b6384abdabd7af2ad4ec8e650dce300798b27
|
PRIVATE_KEY_DEV=e2aeb24eaa63102d0c0821717c3b6384abdabd7af2ad4ec8e650dce300798b27
|
||||||
|
|
||||||
#Set to empty address '0x' for redeployment of token contract in staging environment
|
#Set to '0x' for redeployment of token contract in staging environment
|
||||||
TOKEN_ADDRESS=0xBAD4DD5dA696b1B59932a33c33737ea63438536F
|
TOKEN_ADDRESS=0xFe175c723ca2CB997D0EC000309e2da69B173381
|
||||||
|
|
||||||
TOKEN_ADDRESS_DEV=0xd5fE0D28e058D375b0b038fFbB446Da37E85fFdc
|
TOKEN_ADDRESS_DEV=0xd5fE0D28e058D375b0b038fFbB446Da37E85fFdc
|
||||||
|
|
||||||
VALIDATOR_ADDRESS_1=0x99Eb3D86663c6Db090eFFdBC20510Ca9f836DCE3
|
VALIDATOR_ADDRESS_1=0x99Eb3D86663c6Db090eFFdBC20510Ca9f836DCE3
|
||||||
|
|
Loading…
Reference in New Issue