Compare commits

...

2 commits

Author SHA1 Message Date
8fb6ba4aea
Add email accounts 2024-11-11 15:09:30 +05:00
a62e5ae9c9
Make forgejo role generic 2024-11-11 15:09:10 +05:00
6 changed files with 414 additions and 285 deletions

View file

@ -2,10 +2,15 @@
- hosts: webservers - hosts: webservers
roles: roles:
- role: forgejo - role: forgejo
postgresql_password: "{{ postgresql_users.forgejo }}" root_url: https://git.comfycamp.space
domain: git.comfycamp.space
db_password: "{{ postgresql_users.forgejo }}"
smtp_addr: comfycamp.space
smtp_user: forgejo@comfycamp.space
smtp_password: "{{ mail_users['forgejo@comfycamp.space'] }}" smtp_password: "{{ mail_users['forgejo@comfycamp.space'] }}"
oauth2_jwt_secret: "{{ forgejo_oauth2_jwt_secret }}" oauth2_jwt_secret: "{{ forgejo_oauth2_jwt_secret }}"
internal_token: "{{ forgejo_internal_token }}" internal_token: "{{ forgejo_internal_token }}"
secret_key: "{{ forgejo_secret_key }}" secret_key: "{{ forgejo_secret_key }}"
lfs_jwt_secret: "{{ forgejo_lfs_jwt_secret }}" lfs_jwt_secret: "{{ forgejo_lfs_jwt_secret }}"
minio_access_key_id: uTJp8KfKSETa1uYMZnSM
minio_secret_access_key: "{{ forgejo_minio_secret_access_key }}" minio_secret_access_key: "{{ forgejo_minio_secret_access_key }}"

View file

@ -2,24 +2,90 @@
argument_specs: argument_specs:
main: main:
options: options:
postgresql_password: user_uid:
type: "str" type: int
user_gid:
type: int
tag:
type: str
root_url:
type: str
required: true required: true
domain:
type: str
required: true
http_port:
type: int
start_ssh_server:
type: bool
ssh_port:
type: int
ssh_listen_port:
type: int
repositories_root:
type: str
run_user:
type: str
work_path:
type: str
db_type:
type: str
db_host:
type: str
db_name:
type: str
db_user:
type: str
db_password:
type: str
log_level:
type: str
log_root_path:
type: str
smtp_enabled:
type: bool
smtp_addr:
type: str
smtp_port:
type: int
smtp_user:
type: str
smtp_password: smtp_password:
type: "str" type: str
required: true install_lock:
oauth2_jwt_secret: type: bool
type: "str"
required: true
internal_token: internal_token:
type: "str" type: str
required: true required: true
secret_key: secret_key:
type: "str" type: str
required: true required: true
oauth2_jwt_secret:
type: str
required: true
lfs_start_server:
type: bool
lfs_jwt_secret: lfs_jwt_secret:
type: "str" type: str
required: true storage_type:
type: str
minio_endpoint:
type: str
minio_access_key_id:
type: str
minio_secret_access_key: minio_secret_access_key:
type: "str" type: str
required: true minio_bucket:
type: str
cache_adapter:
type: str
cache_host:
type: str
disable_registration:
type: bool
show_registration_button:
type: bool
cookie_name:
type: str
cookie_secure:
type: bool

View file

@ -28,12 +28,12 @@
become: true become: true
community.docker.docker_container: community.docker.docker_container:
name: forgejo name: forgejo
image: codeberg.org/forgejo/forgejo:8.0.3 image: codeberg.org/forgejo/forgejo:{{ tag }}
env: env:
USER_UID: "1000" USER_UID: "{{ user_uid | string }}"
USER_GID: "1000" USER_GID: "{{ user_gid | string }}"
FORGEJO_WORK_DIR: "/data" FORGEJO_WORK_DIR: "{{ work_path }}"
FORGEJO_CUSTOM: "/data/custom" FORGEJO_CUSTOM: "{{ work_path }}/custom"
networks: networks:
- name: postgresql - name: postgresql
- name: forgejo - name: forgejo
@ -44,6 +44,6 @@
- /etc/timezone:/etc/timezone:ro - /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro - /etc/localtime:/etc/localtime:ro
ports: ports:
- "8022:8022" - "{{ ssh_listen_port }}:{{ ssh_listen_port }}"
recreate: "{{ appini.changed }}" recreate: "{{ appini.changed }}"
restart_policy: unless-stopped restart_policy: unless-stopped

View file

@ -1,62 +1,64 @@
[DEFAULT] [DEFAULT]
RUN_MODE=prod RUN_MODE=prod
RUN_USER=forgejo RUN_USER={{ run_user }}
WORK_PATH=/data WORK_PATH={{ work_path }}
[database] [database]
DB_TYPE=postgres DB_TYPE={{ db_type }}
HOST=postgresql:5432 HOST={{ db_host }}
NAME=forgejo NAME={{ db_name }}
USER=forgejo USER={{ db_user }}
PASSWD={{ postgresql_password }} PASSWD={{ db_password }}
[storage] [storage]
STORAGE_TYPE=minio STORAGE_TYPE={{ storage_type }}
MINIO_ENDPOINT=minio:9000 MINIO_ENDPOINT={{ minio_endpoint }}
MINIO_ACCESS_KEY_ID={{ minio_access_key_id }} MINIO_ACCESS_KEY_ID={{ minio_access_key_id }}
MINIO_SECRET_ACCESS_KEY={{ minio_secret_access_key }} MINIO_SECRET_ACCESS_KEY={{ minio_secret_access_key }}
MINIO_BUCKET=forgejo MINIO_BUCKET={{ minio_bucket }}
[log] [log]
LEVEL=warn LEVEL={{ log_level }}
ROOT_PATH=/data/log ROOT_PATH={{ log_root_path }}
[mailer] [mailer]
ENABLED=true ENABLED={{ smtp_enabled | string }}
SMTP_ADDR=comfycamp.space SMTP_ADDR={{ smtp_addr }}
SMTP_PORT=587 SMTP_PORT={{ smtp_port | string }}
USER=forgejo@comfycamp.space USER={{ smtp_user }}
PASSWD={{ smtp_password }} PASSWD={{ smtp_password }}
[oauth2] [oauth2]
JWT_SECRET={{ oauth2_jwt_secret }} JWT_SECRET={{ oauth2_jwt_secret }}
[repository] [repository]
ROOT=/data/repositories ROOT={{ repositories_root }}
[security] [security]
INSTALL_LOCK=true INSTALL_LOCK={{ install_lock | string }}
INTERNAL_TOKEN={{ internal_token }} INTERNAL_TOKEN={{ internal_token }}
SECRET_KEY={{ secret_key }} SECRET_KEY={{ secret_key }}
[server] [server]
DOMAIN=git.comfycamp.space DOMAIN={{ domain }}
ROOT_URL=https://git.comfycamp.space ROOT_URL={{ root_url }}
HTTP_PORT=3000 HTTP_PORT={{ http_port | string }}
LFS_START_SERVER={{ lfs_start_server | string }}
LFS_JWT_SECRET={{ lfs_jwt_secret }} LFS_JWT_SECRET={{ lfs_jwt_secret }}
LFS_START_SERVER=true
START_SSH_SERVER=true START_SSH_SERVER={{ start_ssh_server | string }}
SSH_PORT=8022 SSH_PORT={{ ssh_port | string }}
SSH_LISTEN_PORT=8022 SSH_LISTEN_PORT={{ ssh_listen_port | string }}
[session] [session]
COOKIE_NAME=session COOKIE_NAME={{ cookie_name }}
COOKIE_SECURE=true COOKIE_SECURE={{ cookie_secure | string }}
[service] [service]
DISABLE_REGISTRATION=true DISABLE_REGISTRATION={{ disable_registration | string }}
SHOW_REGISTRATION_BUTTON=false SHOW_REGISTRATION_BUTTON={{ show_registration_button | string }}
[cache] [cache]
ADAPTER=redis ADAPTER={{ cache_adapter }}
HOST=redis://redis-forgejo:6379/0?pool_size=100&idle_timeout=180s HOST={{ cache_host }}

View file

@ -1 +1,55 @@
minio_access_key_id: uTJp8KfKSETa1uYMZnSM user_uid: 1000
user_gid: 1000
tag: 9.0.1
root_url: ""
domain: ""
http_port: 3000
install_lock: true
secret_key: ""
internal_token: ""
oauth2_jwt_secret: ""
start_ssh_server: true
ssh_port: 8022
ssh_listen_port: 8022
run_user: forgejo
work_path: /data
repositories_root: /data/repositories
db_type: postgres
db_host: postgresql:5432
db_name: forgejo
db_user: forgejo
db_password: ""
log_level: warn
log_root_path: /data/log
smtp_enabled: true
smtp_addr: ""
smtp_port: 587
smtp_user: ""
smtp_password: ""
cache_adapter: redis
cache_host: redis://redis-forgejo:6379/0?pool_size=100&idle_timeout=180s
lfs_start_server: true
lfs_jwt_secret: ""
storage_type: minio
minio_endpoint: minio:9000
minio_access_key_id: ""
minio_secret_access_key: ""
minio_bucket: forgejo
cookie_name: session
cookie_secure: true
disable_registration: true
show_registration_button: false

View file

@ -1,234 +1,236 @@
$ANSIBLE_VAULT;1.1;AES256 $ANSIBLE_VAULT;1.1;AES256
63643739373333303835626262393562323836636331363865376266613232303531653331363965 30373463346361363832616462626534336233633936383032613437326433353437366363313032
3633633138633936656663613534326332616265653338300a396438636532613436353137613261 6430316535363530346633373638666262613436623133310a663037356562333334396261363833
30386436643464333734646662336535383366383862643234393564623264643666373937376131 62663133363265326230333961313364343134623032376165323961386132326637383062373065
3336366134383535380a386263373039353465363335663037623464373061623362653032613130 3732653962616263360a663538613837303533653031376161643037623434336331613533356630
36343230353463643363393432646231613233343739326332613132376465646663653064363131 65623563366666333463613436303534356238663934616530353363633635393466323636346437
38613365613833396663303033636164373965666438656233356531336565616530643132336262 39643166613332326662373938366165336137623065356633646362316262663033633430326334
63303739363363626633323964303038356662616563623935643938376663666433383365633935 38616337333566643536383138663762313161376534663132343763653464346561333331633339
39613038333964343562316434393430306134313435373463306362666239376130663933633734 34636464613032633061646564623661656466393633653266323366363333393339363732376532
31356532376435613462653539623230626236303436323436623563356432343365613433633365 32363063303865646561323637623632636435643866393131313131313131343031373234613061
37316336666231656565366665663865316561656564643865643239386533663233313837613330 65336162633836383839333237353266316566666430333339333235313536303562653763396534
65346538396335303533373136623534653036353830336464346535323431393039613232643134 39386238623737376234333266366132626136613632653239366538356462363030313464613431
63643334656439396330643736316536323031333837383861623661393338353530393331376262 35616139373039623562306365623536346139643631653664396434383163663866313237663831
33353130323038663330343539663531646438396535386135333465336663623031653238366331 63646131343663386231613237663638393061643131363436323561396430336333373538323430
65396330353030393435353732336536646239616631646562313437396434623163653664623232 34323234623034356231663036643365646366376638323966313361313738316135643535623462
62303631306232646363393738636462393836653735356335363438326434353361616433353532 66636338356436666637303537626566633437393163343434336435666433653461356337376138
66626633353439366638633436386235356535306635373363353033353033613837663435646633 61623465653631633139626239343430323761353266353263323561386165356166666134623666
39373839666664373265626632373539386336343365316437646136383033306535653635313930 36313538326433396131323266383033613133323566656162633965383739653164363237333039
30333865303631616365316336323837653938613231313432386530656338633234326461313232 30373138626433343465666165356633346436646630333465376238343661653266313834623862
63343933313763633565343763653733393138613765656338663636623631663937656331313938 37616137656564363131343035653266313965333436353932313566363031353239356265363361
30323662666238653138626363393765623237653065666631396263346463353637373430623165 63623466646131323064306166626137306537613565666435616533623764613138643264383036
34336666643761616165363134653633323533343535366462613633346133646365616361386666 65376136386539653666366136616533626433653030636563316232663031663365356631626431
32333261626233396231646666613161376239363162303763373736633166373062623536383233 66653161633661643764666462333162363139626230303132663231636666343938393137333932
63383761383235396630636232383639363434333436656365653436663938643164326665663736 63613937663464303538306165353039356165396636646666313232633132373933303162303762
32396537343831616437623062303534363365636363373561363836313539383463626665666431 63653763633061306366393261653163633437306237386533663639326566306538346137343730
34333739636230663033613236333030326533383766633235623334343634363632633732393439 65366132346531363239613161363466623830666236346266636634643833613263636632353438
30306632313337653834636463616436346166666535633635363361653836383332373335653565 31666131303866333562376437363536333133633036353139643162626666656466336132303932
65633737363938636637316137616431323966326262336432613664363261663534663766636234 39646639663364633736393138623566383538663839613533303866326232373431366239336266
31343330663165626462346239383035306631333266663361343536343833313064623163646466 38633665313338636238653035646262356431333334633137646137633535396537306334613333
32353936396336313236346331353836386466353032366237393462623038653533333161316330 64313163346365336131393832333064303033366634313663333262666361636131386138323764
30626631366662653637353336383835653662646231333334386533376337613333303232343437 63613634666566616635336232663431353639326161313866326135303961333337636138336234
66623035633339333738396561356263353933393634316638383037313737633238306162373865 39643966663266653464626331306662383235366537383039643563636464613563313365383737
35343833653935643164366330313363636233373431656135336336316139613562303933663331 64303264643265316530326165333465306635383235313662646564333762333234616265313638
61656237393735373164653531643863303734633635303136323531386532346265323736366166 30653064326438663230386432343961653936356130316534613837653062623663633934333132
36356364323131333437653236346335316334316434353164623264343635616538636431323062 63643364393730633936343136626661383137643033316630336163383238616464326465366564
30386232303961376464633635653230353164643232346335313966313064636139386437373861 39323931636564663536626237313066646436633632376262353964643635626163376163633133
36306232393932323261633931313765636635376532646366623732383164613561393839303131 36363933313466356363613665383061386362333037373030393066326265333133636166613532
31653837616466393236363630313166323565653962346430343665323064303632633038396433 35343530373666623036643339303438376534343535346533393134343133383037666437363166
62316330623036623561643035393331306562666163666437373336633031613863653363313133 33653962376362383031323337386364326232613366613134343030306134323235623630306631
36393039313864636262663362396663353831666664376337643766663631633965646562626133 64343165653661633135633035366262336362643435633733343866323136393562393833653733
61303933393735333666376438336537656461616634366636333232326665303136663462333361 63646432356264323764336561633135336365393866623265366166303666666663653334343132
61613738343464333265323832353864323166646136356436346434623030623933303764383764 66393538303739663736366362633264346238306566333962373265663366306465366238623333
34353830616436343564326362643632396432303637383462636438313364646634316462353630 61333830393362326662393833326165393863643734386239333165346664343337373466626361
30303431626463643935323033656462616236333534653432623462633066333661643239663933 66666165663438383363636261323136376334636435396233393034623461623134653066646461
64326336326130663730383332326262363134316236623639373539336462343561633064393462 33653363333862393932306437633333396233653535353637663634323037393537343531393663
38633034333436363064383534383634303330393166386162376639633034366436366234343933 61643664386434366232333366303637616332366131383936373236366363373166363931343838
35326436623266326337326438343431663234373737323263396632623333636231613531323764 66626561393337373532326132663936393535613533393930663065633264343666343237633439
33343830323866313664643765633638356561306664636433653861363135636238343466343036 33616363353762633538653034626137333736303661323034636163356662623336643833303537
37326363393264333637643838353532663239346434336665666632343839363230376230373139 62373637643638356339396462613332336263633532343533353062636234646130326535663931
39376163613037303963333137613231643131343361656266366638633861303664316234363939 66316165623539396232373262356161643966643935666262316166336162643565333063656265
33353631336465653431663531373664646266303838643535366661653439343734656635383438 37313338383665386266633231326162303432646663353930643638626261343832616438316338
35633534626334373365663466306134343562656262326465303864346262623563363362373763 38633366616335393633323764306531356236633663336532666634646430323066643938636565
35343466386432643663356165303835373634386137646330613739333933383437336430343862 65626337353338653739363634376236373230646439353531353065353135313239353534653661
32376366393362656164646562303635306161353036633363353166303635646663643333623934 31323261323838653631653038386663646335313265613166643131313036663566353561373535
37613637666663386336353430363631663136393666363235663364303737633438373436623839 39663731363636366630386631306561616338663630396265343734623563663339316362383531
38343831333337656163383939643430663635343337373830666165373535653034333465326338 63623063316562663631336133376232643732643038653662393632336639306465303566653935
32373532356336323464643265653365313862613934303965656266613034316536653032353539 34323865353532306630303436623335326161363866303738323733613138636633393036633535
39323865383264646634356332343432666664663234353431306331613134393838656466366562 39646135393336653538386165316139363436653766623232343537346162373866313338316337
32643033623839353038306265353761653030353435656564326336323535633536613264333430 62306236616163613731316261626535313766323837316162643262626334393661643164623262
64383262366237613835663962336332656239633466316135613566373730663465656436626563 39353632333765383230636130633765663761323437643230356637343330383230336637323638
65613738363165313234663464613063613962356338653038663461663561633930613739666638 37613534646361346161383433386465353833383765613565616365323034396164353531656437
39633839623761373230666336646237353737313561376235623435383434656435633836376564 64633066626339303366616136653461616537303962623761636431623837626636353634663433
35616566363163613435656239393366383239336239383637323631353837303937353165643036 65396466636232653362663965313738316531383264353731393431346236393466653439396137
62393037663064386565633863633365663565303038303563633061613336656661383263356133 62363937346538363365333538373639313361323662393236333633646632363032383931653936
39656234383064623565336432353162626433616431323464393639353666303436343666656466 34653533646633636139336436613335633736306165303066313266326532633535366462326331
37326430643861363763393831343336373837363263346432373062353063363138313033306366 64323263373364663866373362623738343539383433316664646462393161643931653561376432
35643135373830663737323939383965653139386238666562316466356662623663343933343861 62373266613532666366663232636565393662643834636237633964613139646431343064613233
31393638623530636634653434373437323832393632306339653839323166643934313063396139 37656535396430636361386334343365663439383363366564313462656334316330356232636237
33623137333333663034306635646365386663386464393033636239376535396566613763393764 64393561363064313461613233306466303733386230383131353864643031346633373065343537
31316337373261663464663236653138343739383963633438353635386263316530313331353235 33663731656537316239383538333961336164633439386236346539316132636432376637303438
36303461323133666639336536663338323361373366313238393638303738653638373131386162 31393563623133323461653035326231306435613564643536633033333537646431393264353337
38663939323138633463343832356333386665393430663237323237393362646234356230326633 62643962363164666633373066356337373835626635326434656435633936343865363837356236
34393335336334636366363661346632623330336630633531663433336366366439303939663230 33383063323230646331663566653538373738356363313030366231393664313338353262663262
30313534333063383363633430356639306330616161643065336137623332396363656331353039 63663264653636393235333330643131616531363531633565623531393731623238373161663065
37373563646262643366323634353534353435636438363139303962623366363564633330363832 37636533353862643134333430386232643735373934623939656362383064633162306633363139
35666362306135336538623435363537353162616366656466393963386265646335663439373434 30643163306563646433366232363039653034383034393338343263626562373766343139636432
39626639303638613666386338363463303434316666316463386234643461323034363033373232 30383036653262343365636431613665633930663165386337653031336462373336323534393039
35626265393665613063323366336233386139653936363239663038393430313863643035656638 36316636633966326661396532653032356161326431653237376135323461653539356466366365
65656431363634623262623639623066666361613735373230636536386666376362656334396531 33336532643531663732313733316364653361653536656633333331613636633338376432316137
33666261353035323963306537646339643331323834623839303636353234656463383234663835 64326561623432376434663432396532336364326530663563366261393862303036313734623535
63633165343363336331626265646239656137383838633034323434623738366262643663663364 63363030353232613064613262633563313464396233633535663832376339393736336665623131
65336234336339313363343261333263393437663063633762633335653931316530643339396435 35333533363862303133653832306638306534656330373130383561343937656339653466393162
34336262646664396538643131666339323831333431386632343939633163663436376361633839 39626331376632623065643631393034323766323231393931363432383531346530383037613532
38356265633638646134376434643563646239313632633931323332373032366533383432646266 36353935346535376163313634303430616233376564306663303165623933353862343837666464
31626132333132323132323762383738303662333832323962376137663865316662303762333736 39643264383333356633623134626132663435393565666263613261643930306262663165626139
36633264643735383462323966393535396663366635373433643630343433346538653566616362 62393961376166366431643566626539376135653663343031303937643930613435626366663062
37336538616635396635393134653233353663633566316431666332303662313134643461363937 61616637396566363732313631633334616163346135383936373465626465306630303363393764
34373230616663616330353164666566396231656632663039613638653734376465353335313665 36623463656234633164633737356532313263616536366237636630363166353333306637653335
61373666383539316461333632646338393865376661363562646332303161326434373831303133 64616230613033383765646164646533376432353338303838656232646533623730663234333462
62366630343630616235306231646435303164633764343264333061656639313731613134623538 38666132666434643839636164666530636230366531386131333566313362393136353836356262
62376364616331346534393332313034623864653731373237393265666433613132326261393136 38653437653464313232303265316431393830303862323138653661346635396133666239353766
65396138613238313764646461666437373766356663333364646235646336313935306131663032 34633166393165623531343437306166393930633130653339326436356662666434653962316633
61363436616233316466343864626530323037353535363861313133333939643134353966383838 63306133636431303964356166626464616266326162636361633137663735646434623138333936
32343933333433333564383436386335323761333133366634313333623836353534366631386538 39373139633864393436383931343361616537646131653564663536306561323933343539656532
65353930373037313466343131613239643932616136633261666465336361643038356136386336 65313733626162356334386230346132373133316636306131643438353037356465313132356363
38336138333762373565633864613163393064326564653538313833353937633866623330623032 33653234623537393436336163626532326363303263323665643831313666366461336432636631
31363835646335643164326434376437316632646233663332363463363634666531643663373038 32346365323837666436636438636563366134636363303566643735643235303139646538633263
36333166626630363838613364613963336630666365616534326165623362336163366663353936 32656531373330373530313261363535313430303337333136373339323830623535646137373137
65653661386531353131336634303434616535323763396437623130373665366430653938613039 39643934366235666633343039346562643864633639383335663765653834656636333665346131
39323034383637373632383165366462333363636131333139646633363333386162353735643365 65316366663665626632313464316463376339643738633933313131333461653530623732653966
65386338363137623734323061326631626163303139363565363230343332653438393233623038 30353437396535303261343737333938396366383136356333663461666238353862386237336264
39613866323964333237633432613437326565393130643635623063373361316633613565313934 63353034616563396231343434336137653432313734666633316330376163663139303064336238
66326332383565616334313731616633643331666164343265333563383636313033383462323066 61623965643432626233326431626530616466663164326662316464636466313666353939316437
66386461386463623135636637306361666433616334646630656261663963323366633134626139 38326265303630333631303364346464626465356438373931313131663631356330363863363066
63363831313931663865336139613030393563333361386261376263393538656333623962653332 30363936393537356238663762363635666565643036646564363164333162313263663933346163
32663961393764646336613164353338383363633033343734643762343866643364656238396432 33336163306237643834316333653535613533303863346333616630353231383261393765373466
65303138646262363136336263363336346137653337653064386365346139653239393834326435 35633061373835663831613830393234363335656639303262366633656462626535643637383465
61323839393733653864613663653337666133643631353966663731353765393362353931613361 34316665383337643030633862636266306631643935356633343762646261343734636338303730
38353039336137373765633935666533613634633764303536336435366138376230323531303365 62363833623031343130653665613536623135343036363762343532663131643365343163343462
66336363316539626535333563306262653039356236613238326334326134316630333662343637 37333863643236633635653038383762663035306361363138336462633534356133303831313163
30396532316464333539333865626665666434336234366136663566313963336565636131343665 65306131663338343366353232646134326234356130663962663635353837663863643937383339
39643534623162636164383838653533646462373164306634663535663838646139363164363934 32636138376163363936353831656463356663356633663534346336353131313662303839613063
39623338383839303031333861633461636666623761396630613264373935363662306263653736 36633538613336383037613132396563356631656338393166313463666237373761363734373037
66303565336361326165326630646264633263303239303036633263313735643763626535353666 39316238613930396633616465336463363031383630306261323839646630303662383936366432
39633763346135613639326361396236643238383533613666663963636432316534316465326363 35376534393063646337373137356565343562623438646437666361663330303835313831313837
36393432393166613431326264663565326165383435626266376362383366656238353638646366 39376263366265613964363730353939363331383361643966383663333634303434616534386138
62353031373464386266326464656262653864336331663934633966363461616338346138396332 35366335643332353964623965333237626538326163333733313239646535613930656266366463
36653632396363383638633063623330333335363835393563396263663762343933366266336262 63336134613037623938343530303764346331323362656632356362386337393736306563306663
65373061343861626465386232346633343462363336393665383536393464393539356366306133 66313837303461323066656338326339633635353435383135626333386234373239333263656532
32393162306366656534323130623763666434613635643063326230613665343464623865383365 32366362323266323139376232663066333563663666633937393362646433656561623432666232
62376337343234663263313332626564376566646130393462336337306533353061353532633432 36353961366661323264353061353736616230383337646638656439363639613536353162396237
38396638623235303066616132323163353430666561353333383962323164613064656564376366 38386238376137353937653336333639393463333838353632336235336566633562303033653362
31383038353935336237333538353965363765646231636463623133313731653764363162343832 34643539613037373834353139323638313532633663653837363166323931356330316431373639
32383438646534373536376636346564346230313165316239383336346165353838663838626263 66663836316265663063306637343530303334386433386630363436616133643961313835353336
65363438353839393435353931333836363361643266393862313734393732313135396132336434 66333236336332353433376566353135303161633539623539366637353262313330346661386635
66373435333935323733313064373963323063623938623738313439636136386130643833343866 34376564336635326362326631623533366665663862313833623863326435346639323133353835
63636538336564376439373631616264623939616331313864363737343163653465343837333366 35613162643934353064313330666163303730376666313133613035393964633736666639393535
35376139393834656436343333663136386130656165656437323063353162363931326364376231 35373262396535373166303233343431316338316534633261343063306232343262626164643561
61623334646361653036653535623939636130656131336365343763393133633232383039386233 66343332376332353235343462353165326638333465633138346239633833396364336632353338
33316634303430326166643037343361316537653262353134653330353738323337313136663464 65363330653734646565663466346131616533333833303962326664323737653937396664663431
35613362383862393935346430656231313536363563313366646335623361363938303263653161 31303833653162373231653231383438666637326439386234323432613561613363353166396563
31386631386138383033643131366164646264636239373533636231323731393136386138316436 36373436356333306563643739636562363161303366643237613166343233653033656362663065
35666466666438393562616364613035613433643364383633343735303137653365623037666531 61646365343265326232303439303739343937653637346132343561383363663034646565623638
38643830646264383839306235393939653534663264643161383061356138646434636530623165 35383037663565326137636163643463383930323936346465626562333337653531623232653531
65313466666536313739663736386233376231376363666366373338396261623965633234333366 33323836623463346535626562383834383238303432653735313437323165666134366663643232
61333533656130336363313834383836643464313762336165613063333033353233346331353736 32313531383138383531343337303333616136643937333131303735313766303334333636376663
30636365653337333265343534656161616137666537666233303137623131633537626332303133 38626366313137626466616330333236376432646334363637383438656261623530643938396561
64306565613962396364613636373064356563323466383930363032633935373663643436333364 38623538386338646335363165343632353937623333343865346232623763633130623662626531
33623361646264653564623861643564636463396562353962653561373332636430333963663961 64663566323536373364306365316532333430323661623861643263663738383031376136373231
37373637343130363033623932646530373764613232333761666461623932393336303364356466 62626365336364616534323761303462613035626535623735303538323938356265353131623730
61626335346630313562623331643331306134616331663066666636623566396131373439353630 63383130623365333835383461626235656333386131636233353734666334376630363666373737
39363462653032376430636137613964356232623831306139353061386464633263643035626563 30326635636438363166643361323864393832616538313466366630346537626231356365616433
34623165326563393765646361363335643163316633306133353665636265353733663962326336 64636463303262666237356137666332356338396632306135663431366135343461306566386633
32323537633063646364336336646566343437343566373534666164383561383039333363633464 31373564383039316135656631623934306439626637396631323235636362373562636339323161
34383664363266393638636231326333313931313033636439626231353466623333366239326630 33363632316138356563633033333833613434633838616232393230346333626661623230643861
38363634653862353233643863363465373431613939373539326165363665343932333135386131 38333166646132373630613432323234633137666435323339653438663932613461633235373633
37326337323161346631623462326133303234623939393639636265623862633238346262626233 38613637373736656263396239663035663261333066376435613264656138313462336266303731
36623334616661393936376532326531666532353964313132323439396432306164646262363634 33623863633535386164363466393230393162616133313230336330323339396631386334663430
37656531313565306531353334646237386334626631356630306235653161323834393435353635 63333161623062623437386437326438396661363863633836326333626137386435656536383331
34373764303963393235383136653438633362386366336362663763656134653464316465333432 37353434313730313361353565373730393631613433333338666139373064316165313835326635
33356337313362616665306163396562313933366266646662663332666331626565363234653233 30393361663964656565396531386465306336393034333133376637383334393161393866656564
38353532353133636335333731313135623864373166653366343065653636623339613431396366 63383731363739663263333639366538326236313932336130623965653236373730646532656136
62646632336466643261366162643839633531656662613239646365373739383334633863646338 66623131373965376138323961663561633336653963613765396533376462386566363362623238
39316362613739303932636338393133316239393832366461666238393130346362343965323863 30613362373131636363343762343364363038316264333962383632663734653663383037643464
34306463663062646236643537393064346436386266356534373036323634623530353961313839 65626334616566373335396435633863633062626363343563363333323063666261313662353864
61613539393464363661326634313636653539646435396134346237313738636537636531333764 33313237616261646435386534636435646466353239633165333538626663626163656161646338
38656634373362373932306164363362653638323566646162393739353461626563386462666637 30353961373761626261646565333830383235386331356532663536313335353835333032326635
39306436333030643735366535313763306530336139663132393132323361343737666563633961 31313836323937366261663939353035386264393839663139623661663139336163383232336165
64613231653165643666303338616339376561633237343262363763316664396466623261336261 33333137386163373635613237333432653431633362343236643963636162353632353534623361
65343232323232663235626365313335626261326230396637363332666437373032366562393231 66333534623330323439373238346565613165326336333030656536353730373162323930353234
65623362393436363865336631613864363834663433356639363436653864393436313063316535 30653732316561303934373238366366376135383036383632623836353430643462316139613562
39643661376531646432363662633030653332353732336233393061623330373039636536613435 64343462626433636433656139616534373635313236326338386438366133363934613361613437
66386331346339386665646438383063623261623232343733653161636431386465663262363433 61343061646362343363663966343834643939376233653464373237326133656234303164336461
37636338343139356436656534633636633131353364663865646465373932396134653336333965 63613763396363336334313866656431363835656164396532366231663739613333343935383232
61393163623434336266346332303139393835623138326137316663326239303262393061383832 33616233376562346637623162333764643663663637346332656337333865626535303363336638
66363765643534663937383631343539633861323537376533353335316631353065663864623064 63386562616532623135656532386538383664396632626635373832366463366564623732636538
33616633666537623831613132363961323964333366646462633733633430313439303062633839 66393532313631646663373839653337653230346165373338343166393936306633656265323430
30626662393761366636343833636464396234646234663438333263613034663538666132363765 32653861616362666632643063663536383437633533376437616135336538383932326138656565
33616531323062313964623338303837613932366237373434333937613965336365363064636133 61306534613262323230616364613463623062386565653036663861373933353562353364663433
34363538333133316336393638323331343134623837353032366130363664653137653332626335 30666535383461653033653638303935616465666339323962393933333666313136646663626138
39353863386138663634353266373262313263333535656466623631333664613661623963356262 62373661326534613731346466386162316232646634323765326533613034366663366265656435
63376331306466313035336365346264303166313566343165306432343530623237393836323766 35616139653966393135646637343063383036646436616362646132623638366435356431333634
64353965376161653864363539336264646535363135376363373262393738663230353333616432 38626265653662383135346433323131366564626562636338656432623561396139623532636361
34616562623938633531666565633039336631313730626666383461643663643937343665636161 33333234316535623262663532636436306437643434303366656262386434356139643662656636
66353033616564333666303431366131633261353734653166346463343538306562333465616132 33613439653562636434653439653265336435373231653538383336663561343733363231653936
36373530343932653637356330666264633765613166636361653539313432373835613130353661 34306161646266626565303938616463353731386236343466663463363264373763643533636530
36633634303663666465626132646631616434306233353638356634353333393931373063663364 32313936356139646539353233666131333139303835376262303061313831623138643362363966
38313439316639333835326163366533653633376161373864393363323562663539333436313235 35646434333665626638633034323763343132646230313433336535663735393736313838373463
34626165333963643937363962313761306662323230643133393866666131666439313063613763 63633232623538343632396664636435396538393635356539323662356363396631333263373731
61353431653932653830346632323966376433396134316430613833306437373962656264316636 64333833383336373733353932396337623937373061636239356261313363316163356434653461
30343166646439643038393364666132323835363738623237323736363236623861303866323264 33363436316165633436633238356662633166373065613338633638363266303838333765353536
34653039363030663963376539393530343238303838623138353036373939363464613639353732 35646265616562313530333431313737393635333230636331306564636336386638356633336132
33373930353138396466376234363035346561623032633364306539353231376637663464383661 30626432333065633864346533333632306136333339363964383033616230383430386139636630
30323666303239346233653364316364396531653934666362306131376433663632653330653430 39643337633533643830386138353034613830346165613037343166396238366238346135396636
36346431623461323733343132633466643263613731313165366534386435363062356266386430 35333930396462303736306530353939366561313837613166653331623034343538396464653337
31626637353662623839636534643630613562623835323466626532343764363564393662333733 38613134346663636438363230303332363339326139653263303230643833323261326337646264
37386662643837316637386132643633343861373933396162393632306339383162313236373938 34353365663439653538663835373435383764633733353163336536616665393763366564626137
33303265633734653732313136613838373231313762393064386331646137653065353139343735 30613439356534663237346262386435333038366633373662616266306461333536356239666439
34363233363633316438393436316335396535356538366563343232306330383336613866396237 66323236326130336232306439613334313134316162653665326331333661343763373532303637
62666138303030663561613739663937623764666431396361303330323562363261666639373466 36316134366433623839323535303331623431346633613432346631303266643430663834353234
35396231383733336662616530646532363333396162666334323262383130393864323835353766 36616663383630663164303165643930343930303630353437313837376537313862303964633232
61383930303131383235346639363961346263653037346665663461643938646261396262656363 62363036663164303037376163306464323665383339333364386265626234663936623739303464
39626439313762313336653762356334343133363734666564303130363837346662356135653363 39336137353361653634306634613465363935633764323733656162366633353532656162613733
66366334623332333339393138326430303830653337386438663437363638633862393536636362 30633661303936313738346432303135396138346133323331616661343135613664616164666137
30383035376635363661376330363462376531646462363538663832383037353930363933393831 61366666333132303364353361323536663665373861643134663963353639313866373335666437
65623834373462613637303161643564396437613661383938623033636136666365393666383239 66373630336366313437653763393033616231396564363363396431363263323565313762623264
31323336646531636231633237643037363835616131373666616433623035353130383130326566 31303434393565336237326635383438383331323266336539333063613938306162343430313434
37376630613961623536333431656437313863636466623737363531326665323761663766346165 62353863666165336434646261303862623334633636653235323730636238366633633838616335
65633834646334623433373631313061613965386463346537396166636262646230366262393437 66376432626432373337376438383962336362613963333161656331313732363565653238613130
65326331613438323666303134396133616462396139336638363239336362303335613934326636 38656661653663363537373064363864646438303139363739366332633738653462663436343966
35343530653737353330303464306633313266613832373764326161373364363736326262363161 64326634323439366535343537613238366235386439643331656332306338383836616564333536
35626661353233346639333637343136343362626634326234383831363736363539623961353135 63643331666336663061323633353733386631316639633265613836636663386331326665633030
38613332396130313239363235636434343034396466346631613765373864313730346539613762 65313034316462316532313065633965636330633830343139313064653566343639333034613264
36353830623764366536613431343838313933373730636531633938333265656439336431633736 35663464313431306431646439333066303738653366383762663363666333646163303365313739
39373431393637306330623835363031643161316163333732326332386564386334313237313862 65643638613335333165366363323535666532376465343535386530346531323137626562393137
64666438656238343466303066306632316336373034343136333162653630343036613264386439 61613830323432623762613532623435333765643965616661653534333964306565353931386539
66396430626430373737623230393036376463613866643738643962633639633734343031366433 32636565313462353337316532643937306162663437313034616634663137356235643930623862
61643062356336313434316639346432396161396638316439326436376162613230323434613161 31393263613831646561366636366165336335616134353663656138626262656561343330326234
64616361656630383432666639363131346134616139303535333766376134393561386262393765 61646134303138623931373035396530653064363233313365373437646335656638363238316438
34613765666437313564643435313265646430653532663930626530343463663931313961613064 35363138373938313939333737353239396330356334306234653230313539366135633630643535
62623630366135613066363030626364323337363630653164343535303238386162653137353964 36303063323763656330373733653138353065316235333338383061623261343934666532393939
37333836343330653436323666343035393166393935626463393662396533376135666234623431 63316466316663326163633536333462373632653665663636363137303336636531336663326432
32373030663939326562376366663362393036303837333931316133323234396238363433353436 62646261303364646230376335376563376230613137386234633937366665626236396161336165
63613835643361313266363332303335383035346337616161303266303463393337616363633831 39363065613636353733373530636430333439333130346138323565303264376663633263373335
38306633653462643434396661343463303735343535663030356563623732633230363365326634 33646533376665353865336333353531393734343564663933636435323733616237313534353163
34646564343735316232383333363933333131326166633439383835306136666633376434633934 36386233353939666238653131306465646263626264343265303830626130366234306636383361
35303666633639386232616436393330636534353666366262643136666566653961626333646236 66653762326432633237623066363638343630666234656466356131306334623132653339656165
37636465363838313435323066343638333336366363373230363934356334333934366530373066 65633136316530386665333235343264303235643761643837616235613530666461363166626363
31376566376162646333663438633739396239393932386337653736353261613261643537353036 32383937366534346138653337653764323566373962663062393262356266303738313139393462
30396438326632393830386636623938386438633163643536343365396337333564316631623636 37353439643966336463396363316562336662336338633261636365323232666534383763333333
33306331323735326436653036346132616131623130306339643939316661626233623232653165 33313966343230636464636538663666356637663036323038663062356161346461393866646163
38353162653664363930613765633363633237636132393764373434643266616566363465393733 39396235323631636236343466343063353033363538663430366432346535623539333631306239
34363965356430366165383935663935656533346632326363373961663635303238623831623933 31643738613164396266616362396536333330363432333865633239336632343930346535616562
39636461343938346433383439323934396131373938393863316230636233316130333665313834 34373763666530393261376538383664313630396435373065376362616135633931383766326566
34616337346236653165663839373436366135346633373037383865346263653938633534643733 64353862613434316532383037626266366437646137643435323136376362653031343139613234
62366663343132326362326464616331396466663732366133643331376433326533363139633933 61303636333464373631323534323265646236393665623239616330376638396437393863646266
30623736303837656466353938306535353436323763313662343531316532383737623863336161 30383632643336643236653332653639653065363337303665623034646566333166353930663537
65336262396339333234613263353831633439633038663063666134346138626531336439393533 34303563326636383466653438303238393731333839303832316431353864333163333937633832
66303833653030393632636262653434323539353333386333373536623839316362343934313739 66306533623961386531636337333035663336396162373439396335643930383531363031366237
36626635616266313365326239333439383633666631393136306632346265636537626431623662 33353139663035326533643432613966333231666437333635636539356430353233633331393134
32663461643462363161323565393536353938666334393366343330656661366334376335636435 36633737633631323737383033666233333061306332616331653536636233663031353538396335
39636261303863323863376136653836663931333739363465663763643565633239343161376533 61336532623539623838663539326366306531643063323763393762633764383435346161386636
66393061396137336131646466303034333164613631303365393162343263393463396130353035 32383837353939633831663661613437383533353564663865373539363064376436356437613631
3930 39653235313232383839316633313736373165363939613930323835643264623331343663336333
32663366373166343339666636666331623064363039613933373834636437303336363565623231
643264663362373833376333363461396566