From e03943b72441ae213f843f6e345c60d982f56b29 Mon Sep 17 00:00:00 2001 From: Ivan Reshetnikov Date: Sat, 19 Oct 2024 13:00:15 +0500 Subject: [PATCH] Run authentik --- authentik.yml | 7 + roles/authentik/tasks/main.yml | 57 ++++ roles/authentik/templates/authentik.env.j2 | 14 + roles/authentik/vars/main.yml | 6 + roles/haproxy/files/haproxy.cfg | 8 + vaulted_vars.yml | 335 +++++++++++---------- 6 files changed, 263 insertions(+), 164 deletions(-) create mode 100644 authentik.yml create mode 100644 roles/authentik/tasks/main.yml create mode 100644 roles/authentik/templates/authentik.env.j2 create mode 100644 roles/authentik/vars/main.yml diff --git a/authentik.yml b/authentik.yml new file mode 100644 index 0000000..e597e8a --- /dev/null +++ b/authentik.yml @@ -0,0 +1,7 @@ +--- +- hosts: webservers + roles: + - name: authentik + postgresql_password: "{{ postgresql_users.authentik }}" + secret_key: "{{ authentik.secret_key }}" + smtp_pasword: "{{ mail_users['auth@comfycamp.space'] }}" diff --git a/roles/authentik/tasks/main.yml b/roles/authentik/tasks/main.yml new file mode 100644 index 0000000..73c29b5 --- /dev/null +++ b/roles/authentik/tasks/main.yml @@ -0,0 +1,57 @@ +--- +- name: Create authentik networks + become: true + community.docker.docker_network: + name: "{{ item }}" + loop: ["authentik", "authentik-redis"] +- name: Create authnetik docker volumes + become: true + community.docker.docker_volume: + name: "{{ item }}" + loop: ["authentik-redis", "authentik-media", "authentik-templates"] +- name: Run redis container + become: true + community.docker.docker_container: + name: authentik-redis + image: redis:7.4-bookworm + command: ["redis-server", "--save", "60", "1", "--loglevel", "warning"] + networks: + - name: authentik-redis + volumes: + - authentik-redis:/data + restart_policy: unless-stopped +- name: Create authentik config dir + become: true + ansible.builtin.file: + path: /etc/authentik + state: directory + mode: "1700" + owner: root +- name: Copy authentik config + become: true + ansible.builtin.template: + src: authentik.env.j2 + dest: /etc/authentik/.env +- name: Run authentik server container + become: true + community.docker.docker_container: + name: authentik + image: "{{ image }}:{{ tag }}" + command: ["server"] + networks: + - name: authentik + - name: authentik-redis + - name: postgresql + - name: haproxy + env_file: /etc/authentik/.env +- name: Run authentik worker container + become: true + community.docker.docker_container: + name: authentik-worker + image: "{{ image }}:{{ tag }}" + command: ["worker"] + networks: + - name: authentik + - name: authentik-redis + - name: postgresql + env_file: /etc/authentik/.env diff --git a/roles/authentik/templates/authentik.env.j2 b/roles/authentik/templates/authentik.env.j2 new file mode 100644 index 0000000..202e100 --- /dev/null +++ b/roles/authentik/templates/authentik.env.j2 @@ -0,0 +1,14 @@ +AUTHENTIK_REDIS__HOST=authentik-redis +AUTHENTIK_POSTGRESQL__HOST=postgresql +AUTHENTIK_POSTGRESQL__USER=authentik +AUTHENTIK_POSTGRESQL__NAME=authentik +AUTHENTIK_POSTGRESQL__PASSWORD={{ postgresql_password }} +AUTHENTIK_SECRET_KEY={{ secret_key }} + +AUTHENTIK_EMAIL__HOST=comfycamp.space +AUTHENTIK_EMAIL__PORT=587 +AUTHENTIK_EMAIL__USERNAME=auth@comfycamp.space +AUTHENTIK_EMAIL__PASSWORD={{ smtp_password }} +AUTHENTIK_EMAIL__USE_TLS=true +AUTHENTIK_EMAIL__USE_SSL=false +AUTHENTIK_EMAIL__FROM=auth@comfycamp.space diff --git a/roles/authentik/vars/main.yml b/roles/authentik/vars/main.yml new file mode 100644 index 0000000..81f922b --- /dev/null +++ b/roles/authentik/vars/main.yml @@ -0,0 +1,6 @@ +image: ghcr.io/goauthentik/server +tag: 2024.8.3 + +postgresql_password: +secret_key: +smtp_password: diff --git a/roles/haproxy/files/haproxy.cfg b/roles/haproxy/files/haproxy.cfg index d3aedd3..8133e37 100644 --- a/roles/haproxy/files/haproxy.cfg +++ b/roles/haproxy/files/haproxy.cfg @@ -53,6 +53,9 @@ frontend www acl host_peertube hdr(host) -i v.comfycamp.space use_backend peertube if host_peertube + acl host_authentik hdr(host) -i auth.comfycamp.space + use_backend authentik if host_authentik + acl host_comfycamp hdr(host) -i comfycamp.space use_backend comfycamp if host_comfycamp @@ -127,3 +130,8 @@ backend peertube mode http option forwardfor server s1 peertube:9000 + +backend authentik + mode http + option forwardfor + server s1 authentik:9000 diff --git a/vaulted_vars.yml b/vaulted_vars.yml index 61ae16c..fc58abb 100644 --- a/vaulted_vars.yml +++ b/vaulted_vars.yml @@ -1,165 +1,172 @@ $ANSIBLE_VAULT;1.1;AES256 -64303163646665613436653936333936333930323961663039363765386536396433613963663364 -6333336135623536303462333733353339646530633763310a303933303933653233393065666336 -30376533343264646362646139356430633063633231316433653463393866623965643336353932 -3739666463323464350a613837663136333932306231636535356537643634336466613764336633 -61303065333430643461386434333663663832666130656632303361306662336562316265656332 -32353738313761373034623766396235306434653133323664363665333232633238333765343039 -32373135343065363563366138376265386562333361393738663261633534396531313432363837 -38623935663937353739383533353432363031313236643830356232383931376363633864363930 -39313939366435643836363636383039353561626335386266353239376264616462646264383334 -66393762373564336534353963366234336263383532343038323032653234633636663632383061 -35333335633466653231343737653333393539346664613561396161363061666231346134663763 -66373465616164643135343334373465313465363565303165633635323035373165336435383531 -33626431353430393930303339613035663836323735313733663338663734343966643636353932 -64663964366433393232353031353635333263613738363536383534363637626639383035313231 -63306234313735636163306638656535653234396463303865653663306362366636653536663065 -38616535383331366565316163643237653166643539393931396363363836613766646161353431 -31663630373236376537333766346263646231363330653762383533303834336436626165333361 -35626562663666393462346265666164343064343731623238383534636562363732373866326138 -64373439643236323265386533333331663936646463373131643737666531336165366366656163 -31383231376130636231353062613132356638393163356533306236393461643161343136353734 -35616163303433663036393534616234373038653235663836343731373661656366386239306534 -63353039356561636535653335363965623165393436363639313238626335373461303164306262 -37306365623033663865363332613030313837396434363963306231616231663032633834343532 -38626435396231636433626533633662633035626562313762333131656439616138366161373265 -65313532343065333662373665653638646334383666646539613830376664306263633930636463 -39353135366434653535393961656466626234616465653336663130373930303134333134393339 -64653162343063363530323038666361376439626437313431323938643161643763663232666230 -66363662323931363762326539623566306234366238396261393166643335346436653065396138 -32353435346665393966623862366237333435636461343765323436393961313634666432373436 -35643735653531666664303833643531353838613430363239396337396235643134356535396466 -61356663383165396463393663373463343466363934653836343330376536333261356138636535 -64336331396234313937666235316133336462633936303235396234383638656466346135353634 -61333464393364366666316134653066373231343133616435663239323561363237336634356532 -39663839333561633131316238653035343363646236343137353965383637623261323338666632 -30323431333038303635613965316162333332626661623231396634626665316335653265336130 -37623235343165373939643731376333306237343034313335323235623436396233636331383037 -64376261313530326163396261336539333833633138623331316637343637653262313833643266 -65353530373832366430333631386166336432666236333363373133326237383238373065373239 -32656637323865303539366463386435366239633664656637316562643334613139393131643838 -31656662643263363665613664636663396534353966313536366361363936346536616365623639 -63636635346134383032376139313131643535646264666435663931653866363235656438613933 -32313764363332633038363166633731633130656664656135353666333266336639346565396366 -34313631313832323733336438643433393934313335383266613033663136333363613362646535 -62316630393438626431623939343463326333373333363337396235343031316461333335393962 -37646633373830383566623539333962303961306263623361653738383533306262366135323962 -66313761356463636435363466343966326634373364646432306330343161336463393733623164 -65373236633237303037633839363662366138306163343666373938653138653431613166653366 -63356664363866643731333333326537326566303864363533393239396165383938306432303865 -66383662363936323462656330396631333531646139343938376331613630373235336465353065 -65343832343135393033366133643438653762343736393037643531613430623737313438356535 -36303838616635343833643165346464613564313131643863643835343230323136383732343665 -36643966383331633739393364653936613138386331623161306564333138303266636166643030 -32353634316333316661656231323231383430326134623866313639663763333665396166376365 -35383336613830383963633264333633356663633265663962363334333636626438653962386363 -65663036376439663337316266343664643430373466626332626263353533653330303135646130 -36613333373865353038386238393036623866396132666265336465393463653737386138623166 -38303261393739373931343432363033306436386531313166376630366163376665343265653735 -64643132393962646332316330336434383532653435393064343038663036373932643839663535 -61363735633432626535616237633261373663663365326461656131346239316463306466636665 -34316330613866626138343436366530616564663737303632343738626135616533393139663335 -30663362313130346438356533373834666331303762653732626465643436346336306635323230 -64336664343333396636363935393536613861666366656632373336373332313861656665353362 -66616134663565626338353836356432646234306531386138633833366630313834333265666538 -38306338663765346561366539666537626332666666623964643831363034643864356635396366 -39666639393735366464333361643966313962316638313235306563366562323066346634343235 -62626361613533343639343764663836376439343633356266626464636539643431386265623634 -36383735636434316138323161373533363630356433653230646565333036633966326235636561 -64356563313263343766386638613530376562653233343432643238323838336234636533373534 -66376537623139613265396663643366386134646339656465663439636331303633396639313139 -38366263353732323835613964623538626162383838326635366263653032393366663738376165 -36353366643731656364333739663765363362383133333532316164353837616263666338343665 -39313034643236653230643430633065653132383130373437643733653164353864663937353765 -32623962313237383233613331623261396466353038313365383465646463313138313735626661 -30323461326263353532393066636231623631333537653561306434653061303536386533303431 -34373761666562396332623763626634643563306363623362393031383363383237353032653038 -36313338366332303962333434616163363230343039353036393263653439336664356364303761 -36663638303938653236323739326636303466376438623437303334353666646461666536363338 -36373831663732616634363738386532653931626239663838323534383961333262326462313930 -66356637633338613932626463613762343634633934373136346461666533643334306237626236 -36643735646465623464303262643065313162343065386634353064386135366233666563363963 -31376136633938316361346332376632313132373235656365643664306361653937653033613164 -39363765386335633561643632663339396565633936663266333764633861373865646431323338 -31666236393961366138613238613537656135323965353033333337343836663036613338613862 -39613537353833306233326664336232373763346566313134643464376564633766366130633139 -31373232646565363636636137336464326431316134366330326432396637383230343865306239 -35343766316338363166663731643166383766346239313736666237623635613761643664343733 -62366137316539383239666535626431326261303565663061663666633838303139623832333632 -65346235653236623131373463626132316535383330343135323563373633316432353339363931 -32353166366530306133356362663661316565396236303639306432636464623237383664326631 -30656466643435623431363835353038636134653531303734366562633536626633366164363666 -64396335353462353831323332636633363263643032623364613633323130636232396337333032 -66386563323962313338343631666362306339356338343462393535666564326633396662643533 -62623463636337306234643838303133363338313232616563353463613566383432373234343661 -66313731313435373034613930386162633536373834646164323365383261643763393562396538 -34643366386663346433643966306662373265313563386535333438643863623265343162373731 -36383264373837646565336362306666323664663433646633336335343536666137616239643833 -37343530363462386536343639373561383936363661343535396261333134333139613864313130 -39336538616565386565323035616162386130383761323738666137353630356365613764626335 -66383562373533653666373236343532623665656262383464613761316563303833383239393461 -35653538346530656163323233646134373836373233633635343432613937376537306165613863 -32313561346239373030393566666561326662663035653433366561633737363831333262356164 -38336531343562336166383536336264353964656433623330343939343239626338333834626339 -65636331656334636533306138316363616365363564636233663638333432323333653366303765 -34373637656134663464616366353266383263386136336663306565663563316566343639616263 -32343230623164646237396230643630323932336566633666323533303037323135373236616166 -62356138653364316165373735613135626135383739626132343239646133303439373439373131 -61306366353731636136333438373764383330346132356139333437653037376633393839323761 -35303730336662386435373731353837306263636437393063613162383134316631343865323530 -39356234633238323435303164656362333336393733626162613863303335393666656235646531 -30383932633034363463633861646466316464303934653837306465346630353964663464663838 -61653362636136373366393434616262373833613561663165373532663062646164666133363139 -36393764653032636431356532393932613535333966346564613636386335396561623835303835 -33383965636132653332353665626634306335333061653631633431643263653165323565626434 -66333964383464323031313538356135663931326538333930663365623132623931316231303330 -39306537343237373639626166353333646565396537616562303431363935643438373461653739 -66643464386631376462613938363262363865326533663937353232303138646535346665383165 -61343466653437663639306165376233323964626166653235613963306235633163393864316463 -30343863623063383931323337346232653534663930646435333031656566353138346231633463 -39636464323231326365643938656237363133633234326661633834333939653066633932663830 -35386263663063393464626438343332333933366432336232646564643862343966313831356633 -30386262383837343765616338303665653865623939393832316338616132666232373339633264 -62356235656565313438373565623736613365323730636563323261316434363638643639643833 -36616434363835363836333764623966653838666439323161353232383334663931346136633265 -31653834353261373431656666643336316161626135656664303731343337373562303237326530 -65396665633664663434353366336466333938303937333165303130386133373332343339343336 -64656537633861663532393138636664356639623531306538316233326636666563623634306630 -38666163623464306532396333646330346533656266663862386264356339306235333265626462 -63643162626263333864333761666566633335386263383034363235633434373538653938323136 -66303638303535336365663832303937343231303636373533666533643331303065633864383533 -36663638323961653537363039656431343939336131653664326231313035373864643637633931 -38326438316335383238363163306436336338383937343438633365616432343035326538316665 -33373365343561646662646162636539373061326461386566376633353061343033326561633664 -65636262343566303836396436333737633937363661323766633837363936346561393735633236 -36393633336262633561303066646235313563653163623462383565333637373830383538343033 -64613063313565386362336664636631326336393666393631393661623762383733663835616432 -37313661386130343232363063663135323263393264333033646161356236373433333733396439 -63333136626264313634643238623562393463623163366339343234626333343839636438663730 -37366633336263396461643136653762616262343532383562636263336662326563326230373633 -35626164636631353035663339316631333332323233643361643531303834303939656632386164 -61303235353766666138646434396134663662666564366235313139623231303630363236656162 -36373338386231356564356537383437386266666431316365303937646130346332613036656138 -62353166613333396230663434663938633130303165356137623430653039396265363162383931 -39376435633737386463303966393331346538656535376266656462323061643263383765373930 -34336363396236613630333130653336643538653465356564666131343164353862363637323938 -61363561353734633636646334303034633031653938663866333535316236666231393265363934 -61363664623834393230343563626531393866363537396430333734326534616335376565666237 -39613836323862616533386364666563363431363861656466636636623464656365363530656135 -66376463326132323637333138643163663635383161383362353565373335313935383836643834 -62653732626637643934343935663738653231326138313137323034316130363137666532313765 -32326662393161383062343762643235363836306434313735396663306266393463333134383564 -38643334346631383430613830363164353339626363646633316564663562393164633031653538 -38643637623037363164613635366161646164646561393235366265343539303562376166393939 -30616533643730333062666432343235623437313037383463653165653733633362346131313263 -32396163313630313338623239393565313264643230383463313535623664633563356335653231 -31646636313363663731373439613637663165336264666131343937313438346632386265663732 -63336166656333373263383735326665653964643835623830363761343864393838326133623234 -64383866626634393239313438636631343262333534333138643934346235386334303432383962 -34653039396638326164363264366139313865633034373433393561346363373332393634353766 -64303665393338646537386434303961643063363235356533643436646637386138326238656564 -39393334343165333738363137383933333263616636626538336566623831306333633133616139 -65643062643861343533316332666662393232636338323734633435323539353237656130616362 -33383437373265353465323439343437623062336236653364396437303366396635653036356561 -34333662616538643832623633653963353335326562613931353532636238626538353034383961 -38356164663161386433 +62303238323030396332633131343161616138373937646534376462633863353632343063303063 +3665323164346365336532646364636363353636356535630a616137356630386337373564333537 +65373834653363373432303535333563636535656431316132326632356136633931386332323363 +6433613965383565370a316661343864623731346135656563643266663131623632363536623866 +66323361343136343566346532376132326438653133303337383332303533666637663632333633 +66643439343231633635336164613637353461636430386461306665636434383837336433316135 +32623634343264333339613537363739613932386564306430373162646535663665316566396663 +65306365653537306164663631306433363038653566313462656434656537323133613464653662 +66313535646436643763616534623761393634376465613332326533343532326466616437323338 +65653166346563613637343134386331323038346136373764636135343162666530373831666530 +33666633363464653139663636343662306432376538316162643663626430396435363464626138 +34623863663737366131666632313136353635653431613738313032376631373064353966346134 +32613633373762323232646437326663306265333333616238643039613131633066336439376330 +62393062653830316436346563656265653465386266323131623039323633393534306232613337 +37316336383639313939636264633363666265393438353439396530323239663734336330343031 +30633537323937383533313562316233336532373932336163656263636239653066663765373539 +64663166396430336533316330313733343838653739306334333132653731626236333437376136 +36363430343362656632616139663164356434633534366663373438323931363532646636663933 +39333166653334336437613139363535356261373936636433356366653663356631306138346336 +65643236353064306364643639363134656635303162313235653730396166323763306238353836 +34653439623937616431626465623139636364333062393636376132333661353330363465626137 +35373836333134356336643233303563366437326562386265336564643761656465333934356335 +61316539333931396233643466396138653164636335326563383866616366373161623061663834 +31383436636262383663333639313634633239363466326135373437633761363830656161303232 +37376634633361303235643330333939326439376564376630616232336636623564316161396530 +64626331613562386338366663363961366439633634653665646131306330333137626330333166 +35626461306463386332656639663938323166643866383534316333313332323032646665306237 +65626431653366353533393835303230306430363366636161303735343262383865633164343030 +65356336633335373063303337323538313533626531396532323161363161666438623835303361 +34626132643465346530653263306565343166373666313862623931366339373961373836636661 +65653861396466316466323764383539643662376236316636323736313866363132363263646463 +34623064326130313464666562643838646233383836366238653137326634643761363766356533 +39626637343331323634333038626238303162666436303462316232623266643639626634356131 +63323136333763393739386236663761383836653631373264393965343662666363356231313933 +33323864626330656535303335396533623031353536336537653230373134316139353064353631 +61646530636139323065383238666661333763356438316335666364306562393039363233383464 +65343939306630376361666232356634323837656133656334386636663436313137623561386538 +63303237643937376631383532393761383265353935613063393763313934613430393135386331 +64323866356261663137376466386537343965323264343633623730646237663464633963366132 +38336639643939393434383033396363303063363632343131373330306461346361636162343139 +61626164636564613564636637373638313664653038333664346131313539303634326233333264 +37303933343030636230616332643962653061623161636530626261376234653730396432616432 +65643631353831643936353136333462643039303432613735393236363765393265346233666231 +36653433393761393333336631376139393939386639306337376562303231626239313031326330 +33613262616461383631326135343166353563373439336232613339343331306662663736333433 +37306132633466356531623561313030346566383064356236636538353732323436396361643439 +34393162636263363338333165363735396535613465303531393466316438623665626265396534 +62393633393239386665313162626637386162316463343235346331643166383966633634316332 +36643065656638383961323062343665616333386365393936633864353138646630343966366533 +33356438643063316431663962626431343635653065636664336238643030356464343839666330 +36343130626365346465323234383538656564616531363763636132636236363166363432326234 +62643161316334393961653335623733303163663730646331326464333265353364363331396634 +31326239366130343238613332313266623933373965326432386538653138306263653333373433 +37303962646263643833636233626634336234386136356266386237376337646435656262323032 +62366661363537313433633965363363616330663030303036666561316239306131323838386337 +38313734396562373836623435326463613838396439376633363362663034353738626466396133 +34323037336263623138363738313932666435646335353834373532323631343363396338623366 +66326166336561396531306534366463633464663135346236663431356533363030396262383463 +31396463656564313635616662626636633566313761633536373935326230363434623837666562 +61393232636362383232633831373934343032663433363834383339336139396264343935353139 +36653537393264303063356165356532646432636562303761646236323965353033383535323137 +32643664613131383239613331323635633363333439633565663731633464373965653134306536 +32643737343631396136653763373733633331353362653239346537663435623566316136633466 +38393164346562353462353635306137633164366339306235396462633537316537663937356338 +63636664376162303931353462303432353633383765623638636131316630303131316161346166 +38393834613539316364666466646564653632326462626132643735366565643436663063373764 +32366237303562336435333561313332313739646564376233336366626437326262653962626533 +64393733346437303534613037663233373230643336373962633463613930653763633732333833 +64323438323165643464343536396233623562303461636561666663623635316363643161613164 +66313865333736636230333136393638666231386164356132313932393338396564336338353763 +32323936323362326664613164366635323033313862386663353465643363613964613832336134 +65636336393839343364393130356164663730363932646638363564353139303834303630623534 +35366665303730613033393833623163626635666362353635356535396161313333633063343232 +33363861303530366136656230613063306563326631663665303261396335373430633162363666 +63353636303331313235306636333431366536353135343336386537653436346536326135376336 +66323230393863323833343832366461653038313766393161316632393065636465643835333535 +37303764363031626263376566386633356335626539353863313861336130376138303164653839 +36356333306635343535333437646562316262383531626339623534653733303466653435653332 +63393664306266333465613032303230373562633839623832633539326337313662356337316464 +33363437306630393666376532653261333434666163393139623963353661316264646536613938 +39396466373562643865343236323964656163326433393136636565623132316466303335336563 +34656266366335316131613965636139666363656239636336306137633535386239663639613235 +33623835343835663262656639613136303732333631343165393763643739313739396364323337 +61643138626133363831363165313234313231396265326335643564343237306239333663376565 +32353834373735616232343662623232376433623833356232323239636631623864336435316264 +33663363623035383865643666396130383861386137303738623935376163316438356162306135 +62653763613536623337373236636564643762613362303466343139353764396431393430363832 +39323330353862303063356331646536383533306330343062653939336364643039626331666666 +36653130366137383533313665383065626236383363393164646339356330653032633265373761 +62613766303166656362376231383561626565623430356665396234643934363565303638326433 +62643433333037643034386461343464633430386432366133623332313139373037313635633831 +37653431393963306263653166663266646462633463393635303339376664323836343030353931 +66663030396634336363343233396366343836633238623536653331653363306361393934376164 +31306335643030373639356635626232306331353630343530626531623235323961303339373865 +30356531303938323431313937353134393162333761626535356365643232383032323433633465 +30343534313763353834666333313235336564646237666133373330636533323532353735363863 +33373838393035396162633066376462333632636232336531633936666366373861636232373364 +30333666343836333436383363356261633335613831336662326364343961333462353035303537 +36323862363762303336396634363564353762646432383833343965643965366533306661376133 +39363132333265306232363930326265653537373261613265386435333862386462666234316332 +39393136383336626534393738326438393761633339623833336530333462363362353237323332 +61623638646630646261396364633833643434633430313962326638643165373637613935383865 +37326535633238313234386362333937353837636563326133666163346431383736616363623539 +33313939626133393464656330666166376533303064623636633163336563306437383336373030 +32316633303162343737323034383264643638306264623166373139323363326130646336623434 +62653433626131323837613736373036303635343761663738653637373335636562616530313166 +32643931343537383331363233336236373963376435643933613637626638363665623061653665 +37363432343266663531323534656333376566633139666164363031643664316531663765633564 +63366631636236313363386138626232383061636139653637333263353762353632633439343166 +31323562623332643135363662643434653238323538383432373861663733396334633036613738 +61303934386362633566613239343463643265333864373133333164373739343538383931386330 +32306630393338643830633461653463613337313661613064313332343864666231353366633030 +38346563326564633462663036666331633038663639386162313835643431386166383466626332 +32326161623535666137386537303562303634356433343465626233366639393762303562303163 +37663366343630313434623665646438393539643136306333333630623133393736353763396630 +31306430373266336337633364656634356539336335663165643631383030616262646664396364 +37633236313935383166346365636466373739616661306536306631333735313462366634393137 +35623736646264363664306139653366353466343766653264363836643633323331633334386532 +35313166396163663532313032323366336238636262396361613130306239616432333338636430 +33376438323863343031373633336234643839393235386330363939303038376639616330303931 +65383339353837353531366563306337653233386162363137643965316330333566653861376132 +63353236396438323839386331393731306237383532666133616132353430363836376631653335 +32353262623439636466373038663564313234366163646365333836336336343238353239393433 +34303062326461376430313761386236326631383339313332653430656133396230623838383963 +64666261656365626537623436616662376464376161363733376461303039363135323835396165 +62333538643630353739623233346530626338643931656566326137643533303266656462626462 +61663963303236353562396532303734633863643030613830613666623438373764363937636566 +65323137353965316233643038626632396432653431326533643961303834653231376362343438 +62633232353962333533663366623335656134373364343365393161313263616336333330333538 +36653230336236366139356233663434396335626565336566313436666539376433353562353438 +64346464336430616338326530616365373364643733323238303339343633663936636566363339 +37303635643662643333313030643735613635386537636331313637303439396665386463643537 +32643163356139313465326666313364633366313862323338383737393566626637303965636466 +33656631613832343235383334373635303131643666313565316330366132396333326535663232 +32323462353362303166356535323137323034373832613839306164336634376661656662616436 +39616264376339376566343332303965386534656463343831356166643931616662363437653639 +63363833356534363637333130633166343764663065633763326465333336316331386436653735 +39613366666439336664363161313163646362373762643366386334666565653163613861306433 +37336263386439343237373035623364313533636534656234623836326336306138363666343434 +35616362303438383639393139386362396233393765303966653266646431633564656331353336 +63343864326465643134323963336132363034643538653732653736313761306663383832343564 +66333334386432373936366530363331316633313936633766376561333635623433356234323530 +62336330343665373836653137306436646236646237373331333737373433663566643964613231 +31373637386462333038386362303964656638363365616335643032653861376366333533613366 +39633765663433323933376164626533396663653037653364396665636166326237343235643962 +39393536323432633962383162396533616433663336353536376339393563333933613836366663 +37366533376462346139626665323366363331396632323933363566613862383437396461316664 +33623930323331366530323263326535396230306332313638356235623934643634376666633761 +64343930326238623730613331356663346338323162623331313361393066396662663034643634 +64313936306438313362623937393365386533363435306263313965346338326564656432323233 +35343131373263353364313238663033333433636462326266323230383964616539373132303434 +30393565333462393834656634346233343461323261306232326531633133623531313964663063 +66656465646131343835383832363836373961346162386162616161333939343763333234656161 +65353663303161663735613432663734326634633463636638633830316238636263333735633963 +36343861306366373663336635366139303333643835376139623666623062396462613835313138 +37653964626434656235373936613234313561636361636531376364393331346432336439343137 +63353139613065303266633336313535376630653066653361336362346335363362333336383864 +64323836326231313862306630633832346234656436653135343166323038323738333964346135 +38653263623563313164336665613965376539343166363263636233653331653638363932303532 +34343165353937663539666333653331636233623565373662376362393337653130373735326132 +34386134656165343836393630626235376537616137666439333634656638623331333432633436 +35613937613637313534356237386336366538653162613733626666366530646238363330656566 +39303035316338333531313631653836353831353831373766666564316138323536313138343765 +32373538663432363231333833663633326239313337643831623937393661313431326539666461 +66333238663834376331666631316163343833383834363366613938343837653136643935306335 +62636361376632326164643061636631323364393731383833613661336335373763383161333535 +62343861333634663930626635343562313762633036376132323933353232633564323038373565 +66633735643933393965393030333939653338306637646532303538373534363961343761643866 +39336566383238336563646636313339313237326637306134303636616130633238353665643166 +61666637396562333134386462623134333463303661303637393537666330646630346531313938 +623563313335646235323464363837633438