Configure samba and fix backup for snunmu (#41)

pull/42/head
Cian Hatton 3 years ago committed by GitHub
parent 40bb83fa65
commit 8a12b50a42
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1,3 +1,4 @@
skip_list: skip_list:
- '403' # allow for latest packages - '403' # allow for latest packages
- name[casing] - name[casing]
- yaml[indentation]

@ -39,4 +39,3 @@ jobs:
run: make deps run: make deps
- name: Format code - name: Format code
run: make format run: make format

@ -36,11 +36,17 @@ lint-all:
make lint dir=playbooks make lint dir=playbooks
lint: lint:
ansible-lint $(dir) --exclude "roles/sprat.*" --exclude roles/docker_restore_container --exclude "roles/geerlingguy.*" ansible-lint $(dir) --exclude "roles/sprat.*" --exclude roles/docker_restore_container --exclude "roles/geerlingguy.*" --exclude collections --exclude .github
backup: deps backup: deps
ansible-playbook playbooks/backup-docker-volumes.yml ansible-playbook playbooks/backup-docker-volumes.yml
backup-snunmu: deps
ansible-playbook playbooks/backup-docker-volumes.yml --limit snunmu
backup-qnap: deps
ansible-playbook playbooks/backup-docker-volumes.yml --limit qnap
restore: deps restore: deps
ansible-playbook playbooks/restore-docker-volumes.yml -e volume_name="$(volume_name)" --limit "$(host)" ansible-playbook playbooks/restore-docker-volumes.yml -e volume_name="$(volume_name)" --limit "$(host)"

@ -137,7 +137,7 @@
"name": "roles/docker_s3_backup/tasks/main.yml", "name": "roles/docker_s3_backup/tasks/main.yml",
"ftype": "file", "ftype": "file",
"chksum_type": "sha256", "chksum_type": "sha256",
"chksum_sha256": "0fcf1fbf3fafdaf129a33876344c1ea07d54ca562c253cc81c5eebc806ff51a9", "chksum_sha256": "68b33673f05e9291aa60766650d4ccbc4b80e5d44ba1b7d33da954f43d53ca64",
"format": 1 "format": 1
}, },
{ {
@ -200,7 +200,7 @@
"name": "roles/docker_s3_volume_restore/tasks/main.yml", "name": "roles/docker_s3_volume_restore/tasks/main.yml",
"ftype": "file", "ftype": "file",
"chksum_type": "sha256", "chksum_type": "sha256",
"chksum_sha256": "476842dfde43303d0a1899e9c53e9eb7e05626860531436f198baa900f11aef1", "chksum_sha256": "29cff4c5cdb9763c78e02886de3695e4e311c57153a28f3623b9c99fd0038846",
"format": 1 "format": 1
}, },
{ {

@ -23,7 +23,7 @@
"name": "FILES.json", "name": "FILES.json",
"ftype": "file", "ftype": "file",
"chksum_type": "sha256", "chksum_type": "sha256",
"chksum_sha256": "d430b04ca511676cafb9644eb216080037b0ba3d56bed40d4e48f3fe3283000f", "chksum_sha256": "826fa17a526c6aee0a3902560d70a21191cd31c771e120c376ad4fdb714ab618",
"format": 1 "format": 1
}, },
"format": 1 "format": 1

@ -29,7 +29,7 @@
name: "backup-container-{{ item.Name }}-{{ 10 | random }}" name: "backup-container-{{ item.Name }}-{{ 10 | random }}"
image: ubuntu image: ubuntu
command: "tar -czvf /backups/{{ item.Name }}-{{ backup_time }}.tar.gz /data" command: "tar -czvf /backups/{{ item.Name }}-{{ backup_time }}.tar.gz /data"
auto_remove: true cleanup: true
detach: false # block until this container exists. detach: false # block until this container exists.
state: started state: started
volumes: volumes:

@ -73,7 +73,7 @@
name: "restore-container-{{ docker_backup_s3_volume.name }}-{{ 100 | random }}" name: "restore-container-{{ docker_backup_s3_volume.name }}-{{ 100 | random }}"
image: ubuntu image: ubuntu
command: "rm -rf ./*" command: "rm -rf ./*"
auto_remove: true cleanup: true
detach: false # block until this container exists. detach: false # block until this container exists.
state: started state: started
# start inside the directory we want to wipe # start inside the directory we want to wipe
@ -90,7 +90,7 @@
image: ubuntu image: ubuntu
# extract the tar into the volume. # extract the tar into the volume.
command: "tar xvf /tmp/{{ container_s3_key }} -C /data --strip-components 1" command: "tar xvf /tmp/{{ container_s3_key }} -C /data --strip-components 1"
auto_remove: true cleanup: true
detach: false # block until this container exists. detach: false # block until this container exists.
state: started state: started
volumes: volumes:

@ -12,12 +12,6 @@ users:
group: *main_user group: *main_user
passwordless_sudo: true passwordless_sudo: true
shares:
- /share
- /share/public_files
- /share/private_files
- /share/cian_files
directories: directories:
# path on qnap where downloads go # path on qnap where downloads go
downloads_dir: /mnt/ssd0/downloads downloads_dir: /mnt/ssd0/downloads

@ -12,6 +12,7 @@ mounts:
cron_hour: "5" cron_hour: "5"
docker_backup_host_backup_directory: "/mnt/mergerfs/backups"
devices: devices:
- uuid: a54c1bde-1400-4975-bf24-08c603ca3a11 # /dev/sdc1 - uuid: a54c1bde-1400-4975-bf24-08c603ca3a11 # /dev/sdc1
@ -60,6 +61,11 @@ services:
- name: plex - name: plex
- name: uptime-kuma - name: uptime-kuma
- name: vpn-stack - name: vpn-stack
template_vars:
qbittorrent: true
radarr: true
sonarr: true
jackett: true
- name: mariadb - name: mariadb
template_vars: template_vars:
default_network: mariadb_net default_network: mariadb_net

@ -21,3 +21,5 @@ docker_daemon_options:
hosts: hosts:
- "tcp://0.0.0.0:2375" - "tcp://0.0.0.0:2375"
- "unix:///var/run/docker.sock" - "unix:///var/run/docker.sock"
docker_backup_host_backup_directory: "/tmp"

@ -8,6 +8,9 @@ snunmus
[qnaps] [qnaps]
qnap qnap
[sambaclients]
snunmu
[snunmus] [snunmus]
snunmu snunmu

@ -6,6 +6,7 @@
# corrsponds to which category of backups will be used. # corrsponds to which category of backups will be used.
# determined based on the docker labels. # determined based on the docker labels.
schedule: nightly schedule: nightly
docker_backup_retain_count: 7
pre_tasks: pre_tasks:
- name: Include vault variables. - name: Include vault variables.
@ -30,6 +31,7 @@
name: chatton.docker_backup.docker_s3_backup name: chatton.docker_backup.docker_s3_backup
vars: vars:
container_backup: "{{ container_item | regex_replace('^\\/', '') }}" container_backup: "{{ container_item | regex_replace('^\\/', '') }}"
docker_backup_retain_count: 7
with_items: "{{ container_names }}" with_items: "{{ container_names }}"
loop_control: loop_control:
loop_var: container_item loop_var: container_item

@ -18,6 +18,12 @@
- role: setup_mergerfs - role: setup_mergerfs
tags: [mergerfs] tags: [mergerfs]
- name: Configure samba shares.
hosts: all
become: true
roles:
- role: geerlingguy.samba
tags: [samba]
- name: Configure samba shares. - name: Configure samba shares.
hosts: samba hosts: samba
@ -26,6 +32,54 @@
- role: setup_samba - role: setup_samba
tags: [samba] tags: [samba]
- name: Samba Clients
hosts: sambaclients
become: true
tags: [samba]
pre_tasks:
- name: Include vault variables.
ansible.builtin.include_vars: '../{{ vault_file }}'
tags: [always]
tasks:
- name: Install CIFS and other required packages for mounting with apt
ansible.builtin.apt:
name: "{{ item }}"
state: present
with_items:
- smbclient
- cifs-utils
- name: Check mountpoint exists.
ansible.builtin.file:
path: "/mnt/mergerfs"
state: directory
mode: '0777'
owner: root
group: root
- name: Check mountpoint exists.
ansible.builtin.file:
path: "/mnt/ssd0/downloads"
state: directory
mode: '0777'
owner: root
group: root
- name: Mount shares.
mount:
state: "mounted"
fstype: "cifs"
path: /mnt/mergerfs
src: '//192.168.178.42/mergerfs'
opts: 'username=cianhatton,password={{ cianhatton_password }},dir_mode=0777,file_mode=0777,umask=0000'
- name: Mount shares.
mount:
state: "mounted"
fstype: "cifs"
path: /mnt/ssd0/downloads
src: '//192.168.178.42/downloads'
opts: 'username=cianhatton,password={{ cianhatton_password }},dir_mode=0777,file_mode=0777,umask=0000'
- name: Install Docker on Docker hosts. - name: Install Docker on Docker hosts.
hosts: docker hosts: docker

