Commit f68153bd authored by Mark Beierl's avatar Mark Beierl
Browse files

Initial load


Signed-off-by: Mark Beierl's avatarMark Beierl <mark.beierl@canonical.com>
parent facdb3f8
Pipeline #7362 failed with stage
in 1 minute and 36 seconds
## Setting up Participant VMs
First, check the common-vars for the following:
```
APT_PROXY=http://172.21.1.1:3142
FLAVOR=m1.xlarge
PROJECT=f15ab4f845dc4052811fce96a3676ac8
SUBNET=172.21.248
```
APT_PROXY: the address of a caching web proxy for installing packages
FLAVOR: the flavour of the new VM to launch. Must have at least 4 CPUs, 8 GB RAM and 60 GB Disk.
PROJECT: The project ID in which to launch the new VM
SUBNET: the first three octets of the subnet to use. IP addresses will be allocated from this subnet, starting with .101 - .199
### Creating ports
This script will create the ports in Openstack on the subnet specified
```
./create-osm-vm-ports.sh
```
### Launching VM
This script will launch all the OSM VMs in a loop
```
./create-osm-vm-servers.sh
```
### Initial Configuration
This script updates apt, upgrades the system to the latest 20.04 and installs remote desktop software
```
./run-vm-setup.sh
```
### Install OSM
This script downloads the installer and runs it. It also sets the OSM admin password to `hackfest`.
```
./run-install-osm.sh
```
### Add VIM and K8s Cluster
```
./run-osm-vim-k8scluster-add.sh
```
#OpenStack Credentials
export OS_AUTH_URL=http://172.21.247.1:5000/v3
export OS_PROJECT_NAME=hackfest
export OS_USER_DOMAIN_NAME='Default'
export OS_PROJECT_DOMAIN_ID='default'
export OS_USERNAME=hackfest
export OS_PASSWORD=`cat admin.password`
export OS_REGION_NAME='RegionOne'
export OS_INTERFACE=public
export OS_IDENTITY_API_VERSION=3
START=1
MAX=1
if [ ! -z $2 ] ; then
START=$1
MAX=$2
elif [ ! -z $1 ] ; then
MAX=$1
fi
# ETSI VIM ADMIN_DOMAIN=default, Partner Cloud=admin_domain
ADMIN_DOMAIN=default
APT_PROXY=http://172.21.1.1:3142
FLAVOR=m1.xlarge
KEY_NAME=mbeierl
NETWORK=osm-ext
SUBNET=172.21.248
#!/bin/bash
. ./common-vars
. ./admin-credentials.rc
for PARTICIPANT in `seq ${START} ${MAX}` ; do
OPENSTACK_USER=hackfest-${PARTICIPANT}
PROJECT=hackfest-${PARTICIPANT}
PASSWORD=hackfest
echo "Creating OpenStack project: $PROJECT"
openstack project create --domain ${ADMIN_DOMAIN} $PROJECT
PROJECT_ID=`openstack project list | grep $PROJECT | awk '{print $2}'`
openstack quota set --cores 64 --ram 131072 $PROJECT_ID
echo "Creating OpenStack User"
openstack user create --domain ${ADMIN_DOMAIN} --password $PASSWORD $OPENSTACK_USER
openstack role add --user $OPENSTACK_USER --project $PROJECT member
echo "Creating OpenStack Network RBAC policy access_as_external, for network $NETWORK and project $PROJECT"
openstack network rbac create \
--target-project $PROJECT \
--type network \
--action access_as_external \
$NETWORK
echo "Creating OpenStack Network RBAC policy access_as_shared, for network $NETWORK and project $PROJECT"
openstack network rbac create \
--target-project $PROJECT \
--type network \
--action access_as_shared \
$NETWORK
echo "Adding security groups"
for i in $(openstack --os-username=$OPENSTACK_USER --os-password=$PASSWORD --os-project-id=$PROJECT_ID security group list | awk '/default/{ print $2 }'); do
openstack --os-username=$OPENSTACK_USER --os-password=$PASSWORD --os-project-id=$PROJECT_ID security group rule create $i --protocol icmp --remote-ip 0.0.0.0/0
openstack --os-username=$OPENSTACK_USER --os-password=$PASSWORD --os-project-id=$PROJECT_ID security group rule create $i --protocol udp --remote-ip 0.0.0.0/0
openstack --os-username=$OPENSTACK_USER --os-password=$PASSWORD --os-project-id=$PROJECT_ID security group rule create $i --protocol tcp --remote-ip 0.0.0.0/0
done
done
\ No newline at end of file
#!/bin/bash
. ./common-vars $@
. ./admin-credentials.rc
for PARTICIPANT in `seq ${START} ${MAX}` ; do
IP=`expr ${PARTICIPANT} + 100`
PROJECT="hackfest-${PARTICIPANT}"
openstack port create --fixed-ip ip-address=${SUBNET}.${IP} --project=${PROJECT} --enable --network osm-ext hackfest-osm-${PARTICIPANT}
done
#!/bin/bash
. ./common-vars $@
. ./admin-credentials.rc
for PARTICIPANT in `seq ${START} ${MAX}` ; do
openstack server create --key-name ${KEY_NAME} --flavor ${FLAVOR} --image ubuntu20.04 --nic port-id=hackfest-osm-${PARTICIPANT} osm-${PARTICIPANT}
done
#!/bin/bash
. ./common-vars
. ./admin-credentials.rc
for PARTICIPANT in `seq ${START} ${MAX}` ; do
OPENSTACK_USER=hackfest-$1
PROJECT=$OPENSTACK_USER
echo Cleaning up ${OPENSTACK_USER}
PROJECT_ID=`openstack project list | grep $PROJECT | awk '{print $2}'`
if [ "${PROJECT_ID}" != "" ]; then
for RBAC in `openstack network rbac list -f value -c ID`; do
openstack network rbac show $RBAC -f value | grep $PROJECT_ID 2> /dev/null
if [ $? -eq 0 ] ; then
echo "Deleting RBAC policy $RBAC"
openstack network rbac delete $RBAC
fi
done
fi
echo "Deleting OpenStack project: $PROJECT"
openstack project delete --domain ${ADMIN_DOMAIN} $PROJECT
echo "Deleting OpenStack User: $OPENSTACK_USER"
openstack user delete --domain ${ADMIN_DOMAIN} $OPENSTACK_USER
done
\ No newline at end of file
#OpenStack Credentials
export OS_AUTH_URL=http://172.21.247.1:5000/v3
export OS_PROJECT_NAME=hackfest
export OS_USER_DOMAIN_NAME='Default'
export OS_PROJECT_DOMAIN_ID='default'
export OS_USERNAME=hackfest
export OS_PASSWORD=hackfest
export OS_REGION_NAME='RegionOne'
export OS_INTERFACE=public
export OS_IDENTITY_API_VERSION=3
#!/bin/bash
. ./common-vars $@
for PARTICIPANT in `seq ${START} ${MAX}` ; do
IP=`expr ${PARTICIPANT} + 100`
scp ./vm-install-osm.sh ubuntu@${SUBNET}.${IP}: &
done
wait
for PARTICIPANT in `seq ${START} ${MAX}` ; do
IP=`expr ${PARTICIPANT} + 100`
xterm -hold -e ssh ubuntu@${SUBNET}.${IP} ./vm-install-osm.sh &
done
#!/bin/bash -x
. ./common-vars $@
. ./hackfest-credentials.rc
for PARTICIPANT in `seq ${START} ${MAX}` ; do
IP=`expr ${PARTICIPANT} + 100`
OS_USERNAME=hackfest-${PARTICIPANT}
OS_PASSWORD=hackfest
OS_PROJECT_NAME=hackfest-${PARTICIPANT}
cat << EOF > ${OS_USERNAME}.rc
export OS_AUTH_URL=${OS_AUTH_URL}
export OS_PROJECT_NAME=${OS_PROJECT_NAME}
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_ID=default
export OS_USERNAME=${OS_USERNAME}
export OS_PASSWORD=hackfest
export OS_REGION_NAME='RegionOne'
export OS_INTERFACE=public
export OS_IDENTITY_API_VERSION=3
EOF
scp ${OS_USERNAME}.rc ubuntu@${SUBNET}.${IP}:
ssh ubuntu@${SUBNET}.${IP} ". .profile;echo osm vim-create --name openstack --user ${OS_USERNAME} --password ${OS_PASSWORD} --auth_url ${OS_AUTH_URL} --tenant ${OS_PROJECT_NAME} --account_type openstack --config=\"{ management_network_name: osm-ext, security_groups: default, insecure: true, project_domain_name:${OS_PROJECT_DOMAIN_ID}, user_domain_name: ${OS_USER_DOMAIN_NAME} }\""
scp whitemist.yaml ubuntu@${SUBNET}.${IP}:
ssh ubuntu@${SUBNET}.${IP} '. .profile;osm k8scluster-add --creds whitemist.yaml --vim openstack --k8s-nets "{"net1": "osm-ext"}" --version 1.20 --namespace test --description "k8s cluster" whitemist'
done
#!/bin/bash
. ./common-vars $@
for PARTICIPANT in `seq ${START} ${MAX}` ; do
IP=`expr ${PARTICIPANT} + 100`
scp vm-initial-setup.sh ubuntu@${SUBNET}.${IP}: &
done
wait
for PARTICIPANT in `seq ${START} ${MAX}` ; do
IP=`expr ${PARTICIPANT} + 100`
ssh ubuntu@${SUBNET}.${IP} ./vm-initial-setup.sh &
done
wait
\ No newline at end of file
#!/bin/bash
sudo sed -i "s/127.0.0.1 /127.0.0.1 $HOSTNAME /" /etc/hosts
echo 'ubuntu:hackfest'| sudo chpasswd
sudo sed -i "s/^PasswordAuthentication.*/PasswordAuthentication yes/" /etc/ssh/sshd_config
sudo service ssh restart
echo "Acquire::http::Proxy \"http://172.21.1.1:3142\";" | sudo tee /etc/apt/apt.conf.d/proxy.conf
echo "Acquire::https::Proxy \"http://172.21.1.1:3142\";" | sudo tee -a /etc/apt/apt.conf.d/proxy.conf
sudo apt update
sudo apt full-upgrade -y
sudo apt install -y gnome-session xrdp
sudo snap install code --classic
sudo snap install firefox openstackclients
# Update so buttons show up
gsettings set org.gnome.desktop.wm.preferences button-layout :minimize,maximize,close
gsettings set org.gnome.desktop.interface enable-animations false
# Prevent VM from going to sleep
sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
cat << EOF | sudo tee /etc/polkit-1/localauthority/50-local.d/color.pkla
[Allow colord for all users]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile
ResultAny=yes
ResultInactive=yes
ResultActive=yes
EOF
\ No newline at end of file
#!/bin/bash
sudo snap install microk8s --classic --channel=1.23/stable
sudo mkdir -p /var/snap/microk8s/current/args/certs.d/docker.io
cat << EOF | sudo tee /var/snap/microk8s/current/args/certs.d/docker.io/hosts.toml
server = "http://172.21.1.1:5000"
[host."http://172.21.1.1:5000"]
capabilities = ["pull", "resolve"]
skip_verify = true
plain-http = true
EOF
sudo systemctl restart snap.microk8s.daemon-containerd.service
sudo microk8s.enable storage
#sudo microk8s enable dns:8.8.8.8
sudo snap alias microk8s.kubectl kubectl
wget https://osm-download.etsi.org/ftp/osm-12.0-twelve/install_osm.sh
chmod +x ./install_osm.sh
./install_osm.sh -y --charmed --tag testing-daily 2>&1 | tee install_osm.log
# Set our environment to talk to the new OSM
$(grep "export OSM_PASSWORD" install_osm.log|head -1)
$(grep "export OSM_HOSTNAME" install_osm.log|head -1)
# Change the password
osm user-update admin --password hackfest
sudo sed -i "s/127.0.0.1 /127.0.0.1 nbi.osm ui.osm grafana.osm prometheus.osm /" /etc/hosts
juju config -m osm nbi site_url=https://nbi.osm
juju config -m osm ng-ui site_url=https://ui.osm
juju config -m osm grafana site_url=https://grafana.osm
juju config -m osm prometheus site_url=https://prometheus.osm
echo "export OSM_HOSTNAME=nbi.osm:443" >> .bashrc
echo "export OSM_HOSTNAME=nbi.osm:443" >> .profile
echo "export OSM_PASSWORD=hackfest" >> .bashrc
echo "export OSM_PASSWORD=hackfest" >> .profile
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeU1EY3dOekl5TlRrMU9Gb1hEVE15TURjd05ESXlOVGsxT0Zvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTFVDCjdXUkFZTU90SmJ1U1loQ2FrVDZ3VUdKZEtZdUdRb29xd3F5WStnRW8yU1RnZEhPZEdpZzVJMjF3cG9tdFV1V2sKREhmZUJHMHIvRGkvUHdML3VEb0tqUFVvdU5JdTBYc1FTYXIrOGNMTkdWSDczSnBJcWRaZDVEREthdWFacU9ONQovdlJjdVBiWHdLNldkRmdldDB3RWQycVlKQytmNk9Dcm5oUnlSOGJvWVdxZ2kvNzhNSHFwMERNQ0I4TDFHRHVmCjdJVEFodUtBaUM1a2llQ1NzY1cwT0NVdTZPazdCVTZVc3dhd2phRVlWbUVkS0Flb0o2UWNGTHBnWkFvdDA2aFIKYlRqTmNkLzdLRDNCZVJWc3QycGZqL2lQdlVXaDBiR1VWREZDRXV1UC9VTUNRdHZ6SWVIUEhZamtjNkZYSldWSwpyZGk5bGNuV1FRSlVJVENLcFlzQ0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZQMGRZVzdhVVlMZ0dpNk53aW1iV3llUWh0bjZNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBQVBoNGhOUGlPUlZVZXQzRXgwTgpHekNUM1Q1OUtzMHFaa0JUMnpkM29qc0tsUS9LTS85TzJEa2YzdElnbkV6ZWlIdlMzUExTaTZkaDhISzE3MlNQCnMyUy95bW5nTWZMMlkyYU85ZTA2L3B1NEFvUG56c2ZSOFhzNnVXc2N5UkdVbXNMcjR5eVBFaythL0F4OXcxS2MKeHFQZDB2bXo4OVZMVHFHb2hjZVJKcmVkMU1RcnNnMnMzR1pzRDU4MVRpVlI0bGQ3VlpNSnpGM01Wa3hOazNnagp6dm5SQU01MHhPdmx1ek9ZVHo5aEthRjk0QTVta2pzck02ZStmdHN0dEpzQWduWnpIVHlaUFFkYW9TTE9YeWx6CnY2VGhrYjZvLzFXWjVTQjMrcCttRlJYYmN4UC9tS04zNktiem5UOWJpVlJTRkVXcWswTmdHdUZiNDBvNkJLM3gKckFRPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
server: https://172.21.248.125:6443
name: cluster.local
contexts:
- context:
cluster: cluster.local
user: kubernetes-admin
name: kubernetes-admin@cluster.local
current-context: kubernetes-admin@cluster.local
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJVENDQWdtZ0F3SUJBZ0lJSkFwcnBoNU9PUjB3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TWpBM01EY3lNalU1TlRoYUZ3MHlNekEzTURjeU16QXdNREJhTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXhqWW0wUUlYL1NsbENlVjgKb042Yy9YWmJjZ3crNENTYk9UTU9qYjNQeGJsRmVGbDlxeTZGQVVheVlxb3BjTjc0d2h1WlEvMlZ2OTAvcWs5VAo0aFVWdytFdjNmWkhsc3E0cnJWZDVBK0FINTBscVYvVm10VDV5dWJYMURjSFhVdDU5c3dtc1c2aWxRVDNvbG1uClJuaEpOS2ZvajRqUEw2Z1JrL01FL3Q5VHVpamtPdHBIaWd2VW1aTWpWQkMwb2NRajlQekRJcnZSUUpkSnNIdzAKZ1lJNUZldXlkY3BoeENSc3NQdE00MnBDMjZjQkZIdWpzTzUwZE1ETDRIZUV4ZGhTYUxOZDJRbWxSQy84NGNnegpvbk43b1ZmR0VqL0FVSFFCa3RtZ2RiSU9sd0JaZjVXUzVZeThGcCtGNEZQZG1EYlpmZ3dZeUNZZnNNOEZTb2xwClA0TU84d0lEQVFBQm8xWXdWREFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RBWURWUjBUQVFIL0JBSXdBREFmQmdOVkhTTUVHREFXZ0JUOUhXRnUybEdDNEJvdWpjSXBtMXNua0liWgorakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBbVRURk5mK0prbG4wRHZRVW9ZYTlsUFZTRCs4VkI2WkJ6bVd0Ci9ialEyZ3hmTHErc0o3aHNabm04b2s4UGRGVWwwa1RsQlRiWldxTmhuZkVmUWcyZUZxNHYvNmhXMWNnbUxBOVQKV0hmU2Vwclg4VDBDVmRSUFA2MHo1L2ZJYWlGeXBwR2pXZWVUSDBWZkQ2RmRsSzNkVSs1VjFpVThnbVU0SXB6RQpLL0ExNEEzSGRROVM4bTgwQzBCek14ZTEyQWtWZlNDWkNVcHJjVU1QalZlcDRYY2tZcHkzTXN3cjFpaU9aZ1lHCm5RL3NIZTN6T2hURFppSEZBSFREL3k2RW8xbzk5bHJTcmNSWFEvK1I1YVQ1aG9xYkt0ZitiMjd2c1lMRTlPd1AKZ3BZT3ZFeXhtL05GNjR4WDFqZVoyeGdMZDBzV1BmdVM0cHdXbDczY250TlNveE5iSHc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBeGpZbTBRSVgvU2xsQ2VWOG9ONmMvWFpiY2d3KzRDU2JPVE1PamIzUHhibEZlRmw5CnF5NkZBVWF5WXFvcGNONzR3aHVaUS8yVnY5MC9xazlUNGhVVncrRXYzZlpIbHNxNHJyVmQ1QStBSDUwbHFWL1YKbXRUNXl1YlgxRGNIWFV0NTlzd21zVzZpbFFUM29sbW5SbmhKTktmb2o0alBMNmdSay9NRS90OVR1aWprT3RwSAppZ3ZVbVpNalZCQzBvY1FqOVB6RElydlJRSmRKc0h3MGdZSTVGZXV5ZGNwaHhDUnNzUHRNNDJwQzI2Y0JGSHVqCnNPNTBkTURMNEhlRXhkaFNhTE5kMlFtbFJDLzg0Y2d6b25ON29WZkdFai9BVUhRQmt0bWdkYklPbHdCWmY1V1MKNVl5OEZwK0Y0RlBkbURiWmZnd1l5Q1lmc004RlNvbHBQNE1POHdJREFRQUJBb0lCQVFDSXY4MlIvNjdMUStibwpxQUtPL21jelc1Z0ZuRHM0NnlpSWt4Z2taR05YbDlZOURRanR0RitoSE1SdjI5UlJnaFAvMzRpalp1NE0vRGt6CmFCMklhbUdremRUM2Z6V3U3RmYwZVQ2NDNKVFp1dExFQTFGY3pEazJhb05YYjB2T2F3ZFBaVlFBc0VMTkt5c3EKUUU1dkNRZ0FveU9JKzZ0dHhyZXg2a1YxRG1FMm1rM1BOZkNtQ3FybVhoSGorZHJQZlhGZElnM0VLVFFwWW43bApSQ1VzM09lZXowZkt5T1lsYmw3U3ZBeHNvN1J2UVFHYmcvQTNFZzkwb1hSY0Rxd3NxK3p4VkF6WlRJcWtIREYxCmkrbnVqTEFHV1lLQ0huK2xyUW8xUnFRcmJYS1hQdFBPTVlUOWVzeWNmMkhYaEQ1aCtSMEZXRHdPVUJkVndyUnEKU0ZmZllCSXBBb0dCQU05Wkc3SW5iVmpCeWxqNWVGczZrZzRwMTVjOS92bmZtZjhydEVkY3JVQk42MVAyc3pHVwpLeUpOM0hNQXI5ZUxvU1ZhbldMaXZEQmVxQ1VDOVE1ZTByME5JRGlEOXpsSjIwcm1vOWh1aFpRSEZ0a1c5aGZDCmlYblNQSEtHTUk1SGpiQ2xzaTlabklwMmlKR0IvSXVpQit2OFE3eUQyZUNiUm1SdUE1RjUyUzNYQW9HQkFQUzQKTzdqbTdGRS9xdnd0aEZwUzlBRUFBSE1JaFVrWlpiMDB5bEFwNlA2M2F5R0krbGR1Wlp5RjIwc004cUtaeFlCQQpIT2lZRG1tSG9NTXdSTDNURnJma3U1d253NE5hRmJROTE0NXZKMy9UbG9pVG9BYUJnMGdiRzZVNEFnTjFEU3U4ClY4b2ZSWlJhMUJTbkkvazQ4ZVNucUs0Zlh0ajVSUU9CK0FCcUZXeEZBb0dBUUhBUjRtRE1ZNnYrQlg2cC83Z0oKRWV2QSsxaWg5K2VjaFNlQTVEaVNBd3owR0dqdnNYWll1MVYxTUN4RGVYb0VQNGFVcU5tTDRJQmFRdjVUUi84QwpBUXltT2NvUk43V1RPQWpMWElTa2NLZHZXMUgrY3MzYlNZZWpqM2ZTZVRVVmZKTlI5OU1paWdsaVVjNFN2UlpDCjNmek0xRFlwck5xMG1wdHg4bkRxcElzQ2dZQmZLcDRmQTc1MndqbXVJODFLaXVQVTE3bFZBc1ZDYmh3QWZsMEcKMjZWK0dMb1Nxb0FnTEJCYjFEbzViMm1VRGhTZUVWQ3NxeVUvcUx5OTZ6RndXSHlIT3U0eWhjd2tjbzNxTC9wNQpxNFJDMDNmQTJSZnNMOFZyN3c3TEs0S3M4WUlUdGdTMTEzOXBlQUR0bnlvQUswTDJWclRrTWRMaXNkMUN4Zkk1Cnh3ZFp1UUtCZ1FES1dNS1lwcVBHUjlVY2ZiSDVMdHpzcVBHQW1GeDZZVHV1RW94RHFZTDcvVkZ2ZDB3WkFrNlUKUDQ2UzVBUHFMckF0Z1lRcEo1a3NlZjJGSy9QMDhKMUlRYW4rN2tIdnNSMHpBSEtSYW9NdUVPbDdVVTlpQWcwbwp2a1FUd1RjVFNjV2hMdDlta21SOFByWHVLNEtZZ2lnSEg1aXlrUTRwN2dRZ0llVUkxeG50aXc9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment