diff --git a/deploy/ansible/gobot/tasks/main.yml b/deploy/ansible/gobot/tasks/main.yml index 02bd3329..b5859f1e 100644 --- a/deploy/ansible/gobot/tasks/main.yml +++ b/deploy/ansible/gobot/tasks/main.yml @@ -23,5 +23,5 @@ ILBOT_HTTP_ADDRESS: "127.0.0.1" # Bot's local http server ip address ILBOT_HTTP_PORT: "8081" # Bot's local http server port # List of teams that are allowed to run bot commands on the PR - ILBOT_MAINTAINERS: "taxonomy-triagers,taxonomy-approvers,taxonomy-maintainers,instruct-lab-bot-triagers,instruct-lab-bot-maintainers,oversight-committee" + ILBOT_MAINTAINERS: "taxonomy-triagers,taxonomy-approvers,taxonomy-maintainers,instructlab-bot-triagers,instructlab-bot-maintainers,oversight-committee" ILBOT_REQUIRED_LABELS: "skill,knowledge" # Labels required on each PR to run any bot command. diff --git a/deploy/ansible/secrets.enc b/deploy/ansible/secrets.enc index 0b863ed0..710d3411 100644 --- a/deploy/ansible/secrets.enc +++ b/deploy/ansible/secrets.enc @@ -1,558 +1,561 @@ $ANSIBLE_VAULT;1.1;AES256 -66366235326434366336343638343437623631643963623337393437636465663734623965326136 -3938623732356432346236393461616232396661343732630a336566383062313966313338353638 -61353635366665643135633066626539383239623066343935633534366437376338323932323537 -3132363364353936660a333638333636363136393333613965343732393834316134306233366262 -31393639333463643866373663633666636338633262343866653063663464633839313230653264 -36636138313164303230343637666436643038306231373834643731666330623462316336616134 -63393637643233316262373732373638633139323362393566323836373562336336316334333532 -34373565343064353834313834356335393535613165666435656135366235373637313839626566 -65626235663163636463636438396232323130393966346361343833356232393635393261633763 -39323061373530343164376663306332303764366264616562663633353765313738376261356238 -37383131646665396532373237343636613236373565643130656363663261623534376261303865 -37636630376263333635636634336161316439303466363735383737356639613336383438613066 -37626438376566323033396164626331316138633461633034636463633039326438326636393863 -35326335626332316563633965383265653862363564376131343866663833633338346130386365 -37656634623132376232363462323664303932633666666261653865303237376166323466316333 -32383131343437396430396635663431613937623535613261366333393136633334353839636165 -31356530323738333339623661353564646132663436633564316430303161666561376364613630 -35346434623964613639633261306436636137336132643261626362613165626234343562343833 -36633264383537343430646533356634666430343863623363363533306237303538336238396237 -62616333353534386264636432356265313431323834343165326265316136616236396634653461 -30306331343537616232323936303965303332633630333161313233656133623665613634363964 -31366365363235663963623463383631616533316363383636336339326362316334333930373462 -31316237336339303735653464323039396632663336373834346663393638333131666631353130 -30326132336665666430636261663033386138616536336632653637643563623861323132373932 -34663735323363646362333536323166653063393234656639646466663232396430623464623465 -62613638326238373735353737626365336534633330303766303766366237333936396132323834 -39346561613439393232346230626262333232343438633764333461363539333031366230646630 -63346438303539393363663237323864313930616135316238376134306135333035613563336265 -39616330613561343363633363646437623538303737616336653434636466666438623931623339 -32376134616233333662343930383561373835383933346233616332656262663033383136636436 -31316163393366366361656563633633666632613564303533313266633132613531393536343936 -39343538353838386464666663393561333364376231346137343338316232633831626561316365 -64646534396432313364663434323132653161663162666138663162663461366132386336383730 -33393439353566663863313333653332316564323636646537353835656564396264633062623232 -66383237386161623461356361336362326466383466663066303066333265653439643963313839 -64623163313634376531373736623231613762343366343738353962323138653830313032316233 -64306539373634643335343261313634306163333636376232373462643235623734363561643365 -35653262366264343331363633653738653938653137396566353731663733333363613736316336 -30353361326466653033316662336466383434363661383339346564303834306132323164383664 -38313230343266623334643839393636386533363766656234656230326436616663313161626630 -35353266386530356665323933663637316135626538623633373633326139376539643636323866 -66393564393535396430353465386533616666343365313465383534616164353566366438313664 -36323130373431303431356639316138633862326461646338366233643337663036613464623266 -35666236636661663533313062353033393434303365356130623531393336306237616434396230 -66646433653532646435303233353837346361646566623436373137386533343165313531663366 -65346131316437643236376230373838616162656234363536306239306439633439356562303365 -64363237396637613634303864643232663565626539373466366633326434373633306438613161 -30376235396232343530373866386339383035653930363637363266626138346662666163376238 -30313039323337623536663762323363323430396166333731663266306461393530363631623163 -65343735383134323635633062663034333736626133363533636634386636613163386339313939 -64346136363331313761313336393535303632626665343639353332316635333336333635346636 -66353563326331363333626633653133336638303264323162646339363165306631323638666636 -39376137623637373935623831663563653937333938386638613038623439343631393063396534 -64333831316535626662376239356139636166306664633361333265653231326233626363656163 -37333430663164653062306165303562613934633937626536633761613366313634343338306633 -61636531663163663136633835306662343063376432353561303536306264356438653665383839 -33306332303735386339346133303961393364363265353537396132326638633830346666643632 -33313132383236373236313365643730383964303464653737393937393236313765646332323031 -64376634363438313831356133363631626166313236633462333965356434666465613032363662 -65356535303831386136623136363263383832363832656534663563356431663966636539616133 -33646431323838656665393565323834343036633334636139373733333936313034366362396162 -34303436323633313732323036323436623239343466313633386364633262643263626236656235 -33366635643233336465653565386366306234353930393639626137373436663830336361626436 -35396633393732353564343062343763373331666261353164353965306164336132376166613038 -62663164393035373035623763623364663132666132653564343036353236396464363663343464 -35663663363563396132333234623631313062616231393231623932343966326536663734353838 -33306539323462316665643461663139373330636365303461393136643732663662373034636331 -37313539383764646266333033323363373865373932306464356339643964306665353132323837 -33313231663539653930626233383161353837333930643737386563663864373336396663333030 -38616330346439636333643863363666373631383935306464336566303062653036346261336337 -63323863343134343531396339383136393833353066353364633036393665656231336332386166 -38646230653135373930653661376137386561343339313330373065383334613437663233366334 -65313937303362663034383636323036343834636236356537346566663561393563646531386236 -34313336373264366437326138303933363735663939613930316265653431333030623662643037 -31626665636166343666316465653564356261633637646164313261343037363433303565306438 -39343635623764363630343133616432383434613037623337326462643335346239656138623935 -32666666303863373566313465636634383438316661396133633665353632643634396539333662 -30383361363465383132333536386636383633356535346130616636376436656436376635633563 -34383433383164313161326664306164366661373061363962333562383166303337616632303130 -31303335393862323166626465333439653636353231346666626135336562303130653762613136 -32616231393161303135646439326332346231313063656230343935666337653566333237643366 -63613730326633366132386363336564386261636136616231383738343030313361613430316236 -31316561383763646634326235383764376539616237363238393637663561323039326535353837 -63643465333835303839373137393234363331653738646334666239643663666136306366663434 -66366661383865336561316231626564333161363131376166353931346136613562353464343135 -63636238306438626563326538653961303837643934326163343165363563303332653464396263 -63666637303231393932623536643161616266373733636364303238383531613339656363613931 -39643063626134393030366561383839346266343765383033393466623334383337653865623432 -37373130646561653464613266366265346331323735326661656262346462376232333637643838 -37346537366263663036343637386366393866643961656431363034626235643531386539346465 -31306266343032303065376639616430333833613138656436633163316662663639613539613039 -34323438316561373764343465343933346232623763653635303634333636316161336635663661 -32636433393261633733316265313733613735383032343634666561323936656430383338393565 -64653661393832613633343036373163666133346330653232666639656666653932663534333862 -36346430356165306265323066636338313837386438336233616232376562636133366462346434 -32313961306566356139373431303061396261366631353434386536656130363630653265393931 -63316264613264316233663363653464383339393037626633326131303437346330356434313037 -35633338366334323633363436333262353763363530633832333938363964306261396665653065 -65363532333732663536656365396132383132646565313838343239616135366363633835666364 -33633832373366363361333539376431613861333338636630303461333536666464653136393261 -61313961356463373765663034613063616461373235623131373738383730356539616631373661 -38333164623766646634613961333564663033376664383163336563353165323532353937323761 -35643963626230323163663633666632616263313032643537313537323666646437346639313735 -36323137663030323961373534343232333036303439326431653165356534383435623830313861 -64663862373430383330646232353162343934343732326332373162333062366663316134353232 -61363332376361643865316536353566393836386136633062333061636631626666623365663162 -64323633353537363837376239353361373966633131323263633139343635356661343031303165 -66363763623965646263623032303062653434346238363636666434303764623930663533366635 -35336139613232386330663030313664643634316563636530323333616138373932653062353035 -61633931396138663632633939323164303837646463616435306135366665386663393039386539 -65623263326461373933393561343438656139333465313762663365393932373334373538633131 -37383639613638323037346632663435303065333364393961616662666530306338393339323464 -38363838616534313438326366386563393130366532343732646336643232623837623962323761 -63333038666332653231663463363638623364313563393838626130393066643830333062663432 -34396630636563643539663630346661633136613632323966333038383566663237343434333733 -35613866343931343766303263396464306464386131393865366434626364613762303431343166 -39616532376238373864376237643762333633343733616636383037326561376638363565663364 -39663330613331353639623433343131343431323633353433663665383165306531613262363238 -30366661373365363266303532333831613730636462366230656133393536646131373763303763 -32353766623061336663303965326438393135333137336161373735353630663831633465616264 -61613333306430346563303065383534383864313964323730346265353162663837326530346232 -31663564306264373863633535613434323362343538373266303665633462336566346234346330 -63326565356138623864373063653761393436633232623837366234373435623436373733326332 -31333663353834333232393465353934313338353531636666636262616530386530663830363364 -66306232393530333132353334376262386463393438346134336330653961333838326464396239 -32643064666232643563656264366232393235333333366131303231656461356662323362626430 -34623636643862366334343265336366376463613961323063313466663766616233653466313035 -66343966323764323066333638396137653536373764353665316532306465383765623635633463 -65333064643932336263323231633366613761303233373831646332636464333437383934326565 -64393437396366373864663335636535396333643735356339363935373665396637613164373163 -34613564666265393338366330393433333066396465373232643438376535333639303036613464 -66393837393138333765643038363739363936356331393261623638303538316639363362626637 -30643138623135373133643266343037633461636562363061623765646135353933346139306330 -31353335653333643438386337613266376663336264373632373831613839663035316536646430 -65393931326161383538366439653232643565366337613865366434316234666237373031646461 -64303934623330323130323961343633353133356537383631633939316463616138366263393862 -63303038313264333661373932323835623935366165306366343837353661666361336661663761 -38653064656262666435613863666231666338653663613361373966626437306132316534396430 -66396162336637373433353766326466326435636138636439313333336135336465653939653361 -32383665386161316338653133653737303035373333343765383430333534393433636336343437 -62346434363865336332313461643333663739393032636537346539343838623735333734663238 -32376165336330626639326335666631366239363037646430343037663064313138613566626130 -64333531346436316637626530616363623536346537633864306338336235623962626463646631 -38366564393335303433663538323264656265366637643733666631366239366335656439346261 -33316163396333393630343439306536373039363364373131336634623432613438616561633634 -63396239663966313830376133306630613866373337343264616632303730383833643065356230 -35336334376463356334663533633530633662666364616431653039386138306330666163333161 -35333837383931373639313336313661323164323239643631623863636237336331613138393131 -34313134613430353466343430643533303332346662303736623532633830633737343763656234 -62306138303636353534383162346565643565623764323265386231393761363566353132613262 -64663364636636393461393637313732646536613738306461313631313138636236306333623364 -64383435303334346161663231383831616663626266653933393939323533333765376265666130 -37653863393132323561326230636364303939343765653934373635353264353566613435313538 -35656532616132323263653839633735376630386338336532386435363462383135656531333562 -39323034333466366564613032383233363864643837376662666438323835313966653561646133 -30623034306135393131626437316365333863376464383139616135333235323135393631346432 -31623731333062303432303737326230356234623265393964396366623862653463386664386163 -65623136336138376364653436306163356332333462323061653633383232633634653730373831 -37656363303138356632333234356536623936343338343231646430343831636237306438633836 -33376135383235323938623163646362653865323035636234636337623634376436326338346639 -63636533646533373663396337653231326265333238376538373337613539366632373636653537 -64396434303633626235626333316333336235626161303665653831343337366136333830306434 -37353466626562666636633735303766653738393733663061636537316532633365303331303436 -65643163353138653333336638356362383934376633336162343134343537666663616234643461 -35343335613232383437353964346130376161643564373535376331376236396363393964353932 -37353739633939313065303465383432616565663363653931303861323861623031313362633864 -31366535393336666433386166316339313132363134333332366338653730653361353264383437 -36343533386535316234383031663336663533653238396464383737383739656437373637323166 -34313665666166343738323430316633373036663465346135633962333938636232613633383533 -61653236306261386435366462343165353034323666383266653966393564656337373733666566 -36363938643339353336633130623464336230643630613965316531343931333761636531376263 -38343634666535653536623538646337376164643565333166323737396439303537303430376631 -37303563396661393030616539663838393838636630333036303235656266343865633865376239 -33666135313333653063333437393532643665373237303139363431623030396135386265383631 -34333832376561663835336438366565356137303664643332346261626135313932396661353439 -39643735613865653862653363313531373066623138363862663462306264343239643333613961 -64316535623438663235643635326333373031396130346261643965623165656461626362393633 -31353135373661613930346662326637303433316466613865633738313136336136323061333564 -37383833366562333832323361393763326561626561663032333662363034333033393231663833 -62613935663635333438356162343337366337306361386332383262373961326237313830666433 -31333931306336313030373438306337363735666436623834326436343664346535333935383663 -34336263343863346638636165626536666662326534626334623930363461303935306264663331 -35383234313031663762353166313966373062633064393139313564666632363962363462633233 -62383039386335616234613062376433626662346335623037393965323239613064656235386365 -30363931333833623730376263343437636630343936353835613038383432353937626639363564 -39616165323839356166616466613565323630396237303135333932366339623730313564313564 -33323262323362313664343262383037396531326538323361376232336131666634353364643831 -34383166336362343131376661363731316636653861333331376531613462633661656539646636 -35363634386237313731333033666231323763663331393235396435393232336439616561653262 -32376164393964616264306463613136356232366364373537633166663638366637616430303465 -62363335333434623037636530353363356134613330393137663630303836373631386338653131 -65356338353136396138396533306661376136353938663865343064666130316336313334373864 -30346131336439666237373637373563303931616663383761346635326366653264333363666231 -39383139626361373166383738613836303937356632326335336264633865363530386564666239 -64333935663364663439366238376665383031396564343062303063303362313236346232373938 -39656235616438306434323261623539363631363964363737333962616361626132353038383637 -35326463396332396632323230646665633765633832343330353137663865393737396339343065 -39663136333837353365626465343462646365366630396166356234666237666361323232346161 -62346639323532363437616439343763313933346336666335313834323636343462366637643063 -63343431363561653834613131643038393563356563613235333937333866343666343635613436 -63343333303666663736663630373330326539653334663563393161333436356166316461636634 -36653637353261373562623839353938383331623462323930356530303231656262316162616132 -61363237386131646331396331623833653361333635313464303835343139393331333864653964 -66303063316130343539383836383561393562353730306238653339353637336236646637386166 -33663166653637616265643533323530383436623133333435646663623962373966323332353263 -39663738306466323730616163653763613730663662656637613435653035633866393532306163 -39323135333230656333643966616263353335623564346164323433353764323430623362306330 -35656265373864623930633230323762313037333465643466343162646439343931636233316637 -39326433386562346565366531373061643834393065353265343964363030323438353333643763 -65313934376538396638313539623332663238316663343363643939313861666132393035393762 -34636164633432653666656635313339653234623636626332646330623432396638346139616634 -62616133636139343234313539396265353235383639666238376530626633663135613136396430 -37366363353264653836333537383239333863323839666365663533633066653136306365636265 -35366461613434393634656266656463636639646465393830613438393866376633393136663863 -34663139373634636139616334326238336335633863626238353438643233323935616236383032 -66336363336338333136366461303231376134393134343065343065346534623666383064623236 -31393831316237656331663962376534653132383561653663356534656339646365633431306431 -62366666373262666139316434336432626335663830316365356639653062396136613966396432 -37666364306233313766346530623838303235663432316236376366303162656239383636333663 -66383965333535353232353634373536336338386562626535393732323839626530353565303635 -37323635373934333231363632613063343436386237306261373236336339373236366230613736 -33666363643565393630623537396138376131323065363937643838353637386164636435353965 -31363562303631316637376537363132663432306364656363333735346435366138326438343237 -66633463303464303135653838383834663232653361326634376339353463653963393166396566 -63666432653839656434613063636361616539333735636231613738613934316261306661366463 -65653261666337636634313764343334333339303666666162336237393764613130613233326335 -32383530613339616363376132646136353534323332333265333731393731636136313265633337 -65366664333935323634306566366662396433386130373732343231343462346466623561393938 -62663137633033623264353765303537623732636536373066623137313661613633363563306632 -32613265383334333135396334656236343636363335633462613230356466626463396561306266 -63333865323532663164333062666265633638646366343035336137363335623735653362376164 -64313663653438393364383366363766636635373835326364336236393130336266333030343963 -64616661633936623039343338626262323661653835366333623262353764396133633332663339 -63346135653366306664366335656462323461373730343034386635383163343365653738313531 -32653636653334326665653961376530616230373635333163313862626463643566303338643130 -38383436313866633436386438393566393537306238613131646562313630383266646564383534 -61663662653765336339333938636661363766353132333339383738656437316630653964386430 -31393535616536663336393231303462343032313433656638353031376461326266363936393934 -65666664636163396233363565393866613766303937373234376234636162353932626462383162 -36626163623537643864386432333931646261393662313435323938383165636236623566643339 -64643730303037613334306234303564376631656664336238346632303531336161623766373863 -61313831313763333537643739393763633136613132343234633733356335356163396165376564 -66643938333661353130616339623462336630393133343932653036323961333765316363623230 -30316663373935373939373735373961623035343062626664346161623963613863616265663465 -36306332353663666666336465343436613731323065383533366234663364613739666436633133 -66623632396137643763333137383664616433643162383362366331613634396262363738623563 -35626366646531313932653364353231623766613266326531656331326466353132336530666236 -32306166663836303637636435363664393762363464643333333066343732333366653461383934 -66303863363130636637613535336561333633323038663932666238393765393732663061633365 -31633133643866316537346537353935363632613064623230356435383638663364633065313739 -34383366323061326365313165356639663331366437626265616637366566643039336337306232 -39666633373439643935646232383335386538373633653664386531346135363761666366323561 -34656134326634626332333739363766653233303030356237343636633165646166396530643031 -34356230663435353566356636303161653166613536323962396331393632396539313464353436 -66343135663731366565353134376231633431386632343666623563643361613033633462363133 -34396138343961616639386332323331336138313365396466346232666532346433353032323766 -32306231396464663561656561343830386237393763656130313965626636653863393063363866 -38623031383235373261346661363133353834323566303930643936613232316231333532613939 -61333637373863393162356366373834376264653161356466343134623266343639633330333362 -61383934393637393934323539396437383063326564326561616630303634346464343033303937 -33323063633862383337396537313439373330353734363831393333666136306538366239383833 -39323561613066323361316363366437616533396635666362323636323061623533336439326464 -32396635343162346133366139636335316663623165303964393938373039353037666536656139 -63653038373064366261376165356235623632363837633366333236336431653431386661353661 -63653531306362323333373637393638656332373366353737386261396339343333636665353332 -32653462326333306235643430643264643264366338343736626331386662623236323738326232 -37613630343331303061373034306462366163313138343936636337366239663135366130393136 -64373032663466316133383561643964323632616666306138363263303661323031336631613432 -39616531643434343465343032656334323634643335346135626533353061323037323766376164 -35326461656534386661383666333061373164646634393536363934626133643833303733373261 -36653738663262383032623835663131303465616135653463333836353465313166386363323865 -37666533313832343932396432616338303362626232353361363034393135633635313162343933 -66646230313739623261316162376461633935663833343630306333313731653033343832353033 -35663434313763363965633539653132356334373033333563343231386561643363643062653637 -35306332613139303630333933333361376364383265326532396136613630343762353634303338 -35336438366564356135663630633330626366336335326536663565313762623761376666633062 -35623238396232306563663565643736346263326539346433623335323031646162326133333964 -34363532333632306331623037356630626234613061333430333739363166313339656564663334 -38363836303634626262353761323930303134623736333865376431663666316262626637336536 -32356238626432333661343838376239623066303061393234343362666435323563346530356330 -30626566313664653462353362656661643436653732643362333130366534303663363063373263 -38633531333434383031643231373731643766383439666334316362343262373137333233333464 -30313132303239353633623434646462643864393033313836333933616464613435636136346366 -61366130396561383633383562353337313533666366333862663064626330623164323662613863 -32616334316533363233633465613763313465323763386165616464633736626234646263383035 -64333430623461396532646234643361323634643265316662346162326433366666663038666138 -30363161396534353134326336393862636135353436613561376634396365316264353135336464 -65313938336331383436343965663738313466366336663735626239666165393766333437353463 -62373539653637326132646162376634366361373065386461623966303863353166646330373661 -31626239623238373364373964353864623466326530636637313762316633316632343630363366 -38616139353932393034653862343534663633323862653764666239363963393064613033346162 -38363237326663383030616432336461383465333639653437373466623362353831353138376638 -63333561353937613430616337653437666438363466623761633637323764313834393137386461 -36363032363838653334313165316538303762323563313164623066643930323334656664396563 -34396235653065643235343364353864303832326339316566366533663136383934323466366161 -61663634303839643132363936663631643432386665333162623639313863343437353433393535 -31336439636135333365336663343464643632663765303837656662666334666330633530623330 -63316438316134333037353236666166376264613964306435343137313438393232663663656264 -63333139353530313136653032346262306333336431633161323230646439663038643466333764 -65346166666239353665663539656135383732663133626534633931643566323234323138346461 -66613431656534636137373365623464613533306561386639383761633362326266346265666130 -64396663376562626631326232353262393331356665313562383463623965326463653132376230 -38363265353461306662613564646437396230633339613133323733303232326264356433623834 -30323839353737386638393536653039666235383435316331336663643332643534383738663037 -30363638663930386334633635373432323566323633643861666665396439383166653066646462 -63623830643031343062663735653030343535656237313333383136613330316262356464336466 -31353538336536326533653830373836313831366666613336313233343966613630626336646261 -38376134643564653064303034366139383061633136623630356530323161656337396566336466 -33383864323235653966633363356261626131363238383963326564653165393062356232323234 -35666634343764633366313264376533636461653762666666613961316262386238666437333835 -61346232343237656531653337353131346632663561393837636130626331616464373130643037 -61653339623864633064323464663338656538626630333162303230626532663039386534356566 -31656431633465303461323934366433626263346237373964383963633066646166613136613139 -63353337363130363464313839613335383063326635386335613135376436633565643532316539 -64646361326561336433346262643261663739373637666134666363643737313166356132383633 -63633435316333666538376462316464636337363362626337393963666534383830376330316264 -66313465373933373066303432383638363638656562663763346532326533393332343237396132 -62633530613631666139313037353333616539343232663137636466373363366632653238656634 -38303030376532323136336336353366663338363238363137623563373263613135333864393366 -32376666633837656133366630643139386235663965643266653639653434386436303461316235 -30383238353735373831373339616631656330366162646464363634636166663564646365316465 -30303439343033653031343261613838343639336130373065356461666564393631323035643561 -36656366383264346363343566633036333231373836636339633462306566356465366335613866 -34323866643965353263663536323533646664353632346139333665633132366335333262383430 -64666238646638316563346532383465616331646662613565393339613932656239353561396135 -38343965396632343263313934313538633836373036363037376466663632356239363162616533 -64653063623133386263316138326437343032633961653931336665633134303065653330633066 -37306464393164313763636464303663316130633030306465376436616532396137613031386463 -39323762313530343131666134613539643865663739386564326535376363386363616332323537 -37653032643633333431636664326138303134613833366639373031663065376663336233616261 -38663766633334353739306438373336633434643639343662343339613933363336393739313838 -62346534313335666135393764306434336130326238356138363965656232663866643364323534 -36656439383136383734383163356265393634343938323066653863373431616138353064373165 -36343330653165653861353331393564313039323135303332376531383434306335613136653930 -33326438323965616638613534353961616164646165396334336231613030376438623736323861 -64313930343539346566333166333135303032666262613564366236383735333764666538313431 -34316431393262303837326664643562643964616334636333633036653935393861306561376566 -65636666356437646139653035356166646531323933386338393962646261306262333239363936 -61343438366639313130383161653031663465653861636634346263333833373933643261353032 -38363063656539333635323165633438656637666262396131343464623061663739306233306462 -63373862616531323863636639343333313737323865666431666563353539303539303630393362 -36363632373133366632386538653164383063643338356332346563316266646638653432613935 -39306564363736313364313635366236346263333538373063613862376239666164336663663166 -38656136343437633636313433636336373332643966636635383466363231363934363630356265 -62386164646536373230336638643233326237646437643630343430383131313564376535386335 -64373631613633656330363637363333313964383139636132343236373464663766376162323362 -66353538366537336530633837313636616438396438636163356266663538333133373761363239 -61346133303764623033333231393965396266326635656365316534333937313935623534363766 -35333938366466643632346633646432336135326135346363656231386230633032623062313735 -37383361366136363066353966626163333033656262376132666139356165613834386436396365 -38376230323533373630363963623132376666636332353337653835376238386334373463646266 -32613930643532366362323261306433373834666565373037303035373339323633316532663939 -34623732656439343130336230323462373262383336613431356662623633383537626364343761 -37343462346238366536353266633134303766653563666334353438663536376233303263303634 -38653530633630643161373432653533353463393363346530623735613161383837386639636135 -34666436383237613733336335636239336638336432373930386332666562616666633038643063 -62636136663233336632343237313436303161303630316230376165326534656430313337343631 -35656265643439323139663562663461626565336130626664643635366131643861313833613965 -30643063613439333366613831656536353632353962323634303663613064383365323232303463 -32636438653137356264613263386561323232333338663830323064613930663963343133366137 -37626335373138386333613339653564306637326437646563386136613163393732653337366361 -63616466636233656537383335316661323436363533383230303934383433393038303362653435 -32386363383832353931323231663834623966323835396564333332323164333833326334373731 -62656464313039326238343962646261666433646162643464613862643530616237636265383462 -37666564663831616339636534643836313234333834666237303862386631666138656530333564 -62386434306165386662336336376234626661323233376462653730326234646163336565323335 -32646362346565343330616439326464623264366334656639306661353532656335336666666437 -31656261353832306564613535646333373136303734306530623463376662663038343739383564 -30323866633038663565613464363036366232663636343033356233383634393139333835623563 -30373762323438383831396638643230393639363835616438663339303461633635363935616162 -64303664623835383461633733346263666561643638613233343065643833623839656633363331 -61613065656437386436353533646435306434643230343536373438316330393533306134633831 -32663931373732373064386165346566656364393931323366646631623132353038633336653832 -39316230656337303932376439373539346336623266396430363832393163393661643762643236 -65656162626330666665656362646533386264633832363335616134386132643136316234646634 -34383539356265303564666532393732306532326463636438623636613061343031343163386463 -62356630333137323964663236333138356261623865363366636531356430623366343835666632 -32343862613739346166363438653532613261646464386137303333666663363833306535393563 -32396437653665313539356663653564346462353736373834323966633762656564343234346136 -62366230343961343036313262393932346139663361306635656438303233313166323238326633 -63373734633064646439343533653639336261346332343162343234333435303833623131626461 -35663564613666323064373363353661316465356437343530353339313930613766623561646539 -65663930306263313233303438373936663531323331323739663631316630313665616530626131 -30323262613732336166653030393961313864613834323962656462333330303539636464386238 -34646537363262323330396561663337313532346262663061353934336261636131383662393233 -64633433353263666430353232306461363033316365613063343461333635303836373131383332 -36376334363336613161633665633137316237646534373230653462666165376461366631343336 -39383262633362636136316531326234316639663937363732313834633933326665343736356161 -36316336366233306666666266353030356438653331616439313566353861633164303531636363 -66383433656236383866366637373162376466363532613733653364636537363839396130363663 -33396435303830333132373335323963376435656631313764653761626364323265633232643765 -30373362356336633031346664323537373962386364373634343066636133393034326630343733 -35343536636361643339303065313866333832613962653564353364376464333166343531656434 -31353034353063666137333566336236636564356236393535393634363035356566363537663261 -34376432343939626536336366396663396261336665376563373733356564376530363933383631 -66313631636166353833373839333832663433343761643439393238343830303430373837373735 -37653631643764373536323338326636306163613938376130613733326561353930636665363834 -63306533613732663566373737663464396430643233386537373632663937663064313562616433 -32353630323066636535616263626534343630333432643132653436633335353937646262336635 -38653837323234373861653336316232303134316238396130353136653530656439663264313865 -35313865626164363831393734346638346531336562626635363330643162303731313164303737 -30626266373136353138656339366661353833653832636464356162663435373062633165663037 -39393734616231366238656637623736653838326364326662336562303034303433323438653635 -31356661633032346162363138333633633538346538383638373562393963643937353233333235 -64313931393364346537383031333262336236346162623839623831653361373135363332353966 -64316666613336373065343263323332386234303735643064393130333834313831323436316334 -63303062343261356461396565373939656664323364663038313335386230333239643734316637 -34323965346636356534376264323362653162333466376239313435613263393632613131336233 -39316536636335313832623530613732323636653937336334646534346132343362313766666130 -34366164366538303163396238376561383639333237386438376362663066626530353132323163 -64663630303036373638353863633765636365643062623136653230383866303536396439383431 -63356131313038383032653833323565313266393064366331356462363331643162356565313733 -62616534393565356565306662393866316633333962356234363065633333316532626135666335 -33663865656131303039333632323562646134336434313165666238653363326561306438306262 -62636533333466666563613639653861343438303534653039343162653164323637636230643334 -31623066393539343437616637626261346466626233356136373635343433376561333836373431 -39653065303937666333636534316464326130353362336435323462363735646561323764393238 -30306232393734663130633164656635363836623339333237346265613066386662613766643463 -65656337386437656435653738323337636430623966363336643038616532613339313139363332 -31306131353963663439366137353566613632656434653566326139616233376363323232633565 -34313636336330396432656633646661306130303636306231323434373232393564326437313936 -62366431346563353265353964356635363931303939656234306664323765353832373663616533 -64386631336464336435616134313139303565383266396235303937666164663732313135326437 -32356432656531306535653530643364666261373663366236626630363763656431386137306563 -65303033633566616438343666363731313039363833623866613133363736616236316637633661 -32306262346437343532643062366463336664643138313537336630643134643563653037613033 -31653336386463386438663638663963323436343664623061303932303033626566366466376435 -38353365396339343637343530383263623336383562633331313836643333393830313965316336 -66386532306139623862373038633534666466303535373936353432323137653430633332366461 -39656364313330313238323930613430393263373163653361353137613365393031323434613733 -37363430646364336437363265343637343362383134643532396632343134323762323662396230 -36656465303134613539656665353866376632353734623061623964306136363433336335353964 -61663530396536373165623565663665373561383038333264313933313836363231663536323864 -38333130643464633963383763316534356236306137313762643835393035643136343230323865 -35353234383539386137633038373961613037646632636534393239393462333631656563616635 -62383964303362393164386234396531363535666437323532636161653533363030366134303036 -62326232366331313138636136653336343064303131636530393231663365653964306536636137 -31633961616139353534343534623763643639666132353637653937306466623165666235326235 -32303963663234623662636231643763333663333439383931633434623831386230333162333364 -64323563326539356336396133306562613436366161393765313334353864643530323039363332 -65396135663138316166353763646136303835336639656536313966346330653631656166343638 -35663535623764656636306335633538656661396366633236613366306362343363303366316636 -63636333663638313861333736336131373134303338373661653839386238666563313265616465 -39333933373563636261353435383534393933396638623865383932333764613838373465303737 -33366262666462333430326432333537346331613434356261316563353163326436353934303565 -34666565626638343064343565326537376234643633653866373533313932613536383635323438 -32653430323334653332396566313233613163326133313466613631356564313565663836616132 -33383266313036303564353836343030653134383462336531623438326464386639313432646533 -36653633323134626638313835373133646462306465313865363062323463393130663135373037 -39326337303536666565663662326361393963343031326537623937636665383730313230633562 -32656566653332613736306436333563306334316330326264656336383839653734336530373463 -34373663376533386138643564383265306133313033353465353563383237663831373038646664 -64616263646566303531643732656661306439336566376232613231333261663737396464613365 -66386436653139336663646630613834316232363264636632336131616665333964636562396434 -61326664333034383432653866623737383934363735613136326630653936386637373130323634 -66363735353361353630343364633566383030643261616436633661386634376432313932393066 -37316235326234333439323639333136306163383739393564633566383165306631313263326661 -34326166326463633330633737333637366138633434383666313031323735326534313038306336 -37373939646336316466363165623332636232663633343261386239393361646236333262633333 -35623934323536326532386631303935363363613433373031303466333331363932646561373565 -35663039633163363337316433306339366635636563646535613635383235396532383535326532 -66646361663938306161376233643735333634383364613264343166396139613535373538616333 -34353561623165313464383835383362633836616536343531656366373034643532356563663938 -66363932366538643264646462636632343561623635323134653739333034323532633737313530 -39653139303637613861646162343565626565613661396365363632306338663933323761373865 -38663665656466626331303437333133393664396334333634356536633061643536303831356164 -62663134366535663538656436353837313636343932376235343034666333353930653939396566 -63393438643437643932393766613463366634323232306265353061303263616332303364376235 -64656462343834363439313530646335353230643732326362623865323165353939383065376637 -38626635303364386237643662306630393938623866306363383766313331303934303732386233 -30336630323437383430393563353234333765613237616462303365633863616463343237643637 -36393966613563386335653933323333396163303462373334353230353736613336616439616139 -61343438653161656162626466303130613834323264383163323162613331393938366664343136 -64393537646166353937383634323664376336343631333030613163343563393266666661663464 -32633732623665613761393636663366393531396533613032356165336136313663656432316133 -63393432663936353435656432616135366464326639643535326334343964623831336638313430 -66393866353433616463643037386536616534623464336431666532306464643665623333616337 -39386432666365313637356266333062666433346337323438653634333638346332663230613535 -37666266646139306636613366303839633932303561333031356237396439373865356331316464 -65623038343837633039373931636633393566363764363862656539643133393939356431363032 -35393935633961643436653430333934363038343866363962653164316239633331363836653237 -34356638633233653964313261316131353864303337643334393661646130313632363863613165 -39353531633537313939383964303034616262613139313031383639383836633761396362363365 -36333764666565393436656465373966333633643631376234383166666566666464353930396265 -63353262323035353566396462363938656633613764656366306162623361643631343033613530 -66373934303232373439316234353864326366353734643232336131306339623562363433653966 -39656666663163303233633437633833303239373735303331636534393333316236343339623338 -31623831316135613662646237666433653562613865663163303931323433613338346364353866 -65663734313339326461373061666139363565313366623661336630313664313961646632353764 -66633338653965613537623563366531393434306365643432653332303638383837623336643032 -63616238653834303331636435363630666337653835623364626232613465333230646330613166 -32653535393335383038316639643332623864653863326661373731346638653338633136643739 -32353936373937353237303435623631663433393030363535323732613336333334353561643132 -65613330366533623561663332336663643835633937623830303839633064626336333262303363 -65383064373861653238383134663731363536623638313138626465663335313266376434616433 -39633165356363303334393238326334303561363434306263643764633237376539316531663031 -64383761346431326666323563343631613533613732623531393138386366323062303137366434 -31303061383531393533356633313136636266333231313561356630313763646163626138383037 -31373130383439383030623839386136343138336265346437653264313932343439333931366231 -65346331646334363133666630333165366336313563306237343737653630326561313865656365 -31616335666263373937613262636361346161373266306466353663353030343139393066396332 -35323034343134613263313264626532313338313435393539613062373132633038343162643535 -35636537396131653565333332666138313531373336616666376165313338646365646332623833 -65633262326331623031316630343462613766306331356339376262613763653262393738383133 -37313238353762303831616339363763633965663761326435383639386535393664346664353165 -38663734643163366530633938393837643263363133373837336535323331343039623134323565 -33333831366434333964353033333262306363336634353235646339653236613530663563623039 -63356261656265373437353864363532353963663537626237616334636362373566376536336266 -33346530363333386236636566343932353038663562623965353637616433313332383339303236 -62643037353064363430626634616137376337313439356462373530303161316161646339653437 -33396333363837393238633933666534316338613232643631303731313132346262643665353033 -63333763313739303337356536323934613861626532323930326238353162386438646636303434 -36653266376464353737376161303965623139313661333937336432613233663937613139303635 -38333161626132313034353933303864653062623336363031383232356432326337663339376432 -38633037656265333666376233623334656630333433626431303166306637363536313730303966 -39346539353065623331373864373037616463336166366536343334613133636466303730313865 -63616538646337626463306563633233363832633430343330623565346236343333623763393830 -37346531646433656637626133646237643465616438386663343335373766623135373264623737 -33393836643337383062396532306461666438333735373034343939303032636436643665633266 -30653935666564636137653337643938393931393264353861353866376165656139623036333530 -62363131316462613838303034633732613436633039303030366263313834643638653334356462 -63303261336263316362336137316436633166343734666336633165393334396634626633383264 -37663565316562656534656336353435333237623964343537663165326538623034333437356630 -32313066653134623833376361303434633164353066613334383038626339373065633963366233 -34636139633963643636386462366165306430353339353031323233323364653062383534623235 -36636433393836313133636564383831363736653234336539373964636235356365323966353564 -32663933626162656230303164343532323731303966326530326632366238353239333130313561 -35343064376134643933343630336630366436383734646136393633623763396633653563323837 -38356261366565363037633237376633633534346632353262393634303832303931656563363264 -36393835626332346166343064653730323234366663343037386138623333383765316162646630 -62363263393238623634616536623538623831616538333166373730343037326435333839333339 -39366366343234326633396131333238313030653233396432333733303135343766363730313063 -38313138653164373734623931666565356333323464646366356162323564373933633437323637 -36386532333865313736646537616564393865663065393134343633366234663464396664353238 -65353266326331353764353065343138326162306161613230636432626537376131653362336535 -39313333366336386163313162666365356532613730666138633034383236623563646365386235 -66366130623736376164386561643363666333633233626330376636323832356466363964343732 -63303364616431393731343963373436323236663864653764396435386239353164613935303764 -30373363643139663762633837396465373630666262393461656133653235343030613864623364 -63666662336236656164633233633936353266303031616436373833373466663032383761666363 -30643533383865303563316233363534326234326437346261313531363361383530353233363935 -62643064636366646338646139616130366334643838336332666262333435393961663962323566 -38343832376666356535666663643432623462363931666534333338333864636636346334393039 -36663365373139326330313837636639656437633232373539383130323335636561343263646562 -36366562356630343638343035326534353733633663343130373136643037303235383334386235 -35643063323462353534366632626232653135333031643165333936363762333565316232656637 -62356637323139643862623531303834646633656536386131346639323838376532393465383432 -65626134396431633430646435656133373733636137613761373134323965346134386438396132 -39613237653231636530653964313864393835356634616333376536616639376163646134373630 -65306630336665386366343037343665383430323139643334393434656664346538613230656534 -62333239373031363232313632333736626234386234313733393935653839313065643631363030 -38656431383433303737383866663038663566316461643138343832396135633065376330663631 -33663337633866613261303566623334333262616139346463646433623036643339323939336434 -63666162636639383165316338386637623863366139626336306530323165306361636533386639 -36316562363831633936666439366363636636383565323439633837646639626566396662613166 -39366634336231623263383135333538353638376666626132393961353931663332616438326133 -6331 +61383838643738366561376163363263303864333564353335393062653431363337666137643033 +6234383436383966353937663762346430366262363535660a376464326162353935666535336366 +63633931643666343232646362346238623930386566326139376638613432633934613638343532 +3664653963353133620a346261363666636335373838353864333461383734353162626632616230 +39323235623534653537306363303735636431356365633066336563393935383763623133613739 +63386332316631356331643539373435653931623637343336643431366332386237306438653130 +61323737376233383866376430346565306265366231666566333530626334393966376433376331 +62623533333030376366363237303334383266613165636136316537643434626337376430303837 +30373030343230373736343966396437646433666163383134396331666634333431383332396139 +31366664646130623633353530383661623639313738323461353932343563376439383131386632 +30353131373963373862653538653839396230666464376638303936336232663835373862633962 +33643032343032616363393432353632663439373062303163376265633365313234373630373530 +37613535336438623431663431373434353664383239373861393739363631363637613463316138 +31663431386235333463636238343130376632623435306264303264363733303837633334346365 +32333533313463646238636363636139366336343532363739613132653537623266323537333561 +62326436336363363731613063643766333134323164376663336364303365306161626262623533 +39376566306630346331666637356438363536333938656130633839626332303961363335323732 +61626665393634636664353633613931643133656366663637343733383864623739316639633833 +31613434306331333333333630633437306330393735386661643334353431363539363765623438 +32626363663566323064333838656339373334343666346161396362383366623532393636343164 +36346433313134303163316334373832373166626461656431376433653036336133396433316437 +62343039306532313436306436303937653665393939313432633936646566393035373736396464 +66386336376161323035306633623630656331356537393061633331366665616432353339353665 +30323238636463623838343865643435393033363062396436653966343239636333653637636462 +63396461663734666135346562386234333861633539613735353139353762386165626132663034 +36626565396437393336623362346165323430623266336239623732316538366561336333636161 +31653333303865326661613663306439336564646633643537633936653631373861323631363766 +37396632363462653030366265333032346565333663326635353830383137623339666430306666 +37343365386632623139386236366338663231306637666233646261383531626262306263363135 +38306665626362356434613234653530313264636261313161323931353039653933653233346137 +39646364343235346262353466343564636263616261343337326639343063306365313361613436 +62616363393662633338343333373563323231393430333563363436373339353035323564613061 +64383863313238663861633439326132363066626630366132336130356539323065653333313730 +38373163343034393638326562356664666231663134333764353365643963633564333463386635 +64636330653564643331636666366461636564616462303961383731313764396633386533346366 +61313433363364663135363361376135383036366532646161666238333031356337356431616638 +63316137303363373462326663396436343330663362396630346261623435363432306233393632 +62363831326339633538316237366632303564343739653237656238666130666538363830366161 +62303766636262396238623739376337363664386330343336646465656663343066663266663263 +32613539343039623339626135323166333763313862396636333738663533373263303762353762 +66336166366532393864356538626661313265303865653633393631636136643333346132623336 +38366430613637616632666336313234343562363864356632326337666130646532356265323134 +39353639646566373264373061616135363439306163613335386239626263333262333262313037 +34633663383039386133323465623337353764613030616661666438633036303865376438633634 +37363632316165336364643962303438386363356434303961313135646137323763306532636164 +61346235383837663132656638633433613331616135626665353731363030663635333531343634 +39653432613139353766386464393862653930623937383564353937313038613564303139393563 +36396235363261373665373733336135306534383336613733326338613265336166646137383365 +61373637323561326261643337656533386535353563366561313130383166653062373432303531 +66356538656264333132656139613638393939633337373338366638353930396465326333353734 +61353963383937653363653130333336646462346337343131636533326337666432326234366261 +64656135316439376535636236306234636464313639393265373664313233613931323965353666 +64623231303433373966393566633230366234303939306535633365633833333636363261373163 +31333864316433363866396635633266646532633032326131356338666662316532626334306230 +36656533623362623734636534363234663536376137343163653534383063336133353864643136 +35323835333865636563653932363035303831313462333234393533356165393435623964396434 +35383266353466323733626637616361643766353933336637313438646465376336323334326264 +30316637393236353863396263343366393038376463623662386638366538333865626532666336 +39306634633662643237336266333234653763333062343461376634333237646336353061356132 +63396532313339336532636535303665363561323063363339653734323163646337383266346238 +35383261373763613962313236653831663065366637636130373136346439363438363233643062 +37366463303263356362636436623436383266326534376166663135383166336364376338303662 +64623961326663383665623431653830623563623161623339353561373535383336323761363065 +38613938336666323066353932356661653735316436333535376335396438323834393338373634 +64313537396535386136376665383634663436613538346639386364396161326538363464616236 +34393638616238346234333361316564653063303933656136306265336332313230393866333462 +66386632356531393830633037343435356435303137386530333337353732623061666533383731 +36386166643764343663323337343531643734633163313230386566343537373864623162323938 +34616561383438653434663837373137333935313037656430666166363665313262353938323264 +37366564316334383639333436346563656562666462643363393831346132323164353930306134 +39376634613063613838366563393533393539653032636334316466383839396432633835626665 +35366232313636346136393532306561316262373363343762616232336266346637653236616539 +39646466343963666661653661306362343661326466383636336262623934636237363539333839 +38333237333636646138353833623935633735313937303964653363633030663636376566343932 +38353961316139623131663933613433626262373938343563386533313634636438333266303264 +39613064363863633937313265353531643834366134383236353038313133393638326262663262 +39363532623465663963623464376164373233333935633365393431313735393632616533346638 +30346633333534303562313564383030656532626431333639636265353866333565643533623731 +64376464633739376263626333343461616466393738626531666434316531383464383666393530 +31376539613539383966366431613335306231616339313063326261626666666436623165353936 +65663534643464373430323266333136623033653561636535336637626539313361363065653639 +37306530376634623063306336333733646134343735346238313234396536623234313538663537 +64383230373966333061316466633863646638396364373233333863646361373435336634303461 +63653631326664316133653533623738313237616239393061613866323462383133363663663737 +39316539653736386530303561396635663465663737326233366136373738393265383834303839 +63353231346334646531353238383734643436316565323938333630333335356539383534623535 +38316431316137343261633365613333623563306665353964383238396330336431353130353263 +34623566373339373462363731383063313661336466366666386561353463363862336138316666 +30666439383736353730303936346565336136666664653930306230383939383663373863663566 +35613563326566363262353563643862396635303739623432336432323465376465613662376562 +31303264313635633236663461626434303064383262616135656364353166383431373261653437 +38396561633738316166643866656537646462643535376132393934656435636334366464633234 +35353661663430613431633933396161376333633066666164366236353037366235663761653164 +32366364333935356166613662653035313964643432303664386663646131633230653436663265 +65343865363162373830376461383765313439623165303530663436376164303638393639383132 +38373031313561356339303866383939383932336233633861663562316539356463396630626631 +39663934303735666664613565303465353463333039626437616665663262616435643961303238 +35666630316265326231346538373634386364663030636465323361323161376330313961666339 +62373531333362343465383832376165656663363236336165666461386334393532343439303735 +32393532643735313437343262653031306533623735316432363538376363663663363332643838 +30343937346437633061623038323061303162393639633830306564666232323561366634326333 +65653532366366333436333365356536616430323865353833323239346566313734653866653362 +62386535356430366261366337373137616439663332656338393236386136623166333864323633 +30616636646530653366623638306437663961366633316330313537313430366266323430616261 +35363933326135366532353939346435633739623838326461653564356138643634353566633565 +34616330356336613766363562613165323536383037353733666566646534653839643539633438 +64386638366534626233343634646536326465623531313434313735626164393931613133653230 +62326264663330653837633565633632333164316538303664373231336566323262393564613935 +61656337316330343737336139373165363565643638396635613331643339333836623534306330 +36346134623830336565373033356232326532376362326134613233383265663031383339356561 +32663663333762616566376439613235613333346336373365353039653233306530383938383630 +38393437393362383933366233656131376531366634626136626232313363303030633732663133 +62623431336333303663316563643561363564326235653665636339306265376233363163653033 +30666131643537366330346433313530313865366464666464616366333437646265306633663664 +31343735386237393833653366326636643761333432393163316661393139643661393432353233 +66346465363039643231393165383066626133383634643162366136646361663434393732613734 +65383130303063386232373536643166333966613465613464373561366163336531323733386164 +61616433636533643939633032633839656333386236643338386435303539623030656238653536 +64333232633139363763613864626231383866346162363266356164336632326231613761343134 +62613335336233633235323839666339386336313634643637323030306466313166366132303632 +36323162623762613166346130383033313164313132646161393032656135303131306265363832 +34663561326532643736353138383232643262363933636166346639623032373964613534656462 +34373638643439383634653661376234373566373462346230623366613936363832616331383231 +34343635653261663365353732303361373233666465366432643136653638636565653833666462 +66326466306631313335303265383765396465646363336462663135393364363261666435363834 +37616364303564636661363537393364646162346132346138633938653164646337623933623733 +31663231626366396133663133303831303962663166633733646666326239326132393836303235 +33343931326636366135373237396432316431666532323739633430353462653266383234323836 +30373433393938363234633862313336626236373861393938343036636365366631656132316461 +38343238363862303736626561333662313630616533343162643239636331343630316330316365 +36393562393834343864623932353436613633633563616239333765653635633932623866356430 +63383665353033663633643937636636653337663037396466623065383661636339353163336564 +62303763303037303032363265666562326561333361663134356336353638646364353232663466 +37353765333462663336373962326566663131306664306234376539643462343734383532306632 +30643561646161363735383238316164363934386661396134343731396531393337313937323563 +32323439663766346437306566643436313737376565663231306231376638323161643233643562 +63316139633637346339653766623030653461376562633736356338386362656632613462663537 +31373937303963633330643634393265333464643164363563323763663737346130343136643737 +34633562626330633433346561353364383231396134393531633462333233623661633334376364 +62653930333465663334313335383233366664323839313062353730326465373237646661613537 +61626230346433333731643035666362666233306366316366386637643834373537353762343262 +66623539303135323333313361313438626563303064376561646536393132626362373331623037 +61356237393966656135353436333663386462653730613861313039323963646239396133306265 +62656436633435646638663966363666633439663835353864636239333738383639353033666538 +37306364353265346463306430383264306639386662323337623736326432653164303362356131 +66636630343933633830353061396431653934353962303935316130393362343531393833626665 +62306633326635383432343833363330376665636632313738616637373763383734316237313634 +65636563346330376534363061326334643533363665366534663366363532363261363465643730 +32636639343230336139386162326138393432633332633436356537646665653131373738613530 +36313063363839356131656661613531333764366334386231313936356531363636313639633539 +65356534383433306236313461663663653036623861666334383831656261613337613134316537 +39303862303036396565653436633562363838366330393866386461393630376266666665623832 +30363533636666663736333762363665383437663938306266393031383863376433373135313864 +64373362623236643062336634346433663761353538323566666635353839363264373939303537 +31386365333935656132383664303237316333323134616232643161643766336238303330613237 +37626232363862623861373837396139333537346635313438373634613064326339333130656466 +35376430346465636462626338343033353933643635363333646464663836393433633964316538 +39353533373365373233366237323466306431613234653837663063363433343431373139393566 +62663666346263356635313931313532346661333332663034373730313034346461616365343134 +34613531636632373730323462633364313864376134656533313364383033306361396439393037 +64323636303461346232653634616330656264346363343461623039633838333363303835663661 +62613435613562653964633139383138353266366463336339373663346363326535383963643138 +39393162393036306238363331343530383462376637633465336261383663346636636136613964 +65666337386435653735356666346238363462666231363636316334643233653336303034613561 +37313063633734333063643832633039343365623962383531393830663761643938386236313034 +61613266653337366661353863613639393961343166616531646436316338353234383337353533 +65343333306463376462313966353131343265646361623266366339323963613830656161646632 +31646461653137346439633233343662663831663062623839386637336530333333616537653535 +62626666333638623265363438363966623339326363356665626632616163623665346362623865 +35333966623761373130623938353964393735616330383965373835616435623566626334393535 +38336438383036646435303030653836373838663439346264383364306235393064633332356336 +31663533363130393363613539613037386661393133323164626431343030336338633031363238 +31376530656231346535376333326163306533306236653433656239343834393664333565383539 +33376462613766333263393631396662376137373632386364663338643330383835393135623630 +65636130656439386261393866316236343664646239353937303335356663653237333631376132 +38306133336163333839353462313037333038333962386231643632373363323661383263313833 +64333963306631356433356163313863303761316339666238333262626239616434346234323335 +38306238383436373336393332306664653363363531303661396361303861363431353632306636 +30626563636530303138616637616334373935393065316432656138656563386637326232613062 +32646462316636316538323435323835313439626563303361396431356237383763333537643730 +34653864633737633432663061366334303631656435633134346564326536643063616132363938 +36636430313230663534643364313566633262383466313131383438633839373033643035356363 +63633638376439653132376365326537336665346438613930653062373733643031326162633234 +66306362333466633939653237353032643439353432616531623265646131366362616133666261 +61316466626661336365363461313666373432623734633033326661316463316538306139663663 +65346235313538393236316336343831316133363531376462303831333563303231343334353566 +65626437623533616632343166666461616161623865363632623262386139386363336566336265 +37653532643937343065366236623738373939323330623266313132313037623834626637653965 +65353761303931616363386433613565613863663063363632316135306530343836346561383039 +30313766626433346166346562316363356230383638356165353138363639343032653434633939 +38306166333732343633383564306461346663663730303763393631396163633763653162396661 +35633234383938626361373832363366353365613534663965616131646337376366336534313665 +64353333386539343636373135643438346234646463323431343862383137656664646539393765 +65656431623734363836626463323861613762366137636432643561303665343037636561646364 +38313063323464363163356661613766633732356663373565346530663333383264386234383738 +34623465396562366338656563343035353731636465356336616137623438366330393061626336 +36323234306433343866373636626231666463643036383433653933613131663366653037646131 +37633762616464363433363766656434316531643339633132356433616366323031373164323466 +30616465613166336135306161356332613566386331656664393531386235336331663235383432 +38396334663930366265363435663230643566386338623931616662326533646262363131623366 +38363466396330353638666233376334393739373465333230383135623365303263356136326330 +31613861356266376430616462626266333538303161333432626131316336393733633831343562 +66636534613761356331313563643138303936323863663635653734393934383634373638363135 +37356539366637336566613563333131633636333264323734383563323233616631336561373465 +62326339646531663466343361646533363439666364376335323134333664643437636561653431 +35353466383861376635646463383138653032616436323338636137663237333837633039653830 +35663631333231663234373963663936393432623763343736366163336237613839306464353364 +64373961393539333564383330313339316564386662653664376365643236386134323938326130 +61623330663335653737396261353462633061316430323031616637613063363230383437663966 +65663239633066666135346135633966316231303361343566313563656135376563323831366431 +64646532663263383939383138333062646335333836326637323566313930323962373934356261 +62626637656530623135353265666137323064353837613530336230363435373830663561316664 +62666534396132363334613231333639393334393235663438336333336237383766353136326633 +39376435666433646334653266623637353031306137663335626535656536326461656330326435 +32313562323839366335303331393564386439336139363862643334336334616131363737386136 +37643763356634313736626332616331353533623134646533303230393330353931336334333332 +39383539313635396461396466656539363866656363616439316432373035366366366635303165 +37326138373066323035646439356230323836336661323363316231643164333865663430633365 +61303835616164373438333537376133626665643033356631386432393730643338343366313861 +61626166666439656536343534656338306163346539383164663235396261663937616537313638 +32353830346435633336373935623132336632376261643366613561653165313936326465383932 +35613463386238663835643661393761366338313666636561666633336335623339306666646638 +65306535313563373733636263323564333865326565336264623335326661613662663366316465 +65373637623533363466653431663163363462643364313166653932613366666538613732363066 +35353863323436353338383130353236643864333564366266393362643263653964643464303232 +30306161633332393137343231383462313665313935396632323934316634633266303739383537 +31333463646663386337656238303933363766643832343738303532626366643336666566363934 +34366230323632396636633733396336303933316432383666666531303566643532386331613138 +64636538613662343330396336323662633038303532386366656339336364653630376636636265 +61613830363738333938393535363137633731393037373064633838653339636634653036353132 +38303166336135303566323834346331623165303430356535383962316630386161363161306239 +65346165396166363139643461303364346233383063643066666663623832323962373635663139 +31373264363466316632366537376665326230626432643162323530633764346666323565396364 +66663836323964626530306465383731336338333737386461333863333766373533306434623631 +31346262623731616631336137363833643461616366336136613938373861623830643334333162 +36663838366334663734353166666234333439626364613337396433353933376330376538346364 +64366436393364626131653666313062663031383039653863643637623839343364363065616565 +65633465303135613637303634316161343633633231383737326631616161313735313163376137 +64626634323339386463633834356236633535316562303764643735303338336135353863383261 +34336434623838353830313638613637313838646134306163663432656366613136643334666163 +35623233613235643537373039366239646464313563663366303966396665623937326538626339 +34313232656432373031333565343032663762356136663062613162366464363762636362356536 +62346362663163363465313366356665353264386665623232303663663135303239336565313065 +33363963383733363436336166356564636463326236653934373732396432653037376561316539 +36613763316631666266613734646231666332316465336536613333356639613534336564333961 +62363639613939373661353233666131306533633063393439623133313066303961353864393833 +30633563633238653063306435343233616632383133396266373362393964353931386438363131 +63663263663166633230323739303861613964333930666666393032393063363164633235363832 +35633336343730396163326263383638316630353638636266323966303131353130363830393639 +33383166353362623438316530333931333565333765313838303236383136623134383865373031 +39366138343465313437386136346339336662633632363532373131653432383830333539613062 +65363337353334366537326166343863306234363535323437353639323434313236333863666439 +31303362303566663335363965373265636131663066353737323432303735353034386635363463 +36353330336133333638343461373366613564303239363866613865333262303538303266376239 +37666130316130663532666534623964346232663263343439376232613639326562386662653864 +33623736353664623663333830363366366336333235383939613639653230643135663235326335 +31656564353565663566626535383336383533323337613564363430363830333863336133636366 +37363261373562333332653262313564383238396533373237366235356137626336396431313135 +62663162353461396136616237383732636539643733636437393937303064393136323064333832 +32376133346164303938613838623937316339616433333364373463383832323532313764306635 +31353562613432646131356539326664393238306331326561396135396162323833653834623630 +35656565633636633137326236363735613466643266643664643663393339313963373162343265 +32623862663130393636636563333964656265653430626332616237343533353235393862333535 +64336632323139646431646338376566316336393834663431653166653662386366373364316661 +30303231306135656539323261613862346461316261653139393330383233326264613335363731 +33343135303266303235336431643532366163643066336163646166313939303431303339616639 +30313764343865663561373137343231356462663332396239656430633566386535336662373935 +62313836343636653765346430623930313937316563633736326139313866356639366430393364 +33353366633136613765633461303334353061366161663134316230386665333836623565633264 +37323335343563353961323335343038616136353963363437666461356464613632323263333331 +37663038653365326362316362643437386432633163343532346666313230663666613130386237 +64623462633435646366353564626337336536666135356237323838646234336434396265383439 +61626438383737323763333766303031613038633430623363613530636632323139356136633430 +31333366306430646637326631366532323966373431326664616362313564336631323232643163 +33383638623534353962653864343264653261613238393731313437656131613436633331663662 +66643131616235353336313965626439613261336535306634353733333630666365343964363564 +31383735316338636433636535343533623233363766303964333063366661333463636266313230 +36633236333164616565363936393861393734616464666234363361663735323963333934663763 +33356435303134333235306466663635366631346535393638386338303333346562663266376239 +61373564353561613931393466336635313731613139643630366334326138346530633134663165 +30643166343963346564356465393538343431343830313565366662613966616263383361376338 +32633465666433666238353666653064313335333635616639636535633934336663313135393635 +62643834313932613361393139356232316632393732656136383262343865383635393139373965 +62636436636164316534653062363630383665636132663562343439636365396166383038623966 +30646235623333383535613134336132383763646561333536636162323037393664633039356161 +64303766626238303661346634633330303761623237326234373535613832653861653732656135 +65373935383435636435316632636336626331656439373334323131373163383339323733666134 +38613330653366373265366263643665666138616333343239616363393936383261366432656164 +30613264383266626636633530316630333233663364373935633631663265333138663765326161 +32393832623938653661616332393834323733663833353739396461356239316562613337356163 +35353430366565313065633764336632383063303132373036343961303633666164383666356132 +66366166323134633334613337623836353762653438373965653666386164386531303031303437 +38626530323538613539343334393736376461616135386663303839353531333664396434613763 +37303564373664383465333563313231306239353836336636353263633365343435336339373030 +33623333306635616436636431356235366161346634303063353563646666373461316364376265 +65636531343132363461616539653734383335323638633733306566343237663437656338396338 +61306365616462303162386134376132333635646434336437613130646363323333306333303534 +61386538313831323231336232616637383962393033313263323931343932363762653536653937 +36376538666365396165383038333437336532396638636336613032303763346535613966633036 +38343332653966353364303537636362303439633735373665666532303062623339613337313638 +31383166663361653162396439613862313636333939653632323961396139633963643566613536 +61663261373031623863396536333238383932663162643466613639356337376332303564613134 +35313737653963623362363663326262366434373830663136396132643231316463343935613063 +61323466373636623637326235653839643931366531353133646334313837666363373165363063 +62376634666566333263643537303535333433643161363330646639393565323662343861383836 +30303763626230373163346462303034353238623131653266616136373434626163666462643934 +64353362623039663861653839313662376636313938336634623365643531643963316563623037 +32313038643336313330653432383435656236623839396664303662383463306431363761636361 +62346638353636306331353934326138343864633137393934376161653934393330666535626538 +38613838356362353963383161633934633135356363393962646165386630646531373235643937 +33303735303534363666323139393766666535643765333739326264336364333630633765626135 +36636261626536303866306531303736356631323434313062656434303831643866373865373562 +35663164626639616433313732616163306639333138393866613762376533316436613630333230 +31663434656136376436613165656337383764623034666365343661363862313730336235316537 +36323835633137386331383035343962643330366238383562343932656463356630616265353439 +38303235323638376135356462646635383235353761326231313534313262353136353562626633 +32366563313061323163383139393038366335316432376136303864306539633633326334656662 +31623034626132396337366230336532323732663036313464666437316535326166623038326163 +30356230336236316166323861333433376231613535336631653063316138323435333137666161 +38313730343563643433643938386663353830336231393666376366636234373661653039666530 +34383032306335313265663462393337393030326466323365383738343464623233363561326439 +33326335663232316131616332323931623230613961393338383265616130663938303466313530 +38643739646265323062323235643066613263393261303432343762383837373135336561303330 +64386432623439373166623831653462316234646466313735656661656132323837353664313439 +63333131613466663735663938303931386334313131373031656630386662666563376164336533 +66326535383035663731626332383165636135336333346165346637646138313834343135646637 +36623738366363613361396238316533663030386139333032363633346338653039366231346631 +34383863613039646561363132643032656161653437623261633763366430383530656532383034 +39383833356563386361303964313733353634613933646230366265366431353966643839616131 +37626564643634346235313832336666393330313365313736383231383461306234333063653837 +37353964323261313735623731373036663630353962636635643538323166306461643935613432 +65653038383638396337333265396631393634633931643062626431323632333739376534306265 +64303039353234663362333336366235336439363161623835373539323263396162306664316330 +66333964633739393361323263306232313833613564306564616338333561356334616430616461 +62346634366331633939656435393734383864393364303765613732376331326165313732383535 +38323866393837623732653931306131346366306261393432353930316336363562616235333565 +64353330386435316166623838316135306337666437353830643263336665386464356162326562 +37653535336533623138313165376437626663316365366366333136303536346365323631386462 +30323930323962656139363436303330353961636663303534313736363561653839663330353631 +35313038373139373961353236313939633662636261306461303436366235616531666536613737 +34636261613735616662633938666666343862666630303761326232646261356466393234343831 +30303030306631323865373735303763613565626135333435646262333064376639363438613135 +30396163373936313266326331613234333337393737363532336564333036643835303064643630 +37333537366462666130306632383862343461396162373133643964636535663463623037363432 +39666139353731316139303035343261373736373464636261326530353438613739383731623765 +35626339353638303039623632333565353564663837303637366433353934353736653438333939 +64666564356136656431376435313361653734636266333131353862396265303531333134613836 +35643461636666386635323933393130333164303663643234383539633531626665366663363539 +36613630343936336335636238383530383361353466623565666538346535666532656261393262 +61636461646239313938663838333634653335373232303037333164366530633036303134663230 +37393539303632366434376632316463313232323930363935393265636436383466613235656461 +30326335313635373166383337643934623232353334396330643566303039373831316137633862 +66386566623134663861353337316464663836623131636437303733343064346639633861343637 +37393339373437353930646337353137386438313131363831616636313937303665316430623135 +32386235613261326332623833393637343965646465303637386161353666646339393533336632 +35646662316336356132383266383538356333623835393439393064656462333063313931613363 +32373831373039363538363433666533346230636136343632326431363638613930656233343030 +39343034646630663734313834643931666464326365343438323061663864343436666136613632 +35636534616232616134393331333432376232303362643831333061313561333964386133616165 +62613661343032636264303132646361636631323636336435643034353763306665383164366363 +62343131626330623966386239343737363638383035383963653636326334616530346361383965 +65323533363238376161396533373035343331316461373064666530386434623561613131613539 +34363534313265323831373364336639643465366562623533646432666530366438393734663465 +39653566383231376437393835313136316634613139643437376164313931303432663530393364 +33333865643165353564343136346164663034396166316330643731343137323464353662326531 +30613564646637323961666637353535373835323564663439643661396331393364323139373663 +32303464626633636266366631663331663765373933383433326436313031386238393334313936 +32396164373339313333653130386339643731373934646162373734633233373131333730653161 +35666234346437393466366138363966333933613339376361643738363661316431383430366535 +32303239343863626336313133343831323130353263373036323931393730666462613937373863 +35356233623133616135343636303061343766623239666265643661313039653530383562323731 +34356131643039306133316535366534333639663162643863643337633562333166336334626130 +38616138653631666534313261353934303239303630643161363430353635363261626262616261 +37613363636366646536353565623661343138323439323230303561313332623463616263323639 +37353939306361303565643831376631663230393431336466336536393265306233623130623762 +63323662303237343235336566306431343261636235313135616337323537336133313830313739 +61316563386338666433643562313430333162313236303764643265666565646438333766336434 +39633466663738633230346237356232346430313966613538336632656236366631303537616132 +30346237393364333064646165653432646466366364326231396138316431613739623732326362 +34346338626635363236333031326463643332343132666632306334613163373335623739616239 +65363265323364333134613433333663633066623364656430343264633430643139356538363262 +37333364616539613134616631393339346334323763616366616336383362343033633665393538 +32353362386235323735373965666235356139663438613731336135623562343033653662646261 +36623862386362333439613230363964623864653364663530326130373364646138376164663139 +61323031343932656565623066393964316562363736313630613263663632386430653137356664 +35313961343135376438633931666564373134356532626364303261633537343430623036303237 +61613539356563383331333933613461336338306664333833666539613030303836313365323966 +62616166356562383038353536656263306630656666326366323432643365623435363434323065 +30653061303939336638343863653163633233643839646330313363373637643766383830623463 +61306438653533643963643537623262643637373335366331373839623261323134623761356339 +35643437623039303665643563363935633836386461663261663064326664333535346366653432 +33393062653331366233613136333936353532336337343962383763626436336638653435303764 +62393039646161356439626230343135323563393762333633393936353332613239616137353836 +37326237366133306537353835316236623036306563326238336333326636356664616132366334 +66613930313336353933656133666463613739636635323434353339346539343332386433633330 +38363032396365383361316636393132303962663465653665393266623063343563663130303033 +39373132623465396336386566623435396139623536333033346564633761396362616438373165 +62386163623963653531616430346134323264396336313537393666646535366266366437643361 +66666165313362653632616462363335333332326563666462323466363236666233353862636535 +39336438663638323332323765663736326139343865393236383565663765623838363965383233 +30613966613637373530353137653837636333346166663135633438616563353865353731613538 +66376232633736653834616165356237393161393865353637616566356435376230336665643264 +62343766613836336561666538303231613265633533646466306232336661656435333835373137 +31636261613038653338373662383836343036643336313865663036386437313534373533303535 +34643437653837616265393233343439653263373639323634383230666161336132643461303331 +38643230343833353737623664646435383562653539376635646532396430313337666666356566 +31653862663636653431643962653562363932666562633161363133343964336536653138353330 +30633238363861323063373939393765303266316635366234613439653264333534313937363033 +30643164396336636634316635613636636562373530363337633565656332383633333135326238 +38643230643335663337366334623534326634306338643830353165353064336432303934666239 +34326263346230386564356435613963323038343730643133643364336637393638646231613965 +37343835616139383366303566313032376330316561343366633631333230373762393236333566 +30393031633563326238373933643837666532623264316563623865393864643232313165303865 +37613939653237666638366461343362303830356164356261613939646366333865313535623038 +62343261353866303163333462616435616263326164333330623438636365626162353766666231 +63636564623335383036333164643637393333396535346666356361613264353439396630666531 +63633861663464616431393862616233326662353432343366303831323339613363623138353965 +38643833306630386132336639326336376361373435343431666566396664633661633233386565 +61653930646130306439323630346438643866626237336364353961393761613462393332373333 +65393061303761393130383939643134376332313932386161323363396337663164336562636564 +31396337316536313866326639363636623335333662306239373963323862313738373035623930 +34326262313938643866613333643333373030323339613431333262616237623835346639326139 +35303036356131636430323935613531396263396337346366343833623536373838633166363065 +32623766396165303065646133623566353433313534623934303332623564353965326437646566 +66613934303235306662333635303332313833663837346335386262623332383361343036663466 +64656332663637363934346466663031393337313764653032626362623966333236386166636462 +64306336353562306537663965336261626532366162633330386333393635653336393339343861 +66326130313665343165343837373338376537613038333036326534636463663561323632303432 +65383835616162373633353639343935393961633232653633306461663166343339646161616266 +31313864636366363835396434306630373164396462356634383335373738633164643839353439 +31316137343266396634383965353030613031613266633561303931356264343335373062623832 +61616162623662616434656562636632356239343964653661626462623737396132623864316437 +39326630636131353837356230386434363166313737616232333162633531316434333439643232 +30613666356437613536343466316463303362366234376366373738313738393631343363643239 +64303838383734663435643638636263616331333763313732666366666635643136643164666132 +30613536623437323162656164636134633165343963326230396465653938306362376561663231 +34663232646439323336393831383233663539323134663338343631356430653632663537306263 +34383866393331326432626466613064396136316365663163623563666461613232373263623136 +62383464383435306637616664333938633730666138656235383830646230303939393638346632 +34346661363537326534323533313239643439303638623833656664353537333031323733633637 +63306362313534613964656235643732663362393762316338383164353038313630376633326365 +31366365343830323764316435653631363465393262346434363231323336363732666166633966 +34383062343238616364333931646565353639393061353439336239316165336434306532363066 +66643333313662306630386535303564353333336439383531396164346437356637303335313031 +39613431383132663938383938363066383139396462356262303531313530663534383463353365 +64393365663434623639346631373761613061353932633232383433386632653366616339363165 +61386338343865663135646564613362303935666665323965636638346164626636646530613731 +35336566313330323838353733646138643764343731353565643234313838303837353935636132 +31616463343637663639653266313865353632386462626262313462303731393061643935656336 +31353566646135653761346533343165396261326665316136323264313337623761316436393538 +32633966346237343939663535643630656136336634383634396262613234313161616134613833 +30616531613136333537636235346139363035363236356438373632623337653565313934623666 +65336233663963313761336663363633336265633635623334616262386665373937386266326433 +61353862323862393539326631306535343736666636313633393139383833353161343731303730 +33326662366665373464336532386261373036323132386331663438323335396136353563366164 +35656638336138343566303133643432373736316631386137623634313865376265613737353735 +38313231393733643461633639306565386636316434366364633137623639346566653764323533 +65323163653165323564356436343661646132386665613466663137353636393738336336393139 +39653533336433326661303666336362306661393939383765323034316538346461646433363136 +63386237316164393232323534373839303865656532613239303135326233623062363237633431 +34373234313530383833343430306361633332616366316239313535643830373466653663303931 +66653331643934333931396439353332323539353337376430653835636639663163353965613266 +31623766373138396665303135613262343733326265333633653962376237646561303837643266 +31663731326131353462666635303130653563643264376462316431633166366665316435356563 +66376361313761643738646435636363386265396634306238653032323738333130386163346361 +39663465653835336336666437643264653436343566306431396534656130326639373731386436 +65643633623366343534363130346664313636343231333962633963346631623463346265653930 +61653539366533623535356634373138353763393536636233373736346336313366663262663164 +39323830643036666532353236373962393066623064363934613836663630343234613538383663 +33353835393139646165323463666335363038653066386665326532346232363432653730353830 +61613636396335383639663537363630306165356663343963633037373064613136393331363737 +34316233646266616633303535363938363161643336393531363434333735306231316634386332 +62373061373232636364623236613835393431663733363639326533656135656133323638656130 +63663531616331373430376465306330643438386635393934383066663862323737323233336134 +33366135393862376161343331303230373238643964353064353931336137376339393763366130 +38663231313234373235333361323963353038643263333831626434326631626661663733303730 +38663735643036613337386366666364653038343366363364656130373162666264323862313235 +61306535636563653734343838336663386439633263656230643762313666643830373166346635 +34343339313331376361303562326361346635393764313562363565316335666166663963333365 +31383664373233306263613661626137666231653538336431653731316166346236313038343235 +37366334386438663835323265666134353433386666313432333261313432306161326336636434 +64393135306266613039396135306565376665636338613764343037303339653437306238353963 +36626134366335303466663066636138616133326363353031356266323736666264633833306431 +33666537313163333664343463663239636363333466383732313934643235363833396132656535 +64313837393964613837336465313763633466663533643162373338373131656533323434663765 +65346134386239373338336531383639326539376136643136633432643536613965613038306435 +32623361343135643664646539653030613063316263346236333033636166323364336531306262 +32653132666639613834616538313535386163333635373138376632326135366632663062373735 +32323035616138383333646637623233616232636463333434636432383735623464306365386166 +37633765316530313136393834663331366263313735366663623630393131376438666165383063 +35616662396331326666323235373032613934633235633762323434373734613533373061666432 +35386665663135376461316132343064643562376637353232383934346331626139363131346364 +62346337333063333466663039653937393661336161313761313936616664313339386261313535 +38373136386462646463663061636539373261303766636565646635623039376539303665396239 +64353832326636313966326432313936303866343863326535656162663932663361333635646432 +62616633636333343932386164633564323965633765373961316261653034376638343038613336 +33356637353762363462323032333235376530633164623738353835343137636565333661653334 +39353239616433383739623265626131383366633036303330323536303834356536323433393437 +38656631356466303637363465323030363532653039376661333233393566396633623532623530 +62386166643337383831353038313637356465636362626535643831356136326239343230393663 +37393665333439616636616164313532666537366332366564616135396663613665646265356165 +35633664333437666164663561333361363865616563353362396162313336643561366535616239 +34383862396635613936306431323363303438633034663261666335616335316236346336336533 +37383032323438623630356565646137363463316532393766633132646163616333313939613764 +63656338373134633539623236373737356662613438306332383866376431653861613431336339 +65613537643666666662353133633061613664333030666338626261353862333833626138326536 +30366362316538663635353662663465306163313430316530383733363933373034373964646432 +33323236326131393262653932643466363435616330613866313631626632636366393532373137 +63333935623638636536336261326234376638383762626131643066633935623533643462356262 +36336133383639653537393531373863653435613063656635666438643363323937653433653330 +66333464396265313035306431616236396339376237346337393334623834633966636631363035 +39653338333533616338313035326634323531663261613663666363376132383331306130353639 +36623132373731666630633963396563306164633630643133356130333564386332303561646538 +31623231333632663962343363336237643638633939326364353866356132633363646437376432 +33646130373263373462653138313333303562333164636539373739353762393265666264303864 +66363565333166343236363735613239393231653839653730633634623233363634303030386335 +39303137326636653662353031663861643563303931633634343363653965393439353637633235 +35663666383337363065303633353838613132323536323635323736373162396633623937323861 +31656537626639303032663264353037303366363165366437346432303433363838366563383864 +65623565393139623337353866656532356130323565303537613833643462373039343863646363 +37643166633763376439363531363032646166663132616231663662323362663633373366303962 +66666465646437346330656538653332366537306136653931356132386133323464303734303135 +65343136656464303635623439306233643432633237353932626237663634623834643731626133 +38656231353734626636323838356637333062346466643466333139353938333333663261306636 +39336339313664316532306534366136336133343136313738343865323665353734353233613938 +65316662366233633436303066376262373735333739393330613739663237366164316463626635 +30663837613439653163383534313339333136336365336462366561306138363866353838363164 +63353439656336613538343531306639626239666464623266653237356438313230626333323065 +63336161646439373061616537393563313332383939366632656139623361323436616463616465 +31633936643833643539303537366538393732363666393862373234343964396432376130356130 +65393636616636393936323238656438636131636165376239353434373137633035613931326163 +36353664336361373631386335626231396436613433653430656565363235386366303030353536 +35396339323538333135616338303763336130336637376438343038396338306338376666666436 +63656537653936626366323337346435306566353066633264346439393536356434633764313132 +38356633363563373364643931636664646366393935353834613335656664383734313862393136 +62653030306438386339663336346437626438323437303832363032343531663935636333323635 +61636530326563383634306635623936356338393638353935383234323663316262626566303663 +39313434326331616661333931393763333933393432313137313630613630343033663231393132 +66616430623937396438316239633738393361636239633439363161343338396561613137356631 +39383765653662303730333639626663633635323238366537653534633431663032376465623862 +39383932376364386233343864303434636666333564386664653162313130346534653066396362 +66323464623933303063623837373135656238383132333633646337653165353031663630613262 +36326161333064636330313230663630303737303335633032383531663431386536356135323662 +31393566396466663265613738616662333262303833616435636336646635306637623564383235 +39336533623039333236346365623262653931313665386239343836643731646632623837383465 +34333031353334656663316434363931343135306262323437363763346634633336636136633963 +63326135326362386163396264363339356430393162313231623164666534653738353035303935 +34386635393839613835383237623465613132633037373165313238643630303736306438616437 +34393761366330326266323064393566353963393132326139323264646432373030663039303163 +36383164353539313539643631396330646331303863373361633736366430303038633461356437 +34343737663133366133633066393636343262616234613661306235346533376161663537633166 +37653964373862643762393834616561633734336265636134386433393564323338313131303838 +34373661653930306362613437346665323164393138323830313838383064393235323734343538 +66353536366664633366363261333035383533663635316162643764643462353563666439386430 +35313264383063366532396333653861646462323166336139323139356235633761396361313030 +32336336336233373331356235663031373563663737363163633864313965373465613937633662 +37383335373566653066383939356335653434353134653535373364633639393264313536656166 +37356437326136366433393364636131383639613364323366353436663434646264663739636637 +61303535633262613762663433366338383435326130356634323962353336336134666638643530 +66383466313237336261 diff --git a/deploy/ansible/vars.yml b/deploy/ansible/vars.yml index cb56a141..86f9ac2d 100644 --- a/deploy/ansible/vars.yml +++ b/deploy/ansible/vars.yml @@ -23,7 +23,9 @@ private_key: | # taxonomy_repo: https://instructlab-bot:{{ github_token }}@github.com/instructlab/taxonomy.git # bot_repo: https://instructlab-bot:{{ github_token }}@github.com/instructlab/instructlab-bot.git +ilab_config_file: /home/fedora/.config/instructlab/config.yml endpoint_url: +endpoint_api_key: sdg_endpoint_url: tls_client_cert: | diff --git a/deploy/ansible/worker/tasks/main.yml b/deploy/ansible/worker/tasks/main.yml index df3fa1e3..6841cba2 100644 --- a/deploy/ansible/worker/tasks/main.yml +++ b/deploy/ansible/worker/tasks/main.yml @@ -25,7 +25,7 @@ - name: Set default args for install-worker ansible.builtin.set_fact: - worker_args: "--gpu-type cuda --github-token {{ github_token }} \ + worker_args: "--github-token {{ github_token }} \ --redis-ip {{ redis_ip }} \ --nexodus-reg-key {{ nexodus_reg_key }} \ --aws-access-key-id {{ aws_access_key_id }} \ @@ -45,6 +45,13 @@ bot_repo != None and bot_repo | trim != '' +- name: Append ilab config file path + ansible.builtin.set_fact: + worker_args: "{{ worker_args }} --ilab-config-file {{ ilab_config_file }}" + when: ilab_config_file is defined and + ilab_config_file != None and + ilab_config_file | trim != '' + - name: Append args for precheck_endpoint_url ansible.builtin.set_fact: worker_args: "{{ worker_args }} --precheck-endpoint-url {{ precheck_endpoint_url }}" diff --git a/scripts/install-worker.sh b/scripts/install-worker.sh index 4ad9e8f4..52d1492a 100755 --- a/scripts/install-worker.sh +++ b/scripts/install-worker.sh @@ -14,7 +14,9 @@ OS="" REDIS_IP=${REDIS_IP:-"127.0.0.1"} WORK_DIR=${WORK_DIR:-"${HOME}/instructlab-bot"} +ILAB_CONFIG_FILE=${ILAB_CONFIG_FILE:-"./config.yaml"} PRECHECK_ENDPOINT_URL=${PRECHECK_ENDPOINT_URL:-"http://localhost:8000/v1"} +PRECHECK_API_KEY=${PRECHECK_API_KEY:-""} SDG_ENDPOINT_URL=${SDG_ENDPOINT_URL:-""} TLS_INSECURE=${TLS_INSECURE:-"false"} @@ -56,7 +58,9 @@ usage() { echo " --nexodus-reg-key REG_KEY: Optionally a registration key for Nexodus. Ex: https://try.nexodus.io#..." echo " --redis-ip IP: Optionally the IP address of the Redis server. Default: ${REDIS_IP}" echo " --work-dir DIR: Optionally the directory to use for the worker. Default: ${WORK_DIR}" + echo " --ilab-config-file FILE: File path of the InstructLab config file. Default: ./config.yaml" echo " --precheck-endpoint-url URL: The endpoint URL for the ilab precheck. Default: http://localhost:8000/v1" + echo " --precheck-api-key KEY: The API key for the ilab precheck endpoint" echo " --sdg-endpoint-url URL: The endpoint URL for the ilab sdg-svc. Default: " echo " --tls-insecure BOOL: Use insecure TLS connection. Default: ${TLS_INSECURE}" echo " --tls-client-key KEY: The TLS client key for ilab sdg-svc" @@ -112,9 +116,9 @@ install_prereqs_fedora() { go \ make \ nvtop \ - python3 \ + python3.11 \ + python3.11-devel \ python3-pip \ - python3-virtualenv \ redis \ unzip \ vim @@ -238,13 +242,13 @@ EOF install_lab() { cd "${WORK_DIR}" || (echo "Failed to change to work directory: ${WORK_DIR}" && exit 1) # Always attempt to install instructlab to make sure bot is running the latest version of stable branch. - - sudo pip install --upgrade --force-reinstall "git+https://github.com/instructlab/instructlab.git@stable" + # I think we don't need support for the local training for the instructlab bot, because it's pointing to the endpoints. if [ "${GPU_TYPE}" = "cuda" ]; then - CMAKE_ARGS="-DLLAMA_CUBLAS=on" python3 -m pip install --force-reinstall --no-cache-dir llama-cpp-python + pip3.11 cache remove llama_cpp_python + pip3.11 install 'instructlab[cuda]' -C cmake.args="-DLLAMA_CUDA=on" -C cmake.args="-DLLAMA_NATIVE=off" + pip3.11 install vllm@git+https://github.com/opendatahub-io/vllm@2024.08.01 elif [ -n "${GPU_TYPE}" ]; then - echo "Unsupported GPU_TYPE: ${GPU_TYPE}" - exit 1 + pip3.11 install instructlab fi if [ ! -f config.yaml ]; then ilab init --non-interactive @@ -274,11 +278,21 @@ AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} EOF sudo install -m 0600 labbotworker.sysconfig /etc/sysconfig/labbotworker + # Check if ILAB_CONFIG_FILE is set + if [ -n "${ILAB_CONFIG_FILE}" ]; then + EXTRA_ARGS="${EXTRA_ARGS} --ilab-config-file ${ILAB_CONFIG_FILE}" + fi + # Check if PRECHECK_ENDPOINT_URL is set if [ -n "${PRECHECK_ENDPOINT_URL}" ]; then EXTRA_ARGS="${EXTRA_ARGS} --precheck-endpoint-url ${PRECHECK_ENDPOINT_URL}" fi + # Check if PRECHECK_API_KEY is set + if [ -n "${PRECHECK_API_KEY}" ]; then + EXTRA_ARGS="${EXTRA_ARGS} --precheck-api-key ${PRECHECK_API_KEY}" + fi + # Check if SDG_ENDPOINT_URL is set if [ -n "${SDG_ENDPOINT_URL}" ]; then EXTRA_ARGS="${EXTRA_ARGS} --sdg-endpoint-url ${SDG_ENDPOINT_URL} " @@ -391,10 +405,18 @@ while [ $# -gt 0 ]; do WORK_DIR="$2" shift ;; + --ilab-config-file) + ILAB_CONFIG_FILE="$2" + shift + ;; --precheck-endpoint-url) PRECHECK_ENDPOINT_URL="$2" shift ;; + --precheck-api-key) + PRECHECK_API_KEY="$2" + shift + ;; --sdg-endpoint-url) SDG_ENDPOINT_URL="$2" shift diff --git a/worker/cmd/generate.go b/worker/cmd/generate.go index 6adf78cb..6ad8d470 100644 --- a/worker/cmd/generate.go +++ b/worker/cmd/generate.go @@ -34,6 +34,7 @@ import ( var ( WorkDir string VenvDir string + IlabConfigFile string PreCheckEndpointURL string SdgEndpointURL string NumInstructions int @@ -55,7 +56,6 @@ var ( const ( gitMaxRetries = 5 gitRetryDelay = 2 * time.Second - ilabConfigPath = "config.yaml" localEndpoint = "http://localhost:8000/v1" jobSDG = "sdg-svc" jobGenerateLocal = "generate" @@ -75,6 +75,7 @@ const ( // Worker encapsulates dependencies and methods to process jobs type Worker struct { ctx context.Context + ilabConfig *IlabConfig pool *redis.Pool svc *s3.Client logger *zap.SugaredLogger @@ -90,9 +91,10 @@ type Worker struct { cmdRun string } -func NewJobProcessor(ctx context.Context, pool *redis.Pool, svc *s3.Client, logger *zap.SugaredLogger, job, precheckEndpoint, precheckAPIKey, sdgEndpoint, tlsClientCertPath, tlsClientKeyPath, tlsServerCaCertPath string, maxSeed int) *Worker { +func NewJobProcessor(ctx context.Context, ilabConfig *IlabConfig, pool *redis.Pool, svc *s3.Client, logger *zap.SugaredLogger, job, precheckEndpoint, precheckAPIKey, sdgEndpoint, tlsClientCertPath, tlsClientKeyPath, tlsServerCaCertPath string, maxSeed int) *Worker { return &Worker{ ctx: ctx, + ilabConfig: ilabConfig, pool: pool, svc: svc, logger: logger, @@ -109,14 +111,60 @@ func NewJobProcessor(ctx context.Context, pool *redis.Pool, svc *s3.Client, logg } type IlabConfig struct { + Chat struct { + Context string `yaml:"context"` + GreedyMode bool `yaml:"greedy_mode"` + LogsDir string `yaml:"logs_dir"` + MaxTokens *int `yaml:"max_tokens"` + Model string `yaml:"model"` + Session *string `yaml:"session"` + } `yaml:"chat"` + + Evaluate struct { + BaseBranch *string `yaml:"base_branch"` + BaseModel string `yaml:"base_model"` + Branch *string `yaml:"branch"` + Gpus *string `yaml:"gpus"` + Model string `yaml:"model"` + } `yaml:"evaluate"` + Generate struct { - Model string `yaml:"model"` + ChunkWordCount int `yaml:"chunk_word_count"` + Model string `yaml:"model"` + NumCPUs int `yaml:"num_cpus"` + OutputDir string `yaml:"output_dir"` + Pipeline string `yaml:"pipeline"` + PromptFile string `yaml:"prompt_file"` + SdgScaleFactor int `yaml:"sdg_scale_factor"` + SeedFile string `yaml:"seed_file"` + TaxonomyBase string `yaml:"taxonomy_base"` + TaxonomyPath string `yaml:"taxonomy_path"` } `yaml:"generate"` + + Serve struct { + Backend *string `yaml:"backend"` + ChatTemplate *string `yaml:"chat_template"` + HostPort string `yaml:"host_port"` + ModelPath string `yaml:"model_path"` + } `yaml:"serve"` + + Train struct { + AdditionalArgs map[string]interface{} `yaml:"additional_args"` + CheckpointAtEpoch bool `yaml:"checkpoint_at_epoch"` + CkptOutputDir string `yaml:"ckpt_output_dir"` + DataOutputDir string `yaml:"data_output_dir"` + DataPath string `yaml:"data_path"` + ModelPath string `yaml:"model_path"` + SaveSamples int `yaml:"save_samples"` + } `yaml:"train"` + + Version string `yaml:"version"` } func init() { generateCmd.Flags().StringVarP(&WorkDir, "work-dir", "w", "", "Directory to work in") generateCmd.Flags().StringVarP(&VenvDir, "venv-dir", "v", "", "The virtual environment directory") + generateCmd.Flags().StringVarP(&IlabConfigFile, "ilab-config-file", "", "config.yaml", "InstructLab config file absolute path - /config.yaml") generateCmd.Flags().StringVarP(&PreCheckEndpointURL, "precheck-endpoint-url", "e", "", "Endpoint hosting the model API. Default, it assumes the model is served locally.") generateCmd.Flags().StringVarP(&PrecheckAPIKey, "precheck-api-key", "", "", "The APIKey for the precheck-endpoint-url.") generateCmd.Flags().StringVarP(&SdgEndpointURL, "sdg-endpoint-url", "", "http://localhost:8000/v1", "Endpoint hosting the model API. Default, it assumes the model is served locally.") @@ -178,6 +226,14 @@ var generateCmd = &cobra.Command{ svc := s3.NewFromConfig(cfg) + // Read ilab config file + config, err := readIlabConfig(IlabConfigFile) + if err != nil { + sugar.Fatalf("Could not read ilab config file: %v", err) + } + + sugar.Info("ilab config read from config file: %+v", config) + sigChan := make(chan os.Signal, 1) stopChan := make(chan struct{}) @@ -203,7 +259,7 @@ var generateCmd = &cobra.Command{ sugar.Errorf("Could not pop from redis queue: %v", err) continue } - NewJobProcessor(ctx, pool, svc, sugar, job, + NewJobProcessor(ctx, config, pool, svc, sugar, job, PreCheckEndpointURL, PrecheckAPIKey, SdgEndpointURL, @@ -233,7 +289,7 @@ func (w *Worker) runPrecheck(lab, outputDir, modelName string) error { if WorkDir != "" { workDir = WorkDir } - chatlogDir := path.Join(workDir, "data", "chatlogs") + chatlogDir := w.ilabConfig.Chat.LogsDir combinedYAMLPath := path.Join(outputDir, "combined_chatlogs.yaml") combinedLogPath := path.Join(outputDir, "combined_chatlogs.log") combinedYAMLHTMLPath := path.Join(outputDir, "combined_chatlogs.html") @@ -242,7 +298,7 @@ func (w *Worker) runPrecheck(lab, outputDir, modelName string) error { // Move everything from chatlogDir to outputDir chatlogFiles, err := os.ReadDir(chatlogDir) if err != nil { - w.logger.Errorf("Could not read chatlog directory: %v", err) + w.logger.Errorf("Could not read chatlog directory (%v) : %v", chatlogDir, err) return } @@ -356,11 +412,15 @@ func (w *Worker) runPrecheck(lab, outputDir, modelName string) error { yamlFileCount := 0 labDiffOutput := strings.Split(outputStr, "\n") + isKnowledge := false // Early check for YAML file presence before further processing for _, file := range labDiffOutput { if strings.HasSuffix(file, ".yaml") { yamlFileCount++ + if strings.HasPrefix(file, "knowledge/") { + isKnowledge = true + } } } @@ -370,16 +430,173 @@ func (w *Worker) runPrecheck(lab, outputDir, modelName string) error { return fmt.Errorf(errMsg) } + if isKnowledge { + w.logger.Info("PR contains knowledge contribution") + return w.runKnowledgePrecheck(lab, labDiffOutput, modelName, chatlogDir, workDir) + } + + w.logger.Info("PR contain skill contribution") + return w.runSkillPrecheck(lab, labDiffOutput, modelName, chatlogDir, workDir) +} + +func (w *Worker) runKnowledgePrecheck(lab string, labDiffOutput []string, modelName string, chatlogDir string, workDir string) error { // Proceed with YAML files processing if they exist for _, file := range labDiffOutput { if !strings.HasSuffix(file, ".yaml") { continue } - filePath := path.Join(workDir, "taxonomy", file) + filePath := path.Join(w.ilabConfig.Generate.TaxonomyPath, file) + w.logger.Infof("ANIL: opening knowledge yaml : %s", filePath) + f, err := os.Open(filePath) + if err != nil { + w.logger.Errorf("Could not open taxonomy knowledge yaml file: %v", err) + return err + } + defer f.Close() + + content, err := io.ReadAll(f) + if err != nil { + w.logger.Error(err) + return err + } + + var data map[string]interface{} + err = yaml.Unmarshal(content, &data) + if err != nil { + // Odds are, the PR was not yaml-linted since it's invalid YAML failing unmarshalling + err = fmt.Errorf("the original taxonomy YAML likely did not pass yaml-linting, here is the unmarshalling error: %v", err) + w.logger.Error(err) + return err + } + + // Check if "seed_examples" exists and is a list + seedExamples, ok := data["seed_examples"].([]interface{}) + if !ok { + err = fmt.Errorf("seed_examples not found or not a list in the knowledge") + w.logger.Error(err) + return err + } + + for seIndex, item := range seedExamples { + example, ok := item.(map[interface{}]interface{}) + if !ok { + w.logger.Error("Invalid seed example format in knowledge YAML file") + continue + } + context, ok := example["context"].(string) + if !ok { + w.logger.Error("Context not found or not a string in seed example of knowledge") + continue + } + + originalContext := context + + // Escape sequences of two or more hyphens in the question to avoid ilab seeing a flag request + context = escapeHyphens(context) + + qnaPairs, hasQnAPairs := example["questions_and_answers"].([]interface{}) + + if !hasQnAPairs { + w.logger.Errorf("Questions and answers not found or not a list in knowledge seed example %d", seIndex) + + // If there are no questions and answers, skip to the next seed example + continue + } + + for _, qnaPair := range qnaPairs { + qna, ok := qnaPair.(map[interface{}]interface{}) + if !ok { + w.logger.Errorf("Invalid question and answer format in knowledge seed example %d", seIndex) + continue + } + question, ok := qna["question"].(string) + if !ok { + w.logger.Errorf("Question not found or not a string in knowledge seed example %d", seIndex) + continue + } + + // Escape sequences of two or more hyphens in the question to avoid ilab seeing a flag request + originalQuestion := question + question = escapeHyphens(question) + // Append the context to the question with a specific format + question = fmt.Sprintf("%s %s %s.", question, ctxPrompt, context) + + commandStr := fmt.Sprintf("model chat --quick-question %s", question) + if TlsInsecure { + commandStr += " --tls-insecure" + } + if PreCheckEndpointURL != localEndpoint && modelName != "unknown" { + commandStr += fmt.Sprintf(" --endpoint-url %s --model %s", PreCheckEndpointURL, modelName) + } + if PrecheckAPIKey != "" { + commandStr += fmt.Sprintf(" --api-key %s", PrecheckAPIKey) + } + cmdArgs := strings.Fields(commandStr) + cmd := exec.Command(lab, cmdArgs...) + // Register the command for reporting/logging + w.cmdRun = cmd.String() + w.logger.Infof("Running the precheck command for knowledge contribution: %s", cmd.String()) + cmd.Dir = workDir + cmd.Env = os.Environ() + var out bytes.Buffer + var errOut bytes.Buffer + cmd.Stdout = &out + cmd.Stderr = &errOut + err = cmd.Run() + if err != nil { + w.logger.Errorf("Precheck command failed for knowledge contribution with error: %v; stderr: %s", err, errOut.String()) + continue + } + + logData := map[string]interface{}{ + "context": originalContext, + "input": map[string]string{ + "question": originalQuestion, + }, + "output": out.String(), + } + logYAML, err := yaml.Marshal(logData) + if err != nil { + w.logger.Errorf("Could not marshal log data to YAML: %v", err) + continue + } + // Generate uniquely timestamped filenames for the combined input/output YAML files + timestamp := time.Now().Format("2006-01-02T15_04_05") + logFileName := fmt.Sprintf("chat_%s.yaml", timestamp) + err = os.WriteFile(path.Join(chatlogDir, logFileName), logYAML, 0644) + if err != nil { + w.logger.Errorf("Could not write chatlog for knowledge question to file: %v", err) + continue + } + + // Create a combined .log file + logText := fmt.Sprintf("Context:\n%s\nInput:\n%s\nOutput:\n%s\n", originalContext, originalQuestion, out.String()) + logFileName = fmt.Sprintf("chat_%s.log", timestamp) + err = os.WriteFile(path.Join(chatlogDir, logFileName), []byte(logText), 0644) + if err != nil { + w.logger.Errorf("Could not write chat log for knowledge question to file: %v", err) + continue + } + // Sleep to ensure unique timestamps for filenames + time.Sleep(1 * time.Second) + } + + } + } + return nil +} + +func (w *Worker) runSkillPrecheck(lab string, labDiffOutput []string, modelName string, chatlogDir string, workDir string) error { + // Proceed with YAML files processing if they exist + for _, file := range labDiffOutput { + if !strings.HasSuffix(file, ".yaml") { + continue + } + filePath := path.Join(w.ilabConfig.Generate.TaxonomyPath, file) f, err := os.Open(filePath) if err != nil { - w.logger.Errorf("Could not open taxonomy file: %v", err) + w.logger.Errorf("Could not open taxonomy skill yaml file: %v", err) return err } defer f.Close() @@ -402,7 +619,7 @@ func (w *Worker) runPrecheck(lab, outputDir, modelName string) error { // Check if "seed_examples" exists and is a list seedExamples, ok := data["seed_examples"].([]interface{}) if !ok { - err = fmt.Errorf("seed_examples not found or not a list") + err = fmt.Errorf("seed_examples not found or not a list in skill yaml file: %s", filePath) w.logger.Error(err) return err } @@ -410,12 +627,12 @@ func (w *Worker) runPrecheck(lab, outputDir, modelName string) error { for _, item := range seedExamples { example, ok := item.(map[interface{}]interface{}) if !ok { - w.logger.Error("Invalid seed example format") + w.logger.Error("Invalid seed example format in the skill") continue } question, ok := example["question"].(string) if !ok { - w.logger.Error("Question not found or not a string") + w.logger.Error("Question not found or not a string in the skill") continue } @@ -430,7 +647,7 @@ func (w *Worker) runPrecheck(lab, outputDir, modelName string) error { // Append the context to the question with a specific format question = fmt.Sprintf("%s %s %s.", question, ctxPrompt, context) } - commandStr := fmt.Sprintf("chat --quick-question %s", question) + commandStr := fmt.Sprintf("model chat --quick-question %s", question) if TlsInsecure { commandStr += " --tls-insecure" } @@ -438,14 +655,14 @@ func (w *Worker) runPrecheck(lab, outputDir, modelName string) error { commandStr += fmt.Sprintf(" --endpoint-url %s --model %s", PreCheckEndpointURL, modelName) } if PrecheckAPIKey != "" { - commandStr += fmt.Sprintf(" --precheck-api-key %s", PrecheckAPIKey) + commandStr += fmt.Sprintf(" --api-key %s", PrecheckAPIKey) } cmdArgs := strings.Fields(commandStr) cmd := exec.Command(lab, cmdArgs...) // Register the command for reporting/logging w.cmdRun = cmd.String() - w.logger.Infof("Running the precheck command: %s", cmd.String()) + w.logger.Infof("Running the precheck command for skill contribution: %s", cmd.String()) cmd.Dir = workDir cmd.Env = os.Environ() @@ -455,7 +672,7 @@ func (w *Worker) runPrecheck(lab, outputDir, modelName string) error { cmd.Stderr = &errOut err = cmd.Run() if err != nil { - w.logger.Errorf("Precheck command failed with error: %v; stderr: %s", err, errOut.String()) + w.logger.Errorf("Precheck command for skill failed with error: %v; stderr: %s", err, errOut.String()) continue } @@ -481,7 +698,7 @@ func (w *Worker) runPrecheck(lab, outputDir, modelName string) error { logFileName := fmt.Sprintf("chat_%s.yaml", timestamp) err = os.WriteFile(path.Join(chatlogDir, logFileName), logYAML, 0644) if err != nil { - w.logger.Errorf("Could not write chatlog to file: %v", err) + w.logger.Errorf("Could not write skill question chatlog to file: %v", err) continue } @@ -490,7 +707,7 @@ func (w *Worker) runPrecheck(lab, outputDir, modelName string) error { logFileName = fmt.Sprintf("chat_%s.log", timestamp) err = os.WriteFile(path.Join(chatlogDir, logFileName), []byte(logText), 0644) if err != nil { - w.logger.Errorf("Could not write chat log to file: %v", err) + w.logger.Errorf("Could not write skill question chat log to file: %v", err) continue } @@ -555,7 +772,8 @@ func (w *Worker) processJob() { if WorkDir != "" { workDir = WorkDir } - taxonomyDir := path.Join(workDir, "taxonomy") + taxonomyDir := w.ilabConfig.Generate.TaxonomyPath + sugar = sugar.With("work_dir", workDir, "origin", Origin) // Clean up the taxonomy directory if it exists from a previous jobs @@ -591,8 +809,9 @@ func (w *Worker) processJob() { var err error modelName, err = w.fetchModelName(true) if err != nil { - w.logger.Errorf("Failed to fetch model name: %v", err) - modelName = "unknown" + w.logger.Warnf("Failed to fetch model name: %v", err) + w.logger.Warnf("Using default model name: granite-7b-lab") + modelName = "granite-7b-lab" } } else { modelName = w.getModelNameFromConfig() @@ -603,7 +822,7 @@ func (w *Worker) processJob() { case jobGenerateLocal: // @instructlab-bot generate-local // Runs generate on the local worker node - generateArgs := []string{"generate", "--num-instructions", fmt.Sprintf("%d", NumInstructions), "--output-dir", outputDir} + generateArgs := []string{"data", "generate", "--num-instructions", fmt.Sprintf("%d", NumInstructions), "--output-dir", outputDir} cmd = exec.CommandContext(w.ctx, lab, generateArgs...) if WorkDir != "" { @@ -638,7 +857,7 @@ func (w *Worker) processJob() { // @instructlab-bot generate // Runs generate on the SDG backend // ilab diff is run since the sdg generation is not part of upstream cli - cmdDiff := exec.Command("ilab", "diff") + cmdDiff := exec.Command("ilab", "taxonomy", "diff") var stderr bytes.Buffer cmdDiff.Stderr = &stderr @@ -653,9 +872,9 @@ func (w *Worker) processJob() { diffOutputLines := strings.Split(string(diffOutput), "\n") // Filter taxonomy files ending in .yaml and prepare them relative to workDir var taxonomyFiles []string - for _, line := range diffOutputLines { - if strings.HasSuffix(line, ".yaml") { - relativePath := filepath.Join("taxonomy", line) + for _, file := range diffOutputLines { + if strings.HasSuffix(file, ".yaml") { + relativePath := filepath.Join(w.ilabConfig.Generate.TaxonomyPath, file) taxonomyFiles = append(taxonomyFiles, relativePath) } } @@ -792,9 +1011,25 @@ func (w *Worker) postJobResults(URL, jobType string) { } } -// getModelNameFromConfig retrieves the model name from the config file or precheckEndpoint +func readIlabConfig(filePath string) (*IlabConfig, error) { + fmt.Printf("Reading InstructLab config file from: %s", filePath) + cfgData, err := os.ReadFile(filePath) + if err != nil { + return &IlabConfig{}, fmt.Errorf("failed to read config file: %v", err) + } + + var cfg IlabConfig + err = yaml.Unmarshal(cfgData, &cfg) + if err != nil { + return &IlabConfig{}, fmt.Errorf("failed to unmarshal config file: %v", err) + } + + return &cfg, nil +} + +// getModelNameFromConfig retrieves the model name from the config file func (w *Worker) getModelNameFromConfig() string { - cfgData, err := os.ReadFile(ilabConfigPath) + cfgData, err := os.ReadFile(IlabConfigFile) if err != nil { return "unknown" } @@ -804,8 +1039,9 @@ func (w *Worker) getModelNameFromConfig() string { if err != nil || cfg.Generate.Model == "" { return "unknown" } - - return cfg.Generate.Model + modelName := filepath.Base(cfg.Generate.Model) + w.logger.Infof("Model name from the config file: %s", modelName) + return modelName } // fetchModelName hits the defined precheckEndpoint with "/models" appended to extract the model name. @@ -827,6 +1063,10 @@ func (w *Worker) fetchModelName(fullName bool) (string, error) { return "", fmt.Errorf("failed to create request: %w", err) } + if w.precheckAPIKey != "" { + w.logger.Info("Set Authorization header with precheck API key") + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", w.precheckAPIKey)) + } resp, err := http.DefaultClient.Do(req) if err != nil { return "", fmt.Errorf("failed to fetch model details: %w", err) @@ -853,7 +1093,7 @@ func (w *Worker) fetchModelName(fullName bool) (string, error) { if err := json.Unmarshal(body, &responseData); err != nil { return "", fmt.Errorf("failed to parse JSON response: %w", err) } - + w.logger.Debugf("Received response for model request: %v", responseData) if responseData.Object != "list" { return "", fmt.Errorf("expected object type 'list', got '%s'", responseData.Object) } @@ -911,7 +1151,8 @@ func (w *Worker) determineModelName(jobType string) string { modelName, err := w.fetchModelName(false) if err != nil { w.logger.Errorf("Failed to fetch model name: %v", err) - return "unknown" + w.logger.Info("Using default model name: granite-7b-lab") + return "granite-7b-lab" } return modelName } diff --git a/worker/cmd/generate_test.go b/worker/cmd/generate_test.go index 041603c6..a55ff1e5 100644 --- a/worker/cmd/generate_test.go +++ b/worker/cmd/generate_test.go @@ -150,6 +150,7 @@ func TestFetchModelName(t *testing.T) { context.Background(), nil, nil, + nil, zap.NewExample().Sugar(), "job-id", mockServer.URL, @@ -212,6 +213,7 @@ func TestFetchModelNameWithInvalidObject(t *testing.T) { context.Background(), nil, nil, + nil, zap.NewExample().Sugar(), "job-id", mockServer.URL,