aboutsummaryrefslogtreecommitdiffstats
path: root/resources/tools/testbed-setup
diff options
context:
space:
mode:
authorpmikus <pmikus@cisco.com>2020-05-20 15:05:49 +0000
committerpmikus <pmikus@cisco.com>2020-05-20 15:05:49 +0000
commit5c7b32f5ba60acae88af6e838c79639d68a4fcad (patch)
tree601fe25983529d20abf31b43f9b21ab8bdf35e12 /resources/tools/testbed-setup
parent1881e1a4a59c3bd4a8574a1a0239a781874a48ec (diff)
Infra: Ansible maintenance
+ As per last discoveries when running from_scratch vs. append_only Signed-off-by: pmikus <pmikus@cisco.com> Change-Id: I8b44314185bbc157a67136730dc6146d133c7cc4
Diffstat (limited to 'resources/tools/testbed-setup')
-rw-r--r--resources/tools/testbed-setup/ansible/roles/docker/defaults/main.yaml25
-rw-r--r--resources/tools/testbed-setup/ansible/roles/docker/handlers/main.yaml5
-rw-r--r--resources/tools/testbed-setup/ansible/roles/docker/meta/main.yaml6
-rw-r--r--resources/tools/testbed-setup/ansible/roles/docker/tasks/main.yaml79
-rw-r--r--resources/tools/testbed-setup/ansible/roles/docker/tasks/ubuntu_bionic.yaml36
-rw-r--r--resources/tools/testbed-setup/ansible/roles/kernel/handlers/main.yaml6
-rw-r--r--resources/tools/testbed-setup/ansible/roles/kernel/tasks/main.yaml2
-rw-r--r--resources/tools/testbed-setup/ansible/roles/kernel/tasks/ubuntu_bionic.yaml2
-rw-r--r--resources/tools/testbed-setup/ansible/roles/performance_tuning/tasks/main.yaml5
-rw-r--r--resources/tools/testbed-setup/ansible/roles/performance_tuning/tasks/ubuntu_bionic.yaml11
-rw-r--r--resources/tools/testbed-setup/ansible/sut.yaml8
-rw-r--r--resources/tools/testbed-setup/ansible/tg.yaml8
-rw-r--r--resources/tools/testbed-setup/ansible/vault.yml421
13 files changed, 282 insertions, 332 deletions
diff --git a/resources/tools/testbed-setup/ansible/roles/docker/defaults/main.yaml b/resources/tools/testbed-setup/ansible/roles/docker/defaults/main.yaml
index 4f2cae9b75..6c445aa42a 100644
--- a/resources/tools/testbed-setup/ansible/roles/docker/defaults/main.yaml
+++ b/resources/tools/testbed-setup/ansible/roles/docker/defaults/main.yaml
@@ -2,29 +2,30 @@
# file: roles/docker/defaults/main.yaml
# Version options.
-docker_edition: 'ce'
-docker_version: '19.03.3'
-docker_apt_package: '5:{{ docker_version }}~3-0~{{ ansible_distribution | lower }}-{{ ansible_distribution_release }}'
-docker_apt_package_state: present
+docker_edition: "ce"
+docker_package: "docker-{{ docker_edition }}"
+docker_package_state: present
# Service options.
docker_service_state: started
docker_service_enabled: true
docker_restart_handler_state: restarted
-# Used only for Debian/Ubuntu. Switch 'stable' to 'edge' if needed.
-docker_apt_release_channel: 'edge'
-docker_apt_repository: 'deb https://download.docker.com/linux/{{ ansible_distribution|lower }} {{ ansible_distribution_release }} {{ docker_apt_release_channel }}'
+# Used only for Debian/Ubuntu.
+docker_apt_release_channel: "stable"
+docker_apt_key: "https://download.docker.com/linux/{{ ansible_distribution | lower }}/gpg"
+docker_apt_key_state: present
+docker_apt_repository: "deb https://download.docker.com/linux/{{ ansible_distribution|lower }} {{ ansible_distribution_release }} {{ docker_apt_release_channel }}"
docker_apt_repository_state: present
# A list of users who will be added to the docker group.
docker_users:
- - 'testuser'
+ - "testuser"
# Proxy settings.
docker_daemon_environment_http:
- - 'HTTP_PROXY={{ proxy_env.http_proxy }}'
- - 'NO_PROXY={{ proxy_env.no_proxy }}'
+ - "HTTP_PROXY={{ proxy_env.http_proxy }}"
+ - "NO_PROXY={{ proxy_env.no_proxy }}"
docker_daemon_environment_https:
- - 'HTTPS_PROXY={{ proxy_env.https_proxy }}'
- - 'NO_PROXY={{ proxy_env.no_proxy }}'
+ - "HTTPS_PROXY={{ proxy_env.https_proxy }}"
+ - "NO_PROXY={{ proxy_env.no_proxy }}"
diff --git a/resources/tools/testbed-setup/ansible/roles/docker/handlers/main.yaml b/resources/tools/testbed-setup/ansible/roles/docker/handlers/main.yaml
index d33c63fae8..4dfcd0b867 100644
--- a/resources/tools/testbed-setup/ansible/roles/docker/handlers/main.yaml
+++ b/resources/tools/testbed-setup/ansible/roles/docker/handlers/main.yaml
@@ -3,6 +3,5 @@
- name: Restart Docker
service:
- name: 'docker'
- state: '{{ docker_restart_handler_state }}'
- tags: restart-docker
+ name: "docker"
+ state: "{{ docker_restart_handler_state }}"
diff --git a/resources/tools/testbed-setup/ansible/roles/docker/meta/main.yaml b/resources/tools/testbed-setup/ansible/roles/docker/meta/main.yaml
new file mode 100644
index 0000000000..0dc7d19507
--- /dev/null
+++ b/resources/tools/testbed-setup/ansible/roles/docker/meta/main.yaml
@@ -0,0 +1,6 @@
+---
+# file: roles/docker/meta/main.yaml
+
+dependencies: []
+
+
diff --git a/resources/tools/testbed-setup/ansible/roles/docker/tasks/main.yaml b/resources/tools/testbed-setup/ansible/roles/docker/tasks/main.yaml
index 1f7fdf6692..d3eef82781 100644
--- a/resources/tools/testbed-setup/ansible/roles/docker/tasks/main.yaml
+++ b/resources/tools/testbed-setup/ansible/roles/docker/tasks/main.yaml
@@ -1,49 +1,72 @@
---
# file: roles/docker/tasks/main.yaml
-- name: Docker - Install distribution - release - machine prerequisites
- include_tasks: '{{ ansible_distribution|lower }}_{{ ansible_distribution_release }}.yaml'
- tags: install-docker
+- include_tasks: "{{ ansible_distribution|lower }}_{{ ansible_distribution_release }}.yaml"
+ tags:
+ - docker-inst-dependencies
-- name: Docker - Create Service Directory
+- name: Inst - Docker
+ package:
+ name: "{{ docker_package }}"
+ state: "{{ docker_package_state }}"
+ notify:
+ - "Restart Docker"
+ tags:
+ - docker-inst-package
+
+- name: Conf - Docker Service
+ service:
+ name: docker
+ state: "{{ docker_service_state }}"
+ enabled: "{{ docker_service_enabled }}"
+ tags:
+ - docker-conf-service
+
+- name: Conf - Docker Service Directory
file:
- path: '/etc/systemd/system/docker.service.d'
- state: 'directory'
- tags: install-docker
+ path: "/etc/systemd/system/docker.service.d"
+ state: "directory"
+ tags:
+ - docker-conf-service
-- name: Docker - Setup HTTP Proxy
+- name: Conf - Docker HTTP Proxy
template:
- src: 'templates/docker.service.proxy.http'
- dest: '/etc/systemd/system/docker.service.d/http-proxy.conf'
- owner: 'root'
- group: 'root'
- mode: '0644'
+ src: "templates/docker.service.proxy.http"
+ dest: "/etc/systemd/system/docker.service.d/http-proxy.conf"
+ owner: "root"
+ group: "root"
+ mode: "0644"
notify:
- - 'Restart Docker'
+ - "Restart Docker"
when: >
proxy_env is defined and
proxy_env.http_proxy is defined
- tags: install-docker
+ tags:
+ - docker-conf-service
-- name: Docker - Setup HTTPS Proxy
+- name: Conf - Docker HTTPS Proxy
template:
- src: 'templates/docker.service.proxy.https'
- dest: '/etc/systemd/system/docker.service.d/https-proxy.conf'
- owner: 'root'
- group: 'root'
- mode: '0644'
+ src: "templates/docker.service.proxy.https"
+ dest: "/etc/systemd/system/docker.service.d/https-proxy.conf"
+ owner: "root"
+ group: "root"
+ mode: "0644"
notify:
- - 'Restart Docker'
+ - "Restart Docker"
when: >
proxy_env is defined and
proxy_env.https_proxy is defined
- tags: install-docker
+ tags:
+ - docker-conf-service
-- name: Docker - Set specific users to docker group
+- name: Conf - Users to Docker Group
user:
- name: '{{ item }}'
- groups: 'docker'
+ name: "{{ item }}"
+ groups: "docker"
append: True
- with_items: '{{ docker_users }}'
+ loop: "{{ docker_users }}"
when: docker_users
- tags: install-docker
+ tags:
+ - docker-conf-user
+
+- meta: flush_handlers
diff --git a/resources/tools/testbed-setup/ansible/roles/docker/tasks/ubuntu_bionic.yaml b/resources/tools/testbed-setup/ansible/roles/docker/tasks/ubuntu_bionic.yaml
index 32643b1119..a38a0af110 100644
--- a/resources/tools/testbed-setup/ansible/roles/docker/tasks/ubuntu_bionic.yaml
+++ b/resources/tools/testbed-setup/ansible/roles/docker/tasks/ubuntu_bionic.yaml
@@ -1,33 +1,27 @@
---
# file: roles/docker/tasks/ubuntu_bionic.yaml
-- name: Docker repository - Dependencies
+- name: Inst - Dependencies
apt:
name:
- - 'apt-transport-https'
- - 'ca-certificates'
- - 'software-properties-common'
- state: 'present'
+ - "apt-transport-https"
+ - "ca-certificates"
+ - "gpg-agent"
+ - "software-properties-common"
+ state: "present"
cache_valid_time: 3600
install_recommends: False
- tags: install-docker
+ tags: docker-inst-dependencies
-- name: Docker repository - Add an Apt signing key
+- name: Conf - Add APT Key
apt_key:
- url: 'https://download.docker.com/linux/ubuntu/gpg'
- state: 'present'
- tags: install-docker
+ url: "{{ docker_apt_key }}"
+ state: "{{ docker_apt_key_state }}"
+ tags: docker-conf-apt
-- name: Docker repository - Install APT repository
+- name: Conf - Install APT Repository
apt_repository:
- repo: '{{ docker_apt_repository }}'
- state: '{{ docker_apt_repository_state }}'
+ repo: "{{ docker_apt_repository }}"
+ state: "{{ docker_apt_repository_state }}"
update_cache: True
- tags: install-docker
-
-- name: Install Docker
- apt:
- name: 'docker-{{ docker_edition }}={{ docker_apt_package }}'
- state: '{{ docker_apt_package_state }}'
- force: True
- tags: install-docker
+ tags: docker-conf-apt
diff --git a/resources/tools/testbed-setup/ansible/roles/kernel/handlers/main.yaml b/resources/tools/testbed-setup/ansible/roles/kernel/handlers/main.yaml
new file mode 100644
index 0000000000..3d30a0973c
--- /dev/null
+++ b/resources/tools/testbed-setup/ansible/roles/kernel/handlers/main.yaml
@@ -0,0 +1,6 @@
+---
+# file roles/kernel/handlers/main.yaml
+
+- name: Reboot Server
+ reboot:
+ reboot_timeout: 3600
diff --git a/resources/tools/testbed-setup/ansible/roles/kernel/tasks/main.yaml b/resources/tools/testbed-setup/ansible/roles/kernel/tasks/main.yaml
index bf8ea9fa68..4c63c709a6 100644
--- a/resources/tools/testbed-setup/ansible/roles/kernel/tasks/main.yaml
+++ b/resources/tools/testbed-setup/ansible/roles/kernel/tasks/main.yaml
@@ -4,3 +4,5 @@
- name: Kernel - Install distribution - release
include_tasks: '{{ ansible_distribution|lower }}_{{ ansible_distribution_release }}.yaml'
tags: install-kernel
+
+- meta: flush_handlers
diff --git a/resources/tools/testbed-setup/ansible/roles/kernel/tasks/ubuntu_bionic.yaml b/resources/tools/testbed-setup/ansible/roles/kernel/tasks/ubuntu_bionic.yaml
index c9c561df6f..3cb79352ee 100644
--- a/resources/tools/testbed-setup/ansible/roles/kernel/tasks/ubuntu_bionic.yaml
+++ b/resources/tools/testbed-setup/ansible/roles/kernel/tasks/ubuntu_bionic.yaml
@@ -33,6 +33,8 @@
apt_kernel_list, kernel_version, ansible_kernel) }}"
state: absent
purge: true
+ notify:
+ - "Reboot Server"
tags: install-kernel
- name: Kernel - Ensure Any Microcode Is Absent
diff --git a/resources/tools/testbed-setup/ansible/roles/performance_tuning/tasks/main.yaml b/resources/tools/testbed-setup/ansible/roles/performance_tuning/tasks/main.yaml
index 4605783795..3a8f35b57f 100644
--- a/resources/tools/testbed-setup/ansible/roles/performance_tuning/tasks/main.yaml
+++ b/resources/tools/testbed-setup/ansible/roles/performance_tuning/tasks/main.yaml
@@ -22,10 +22,11 @@
line: "{{ grub_cmdline_linux[ansible_machine] | join() }}"
notify:
- "Update GRUB"
- - "Reboot server"
tags:
- set-grub
+- meta: flush_handlers
+
- name: Performance Tuning - Turbo Boost
import_tasks: turbo_boost.yaml
when: >
@@ -160,6 +161,8 @@
owner: "root"
group: "root"
mode: "0644"
+ notify:
+ - "Update GRUB"
tags:
- copy-irqbalance
diff --git a/resources/tools/testbed-setup/ansible/roles/performance_tuning/tasks/ubuntu_bionic.yaml b/resources/tools/testbed-setup/ansible/roles/performance_tuning/tasks/ubuntu_bionic.yaml
index f239890989..273ad53f25 100644
--- a/resources/tools/testbed-setup/ansible/roles/performance_tuning/tasks/ubuntu_bionic.yaml
+++ b/resources/tools/testbed-setup/ansible/roles/performance_tuning/tasks/ubuntu_bionic.yaml
@@ -2,16 +2,17 @@
# file: roles/performance_tuning/tasks/ubuntu_bionic.yaml
- name: Ubuntu Bionic - Mount /tmp as tmpfs I
- copy:
- src: "/usr/share/systemd/tmp.mount"
- dest: "/etc/systemd/system/tmp.mount"
- remote_src: yes
+ copy:
+ src: "/usr/share/systemd/tmp.mount"
+ dest: "/etc/systemd/system/tmp.mount"
+ remote_src: yes
tags:
- machine-optimizations
- name: Ubuntu Bionic - Mount /tmp as tmpfs II
- service:
+ systemd:
name: "tmp.mount"
+ daemon_reload: yes
enabled: yes
tags:
- machine-optimizations
diff --git a/resources/tools/testbed-setup/ansible/sut.yaml b/resources/tools/testbed-setup/ansible/sut.yaml
index 47e72bd5a6..68ac9b8364 100644
--- a/resources/tools/testbed-setup/ansible/sut.yaml
+++ b/resources/tools/testbed-setup/ansible/sut.yaml
@@ -10,6 +10,10 @@
tags: baremetal
- role: common
tags: common
+ - role: kernel
+ tags: kernel
+ - role: mellanox
+ tags: mellanox
- role: vpp
tags: vpp
- role: dpdk
@@ -18,14 +22,10 @@
tags: docker
- role: kubernetes
tags: kubernetes
- - role: mellanox
- tags: mellanox
- role: kernel_vm
tags: kernel_vm
- role: performance_tuning
tags: performance_tuning
- - role: kernel
- tags: kernel
- role: cleanup
tags: cleanup
- role: calibration
diff --git a/resources/tools/testbed-setup/ansible/tg.yaml b/resources/tools/testbed-setup/ansible/tg.yaml
index a2c9fe5f23..e800881127 100644
--- a/resources/tools/testbed-setup/ansible/tg.yaml
+++ b/resources/tools/testbed-setup/ansible/tg.yaml
@@ -12,6 +12,10 @@
tags: common
- role: tg
tags: tg
+ - role: kernel
+ tags: kernel
+ - role: mellanox
+ tags: mellanox
- role: iperf
tags: iperf
- role: trex
@@ -20,12 +24,8 @@
tags: wrk
- role: docker
tags: docker
- - role: mellanox
- tags: mellanox
- role: performance_tuning
tags: performance_tuning
- - role: kernel
- tags: kernel
- role: cleanup
tags: cleanup
- role: calibration
diff --git a/resources/tools/testbed-setup/ansible/vault.yml b/resources/tools/testbed-setup/ansible/vault.yml
index a500462147..56f15d84d9 100644
--- a/resources/tools/testbed-setup/ansible/vault.yml
+++ b/resources/tools/testbed-setup/ansible/vault.yml
@@ -1,255 +1,168 @@
$ANSIBLE_VAULT;1.1;AES256
-36343463316430383361393130343966303537663633623764306562626538623763633630326565
-3739396238616663666564643633656563646262656261370a373361326534313433643737623761
-66643663633865373637323138626432613065376430303233623263323463633764373233333836
-6561643461303634360a346634346162633337366530333037633235633932643833643165626361
-38666564373132366635663264393632303265303633366238363735393335373932666665383164
-37623239326234323738613338346162613030326237653930646162326465653837653538366438
-62393734623663306465333435663133393562656566386334303133333733376433353431616561
-62386439333065393365346462333331633537313962363965353732313662376463626161323338
-34366663386631626137363131643732646530323863646536613166653136343862333236323837
-66323839636264346231643737336134633466396363343537333231626433376632383131356332
-62313665373639643139333537396463383962386439643530616633633238393430346231323665
-33343738616331303563353438653662303762306237663162383430386438333431343333383739
-32343265643534396362373635383638303135663063376638343330353662613365393237663738
-65323932303030373862653539626431316135363639623930366337366333623761356337303836
-33373561386563346231366134616130633939626334343366666233376430326533343133323937
-30393963363866393863653237343762316663646633313934666236333061326333613037353363
-61663334623331653932316361373634626432366139643938613435396436353562623234336365
-65313239363130656532303432306232636438386162646233666662373938353461363361393831
-61653264656133366231346235663132303930616566336630626530383538616637626139326537
-37393938623764633037383931323439306561363931316133363764323432343862353836383864
-35646263626531336237393133356264333135353731666337653765623863643637643735373063
-35653637353230636630636232626534666232613639353836363235303163366362646162633330
-32623564333030613566353565376130633365316266323836616631326363626162643438356366
-32623939623830663039373032396636383739356530346537653730613762633731623863376233
-36653632356331656530613865346365353363633466643731633736363533303732303930396336
-33356366323765643838393634373664626662366530646661363764333833366262333531616635
-31313239376535626434333431303538656662303162326235336138333635313132326438653361
-62656635323462656536336464316436373039323461306461353534613534633532303930623661
-35663961393339363661633932376639326539333536373637303535333562373233643730663565
-38653064336232396136306566353564633561613330666331626430626161316639303234346564
-39333732333964373861663261613130326164303330353039373132326332383965643737383566
-65356631313562376634393534396632663566616366346434396663323165623261626332323034
-62656436626236343736613664636264383735616331313730316533336366326635303936353535
-62323937326636326264396133313933616664633765373535666161346532616237626432333431
-36393463383736353663326366306161636230623038626138393162373231323361633061633134
-38323937376363313664336638656162333538313036393337306261383664353461653762366333
-36643435646465616265313638653537303664646332653332393430346363313435393833373536
-34643137353834386533373736373165623435396463393236333231363163316463653439373535
-34396437326331336435623464373466643164653063343435636535386461653937623730636234
-30663435396261343464663835313832306366323266356434653838303461633036666161376339
-32353435376562623436393662643233373333383862313635656331656366383664663661633764
-36383236633437636136366263386330316438346137313034316439666237336438383130653730
-63666231666234343936323439326538376330343865366234303961393435326530303638336330
-33343734333039303637646261396462346565363032323437656263656665373937623232343639
-61393263326463363363313439346630336536356332346662313334373936386261613830613361
-65356434373262653632363466313562386538396638393330393963613064663833656565323164
-31373761383362613365626563343935386462656562613533303637653662376665393731666366
-66386264306330356563343565656166666434346466623239623636393934653435306534356339
-33383533363938336164363133616261646638346336353862353362353439333539336436653165
-39303833353036646337333836633963396234323439396363316238313130333537643737303236
-65356263363566663639653533383737376530353035343562633032323635616565633763643035
-34623966643239633866323331666233653438633064316562353963643335653363383830626238
-37313137613837626639376238376562656463623834383633303830353861653736346539336665
-32656236343138356564356264626130383334303939666564383237666662613163636432383835
-37363463656333613464393438613633656165633166343634386534616333396462633337343765
-39343133386162326162653231636463323231653733636264336539386131353234363466303363
-61343465333537363038306138623766616130666534313733613033303530356364393265653136
-66663231313936656331643561363339383365623263363936303862653564643434326364373130
-37666664663663663530396265383965653639386430313938626665623933306666353631313538
-31353830363730626632376161663263623336623731613466323163663565626435303034326232
-66333161366563393537336264633935636465396239303865373233623938616564653030363066
-32326138343931613032323837653034666333353365643337326363393932646437316366653832
-63306539373730623464323137303134666534393536303330336335656235666630316666363039
-65663439376161313864386262643262326431666636643535613765343161353237353364636333
-63333664376335643739613435623034616230643561386533366538393836373562656138393563
-30366530313936363539646363363539646231386139626237333963333634393034663438386263
-35333534623335303034373236383564306135356334356138623061386638663261343830346262
-65623438333136623435323137656235323939613665373831656361383332323364633731316134
-35613064633332383238393430396465623962393932393262306132353764643135633437646233
-35396635303236343837333337666131363563613462326433363531663233646465633532386562
-36656165363137313635353534353530313139343165393239373734353564333332636135616166
-30623537303837653961306533656234326166333064633435633262356264303239386265313131
-30656237323639356265336362613930313436383362346661316634333765316662323038653235
-36633730363333653635663431623932303636396435643665643639376362646537623761393733
-33383161643733383662313461306530343164343439376162623963356337643237353465643830
-63356134666433356336333732366437613365623535333232346464653066323034313430373932
-61306639653065326531623436633832663264383562653030376435336336376365303139353831
-34663539306238396238373538613664616164653261353038656239363337666231643137663032
-61656132616666633161353138333963313936303530353831373766373864316130376433386431
-37646361653130616262666635323930363234323265383535646334383464323732366662316238
-64303662363935366133653364373439633935316132383736623330386432313132383461323438
-39386239646330326636633636316235333139343963633535333462393037373664346631393562
-35306235343164623237303930616363323438323766383835646261326539313239353062626336
-34393064353866346239363666306464666161316230646563326537343263303961326264663633
-35336435323038396435306465653636646336353762646266346465646135316633653831373239
-31376130663735633163376464373066633536653965376262313439336561353038346530343232
-38313661646631636632353363636661336336313366383863616566316435323139396530373438
-64623563653962333564643633313862383863666562373030376137393338323961383438663638
-30323534396432333533653635633935646663383162613133326363663834306138343038336366
-36373937623764616630323565663939663236376638343339376261336266663637323736363439
-37643238616138336361366562343031333466666165656435313037343766313030323963343739
-34376164613362303134366436356166666363663933653233373032613534613132383065646463
-38333630313237663235383635656430636362313639383131666135383938646335653965383366
-35363034633362366232626562323235353063643061353737363862343932363464363831626437
-31313635663731643331663136643837323031623266663963633734653439623331333230343364
-30643438343062353034623831393134343463643335616436353966346661663963343363663536
-32336338353330343862633561363463633961383865613162386261336135316335363634616166
-33663532666330623463646465336336623235383036313432623864353364373331323736643832
-35653234656263626565653461373461343161636539626231646462643532323066363930633333
-65626565636263323262393361396465613738383537323637373564633030386461383330653562
-30616262326334303062363739636339633033323530303762643735663366303739613431316463
-61323231663537303239653461623766326261656333366264313531643332633236666166626137
-33643862303737393030626331623335633337306439323961343936393361343134353230313735
-62313939663862326339653966386366343961323264643062396637373433306138346335356566
-30656563646138646335353364343036386630373035343536356539373664643539303163626638
-62303732646166323835303761313338326566623532613361363235366464306636353364336466
-65323362356330323735383862333433633735323264343034666264346537353762616337613639
-61643862616333656664343338653832386131633738363132623034623063663630636461363235
-62656539633933633839636565623866316430316236613134636135303131626630616366373136
-61656239363539336366643031393761643364366439336365653934333939313731313663643063
-33356564376565643034663665626161353236343764343737306233373534653435653036323935
-35616433313632306361626662363838386161303363663138303833613337373566313864633533
-61343032356531363439633166333531316531353239636166336566333364336235616663323864
-30663331626634653566613032643061656632323039633230376565346136643439303936373435
-33353638353165323865393337616231383330336662326133653630643638643761633866313335
-63313530666262613930353731393162656663383461616434643536666230626162316536643236
-62393166336133336335633963666437393633393537663065616331326261303436366336333061
-35646130366561366363316163333162323333333064613662323330643639313930376234333433
-39363462323165363163356137653664336365306538393232653436316664303235626234363831
-33323539613732383362326139373635386161393263393764656531313135626136343439313632
-36343035626433646361613637376166306536666230666435356332353661663661303964316563
-64656461313061346261383464373661396337663837353438646161626562636134656433333034
-39303463613732613833623865396362376437313431323435386633633533326363343139363537
-35386566666233386632646361633639333831643666663734626566653532383239616335626630
-31666566623434316462363832393634346561376265383439346363396165653233623666626466
-30383239373963303139363336383963343933323763623131393035323466626364636539373662
-32383431636533643131326530633132643531633766613834633131623935343737316563323238
-61646336656136613166356331353036613130616430353463323036373863373337393263653231
-35333765393731303766356133376635383364313438383836663939663063313038393866613365
-61653539653432383364356631326165356636326564623064363438333465306566323765373335
-38626437303331303466373539363135303337643631613736636665323038666434633764316539
-64396139336561336638303364363535323864653134646337333164363638376637306633323832
-36326231393165613530343965323337316664376263383733323432306165656338653438323034
-61363235333733373830376639646534646636333534613731313537363764376563353934396132
-38613734393433393233316539623839396331323735316561303038323733393065663165303464
-33383537316365656361346631613462643032656363303936366333306334663461613430376631
-62336663396165306166356236363063653233306139313730326662366435653136616462633434
-37323038396533326430373332666664313133633532326538626463663833373465656464363635
-65353731623962316465666435653232383834366638643135656330636339643062363135383339
-36323965396136373138386464393363373239383666313631633662353865636263656631343936
-36636261633436373031393061636532623064633634653239366161366336613037663764643537
-62343638373235343534383237353133333765616666323833363765653863636234353135386235
-30373530333432353635356664363563656638653031663632656532653431643831623932313962
-32323036303038363463343533623763373135373639306561623561663830393565613339373865
-33303431663634386335333831353238343138616463383963346336396433396136633231363830
-37386161613163353639636633323164303465313062303133623666646265343934656233636133
-31386239313433663461653935623564616162373031336633643039646132316135343433626166
-64376530393035653434326636393065333664636463343561303761666564626139626632303331
-36633062656365633736393230656339623365646638343532323764323563653739653434303036
-32386263376136663365353237386632653730396234636238336463616136643335303438313039
-37336562306637366163393231663639343561616266663338303439303035393766386235353063
-30383664346261356136626266656563306432626339356562393266623265376433383261323663
-65616163376566353734376633376136376431366535303538616566353463386365346163386231
-31666135616332346265303631656363343961393831646537636663386538313835383730383633
-62373038613763613034653438343164306366633766333663343663343134393030373763313739
-34376335383235353333666566303337333261373335396139666461633131373934316264333532
-32626536336663343532373662666664393034373063653164323936336532393263303565653133
-33663634303962646365656133333936353063383135616532343964336330653735393161323432
-38336162356632306434663537383662316437303361626361396365393732393263343035643433
-39373464626262323430306534326363346131626166353464363834383566346531653535653030
-32363133303637303830326235373030633931653062663335386665303833633839303266663931
-37333037633136663239323038393030366665326436623834393937316631663961643638616662
-39643761313265386430633765386238656431383737376161356630323130356535313930336434
-37343037363731303637386665343262643535363634613539383733653161313561663962386332
-37396338633236303030386336383433663166396363616530373834646133386564333835656136
-30313862663433393861656332643030393966303733626435373637303436613532343662626563
-62396435396562663836303465316134373232663562316232646237376238666465363261373430
-62646239393365646137343464643563666131346638363731393538313561313661316466356335
-37393838323839336264613031323833333661303763653464613133383538653831656262626533
-33356165653263316532363039336464316162313563373264393961613639613965636435663463
-32666537663533326366346166663164336538646665303563386466636337633961626164353937
-38333738323861656364393330663362626239326334346333613837333236633536366636663431
-33636633393037326664356630366264343930333566356664386465363264333931636464646236
-39323736343831303466386337623261323934383433623166616234643739643566343930373339
-65356237306662646264363266343261646463316635393136316338633761636365333134353133
-64333330313831353766346530656364643565353232626266353361386239396662363263383539
-36356431363062313962333538303235393933616465613161396262396566343065393835303330
-36643462303236623361356637656564396431613932343235373630353638643466623632383130
-66613562626333386530633365336239346431386335373934663239393032393265303134616462
-34323936396430303034373263366334396335663664646632303830356134643935643266333462
-30653734653238363866316434373130623432363732653238333732373733616666666464393636
-34353361663538343332353063356537663231646634333934383363613661623532376533633232
-36653734316630646339393763626632646139333935356434626230653635613834373264353632
-39353336383938303462643561336664376563326235383962376332396132346164626466346163
-62333838363039343531343237376636393566303330336431313230363464623634646230623632
-35373234376537383063383762333739353430316137353830323363313238336533636661633636
-63653666383838646130626432363235393334393861666533613336336636643432313032303233
-31646636313463303962336135373166623534333632623135376264653164343266653863313235
-61663432623264333631656537643136323833393838623261356163393630343738643565336636
-31383138656630626439313037313530323265306437386164663835383131373630653639323033
-61653030316566313236396131386532626135366263333231386334663132656434626137616334
-65626335633761653565303331623634646430356335323338323936323235313464396231333864
-31333333363233303463306333373037666562383932343665366661626464386634663534303330
-38396231396431316230326132383835306536383563393937333234633238333461303537386164
-66663136663031636461643438376131356165333065336632323338373064363035353065356134
-36326535346635343336363138353266366463393536366264613631623131343963393032666630
-66613166313435326261616365636535313565383432393965396266393065316634386431646132
-63303063646561363832656230633361633164626262663666386465366634633738323938613734
-36623234623263393130626635613163323762353166336439633663623731373564626536653363
-33633337303664343337383339323635356331663634343438363262343038373333343865303931
-33666561643365346539613463303037346638396464663362323962616538393133326364613963
-62626437333135346166333564326438333263396666306433313463613830313732393963323339
-36636130326332653637303732643463353934326264353738353039363631643831343163663261
-37643162343161343431333236643932323961613837663563363733616466316662363935306664
-65343431353233373435633565366264653233383434313436323336376630383334373233353433
-39613561353634653331346161643034373639656463356232303739663163363462326436373030
-38336661386262653333343365376262323733656233616164353731613333363662643439373061
-36393539353135333564303363623337396233636638386637636639646432376631353139316230
-39636462663164386439313961353032363833373566393565323539636561373363303562383464
-37653439326531356338343465626535346464356437376234393761666363616132373230633737
-30643662316233613530306466396436373933366361343536323136613032343964346266623937
-34326361343738383434373136333961363832643935393632663364373330373636383761326437
-65343832366361353630306164616637393733616231653832316366646630333064633063623436
-62373163323130346332333166343331343265653331643565646136316636633935646131313263
-31303365636130323133623232383136613235663066323261616561623935643938326433613635
-35636461376230613834353533653664653539373761366664663163663133303161393065313264
-63363461643330353362663165396331393061633766343661633262393230383461323737613138
-36663762393562333633613533333134363339653564393735333865666530643761353232633835
-31656632343831326361336437303965303538663832646537363565643033386337373537626634
-35616361643934326163306162353365623238663461356330333235633934313735306166636335
-38613436363531343334613030343737346632633966346633396334303432373934343061643533
-37633231333234333763366635323830383862346534333966326632666537326331353165396132
-32633730633031376662613833656538333433386237333831653032386464303333313034626361
-62373865636331383038353061663266336662303264633137616330333233646535356239363966
-30306163393334386632303530366265646365366335663639346464323463633964363633366466
-36353662623033383165313535363562643030376665333330373932663162396330386461636132
-63353136313563343239393866633265663562396630306263326532313636633538313032613936
-65353662373866353533323963323634306333373236343934376531376264363639393565366635
-36666133646665366632313164623330643337383638653734636564353862326236613631383632
-35316630383065626332643966656461303633633336643338393165383434353330313334346138
-34383430363337333439366664363339396662623837376562626461633838313661653935636539
-34393639363836306534616361376439663731353062363131326439336665303639316461626130
-35626165373963373662396234623662656562373262323861343238326263326432646434386261
-34636234333161333762643265396266653162613830353133653762386264326466613038386264
-62636439653939366336666362666162643131306562376635346134333635383462663966663636
-37653236653134313536646436613530353661633465633838663631333964323561346235613864
-37646636346232636234663364363336313630646162666162653439333936323365353933616564
-35313164393532623133626366643366363962303636316232383239323566643961393563643466
-31343064333839633838346266653162386239336234613865396162346638393435366136333739
-62353236346665343139343830363636393531333134363566336535333765646633376565323365
-31396264373136376565373632326437393566626233396565613230316461313632643135386564
-39316630663639386466383161646538643931646365653835613930383935316364363361636130
-35303965633436336337393134333239346663303564666435333864393431663338323633613065
-37386433636239326430386335313738373337663034343761623464646662633035313330653935
-39653764393564383161613966353835393063303631393035666264346661393663623438343264
-61343335656362346665306665343764666536643461376538383138336261646531626161323662
-64626139636432396564323338336263313062636163383732633666643264353662613934323137
-39646661643462376137376462366238313364313064613436646632386461303734343365663239
-64326364333439396234356236323663653966303135383134613531366565616634326132653061
-39323532306339393666333036313132616561363261623162386436643765393961323238633361
-66356265353337303865343563383464313734396166303062323462343766356565386134386334
-31613563363962663533303133623733323436383631316433636136353437353835393735396435
-32623433623561326166633763336136323166333430393331306530393631636663656466363431
-6130313132383162626264393061623966643633376535366662
+65646237323436373833326439303135393936363466383764663164336365623832653531376234
+6438303331653966383964383663396536663761666563320a633065656366336466643330303936
+33653539343061343839353736666330326434383430616638666338306332326636316138656164
+6336303733653563340a613062363264393031633339363263396631663562666262663136393239
+34393763663737666338373136633239666332376464616465376237353732356334336338636231
+64383237313136363461323734383665306537383566313366636562346562383364636663636364
+62626136653666636264643030333332666131663230643531303932333233643638356366613363
+61613933386664373066626466336330633332613566633535346237623135303238643965373963
+37386335303934306531653036636130313036386533343437313034616663623462386330663662
+66663238353665666363353939373066633933353539373335336239383762376562623465633166
+30343034643863306132323936323231356233306463656130353536396366343938643165386161
+65613230336237383963623638613437623136613530353439653133373466313434623530653666
+34623866636265323030366230356632663934393035646339646462633566396231633038653134
+66316333383336653238333737396262613535623266343733343830653531346432323238333535
+34333739313730633037363232616161313231626166333462383764396235326637353732316335
+39376161373031656236623939376333343530356361643134366563316662373938346338633265
+31366633346136663239353338623562316532316164636638393634303630613261303238633731
+31396236326235323962613937363134666537653231663836653362396532616235633939396134
+64313235613463623263303233373931366337393333393462343035313530363836333466616238
+35363866653563346231613361303162616361363839663738393565643666383765313333363136
+65333563666532383264366132643064626638373961633465613932616637616438623938653036
+62666330633330623632646636623262393330383166666139393164336237303738343132653166
+36613836386565346263663966613139346463313036366138313465363064356563393761346164
+31323131613132303339343162386266303561623064383465386138623933643832343263363364
+64653330643161343263653361356436653332316561643863386334303231616665326364336439
+62396564336332383939353932313236346664316266323139643461623062663031343462383432
+61306437663838353334626365336537663563316264346634623336633331643330363963633838
+39333662623237633565353139396632633034313463303264313362646639356439356232376333
+33376265386438663164626262313630303662396537316135646562363438633163613339323639
+65376266333037303066346533353739303465353937323864663862303832363261393066383363
+66316433663533396438663839336563646265666335656364333966383763363563383437366138
+66393563313835633532613735366561653433343164346563383430323164383333616338386466
+61656365333431646238646534306130366535623266386432303035363337653865633561643137
+34613162616131346361306539653330346637386631646335383233353136353133396637666339
+37356631376638323761363261303438653636353539336535646263666266643338626530363563
+62613961343461333531366162313536656532333763633861373931336165396238393763656561
+36366631363731353837663634316666323436396163636333373037346331386362393633323835
+32306533376366633363653363376666313963306639613366653562363762636236363064353733
+30633832383330313661666135646531346330393535613834323431303334646632336239343532
+34623330663630373562373432643334613664316165303736666432373164613764353536366535
+35346464633635636162663230386363356465306164616234396331626537633462623433313637
+32396431343666643663383931353133353137633431346531313263643934643039363734383738
+31333438666165353739356633653432613061303965353665323665626330633764386339343639
+31383763386465343836666266363338663265386262633062343434383139336162393035623562
+66333034343264643036386130346234396433633238343838663230303630613663363137323362
+32306264303864323438353363636664313935383565636135653264663538313432376639643663
+62323161623532656433643238613939363933396334353438663235626632663936346536323964
+39313865356262373463656638646631653934366532383834643266323530316135356235366539
+63643361353864653437353532383134343861633566623331363561323732323639313738386231
+33643931363535393765363036343334323464303436626332313064626338356565396631633761
+66306530356336363062663763356337333164303564363630303866333030303337303562623738
+34636230643233353437643763623435323466393632623939353533303163633763383835343535
+36386230313230383532376639356564646139613338633437363161666261643833376263666263
+66323762373839316131343834623532313232646132343834326363663731313566333331646137
+64663331646338333765383236363032366166316464366431323137363263346636616265353366
+34336530303132316639663036396438336466656361393632303636656265386435393134643938
+30346663326632376638363433363866366163626266633966333530626631346330323038666635
+39333135306362663364373532386662623435343136346564386666613137643663303732373831
+37383032383866623565353966396533363234653665346332343833383234316138333032626161
+34633836613630333066353732393534373338376432363061326538613336613665336461653666
+65343461653835623365376338326137303262353239333263353231663836313139613333306534
+64643237623262303532396163353939303661643762383436626664663765353763383834383663
+62386338333338616130353936316130336633626165393737303162316131313266633762653830
+30636635333963663439356530663638663336393230383237626165343037666563306663336364
+31653931313730303930383663646666613766303464376532663866363362336535346130633961
+63353661366664653164663730373165353839336635323136306266346363356561656535306239
+62646631396365346534326164326564386464386636373632646435613434383161343166383363
+31646639353038626563636631383438333832623834343233306335316266663734343636643438
+37346531646137383438393238393137356366663363363962636635353561656532653231666438
+31353339663736386638313135636136666364306562323134313064626438353037336531613065
+33336530656339636231393236393033643930396432653637326436643135363639396661663764
+37373835626531373831303837613231643336333861663934306364386135616561653264616439
+63633465653637336561373836646436383566353033636237313230393831306535383464643161
+34326164326633353033336435333630353836626530303830656231353061393038393735616339
+32313039343961623636373336616564666230343961383935616536616231376361393338326530
+33373338383234663130373563636162393966623036363531623461633631656161613166366261
+39363163666463316435363938623135326361363466346266333833396135353839306662303939
+38383431386139326530376537333264346264373565303735363861656637373234333965613639
+63336635316632353130356138666465356334623033356339636132393366366265313934643335
+32306435653666663035323463623239633939616464666132356361613035313861356262336632
+38303032666537623761633737633564383332336132663061653037353239623836356163316564
+33653131353436313565653531363762353336373363316464343365346265636439353261363134
+39313363323635653264343131653666623963366366616266663566636239373232333766663962
+63393630643166393761313839616236373631383166613564633564613235613338323031333762
+61326134353938393764343063363764366633663462383533633734386363313266326161303762
+35386637356466653037626262613439376165616463366338346338646563353637376130313438
+61656638393239343039613064633438393063623232663031643839323734643432636633303264
+63336536333063633262376239646536636435623863336236323836363939633737613232313564
+30303165303235653664626133333436393836366437383463313530326666656363393139393662
+36623438633230353563343731633035626565343963373630316132393564363230333866366239
+61633363356531663338613236343466393834666433366139313636653730303966656633373135
+64613966323833393465303339353637363766323965373631343337333564386138383630303935
+39643132313135396461323361643265393064363966393234663662396132316639616230326265
+33346463373935373833643764623231363134636337336365383038656437326333303138623566
+64663562316166356161353830666231356635653332366238353135323465653739306638353261
+35636430656164353963303435303736373833336439653133666166616332666436393637646537
+39373335333337343931353535363534636434316130376635353831386461643536623835313332
+31646564373533333031353365626433613762636463613336616633343230643764306334643662
+36653833336236663834323833663533653439653731323435336665306133646432376437613761
+33306533663135333532323838653130633361653033383334386435343832663434383031396637
+37373662373239363136396332633762616137326233646264373661383464333132343963383338
+30336331613439346138643531643333356135316538653331353530353232643537313661386566
+32633031613236366264626466633033336431346134326338656534303634356238653164366532
+34633466643235303362663130356232636233626666353161663561623634313966326630343466
+32306364613634623930656538336634336430306235356536663361343264366136306230313738
+62353436353638656664353438663361313235356365396336356464353832306238626162396330
+61323262303337383239646238396364623634386635643764353330346433663665383561326339
+61616164613931363337656264353439373033366133303835393637623265323032653361303961
+38353665643264396439616363323761626538643465333463363032616333306238326332303231
+34336461396664643332323335363266323036373036666235656165653736393836393365303530
+38386564346231623238313030396339666262383638666539653138356139316664333364313031
+31346133343731663234653465383961396465616432313432653466303337383332316133323662
+61363731313662313035373136613761653030613139363133316331356532393133393332613039
+31613934346365633935373761303566656231303766303130363337626431396661343335643463
+32376235353466353831346265316336363961386132643531393831373830343230366531303933
+35646535386132643964393832363239353637383838336336653230353036663461653935666463
+33333938636237636135396637616666353036313332353666303166623531353838323361336364
+35656132616130363133366231323164323635313632353835623236373638353237386535346336
+31323661636366346232616563366230336562326132646665636562616561383665643561393232
+62623864323533656636326264626230666633666563663833386266616233313638653836623438
+32393162396234353262356232666462643466653461633532343638323533656633306335623565
+38316330323438383837646265323832613933316135326234383864333737653735666438323965
+61326266646663363162303036343139623265303331623239356466333430356431333664376339
+61636631316436656337353833336630373036383736353166653434393433333664376562346631
+34306662363935613633323539326164666130363538643038366265373734643961656465623830
+39633862383636643939336232323832613832383465666239343236363566343363323836616661
+65643364663538316138383038626161303331653832656337303933356664383435376336313832
+30313832653064316239356661323138383762383864613233333530623131376237356136373932
+34636531316364326563373931306635323964616563643563616634643164373765336132613330
+30653862373966333630613635393234356338346138326135306635373666613533626135396437
+65623865666634653665656364393532633766326661313136356461316661323663363838633164
+31386234633438636165373139643337636532363036643632366366636236613164336638663839
+61326462303234326561376636613463316432653762656236396330303465303065633534356433
+62616438336338646437666564336166386333623030306136613236653334306634633666363237
+30333333343032636333383238643732373034646362373831386162316431383235326132363539
+35623737636461303935323962373362323235356666353561663234373730383262343464653265
+61333138326466303230363936383862313334633130336639396630653233623738366261626133
+64356635643030353263623936623766653438666466393736386365383431666136303666663164
+64633932393362356638646333623266353938383564376238643465623165666330313936336566
+64613333633862316234363830346264306565666236393735346466316364306365636164643937
+34613335343532343161303439616464623331383133313133616630366464383838643030633366
+38396230613332306131323434636336636535306437643332343937626336353438343434653539
+32316536386563623537366236653639663138386238623637633836323538316336386365366162
+62346534386332646430656132653761306164653732323461303763363736636330366561666564
+35623536343139666339613961396633363562333637383230626566313133666237643366323930
+35626231323364336531353733313931306163643733386565623536643766303535666666616536
+30636231633330376136306134383531643833663962306433663064383538646133396334616364
+33333630343263353736626330623637393731376138363730323963373661643534623533643863
+31363966613963646334303737616562613537616661383461363136373936623433666364393039
+61306139383531646630653461333231373963626538656166396431666130313361373265666339
+34333762396666353330366334396465353731613734383265336365396634313835666363666531
+63393831336466626334393834323165333165383161306531616532316565316633306538333566
+65353337343862333065393861313464383632666664376266373365613066323037616566393035
+64326135353038313636333163663562646332633066316232653532623265336437356362376364
+32656361313332613261353232396164633332616163343333623236333639613938326633323132
+61653432343436353539383463346365353231353935646431353437313437313139336433383365
+37383763613437636435376265343039376266623534653539613438353335363937316137323335
+39396537316662613362636263363736646332396233666362613933633464343762346332366339
+63376335316261363837346238303361616534306237366632323933333965366632303235646636
+31306263653766323935306139333930376339366534363634646266623831356333353566623137
+39393561643630383262336432386266303531666630356433613233623334663834616264633064
+34626335383166373933393461353738333863643230343834356166653538653135343937376137
+31633537386133313335343164623833383833303632376565643536616363643830376462346231
+38353431653330366435623062303634663332613038616563336364656333346537663365326161
+65323437623132376235343234666263383566383134366566313633623431333834303762353138
+34623338316131333062363635636361623336643332373462636537656635353066623531306262
+313666303466366361313532616333623131