@ -3,6 +3,7 @@ roles:
- src: sprat.mergerfs - src: sprat.mergerfs
- src: geerlingguy.pip - src: geerlingguy.pip
- src: geerlingguy.docker - src: geerlingguy.docker
- src: geerlingguy.samba
collections: collections:
- name: https://github.com/chatton/ansible-portainer.git - name: https://github.com/chatton/ansible-portainer.git

@ -0,0 +1,4 @@
# These are supported funding model platforms
---
github: geerlingguy
patreon: geerlingguy

@ -0,0 +1,56 @@
# Configuration for probot-stale - https://github.com/probot/stale
# Number of days of inactivity before an Issue or Pull Request becomes stale
daysUntilStale: 90
# Number of days of inactivity before an Issue or Pull Request with the stale label is closed.
# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale.
daysUntilClose: 30
# Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled)
onlyLabels: []
# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable
exemptLabels:
- pinned
- security
- planned
# Set to true to ignore issues in a project (defaults to false)
exemptProjects: false
# Set to true to ignore issues in a milestone (defaults to false)
exemptMilestones: false
# Set to true to ignore issues with an assignee (defaults to false)
exemptAssignees: false
# Label to use when marking as stale
staleLabel: stale
# Limit the number of actions per hour, from 1-30. Default is 30
limitPerRun: 30
pulls:
markComment: |-
This pull request has been marked 'stale' due to lack of recent activity. If there is no further activity, the PR will be closed in another 30 days. Thank you for your contribution!
Please read [this blog post](https://www.jeffgeerling.com/blog/2020/enabling-stale-issue-bot-on-my-github-repositories) to see the reasons why I mark pull requests as stale.
unmarkComment: >-
This pull request is no longer marked for closure.
closeComment: >-
This pull request has been closed due to inactivity. If you feel this is in error, please reopen the pull request or file a new PR with the relevant details.
issues:
markComment: |-
This issue has been marked 'stale' due to lack of recent activity. If there is no further activity, the issue will be closed in another 30 days. Thank you for your contribution!
Please read [this blog post](https://www.jeffgeerling.com/blog/2020/enabling-stale-issue-bot-on-my-github-repositories) to see the reasons why I mark issues as stale.
unmarkComment: >-
This issue is no longer marked for closure.
closeComment: >-
This issue has been closed due to inactivity. If you feel this is in error, please reopen the issue or file a new issue with the relevant details.

@ -0,0 +1,67 @@
---
name: CI
'on':
pull_request:
push:
branches:
- master
schedule:
- cron: "0 3 * * 4"
defaults:
run:
working-directory: 'geerlingguy.samba'
jobs:
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- name: Check out the codebase.
uses: actions/checkout@v2
with:
path: 'geerlingguy.samba'
- name: Set up Python 3.
uses: actions/setup-python@v2
with:
python-version: '3.x'
- name: Install test dependencies.
run: pip3 install yamllint ansible-lint
- name: Lint code.
run: |
yamllint .
ansible-lint
molecule:
name: Molecule
runs-on: ubuntu-latest
strategy:
matrix:
distro:
- centos7
- ubuntu2004
steps:
- name: Check out the codebase.
uses: actions/checkout@v2
with:
path: 'geerlingguy.samba'
- name: Set up Python 3.
uses: actions/setup-python@v2
with:
python-version: '3.x'
- name: Install test dependencies.
run: pip3 install ansible molecule[docker] docker
- name: Run Molecule tests.
run: molecule test
env:
PY_COLORS: '1'
ANSIBLE_FORCE_COLOR: '1'
MOLECULE_DISTRO: ${{ matrix.distro }}

@ -0,0 +1,38 @@
---
# This workflow requires a GALAXY_API_KEY secret present in the GitHub
# repository or organization.
#
# See: https://github.com/marketplace/actions/publish-ansible-role-to-galaxy
# See: https://github.com/ansible/galaxy/issues/46
name: Release
'on':
push:
tags:
- '*'
defaults:
run:
working-directory: 'geerlingguy.samba'
jobs:
release:
name: Release
runs-on: ubuntu-latest
steps:
- name: Check out the codebase.
uses: actions/checkout@v2
with:
path: 'geerlingguy.samba'
- name: Set up Python 3.
uses: actions/setup-python@v2
with:
python-version: '3.x'
- name: Install Ansible.
run: pip3 install ansible-base
- name: Trigger a new import on Galaxy.
run: ansible-galaxy role import --api-key ${{ secrets.GALAXY_API_KEY }} $(echo ${{ github.repository }} | cut -d/ -f1) $(echo ${{ github.repository }} | cut -d/ -f2)

@ -0,0 +1,3 @@
*.retry
*/__pycache__
*.pyc

@ -0,0 +1,10 @@
---
extends: default
rules:
line-length:
max: 120
level: warning
ignore: |
.github/stale.yml

@ -0,0 +1,20 @@
The MIT License (MIT)
Copyright (c) 2017 Jeff Geerling
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

@ -0,0 +1,31 @@
# Ansible Role: Samba (SMB)
[![CI](https://github.com/geerlingguy/ansible-role-samba/workflows/CI/badge.svg?event=push)](https://github.com/geerlingguy/ansible-role-samba/actions?query=workflow%3ACI)
Installs Samba client and server for RHEL/CentOS.
## Requirements
Samba requires ports 137, 138, 139, 445 to be open to function properly. For easy firewall configuration, you can use the `geerlingguy.firewall` role.
## Role Variables
None.
## Dependencies
None.
## Example Playbook
- hosts: servers
roles:
- geerlingguy.samba
## License
MIT / BSD
## Author Information
This role was created in 2014 by [Jeff Geerling](https://www.jeffgeerling.com/), author of [Ansible for DevOps](https://www.ansiblefordevops.com/).

@ -0,0 +1,3 @@
---
- name: restart smb
service: "name={{ samba_daemon }} state=restarted"

@ -0,0 +1,2 @@
install_date: Fri 16 Sep 18:30:26 2022
version: 1.2.0

@ -0,0 +1,33 @@
---
dependencies: []
galaxy_info:
role_name: samba
author: geerlingguy
description: "Samba for RHEL/CentOS."
company: "Midwestern Mac, LLC"
license: "license (BSD, MIT)"
min_ansible_version: 2.0
platforms:
- name: EL
versions:
- 7
- 8
- name: Fedora
versions:
- all
- name: Ubuntu
versions:
- all
- name: Debian
versions:
- all
galaxy_tags:
- networking
- system
- samba
- windows
- filesystem
- fileshare
- sharing
- files

@ -0,0 +1,12 @@
---
- name: Converge
hosts: all
become: true
pre_tasks:
- name: Update apt cache.
apt: update_cache=true cache_valid_time=600
when: ansible_os_family == 'Debian'
roles:
- role: geerlingguy.samba

@ -0,0 +1,17 @@
---
dependency:
name: galaxy
driver:
name: docker
platforms:
- name: instance
image: "geerlingguy/docker-${MOLECULE_DISTRO:-centos7}-ansible:latest"
command: ${MOLECULE_DOCKER_COMMAND:-""}
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:ro
privileged: true
pre_build_image: true
provisioner:
name: ansible
playbooks:
converge: ${MOLECULE_PLAYBOOK:-converge.yml}

@ -0,0 +1,27 @@
---
- name: Include OS-specific variables.
include_vars: "{{ ansible_os_family }}.yml"
- name: Ensure Samba-related packages are installed (RedHat).
package:
name:
- samba
- samba-client
- samba-common
- cifs-utils
state: present
when: ansible_os_family == 'RedHat'
- name: Ensure Samba-related packages are installed (Debian).
apt:
name:
- samba
- samba-common
state: present
when: ansible_os_family == 'Debian'
- name: Ensure Samba is running and set to start on boot.
service:
name: "{{ samba_daemon }}"
state: started
enabled: true

@ -0,0 +1,2 @@
---
samba_daemon: smbd

@ -0,0 +1,2 @@
---
samba_daemon: smb

@ -30,7 +30,7 @@ services:
dns: dns:
- 1.1.1.1 - 1.1.1.1
- 8.8.8.8 - 8.8.8.8
{% if template_vars.qbittorrent %}
qbittorrent: qbittorrent:
labels: labels:
ie.cianhatton.backup.enabled: "true" ie.cianhatton.backup.enabled: "true"
@ -50,7 +50,8 @@ services:
- qbittorrent_config:/config - qbittorrent_config:/config
- {{ directories.downloads_dir }}:/downloads - {{ directories.downloads_dir }}:/downloads
restart: unless-stopped restart: unless-stopped
{% endif %}
{% if template_vars.radarr %}
radarr: radarr:
labels: labels:
ie.cianhatton.backup.enabled: "true" ie.cianhatton.backup.enabled: "true"
@ -69,7 +70,8 @@ services:
- {{ directories.movies_dir }}:/movies - {{ directories.movies_dir }}:/movies
- {{ directories.downloads_dir }}:/downloads - {{ directories.downloads_dir }}:/downloads
restart: unless-stopped restart: unless-stopped
{% endif %}
{% if template_vars.sonarr %}
sonarr: sonarr:
depends_on: depends_on:
- surfshark - surfshark
@ -88,7 +90,8 @@ services:
- {{ directories.tv_dir }}:/tv - {{ directories.tv_dir }}:/tv
- {{ directories.downloads_dir }}:/downloads - {{ directories.downloads_dir }}:/downloads
restart: unless-stopped restart: unless-stopped
{% endif %}
{% if template_vars.jackett %}
jackett: jackett:
labels: labels:
ie.cianhatton.backup.enabled: "true" ie.cianhatton.backup.enabled: "true"
@ -107,9 +110,24 @@ services:
- jackett_config:/config - jackett_config:/config
- {{ directories.downloads_dir }}:/downloads - {{ directories.downloads_dir }}:/downloads
restart: unless-stopped restart: unless-stopped
{% endif %}
volumes: volumes:
{% if template_vars.jackett %}
jackett_config:
{% endif %}
{% if template_vars.qbittorrent %}
qbittorrent_config: qbittorrent_config:
# https://askubuntu.com/questions/1203832/how-to-mount-smb-share-on-ubuntu-18-04-with-read-write-from-the-terminal
# downloads:
# driver: local
# driver_opts:
# type: "cifs"
# device: "//192.168.178.42/downloads"
# o: "username=cianhatton,password={{ cianhatton_password }},dir_mode=0777,file_mode=0777"
{% endif %}
{% if template_vars.radarr %}
radarr_config: radarr_config:
{% endif %}
{% if template_vars.sonarr %}
sonarr_config: sonarr_config:
jackett_config: {% endif %}

@ -3,8 +3,3 @@ samba_group: smbgroup
samba_user: smbuser samba_user: smbuser
users: users:
- name: cianhatton - name: cianhatton
shares:
- /share
- /share/public_files
- /share/private_files
- /share/cian_files

@ -1,9 +1,13 @@
[Cian Private Files] [mergerfs]
comment= My Private Files path = /mnt/mergerfs
path = /share/cian_files # the user that we're going to force this to be shared as
valid users = cianhatton force user = smbuser
public = no force group = smbgroup
# permissions for new files
create mask = 0664
force create mode = 0664
# permissions for new directories
directory mask = 0775
force directory mode = 0775
public = yes
writable = yes writable = yes
browsable = yes
printable = no
create mask = 0765

@ -8,4 +8,23 @@ map to guest = Bad User
# the order in which it checks for host names # the order in which it checks for host names
name resolve order = bcast host name resolve order = bcast host
# include a separate config # include a separate config
include = /etc/samba/shares.conf
# the user that we're going to force this to be shared as
force user = smbuser
force group = smbgroup
# permissions for new files
create mask = 0777
force create mode = 0777
# permissions for new directories
directory mask = 0777
force directory mode = 0777
public = yes
writable = yes
read only = no
[mergerfs]
path = /mnt/mergerfs
[downloads]
path = /mnt/ssd0/downloads

@ -1,18 +1,10 @@
--- ---
- name: Install samba packages using apt.
ansible.builtin.apt:
name:
- samba
state: present
update_cache: true
- name: Ensure samba group exists. - name: Ensure samba group exists.
ansible.builtin.group: ansible.builtin.group:
name: '{{ samba_group }}' name: '{{ samba_group }}'
state: present state: present
system: true system: true
notify: notify: reload-samba
- reload-samba
- name: Ensure samba user. - name: Ensure samba user.
ansible.builtin.user: ansible.builtin.user:
@ -21,8 +13,8 @@
group: '{{ samba_group }}' group: '{{ samba_group }}'
shell: /bin/false shell: /bin/false
create_home: false create_home: false
notify: system: true
- reload-samba notify: reload-samba
- name: Add the User(s) to Samba group. - name: Add the User(s) to Samba group.
ansible.builtin.user: ansible.builtin.user:
@ -31,18 +23,6 @@
append: true append: true
with_items: '{{ users }}' with_items: '{{ users }}'
- name: Ensure Share directories.
ansible.builtin.file:
path: '{{ item }}'
recurse: true
state: directory
owner: '{{ samba_user }}'
group: '{{ samba_group }}'
mode: u+rw,g+rw
with_items: '{{ shares }}'
notify:
- reload-samba
- name: Copy smb conf files. - name: Copy smb conf files.
ansible.builtin.copy: ansible.builtin.copy:
src: '{{ item }}' src: '{{ item }}'
@ -53,5 +33,4 @@
with_items: with_items:
- smb.conf - smb.conf
- shares.conf - shares.conf
notify: notify: reload-samba
- reload-samba

@ -1,56 +1,54 @@
$ANSIBLE_VAULT;1.1;AES256 $ANSIBLE_VAULT;1.1;AES256
36366133663433613231613961343232323738393961386166343066373337333633313564653266 66333730653465646636303364316565323435643936343638383337626333363838356636666261
3465326438343038323338653835363837323863663735370a333936383738303331366431636462 6632366364616461663463373635346633343830636130660a616534656536663433643164616434
35373964653835303530336139303163383162363164313333356535666339393231633461313162 36623834323962633532333461363633653134366631623065626664643738656161626137663763
3861663065633736620a306437666563616266386439373464643635396632633164623066613362 3838666362363361350a363437366565363839326432623338663139323433346330343536616336
63666666306634326638346466646635353333623730303136353761363439396631346665643134 39633961333833386361633466646430343730353863393835376639303335306265626135633030
61656133323461346639623534633331623533663430643739346261623766343933643937393263 62626132633037306632306538373335633766616663336135656337386335336264386438373833
65313431613064333361363165653632343462636262396435306666326136313139313837313539 34613730386135343362633261333436613935376237613938663862363766383033373734666165
34313939633538613661393065656438306537343863653135316530636133373933363638316332 34323739386539363862633762333634363630663437343865313838303665663136373834623134
64333738633332313233383833393932613535613037373637393236383835333363626332353763 32303466353830623237623036376637633130326561656337376434313136366662316332663863
31316163343633363463386465616439313661663236663734623438653262643831613932646561 38653834333630636533636265643866613062356563396461626364623130383030656661613361
30633034633364616338343463366233376663613536623865663036353333656366393134396332 64326132613162666137616539366262653965333033373336623633646534373030643039663231
39666666343963373539656665306366643736393962323138333636656366623666396638643662 38363931313431353234346333386562643465383161636632646631353837313139333363356236
32666533356661306137663037663563393634333166353938623434663563366466656463666334 31313562366462663635643730663062326634666438616261373135323865663238336461383038
39373831303835636331636235616361323435646434653638663561353161633037396634353863 32306162663530376135366330306265383538326639636134623563303337396363336431363963
66333065386439376537653530323431343834346636663564333835373635356233396334356438 66393838346232346362653131346233656433373365653735663934656138666565633833616539
61383537653533326565393536623639636434323934376537343030643364333134353731396438 65343837313434323366363532333530663265363961373733363461653039363236346336313262
31333766383063353630363465323330376139646537356165666361323036376535663433643865 62326561373638336231386463356335313635336439333764396231323231386362356363383237
38353461393937313833623263356134313935666639333032653434333739393438656561313138 62383235343134663830373334383139633031356461666138613963643732356534313062373565
64366434376637353139376566623764393562663134353330313162656239653064363136333363 31303539303931636463363931353938303162303462393963643064343062356532353131636466
30383266646331363338326633383263643739323031393766653833356130353366356535373361 62336135393938366635343331643538303262613836313462626331666438666132353463373430
36633261386336316361653433663637373034623963646561323132613066653337313031326563 35613864613738306630376465616662636134346635303636626332343531643434383865346435
63313962343730613436323966323562633563323664656234303064346666303164623831356561 65333465633631343062633262656133323430626338333966666464623030653835313961653165
31613664303331633830393165383135373563626261363930363362336131623965373136396634 31353532333232383032363761323637373830623931663834613862613138363836616236393438
38316232653739393439386133306338626462343566633330363336363238346562323561373237 33353462346630306434306466343562666331393337363939623633366330636362306464346665
66653831396135653032366637323839316533323661633264656432663039303737336535376635 62396634353066393666393230326663373162303062393136373431643335373165366632336138
32353064613964303738393936373561626661316662336634663637383465646337633964636364 61353735646539396138306239363862383762663536663630393332633633386630386131386538
30336166393463343664343062366532656365636634313766613766313132623962376665306439 34613332643539626132633531373239306237623461303837336566616461333266663639656535
31386133623734626338326165623762396338386134346364373336616139616330386166303433 66373930383935613863623164353462323034393761646239393165376463356432626234323735
32373338326366623237346561396663373839313833666238393937333937396231326465653939 61346361613937316636366165333738663437393435643636313231343464356337666366323664
35333439323439626332616461363165313732366434333462373464343338356230353630636139 65656364343766303634373062343461653932373661333334353035346233333462653438363034
61323837376134343061353666356531316565616539646162313964336334653237626431643034 35396362373061656365343832346630303966383034613061343638623861363537663862313939
35386664383030373037333537383437336234646136643233366339626266666233643563333965 36343736333364663439343632396634356465656438316461636165393066376165633238643561
30336364613566303634653530386136656239383763636338346436653833653434306438346534 31313036356538356231636336653737626530393439303764353965646663313065653038616330
65393131306365663837366365656335643763616162643064356561386635383064353339626335 39623937633065633561613661636166326565336464393331313838323034623063336264663564
31393438373137363937346236343035633363316661663637393661613066343862313464306165 32396539343339383637343561396431313130313133623439323232376232356437346436346236
30306561326131383336346263366637396362646138313136633466333833663033363961633466 65396339343531356135343933353930306134363738303332613961316133636430613034343966
31343439353863343264306238633064623763343863343564383163653639303164363461346437 63383664666364646265343230626464363332386264653664353831376162626533623161323231
33616433656566653065343932386466343436313531363263306637383235353666666233363666 61613836646435383136613966386237366364313263616666376264613735386237613461343035
62656537303237323034613731343561323766613336363064346334366263663737646132393130 30643034343233313931313562326433666666376564653230653238363837343535663165653064
36323466323262323937396137366161383066323537353136323832633066383866336365316535 66633163663961653939666136366264313837353561616161373337643630326633366638323037
37653530323365656633643837666538316537323033613431333839303133326337393233643238 38386165633739303438353032616264643461626663303337646436323832353861623562643064
30393630643439653733373733393330366466386564646431643232376234373734316637656130 62346533336361636537366335666663393165633336656430363461626561373863366439613535
34303262633331643736396635663232653332366366616636346539666430313266363736303036 39396438356466363238653563353664383331616235376138623064393331626637623663653837
66376530323538323439313834326262343234633361626130303535313162306365616265323131 38613631663065366364643062306630656232396332643863373264373463363933323963383066
32353663396434636134663033396264383061323637356438363362626332363163393734386531 39643462366162663263343739643862653965636430663533343731353538663930646664373633
62666365633335303264393230303730613731376433613462306464393836626434613961656430 31383166336132373939373066303137343535633064633635613866666161643963313838666562
31393761316666656637633666316335356433643966363565633934393133653166333731333930 64633166356134363664666363633861353762303263303233626537323965613666636433343861
31653430656365376133643964336237353064636533313135313965333738386365373638623138 32306136373962393734376264353630613337343165373963653263653234616330633763393635
65313432386463336338356134373564633938376233343361623932626264623938373333616536 64656232346262656439383364636234623130363635346633663432336638393638646435366266
64333361376165396665373163316666383830653262343732306536623432353065626532663731 33303037646432646630326536333037643233323466623362393537386164393732336530623334
63623434613866346532396564303634653565386661363838366339333338353633363437323636 64303036646331656233336137323963313964356136323533396564303166326333656534626433
37346331323836333561666165393661353730646164636233343362333334626133333934616462 38623662643537356230353233646332333737336334333731343466346465343238643633653062
66303532636436646632626632326632353732633833653330326632666538363334303965373262 37346463373232636332633239376431653464653261383461306433326665353866
38343639303730316235313538333636313438346130386535313334373434333239393366383661
373434663138393331353436313837313765

Loading…
Cancel
Save