123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261 |
- function arrayUnique(a) {
- for (var i = 0; i < a.length; ++i) {
- for (var j = i + 1; j < a.length; ++j) {
- if (a[i] === a[j])
- a.splice(j--, 1);
- }
- }
- return a;
- }
- function arrayUniqueNewArray(a) {
- a = a.slice();
- arrayUnique(a);
- return a;
- }
- function arrayShuffle(a) {
- for (let i = 0; i < a.length; i++) {
- let pos = Math.floor(Math.random() * (a.length - i)) + i;
- let temp = a[i];
- a[i] = a[pos];
- a[pos] = temp;
- }
- }
- function arrayShuffleNewArray(a) {
- let nA = a.slice();
- arrayShuffle(nA);
- return nA;
- }
- class StoredVariable {
- constructor(options) {
- this.id = options.id;
- this.value = options.value;
- this.defValue = this.value;
- StoredVariable.registerVariable(this);
- }
- reset() {
- this.value = this.defValue;
- }
- updateFromObject(obj) {
- this.value = obj;
- }
- exportAsObject() {
- return this.value;
- }
- static registerVariable(variable) {
- if (StoredVariable.storedVariables[variable.id] == undefined) {
- StoredVariable.storedVariables[variable.id] = variable;
- }
- else {
- console.warn("[StoredVariable] " + variable.id + " already defined. Ignoring:", variable);
- }
- }
- static getVariable(id) {
- return StoredVariable.storedVariables[id];
- }
- static getVariables() {
- let list = [];
- for (let key in StoredVariable.storedVariables) {
- list.push(StoredVariable.storedVariables[key]);
- }
- return list;
- }
- static exportAsObject() {
- let list = {};
- for (let key in StoredVariable.storedVariables) {
- list[key] = StoredVariable.storedVariables[key].value;
- }
- return list;
- }
- static updateFromObject(obj) {
- for (let key in StoredVariable.storedVariables) {
- if (obj[key] != undefined) {
- StoredVariable.storedVariables[key].updateFromObject(obj[key]);
- }
- else {
- StoredVariable.storedVariables[key].reset();
- }
- }
- }
- }
- StoredVariable.storedVariables = {};
- class RulebookRunner {
- constructor(rulebook, noun) {
- this.rulesToExecute = [];
- this.ruleRunner = -1;
- this.rulebook = rulebook;
- this.noun = noun;
- }
- addRulebooks(...rulebooks) {
- rulebooks = arrayUniqueNewArray(rulebooks);
- rulebooks.forEach((rulebook) => {
- this.addRules(...rulebook.rules);
- });
- }
- addRules(...rules) {
- if (this.ruleRunner < 0) {
- this.rulesToExecute.push(...rules);
- }
- }
- skipRule(rule) {
- if (this.ruleRunner >= 0) {
- let index = this.rulesToExecute.indexOf(rule);
- if (index > this.ruleRunner) {
- this.rulesToExecute.splice(index, 1);
- console.debug("[Rulebook]" + this.rulebook.name + ", skipping Rule " + rule.name + " due to request.");
- }
- else {
- console.warn("[Rulebook]" + this.rulebook.name + ": uname to skip Rule" + rule.name + " due to it being too late to stop it.");
- }
- }
- }
- async execute() {
- arrayUnique(this.rulesToExecute).sort(function (a, b) {
- return a.compareTo(b);
- });
- for (this.ruleRunner = 0; this.ruleRunner < this.rulesToExecute.length; this.ruleRunner++) {
- this.rule = this.rulesToExecute[this.ruleRunner];
- let result = await this.rule.execute(this);
- if (result != undefined) {
- return result;
- }
- }
- }
- }
- class Rulebook {
- constructor(name) {
- this.rules = [];
- this.name = name;
- }
- static getStack() {
- let stack = [];
- Rulebook.rulebookStack.forEach((rl) => {
- if (rl instanceof Object && rl.name != undefined) {
- stack.push(rl.name);
- }
- else if (typeof rl == "string") {
- stack.push(rl);
- }
- else if (rl instanceof Object && rl.id != undefined) {
- stack.push(rl.id);
- }
- else {
- stack.push("Undefined");
- }
- });
- return stack;
- }
- static getIndentation() {
- return " ".repeat(Rulebook.indentantionSpaces).repeat(Rulebook.rulebookStack.length);
- }
- static increaseIndentation(rulebook) {
- Rulebook.rulebookStack.push(rulebook);
- }
- static decreaseIndentation() {
- Rulebook.rulebookStack.pop();
- }
- static isRunning(r) {
- return Rulebook.rulebookStack.indexOf(r) != -1;
- }
- isRunning() {
- return Rulebook.isRunning(this);
- }
- async execute(options, ...rulebooks) {
- options = options == undefined ? {} : options;
- let runner = new RulebookRunner(this, options.noun);
- runner.addRulebooks(this, ...rulebooks);
- var names = [];
- for (let i = 0; i < rulebooks.length; i++) {
- if (rulebooks[i] === this)
- continue;
- names.push(rulebooks[i].name);
- }
- console.debug(Rulebook.getIndentation() + "[RULEBOOK] " + this.name + (names.length > 0 ? (" merged with " + names.join(", ")) : ""));
- Rulebook.increaseIndentation(this);
- let result = await runner.execute();
- Rulebook.decreaseIndentation();
- return result;
- }
- createAndAddRule(r) {
- let rule = new Rule(r);
- this.addRule(rule);
- return rule;
- }
- addRule(r) {
- this.rules.push(r);
- }
- sortRules() {
- this.rules.sort(function (a, b) {
- return a.compareTo(b);
- });
- }
- }
- Rulebook.indentantionSpaces = 2;
- Rulebook.rulebookStack = [];
- var Settings;
- (function (Settings) {
- var debug = console.debug;
- var debugEmpty = () => { };
- Settings.hardDebug = false;
- Settings.sayTurnTime = true;
- function setDebug(isDebug) {
- if (isDebug) {
- console.debug = debug;
- }
- else {
- console.debug = debugEmpty;
- }
- }
- Settings.setDebug = setDebug;
- function isDebug() {
- return console.debug == debug;
- }
- Settings.isDebug = isDebug;
- function setHardDebug(isHardDebug) {
- Settings.hardDebug = isHardDebug;
- }
- Settings.setHardDebug = setHardDebug;
- })(Settings || (Settings = {}));
- class Rule {
- constructor(options) {
- this._priority = 0;
- this.firstPriority = 0;
- this.priority = options.priority != undefined ? options.priority : Rule.PRIORITY_MEDIUM;
- this.firstPriority = options.firstPriority != undefined ? options.firstPriority : Rule.PRIORITY_MEDIUM;
- this.name = options.name;
- this.code = options.code;
- this.createdWhere = (new Error());
- this.conditions = options.conditions != undefined ? options.conditions : () => { return true; };
- }
- async execute(rulebook) {
- if (!this.conditions(rulebook)) {
- return;
- }
- console.debug(Rulebook.getIndentation() + "[RULE] " + this.name);
- Settings.hardDebug && console.debug(this.name, this.createdWhere);
- Rulebook.increaseIndentation(this);
- rulebook.rule = this;
- let result = this.code(rulebook);
- if (result instanceof Promise) {
- result = await result;
- }
- if (result != undefined) {
- console.debug(Rulebook.getIndentation() + "Result:", result);
- }
- Rulebook.decreaseIndentation();
- return result;
- }
- get priority() {
- return this._priority;
- }
- set priority(value) {
- this._priority = value;
- }
- compareTo(b) {
- var a = this;
- if (b.firstPriority < a.firstPriority)
- return -1;
- if (a.firstPriority < b.firstPriority)
- return 1;
- if (b.priority < a.priority)
- return -1;
- if (a.priority < b.priority)
- return 1;
- return 0;
- }
- }
- Rule.PRIORITY_HIGHEST = 20;
- Rule.PRIORITY_HIGH = 15;
- Rule.PRIORITY_MEDIUM = 10;
- Rule.PRIORITY_LOW = 5;
- Rule.PRIORITY_LOWEST = 0;
- var TurnSequence;
- (function (TurnSequence) {
- TurnSequence.rulebook = new Rulebook("Turn Sequence");
- TurnSequence.playerActions = [];
- TurnSequence.lastTurnTime = 0;
- async function execute(action) {
- if (TurnSequence.playerActions.push(action) == 1) {
- let t0 = performance.now();
- console.debug(Rulebook.getIndentation() + " Player Action: " + (action ? action.getCommandText() : "none"));
- await TurnSequence.rulebook.execute({
- noun: action
- });
- TurnSequence.playerActions = [];
- let t1 = performance.now();
- TurnSequence.lastTurnTime = t1 - t0;
- console.debug("Total: " + (t1 - t0) + " milliseconds.");
- if (Settings.sayTurnTime) {
- Elements.CurrentTurnHandler.printAsContent(new Say(new SayBold("Time taken for turn: "), (t1 - t0), " milliseconds."));
- }
- }
- }
- TurnSequence.execute = execute;
- TurnSequence.PrepareElementsRule = new Rule({
- firstPriority: Rule.PRIORITY_HIGHEST,
- priority: Rule.PRIORITY_MEDIUM,
- name: "Begin Turn (Elements Side)",
- code: function (runner) {
- Elements.CurrentTurnHandler.startTurn(runner.noun);
- }
- });
- TurnSequence.rulebook.addRule(TurnSequence.PrepareElementsRule);
- TurnSequence.PlayerActionRule = new Rule({
- firstPriority: Rule.PRIORITY_HIGH,
- priority: Rule.PRIORITY_MEDIUM,
- name: "Do Player Action",
- code: async (rulebook) => {
- let playerAction = rulebook.noun;
- if (playerAction != undefined) {
- let promise = playerAction.execute();
- await promise;
- Elements.CurrentTurnHandler.printAsContent(playerAction.say);
- if (playerAction.requiresTurn) {
- WorldState.incrementPlayerTurn();
- }
- }
- }
- });
- TurnSequence.rulebook.addRule(TurnSequence.PlayerActionRule);
- TurnSequence.RunEveryTurnRulesRule = new Rule({
- firstPriority: Rule.PRIORITY_MEDIUM,
- priority: Rule.PRIORITY_MEDIUM,
- name: "Run Every Turn Rules",
- code: async function () {
- while (WorldState.isTurnWaiting()) {
- await EveryTurn.EveryTurn.execute({});
- }
- }
- });
- TurnSequence.rulebook.addRule(TurnSequence.RunEveryTurnRulesRule);
- TurnSequence.RemoveTurnFromElementsRule = new Rule({
- firstPriority: Rule.PRIORITY_LOWEST,
- priority: Rule.PRIORITY_MEDIUM,
- name: "End Turn (Elements/Controls Side)",
- code: async function (rulebook) {
- Elements.CurrentTurnHandler.endTurn();
- Controls.KeyHandler.reset();
- await Elements.HyperlinkHandler.hyperlinkCommonActions();
- await Elements.RoomHandler.updateRoom();
- await Elements.RememberedHandler.updateMap();
- let playerAction = rulebook.noun;
- if (playerAction) {
- await Elements.HyperlinkHandler.hyperlinkObject(playerAction.getNoun(0));
- }
- else {
- await Elements.HyperlinkHandler.hyperlinkObject();
- }
- await Elements.InventoryHandler.updateInventory();
- await Elements.AppearanceHandler.updateAppearance();
- }
- });
- TurnSequence.rulebook.addRule(TurnSequence.RemoveTurnFromElementsRule);
- })(TurnSequence || (TurnSequence = {}));
- var Version;
- (function (Version) {
- Version.currentVersion = [0, 1, 0];
- function compareVersion(v1, v2) {
- if (v1[0] < v2[0])
- return -1;
- else if (v1[0] > v2[0])
- return 1;
- if (v1[1] < v2[1])
- return -1;
- else if (v1[1] > v2[1])
- return 1;
- if (v1[2] < v2[2])
- return -1;
- else if (v1[2] > v2[2])
- return 1;
- return 0;
- }
- Version.compareVersion = compareVersion;
- function getCurrentVersion() {
- let v = Version.currentVersion;
- return v[0] + "." + v[1] + "." + v[2];
- }
- Version.getCurrentVersion = getCurrentVersion;
- document.title = document.title + " [" + getCurrentVersion() + "] ";
- })(Version || (Version = {}));
- var Controls;
- (function (Controls) {
- var Memory;
- (function (Memory) {
- let versionSet = false;
- let settingsVersion = Version.currentVersion;
- let versionId = "Version";
- let memoryPrefix = "obelisk_";
- let memories = {};
- function getValue(id, defValue) {
- let storage = localStorage.getItem(memoryPrefix + id);
- return storage == undefined ? defValue : JSON.parse(storage);
- }
- Memory.getValue = getValue;
- function setValue(id, value) {
- localStorage.setItem(memoryPrefix + id, JSON.stringify(value));
- if (!versionSet) {
- versionSet = true;
- settingsVersion = getValue(versionId, Version.currentVersion);
- setValue(versionId, Version.currentVersion);
- }
- if (settingsVersion == undefined) { }
- }
- Memory.setValue = setValue;
- function registerMemory(mem) {
- if (memories[mem.getId()] != undefined) {
- console.error("[Controls.Memory] Memory already registered on id " + mem.getId(), "Old:", memories[mem.getId()], "New:", mem);
- }
- else {
- memories[mem.getId()] = mem;
- mem.setValueFromLocalStorageDoNotInvoke(getValue(mem.getId(), mem.getValue()));
- let updateF = () => {
- Controls.Memory.setValue(mem.getId(), mem.getValue());
- };
- mem.addListener(updateF);
- updateF();
- }
- }
- Memory.registerMemory = registerMemory;
- })(Memory = Controls.Memory || (Controls.Memory = {}));
- })(Controls || (Controls = {}));
- class StoredMemory {
- constructor(id, value) {
- this.listeners = [];
- this.id = id;
- this.value = value;
- Controls.Memory.registerMemory(this);
- }
- setValueFromLocalStorageDoNotInvoke(value) {
- this.value = value;
- }
- storeValue(value) {
- if (JSON.stringify(value) !== JSON.stringify(this.value)) {
- this.value = value;
- this.triggerListeners();
- }
- }
- getValue() {
- return this.value;
- }
- getId() {
- return this.id;
- }
- addListener(listener) {
- this.listeners.push(listener);
- }
- triggerListeners() {
- for (var i = 0; i < this.listeners.length; i++) {
- this.listeners[i](this);
- }
- }
- }
- var SaveHandler;
- (function (SaveHandler) {
- let saveName = "Obelisk_Save";
- let saveExtension = "obsav";
- let storagePrefix = "save_";
- let saveSlot = 0;
- let errors = [];
- let erasing = false;
- let virgin = new StoredMemory("First time saving", true);
- SaveHandler.AfterLoad = new Rulebook("After loading");
- async function readFile() {
- let element = document.createElement("input");
- element.type = "file";
- element.accept = "." + saveExtension;
- let promise = new Promise((resolve, reject) => {
- element.onchange = () => {
- if (element.files.length == 0) {
- resolve(undefined);
- }
- else {
- var fr = new FileReader();
- fr.onload = (ev) => {
- resolve(ev.target['result']);
- };
- fr.readAsText(element.files[0]);
- }
- };
- });
- element.click();
- return promise;
- }
- SaveHandler.readFile = readFile;
- function download(filename, text) {
- var element = document.createElement('a');
- element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
- element.setAttribute('download', filename);
- element.style.display = 'none';
- document.body.appendChild(element);
- element.click();
- document.body.removeChild(element);
- }
- function loadSave() {
- let input = document.createElement("input");
- input.type = "file";
- input.accept = "." + saveExtension;
- document.body.appendChild(input);
- input.addEventListener("change", () => {
- let reader = new FileReader();
- reader.onload = () => {
- let text = reader.result;
- SaveHandler.loadGame(JSON.parse(text));
- };
- reader.readAsText(input.files[0]);
- });
- input.click();
- document.body.removeChild(input);
- }
- SaveHandler.loadSave = loadSave;
- function getItem(thing) {
- let item;
- if (thing.Unique) {
- item = Thing.getUnique(thing.Name);
- }
- else {
- let items = Thing.getNonUnique(thing.Name);
- if (items.length > 0) {
- item = items[0];
- }
- if (item == undefined) {
- let error = thing.Name + " no longer exists.";
- console.error("[SaveHandler] " + error);
- errors.push(error);
- return undefined;
- }
- else {
- item = item.clone(true);
- }
- }
- item.setChanges(thing.Changes);
- return item;
- }
- function loadGame(saveStruc) {
- let player = WorldState.player;
- StoredVariable.updateFromObject(saveStruc.Variables);
- WorldState.setCurrentTurn(saveStruc.Rounds);
- Thing.WearRelation.getRight(player).forEach((thing) => {
- Thing.WearRelation.unsetRight(thing);
- });
- Thing.WieldRelation.getRight(player).forEach((thing) => {
- Thing.WieldRelation.unsetRight(thing);
- });
- Thing.CarryRelation.getRight(player).forEach((thing) => {
- Thing.CarryRelation.unsetRight(thing);
- });
- saveStruc.Wielded.forEach((thing) => {
- let item = getItem(thing);
- if (item != undefined)
- WorldState.player.setWielded(item);
- });
- saveStruc.Worn.forEach((thing) => {
- let item = getItem(thing);
- if (item != undefined)
- WorldState.player.setWorn(item);
- });
- saveStruc.Carried.forEach((thing) => {
- let item = getItem(thing);
- if (item != undefined)
- WorldState.player.setCarried(item);
- });
- let savedPlayer = saveStruc.Player;
- player.setName(savedPlayer.Name);
- player.setChanges(savedPlayer.PlayerChanges);
- savedPlayer.Parts.forEach((part) => {
- let bpList = player.getPartsByName(part.Name);
- if (bpList != undefined) {
- bpList[0].setChanges(part.Changes);
- }
- });
- saveStruc.UniqueThings.forEach((savedThing) => {
- let thing = Thing.getUnique(savedThing.Name);
- if (thing != undefined) {
- thing.setChanges(savedThing.Changes);
- }
- });
- }
- SaveHandler.loadGame = loadGame;
- function exportPlayer() {
- return {
- Name: WorldState.player.getName(),
- PlayerChanges: WorldState.player.getChanges(),
- Parts: exportThings(WorldState.player.getParts())
- };
- }
- function exportThings(arr, changedOnly) {
- let obj = [];
- for (let i = 0; i < arr.length; i++) {
- let thing = arr[i];
- let savedThing = {
- Unique: thing.isUnique(),
- Name: thing.getName(),
- Changes: thing.getChanges()
- };
- if (!changedOnly || Object.keys(savedThing.Changes).length > 0) {
- obj.push(savedThing);
- }
- }
- return obj;
- }
- SaveHandler.exportThings = exportThings;
- function getSaveStructure() {
- let variables = StoredVariable.getVariables();
- let savedVariables = {};
- for (let i = 0; i < variables.length; i++) {
- savedVariables[variables[i].id] = variables[i].exportAsObject();
- }
- let wielded = Thing.WieldRelation.getRight(WorldState.player);
- let worn = Thing.WearRelation.getRight(WorldState.player);
- let carried = Thing.CarryRelation.getRight(WorldState.player);
- let saveStruc = {
- Variables: savedVariables,
- UniqueThings: exportThings(Thing.getUniques()),
- Wielded: exportThings(wielded),
- Worn: exportThings(worn),
- Carried: exportThings(carried),
- Player: exportPlayer(),
- Rounds: WorldState.getCurrentTurn(),
- Date: new Date().toLocaleString()
- };
- console.debug("[SaveHandler] Created Save Structure", saveStruc);
- return saveStruc;
- }
- SaveHandler.getSaveStructure = getSaveStructure;
- function setSlot(slotN) {
- saveSlot = slotN;
- }
- SaveHandler.setSlot = setSlot;
- function saveToStorage() {
- Controls.Memory.setValue(storagePrefix + saveSlot, getSaveStructure());
- }
- SaveHandler.saveToStorage = saveToStorage;
- async function loadFromStorage() {
- if (!erasing) {
- let saveStruct = (Controls.Memory.getValue(storagePrefix + saveSlot, undefined));
- if (saveStruct != undefined) {
- loadGame(saveStruct);
- return await SaveHandler.AfterLoad.execute({ noun: saveStruct });
- }
- }
- await CharacterCreation.rulebook.execute({});
- }
- SaveHandler.loadFromStorage = loadFromStorage;
- async function loadFromFile() {
- PlayBegins.LOAD_FAILED = false;
- let promise = readFile();
- let finishedAny;
- let realPromise = new Promise((resolve) => {
- finishedAny = resolve;
- });
- let say = new Say("No save file was loaded.", Say.PARAGRAPH_BREAK, Say.CENTERED, new SayBold("Press any key to return."));
- let sayElements = await Elements.CurrentTurnHandler.getSayElementsAsContent(say);
- Elements.CurrentTurnHandler.print(...sayElements);
- let nextKey = Controls.KeyHandler.getNextKey();
- promise.then((file) => {
- Controls.KeyHandler.stopGivingNextKey(nextKey);
- Elements.CurrentTurnHandler.unprint(...sayElements);
- loadGame(getFromFile(file));
- finishedAny();
- });
- nextKey.then((keyCode) => {
- PlayBegins.LOAD_FAILED = true;
- finishedAny();
- });
- await realPromise;
- }
- SaveHandler.loadFromFile = loadFromFile;
- function getSayForSlot(slotNumber) {
- let saveStruct = (Controls.Memory.getValue(storagePrefix + slotNumber, undefined));
- if (saveStruct == undefined) {
- return new Say("New Game");
- }
- else {
- let erasingText = erasing ? "(ERASE) - " : "";
- return new Say(erasingText, saveStruct.Player.Name + " - Turns: " + saveStruct.Rounds + " - Last Played: " + saveStruct.Date);
- }
- }
- SaveHandler.getSayForSlot = getSayForSlot;
- function getFromFile(saveText) {
- return JSON.parse(decodeURIComponent(atob(saveText)));
- }
- SaveHandler.getFromFile = getFromFile;
- function saveToFile() {
- download(saveName + "." + saveExtension, btoa(unescape(encodeURIComponent((JSON.stringify(getSaveStructure()))))));
- }
- SaveHandler.saveToFile = saveToFile;
- function isErasing() {
- return erasing;
- }
- SaveHandler.isErasing = isErasing;
- function toggleErasing() {
- erasing = !erasing;
- }
- SaveHandler.toggleErasing = toggleErasing;
- function isVirgin() {
- let was = virgin.getValue();
- virgin.storeValue(false);
- return was;
- }
- SaveHandler.isVirgin = isVirgin;
- })(SaveHandler || (SaveHandler = {}));
- TurnSequence.rulebook.createAndAddRule({
- name: "Save game to Storage",
- priority: Rule.PRIORITY_LOWEST,
- firstPriority: Rule.PRIORITY_LOWEST,
- code: () => {
- SaveHandler.saveToStorage();
- }
- });
- class CharacterOrigin {
- constructor(id) {
- this.confirmPicked = () => { };
- this.id = id;
- CharacterOrigin.storeOrigin(this);
- }
- static storeOrigin(origin) {
- CharacterOrigin.origins[origin.id] = origin;
- }
- static getOrigin(id) {
- return CharacterOrigin.origins[id];
- }
- static getOrigins() {
- let origins = [];
- for (let id in CharacterOrigin.origins) {
- origins.push(CharacterOrigin.origins[id]);
- }
- origins.sort((a, b) => {
- let na = a.name.toUpperCase();
- let nb = b.name.toUpperCase();
- if (na < nb)
- return -1;
- if (na > nb)
- return 1;
- return 0;
- });
- return origins;
- }
- }
- CharacterOrigin.origins = {};
- var CharacterCreation;
- (function (CharacterCreation) {
- CharacterCreation.ChampionOrigin = new CharacterOrigin("Champion");
- CharacterCreation.ChampionOrigin.name = "Champion";
- CharacterCreation.ChampionOrigin.description = "You were born in the small village of Southwood in the post-Tower world. Chosen by the village elder, you were trained relentlessly as soon as you became able to walk. Your mission: get to the Tower and find a way to destroy it. Unbeknownst to you, this is little more than a sacrifice ritual and you are just it's latest victim. The village doesn't actually expect you to succeed, you are merely a gift to the Tower, so that it will not destroy Southwood.";
- CharacterCreation.ChampionOrigin.bonusStats = "This origin grants a +1 Bonus to every attribute, but you will be stuck with some perks gained through your training.";
- CharacterCreation.ChampionOrigin.confirmPicked = () => {
- let player = WorldState.player;
- function increaseStat(attr) {
- player.setStat(attr, player.getStat(attr) + 1);
- }
- increaseStat(Attributes.Strength);
- increaseStat(Attributes.Charm);
- increaseStat(Attributes.Agility);
- increaseStat(Attributes.Intelligence);
- };
- })(CharacterCreation || (CharacterCreation = {}));
- var CharacterCreation;
- (function (CharacterCreation) {
- CharacterCreation.PlayerOrigin = new StoredVariable({ id: "Player Origin", value: CharacterCreation.ChampionOrigin.id });
- function getOrigin() {
- return CharacterOrigin.getOrigin(CharacterCreation.PlayerOrigin.value);
- }
- CharacterCreation.getOrigin = getOrigin;
- CharacterCreation.rulebook = new Rulebook("Character Creation");
- })(CharacterCreation || (CharacterCreation = {}));
- class Perk extends StoredVariable {
- constructor(id) {
- super({
- id: "Perk_" + id,
- value: false
- });
- this.forcedStatus = () => { return undefined; };
- this.description = "Undefined";
- this.confirmPicked = () => { };
- this.name = id;
- Perk.storePerk(this);
- }
- isEnabled(valueOnly) {
- if (valueOnly != true) {
- let forced = this.forcedStatus(this);
- if (forced != undefined) {
- return forced;
- }
- }
- return this.value;
- }
- isForced() {
- return this.forcedStatus(this) != undefined;
- }
- getDescription() {
- if (typeof this.description == "function") {
- return this.description(this);
- }
- else {
- return this.description;
- }
- }
- static storePerk(perk) {
- Perk.perks[perk.id] = perk;
- }
- static getPerk(id) {
- return Perk.perks[id];
- }
- static getPerks() {
- let perks = [];
- for (let id in Perk.perks) {
- perks.push(Perk.perks[id]);
- }
- perks.sort((a, b) => {
- let na = a.name.toUpperCase();
- let nb = b.name.toUpperCase();
- if (na < nb)
- return -1;
- if (na > nb)
- return 1;
- return 0;
- });
- return perks;
- }
- static updatePerks() {
- for (let id in Perk.perks) {
- let perk = Perk.perks[id];
- if (perk.isForced()) {
- perk.value = perk.forcedStatus(perk);
- }
- }
- }
- }
- Perk.perks = {};
- class OneOf {
- constructor(randomMode, ...poss) {
- this.possibilities = [];
- this.cyclingOrder = 0;
- this.randomMode = randomMode;
- this.possibilities = poss;
- if (this.randomMode == OneOf.ROTATING_RANDOM) {
- this.availablePossibilites = this.possibilities.slice();
- }
- }
- getOne() {
- if (this.randomMode == OneOf.PURELY_AT_RANDOM) {
- return this.possibilities[Math.floor(Math.random() * this.possibilities.length)];
- }
- else if (this.randomMode == OneOf.ROTATING_RANDOM) {
- if (this.availablePossibilites.length < 1) {
- this.availablePossibilites = this.possibilities.slice();
- }
- return this.availablePossibilites.splice(Math.floor(Math.random() * this.availablePossibilites.length), 1)[0];
- }
- else if (this.randomMode == OneOf.CYCLING) {
- var r = this.possibilities[this.cyclingOrder++];
- if (this.cyclingOrder > this.possibilities.length) {
- this.cyclingOrder = 0;
- }
- return r;
- }
- }
- }
- OneOf.PURELY_AT_RANDOM = 0;
- OneOf.ROTATING_RANDOM = 1;
- OneOf.CYCLING = 2;
- var MachineBegins;
- (function (MachineBegins) {
- MachineBegins.rulebook = new Rulebook("Machine Begins");
- function execute() {
- MachineBegins.rulebook.execute({});
- }
- MachineBegins.execute = execute;
- })(MachineBegins || (MachineBegins = {}));
- document.addEventListener("DOMContentLoaded", () => {
- MachineBegins.execute();
- });
- var Elements;
- (function (Elements) {
- Elements.animationTime = 1000;
- Elements.isMobile = /Mobi/i.test(navigator.userAgent);
- Elements.screenWidth = document.body.clientWidth;
- Elements.screenHeight = document.body.clientHeight;
- function getLinkElements(image) {
- if (Elements.CurrentTurnHandler == undefined)
- return [];
- if (Elements.CurrentTurnHandler.isTurn() || image) {
- return [Elements.CurrentTurnHandler.currentTurnTab];
- }
- else {
- return [Elements.HyperlinkHandler.linkedActionsTab, Elements.RoomHandler.currentRoomTab, Elements.HyperlinkHandler.commonActionsTab, Elements.CurrentTurnHandler.currentTurnTab, Elements.RoomHandler.currentRoomExits];
- }
- }
- Elements.getLinkElements = getLinkElements;
- function updateScreenSize() {
- Elements.screenWidth = document.body.clientWidth;
- Elements.screenHeight = document.body.clientHeight;
- }
- Elements.updateScreenSize = updateScreenSize;
- Elements.mainPage = document.getElementById("mainPage");
- function startTurn() {
- Elements.mainPage.classList.add("turn");
- }
- Elements.startTurn = startTurn;
- function endTurn() {
- Elements.mainPage.classList.remove("turn");
- }
- Elements.endTurn = endTurn;
- function isInTurn() {
- return Elements.mainPage.classList.contains("turn");
- }
- Elements.isInTurn = isInTurn;
- let menuOutsideofTurn = false;
- let menus = 0;
- function startMenu() {
- if (!isInTurn()) {
- menuOutsideofTurn = true;
- startTurn();
- }
- Elements.mainPage.classList.add("mainmenu");
- menus++;
- Elements.CurrentTurnHandler.clear();
- Controls.KeyHandler.reset();
- }
- Elements.startMenu = startMenu;
- function endMenu() {
- Elements.CurrentTurnHandler.clear();
- if (--menus == 0) {
- if (menuOutsideofTurn) {
- endTurn();
- }
- resetMenus();
- }
- }
- Elements.endMenu = endMenu;
- function resetMenus() {
- if (menus != 0) {
- console.error("A menu wasn't finished properly. Please correct the dialogue.");
- }
- menus = 0;
- menuOutsideofTurn = false;
- Elements.mainPage.classList.remove("mainmenu");
- }
- Elements.resetMenus = resetMenus;
- function clearMainScreen() {
- Elements.CurrentTurnHandler.clear();
- }
- Elements.clearMainScreen = clearMainScreen;
- let loadingScreen = document.getElementById("loadingScreen");
- function stopLoading() {
- document.body.removeChild(loadingScreen);
- }
- Elements.stopLoading = stopLoading;
- async function waitForAnyKey() {
- let say = new Say(Say.CENTERED, new SayBold("Press any key to continue."));
- let elements = await say.getHTML("p", ["content"]);
- Elements.CurrentTurnHandler.print(...elements);
- await Controls.KeyHandler.getNextKey();
- Elements.CurrentTurnHandler.unprint(...elements);
- }
- Elements.waitForAnyKey = waitForAnyKey;
- async function waitForSpaceKey() {
- let say = new Say(Say.CENTERED, new SayBold("Press Space to continue."));
- let elements = await say.getHTML("p", ["content"]);
- Elements.CurrentTurnHandler.print(...elements);
- let lastKey = "notSpace";
- while (lastKey != "Space" && lastKey != "Click") {
- lastKey = (await Controls.KeyHandler.getNextKey()).evCode;
- }
- Elements.CurrentTurnHandler.unprint(...elements);
- }
- Elements.waitForSpaceKey = waitForSpaceKey;
- function printObeliskLogo() {
- let say = new Say(Say.CENTERED, new SayImage("introLogo"), Say.LINE_BREAK, new SayItalic("The Obelisk is an adult interactive fiction game set in a post-apocalyptic world ravaged by a magical structure."));
- Elements.CurrentTurnHandler.printAsContent(say);
- }
- Elements.printObeliskLogo = printObeliskLogo;
- })(Elements || (Elements = {}));
- if (Elements.isMobile) {
- Elements.mainPage.classList.add("mobile");
- }
- window.addEventListener("resize", function () {
- Elements.updateScreenSize();
- });
- var MachineBegins;
- (function (MachineBegins) {
- MachineBegins.HideLoadingDivRule = MachineBegins.rulebook.createAndAddRule({
- name: "Hide loading div",
- code: runner => {
- Elements.stopLoading();
- }
- });
- })(MachineBegins || (MachineBegins = {}));
- var TurnSequence;
- (function (TurnSequence) {
- TurnSequence.LazilyFixMenus = TurnSequence.rulebook.createAndAddRule({
- name: "Fix menus that were never closed because the dev is stupid",
- firstPriority: Rule.PRIORITY_LOWEST,
- priority: Rule.PRIORITY_LOWEST,
- code: () => {
- Elements.resetMenus();
- }
- });
- })(TurnSequence || (TurnSequence = {}));
- var Controls;
- (function (Controls) {
- var KeyHandler;
- (function (KeyHandler) {
- let promiseStack = [];
- let promiseOriginalStack = [];
- function rejectPromise(promise) {
- promiseStack.splice(promiseStack.indexOf(promise), 1);
- promiseOriginalStack.splice(promiseStack.indexOf(promise), 1);
- }
- KeyHandler.rejectPromise = rejectPromise;
- function createKeyCode(ev) {
- let name = ev.key.toUpperCase();
- let representation = name;
- let evCode = ev.code;
- if (ev.shiftKey) {
- name = "Shift + " + name;
- evCode = "Sh" + evCode;
- representation = "S" + representation;
- }
- if (ev.altKey) {
- name = "Alt + " + name;
- evCode = "Al" + evCode;
- representation = "A" + representation;
- }
- if (ev.ctrlKey) {
- name = "Control + " + name;
- evCode = "Ct" + evCode;
- representation = "C" + representation;
- }
- let keyCode = {
- evCode: evCode,
- name: name,
- representation: representation
- };
- return keyCode;
- }
- KeyHandler.createKeyCode = createKeyCode;
- window.addEventListener("mousedown", function (event) {
- let keyCode = {
- representation: "Click",
- evCode: "Click",
- name: "Click"
- };
- let promise = promiseStack.shift();
- if (promise != undefined) {
- promise(keyCode);
- promiseOriginalStack.shift();
- return;
- }
- });
- window.addEventListener("keydown", function (event) {
- let keyCode = createKeyCode(event);
- let promise = promiseStack.shift();
- if (promise != undefined) {
- promise(keyCode);
- promiseOriginalStack.shift();
- return;
- }
- if (keyCode.evCode == KeyHandler.scrollKeyCode.getValue().evCode) {
- Elements.CurrentTurnHandler.scrollSpace();
- return;
- }
- else if (keyCode.evCode == KeyHandler.imageKeyCode.getValue().evCode) {
- if (SayImage.imageViewer.style.display == "block") {
- SayImage.imageViewer.style.display = "none";
- }
- else {
- let images = Elements.CurrentTurnHandler.currentTurnTab.getElementsByClassName("contentImage");
- if (images.length > 0) {
- images[images.length - 1].click();
- }
- }
- return;
- }
- let ele;
- Elements.getLinkElements().some((element) => {
- let keyables = element.getElementsByClassName("keyable");
- for (let i = 0; i < keyables.length; i++) {
- if (keyables[i].dataset['shortcutcode'] == keyCode.evCode) {
- ele = keyables[i];
- return true;
- }
- }
- return false;
- });
- if (ele != undefined) {
- ele.click();
- }
- });
- function createKeyCodes(codes, keys, mods) {
- let arr = [];
- for (let mod = 0; mod < 4; mod++) {
- if (mod == 0 || mods[mod] == true) {
- for (let i = 0; i < codes.length; i++) {
- let name = keys[i];
- let representation = keys[i];
- let evCode = codes[i];
- if (mod == 1) {
- name = "Shift + " + name;
- evCode = "Sh" + evCode;
- representation = "S" + representation;
- }
- if (mod == 2) {
- name = "Alt + " + name;
- evCode = "Al" + evCode;
- representation = "A" + representation;
- }
- if (mod == 3) {
- name = "Control + " + name;
- evCode = "Ct" + evCode;
- representation = "C" + representation;
- }
- let keyCode = {
- evCode: evCode,
- representation: representation,
- name: name
- };
- arr.push(keyCode);
- }
- }
- }
- return arr;
- }
- KeyHandler.createKeyCodes = createKeyCodes;
- KeyHandler.scrollKeyCode = new StoredMemory("scrollKeyCode", {
- evCode: "Space",
- representation: "Space"
- });
- KeyHandler.imageKeyCode = new StoredMemory("imageKeyCode", {
- evCode: "KeyI",
- representation: "I"
- });
- KeyHandler.keyCodes1 = new StoredMemory("keyCodesRoom", createKeyCodes(["Digit1", "Digit2", "Digit3", "Digit4", "Digit5"], ["1", "2", "3", "4", "5"], [true, true, true, true]));
- KeyHandler.keyCodes2 = new StoredMemory("keyCodesActions", createKeyCodes(["KeyQ", "KeyW", "KeyE", "KeyR", "KeyT"], ["Q", "W", "E", "R", "T"], [true, true, true, true]));
- KeyHandler.keyCodes3 = new StoredMemory("keyCodesGlobal", createKeyCodes(["KeyF", "KeyV", "KeyG", "KeyB"], ["F", "V", "G", "B"], [true, true, true, true]));
- KeyHandler.keyCodeNorth = new StoredMemory("keyCodeNorth", {
- evCode: "KeyS",
- representation: "S"
- });
- KeyHandler.keyCodeEast = new StoredMemory("keyCodeEast", {
- evCode: "KeyC",
- representation: "C"
- });
- KeyHandler.keyCodeSouth = new StoredMemory("keyCodeSouth", {
- evCode: "KeyX",
- representation: "X"
- });
- KeyHandler.keyCodeWest = new StoredMemory("keyCodeWest", {
- evCode: "KeyZ",
- representation: "Z"
- });
- KeyHandler.keyCodeUp = new StoredMemory("keyCodeUp", {
- evCode: "KeyA",
- representation: "A"
- });
- KeyHandler.keyCodeDown = new StoredMemory("keyCodeDown", {
- evCode: "KeyD",
- representation: "D"
- });
- var directionCodeByIndex = [KeyHandler.keyCodeNorth, undefined, KeyHandler.keyCodeEast, undefined,
- KeyHandler.keyCodeSouth, undefined, KeyHandler.keyCodeWest, undefined, KeyHandler.keyCodeUp, KeyHandler.keyCodeDown];
- function getDirectionCode(direction) {
- return getDirectionCodeByIndex(Room.DIRECTIONS.indexOf(direction));
- }
- KeyHandler.getDirectionCode = getDirectionCode;
- function getDirectionCodeByIndex(index) {
- return directionCodeByIndex[index].getValue();
- }
- KeyHandler.getDirectionCodeByIndex = getDirectionCodeByIndex;
- KeyHandler.available1 = [];
- KeyHandler.available2 = [];
- KeyHandler.available3 = [];
- function reset() {
- KeyHandler.available1 = KeyHandler.keyCodes1.getValue().slice();
- KeyHandler.available2 = KeyHandler.keyCodes2.getValue().slice();
- KeyHandler.available3 = KeyHandler.keyCodes3.getValue().slice();
- }
- KeyHandler.reset = reset;
- let showKeys = new StoredMemory("ShowKeys", !Elements.isMobile);
- function applyCode(element, code) {
- if (code == undefined) {
- delete (element.dataset['shortcut']);
- delete (element.dataset['shortcutcode']);
- element.classList.remove("keyable");
- }
- else {
- element.dataset['shortcutcode'] = code.evCode;
- if (showKeys.getValue()) {
- element.dataset['shortcut'] = code.representation;
- }
- element.classList.add("keyable");
- }
- }
- KeyHandler.applyCode = applyCode;
- function getFirstKeyCode() {
- let chosen = KeyHandler.available1.length > 0 ? KeyHandler.available1 :
- KeyHandler.available2.length > 0 ? KeyHandler.available2 :
- KeyHandler.available3.length > 0 ? KeyHandler.available3 : undefined;
- if (chosen != undefined) {
- return chosen.shift();
- }
- return undefined;
- }
- KeyHandler.getFirstKeyCode = getFirstKeyCode;
- function getSecondKeyCode() {
- let chosen = KeyHandler.available2.length > 0 ? KeyHandler.available2 :
- KeyHandler.available3.length > 0 ? KeyHandler.available3 : undefined;
- if (chosen != undefined) {
- return chosen.splice(0, 1)[0];
- }
- return undefined;
- }
- KeyHandler.getSecondKeyCode = getSecondKeyCode;
- function getThirdKeyCode() {
- let chosen = KeyHandler.available3.length > 0 ? KeyHandler.available3 : undefined;
- if (chosen != undefined) {
- return chosen.splice(0, 1)[0];
- }
- return undefined;
- }
- KeyHandler.getThirdKeyCode = getThirdKeyCode;
- function getNextKey(timeout) {
- let timeoutNumber;
- let promise = (new Promise((resolve, reject) => {
- promiseStack.push(resolve);
- if (timeout != undefined) {
- timeoutNumber = setTimeout(() => {
- KeyHandler.rejectPromise(resolve);
- reject();
- }, timeout * 1000);
- }
- }));
- promise.then(() => {
- clearTimeout(timeoutNumber);
- });
- return promise;
- }
- KeyHandler.getNextKey = getNextKey;
- function stopGivingNextKey(originalPromise) {
- let index = promiseOriginalStack.indexOf(originalPromise);
- if (index != -1) {
- rejectPromise(promiseStack[index]);
- }
- }
- KeyHandler.stopGivingNextKey = stopGivingNextKey;
- })(KeyHandler = Controls.KeyHandler || (Controls.KeyHandler = {}));
- })(Controls || (Controls = {}));
- class SayImage {
- constructor(imgName) {
- this.imgName = imgName;
- if (!SayImage.loadTimeCheck && SayImage.imageNames.indexOf(this) == -1) {
- SayImage.imageNames.push(this);
- }
- }
- isImageDefined() {
- try {
- for (var i = 0; i < document.styleSheets.length; i++) {
- var rules = document.styleSheets[i]['rules'] || document.styleSheets[i]['cssRules'];
- for (var x in rules) {
- if (typeof rules[x].selectorText == 'string' && rules[x].selectorText == "." + this.imgName) {
- return true;
- }
- }
- }
- return false;
- }
- catch (e) {
- console.warn("Can't check for undefined images.");
- return true;
- }
- }
- getImageElement() {
- let img = document.createElement("div");
- if (this.isImageDefined()) {
- img.classList.add(this.imgName);
- img.classList.add("contentImage");
- }
- else {
- img.classList.add("error");
- img.appendChild(document.createTextNode("Image \"" + this.imgName + "\" not found."));
- }
- img.addEventListener("click", () => {
- SayImage.showInViewer(this);
- });
- Controls.KeyHandler.applyCode(img, Controls.KeyHandler.imageKeyCode.getValue());
- return img;
- }
- getPrintedElement() {
- return [this.getImageElement()];
- }
- static doLoadTimeCheck() {
- for (let i = 0; i < SayImage.imageNames.length; i++) {
- let image = SayImage.imageNames[i];
- if (!image.isImageDefined()) {
- if (Settings.hardDebug) {
- Elements.CurrentTurnHandler.printAsError("Image \"" + image.imgName + "\" was not found.");
- }
- console.error("Image \"" + image.imgName + "\" was not found.");
- }
- }
- SayImage.loadTimeCheck = true;
- }
- static showInViewer(image) {
- if (!(SayImage.imageViewer.style.display == 'block')) {
- SayImage.imageViewer.addEventListener("click", () => {
- SayImage.imageViewer.style.display = "none";
- });
- SayImage.imageViewer.className = image.imgName;
- SayImage.imageViewer.style.display = "block";
- }
- else {
- SayImage.imageViewer.style.display = "none";
- }
- }
- }
- SayImage.imageNames = [];
- SayImage.loadTimeCheck = false;
- SayImage.imageViewer = document.getElementById("imageViewer");
- var MachineBegins;
- (function (MachineBegins) {
- MachineBegins.ImageLoadTimeCheck = MachineBegins.rulebook.createAndAddRule({
- firstPriority: Rule.PRIORITY_HIGHEST,
- name: "Check for undefined images",
- code: () => {
- try {
- SayImage.doLoadTimeCheck();
- }
- catch (e) {
- console.warn("Can't check for undefined images.");
- }
- }
- });
- })(MachineBegins || (MachineBegins = {}));
- class SayableObject {
- }
- class Say {
- constructor(...objs) {
- this.sequence = [];
- this.skipbreaks = false;
- this.centered = false;
- this.add(...objs);
- }
- add(...objs) {
- this.sequence.push(...objs);
- }
- remove(...objs) {
- for (let i = 0; i < objs.length; i++) {
- let index = this.sequence.indexOf(objs[i]);
- if (index >= 0) {
- this.sequence.splice(index, 1);
- }
- }
- }
- isEmpty() {
- return this.sequence.length < 1;
- }
- async getTextOf(index, seq) {
- let elements = await this.getElementFor(index, seq);
- let div = document.createElement("div");
- for (let i = 0; i < elements.length; i++) {
- if (typeof elements[i] != "number") {
- div.appendChild(elements[i]);
- }
- }
- return div.innerText;
- }
- doLineBreak() {
- if (this.currentParagraph.length > 0 && !this.skipbreaks) {
- let br = document.createElement("br");
- br.classList.add("linebreak");
- let ti = document.createElement("span");
- ti.classList.add("textIndenter");
- this.currentParagraph.push(br, ti);
- }
- }
- doParagraphBreak() {
- if (this.currentParagraph.length > 0 && !this.skipbreaks) {
- this.paragraphs.push(this.currentParagraph);
- this.currentParagraph = [];
- }
- }
- async getParagraphs() {
- this.paragraphs = [];
- this.currentParagraph = [];
- this.skipbreaks = false;
- for (this.sequenceRunner = 0; this.sequenceRunner < this.sequence.length; this.sequenceRunner++) {
- let seq = this.sequence[this.sequenceRunner];
- if (seq instanceof OneOf) {
- seq = seq.getOne();
- }
- if (seq == Say.CENTERED) {
- this.setCentered(true);
- }
- else if (seq == Say.b) {
- let boldObjects = [];
- for (let i = this.sequenceRunner + 1; i < this.sequence.length; i++) {
- let candidate = this.sequenceRunner[i];
- if (candidate == Say.b) {
- this.sequence.splice(i, 1);
- break;
- }
- else {
- boldObjects.push(this.sequence.splice(i, 1));
- }
- }
- if (boldObjects.length > 0) {
- let bold = new SayBold(...boldObjects);
- this.sequence.splice(this.sequenceRunner + 1, 0, bold);
- }
- }
- else if (seq == Say.COCK) {
- if (HumanoidPenis != undefined) {
- let cock = HumanoidPenis.getSynonym();
- this.currentParagraph.push(document.createTextNode(cock));
- }
- }
- else if (seq == Say.PUSSY) {
- if (HumanoidVagina != undefined) {
- let vagina = HumanoidVagina.getSynonym();
- this.currentParagraph.push(document.createTextNode(vagina));
- }
- }
- else if (seq == Say.LINE_BREAK) {
- this.doLineBreak();
- }
- else if (seq == Say.PARAGRAPH_BREAK) {
- this.doParagraphBreak();
- }
- else if (seq == Say.RUN_PARAGRAPH) {
- this.skipbreaks = true;
- }
- else if (seq == Say.RUN_PARAGRAPH_OFF) {
- this.skipbreaks = false;
- }
- else if (typeof seq == "function") {
- let fObj = seq(this);
- if (Array.isArray(fObj)) {
- for (let k = fObj.length - 1; k >= 0; k--) {
- this.sequence.splice(this.sequenceRunner + 1, 0, fObj[k]);
- }
- }
- else if (fObj != undefined) {
- this.sequence.splice(this.sequenceRunner + 1, 0, fObj);
- }
- this.sequence.splice(this.sequenceRunner, 1);
- this.sequenceRunner--;
- }
- else if (seq.constructor == this.constructor) {
- for (let k = seq.sequence.length - 1; k >= 0; k--) {
- this.sequence.splice(this.sequenceRunner + 1, 0, seq.sequence[k]);
- }
- this.sequence.splice(this.sequenceRunner, 1);
- this.sequenceRunner--;
- }
- else if (seq != undefined) {
- let elements = await this.getElementFor(this.sequenceRunner, seq);
- for (let i = 0; i < elements.length; i++) {
- if (elements[i] === Say.DO_LINE_BREAK) {
- this.doLineBreak();
- }
- else if (elements[i] === Say.DO_PARAGRAPH_BREAK) {
- this.doParagraphBreak();
- }
- else {
- this.currentParagraph.push(elements[i]);
- }
- }
- }
- }
- if (this.currentParagraph.length > 0) {
- this.paragraphs.push(this.currentParagraph);
- }
- return this.paragraphs;
- }
- async getElementFor(index, obj) {
- if (obj instanceof Promise) {
- obj = await obj;
- }
- if (typeof obj == "string" || obj instanceof String) {
- return [document.createTextNode(obj)];
- }
- else if (typeof obj == "number" || obj instanceof Number) {
- return [document.createTextNode((parseFloat(obj.toFixed(2)) / 1).toString())];
- }
- else if (typeof obj == "function") {
- let elements = await this.getElementFor(-1, obj(this));
- return elements;
- }
- else if (obj instanceof SayImage) {
- return [obj.getImageElement()];
- }
- else if (obj instanceof SayLeftRight) {
- return (await obj.getPureElements());
- }
- else if (obj instanceof Say) {
- let elements = await obj.getPureElements(this);
- return elements;
- }
- else if (this.isProperElement(obj)) {
- return [obj];
- }
- else if (obj instanceof Object) {
- let elements = await this.printName(obj);
- return elements;
- }
- }
- async getPureElements(say) {
- let paragraphs = await this.getParagraphs();
- return paragraphs.length == 1 ? paragraphs[0] : Array.prototype.concat.apply([], paragraphs);
- }
- setCentered(bool) {
- this.centered = bool;
- }
- async getHTML(tagName, classList, singleParagraph) {
- let paragraphs = await this.getParagraphs();
- if (singleParagraph == true && paragraphs.length > 1) {
- paragraphs = [Array.prototype.concat.apply([], paragraphs)];
- }
- let elements = [];
- for (let i = 0, paragraph = paragraphs[i]; paragraph != undefined; paragraph = paragraphs[++i]) {
- let parent = document.createElement(tagName);
- if (classList.length > 0) {
- parent.classList.add(...classList);
- }
- for (let k = 0, ele = paragraph[k]; ele != undefined; ele = paragraph[++k]) {
- parent.appendChild(ele);
- }
- elements.push(parent);
- if (this.centered) {
- parent.classList.add("centered");
- }
- }
- return elements;
- }
- getHTMLContent() {
- return this.getHTML("p", ["content"]);
- }
- isProperElement(o) {
- return (typeof Node === "object" ? o instanceof Node :
- o && typeof o === "object" && typeof o.nodeType === "number" && typeof o.nodeName === "string") || (typeof HTMLElement === "object" ? o instanceof HTMLElement :
- o && typeof o === "object" && o !== null && o.nodeType === 1 && typeof o.nodeName === "string");
- }
- async printName(thing) {
- this.currentNoun = thing;
- this.currentNounElements = [];
- let before = Say.beforePrinting.execute({ noun: this });
- await before;
- let print = Say.printing.execute({ noun: this });
- await print;
- let after = Say.afterPrinting.execute({ noun: this });
- await after;
- return this.currentNounElements;
- }
- static hisHersIts(target, startOfSentence) {
- return new SayHisHersIts(target);
- }
- }
- Say.LINE_BREAK = new SayableObject();
- Say.PARAGRAPH_BREAK = new SayableObject();
- Say.RUN_PARAGRAPH = new SayableObject();
- Say.RUN_PARAGRAPH_OFF = new SayableObject();
- Say.CENTERED = new SayableObject();
- Say.b = new SayableObject();
- Say.DO_PARAGRAPH_BREAK = new SayableObject();
- Say.DO_LINE_BREAK = new SayableObject();
- Say.COCK = new SayableObject();
- Say.PUSSY = new SayableObject();
- Say.beforePrinting = new Rulebook("Before printing the name of something");
- Say.printing = new Rulebook("Printing the name of something");
- Say.afterPrinting = new Rulebook("After printing the name of something");
- Say.printing.addRule(new Rule({
- name: "Printing the name of a Printable Element",
- firstPriority: Rule.PRIORITY_LOW,
- code: (rulebook) => {
- let say = rulebook.noun;
- if (say.currentNoun.getPrintedElement) {
- say.currentNounElements.push(...say.currentNoun.getPrintedElement());
- return true;
- }
- }
- }));
- Say.printing.addRule(new Rule({
- name: "Printing the name of a Printable",
- firstPriority: Rule.PRIORITY_LOW,
- code: (rulebook) => {
- let say = rulebook.noun;
- if (say.currentNoun.getPrintedName) {
- let thingEle = document.createTextNode(say.currentNoun.getPrintedName());
- say.currentNounElements.push(thingEle);
- return true;
- }
- }
- }));
- Say.printing.addRule(new Rule({
- name: "Printing the name of an unknown object",
- firstPriority: Rule.PRIORITY_LOWEST,
- priority: Rule.PRIORITY_LOWEST,
- code: (rulebook) => {
- let say = rulebook.noun;
- if (say.currentNoun.getPrintedName) {
- say.currentNounElements.push((document.createTextNode(say.currentNoun.toString())));
- return true;
- }
- }
- }));
- var CharacterCreation;
- (function (CharacterCreation) {
- CharacterCreation.FalselyAccused = new CharacterOrigin("Falsely Accused");
- CharacterCreation.FalselyAccused.name = "Falsely Accused";
- CharacterCreation.FalselyAccused.description = new Say("You made some allegations against a powerful man in your village. Whether those were true or not didn't matter, he was most displeased with your actions and did all he could to end your life as you knew it. Just as you were about to be executed for your inexistent crimes, the man asked for mercy. You thought he wasn't willing to go this far with his lies, only to have your hopes crushed when you noticed a smirk in his evil face.\n", Say.PARAGRAPH_BREAK, "The man claimed he wanted to forgive you, but would need proof of your regret. You received an alternative sentence: go to the Tower and find a way to destroy it. Surely an impossible task. Surely just another death sentence... or worse. But it's not like you have a choice in the matter.");
- CharacterCreation.FalselyAccused.bonusStats = "This origin confers no bonuses, but you have complete freedom with your perks.";
- })(CharacterCreation || (CharacterCreation = {}));
- var CharacterCreation;
- (function (CharacterCreation) {
- CharacterCreation.HornyVirgin = new Perk("Horny Virgin");
- CharacterCreation.HornyVirgin.description = new Say("Whichever life you led up to this point never allowed you to explore your sexuality. As a result, you're both virgin AND extremely horny. This perk makes it so that the World Depravity around the Tower is initially higher and rises faster, however you are not as affected by this rising Depravity around you.", Say.PARAGRAPH_BREAK, "This perk is mandatory for Champions and is not compatible with most sex-related perks.");
- CharacterCreation.HornyVirgin.forcedStatus = (hornyVirgin) => {
- if (CharacterCreation.getOrigin() == CharacterCreation.ChampionOrigin) {
- return true;
- }
- else if (CharacterCreation.Slut.isEnabled(true)) {
- return false;
- }
- };
- CharacterCreation.Slut = new Perk("Unredeemable Slut");
- CharacterCreation.Slut.description = new Say("Simply put: you really like sex. Your Depravity starts off higher and rises even faster, also affecting World Depravity. However, you level up sex-related Skills faster.", Say.PARAGRAPH_BREAK, "This perk is not compatible with ", CharacterCreation.HornyVirgin.name, ".");
- CharacterCreation.Slut.forcedStatus = () => {
- if (CharacterCreation.HornyVirgin.isEnabled(true)) {
- return false;
- }
- };
- CharacterCreation.SensitiveHoles = new Perk("Sensitive Holes");
- CharacterCreation.SensitiveHoles.description = "You are very sensitive to any kind of receptive penetration. You have a harder time escaping grapples while being penetrated and an easier time orgasming from it, but getting aroused faster also means you take less damage from it.";
- })(CharacterCreation || (CharacterCreation = {}));
- var ContentHandler;
- (function (ContentHandler) {
- let contentHash = {};
- let contentArray = [];
- function registerContentType(type) {
- if (contentHash[type.getId()] != undefined) {
- console.error("[ContentHandler} Can't register the content.", type, "Old:", contentHash[type.getId()]);
- return;
- }
- else {
- contentHash[type.getId()] = type;
- contentArray.push(type);
- }
- }
- ContentHandler.registerContentType = registerContentType;
- function getContentTypes() {
- return contentArray.slice();
- }
- ContentHandler.getContentTypes = getContentTypes;
- })(ContentHandler || (ContentHandler = {}));
- class ContentType extends StoredMemory {
- constructor(options) {
- super(ContentType.memoryPrefix + options.id, options.defaultValue);
- this.valueDescription = () => { return new Say(JSON.stringify(this.getValue())); };
- this.changeable = true;
- this.description = options.description instanceof Say ? options.description : new Say(options.description);
- this.valueDescription = options.currentValueDescription == undefined ? this.valueDescription : options.currentValueDescription;
- if (options.changeable == false) {
- this.storeValue(options.defaultValue);
- this.changeable = false;
- }
- ContentHandler.registerContentType(this);
- }
- getDescription() {
- return this.description;
- }
- getValueDescription() {
- let desc = this.valueDescription(this);
- if (desc instanceof Say) {
- return desc;
- }
- else {
- return new Say(desc);
- }
- }
- toggle() {
- if (this.changeable) {
- this.storeValue(!this.getValue());
- }
- }
- isAllowed() {
- return this.getValue();
- }
- }
- ContentType.memoryPrefix = "ct_";
- ContentType.MM = new ContentType({
- changeable: false,
- description: "Homosexual (M/M) sexual events",
- id: "MM",
- defaultValue: true
- });
- ContentType.FF = new ContentType({
- changeable: false,
- description: "Homosexual (F/F) sexual events",
- id: "FF",
- defaultValue: true
- });
- ContentType.MF = new ContentType({
- changeable: false,
- description: "Heterosexual (M/F) sexual events",
- id: "MF",
- defaultValue: true
- });
- ContentType.Beast = new ContentType({
- changeable: true,
- description: "Sexual events with either monsters or magical beasts. MM/MF/FF take precedence over this one if blocked. Sufficiently human creatures do not get counted into this.",
- id: "Beast",
- defaultValue: true
- });
- ContentType.Scat = new ContentType({
- changeable: false,
- description: "Scatologic sexual events",
- id: "Scat",
- defaultValue: false
- });
- ContentType.Pee = new ContentType({
- changeable: false,
- description: "Sexual events with urine",
- id: "Urophilia",
- defaultValue: false
- });
- var Elements;
- (function (Elements) {
- var CurrentTurnHandler;
- (function (CurrentTurnHandler) {
- CurrentTurnHandler.currentTurnTab = document.getElementById("currentTurnTab");
- CurrentTurnHandler.currentTurn = document.getElementById("currentTurn");
- CurrentTurnHandler.turnHr = document.createElement("p");
- CurrentTurnHandler.lastReadOffset = CurrentTurnHandler.currentTurnTab.clientHeight / 2;
- CurrentTurnHandler.turnHr.classList.add("turnStart");
- CurrentTurnHandler.turnHr.appendChild(document.createTextNode("Start of Turn"));
- function startTurn(action) {
- let oldContent = CurrentTurnHandler.currentTurnTab.getElementsByClassName("content");
- for (let i = 0; i < oldContent.length; i++) {
- oldContent[i].classList.add("contentOld");
- oldContent[i].classList.remove("content");
- }
- CurrentTurnHandler.currentTurnTab.appendChild(CurrentTurnHandler.turnHr);
- Elements.startTurn();
- scrollToNewTurn();
- }
- CurrentTurnHandler.startTurn = startTurn;
- function isTurn() {
- return Elements.isInTurn();
- }
- CurrentTurnHandler.isTurn = isTurn;
- function endTurn() {
- Elements.endTurn();
- }
- CurrentTurnHandler.endTurn = endTurn;
- function getSayElementsAsContent(say) {
- return say.getHTML("p", ["content"]);
- }
- CurrentTurnHandler.getSayElementsAsContent = getSayElementsAsContent;
- function printAsContent(say) {
- let node = getMarker();
- getSayElementsAsContent(say).then(value => {
- insertBefore(value, node);
- unprint(node);
- });
- }
- CurrentTurnHandler.printAsContent = printAsContent;
- function simplePrint(...sayValues) {
- printAsContent(new Say(...sayValues));
- }
- CurrentTurnHandler.simplePrint = simplePrint;
- function printAsError(msg) {
- if (msg instanceof Say) {
- msg.getHTML("div", ["error"], true).then(value => {
- print(...value);
- });
- }
- else {
- let div = document.createElement("div");
- div.classList.add("error");
- div.appendChild(document.createTextNode(msg));
- print(div);
- }
- }
- CurrentTurnHandler.printAsError = printAsError;
- function clear() {
- while (CurrentTurnHandler.currentTurnTab.firstChild != undefined) {
- CurrentTurnHandler.currentTurnTab.removeChild(CurrentTurnHandler.currentTurnTab.firstChild);
- }
- Controls.KeyHandler.reset();
- }
- CurrentTurnHandler.clear = clear;
- function print(...elements) {
- if (elements.length > 0) {
- elements.forEach((element) => {
- CurrentTurnHandler.currentTurnTab.appendChild(element);
- });
- scrollTo(CurrentTurnHandler.lastReadOffset);
- }
- }
- CurrentTurnHandler.print = print;
- function getMarker() {
- let node = document.createTextNode("");
- CurrentTurnHandler.currentTurnTab.appendChild(node);
- return node;
- }
- CurrentTurnHandler.getMarker = getMarker;
- function insertBefore(newChilds, oldChild) {
- newChilds.forEach((newChild) => {
- CurrentTurnHandler.currentTurnTab.insertBefore(newChild, oldChild);
- });
- scrollTo(CurrentTurnHandler.lastReadOffset);
- }
- CurrentTurnHandler.insertBefore = insertBefore;
- function unprint(...elements) {
- elements.forEach((element) => {
- if (element.parentElement == CurrentTurnHandler.currentTurnTab) {
- CurrentTurnHandler.currentTurnTab.removeChild(element);
- }
- });
- }
- CurrentTurnHandler.unprint = unprint;
- function scrollToNewTurn() {
- let target = CurrentTurnHandler.turnHr.offsetTop + CurrentTurnHandler.turnHr.offsetHeight;
- CurrentTurnHandler.lastReadOffset = target;
- if (target < CurrentTurnHandler.currentTurn.scrollTop) {
- return;
- }
- scrollTo(target);
- }
- CurrentTurnHandler.scrollToNewTurn = scrollToNewTurn;
- function scrollToBottom() {
- scrollTo(CurrentTurnHandler.currentTurn.scrollHeight - CurrentTurnHandler.currentTurn.clientHeight);
- }
- CurrentTurnHandler.scrollToBottom = scrollToBottom;
- function scrollSpace() {
- scrollTo(CurrentTurnHandler.currentTurn.scrollTop + (CurrentTurnHandler.currentTurn.clientHeight / 2));
- }
- CurrentTurnHandler.scrollSpace = scrollSpace;
- CurrentTurnHandler.currentTurn.addEventListener("scroll", () => {
- let currentRead = CurrentTurnHandler.currentTurn.scrollTop + CurrentTurnHandler.currentTurn.clientHeight;
- if (currentRead > CurrentTurnHandler.lastReadOffset) {
- CurrentTurnHandler.lastReadOffset = currentRead;
- }
- });
- var startOffset;
- var targetOffset;
- var startTime;
- var finishTime;
- var totalTime;
- var animationRequest;
- function scrollTo(offset) {
- if (offset <= CurrentTurnHandler.lastReadOffset) {
- startOffset = CurrentTurnHandler.currentTurn.scrollTop;
- targetOffset = offset;
- startTime = new Date().getTime();
- finishTime = startTime + Elements.animationTime;
- totalTime = finishTime - startTime;
- startScrolling();
- }
- }
- CurrentTurnHandler.scrollTo = scrollTo;
- function startScrolling() {
- if (animationRequest == undefined) {
- animationRequest = requestAnimationFrame(CurrentTurnHandler.updateFrame);
- }
- }
- CurrentTurnHandler.startScrolling = startScrolling;
- CurrentTurnHandler.updateFrame = () => {
- animationRequest = undefined;
- let movingOffset = (targetOffset - startOffset);
- let timePassed = new Date().getTime() - startTime;
- let idealOffset = movingOffset * (timePassed / totalTime);
- let maxScroll = CurrentTurnHandler.currentTurn.scrollHeight - CurrentTurnHandler.currentTurn.clientHeight;
- CurrentTurnHandler.currentTurn.scrollTop = startOffset + idealOffset;
- if (CurrentTurnHandler.currentTurn.scrollTop < targetOffset && CurrentTurnHandler.currentTurn.scrollTop < maxScroll) {
- startScrolling();
- }
- };
- })(CurrentTurnHandler = Elements.CurrentTurnHandler || (Elements.CurrentTurnHandler = {}));
- })(Elements || (Elements = {}));
- var Controls;
- (function (Controls) {
- var Links;
- (function (Links) {
- function makeCustomLink(element, options) {
- if (options.mouseover != undefined && options.mouseout != undefined) {
- element.addEventListener("mouseover", options.mouseover);
- element.addEventListener("mouseout", options.mouseout);
- }
- element.addEventListener("click", options.click);
- }
- Links.makeCustomLink = makeCustomLink;
- function makeLink(element, action) {
- makeCustomLink(element, {
- mouseover: () => { Elements.HyperlinkHandler.hoverAction(action); },
- mouseout: () => { Elements.HyperlinkHandler.unhoverAction(); },
- click: (e) => {
- TurnSequence.execute(action);
- Elements.HyperlinkHandler.unhoverAction();
- e.stopPropagation();
- e.preventDefault();
- }
- });
- }
- Links.makeLink = makeLink;
- })(Links = Controls.Links || (Controls.Links = {}));
- })(Controls || (Controls = {}));
- class RoomNode {
- constructor(room) {
- this.mainDiv = document.createElement("div");
- this.room = room;
- this.mainDiv.classList.add("mapRoom");
- if (room != undefined) {
- this.mainDiv.classList.add("linked", room.getBackgroundClass());
- Room.DIRECTIONS.forEach((direction) => {
- if (room.connections[direction] != undefined) {
- let directionDiv = document.createElement("div");
- directionDiv.classList.add("mapRoomConnection" + DirectionNames[Direction[direction]]);
- this.mainDiv.appendChild(directionDiv);
- }
- });
- Controls.Links.makeLink(this.mainDiv, new ActionGo(WorldState.player, room));
- }
- }
- async createRoomNameFloater() {
- if (this.room != undefined) {
- let roomName = document.createElement("div");
- let sayName = new Say(this.room);
- await sayName.getPureElements().then(value => {
- value.forEach(element => {
- roomName.appendChild(element);
- });
- Elements.HoverInfo.makeHoverable(this.mainDiv, value);
- });
- }
- }
- async update() {
- if (this.room != undefined) {
- if (WorldState.player.getRoom() == this.room) {
- this.mainDiv.classList.add("current");
- }
- else {
- this.mainDiv.classList.remove("current");
- }
- let isRemembered = await WorldState.isRoomRemembered(this.room);
- if (!isRemembered) {
- this.mainDiv.classList.add("unknown");
- }
- else {
- this.mainDiv.classList.remove("unknown");
- }
- }
- }
- getElement() {
- return this.mainDiv;
- }
- }
- class SayAn extends Say {
- constructor(autoUppercase) {
- super();
- this.node = document.createTextNode("a ");
- this.uppercase = true;
- if (autoUppercase != undefined) {
- this.uppercase = autoUppercase;
- }
- }
- async getPureElements(say) {
- let next = say.sequence[say.sequenceRunner + 1];
- if (next == undefined || (next instanceof Thing && next.properlyNamed)) {
- this.node.nodeValue = "";
- }
- else {
- let aan = AvsAn.query((await say.getTextOf(say.sequenceRunner + 1, next)).trim());
- if (aan.prefix != "") {
- this.node.nodeValue = aan.article + " ";
- }
- if (this.uppercase && say.currentParagraph.length == 0) {
- this.node.nodeValue = this.node.nodeValue.charAt(0).toUpperCase()
- + this.node.nodeValue.substr(1, this.node.nodeValue.length - 1);
- }
- this.node.nodeValue = this.node.nodeValue + " ";
- }
- return [this.node];
- }
- }
- var AvsAn = (function () {
- var dict = "p3ezz;4wrlg;2h;#2rg;22;2;a;7;;if;z;;&4h;1c;1;N;6;;*yp;6a;4;a2;q;;e1;q;;i1;h;;o;7;;/op;5n;9;a3;i;;e5;h;;h;;1;o5;;;i;r;;l;;1;/;6;;n;;1;o6;;;o1;a;;r;;1;e7;;;s;;1;/2;j;;09pa;y3;1;8e;10;;17qoq;qmm;2;12hp;7nw;a;0o4;45;1;0n;2w;;15r;1n;2;8;7;;9;5;;28s;x;;34q;z;1;7;5;;45n;n;;598;w;;65k;u;;74j;y;;850;y;;93x;g;;81ux;hgk;a;0zb;el;a;0p;4h;;11;16;;21;10;;32;15;;4;18;;54;v;;6;12;;7;s;;8;v;;9;17;;11k;bq;1; v;2;;229;f3;2; 1a;3;;–5;;;31x;jc;1; 12;2;;41w;kq;2; z;4;;–5;;;559;sp;5; 2k;1;;,h;;;h7;;;kd;;;m6;;;62p;rm;2; 1b;5;;k5;;;72n;y6;2; 14;;;–5;;;82r;192;2; 19;4;;,5;;;93i;1ig;2; 10;4;;–5;;;8ys;nsu;;<e9;1x;2;m;;1;d;6;;o;6;;=kq;1x;1;=3m;g;1;E;6;;@16;2a;;A3wn;bu7d;6;Abr;y1;1;A8b;5o;1;S3;e;;i2g;4rh;1;r26;4dg;1;ob;2;;mg9;5490;1;a1k;140;1;rv;1e;1; t;1;;n6n;gfl;1;d25;1ae;1;a1c;5b;1;l1b;4c;1;u1b;3r;1;c18;c;1;i;;1;a;;1;n;6;;s3f;feu;1;tn;sc;1;uh;1t;1;rh;1s;1;ih;1q;1;ah;1q;1;sg;1;;t71;41h;1;h53;112;1;l4x;7i;1;e4w;6m;1;t4w;6m;1;e4w;2j;1;s;f;;B7cel;sz;2;hlb;42;2;aaw;28;1;ij;1y;1;rf;1s;1;ae;;;á;11;;olhj;28;1;r1cy;j;1;des;f;1; 3;f;;C8l05;10j;3;a29ng;5t;1;i9c;b;1;s;;1;s5;;;h1ska;9p;4;aa1a;1x;2;i115;o;1;s5;g;1;e5;;;o5p;7;1;i;6;;l17;l;1;á;f;;rkxk;19;1;o9t;a;1;í;5;;u2re;y;2;i1;a;;r2fq;e;1;re;5;1;a;5;;o1vrk;88;1;njpy;1m;1;g380;f;1;j;5;;D40dx;hh;7;aj56;1y;1;o35;6;1;q;5;;ijhc;2t;2;nbw;j;1;a17;f;1;s4;f;;ogz;g;1;t1;9;;uivv;1r;1;ad2;7;1;lci;7;1;c;7;;á30;7;1; ;5;;ò;5;;ù1;e;;ư;7;;Efoe;42zy;7;U3t;zk;1;R1r;4;;be;42;1;oc;1t;1;lb;p;1;ib;;;m2k;73m;1;pw;13w;1;eh;91;1;zd;;;n7x;27zz;1;af;14;1;md;3;;syp;35x;1;pws;9c;5;awn;p;1;c;7;;e4;7d;;h;5;;o;b;;r;h;;udjl;hc;1;lj;6o;1;o6;;;wr;1e;1;id;2;;F4eta;hhx;11; cf;1rz;;,;17;;.2j;6h;;/i;29;;05;2y;;128;e1;;216;9g;;311;7d;;418;8i;;5i;5u;;69;z;;7;;1;0a;;;86;j;;97;l;;A404;5ij;e;Be;3;;Ct9;my;;Dx;9;;Fc;;;I;;2;L8;;;Rq;;;K11;;;Ll;4;;M1x;1;;Ny;2;;P13;2;;Q9h;5j;;Rad;3p;;S1n;9;;T2t;2;;B57;1ji;;C4s;jp;1;Mb;1;;D2g;ak;;E7r;39;2;C6;k;;I5;f;;F33;64;1;r5;;;Hz;1u;;I1vx;bk;3;A24;45;1;Tm;1;;R;;1; w;30;;U2;a;;J5;f;;Lkk;g1;3;C2p;3v;;N4;e;;P1;f;;M6w;1ds;;Og3;2e;1; 5;i;;Ps4;w7;1;.7i;53;;R8v;3z;2;A1e;g;1; 3;e;;Se;y;;S3g;91;;T8a;1ah;1;S1x;6;;Uel;3m;2;,2;b;;.;k;;Xm;1o;;Yz;5w;1;V6;;;c3;l;;f;;1;o7;;;h1;31;;σ1;i;;G55z0;ig;7;e1sct;3h;1;r1fvh;1n;1;n;;1;e;a;;h1sd;31;1;a17k;2e;3;e;q;;i;n;;o;6;;i4b9;s;1;alt;c;1;nl0;b;1;g1;a;;ovi2;2d;2;f;;1; ;b;;t238;f;1;t2z;7;1; ;6;;r17jv;32;1;iql;e;1;a;9;;w43;6;1;a1p;5;1;rd;5;1;r;5;;ú;5;;H24sn;cwd;s; 5i;mk;;&b;17;;,1;f;;.37;42;2;Ai;;;Ie;4;;1i;1j;;2r;22;;39;n;;5a;19;;72;a;;B2z;cx;1;P7;;;C1q;35;;Dd1;tb;;F1l;2x;;Gl;14;;Hy;30;1;I5;;;I80;i9;6;Cc;1;;G10;2;;Nb;1;;Pq;2;;S;;1;D1;j;;Tf;1;;K4k;1w;1;9;7;;L1e;35;;M36;6u;1;.c;;;Ny;2v;;O95;3g;2; 7;t;;Vc;16;;P4b;bf;;R2v;4v;1;Tn;7;;S;;1;F5;;;T9c;115;;V1k;3u;;eaox;7p;2;im1;11;1;r4;o;;r29t;2m;1;r1d;7;1;n;5;;ohh1;6d0;2;n3jr;65v;6;d121;v;;e4c;1m;1;s7;1m;;g21f;e;;kp;;;oad;61b;2;l26;1;;r7c;5jz;1;i;;1;f;5;;v6;;;u2q4;32;1;r2;2x;;I266;4mgb;3;I4o;8f;2;*6;;;I1v;j;;nij;1hm4;1;d9p;wtp;1;e1c;3wy;1;p12;3r6;1;e12;3r6;1;n12;3r4;1;d12;3r4;2;et;3qw;1;nt;3qw;1;c7;41;1;i6;;;ê8;;;s4h;cif;1;l2i;42z;1;a2h;3yr;1;ne;gy;1;de;gy;1;sd;3;;J24b6;7h;1;iw9;t;1;a;;1;o2;o;;L2u98;abe;y; 5s;17t;;,2;s;;.25;9q;;1l;1t;;2j;2h;;3a;10;;48;l;;8;c;;Anc;ce;3; 1e;6q;;Po;2t;;X1;a;;B1j;2r;;C59;r4;;D42;lc;;Ejg;hg;2; 2;i;;D4x;e9;;F20;3s;1;Ti;2;;G8s;ko;;H;;1;Dk;6;;Idy;1m;1;Rd;u;;Lc0;25k;;M3k;94;;N26;51;;P63;1g0;;R23;6z;;S2z;f6;1;m7;;;T36;86;;U1s;n;1; 5;h;;V14;35;1;C7;;;W;;1;T;5;;Z9;t;;^;5;;am5d;3g;1;o91;e;1;i;;1;g;e;;oln2;3r;1;c2ik;19;1;h1s;11;1;a7;z;1;b6;;;p1;h;;u51i;1q;1;s4p;x;1;hg;w;1;ob;;;ộ;5;;M5bhu;skd;15; 6n;n2;;&b;1h;;,;g;;.1kr;5er;1;Alm;2kf;1;.kf;2ht;1;Sa;2;;/4;1f;;14f;f4;;22a;6k;;3y;31;;41j;5h;;5n;1a;;6r;3q;;7t;1f;;87;11;;A1fx;2mt;i;B5;;;C9q;1;;D2d;3;;F12;4;;G17;4;;J38;;;L11;2;;Mv;1;;N2i;a;;P2f;6;;R2o;;;S2t;6;;T2l;f;;Vc;2;;W7;;;X1h;;;Ya;;;Z7;;;Bbv;39s;1;Sb;r;1;T9;;;C5e;ni;;D5e;na;;Efj;d4;3;P1j;9f;1;S7;;;W;7;;n6;i;;F64;14y;;G31;az;;H2i;7d;;Izq;ij;4; f;w;;5;2o;;6f;35;;T25;7y;1;Mi;1;;K1o;3c;;Lcl;17r;;Mcc;rp;;N1i;40;;Osl;av;1;U17;2c;;Pel;3xz;;Qa;1g;;R4l;nw;;Sku;1ld;;Tai;yj;1;R1y;w;;Uas;1t;2; 2;i;;V3;d;;V3s;a5;;Xq;2p;;b1a;i;1;ur;d;1;m1;a;;f2q;ek;;hf;1g;;om4z;7h;2;D;;1;e7;;;U2b;34;1;.5;;;p;;1;31;b;;s23;h;1;c3;c;;N3qyx;ipi;y; 7p;qe;;+;9;;.;;1;Eg;5;;46;k;;7;7;;8;7;;:;5;;A4ga;in;3;A3g;6j;1;Fo;2;;I1m;52;;S2l3;1x;1;Lb;1b;;B8k;2gd;;Ckh;2ib;;D2t;aq;;Ejp;9r;3;A10;2r;;H5;16;;S;;1; 1y;2v;;Fas;2sm;1;Uc;2;;G5x;zb;;H8o;1oq;;I;;7;C1w;j;;D;;1; ;9;;Ka;;;Ld;2;;Nj;;;O8;;;S20;n;;K1c;4g;;L2t;94;;M1s;9a;1;M5;;;Ndl;36;2;R1;d;;T4;h;;P;;1;O25k;1j4;1;V24y;1i8;1;/;;1;B;5;;R9n;f6;2;Je;3;;T3y;e;;Sby;lt;1;W5m;g;;T3m;9h;1;L;;1;D5;;;U60;1a;1;S4;i;;V1a;4h;;W64;4n;2;Au;30;;O;;1;H;8;;Xp;4p;;Ys5;af;3;C64;1i;1;L;6;;P1k;3t;;Uj;1p;;a10pz;8f;1;sq1;d;1;a;;1;n1;8;;t;;1;h1;a;;vk;1c;;²;7;;×;5;;O1n9;1g7f;5;N17;3l;1;E12;2;;l29;8yb;1;vl;2;;nuh;1ti;2;c;;1;ec;2;;etc;21;1;i2;1k;;oi;3e;1;pf;1;;u3x;1ey;1;i3c;b;;P5dsg;kg;1;hmb6;3r;2;i39j;v;1;a;9;;o128;1s;2;bh;19;2;i8;;;o9;;;i1;j;;Qb3c;1l;1;i8c;t;1;n61;l;1;g4x;l;1;x1;f;;R3te6;u0n;z; 6h;119;;&8t;ze;;,;k;;.2r;4t;1;Jj;3;;/a;q;;11s;3k;;4a;r;;67;j;;A12c;ym;3; d;1o;;.1;a;;F7v;ra;1;Tf;;;B4b;v4;1;Rk;3;;C52;l7;;D34;9b;;Enp;3a;3; b;q;;S3z;q;1;Pa;p;;U;5;;Fxl;5cg;;G11;5w;;H1x;1a;1;S4;f;;If2;6o;2;A17;3s;;C;;1; a;1c;;Jn;2e;;Kz;5g;;L1h;2k;1;P6;;;M5u;cg;5;1e;4;;26;;;36;;;59;;;65;;;N4y;q3;;Ogs;86;2;Hk;16;;T1n;3b;2;Av;;;O7;;;P4u;q7;;Q8;q;;R21;37;1;F6;;;S1pl;1up;4;,85;6b;;.ba;7l;;?2l;y;;Tv;6;;T5t;iz;;U23;4u;4;B5;;;M5;;;Nb;;;S9;1;;V1h;8u;;Xa;o;;c;8;;f3qh;db8;1;M;;1;.h;4;;h1xk;1a;2;A;5;;B;5;;ò;5;;S7ldf;ea7;11; 9n;18a;;&1o;3s;;,2;f;;.e8;91;4;E7;m;;Mc;10;;Oa;18;;T;;1;.;;3;B2;b;;D3;c;;M2;c;;1m;29;;35;o;;4b;s;;55;i;;68;s;;84;i;;92;b;;A1b1;l3;3; 2a;7d;;8;5;;S2v;3t;2;Ep;4;;I6;;;B30;74;;Clf;a7;3;A2z;15;1; 3;y;;R;;2;Ap;;;U5;;;T6;s;;D66;ns;;Eri;jq;6; s;1g;;5;7;;C3g;ba;3;Ac;;;Oh;;;Rh;3;;I;;1;F9;;;O1a;28;;U;5;;F58;7w;3;&5;;;H6;;;O;;1;S8;;;G24;5v;1;Df;5;;H6m;3t;3;25;h;;32;g;;L;7;;It0;83;2; f;50;;S;;1;O6;;;K;;2;I9;1;;Yh;;;L6z;8m;3;A2k;o;2; 1;g;;.;5;;Iu;e;1; 3;c;;Om;5;;M9j;lh;3;A28;o;1; 4;m;;Ii;5;;U;;1;R6;;;N;;5;A1e;b;;C;;3;A8;;;B5;;;C8;1;;E18;o;;Fa;;;O4g;1;;Oi7;dc;5; c;u;;A4c;1h;1;I5;g;;Eg;1m;;Sv;5m;1;U5;;;V9;p;;P1r8;320;7;A102;1dn;7;Aa;;;Ch;;;D22;;;Mr;;;Ne;;;R2f;;;S8;1;;E3k;j;1; 4;g;;Ib9;155;4;Co;;;D6;;;N5;;;R5;;;L13;26;1;O6;;;O18;e;;U1x;5;;Y5;;;Q;;1; 1;e;;R3i;9z;;Sf7;1kv;1;We;;;Tjg;e7;9;A46;w;1; 8;s;;C7;r;;Dn;2z;;F4;n;;Iq;1c;;L6;k;;Mm;15;;Sb;12;;V5;12;;U;;7;Bn;1;;L42;28;;Mj;;;N18;;;P15;2;;Rf;;;Sf;;;V6j;y7;;Whe;2v;1;R5;m;;X;;1;M2;c;;ha9m;14;1;i2m7;i;1;g;;1;a;;1;o;7;;pxbl;3u;1;i1lg;s;1;o6;j;1;n6;;;tpmv;33;2;B;5;;ikz;b;1;c5b;a;1;i;8;;T3dav;if;4;aczy;4f;2;i1wj;15;2;g;;1;a6;;;s;;1;c;8;;v1q;q;1;e17;h;1;s;h;;ega6;29;1;a1o2;o;1;mg2;6;1;p;6;;uc4t;22;1;i;;2;l1;8;;r;8;;à1;n;;U2oh8;a1j;m;.jqk;80;1;N78;h;1;.70;h;1;C;f;;/2r;f;1;1;9;;1;;1; c;;;24b;x;1;17;k;;L3q;j;1;T;6;;M7h;1d;1;N8;q;;N4bp;am;4;C2u;k;1;L;5;;D;;2; 6;;;P14;2;;K;5;;R;;1; 5;;;a3;40;;b2r;43;2;am;4;;is;9;;de;16;;glp;3a;1;l;1n;;i;;1;gq;a;;l2u;14r;2;ig;4;;yc;;;my;8n;;ntrc;2uh;o; 5;k;;a;;1;n1e;b;;b3;1q;;ce;9w;;d1u;x2;;e19;1t;1;s16;2;;f3;2d;;g;l;;h6;l;;itj3;kb;2;d3;e;;n2;65;;j;7;;k3;55;;l3;2c;;m5;1e;;n2;t;;o4;13;;p2;1p;;q;5;;r6;71;;s5;2u;;t11;4a;;u6;v;;v1;a;;w1;10;;p12;ze;;r1ap;1rs;3;a4h;k;;ea;;;uz5;e2;1;k1;d;;s1at;41;3; ;7;;h9;t;;tw;1r;1;rp;1;;tla;49;4;h2;a;;n1;n;;ra;u;;t7;j;;x2;j;;z2d;dy;;í2;e;;W3fzh;1xp;2;Pgh8;1kw;1;:dtp;1jr;4;A;;1;Fp;1b;;I;;2;B1;9;;N;;1;H8;1;;Oe2;7b;1;V;a;;R1n7;cv;1;F;;1;C;;2;N5;;;U1b;e;;i150z;6l;1;kucb;5n;1;iu0s;5l;1;El;8;1;l;;1;i1;8;;X18k;5ru;7;a2o;6;;e7o;5;;h22;;;i8v;c;;om;4;;ux;4;;yt;4;;Ydr1;5s;3;e1xq;v;1;t35;a;1;h2;a;;p3;d;;s1;8;;[1f3;b3;5;A6;m;;E;b;;I1;a;;ai;13;;ed;30;;_1pde;5f3;2;_1pa2;5em;1;i;6;;e;5;;`4j;19;3;a1;g;;e;5;;i;7;;aa4e;1k1cr;7; 2e6;1r4;;m6h;1bmc;1;a2k;gdk;1;r;;1; 9;;;n1yq;4tcz;1;dsz;136;2; sm;69;;ě5;;;p8x;2tn1;1;rj;e8;1;t6;;;r1ql;dm6d;1;t1bb;7rrp;1;í6;;;uat;271y;1;sc;wm;1;s6;l;1;i;;1; 5;;;v31;2qsv;1;u5;21;1;t5;;;d14132;4sp;3;a4bh7;3i;1;s1q3;1j;1; ;1h;;edez2;3tl;2;mosa;1n;1; 2;10;;r9oc;3b1;1; 1;3an;;idsd0;ky;2;cfg1;k;1;hdj;d;1; ;c;;e57k;6w;1;s1rl;l;1;e1pp;k;2;m;5;;r;5;;e7wn;zlrz;8;c2u;mo2;1;o1z;egy;1;n1g;bbv;1;o1e;bbg;1;m1e;bbc;1;i1b;9c8;1;a6;;;ee;15d;1;w8;;;lbr;2yiq;1;it;5bi;1;tj;3qh;1;eg;3hs;1;i5;;;m8g;1t5c;1;p2z;oie;1;ed;v6;1;zd;;;nyp;6b4j;1;t7j;1g2s;1;e16;5d4;1;n5;r;1;d5;;;s96;1ypr;2;a;;1; 5;;;t45;1716;4;a2g;c3l;1; d;;;e8;i0;1; 6;;;il;tl8;1;ml;tl5;1;al;tl4;1;r5;;;rd;bo;1;u;;1;t6;;;u2qo;74;1;p11a;2j;1; ;i;;w2e;o;;f1n9ht;1ct;3; 1b;44;;M7;2j;;y1l;7;1;i;7;;hpp6o;1t04;9; 37;kq;;,1;9;;.;5;;C2;1d;;a4tpe;la;1;u1je;1r;1;tn;1j;1;b5;;;e3q3g;3wn;2;iajd;24b;1;r1z;232;1;a15;1;;rjaj;1ep;1;m1uj;14;1;a83;e;1;n;5;;o63t5;1eb3;4;mymg;1rd;2;a16t;1mn;1; 6;;;mm;1g;;n1aw;owo;8; a;1;;b8;;;df;;;ez3;32r;3; 6;;;de;;;yvn;1;;ga;;;if;1;;k4e;;;vd;;;ro27;7b;1;sc8c;1v;1; 8;15;;u1lyy;mvr;1;r26;mus;;ry;7;1; ;5;;t2t;51;1;t1e;24;1;p1e;24;1;:u;f;;i550;t5c8;6;bc;3a;1;n7;;;e9;l;1;r7;;;n2x3;jmka;2;fbo;1jnw;2;l1s;fl3;1;u17;cuh;1;ê9;;;o6p;gaj;1;ad;1;;s84;1pv1;1;t3y;whk;1;a17;9gq;1;ld;21c;1;a5;;;r2j;ekg;1; 8;1;;sqz;1agk;1; jd;4q;;u16;8;;k3v63;5f;1;urs;n;1; 3;n;;l1ewzo;zp;3;cj;7;1;d;6;;sl;5;1; ;5;;vm;8;1;a;8;;m1ql98;243;a; 1b;93;;,;7;;Rs;3e;;b;;1;a5;;;egur2;9r;1;i2c;d;1;n3;d;;f5;g;;pz;6b;;t;;1;aa;;;u5ql8;5t;1;l193t;2t;1;t17us;2t;1;i17ty;2t;1;c1d4;8;1;a4z;6;1;mo;6;1;p;;1;i;6;;×;a;;n14seq;3b7;6; 9r;1ei;;V7;w;;W4;q;;dx;1n;1; e;;;te;u;;×1;b;;o1po1;gmse;8;c2l;ewy;2;hb;4w;1;oa;1;;u7;6u;1;p7;;;d21;6ii;1;d1o;59e;1;ya;;;fkz;2cg9;1; br;51;;gp;fd;1;ge;11;1;ia;;;n1muy;151v;o; 4a;6y6;;';5;;,;8;;/1;3t;;a1;e;;b;db;;c1qc;se;1;o3;rn;;d1;n;;e1kqx;bu;2;i;b;;r6;3a;;f;9;;g1t;adm;;i3;ca;;l6q;jw7;;m4;14;;n;c;;o2;57;;r;1a;;s6;10f;;t6;hb;;u1;1l;;w1;1k;;y;15;;z;7;;–;6;;rht;2sas;1;i30;gwn;1;g2p;fl4;1;e6;;;t37;50i;1;r;;1;s;8;;u7j;1e6t;1;i16;6;;r1fxi6;1u1;3; 14;6g;;&1;8;;f12;52;;s3aro5;3io;9;,;e;;?;5;;R2;h;;f;;2;e8;;;o8;;;iggn8;b9;1;c1vp;18;1;hb;17;;l20u4;1m;1; ;5;;pbado;de;2;33;j;;ipic;12;1; ;5;;r1t;k;1;g;c;;v;;3;ae;;;e11;;;i6;;;t1c1p7;1mt;2;A1;9;;S3;2u;;u4dhq;8rnc;c; 7x;n;;.9;;;beh;3f;2;e7;1m;;l;5;;fl;6;;k6h;2e;2;ae;11;;i8;n;;m1j;4kj;1;a;;1; f;5;;n2eo5;6zny;3;a3ln;7j0;3; 1r;4;;n3dz;in;5;a2;c;;c;8;;n5;a7;;s;37;;t;3h;;r4a;jh;1;y46;4;;e28;a8m;2; m;;;i7;;;i29p3;wfu;8;c14a;17;2;oeg;i;1;rcl;h;1;p;a;;u;;1;m;6;;d4x;2b9;1;i4d;f;1;o;7;;g;;1;n;5;;lsl;17;1;l;i;;m2i;r9;1;o2a;2;;n3y;ssp;;s9j;m;1;s;f;;vhg5;5x;1;oj;17;1;cd;3;;r1cb;bd4;5;aco;r;;e3v;h;;ih7;i;;l7m;1j;;o47;k;;s1szw;1ig;3; h;3f;;h1;9f;;u1bh;iv;1;rda;gs;2;eq;a;;pcd;gg;3;a3b;1y;;e7q;36;;ig;;;t33j;1ai;2;m;r;;ta;16b;;v3c;c;;w3e;d;1;a;7;;x;;b; 23;hw;;';6;;,1;c;;.2;a;;8o;47;;b5;f;;k;13;;l1;8;;md;x;1;a7;;;t;c;;y4y;e;1; ;a;;y6atn;ca;1;l1;c;;{6s;r;1;a;7;;|58;m;1;a1;b;;£6cs;8l;1;82b;6o;;À;9;;Áa;o;;Ä3;c;;Å2;k;;Æ4;k;;Éf;2q;;Ò;c;;Ó1;1d;;Öa;16;;Ü4;v;;à7;v;;á5;l;;æ1;m;;è;6;;é4c;bg;1;t3h;29;3;a4;1n;;o;a;;u1;b;;í;5;;ö2;e;;üd;r;1; 7;;;Ā1;b;;ā3;s;;ī;5;;İ4;o;;Ō3;o;;ō;2m;;œ;8;;Ω2;e;;α1c;c1;;ε5;1s;;ω7;1x;;ϵ;8;;е;5;;–3a;1k;2;e;a;;i;9;;ℓ;d;;";
- var root = {};
- function fill(prefix, node, dict) {
- var a = dict.split(';', 3), n = a.map(function (x) { return parseInt(x, 36) || 0; });
- node.data = {
- aCount: n[0],
- anCount: n[1],
- prefix: prefix,
- article: n[0] >= n[1] ? "a" : "an"
- };
- dict = dict.substr(1 + a.join(';').length);
- for (var i = 0; i < n[2]; i++)
- dict = fill(prefix + dict[0], node[dict[0]] = {}, dict.substr(1));
- return dict;
- }
- fill("", root, dict);
- return {
- raw: root,
- query: function (word) {
- var node = root, sI = 0, result, c;
- do {
- c = word[sI++];
- } while ('"‘’“”$\'-('.indexOf(c) >= 0);
- while (1) {
- result = node.data || result;
- node = node[c];
- if (!node)
- return result;
- c = word[sI++] || " ";
- }
- }
- };
- })();
- class SayBold extends Say {
- async getPureElements() {
- let paragraphs = await this.getParagraphs();
- let elements = paragraphs.length == 1 ? paragraphs[0] : Array.prototype.concat.apply([], paragraphs);
- let b = document.createElement("b");
- elements.forEach((element) => {
- b.appendChild(element);
- });
- return [b];
- }
- }
- class SayHeSheIt extends Say {
- constructor(target, autoUppercase) {
- super();
- this.node = document.createTextNode("a ");
- this.uppercase = true;
- this.target = target;
- if (autoUppercase != undefined) {
- this.uppercase = autoUppercase;
- }
- }
- async getPureElements(say) {
- let next = this.target;
- if (next == undefined) {
- this.node.nodeValue = "";
- }
- else {
- if (next instanceof Humanoid) {
- let gender = next.getGenderValue();
- if (gender.genderValueCorrected > 65) {
- this.node.nodeValue = "she ";
- }
- else if (gender.genderValueCorrected < 35) {
- this.node.nodeValue = "he ";
- }
- else {
- if (gender.hasPenisBulge || gender.hasPenis) {
- this.node.nodeValue = "he ";
- }
- else if (gender.hasVagina || gender.hasTits) {
- this.node.nodeValue = "she ";
- }
- else {
- this.node.nodeValue = "they ";
- }
- }
- }
- else {
- this.node.nodeValue = "it ";
- }
- if (this.uppercase && say.currentParagraph.length == 0) {
- this.node.nodeValue = this.node.nodeValue.charAt(0).toUpperCase()
- + this.node.nodeValue.substr(1, this.node.nodeValue.length - 1);
- }
- }
- return [this.node];
- }
- }
- class SayHimHerIt extends Say {
- constructor(target, autoUppercase) {
- super();
- this.node = document.createTextNode("a ");
- this.uppercase = true;
- this.target = target;
- if (autoUppercase != undefined) {
- this.uppercase = autoUppercase;
- }
- }
- async getPureElements(say) {
- let next = this.target;
- if (next == undefined) {
- this.node.nodeValue = "";
- }
- else {
- if (next instanceof Humanoid) {
- let gender = next.getGenderValue();
- if (gender.genderValueCorrected > 65) {
- this.node.nodeValue = "her ";
- }
- else if (gender.genderValueCorrected < 35) {
- this.node.nodeValue = "him ";
- }
- else {
- if (gender.hasPenisBulge || gender.hasPenis) {
- this.node.nodeValue = "him ";
- }
- else if (gender.hasVagina || gender.hasTits) {
- this.node.nodeValue = "her ";
- }
- else {
- this.node.nodeValue = "them ";
- }
- }
- }
- else {
- this.node.nodeValue = "it ";
- }
- if (this.uppercase && say.currentParagraph.length == 0) {
- this.node.nodeValue = this.node.nodeValue.charAt(0).toUpperCase()
- + this.node.nodeValue.substr(1, this.node.nodeValue.length - 1);
- }
- }
- return [this.node];
- }
- }
- class SayHisHersIts extends Say {
- constructor(target, autoUppercase) {
- super();
- this.node = document.createTextNode("a ");
- this.uppercase = true;
- this.target = target;
- if (autoUppercase != undefined) {
- this.uppercase = autoUppercase;
- }
- }
- async getPureElements(say) {
- let next = this.target;
- if (next == undefined) {
- this.node.nodeValue = "";
- }
- else {
- if (next instanceof Humanoid) {
- let gender = next.getGenderValue();
- if (gender.genderValueCorrected > 65) {
- this.node.nodeValue = "hers ";
- }
- else if (gender.genderValueCorrected < 35) {
- this.node.nodeValue = "his ";
- }
- else {
- if (gender.hasPenisBulge || gender.hasPenis) {
- this.node.nodeValue = "his ";
- }
- else if (gender.hasVagina || gender.hasTits) {
- this.node.nodeValue = "hers ";
- }
- else {
- this.node.nodeValue = "their ";
- }
- }
- }
- else {
- this.node.nodeValue = "its ";
- }
- if (this.uppercase && say.currentParagraph.length == 0) {
- this.node.nodeValue = this.node.nodeValue.charAt(0).toUpperCase()
- + this.node.nodeValue.substr(1, this.node.nodeValue.length - 1);
- }
- }
- return [this.node];
- }
- }
- class SayIf extends Say {
- constructor(condition, ...objs) {
- super(...objs);
- this.condition = condition != undefined ? condition : () => { return true; };
- }
- async getPureElements() {
- if (this.condition()) {
- let paragraphs = await this.getParagraphs();
- return paragraphs.length == 1 ? paragraphs[0] : Array.prototype.concat.apply([], paragraphs);
- }
- return [];
- }
- }
- class SayItalic extends Say {
- async getPureElements() {
- let paragraphs = await this.getParagraphs();
- let elements = paragraphs.length == 1 ? paragraphs[0] : Array.prototype.concat.apply([], paragraphs);
- let b = document.createElement("i");
- elements.forEach((element) => {
- b.appendChild(element);
- });
- return [b];
- }
- }
- class SayLeftRight extends Say {
- constructor() {
- super();
- this.left = new Say();
- this.right = new Say();
- }
- addLeft(...objs) {
- this.left.add(...objs);
- }
- addRight(...objs) {
- this.right.add(...objs);
- }
- async getPureElements() {
- if (this.left.sequence.length == 0) {
- return await this.right.getPureElements();
- }
- else if (this.right.sequence.length == 0) {
- return await this.left.getPureElements();
- }
- let mainDiv = document.createElement("div");
- mainDiv.classList.add("horFlex");
- let left = document.createElement("div");
- left.classList.add("horFlexColumn");
- mainDiv.appendChild(left);
- let right = document.createElement("div");
- right.classList.add("horFlexColumn");
- mainDiv.appendChild(right);
- await this.left.getPureElements().then(value => {
- value.forEach(element => {
- left.appendChild(element);
- });
- });
- await this.right.getPureElements().then(value => {
- value.forEach(element => {
- right.appendChild(element);
- });
- });
- return [mainDiv];
- }
- }
- class SayLink extends Say {
- setAction(action) {
- this.linkedAction = action;
- }
- async getPureElements() {
- let paragraphs = await this.getParagraphs();
- let elements = paragraphs.length == 1 ? paragraphs[0] : Array.prototype.concat.apply([], paragraphs);
- let b = document.createElement("b");
- b.classList.add("textLink");
- elements.forEach((element) => {
- b.appendChild(element);
- });
- Controls.Links.makeLink(b, this.linkedAction);
- return [b];
- }
- }
- class SayThe extends Say {
- constructor(autoUppercase, alwaysPrint) {
- super();
- this.node = document.createTextNode("");
- this.uppercase = true;
- this.alwaysPrint = false;
- if (autoUppercase != undefined) {
- this.uppercase = autoUppercase;
- }
- if (alwaysPrint) {
- this.alwaysPrint = alwaysPrint;
- }
- }
- async getPureElements(say) {
- let next = say.sequence[say.sequenceRunner + 1];
- if (this.alwaysPrint) {
- this.node.nodeValue = "the ";
- }
- else if (next == undefined) {
- this.node.nodeValue = "";
- }
- else {
- if (next instanceof Thing) {
- if (!next.properlyNamed) {
- this.node.nodeValue = "the ";
- }
- else {
- this.node.nodeValue = "";
- }
- }
- else {
- this.node.nodeValue = "";
- }
- }
- if (this.node.nodeValue != "") {
- if (this.uppercase && say.currentParagraph.length == 0) {
- this.node.nodeValue = this.node.nodeValue.charAt(0).toUpperCase()
- + this.node.nodeValue.substr(1, this.node.nodeValue.length - 1);
- }
- }
- return [this.node];
- }
- }
- var Elements;
- (function (Elements) {
- var AppearanceHandler;
- (function (AppearanceHandler) {
- var target = document.getElementById("appearanceTarget");
- function empty() {
- while (target.firstChild) {
- target.removeChild(target.firstChild);
- }
- }
- async function print(say) {
- await say.getHTML("p", ["appearanceDescription"]).then(value => {
- for (let i = 0; i < value.length; i++) {
- target.appendChild(value[i]);
- }
- });
- }
- AppearanceHandler.print = print;
- async function updateAppearance() {
- empty();
- let player = WorldState.player;
- let playerGender = player.getGenderValue();
- let playerSluttiness = player.getSluttiness();
- let you = new SayLink("You");
- you.setAction(new ActionExamine(WorldState.player, WorldState.player));
- let presentation = new Say(you, " are presenting as ", new SayAn(), player.getShortestDescription(), ".");
- if (playerSluttiness.naked) {
- presentation.add(" You are naked.");
- }
- else if (playerSluttiness.halfNaked) {
- presentation.add(" You are almost naked.");
- }
- let tits = Thing.PartRelation.getRightTypeOne(player, HumanoidBreasts);
- let penis = Thing.PartRelation.getRightTypeOne(player, HumanoidPenis);
- let bulges = player.getBulges();
- if (bulges.breasts > 0 || playerGender.genderValueCorrected > 60) {
- let realTits = tits.getSizeText();
- let fakeTits = HumanoidBreasts.getSizeText(bulges.breasts);
- presentation.add(" You have " + realTits + " breasts");
- if (bulges.breasts != tits.getSize() && realTits != fakeTits) {
- presentation.add(", padded to appear as " + fakeTits + " through your clothing.");
- }
- else {
- if (!tits.isUncovered()) {
- presentation.add(", safely covered.");
- }
- else {
- presentation.add(".");
- }
- }
- }
- if (penis == undefined) {
- presentation.add(" You have ", new SayAn(), HumanoidPenis.getSizeText(bulges.crotch) + " crotch bulge visible through your clothing.");
- }
- else {
- let realDick = penis.getSizeText();
- let fakeDick = HumanoidPenis.getSizeText(bulges.crotch);
- presentation.add(" You have ", new SayAn(), realDick + " dick");
- if (penis.getActualSize() != bulges.crotch && realDick != fakeDick) {
- presentation.add(", which looks like it is " + fakeDick + " due to your clothing.");
- }
- else {
- if (!penis.isUncovered()) {
- presentation.add(", which is covered.");
- }
- else {
- presentation.add(".");
- }
- }
- }
- await print(presentation);
- }
- AppearanceHandler.updateAppearance = updateAppearance;
- })(AppearanceHandler = Elements.AppearanceHandler || (Elements.AppearanceHandler = {}));
- })(Elements || (Elements = {}));
- function updateFontSize() {
- var minWidth = Elements.isMobile ? 800 : 1280;
- var proportion = Elements.isMobile ? 17 : 14.5;
- var width = document.body.clientWidth < minWidth ? minWidth : document.body.clientWidth;
- document.documentElement.style["font-size"] = (width * proportion / 1280) + "px";
- }
- updateFontSize();
- window.addEventListener("resize", updateFontSize);
- function toggleFullScreen() {
- var doc = window.document;
- var docEl = doc.documentElement;
- var requestFullScreen = docEl.requestFullscreen || docEl.mozRequestFullScreen || docEl.webkitRequestFullScreen || docEl.msRequestFullscreen;
- var cancelFullScreen = doc.exitFullscreen || doc.mozCancelFullScreen || doc.webkitExitFullscreen || doc.msExitFullscreen;
- if (!doc.fullscreenElement && !doc.mozFullScreenElement && !doc.webkitFullscreenElement && !doc.msFullscreenElement) {
- requestFullScreen.call(docEl);
- }
- else {
- cancelFullScreen.call(doc);
- }
- }
- var Elements;
- (function (Elements) {
- var HoverInfo;
- (function (HoverInfo) {
- var hoverbox = document.getElementById("hoverInfo");
- var contentTarget = document.getElementById("hoverContent");
- var width = 0;
- var height = 0;
- function empty() {
- while (contentTarget.firstChild != undefined) {
- contentTarget.removeChild(contentTarget.firstChild);
- }
- }
- function makeHoverable(element, contents) {
- element.addEventListener("mouseenter", (e) => {
- Elements.HoverInfo.hoverStart(e, contents);
- });
- element.addEventListener("mousemove", (e) => {
- Elements.HoverInfo.hoverMove(e);
- });
- element.addEventListener("mouseout", (e) => {
- Elements.HoverInfo.hoverEnd();
- });
- }
- HoverInfo.makeHoverable = makeHoverable;
- function hoverStart(e, contents) {
- empty();
- for (let i = 0; i < contents.length; i++) {
- contentTarget.appendChild(contents[i]);
- }
- hoverbox.style.display = "block";
- hoverbox.style.left = "0px";
- hoverbox.style.top = "0px";
- width = hoverbox.offsetWidth;
- height = hoverbox.offsetHeight;
- hoverMove(e);
- }
- HoverInfo.hoverStart = hoverStart;
- function hoverMove(e) {
- let left = e.clientX - (width / 2);
- let top = e.clientY - (height) - 6;
- if (top < 0) {
- top = e.clientY + 6;
- }
- if (left < width) {
- left = width;
- }
- if (left + width > Elements.screenWidth) {
- left = Elements.screenWidth - width;
- }
- hoverbox.style.left = Math.round(left) + "px";
- hoverbox.style.top = Math.round(top) + "px";
- }
- HoverInfo.hoverMove = hoverMove;
- function hoverEnd() {
- hoverbox.style.display = "none";
- }
- HoverInfo.hoverEnd = hoverEnd;
- })(HoverInfo = Elements.HoverInfo || (Elements.HoverInfo = {}));
- })(Elements || (Elements = {}));
- var Elements;
- (function (Elements) {
- var HyperlinkHandler;
- (function (HyperlinkHandler) {
- HyperlinkHandler.linkedActionsTab = document.getElementById("linkActions");
- HyperlinkHandler.commonActionsTab = document.getElementById("commonActionsTab");
- var currentCommand = document.createTextNode("");
- document.getElementById("currentCommand").appendChild(currentCommand);
- var currentActionTarget = document.createTextNode("");
- document.getElementById("linkTarget").appendChild(currentActionTarget);
- var commonActions = [];
- var availableActions = [];
- function resetCommonActions() {
- commonActions.splice(0, commonActions.length);
- while (HyperlinkHandler.commonActionsTab.firstChild) {
- HyperlinkHandler.commonActionsTab.removeChild(HyperlinkHandler.commonActionsTab.firstChild);
- }
- }
- HyperlinkHandler.resetCommonActions = resetCommonActions;
- function addCommonAction(name, action) {
- commonActions.push([name, action]);
- }
- HyperlinkHandler.addCommonAction = addCommonAction;
- function resetAvailableActions() {
- availableActions = [];
- currentActionTarget.nodeValue = "";
- while (HyperlinkHandler.linkedActionsTab.firstChild) {
- HyperlinkHandler.linkedActionsTab.removeChild(HyperlinkHandler.linkedActionsTab.firstChild);
- }
- }
- function addAvailableAction(name, action) {
- availableActions.push([name, action]);
- }
- HyperlinkHandler.addAvailableAction = addAvailableAction;
- function hoverAction(action) {
- currentCommand.nodeValue = action.getCommandText().toLowerCase();
- }
- HyperlinkHandler.hoverAction = hoverAction;
- function unhoverAction() {
- currentCommand.nodeValue = "";
- }
- HyperlinkHandler.unhoverAction = unhoverAction;
- async function hyperlinkObject(thing) {
- resetAvailableActions();
- if (thing instanceof Thing && thing != WorldState.player) {
- await HyperlinkHandler.HyperlinkingRulebook.execute({ noun: thing });
- currentActionTarget.nodeValue = thing.getPrintedName() + ": ";
- for (let i = 0, value = availableActions[i]; value != undefined; value = availableActions[++i]) {
- let link = createLink(value);
- link.classList.add("columnLink");
- Controls.KeyHandler.applyCode(link, Controls.KeyHandler.getSecondKeyCode());
- HyperlinkHandler.linkedActionsTab.appendChild(link);
- }
- }
- }
- HyperlinkHandler.hyperlinkObject = hyperlinkObject;
- function createLink(value) {
- let link = document.createElement("a");
- link.appendChild(document.createTextNode(value[0]));
- Controls.Links.makeLink(link, value[1]);
- return link;
- }
- async function hyperlinkCommonActions() {
- resetCommonActions();
- await HyperlinkHandler.CommonActionsRulebook.execute({});
- for (let i = 0, value = commonActions[i]; value != undefined; value = commonActions[++i]) {
- let link = createLink(value);
- link.classList.add("lineLink");
- Controls.KeyHandler.applyCode(link, Controls.KeyHandler.getThirdKeyCode());
- HyperlinkHandler.commonActionsTab.appendChild(link);
- }
- }
- HyperlinkHandler.hyperlinkCommonActions = hyperlinkCommonActions;
- HyperlinkHandler.HyperlinkingRulebook = new Rulebook("Hyperlinking something");
- HyperlinkHandler.CommonActionsRulebook = new Rulebook("Common Actions Rulebook");
- })(HyperlinkHandler = Elements.HyperlinkHandler || (Elements.HyperlinkHandler = {}));
- })(Elements || (Elements = {}));
- class Action {
- constructor(actor, ...nouns) {
- this.extraChecks = [];
- this.extraCarries = [];
- this.nouns = [];
- this.say = new Say();
- this.actingAgressively = false;
- this.actingSubmissively = false;
- this.requiresTurn = true;
- this.requiresNoun = true;
- this.requiresVisibility = true;
- this.actor = actor;
- nouns.forEach((value, index, array) => {
- this.setNoun(index, value);
- });
- }
- async execute() {
- this.say = new Say();
- let checkRulebooks = [];
- let carryRulebooks = [];
- let cClass = this.constructor;
- while (cClass != Action) {
- if (cClass.check != undefined) {
- checkRulebooks.push(cClass.check);
- }
- if (cClass.carry != undefined) {
- carryRulebooks.push(cClass.carry);
- }
- cClass = Object.getPrototypeOf(cClass);
- }
- let result = await Action.check.execute({
- noun: this
- }, ...checkRulebooks);
- if (result == false) {
- return;
- }
- else if (result instanceof Action) {
- console.debug(Rulebook.getIndentation() + "[ACTION] Instead of...");
- await result.execute();
- this.say.add(result.say);
- this.nouns = result.nouns;
- return;
- }
- await Action.carry.execute({
- noun: this
- }, ...carryRulebooks);
- return this.say;
- }
- get actor() {
- return this._actor;
- }
- set actor(value) {
- this._actor = value;
- }
- getNoun(n) {
- if (this.nouns.length > n) {
- return this.nouns[n];
- }
- return undefined;
- }
- setNoun(n, noun) {
- while (this.nouns.length < n) {
- this.nouns.push(undefined);
- }
- this.nouns[n] = noun;
- }
- getCommandText() {
- return "do";
- }
- stop() {
- this.requiresTurn = false;
- }
- }
- Action.check = new Rulebook("Check any Action");
- Action.carry = new Rulebook("Carry out any Action");
- Action.check.addRule(new Rule({
- name: "Check any Action - Requires Noun",
- firstPriority: Rule.PRIORITY_HIGHEST,
- code: (rulebook) => {
- let action = rulebook.noun;
- if (action.getNoun(0) == undefined) {
- return false;
- }
- },
- conditions: runner => {
- return runner.noun.requiresNoun;
- }
- }));
- Action.check.addRule(new Rule({
- name: "Check any Action - Requires Visibility",
- code: (rulebook) => {
- let action = rulebook.noun;
- let actor = action.actor;
- if (!action.getNoun(0).isVisibleTo(actor)) {
- return false;
- }
- },
- conditions: runner => {
- return runner.noun.requiresVisibility;
- }
- }));
- class ActionExamine extends Action {
- constructor() {
- super(...arguments);
- this.requiresTurn = false;
- }
- getCommandText() {
- if (this.getNoun(0) == WorldState.player) {
- return "examine myself";
- }
- return "examine " + (this.getNoun(0) != undefined ? this.getNoun(0).getPrintedName() : "");
- }
- }
- ActionExamine.check = new Rulebook("Check Examining");
- ActionExamine.carry = new Rulebook("Carry out Examining");
- ActionExamine.PrintDescriptionOfExaminedThingRule = ActionExamine.carry.createAndAddRule({
- name: "Examine - Print Description of Examined Thing",
- code: (rulebook) => {
- let action = rulebook.noun;
- let noun = action.getNoun(0);
- if (noun instanceof Thing && noun.image != undefined) {
- action.say.add(noun.image, Say.PARAGRAPH_BREAK);
- }
- action.say.add(action.getNoun(0).getPrintedDescription());
- }
- });
- Elements.HyperlinkHandler.CommonActionsRulebook.addRule(new Rule({
- name: "Look at me!",
- firstPriority: Rule.PRIORITY_LOWEST,
- priority: Rule.PRIORITY_HIGH,
- code: (rulebook) => {
- Elements.HyperlinkHandler.addCommonAction("Inspect", new ActionExamine(WorldState.player, WorldState.player));
- }
- }));
- class RelationHandler {
- constructor(...relations) {
- relations.forEach(relation => {
- relation.setHandler(this);
- });
- this.relations = relations;
- }
- addRelation(relation) {
- this.relations.push(relation);
- relation.setHandler(this);
- }
- }
- class Relation {
- setHandler(handler) {
- this.handler = handler;
- }
- hasHandler() {
- return this.handler != undefined;
- }
- static createString(obj1, obj2) {
- if (obj1 instanceof Object && obj2 instanceof Object) {
- let id1 = Relation.getId(obj1);
- let id2 = Relation.getId(obj2);
- return id1 < id2 ?
- (id1 + ";" + id2) :
- (id2 + ";" + id1);
- }
- }
- static getId(obj) {
- if (obj[Relation.objectIdField] == undefined) {
- obj[Relation.objectIdField] = Relation.objectCount++;
- }
- return obj[Relation.objectIdField];
- }
- }
- Relation.objectCount = 0;
- Relation.objectIdField = "_RELATIONINTERNALID";
- class RelationHandlerStrictOneToMany extends RelationHandler {
- setRelation(relation, left, right, value) {
- let parents = this.getAllLeft(left);
- if (parents.indexOf(right) != -1) {
- console.warn("[Relation] Attempt to create a circular relation:", this, left, right);
- return false;
- }
- this.unsetRight(right);
- return true;
- }
- unset(thing) {
- this.unsetLeft(thing);
- this.unsetRight(thing);
- }
- unsetLeft(left) {
- this.relations.forEach(relation => {
- relation.unsetLeft(left);
- });
- }
- unsetRight(right) {
- this.relations.forEach(relation => {
- relation.unsetRight(right);
- });
- }
- getLeft(right) {
- let result;
- for (let i = 0; i < this.relations.length; i++) {
- result = this.relations[i].getLeft(right);
- if (result != undefined) {
- return result;
- }
- }
- }
- getAllLeft(right) {
- let newParent = this.getLeft(right);
- let parents = [];
- while (newParent != undefined) {
- parents.push(newParent);
- newParent = this.getLeft(newParent);
- }
- return parents;
- }
- getAllLeftType(right, type) {
- return this.getAllLeft(right).filter(left => {
- return left instanceof type;
- });
- }
- getLastLeft(right) {
- let parent = this.getLeft(right);
- let newParent = this.getLeft(parent);
- while (newParent != undefined) {
- parent = newParent;
- newParent = this.getLeft(parent);
- }
- return parent;
- }
- getAllRight(left) {
- let rights = [];
- this.relations.forEach(relation => {
- rights.push(...relation.getRight(left));
- });
- arrayUnique(rights);
- return rights;
- }
- getAllRightTypes(left, rightType) {
- return this.getAllRight(left).filter(right => {
- return right instanceof rightType;
- });
- }
- }
- class RelationOneToMany extends Relation {
- constructor() {
- super(...arguments);
- this.valuesHash = {};
- this.oneMap = new Map();
- this.manyMap = new Map();
- }
- getValue(left, right) {
- return this.valuesHash[Relation.createString(left, right)];
- }
- setValue(left, right, value) {
- if (this.manyMap.get(right) == left) {
- let string = Relation.createString(left, right);
- if (string != undefined) {
- this.valuesHash[string] = value;
- }
- }
- }
- setRelation(left, right, value) {
- let proceed;
- if (this.handler != undefined) {
- proceed = this.handler.setRelation(this, left, right, value);
- }
- if (proceed) {
- this.unsetRight(left);
- this.unsetLeft(right);
- this.unsetRight(right);
- let string = Relation.createString(left, right);
- if (string != undefined) {
- this.valuesHash[string] = value;
- }
- this.manyMap.set(right, left);
- if (this.oneMap.get(left) == undefined) {
- this.oneMap.set(left, [right]);
- }
- else {
- this.oneMap.get(left).push(right);
- }
- }
- }
- getLeft(right) {
- return this.manyMap.get(right);
- }
- getAnyLeft() {
- let left = [];
- this.oneMap.forEach((value, key) => {
- left.push(key);
- });
- arrayUnique(left);
- return left;
- }
- getAnyRight() {
- let rights = [];
- this.oneMap.forEach((value) => {
- rights.push(...value);
- });
- arrayUnique(rights);
- return rights;
- }
- getAnyRightType(type) {
- return this.getAnyRight().filter(value => {
- return value instanceof type;
- });
- }
- isRight(left, needle) {
- let right = this.oneMap.get(left);
- if (right != undefined) {
- return right.indexOf(needle) != -1;
- }
- return false;
- }
- getRight(left) {
- let right = this.oneMap.get(left);
- if (right != undefined) {
- return [].concat(...right);
- }
- return [];
- }
- getRightType(left, type) {
- return this.getRight(left).filter(right => {
- return right instanceof type;
- });
- }
- getRightTypeOne(left, type) {
- let rights = this.getRightType(left, type);
- if (rights.length > 0) {
- return rights[0];
- }
- }
- getRelationValue(left, right) {
- return this.valuesHash[Relation.createString(left, right)];
- }
- unsetRight(right) {
- let left = this.manyMap.get(right);
- if (left != undefined) {
- let allRight = this.oneMap.get(left);
- allRight.splice(allRight.indexOf(right), 1);
- this.manyMap.delete(right);
- if (allRight.length == 0) {
- this.oneMap.delete(left);
- }
- let string = Relation.createString(left, right);
- if (string != undefined) {
- delete (this.valuesHash[string]);
- }
- }
- }
- unsetLeft(left) {
- let allRight = this.oneMap.get(left);
- if (allRight != undefined) {
- allRight.forEach((right) => {
- this.manyMap.delete(right);
- let string = Relation.createString(left, right);
- if (string != undefined) {
- delete (this.valuesHash[string]);
- }
- });
- this.oneMap.delete(left);
- }
- }
- }
- class Thing {
- constructor(options) {
- this.properlyNamed = false;
- this.scenery = false;
- this.fixedInPlace = false;
- this.animated = false;
- this.visible = true;
- this.unique = false;
- this.shiny = false;
- this.setAlterations = [];
- this.getAlterations = [];
- this.clone = function () {
- throw new Error("Non-unique Objects can't be cloned.");
- };
- options = options == undefined ? {} : options;
- if (options.properName != undefined) {
- this.name = options.properName;
- this.properlyNamed = true;
- }
- else if (options.name != undefined) {
- this.name = options.name;
- }
- else {
- this.name = this.constructor.name;
- }
- if (options.description != undefined) {
- if (options.description instanceof Say) {
- this.description = options.description;
- }
- else {
- this.description = new Say(options.description);
- }
- }
- if (options.unique) {
- Thing.storeUnique(this);
- this.unique = true;
- }
- else {
- Thing.storeNonUnique(this);
- this.cloneOptions = options;
- this.clone = (includeChanges) => {
- let cons = eval(this.constructor.name);
- let newThing = new cons(this.cloneOptions);
- if (includeChanges == undefined || includeChanges) {
- newThing.setChanges(this.getChanges());
- }
- return newThing;
- };
- }
- if (options.image != undefined) {
- if (options.image instanceof SayImage) {
- this.image = options.image;
- }
- else {
- this.image = new SayImage(options.image);
- }
- }
- this.shiny = options.shiny == true;
- this.addGetAlterations((thing) => {
- function getClosestRoom(currentRoom, rooms) {
- if (currentRoom instanceof RoomRandom && rooms.length > 0) {
- rooms.sort((a, b) => {
- if (!(a instanceof RoomRandom))
- return -1;
- if (!(b instanceof RoomRandom))
- return 1;
- let da = a.getDistanceTo(currentRoom);
- let db = b.getDistanceTo(currentRoom);
- return da - db;
- });
- return {
- Location: rooms[0].getName()
- };
- }
- }
- if (Thing.EnclosedRelation.getLeft(thing) == thing.getRoom() && thing.getRoom() != undefined) {
- if (thing.getRoom().fodder) {
- if (thing.isPlayer()) {
- let rooms = WorldState.getRememberedRoomsAsRooms();
- let currentRoom = thing.getRoom();
- return getClosestRoom(currentRoom, rooms);
- }
- else {
- let rooms = thing.getRoom().getConnectedRooms();
- let currentRoom = thing.getRoom();
- let foundRoom = getClosestRoom(currentRoom, rooms);
- if (foundRoom != undefined) {
- return foundRoom;
- }
- else {
- rooms = Region.InRelation.getLeft(thing.getRoom()).getRooms();
- return getClosestRoom(currentRoom, rooms);
- }
- }
- }
- else {
- return {
- Location: thing.getRoom().getName()
- };
- }
- }
- });
- this.addSetAlterations((thing, changes) => {
- if (changes.Location != undefined) {
- let room = Room.getRoom(changes.Location);
- if (room != undefined) {
- room.place(thing);
- }
- else {
- console.error("Unable to place ", thing, " at room ", changes.Location);
- }
- }
- });
- }
- addGetAlterations(newGet) {
- this.getAlterations.push(newGet);
- }
- addSetAlterations(newSet) {
- this.setAlterations.push(newSet);
- }
- getChanges() {
- let changes = {};
- for (let i = 0; i < this.getAlterations.length; i++) {
- let change = this.getAlterations[i](this);
- for (let key in change) {
- changes[key] = change[key];
- }
- }
- return changes;
- }
- setChanges(simpleAlterationObject) {
- for (let i = 0; i < this.setAlterations.length; i++) {
- this.setAlterations[i](this, simpleAlterationObject);
- }
- }
- getShiny() {
- return this.shiny;
- }
- setName(name) {
- this.name = name;
- }
- getName() {
- return this.name;
- }
- static storeNonUnique(thing) {
- if (Thing.things[thing.name] == undefined) {
- Thing.things[thing.name] = [thing];
- }
- else {
- Thing.things[thing.name].push(thing);
- }
- }
- static getNonUnique(name) {
- return Thing.things[name] == undefined ? [] : Thing.things[name];
- }
- static getOneThing(name) {
- let thing = Thing.getUnique(name);
- if (thing == undefined) {
- let things = Thing.getNonUnique(name);
- if (things.length > 0) {
- thing = things[0];
- }
- }
- return thing;
- }
- static storeUnique(unique) {
- if (Thing.uniqueThings[unique.name] != undefined) {
- console.warn(unique.name, Thing.uniqueThings[unique.name], new Error("Unique Thing Already Exists"));
- }
- else {
- Thing.uniqueThings[unique.name] = unique;
- }
- }
- static getUnique(name) {
- return Thing.uniqueThings[name];
- }
- static getUniques() {
- let things = [];
- for (let name in Thing.uniqueThings) {
- things.push(Thing.uniqueThings[name]);
- }
- return things;
- }
- getPrintedName() {
- return this.name;
- }
- getPrintedDescription() {
- if (this.description == undefined) {
- return new Say("You see nothing special about ", new SayThe(), this, ".");
- }
- else {
- return this.description;
- }
- }
- getPartOne() {
- return Thing.PartRelation.getLeft(this);
- }
- getCarryOne() {
- return Thing.CarryRelation.getLeft(this);
- }
- getWieldOne() {
- return Thing.WieldRelation.getLeft(this);
- }
- getWearOne() {
- return Thing.WearRelation.getLeft(this);
- }
- getEnclosedOne() {
- return Thing.EnclosedRelation.getLeft(this);
- }
- removeParts(partType) {
- let parts = this.getParts(partType);
- for (let i = 0; i < parts.length; i++) {
- Thing.PartRelation.unsetRight(parts[i]);
- }
- }
- getParts(partType) {
- if (partType != undefined) {
- return Thing.PartRelation.getRightType(this, partType);
- }
- return Thing.PartRelation.getRight(this);
- }
- getPartsByName(name) {
- let parts = this.getParts();
- return parts.filter((part) => {
- return (part.getName() == name);
- });
- }
- getPart(partType) {
- if (partType != undefined) {
- return Thing.PartRelation.getRightTypeOne(this, partType);
- }
- return Thing.PartRelation.getRight(this);
- }
- getHighestEnclosedOne() {
- return Thing.EnclosedRelation.getLastLeft(this);
- }
- getHighestEnclosedOneNotRoom() {
- let parent = Thing.EnclosedRelation.getLeft(this);
- if (parent != undefined) {
- let newParent = Thing.EnclosedRelation.getLeft(parent);
- while (newParent != undefined) {
- parent = newParent;
- newParent = Thing.EnclosedRelation.getLeft(parent);
- }
- return parent;
- }
- return this;
- }
- getRoom() {
- var partOf = Thing.EnclosedRelation.getLeft(this);
- if (partOf instanceof Room) {
- return partOf;
- }
- else if (partOf instanceof Thing) {
- return partOf.getRoom();
- }
- }
- removeFromRoom() {
- this.getRoom().remove(this);
- }
- isVisibleTo(thing) {
- return (this.getRoom() == thing.getRoom() && this.visible);
- }
- isPlayer() {
- return false;
- }
- addParts(...parts) {
- parts.forEach(part => {
- Thing.PartRelation.setRelation(this, part);
- });
- }
- isUnique() {
- return this.unique;
- }
- setCarried(thing) {
- Thing.CarryRelation.setRelation(this, thing);
- }
- setWorn(thing) {
- Thing.WearRelation.setRelation(this, thing);
- }
- setWielded(thing) {
- Thing.WieldRelation.setRelation(this, thing);
- }
- unsetCarried(thing) {
- if (Thing.EnclosedRelation.getAllRight(this).indexOf(thing) != -1) {
- Thing.EnclosedRelation.unsetRight(thing);
- this.getRoom().place(thing);
- }
- }
- destroy() {
- let relatedRight = Thing.EnclosedRelation.getAllRight(this);
- relatedRight.push(this);
- relatedRight.forEach(related => {
- Thing.EnclosedRelation.unset(related);
- });
- }
- }
- Thing.uniqueThings = {};
- Thing.things = {};
- Thing.InsideRoomRelation = new RelationOneToMany();
- Thing.PartRelation = new RelationOneToMany();
- Thing.CarryRelation = new RelationOneToMany();
- Thing.WieldRelation = new RelationOneToMany();
- Thing.WearRelation = new RelationOneToMany();
- Thing.EnclosedRelation = new RelationHandlerStrictOneToMany(Thing.InsideRoomRelation, Thing.PartRelation, Thing.CarryRelation, Thing.WieldRelation, Thing.WearRelation);
- class ActionTake extends Action {
- getCommandText() {
- return "take " + (this.getNoun(0) != undefined ? this.getNoun(0).getPrintedName() : "");
- }
- }
- ActionTake.check = new Rulebook("Check Taking");
- ActionTake.carry = new Rulebook("Carry out Taking");
- ActionTake.defaultCarryTakingRule = new Rule({
- name: "Taking - Add the thing to your inventory",
- code: (rulebook) => {
- let action = rulebook.noun;
- let actor = action.actor;
- let thing = action.getNoun(0);
- if (thing.getEnclosedOne() != undefined) {
- Thing.EnclosedRelation.unsetRight(thing);
- }
- else {
- thing.removeFromRoom();
- }
- Thing.CarryRelation.setRelation(actor, action.getNoun(0));
- if (actor == WorldState.player) {
- action.say.add(new SayBold(action.getNoun(0).getPrintedName() + ": "), "Taken.");
- }
- else {
- action.say.add(new SayThe(), actor, " takes ", new SayThe(undefined, true), action.getNoun(0), ".");
- }
- }
- });
- ActionTake.check.addRule(new Rule({
- name: "Check Taking - Who has it, really?",
- priority: Rule.PRIORITY_HIGHEST,
- code: (rulebook) => {
- let action = rulebook.noun;
- let actor = action.actor;
- let thing = action.getNoun(0);
- let owner = thing.getEnclosedOne();
- if (owner == actor) {
- if (owner == WorldState.player) {
- action.say.add("You already have it.");
- }
- return false;
- }
- }
- }));
- ActionTake.check.addRule(new Rule({
- name: "Check Taking - Donut steal",
- code: (rulebook) => {
- let action = rulebook.noun;
- let actor = action.actor;
- let thing = action.getNoun(0);
- let owner = thing.getEnclosedOne();
- if (owner != undefined && owner.animated) {
- if (actor == WorldState.player) {
- action.say.add(owner.getPrintedName() + " wouldn't like that.");
- }
- return false;
- }
- }
- }));
- ActionTake.check.addRule(new Rule({
- name: "Check Taking - Can't take fixed in place",
- code: (rulebook) => {
- let action = rulebook.noun;
- let actor = action.actor;
- let thing = action.getNoun(0);
- if (thing.fixedInPlace) {
- if (actor == WorldState.player) {
- action.say.add("You can't take that.");
- }
- return false;
- }
- }
- }));
- ActionTake.carry.addRule(ActionTake.defaultCarryTakingRule);
- Elements.HyperlinkHandler.HyperlinkingRulebook.addRule(new Rule({
- name: "Hyperlink - Take",
- firstPriority: Rule.PRIORITY_HIGHEST,
- code: (rulebook) => {
- let thing = rulebook.noun;
- if (!thing.animated && !thing.fixedInPlace && thing.getRoom() == WorldState.player.getRoom() && thing.getEnclosedOne() instanceof Room) {
- Elements.HyperlinkHandler.addAvailableAction("Take", new ActionTake(WorldState.player, thing));
- }
- }
- }));
- class ActionGo extends Action {
- constructor(actor, ...nouns) {
- super(actor, ...nouns);
- this.originalTarget = nouns[0];
- this.requiresNoun = false;
- this.requiresVisibility = false;
- }
- getCommandText() {
- let name;
- if (typeof this.originalTarget == "number") {
- name = DirectionNames[Direction[this.originalTarget]];
- }
- else if (this.originalTarget instanceof Room) {
- name = "to " + this.originalTarget.getPrintedName();
- }
- return "go " + name;
- }
- }
- ActionGo.check = new Rulebook("Check Going");
- ActionGo.carry = new Rulebook("Carry out Going");
- ActionGo.ruleCheckRestoreOriginalNoun = ActionGo.check.createAndAddRule({
- firstPriority: Rule.PRIORITY_HIGHEST,
- priority: Rule.PRIORITY_HIGHEST,
- name: "Check Going - Restore original noun",
- code: (rulebook) => {
- let action = rulebook.noun;
- action.setNoun(0, action.originalTarget);
- }
- });
- ActionGo.ruleCheckIsthereactor = ActionGo.check.createAndAddRule({
- firstPriority: Rule.PRIORITY_HIGHEST,
- priority: Rule.PRIORITY_HIGHEST,
- name: "Check Going - Is there an actor?",
- code: (rulebook) => {
- let action = rulebook.noun;
- if (action.actor == undefined) {
- return false;
- }
- }
- });
- ActionGo.ruleCheckConvertRoomToDirection = ActionGo.check.createAndAddRule({
- firstPriority: Rule.PRIORITY_HIGHEST,
- priority: Rule.PRIORITY_HIGH,
- name: "Change Room to Direction",
- code: (rulebook) => {
- let action = rulebook.noun;
- if (action.getNoun(0) instanceof RoomRandom) {
- let actor = action.actor;
- let cRoom = actor.getRoom();
- if (cRoom instanceof RoomRandom) {
- let dRoom = action.getNoun(0);
- if (cRoom == dRoom) {
- if (actor.isPlayer()) {
- action.say.add("You are already there!");
- }
- return false;
- }
- let code;
- if (actor == WorldState.player) {
- code = (room) => {
- return WorldState.isRoomRemembered(room);
- };
- }
- let direction = cRoom.getAStarBestDirectionTo(dRoom, code);
- if (direction == undefined) {
- if (actor.isPlayer()) {
- action.say.add("You don't remember how to get there.");
- }
- return false;
- }
- else {
- action.setNoun(0, direction);
- }
- }
- }
- }
- });
- ActionGo.ruleCheckIstheredirectionandroom = ActionGo.check.createAndAddRule({
- name: "Check Going - is there a direction? Does it lead anywhere?",
- code: (rulebook) => {
- let action = rulebook.noun;
- let cRoom = action.actor.getRoom();
- if (cRoom == undefined) {
- return false;
- }
- let direction = action.getNoun(0);
- if (direction == undefined) {
- return false;
- }
- let nextRoom = cRoom.connections[direction];
- if (nextRoom == undefined) {
- return false;
- }
- action.roomGoneFrom = action.actor.getRoom();
- action.roomGoneTo = nextRoom;
- }
- });
- ActionGo.ruleCarryMove = ActionGo.carry.createAndAddRule({
- name: "Going - Move Actor to Next Room",
- code: (rulebook) => {
- let action = rulebook.noun;
- let roomGoneFrom = action.actor.getRoom();
- let direction = action.getNoun(0);
- let roomGoneInto = roomGoneFrom.connections[direction];
- roomGoneInto.place(action.actor);
- let actor = action.actor;
- if (actor == WorldState.player) {
- action.say.add("You go " + DirectionNames[Direction[direction]].toLowerCase() + ".");
- }
- else {
- if (roomGoneFrom == WorldState.player.getRoom()) {
- action.say.add(new SayThe(), actor, " goes " + DirectionNames[Direction[direction]].toLowerCase() + ".");
- }
- else {
- let oppositeName = DirectionNames[OppositeDirection[direction]];
- action.say.add(new SayThe(), actor, " arrives from the " + oppositeName.toLowerCase() + ".");
- }
- }
- }
- });
- ActionGo.ruleCarryRememberRooms = ActionGo.carry.createAndAddRule({
- name: "Going - Remember the involved rooms",
- code: (rulebook) => {
- let action = rulebook.noun;
- let actor = action.actor;
- let roomGoneInto = action.actor.getRoom();
- let direction = action.getNoun(0);
- let roomGoneFrom = roomGoneInto.connections[OppositeDirection[Direction[direction]]];
- if (actor.isPlayer()) {
- WorldState.rememberRoom(roomGoneFrom, roomGoneInto);
- }
- }
- });
- var Elements;
- (function (Elements) {
- var RoomHandler;
- (function (RoomHandler) {
- RoomHandler.currentRoomTab = document.getElementById("currentRoomTab");
- RoomHandler.currentRoomDescription = document.getElementById("roomDescription");
- RoomHandler.currentRoomExits = document.getElementById("roomExits");
- RoomHandler.currentRoomName = document.createTextNode("");
- document.getElementById("roomName").appendChild(RoomHandler.currentRoomName);
- function linkObjects() {
- let objs = RoomHandler.currentRoomTab.getElementsByClassName("roomObject");
- for (let i = 0; i < objs.length; i++) {
- let linkKeyCode = Controls.KeyHandler.getFirstKeyCode();
- Controls.KeyHandler.applyCode(objs[i], linkKeyCode);
- }
- }
- RoomHandler.linkObjects = linkObjects;
- function emptyRoom() {
- while (RoomHandler.currentRoomDescription.firstChild) {
- RoomHandler.currentRoomDescription.removeChild(RoomHandler.currentRoomDescription.firstChild);
- }
- while (RoomHandler.currentRoomExits.firstChild) {
- RoomHandler.currentRoomExits.removeChild(RoomHandler.currentRoomExits.firstChild);
- }
- RoomHandler.currentRoomName.nodeValue = "";
- }
- RoomHandler.emptyRoom = emptyRoom;
- async function updateRoom() {
- emptyRoom();
- let room = WorldState.player.getRoom();
- if (room != undefined) {
- RoomHandler.currentRoomName.nodeValue = room.getPrintedName();
- let description = room.description.getHTML("p", ["roomDescription"]);
- await description.then(value => {
- for (let i = 0, p = value[i]; p != undefined; p = value[++i]) {
- RoomHandler.currentRoomDescription.appendChild(p);
- }
- });
- let things = room.getContainedAndVisible();
- if (things.length > 0) {
- let thingList = document.createElement("p");
- thingList.classList.add("roomDescription");
- await RoomHandler.PrintingVisibleThingsRulebook.execute({
- noun: {
- things: things,
- container: thingList
- }
- });
- RoomHandler.currentRoomDescription.appendChild(thingList);
- }
- for (let index = 0, value = room.connections[index]; index < room.connections.length; value = room.connections[++index]) {
- if (value != undefined) {
- let p = document.createElement("p");
- p.classList.add("roomExit");
- let link = document.createElement("a");
- link.classList.add("roomDirection");
- link.appendChild(document.createTextNode(DirectionNames[Direction[index]]));
- Controls.Links.makeLink(link, new ActionGo(WorldState.player, index));
- Controls.KeyHandler.applyCode(link, Controls.KeyHandler.getDirectionCodeByIndex(index));
- p.appendChild(link);
- let directionResult = ": ";
- if (WorldState.isRoomRemembered(value)) {
- directionResult += value.getPrintedName();
- }
- else {
- directionResult += "A new place";
- }
- p.appendChild(document.createTextNode(directionResult));
- RoomHandler.currentRoomExits.appendChild(p);
- }
- }
- }
- }
- RoomHandler.updateRoom = updateRoom;
- RoomHandler.PrintingVisibleThingsRulebook = new Rulebook("Printing the name of visible things in a room");
- RoomHandler.PrintIntroToVisibleThingsRule = new Rule({
- name: "Print \"You can see\" text",
- firstPriority: Rule.PRIORITY_HIGH,
- code: (rulebook) => {
- let noun = rulebook.noun;
- noun.container.appendChild(document.createTextNode("You can see "));
- }
- });
- RoomHandler.PrintingVisibleThingsRulebook.addRule(RoomHandler.PrintIntroToVisibleThingsRule);
- RoomHandler.PrintVisibleThingsRule = new Rule({
- name: "Print all visible things",
- code: async (rulebook) => {
- let noun = rulebook.noun;
- for (let i = 0; i < noun.things.length; i++) {
- let value = noun.things[i];
- let link = document.createElement("a");
- link.classList.add("roomObject");
- let say;
- if (value instanceof Thing && value.unique) {
- say = new Say(new SayThe(false), value);
- }
- else {
- say = new Say(new SayAn(false), value);
- }
- await say.getPureElements().then(value2 => {
- for (let i = 0, element = value2[i]; element != undefined; element = value2[++i]) {
- link.appendChild(element);
- }
- });
- Controls.Links.makeLink(link, new ActionExamine(WorldState.player, value));
- Controls.KeyHandler.applyCode(link, Controls.KeyHandler.getFirstKeyCode());
- noun.container.appendChild(link);
- if ((i + 1) < noun.things.length) {
- noun.container.appendChild(document.createTextNode(", "));
- }
- }
- }
- });
- RoomHandler.PrintingVisibleThingsRulebook.addRule(RoomHandler.PrintVisibleThingsRule);
- RoomHandler.PrintOutroToVisibleThingsRule = new Rule({
- name: "Print \"... here\" text",
- firstPriority: Rule.PRIORITY_LOW,
- code: (rulebook) => {
- let noun = rulebook.noun;
- noun.container.appendChild(document.createTextNode(" here."));
- }
- });
- RoomHandler.PrintingVisibleThingsRulebook.addRule(RoomHandler.PrintOutroToVisibleThingsRule);
- })(RoomHandler = Elements.RoomHandler || (Elements.RoomHandler = {}));
- })(Elements || (Elements = {}));
- class CoinPouch extends Thing {
- constructor(options) {
- super(options);
- this.coins = 0;
- this.addGetAlterations((purse) => {
- return {
- coins: purse.getCoins()
- };
- });
- this.addSetAlterations((purse, changeObj) => {
- purse.coins = (changeObj.coins);
- });
- }
- addCoins(coins) {
- this.coins += coins;
- }
- removeCoins(coins) {
- this.coins -= coins;
- }
- getCoins() {
- return this.coins;
- }
- getShiny() {
- return this.coins > 0;
- }
- }
- CoinPouch.carryOutTakingCoinPouches = new Rule({
- name: "Carry out taking coin pouches",
- firstPriority: ActionTake.defaultCarryTakingRule.firstPriority,
- priority: ActionTake.defaultCarryTakingRule.priority + 1,
- code: async (rulebook) => {
- let action = rulebook.noun;
- let actor = action.actor;
- let thing = action.getNoun(0);
- let actorPouches = Thing.CarryRelation.getRightType(actor, CoinPouch);
- if (actorPouches.length > 0) {
- let thingCoins = thing.getCoins();
- if (thingCoins > 0) {
- rulebook.skipRule(ActionTake.defaultCarryTakingRule);
- actorPouches[0].addCoins(thingCoins);
- thing.removeCoins(thing.getCoins());
- if (actor == WorldState.player) {
- action.say.add("You empty ", new SayThe(), thing, " into your ", actorPouches[0], ". Your ", actorPouches[0], " now has " + actorPouches[0].getCoins().toString() + " coins.");
- }
- else {
- action.say.add(new SayThe(), actor, " empties ", new SayThe(), thing, " into ", Say.hisHersIts(actor), actorPouches[0], ".");
- }
- }
- else {
- let myCoins = actorPouches[0].getCoins();
- actorPouches[0].removeCoins(myCoins);
- thing.addCoins(myCoins);
- if (actor == WorldState.player) {
- action.say.add("You empty your ", actorPouches[0], " into ", new SayThe(), thing, ".", Say.PARAGRAPH_BREAK);
- }
- let drop = new ActionDrop(actor, actorPouches[0]);
- await drop.execute();
- if (Thing.EnclosedRelation.getLeft(actorPouches[0]) == actor) {
- if (actor == WorldState.player) {
- action.say.add("You can't get rid of your ", actorPouches[0], "!");
- }
- return false;
- }
- }
- }
- },
- conditions: (rulebook) => {
- return (rulebook.noun.getNoun(0) instanceof CoinPouch);
- }
- });
- ActionTake.carry.addRule(CoinPouch.carryOutTakingCoinPouches);
- Say.afterPrinting.addRule(new Rule({
- name: "Include contents of Coin Pouch while Printing Visible Things in a Room",
- code: (rulebook) => {
- let say = rulebook.noun;
- let pouch = say.currentNoun;
- say.currentNounElements.push(document.createTextNode(" with " + pouch.getCoins().toString() + " coins"));
- },
- conditions: (rulebook) => {
- return Elements.RoomHandler.PrintingVisibleThingsRulebook.isRunning()
- && rulebook.noun.currentNoun instanceof CoinPouch
- && rulebook.noun.currentNoun.getCoins() > 0;
- }
- }));
- ActionExamine.carry.addRule(new Rule({
- name: "Print description of coins in Coin Pouch",
- firstPriority: ActionExamine.PrintDescriptionOfExaminedThingRule.firstPriority,
- priority: ActionExamine.PrintDescriptionOfExaminedThingRule.priority - 1,
- code: (rulebook) => {
- let action = rulebook.noun;
- let thing = action.getNoun(0);
- if (thing.getCoins() > 0) {
- action.say.add(" There are " + thing.getCoins().toString() + " coins in it.");
- }
- else {
- action.say.add(" There are no coins in it.");
- }
- },
- conditions: (rulebook) => {
- return (rulebook.noun.getNoun(0) instanceof CoinPouch);
- }
- }));
- var Elements;
- (function (Elements) {
- var InventoryHandler;
- (function (InventoryHandler) {
- var container = document.getElementById("inventoryTarget");
- function empty() {
- while (container.firstChild) {
- container.removeChild(container.firstChild);
- }
- }
- function printHeader(header) {
- let p = document.createElement("p");
- p.classList.add("inventoryHeader");
- p.appendChild(document.createTextNode(header + ":"));
- container.appendChild(p);
- }
- let currentRow;
- InventoryHandler.LinkingThing = new Rulebook("Inventory - Links for a Thing");
- function printThingLink(shortcut, action) {
- let nameLink = document.createElement("div");
- nameLink.classList.add("inventoryLink");
- nameLink.appendChild(document.createTextNode(shortcut));
- currentRow.appendChild(nameLink);
- Controls.Links.makeLink(nameLink, action);
- }
- InventoryHandler.printThingLink = printThingLink;
- async function printThing(thing) {
- currentRow = document.createElement("div");
- currentRow.classList.add("inventoryRow");
- let nameLink = document.createElement("div");
- nameLink.classList.add("inventoryLink", "name");
- nameLink.appendChild(document.createTextNode(thing.getPrintedName()));
- currentRow.appendChild(nameLink);
- Controls.Links.makeLink(nameLink, new ActionExamine(WorldState.player, thing));
- await InventoryHandler.LinkingThing.execute({ noun: thing });
- container.appendChild(currentRow);
- }
- function thingSort(a, b) {
- let na = a.getPrintedName().toLowerCase();
- let nb = b.getPrintedName().toLowerCase();
- if (na < nb)
- return -1;
- if (na > nb)
- return 1;
- return 0;
- }
- InventoryHandler.thingSort = thingSort;
- async function updateInventory() {
- let player = WorldState.player;
- empty();
- let wielded = Thing.WieldRelation.getRight(player).sort(thingSort);
- let worn = Thing.WearRelation.getRight(player).sort(thingSort);
- let carried = Thing.CarryRelation.getRight(player).sort(thingSort);
- if (wielded.length > 0) {
- printHeader("Wielded");
- for (let i = 0; i < wielded.length; i++) {
- await printThing(wielded[i]);
- }
- }
- if (worn.length > 0) {
- printHeader("Worn");
- for (let i = 0; i < worn.length; i++) {
- await printThing(worn[i]);
- }
- }
- if (carried.length > 0) {
- printHeader("Carried");
- for (let i = 0; i < carried.length; i++) {
- await printThing(carried[i]);
- }
- }
- let pouch = Thing.CarryRelation.getRightType(WorldState.player, CoinPouch);
- if (pouch.length > 0) {
- let p = document.createElement("p");
- p.classList.add("inventoryGold");
- let s;
- if (pouch[0].getCoins() > 0) {
- s = new Say("There are " + pouch[0].getCoins().toString() + " coins in your ", pouch[0], ".");
- }
- else {
- s = new Say("There are no coins in your ", pouch[0], ".");
- }
- await s.getPureElements().then(elements => {
- elements.forEach(element => {
- p.appendChild(element);
- });
- });
- container.appendChild(p);
- }
- }
- InventoryHandler.updateInventory = updateInventory;
- })(InventoryHandler = Elements.InventoryHandler || (Elements.InventoryHandler = {}));
- })(Elements || (Elements = {}));
- class ActionRetrace extends Action {
- constructor(actor, ...nouns) {
- super(actor, ...nouns);
- this.requiresNoun = false;
- this.requiresVisibility = false;
- this.requiresTurn = false;
- }
- getCommandText() {
- let name;
- if (typeof this.getNoun(0) == "number") {
- name = DirectionNames[Direction[this.getNoun(0)]];
- }
- else if (this.getNoun(0) instanceof Room) {
- name = this.getNoun(0).getPrintedName();
- }
- return "think about how to get to " + name;
- }
- }
- ActionRetrace.check = new Rulebook("Check Retracing");
- ActionRetrace.carry = new Rulebook("Carry out Retracing");
- ActionRetrace.check.addRule(new Rule({
- firstPriority: Rule.PRIORITY_HIGHEST,
- priority: Rule.PRIORITY_HIGH,
- name: "Change Room to Direction",
- code: (rulebook) => {
- let action = rulebook.noun;
- if (action.getNoun(0) instanceof Room) {
- let actor = action.actor;
- let cRoom = actor.getRoom();
- if (cRoom == undefined) {
- return false;
- }
- let dRoom = action.getNoun(0);
- if (cRoom == dRoom) {
- if (actor.isPlayer()) {
- action.say.add("You are already there!");
- }
- return false;
- }
- let code;
- if (actor == WorldState.player) {
- code = (room) => {
- return WorldState.isRoomRemembered(room);
- };
- }
- let direction = cRoom.bestDirectionTo(dRoom, code);
- if (direction == undefined) {
- if (actor.isPlayer()) {
- action.say.add("You don't remember how to get there.");
- }
- return false;
- }
- else {
- action.setNoun(0, direction);
- }
- }
- }
- }));
- ActionRetrace.carry.addRule(new Rule({
- name: "Retracing - Find Direction",
- code: (rulebook) => {
- let action = rulebook.noun;
- action.say.add("To get there, you should go " + DirectionNames[Direction[action.getNoun(0)]] + ".");
- }
- }));
- var Elements;
- (function (Elements) {
- var RememberedHandler;
- (function (RememberedHandler) {
- var mapTarget = document.getElementById("mapTarget");
- var lastMap;
- var elements;
- function empty() {
- elements = {};
- lastMap = undefined;
- while (mapTarget.firstChild) {
- mapTarget.removeChild(mapTarget.firstChild);
- }
- }
- RememberedHandler.empty = empty;
- async function updateMap() {
- console.debug(Rulebook.getIndentation() + "[MAP] Creating Map");
- let regions = Region.InRelation.getAllLeftType(WorldState.player.getRoom(), RegionRandom);
- let biggestRegion = regions[regions.length - 1];
- if (biggestRegion == undefined) {
- empty();
- return;
- }
- if (biggestRegion.map != lastMap) {
- empty();
- }
- else {
- await updateOldMap();
- return;
- }
- let map = biggestRegion.map;
- lastMap = map;
- map.updateAllLimits();
- for (let y = map.highestY; y >= map.lowestY; y--) {
- let row = document.createElement("div");
- row.classList.add("mapRow");
- for (let x = map.lowestX; x <= map.highestX; x++) {
- let room = map.getRoom(x, y);
- let roomNode = new RoomNode(room);
- await roomNode.createRoomNameFloater();
- let roomDiv = roomNode.getElement();
- row.appendChild(roomDiv);
- elements[x.toString() + ";" + y.toString()] = roomNode;
- }
- mapTarget.appendChild(row);
- }
- await updateOldMap();
- }
- RememberedHandler.updateMap = updateMap;
- async function updateOldMap() {
- let map = lastMap;
- for (let y = map.highestY; y >= map.lowestY; y--) {
- for (let x = map.lowestX; x <= map.highestX; x++) {
- await elements[x.toString() + ";" + y.toString()].update();
- }
- }
- }
- RememberedHandler.updateOldMap = updateOldMap;
- })(RememberedHandler = Elements.RememberedHandler || (Elements.RememberedHandler = {}));
- })(Elements || (Elements = {}));
- var Debug;
- (function (Debug) {
- function knowdewae() {
- let map = new MapNote({
- name: "De Wae",
- description: "This map shows de wae all de wae to Zimbabwe."
- });
- map.addRoom(...Region.RegionRoom.getAnyRightType(RoomRandom));
- WorldState.player.setCarried(map);
- }
- Debug.knowdewae = knowdewae;
- function hurt(target, amount) {
- let bp;
- if (target instanceof Person) {
- bp = target.getPart(HumanoidTorso);
- if (bp == undefined)
- return;
- }
- else if (target instanceof Bodypart) {
- bp = target;
- }
- bp.changeSoreness(amount);
- }
- Debug.hurt = hurt;
- function goTo(str) {
- }
- Debug.goTo = goTo;
- })(Debug || (Debug = {}));
- class AI {
- constructor(options) {
- this.wanderer = true;
- this.wanderChance = 50;
- this.picksShinies = true;
- this.extraRules = [];
- this.extraCombatRules = [];
- for (let key in options) {
- this[key] = options[key];
- }
- }
- async execute(actor) {
- let promise;
- if (promise != undefined) {
- promise = AI.combatRules.execute({
- noun: actor
- }, ...this.extraCombatRules);
- }
- else {
- promise = AI.rules.execute({
- noun: actor
- }, ...this.extraRules);
- }
- let result = await promise;
- return result;
- }
- addRulesBook(...books) {
- this.extraRules.push(...books);
- arrayUnique(this.extraRules);
- }
- addCombatRulesBook(...books) {
- this.extraCombatRules.push(...books);
- arrayUnique(this.extraCombatRules);
- }
- }
- AI.rules = new Rulebook("Default AI Rules");
- AI.combatRules = new Rulebook("Default AI Combat Rules");
- var AIRules;
- (function (AIRules) {
- AIRules.PRIORITY_ACTING_ON_SITUATION = 5;
- AIRules.PRIORITY_ACTING_ON_PLACE = 3;
- AIRules.PRIORITY_ACTING_ON_IDLE = 1;
- })(AIRules || (AIRules = {}));
- class PersonStat {
- constructor(id, description) {
- this.defaultValue = 0;
- this.maxValue = 10;
- this.id = id;
- this.description = description == undefined ? "Not defined" : description;
- }
- getDescription(value) {
- if (typeof this.description == "string" || this.description instanceof Say) {
- return this.description;
- }
- else {
- return this.description(value);
- }
- }
- }
- class Attribute extends PersonStat {
- constructor(id, description, defValue, maxValue) {
- super(id, description);
- this.defaultValue = 2;
- this.maxValue = 5;
- if (defValue != undefined) {
- this.defaultValue = defValue;
- }
- if (maxValue != undefined) {
- this.maxValue = maxValue;
- }
- Attribute.Attributes[id] = this;
- }
- static getAttributes() {
- let attributes = [];
- for (let key in Attribute.Attributes) {
- attributes.push(Attribute.Attributes[key]);
- }
- return attributes;
- }
- static getAttribute(id) {
- return Attribute.Attributes[id];
- }
- }
- Attribute.Attributes = {};
- var Attributes;
- (function (Attributes) {
- Attributes.Strength = new Attribute("Strength", value => {
- switch (value) {
- case 5: return "Hercules' Bigger Cousin";
- case 4: return ("Circus Strong" + (WorldState.player.isMale() ? "man" : "woman"));
- case 3: return "Beach Bully";
- case 2: return ("Average " + (WorldState.player.isMale() ? "Joe" : "Jane"));
- case 1: return "Wet Noodle";
- default: return "Out of bounds.";
- }
- });
- Attributes.Agility = new Attribute("Agility", value => {
- switch (value) {
- case 5: return "Catlike";
- case 4: return "Gymnast";
- case 3: return "Accurate";
- case 2: return "Common";
- case 1: return "Accident-prone";
- default: return "Out of bounds.";
- }
- });
- Attributes.Intelligence = new Attribute("Intelligence", value => {
- switch (value) {
- case 5: return "Genius";
- case 4: return "Gifted";
- case 3: return "Knowledgeable";
- case 2: return "Normal";
- case 1: return "Door";
- default: return "Out of bounds.";
- }
- });
- Attributes.Charm = new Attribute("Charm", value => {
- switch (value) {
- case 5: return (WorldState.player.isMale() ? "Casanova" : "Seductress");
- case 4: return "Diplomat";
- case 3: return ("Cheery Sales" + (WorldState.player.isMale() ? "man" : "woman"));
- case 2: return "Not even trying";
- case 1: return "Unpleasant";
- default: return "Out of bounds.";
- }
- });
- Attributes.Corruption = new Attribute("Corruption", value => {
- return "Not defined";
- }, 0, 100);
- Attributes.GenderIdentity = new Attribute("Gender Identity", value => {
- if (value >= 75) {
- return "You strongly feel, and act, like a woman.";
- }
- else if (value >= 60) {
- return "You feel, and act, like a woman.";
- }
- else if (value >= 40) {
- return "You don't feel nor act like any particular gender.";
- }
- else if (value >= 20) {
- return "You feel, and act, like a man.";
- }
- else {
- return "You strongly feel, and act, like a man.";
- }
- }, 50, 100);
- Attributes.Degeneration = new Attribute("Degeneration", value => {
- if (value >= 75) {
- return "Sex is about the only thing on your mind, and you don't even try to hide it anymore.";
- }
- else if (value >= 60) {
- return "Sometimes you can't hide how naughty you'd like to be.";
- }
- else if (value >= 40) {
- return "";
- }
- else if (value >= 20) {
- return "Your composure is prudish and calm.";
- }
- else {
- return "You have the composure of a saint.";
- }
- }, 30, 100);
- })(Attributes || (Attributes = {}));
- class Skill extends PersonStat {
- constructor(id, description) {
- super(id, description);
- this.defaultValue = 0;
- this.maxValue = 5;
- Skill.Skills[id] = this;
- }
- static getSkills() {
- let skills = [];
- for (let key in Skill.Skills) {
- skills.push(Skill.Skills[key]);
- }
- skills.sort((a, b) => {
- let na = a.id.toUpperCase();
- let nb = b.id.toUpperCase();
- if (na > nb)
- return 1;
- if (na < nb)
- return -1;
- return 0;
- });
- return skills;
- }
- static getSkill(id) {
- return Skill.Skills[id];
- }
- }
- Skill.Skills = {};
- var Skills;
- (function (Skills) {
- Skills.Survival = new Skill("Survival", (value) => {
- switch (value) {
- case 5: return "";
- case 4: return "";
- case 3: return "";
- case 2: return "";
- case 1: return "Alert Chihuahua";
- }
- });
- })(Skills || (Skills = {}));
- class Container extends Thing {
- put(...things) {
- }
- }
- class Corpse extends Container {
- }
- class Person extends Thing {
- constructor(options) {
- super(options);
- this.AI = new AI({});
- this.animated = true;
- this.soreness = 0;
- this.lastHealthUpdate = 0;
- this.stamina = 10;
- this.lastStaminaUpdate = 0;
- this.staminaPerTurn = 1;
- this.attributeValue = {};
- this.skillValue = {};
- this.addGetAlterations((person) => {
- if (person.isPlayer()) {
- return {
- Stats: this.attributeValue,
- Skills: this.skillValue
- };
- }
- });
- this.addSetAlterations((person, changes) => {
- if (person.isPlayer()) {
- if (changes.Stats != undefined) {
- for (let name in changes.Stats) {
- let attr = Attribute.getAttribute(name);
- if (attr != undefined) {
- this.setStat(attr, changes.Stats[name]);
- }
- }
- }
- if (changes.Skills != undefined) {
- for (let name in changes.Skills) {
- let attr = Skill.getSkill(name);
- if (attr != undefined) {
- this.setSkill(attr, changes.Skills[name]);
- }
- }
- }
- }
- });
- }
- changeHealth(n) {
- let bodyparts = this.getParts(Bodypart);
- for (let i = 0; i < bodyparts.length; i++) {
- bodyparts[i].changeSoreness(n);
- }
- this.updateHealth();
- }
- getHealthOnScale() {
- return Math.round(((this.getHealth() * 10) / (this.getStat(Attributes.Strength) * 2)));
- }
- getHealth(important) {
- if (important === true || this.lastHealthUpdate != WorldState.getCurrentTurn()) {
- this.updateHealth();
- }
- return this.soreness / (this.getStat(Attributes.Strength) * Person.STRENGTH_SORENESS_MULTIPLIER);
- }
- updateHealth() {
- let health = 0;
- let bodyparts = this.getParts(Bodypart);
- for (let i = 0; i < bodyparts.length; i++) {
- health += bodyparts[i].getWeightedSoreness();
- }
- this.soreness = health;
- this.lastHealthUpdate = WorldState.getCurrentTurn();
- }
- changeStamina(n) {
- this.updateStamina();
- this.stamina += n;
- if (this.stamina > Person.MAX_STAMINA) {
- this.stamina = Person.MAX_STAMINA;
- }
- else if (this.stamina < 0) {
- this.stamina = 0;
- }
- }
- getStaminaOnScale() {
- return Math.round(((this.stamina * 10) / Person.MAX_STAMINA));
- }
- updateStamina() {
- var nTurns = WorldState.getCurrentTurn() - this.lastStaminaUpdate;
- this.stamina += this.staminaPerTurn * nTurns;
- if (this.stamina > Person.MAX_STAMINA) {
- this.stamina = Person.MAX_STAMINA;
- }
- }
- isPlayer() {
- return this == WorldState.player;
- }
- getStat(stat) {
- if (this.attributeValue[stat.id] == undefined) {
- this.attributeValue[stat.id] = stat.defaultValue;
- }
- return this.attributeValue[stat.id];
- }
- setStat(stat, value) {
- this.attributeValue[stat.id] = value;
- }
- getSkill(stat) {
- if (this.skillValue[stat.id] == undefined) {
- this.skillValue[stat.id] = stat.defaultValue;
- }
- return this.skillValue[stat.id];
- }
- setSkill(stat, value) {
- this.skillValue[stat.id] = value;
- }
- die() {
- let corpse = new Corpse({
- name: this.name + "'s corpse",
- unique: false,
- description: new Say("The lifeless body of ", this, ". May ", new SayHeSheIt(this), " rest in peace.")
- });
- corpse.put(...Thing.CarryRelation.getRight(this));
- corpse.put(...Thing.WearRelation.getRight(this));
- this.getRoom().place(corpse);
- OutOfPlay.removeFromPlay(this);
- }
- }
- Person.MAX_STAMINA = 10;
- Person.STRENGTH_SORENESS_MULTIPLIER = 4;
- var EveryTurn;
- (function (EveryTurn_1) {
- EveryTurn_1.EveryTurn = new Rulebook("Every Turn");
- EveryTurn_1.RunAIRule = EveryTurn_1.EveryTurn.createAndAddRule({
- name: "Run NPC AI Rule",
- code: async function () {
- function isAIAvailable(person) {
- return (person != WorldState.player
- && ((person.getRoom() instanceof RoomRandom
- && person.getRoom().placed)));
- }
- let people = Thing.InsideRoomRelation.getAnyRightType(Person).filter(isAIAvailable);
- for (let i = 0; i < people.length; i++) {
- let action = await people[i].AI.execute(people[i]);
- let person = people[i];
- let visible = people[i].isVisibleTo(WorldState.player);
- if (action != undefined) {
- let printValue = await action.execute();
- if ((visible ||
- person.isVisibleTo(WorldState.player)) && printValue != undefined) {
- Elements.CurrentTurnHandler.printAsContent(printValue);
- }
- }
- }
- }
- });
- EveryTurn_1.incrementTurnCounterRule = EveryTurn_1.EveryTurn.createAndAddRule({
- firstPriority: Rule.PRIORITY_LOWEST,
- priority: Rule.PRIORITY_LOWEST,
- name: "Increment Turn Counter",
- code: function () {
- WorldState.incrementWorldTurn();
- }
- });
- })(EveryTurn || (EveryTurn = {}));
- var Direction;
- (function (Direction) {
- Direction[Direction["NORTH"] = 0] = "NORTH";
- Direction[Direction["NORTHEAST"] = 1] = "NORTHEAST";
- Direction[Direction["EAST"] = 2] = "EAST";
- Direction[Direction["SOUTHEAST"] = 3] = "SOUTHEAST";
- Direction[Direction["SOUTH"] = 4] = "SOUTH";
- Direction[Direction["SOUTHWEST"] = 5] = "SOUTHWEST";
- Direction[Direction["WEST"] = 6] = "WEST";
- Direction[Direction["NORTHWEST"] = 7] = "NORTHWEST";
- Direction[Direction["UP"] = 8] = "UP";
- Direction[Direction["DOWN"] = 9] = "DOWN";
- })(Direction || (Direction = {}));
- var DirectionNames = (() => {
- let names;
- (function (names) {
- names["NORTH"] = "North";
- names["SOUTH"] = "South";
- names["EAST"] = "East";
- names["WEST"] = "West";
- names["SOUTHEAST"] = "Southeast";
- names["NORTHWEST"] = "Northwest";
- names["SOUTHWEST"] = "Southwest";
- names["NORTHEAST"] = "Northeast";
- names["UP"] = "Down";
- names["DOWN"] = "Up";
- })(names || (names = {}));
- ;
- let obj = {};
- for (let name in names) {
- obj[name] = names[name];
- obj[Direction[name]] = names[name];
- }
- return obj;
- })();
- var OppositeDirection = (() => {
- let obj = {};
- obj[Direction.NORTH] = Direction.SOUTH;
- obj[Direction.SOUTH] = Direction.NORTH;
- obj[Direction.EAST] = Direction.WEST;
- obj[Direction.WEST] = Direction.EAST;
- obj[Direction.SOUTHEAST] = Direction.NORTHWEST;
- obj[Direction.NORTHWEST] = Direction.SOUTHEAST;
- obj[Direction.SOUTHWEST] = Direction.NORTHEAST;
- obj[Direction.NORTHEAST] = Direction.SOUTHWEST;
- obj[Direction.UP] = Direction.DOWN;
- obj[Direction.DOWN] = Direction.UP;
- for (let i = 0; i < Object.keys(Direction).length / 2; i++) {
- obj[Direction[i]] = obj[i];
- }
- return obj;
- })();
- class Room {
- constructor(id, fodder) {
- this.description = new Say();
- this.name = id == undefined ? "Room" : id;
- this.connections = new Array(Room.DIRECTIONS.length);
- this.fodder = fodder;
- if (fodder != true) {
- Room.addRoom(this);
- }
- }
- getName() {
- return this.name;
- }
- place(thing) {
- Thing.InsideRoomRelation.setRelation(this, thing);
- }
- remove(thing) {
- if (Thing.InsideRoomRelation.getLeft(thing) == this) {
- Thing.InsideRoomRelation.unsetRight(thing);
- }
- }
- getContained() {
- return Thing.InsideRoomRelation.getRight(this);
- }
- getContainedAndVisibleTo(observer) {
- let contained = this.getContained();
- let result = [];
- contained.forEach((value) => {
- if (value.visible && value !== observer) {
- result.push(value);
- }
- });
- return result;
- }
- getContainedAndVisible() {
- return this.getContainedAndVisibleTo(WorldState.player);
- }
- mapRoom(r, direction) {
- let oppositeDirection = OppositeDirection[direction];
- if (this.connections[direction] != undefined) {
- console.warn("Replacing a connected room.", this, " connected through ", direction, " to ", this.connections[direction]);
- this.connections[direction].unmapRoom(oppositeDirection);
- }
- this.connections[direction] = r;
- if (r.connections[oppositeDirection] != undefined) {
- console.warn("Replacing a connected room.", r, " connected through ", oppositeDirection, " to ", r.connections[oppositeDirection]);
- r.unmapRoom(oppositeDirection);
- }
- r.connections[oppositeDirection] = this;
- }
- unmapRoom(direction) {
- if (this.connections[direction] != undefined) {
- let r = this.connections[direction];
- this.connections[direction] = undefined;
- r.unmapRoom(OppositeDirection[direction]);
- }
- }
- getPrintedName() {
- return this.name;
- }
- getConnectedRooms() {
- let rooms = [];
- this.connections.forEach(room => {
- if (room != undefined) {
- rooms.push(room);
- }
- });
- return rooms;
- }
- bestDirectionTo(room, validityCode) {
- if (validityCode == undefined)
- validityCode = () => { return true; };
- let maxSteps = 10;
- maxSteps = maxSteps > WorldState.getMaximumRememberedRooms() ? maxSteps : WorldState.getMaximumRememberedRooms();
- let recursiveBestPath = (cPath, cRoom, destination) => {
- if (!validityCode(cRoom)) {
- return;
- }
- if (cRoom == destination) {
- maxSteps = maxSteps > cPath.length ? cPath.length : maxSteps;
- return cPath;
- }
- else if (cPath.length > maxSteps) {
- return undefined;
- }
- else {
- let paths = [];
- for (let index in Room.DIRECTIONS) {
- let direction = Room.DIRECTIONS[index];
- let nextRoom = cRoom.connections[direction];
- if (nextRoom != undefined && cPath.indexOf(nextRoom) == -1 && validityCode(nextRoom)) {
- let path = recursiveBestPath(cPath.concat([nextRoom]), nextRoom, destination);
- if (path != undefined) {
- paths.push(path);
- }
- }
- }
- let shortestIndex = 0;
- paths.forEach((value, index, array) => {
- if (value.length < paths[shortestIndex].length) {
- shortestIndex = index;
- }
- });
- return paths[shortestIndex];
- }
- };
- let paths = Array(Room.DIRECTIONS.length);
- let shortestIndex;
- for (let index in Room.DIRECTIONS) {
- let direction = Room.DIRECTIONS[index];
- let nextRoom = this.connections[direction];
- if (nextRoom != undefined) {
- paths[direction] = recursiveBestPath([this, nextRoom], nextRoom, room);
- if (paths[direction] != undefined && (shortestIndex == undefined || paths[shortestIndex].length > paths[direction].length)) {
- shortestIndex = direction;
- }
- }
- }
- return shortestIndex;
- }
- static getDirectionXYZ(direction) {
- var y = 0;
- if ([Direction.NORTH, Direction.NORTHEAST, Direction.NORTHWEST].indexOf(direction) != -1) {
- y = 1;
- }
- else if ([Direction.SOUTH, Direction.SOUTHEAST, Direction.SOUTHWEST].indexOf(direction) != -1) {
- y = -1;
- }
- var x = 0;
- if ([Direction.EAST, Direction.SOUTHEAST, Direction.NORTHEAST].indexOf(direction) != -1) {
- x = 1;
- }
- else if ([Direction.WEST, Direction.SOUTHWEST, Direction.NORTHWEST].indexOf(direction) != -1) {
- x = -1;
- }
- var z = direction == Direction.UP ? 1 :
- direction == Direction.DOWN ? -1 :
- 0;
- return [x, y, z];
- }
- static shift(coordinates, direction) {
- let coordinatesVector = Room.getDirectionXYZ(direction);
- coordinates.forEach((value, index, array) => {
- coordinatesVector[index] += coordinates[index];
- });
- return coordinatesVector;
- }
- static addRoom(room) {
- Room.rooms[room.name] = room;
- }
- static getRooms() {
- let rooms = [];
- for (let name in Room.rooms) {
- rooms.push(Room.rooms[name]);
- }
- return rooms;
- }
- static getRoom(id) {
- return Room.rooms[id];
- }
- }
- Room.DIRECTIONS = (() => {
- let directions = [];
- for (let i = 0; i < Object.keys(Direction).length / 2; i++) {
- directions.push(i);
- }
- return directions;
- })();
- Room.rooms = {};
- var OutOfPlay;
- (function (OutOfPlay) {
- OutOfPlay.Heaven = new Room("__Heaven__RIP__");
- function removeFromPlay(thing) {
- OutOfPlay.Heaven.place(thing);
- }
- OutOfPlay.removeFromPlay = removeFromPlay;
- })(OutOfPlay || (OutOfPlay = {}));
- var PlayBegins;
- (function (PlayBegins) {
- PlayBegins.rulebook = new Rulebook("Play Begins");
- PlayBegins.LOAD_FAILED = false;
- let startingRoom;
- function execute() {
- PlayBegins.rulebook.execute({});
- }
- PlayBegins.execute = execute;
- function setStartingRoom(room) {
- if (startingRoom != undefined) {
- console.warn("[InitialRoom] Multiple requests for starting room, please check.", startingRoom, room);
- }
- startingRoom = room;
- }
- PlayBegins.setStartingRoom = setStartingRoom;
- PlayBegins.PutPlayerIntoFirstRoom = PlayBegins.rulebook.createAndAddRule({
- name: "Place player into initial room",
- firstPriority: Rule.PRIORITY_HIGHEST,
- priority: Rule.PRIORITY_MEDIUM,
- code: () => {
- if (WorldState.player.getRoom() != undefined) {
- console.debug(Rulebook.getIndentation() + "[InitialRoom] Player already in a room.", WorldState.player.getRoom());
- }
- else {
- startingRoom.place(WorldState.player);
- }
- }
- });
- PlayBegins.RunEmptyTurnSequenceRule = new Rule({
- name: "Run Empty Turn Sequence Rule",
- firstPriority: Rule.PRIORITY_LOWEST,
- priority: Rule.PRIORITY_LOWEST,
- code: (rulebook2) => {
- TurnSequence.execute();
- }
- });
- PlayBegins.rulebook.addRule(PlayBegins.RunEmptyTurnSequenceRule);
- })(PlayBegins || (PlayBegins = {}));
- var MachineBegins;
- (function (MachineBegins) {
- MachineBegins.RunPlayBegins = MachineBegins.rulebook.createAndAddRule({
- firstPriority: Rule.PRIORITY_LOW,
- name: "Run Play Begins",
- code: () => {
- PlayBegins.execute();
- }
- });
- })(MachineBegins || (MachineBegins = {}));
- var Tests;
- (function (Tests) {
- Tests.MIN_DICE = 0;
- Tests.MAX_DICE = 3;
- function rollDice() {
- return Math.floor(Math.random() * (Tests.MAX_DICE - Tests.MIN_DICE)) + 1 + Tests.MIN_DICE;
- }
- Tests.rollDice = rollDice;
- function test(attr, difficulty) {
- return (attr + rollDice()) >= difficulty;
- }
- Tests.test = test;
- })(Tests || (Tests = {}));
- class MapNote extends Thing {
- constructor() {
- super(...arguments);
- this.rooms = [];
- this.regions = [];
- }
- addRoom(...rooms) {
- rooms.forEach((room) => {
- this.rooms.push(room);
- });
- }
- addRegion(...regions) {
- regions.forEach(region => {
- this.regions.push(region);
- });
- }
- contains(room) {
- if (this.rooms.indexOf(room) != -1) {
- return true;
- }
- else {
- for (var i = 0; i < this.regions.length; i++) {
- if (this.regions[i].getRooms().indexOf(room) != -1) {
- return true;
- }
- }
- }
- }
- }
- class Bodypart extends Thing {
- constructor(options) {
- super(options);
- this.sorenessWeight = 1;
- this.soreness = 0;
- this.sorenessPerTurn = 0.05;
- this.lastSorenessUpdate = 0;
- this.slots = [];
- this.visibleSlots = [];
- this.genderValue = Bodypart.GENDER_MEDIUM_ANDROGYNE;
- this.genderWeight = 1;
- this.sluttiness = 10;
- this.sluttinessWeight = Bodypart.WEIGHT_LOWEST;
- this.addGetAlterations((bp) => {
- return {
- Soreness: bp.soreness,
- GenderValue: bp.genderValue,
- Sluttiness: bp.getSluttiness()
- };
- });
- this.addSetAlterations((bp, changes) => {
- this.soreness = changes.Soreness;
- this.genderValue = changes.GenderValue;
- this.sluttiness = changes.Sluttiness;
- });
- }
- updateSoreness() {
- let cTurn = WorldState.getCurrentTurn();
- if (cTurn > this.lastSorenessUpdate) {
- if (this.soreness > 0) {
- this.soreness -= (this.sorenessPerTurn * (cTurn - this.lastSorenessUpdate));
- if (this.soreness < 0) {
- this.soreness = 0;
- }
- }
- this.lastSorenessUpdate = cTurn;
- }
- }
- changeSoreness(soreness) {
- this.updateSoreness();
- this.soreness += soreness;
- if (this.soreness < 0) {
- this.soreness = 0;
- }
- }
- getSoreness() {
- this.updateSoreness();
- return this.soreness;
- }
- getWeightedSoreness() {
- return this.getSoreness() * this.sorenessWeight;
- }
- getSorenessWeight() {
- return this.sorenessWeight;
- }
- getGenderWeight() {
- if (this.slots.length == 0) {
- return 0;
- }
- return this.genderWeight * (this.visibleSlots.length / this.slots.length);
- }
- getGenderValue() {
- return this.genderValue;
- }
- getWeightedGenderValue() {
- return this.getGenderValue() * this.getGenderWeight();
- }
- getSluttiness() {
- return this.sluttiness;
- }
- getSluttinessWeight() {
- if (this.slots.length == 0) {
- return 0;
- }
- return this.sluttinessWeight * (this.visibleSlots.length / this.slots.length);
- }
- getWeightedSluttinessValue() {
- return this.getSluttiness() * this.getSluttinessWeight();
- }
- updateVisibility() {
- this.visibleSlots = this.slots.slice(0);
- let parent = Thing.PartRelation.getLeft(this);
- if (parent != undefined) {
- let clothing = Thing.WearRelation.getRight(parent);
- for (let i = 0; i < clothing.length; i++) {
- let covering = clothing[i].getCoveringSlots();
- for (let k = 0; k < covering.length; k++) {
- let idx = this.visibleSlots.indexOf(covering[k]);
- if (idx >= 0) {
- this.visibleSlots.splice(idx, 1);
- }
- }
- if (this.visibleSlots.length == 0)
- break;
- }
- }
- }
- isUncovered() {
- this.updateVisibility();
- return this.visibleSlots.length == this.slots.length && this.slots.length > 0;
- }
- updateStatus() {
- this.updateVisibility();
- }
- static getSoreness(thing) {
- let bodyparts = Thing.PartRelation.getRightType(thing, Bodypart);
- let soreness = 0;
- bodyparts.forEach((bodypart) => {
- soreness += bodypart.getWeightedSoreness();
- });
- return soreness;
- }
- static getGenderValueOn(thing) {
- let weight = 0;
- let value = 0;
- let bodyparts = Thing.PartRelation.getRightType(thing, Bodypart);
- bodyparts.forEach((bodypart) => {
- weight += bodypart.getGenderWeight();
- value += bodypart.getWeightedGenderValue();
- });
- return {
- weight: weight,
- value: value
- };
- }
- static getSluttinessValueOn(thing) {
- let weight = 0;
- let value = 0;
- let bodyparts = Thing.PartRelation.getRightType(thing, Bodypart);
- bodyparts.forEach((bodypart) => {
- weight += bodypart.getSluttinessWeight();
- value += bodypart.getWeightedSluttinessValue();
- });
- return {
- weight: weight,
- value: value
- };
- }
- arrangeGenderValue(genderValue) {
- this.genderValue = genderValue;
- this.getPartOne().invalidateCaches();
- }
- increaseFemininity(amount) {
- let currentGV = this.getGenderValue();
- this.arrangeGenderValue(currentGV + (5 * amount));
- }
- increaseMasculinity(amount) {
- let currentGV = this.getGenderValue();
- this.arrangeGenderValue(currentGV - (5 * amount));
- }
- }
- Bodypart.WEIGHT_LOWEST = 1;
- Bodypart.WEIGHT_LOW = 3;
- Bodypart.WEIGHT_MEDIUM = 5;
- Bodypart.WEIGHT_HIGH = 7;
- Bodypart.WEIGHT_HIGHEST = 9;
- Bodypart.SLUTTINESS_LOWEST_SAINTLY = 0;
- Bodypart.SLUTTINESS_LOW_PRUDE = 25;
- Bodypart.SLUTTINESS_MEDIUM_AVERAGE = 50;
- Bodypart.SLUTTINESS_HIGH_SLUT = 75;
- Bodypart.SLUTTINESS_HIGHEST_WHORE = 100;
- Bodypart.GENDER_LOWEST_MANLIEST = 0;
- Bodypart.GENDER_LOW_MANLY = 25;
- Bodypart.GENDER_MEDIUM_ANDROGYNE = 50;
- Bodypart.GENDER_HIGH_FEMININE = 75;
- Bodypart.GENDER_HIGHEST_FEMININEST = 100;
- class SexStick extends Bodypart {
- getWide() {
- return new Measure();
- }
- getLong() {
- return new Measure();
- }
- }
- class SexHole extends Bodypart {
- }
- class Measure {
- constructor(...sides) {
- this.superscript = ["", "", "²", "³", "⁴", "⁵", "⁶", "⁷", "⁸", "⁹"];
- this.units = 1;
- sides.forEach((side) => {
- this.units *= side;
- });
- this.sides = sides.length;
- }
- getText() {
- let meters = Math.pow(this.sides, 100);
- if (this.units > meters) {
- return (+(this.units / meters).toFixed(2)).toString() + "m" + this.superscript[this.sides];
- }
- else {
- return this.units.toString() + "cm" + this.superscript[this.sides];
- }
- }
- getNumber() {
- return this.units;
- }
- getSides() {
- return this.sides;
- }
- static fromInches(inches) {
- return inches * 2.54;
- }
- static fromFeet(feet) {
- return feet * 30.48;
- }
- }
- class MeasureLiquid {
- constructor(milliliters) {
- this.units = milliliters;
- }
- getText() {
- if (this.units > 1000) {
- return (+(this.units / 1000).toFixed(2)).toString() + "L";
- }
- else {
- return this.units.toString() + "mL";
- }
- }
- static fromLiters(liters) {
- return liters * 1000;
- }
- }
- class HumanoidArms extends Bodypart {
- constructor() {
- super(...arguments);
- this.sorenessWeight = Bodypart.WEIGHT_LOW;
- this.genderWeight = Bodypart.WEIGHT_MEDIUM;
- this.slots = [Humanoid.SLOT_ARMS];
- }
- get sluttinessWeight() {
- if (this.getPartOne().isMale()) {
- return Bodypart.WEIGHT_HIGHEST;
- }
- else {
- return Bodypart.WEIGHT_MEDIUM;
- }
- }
- set sluttinessWeight(val) { }
- getSluttiness() {
- if (this.getPartOne().isMale()) {
- return this.getGenderValue();
- }
- else {
- return 100 - this.getGenderValue();
- }
- }
- getDescription() {
- let humanoid = this.getPartOne();
- let str = humanoid.getStat(Attributes.Strength);
- if (str > 4) {
- return "Your arms and legs are ridiculously huge, showing off just how strong you are.";
- }
- else if (str > 2) {
- return "Your arms and legs are pretty big because of your muscles.";
- }
- else if (str == 2) {
- return "";
- }
- else {
- return "You look like you don't even lift.";
- }
- }
- getGenderValue() {
- let humanoid = this.getPartOne();
- let str = humanoid.getStat(Attributes.Strength);
- return 20 * str;
- }
- }
- class HumanoidBreasts extends Bodypart {
- constructor(options) {
- super(options);
- this.size = 0;
- this.silicone = 0;
- this.milk = 0;
- this.sorenessWeight = Bodypart.WEIGHT_MEDIUM;
- this.genderWeight = Bodypart.WEIGHT_HIGH;
- this.slots = [Humanoid.SLOT_BREASTS];
- this.sluttiness = Bodypart.SLUTTINESS_HIGH_SLUT;
- this.sluttinessWeight = Bodypart.WEIGHT_MEDIUM;
- this.addGetAlterations((thing) => {
- return {
- Size: this.size,
- Silicone: this.silicone,
- Milk: this.milk
- };
- });
- this.addSetAlterations((thing, changes) => {
- this.size = changes.Size;
- this.silicone = changes.Silicone;
- this.milk = changes.Milk;
- });
- }
- getSize() {
- return this.size + this.silicone + this.milk;
- }
- getSizeText() {
- return HumanoidBreasts.getSizeText(this.getSize());
- }
- static getSizeText(size) {
- let names = ["flat", "AA-cup", "A-cup", "B-cup", "C-cup", "D-cup", "E-cup", "F-cup", "G-cup", "H-cup"];
- if (size >= names.length) {
- return "HUGE";
- }
- else {
- return names[size];
- }
- }
- getGenderValue() {
- return HumanoidBreasts.getGenderFromSize(this.getSize());
- }
- getSluttiness() {
- return this.getGenderValue();
- }
- static getGenderFromSize(size) {
- if (size <= 0) {
- return 20;
- }
- else if (size <= 3) {
- return 20 * size;
- }
- else {
- return 80;
- }
- }
- arrangeGenderValue(gv) {
- if (gv <= 20) {
- this.size = 0;
- this.silicone = 0;
- this.milk = 0;
- }
- else if (gv < 80) {
- this.size = Math.round(gv / 20);
- }
- else {
- this.size = 4;
- }
- }
- }
- class HumanoidButt extends Bodypart {
- constructor(options) {
- super(options);
- this.size = 0;
- this.silicone = 0;
- this.sorenessWeight = Bodypart.WEIGHT_MEDIUM;
- this.genderWeight = Bodypart.WEIGHT_MEDIUM;
- this.slots = [Humanoid.SLOT_BUTT];
- this.sluttiness = Bodypart.SLUTTINESS_HIGH_SLUT;
- this.sluttinessWeight = Bodypart.WEIGHT_MEDIUM;
- this.addGetAlterations((thing) => {
- return {
- Size: this.size,
- Silicone: this.silicone
- };
- });
- this.addSetAlterations((thing, changes) => {
- this.size = changes.Size;
- this.silicone = changes.Silicone;
- });
- }
- getSluttiness() {
- return this.getSize() * 33;
- }
- getSize() {
- return this.size + this.silicone;
- }
- getSizeText() {
- return HumanoidButt.getSizeText(this.getSize());
- }
- static getSizeText(size) {
- let names = ["flat", "tiny", "round", "plump"];
- if (size >= names.length) {
- return "gargantuan";
- }
- else {
- return names[size];
- }
- }
- getGenderValue() {
- return HumanoidBreasts.getGenderFromSize(this.getSize());
- }
- static getGenderFromSize(size) {
- if (size <= 0) {
- return 20;
- }
- else if (size <= 2) {
- return 30 * size;
- }
- else {
- return 80;
- }
- }
- arrangeGenderValue(gv) {
- if (gv <= 20) {
- this.size = 0;
- }
- else if (gv <= 60) {
- this.size = 1;
- }
- else {
- this.size = 3;
- }
- }
- }
- class HumanoidExtremity extends Bodypart {
- constructor(options) {
- super(options);
- this.nailsPainted = false;
- this.nailColor = 0;
- this.addGetAlterations((thing) => {
- return {
- Painted: this.nailsPainted,
- Color: this.nailColor
- };
- });
- this.addSetAlterations((thing, changes) => {
- this.nailsPainted = changes.Painted;
- this.nailColor = changes.Color;
- });
- }
- static getColor(index) {
- return HumanoidExtremity.nailColorNames[index];
- }
- getSluttiness() {
- return this.getGenderValue();
- }
- getGenderValue() {
- let nailPaintedCorrection = this.nailColor * 50;
- let nailPaintedCorrectionWeight = this.nailsPainted ? 3 : 0;
- let gv = this.genderValue;
- let gw = this.genderWeight;
- return ((gv * gw) + (nailPaintedCorrection * nailPaintedCorrectionWeight)) / (gw + nailPaintedCorrectionWeight);
- }
- arrangeGenderValue(gv) {
- this.genderValue = gv;
- this.nailsPainted = gv > 60;
- if (this.nailsPainted) {
- if (gv > 70) {
- this.nailColor = 2;
- }
- else {
- this.nailColor = 1;
- }
- }
- this.getPartOne().invalidateCaches();
- }
- }
- HumanoidExtremity.nailColorNames = ['none', 'red', 'pink'];
- class HumanoidFeet extends HumanoidExtremity {
- constructor() {
- super(...arguments);
- this.sorenessWeight = Bodypart.WEIGHT_LOW;
- this.genderWeight = Bodypart.WEIGHT_LOW;
- this.slots = [Humanoid.SLOT_FEET];
- }
- getDescription() {
- let say = new Say();
- if (this.genderValue > 55) {
- say.add("Your feet are small and cute.");
- }
- else if (this.genderValue < 45) {
- say.add("Your feet are big and mannish.");
- }
- if (this.nailsPainted) {
- say.add(" Your toenails are painted " + HumanoidExtremity.getColor(this.nailColor) + ".");
- }
- return say;
- }
- }
- class HumanoidHands extends HumanoidExtremity {
- constructor() {
- super(...arguments);
- this.sorenessWeight = Bodypart.WEIGHT_LOW;
- this.genderWeight = Bodypart.WEIGHT_MEDIUM;
- this.slots = [Humanoid.SLOT_HANDS];
- }
- getDescription() {
- let say = new Say();
- if (this.genderValue > 55) {
- say.add("Your hands are delicate and slender.");
- }
- else if (this.genderValue < 45) {
- say.add("Your hands are rough and large.");
- }
- if (this.nailsPainted) {
- say.add(" Your toenails are painted " + HumanoidExtremity.getColor(this.nailColor) + ".");
- }
- return say;
- }
- }
- class HumanoidHead extends Bodypart {
- constructor() {
- super(...arguments);
- this.sorenessWeight = Bodypart.WEIGHT_MEDIUM;
- this.genderWeight = Bodypart.WEIGHT_LOW;
- this.slots = [Humanoid.SLOT_HEADGEAR, Humanoid.SLOT_HAIR, Humanoid.SLOT_EARS, Humanoid.SLOT_FACE, Humanoid.SLOT_EYES, , Humanoid.SLOT_NOSE, Humanoid.SLOT_MOUTH];
- }
- }
- class HumanoidPenis extends SexStick {
- constructor(options) {
- super(options);
- this.sorenessWeight = Bodypart.WEIGHT_HIGH;
- this.genderValue = 25;
- this.genderWeight = Bodypart.WEIGHT_HIGHEST;
- this.slots = [Humanoid.SLOT_CROTCH_FRONT];
- this.sluttiness = Bodypart.SLUTTINESS_HIGH_SLUT;
- this.sluttinessWeight = Bodypart.WEIGHT_MEDIUM;
- this.flaccidSize = new Measure(6);
- this.flaccidWidth = new Measure(3);
- this.erectSize = new Measure(15);
- this.erectWidth = new Measure(6);
- this.arousalMinimum = 5;
- this.arousalErect = 25;
- if (Math.random() >= 0.5) {
- this.flaccidMult = 0.33;
- }
- else {
- this.flaccidMult = 0.77;
- }
- this.addGetAlterations((thing) => {
- return {
- FSize: this.flaccidSize.getNumber(),
- FWidth: this.flaccidWidth.getNumber(),
- ESize: this.erectSize.getNumber(),
- EWidth: this.erectWidth.getNumber(),
- AMin: this.arousalMinimum,
- AErect: this.arousalErect,
- FMult: this.flaccidMult
- };
- });
- this.addSetAlterations((thing, changes) => {
- this.flaccidSize = new Measure(changes.FSize);
- this.flaccidWidth = new Measure(changes.FWidth);
- this.erectSize = new Measure(changes.ESize);
- this.erectWidth = new Measure(changes.EWidth);
- this.arousalMinimum = changes.AMin;
- this.arousalErect = changes.AErect;
- this.flaccidMult = changes.FMult;
- });
- }
- getSluttiness() {
- return this.getBulgeSize() * 3;
- }
- isGrower() {
- return this.flaccidMult < 0.5;
- }
- getActualSize() {
- let min = this.flaccidSize.getNumber();
- let max = this.erectSize.getNumber();
- let variableSize = (max - min);
- let finalSize = min + (variableSize * this.getArousalPerc());
- return finalSize;
- }
- isBig() {
- return this.getBulgeSize() > 22;
- }
- getArousalPerc() {
- let arousal = 0;
- let numSteps = this.arousalErect - this.arousalMinimum;
- let arousalPerc = (arousal - this.arousalMinimum) / numSteps;
- arousalPerc = arousalPerc < 0 ? 0 :
- arousalPerc > 1 ? 1 :
- arousalPerc;
- return arousalPerc;
- }
- isFlaccid() {
- return this.getArousalPerc() < 0.6;
- }
- isErect() {
- return !this.isFlaccid();
- }
- getActualWidth() {
- let min = this.flaccidWidth.getNumber();
- let max = this.erectWidth.getNumber();
- let variableSize = (max - min);
- let numSteps = this.arousalErect - this.arousalMinimum;
- let arousal = 0;
- let arousalPerc = (arousal - this.arousalMinimum) / numSteps;
- arousalPerc = arousalPerc < 0 ? 0 :
- arousalPerc > 1 ? 1 :
- arousalPerc;
- let finalSize = min + (variableSize * arousalPerc);
- return finalSize;
- }
- getLong() {
- return new Measure(this.getActualSize());
- }
- getWide() {
- return new Measure(this.getActualWidth());
- }
- getBulgeSize() {
- return this.getActualSize() + (3 * this.getActualWidth());
- }
- getSizeText() {
- return HumanoidPenis.getSizeText(this.getBulgeSize());
- }
- static getSizeText(size) {
- let sizeTable = [
- [0, "nonexistent"],
- [1, "tiny"],
- [20, "small"],
- [23, "medium"],
- [27, "big"],
- [32, "huge"],
- [36, "monstrous"]
- ];
- let i;
- for (i = 1; i < sizeTable.length && sizeTable[i][0] < size; i++) { }
- return sizeTable[i - 1][1];
- }
- getGenderValue() {
- let sizeTable = [
- [10, 60],
- [20, 45],
- [23, 35],
- [27, 28],
- [32, 24],
- [36, 18]
- ];
- let i;
- for (i = 1; i < sizeTable.length && sizeTable[i][0] < this.getActualSize(); i++) { }
- return sizeTable[i - 1][1];
- }
- arrangeGenderValue(gv) {
- let sizeTable = [
- [60, 3, 2],
- [45, 10, 3],
- [35, 14, 3],
- [28, 17, 3],
- [24, 19, 4],
- [18, 22, 4.5]
- ];
- let i;
- for (i = 1; i < sizeTable.length && sizeTable[i][0] > gv; i++) { }
- this.flaccidSize = new Measure(this.flaccidMult * sizeTable[i - 1][1]);
- this.flaccidWidth = new Measure(this.flaccidMult * sizeTable[i - 1][2]);
- this.erectSize = new Measure(sizeTable[i - 1][1]);
- this.erectWidth = new Measure(sizeTable[i - 1][2]);
- this.getPartOne().invalidateCaches();
- }
- static getSynonym() {
- let cockNames = [
- "cock",
- "dick"
- ];
- return (new OneOf(OneOf.PURELY_AT_RANDOM, ...cockNames).getOne());
- }
- }
- class HumanoidSkin extends Bodypart {
- constructor(options) {
- super(options);
- this.sorenessWeight = 0;
- this.genderWeight = Bodypart.WEIGHT_MEDIUM;
- this.slots = [
- Humanoid.SLOT_FACE, Humanoid.SLOT_NECK, Humanoid.SLOT_SHOULDERS,
- Humanoid.SLOT_ARMS, Humanoid.SLOT_HANDS, Humanoid.SLOT_UPPER_CHEST,
- Humanoid.SLOT_MIDRIFF, Humanoid.SLOT_WAIST, Humanoid.SLOT_BACK,
- Humanoid.SLOT_HIPS, Humanoid.SLOT_BUTT, Humanoid.SLOT_LEG_UPPER,
- Humanoid.SLOT_LEG_LOWER
- ];
- this.skinSoftness = 5;
- this.skinHairiness = 2;
- this.addGetAlterations((thing) => {
- return {
- Softness: this.skinSoftness,
- Hairiness: this.skinHairiness
- };
- });
- this.addSetAlterations((thing, changes) => {
- this.skinSoftness = changes.Softness;
- this.skinHairiness = changes.Hairiness;
- });
- }
- getSluttiness() {
- return this.getGenderValue();
- }
- getDescription() {
- let owner = this.getPartOne();
- let green = (owner.getStat(Attributes.Corruption) > 50);
- let say = new Say("Your skin is ");
- if (this.skinSoftness > 7) {
- say.add("perfectly smooth");
- }
- else if (this.skinSoftness > 4) {
- say.add("smooth");
- }
- else {
- say.add("rough");
- }
- say.add(" and ");
- if (this.skinHairiness > 8) {
- say.add("hairy, like a gorilla's");
- }
- else if (this.skinHairiness > 6) {
- say.add("hairy");
- }
- else if (this.skinHairiness > 3) {
- say.add("somewhat hairless");
- }
- else {
- say.add("completely hairless");
- }
- say.add(".");
- if (green) {
- say.add(" The taint of your corruption has turned your skin green, like an orc's.");
- }
- return say;
- }
- getGenderValue() {
- let softnessRank = this.skinSoftness * 100;
- let hairinessRank = 1000 - (this.skinHairiness * 100);
- return (softnessRank + hairinessRank) / 20;
- }
- arrangeGenderValue(genderValue) {
- let ideal = genderValue / 10;
- this.skinHairiness = 10 - Math.round(ideal);
- this.skinSoftness = Math.round(ideal);
- this.getPartOne().invalidateCaches();
- }
- }
- class HumanoidTesticles extends Bodypart {
- constructor(options) {
- super(options);
- this.size = 1;
- this.sorenessWeight = Bodypart.WEIGHT_HIGH;
- this.genderWeight = Bodypart.WEIGHT_HIGHEST;
- this.slots = [Humanoid.SLOT_CROTCH_FRONT];
- this.sluttiness = Bodypart.SLUTTINESS_MEDIUM_AVERAGE;
- this.sluttinessWeight = Bodypart.WEIGHT_MEDIUM;
- this.addGetAlterations((thing) => {
- return {
- Size: this.size
- };
- });
- this.addSetAlterations((thing, changes) => {
- this.size = changes.Size;
- });
- }
- getBulgeSize() {
- return this.size;
- }
- getGenderWeight() {
- return 80;
- }
- }
- class HumanoidVagina extends SexHole {
- constructor() {
- super(...arguments);
- this.genderValue = 85;
- this.genderWeight = Bodypart.WEIGHT_HIGHEST;
- this.slots = [Humanoid.SLOT_CROTCH_FRONT];
- this.sluttiness = 50;
- this.sluttinessWeight = Bodypart.WEIGHT_MEDIUM;
- }
- getSluttiness() {
- let slut = 100 - this.genderValue;
- let obscenelyOpen = false;
- slut += obscenelyOpen ? 25 : 0;
- return slut;
- }
- getDescription() {
- let say = new Say("Your ");
- let hairless = this.genderValue >= 80;
- let smallClit = this.genderValue >= 55;
- let innie = this.genderValue > 70;
- let obscenelyOpen = false;
- if (hairless) {
- say.add("hairless ", Say.PUSSY);
- }
- else {
- say.add("hairy ", Say.PUSSY);
- }
- say.add(" ");
- if (innie) {
- say.add("is usually completely covered by its lips");
- }
- else {
- say.add("has some curtains escaping its lips");
- }
- if (!smallClit) {
- say.add(" and has an oversized clit");
- }
- say.add(".");
- if (obscenelyOpen) {
- say.add(" It is currently stretched open obscenely.");
- }
- return say;
- }
- arrangeGenderValue(gv) {
- gv = (gv / 2) + 50;
- this.genderValue = gv;
- this.getPartOne().invalidateCaches();
- return;
- }
- static getSynonym() {
- let cockNames = [
- "pussy",
- "womanhood"
- ];
- return (new OneOf(OneOf.PURELY_AT_RANDOM, ...cockNames).getOne());
- }
- }
- class HumanoidTorso extends Bodypart {
- constructor() {
- super(...arguments);
- this.genderWeight = 0;
- this.sluttinessWeight = 0;
- }
- }
- class Clothing extends Thing {
- constructor() {
- super(...arguments);
- this.slots = [];
- this.transparentSlots = [];
- this.layer = Clothing.LAYER_MEDIUM;
- this.isVisible = false;
- this.visibleOn = [];
- this.breastPadding = 0;
- this.maxBreastSize = -1;
- this.tightBreastSize = -1;
- this.looseBreastSize = 0;
- this.crotchPadding = 0;
- this.maxCrotchSize = -1;
- this.tightCrotchSize = -1;
- this.looseCrotchSize = 0;
- this.buttPadding = 0;
- this.maxButtSize = -1;
- this.tightButtSize = -1;
- this.looseButtSize = 0;
- this.genderValue = 50;
- this.sluttinessValue = 40;
- }
- updateStatus() {
- this.visibleOn = [];
- this.visibleOn.push(...this.slots);
- let wearer = Thing.WearRelation.getLeft(this);
- if (wearer == undefined)
- return;
- let cloths = Thing.WearRelation.getRight(wearer);
- let coveredSlots = [];
- for (let i = 0; i < cloths.length; i++) {
- let worn = cloths[i];
- if ((worn != this) && worn.layer > this.layer) {
- coveredSlots.push(...worn.getCoveringSlots());
- }
- }
- this.visibleOn = this.visibleOn.filter(visible => {
- return coveredSlots.indexOf(visible) == -1;
- });
- this.isVisible = this.visibleOn.length > 0;
- }
- getCoveringSlots() {
- if (this.transparentSlots.length == 0) {
- return this.slots.slice(0);
- }
- return this.slots.filter((value, index, array) => {
- return this.transparentSlots.indexOf(value) == -1;
- });
- }
- getGenderWeight() {
- return this.visibleOn.length;
- }
- getGenderValue() {
- return this.genderValue;
- }
- getSluttinessWeight() {
- return this.visibleOn.length;
- }
- getSluttinessValue() {
- return this.sluttinessValue;
- }
- static getGenderValueOn(p) {
- let weight = 0;
- let value = 0;
- let clothes = Thing.WearRelation.getRight(p);
- for (let i = 0; i < clothes.length; i++) {
- weight += clothes[i].getGenderWeight();
- value += clothes[i].getGenderWeight() * clothes[i].getGenderValue();
- }
- return {
- weight: weight,
- value: value
- };
- }
- static getSluttinessValueOn(p) {
- let weight = 0;
- let value = 0;
- let clothes = Thing.WearRelation.getRight(p);
- for (let i = 0; i < clothes.length; i++) {
- weight += clothes[i].getSluttinessWeight();
- value += clothes[i].getSluttinessWeight() * clothes[i].getSluttinessValue();
- }
- return {
- weight: weight,
- value: value
- };
- }
- }
- Clothing.LAYER_LOWEST = 0;
- Clothing.LAYER_LOW = 5;
- Clothing.LAYER_MEDIUM = 10;
- Clothing.LAYER_HIGH = 15;
- Clothing.LAYER_HIGHEST = 20;
- class ActionRemove extends Action {
- getCommandText() {
- return "take off " + (this.getNoun(0) != undefined ? this.getNoun(0).getPrintedName() : "");
- }
- getClothing() {
- return this.getNoun(0);
- }
- }
- ActionRemove.check = new Rulebook("Check Removing");
- ActionRemove.carry = new Rulebook("Carry out Removing");
- ActionRemove.checkIsWearable = ActionRemove.check.createAndAddRule({
- name: "Is noun a clothing",
- firstPriority: Rule.PRIORITY_HIGHEST,
- code: (runner) => {
- let action = runner.noun;
- let noun = action.getClothing();
- if (!(noun instanceof Clothing)) {
- if (action.actor == WorldState.player) {
- action.say.add("You can only remove Clothing.");
- }
- return false;
- }
- }
- });
- ActionRemove.checkIsHeld = ActionRemove.check.createAndAddRule({
- name: "Is noun worn",
- firstPriority: Rule.PRIORITY_HIGH,
- code: async (runner) => {
- let action = runner.noun;
- let noun = action.getClothing();
- if (!Thing.WearRelation.isRight(action.actor, noun)) {
- if (action.actor == WorldState.player) {
- action.say.add("You are not wearing it.");
- }
- return false;
- }
- }
- });
- ActionRemove.carryDefault = ActionRemove.carry.createAndAddRule({
- name: "Set Clothing as Carried",
- firstPriority: Rule.PRIORITY_MEDIUM,
- code: (runner) => {
- let action = runner.noun;
- let noun = action.getClothing();
- Thing.CarryRelation.setRelation(action.actor, noun);
- let actor = action.actor;
- let thing = action.getNoun(0);
- if (actor == WorldState.player) {
- action.say.add(new SayBold(thing, ": "), "Removed.");
- }
- else {
- action.say.add(new SayThe(), actor, " takes off ", new SayThe(), thing, ".");
- }
- }
- });
- Elements.HyperlinkHandler.HyperlinkingRulebook.addRule(new Rule({
- name: "Hyperlink - Remove",
- firstPriority: Rule.PRIORITY_HIGHEST,
- code: (rulebook) => {
- let thing = rulebook.noun;
- if (thing instanceof Clothing && (Thing.WearRelation.isRight(WorldState.player, thing))) {
- Elements.HyperlinkHandler.addAvailableAction("Remove", new ActionRemove(WorldState.player, thing));
- }
- }
- }));
- Elements.InventoryHandler.LinkingThing.addRule(new Rule({
- name: "Inventory - Remove",
- firstPriority: Rule.PRIORITY_LOWEST,
- code: (rulebook) => {
- let thing = rulebook.noun;
- if (thing instanceof Clothing && (Thing.WearRelation.isRight(WorldState.player, thing))) {
- Elements.InventoryHandler.printThingLink("R", new ActionRemove(WorldState.player, thing));
- }
- }
- }));
- class ActionWear extends Action {
- getCommandText() {
- return "wear " + (this.getNoun(0) != undefined ? this.getNoun(0).getPrintedName() : "");
- }
- getClothing() {
- return this.getNoun(0);
- }
- }
- ActionWear.check = new Rulebook("Check Wearing");
- ActionWear.carry = new Rulebook("Carry out Wearing");
- ActionWear.checkIsWearable = ActionWear.check.createAndAddRule({
- name: "Is noun a clothing",
- firstPriority: Rule.PRIORITY_HIGHEST,
- code: (runner) => {
- let action = runner.noun;
- let noun = action.getClothing();
- if (!(noun instanceof Clothing)) {
- if (action.actor == WorldState.player) {
- action.say.add("You can only wear Clothing.");
- }
- return false;
- }
- }
- });
- ActionWear.checkIsHeld = ActionWear.check.createAndAddRule({
- name: "Is noun held",
- firstPriority: Rule.PRIORITY_HIGH,
- code: async (runner) => {
- let action = runner.noun;
- let noun = action.getClothing();
- if (!Thing.CarryRelation.isRight(action.actor, noun)) {
- if (action.actor == WorldState.player) {
- action.say.add("(first taking the ", noun, ")", Say.LINE_BREAK);
- }
- let takingAction = new ActionTake(action.actor, noun);
- await takingAction.execute();
- action.say.add(takingAction.say);
- if (!Thing.CarryRelation.isRight(action.actor, noun)) {
- return false;
- }
- }
- }
- });
- ActionWear.carryDefault = ActionWear.carry.createAndAddRule({
- name: "Set Clothing as Worn",
- firstPriority: Rule.PRIORITY_MEDIUM,
- code: (runner) => {
- let action = runner.noun;
- let noun = action.getClothing();
- Thing.WearRelation.setRelation(action.actor, noun);
- let actor = action.actor;
- let thing = action.getNoun(0);
- if (actor == WorldState.player) {
- action.say.add(new SayBold(thing, ": "), "Worn.");
- }
- else {
- action.say.add(new SayThe(), actor, " puts on ", new SayThe(), thing, ".");
- }
- }
- });
- Elements.HyperlinkHandler.HyperlinkingRulebook.addRule(new Rule({
- name: "Hyperlink - Wear",
- firstPriority: Rule.PRIORITY_HIGHEST,
- code: (rulebook) => {
- let thing = rulebook.noun;
- if (thing instanceof Clothing && !(Thing.WearRelation.isRight(WorldState.player, thing))) {
- Elements.HyperlinkHandler.addAvailableAction("Wear", new ActionWear(WorldState.player, thing));
- }
- }
- }));
- Elements.InventoryHandler.LinkingThing.addRule(new Rule({
- name: "Inventory - Wear",
- firstPriority: Rule.PRIORITY_LOWEST,
- code: (rulebook) => {
- let thing = rulebook.noun;
- if (thing instanceof Clothing && !(Thing.WearRelation.isRight(WorldState.player, thing))) {
- Elements.InventoryHandler.printThingLink("W", new ActionWear(WorldState.player, thing));
- }
- }
- }));
- class Humanoid extends Person {
- constructor(options) {
- super(options);
- this.breastVisibleSize = 0;
- this.isBreastVisible = false;
- this.isBreastTight = false;
- this.isBreastLoose = false;
- this.crotchVisibleSize = 0;
- this.isCrotchVisible = false;
- this.isCrotchTight = false;
- this.buttVisibleSize = 0;
- this.isButtVisible = false;
- this.isButtTight = false;
- this.isGenderCached = false;
- this.isSluttinessCached = false;
- this.uncoveredSlots = [];
- this.addParts(new HumanoidSkin(), new HumanoidHead(), new HumanoidArms(), new HumanoidHands(), new HumanoidBreasts(), new HumanoidFeet(), new HumanoidTorso(), new HumanoidButt());
- if (options.isMale) {
- this.addMaleParts();
- this.setGenderValue(25);
- }
- else {
- this.addFemaleParts();
- this.setGenderValue(75);
- }
- this.addGetAlterations((humanoid) => {
- if (humanoid.isPlayer()) {
- return {
- HumanoidGender: humanoid.isMale() ? Humanoid.SEX_MALE :
- humanoid.isFemale() ? Humanoid.SEX_FEMALE :
- Humanoid.SEX_HERM
- };
- }
- });
- this.addSetAlterations((humanoid, changes) => {
- if (humanoid.isPlayer()) {
- humanoid.removeGenderedParts();
- if (changes.HumanoidGender == Humanoid.SEX_MALE) {
- humanoid.addMaleParts();
- }
- else if (changes.HumanoidGender == Humanoid.SEX_FEMALE) {
- humanoid.addFemaleParts();
- }
- else {
- humanoid.addMaleParts();
- humanoid.addFemaleParts();
- }
- }
- });
- }
- invalidateCaches() {
- this.isGenderCached = false;
- this.isSluttinessCached = false;
- }
- getGenderValue() {
- if (!this.isSluttinessCached) {
- this.updateCaches();
- }
- return this.cachedGenderValue;
- }
- getSluttiness() {
- if (!this.isSluttinessCached) {
- this.updateCaches();
- }
- return this.cachedSluttiness;
- }
- getBulges() {
- if (!this.isGenderCached) {
- this.updateCaches();
- }
- return this.cachedBulges;
- }
- updateCaches() {
- this.updateClothing();
- this.updateSlots();
- this.updateBodyparts();
- this.updateBulges();
- this.updateGenderValue();
- this.updateSluttiness();
- }
- updateSlots() {
- this.uncoveredSlots = [];
- for (let i = 0; i < Humanoid.SLOT_SLOT_COUNT; i++) {
- this.uncoveredSlots.push(i);
- }
- let clothing = Thing.WearRelation.getRightType(this, Clothing);
- for (let i = 0; i < clothing.length; i++) {
- let covering = clothing[i].getCoveringSlots();
- for (let k = 0; k < covering.length; k++) {
- let idx = this.uncoveredSlots.indexOf(covering[k]);
- if (idx >= 0) {
- this.uncoveredSlots.splice(idx, 1);
- }
- }
- if (this.uncoveredSlots.length == 0)
- break;
- }
- }
- updateGenderValue() {
- let clothingGender = Clothing.getGenderValueOn(this);
- let bodypartGender = Bodypart.getGenderValueOn(this);
- let genderWeight = clothingGender.weight + bodypartGender.weight;
- let genderValue = clothingGender.value + bodypartGender.value;
- let correctionWeight = Bodypart.WEIGHT_HIGHEST;
- let correctionValue = this.getStat(Attributes.GenderIdentity) * Bodypart.WEIGHT_HIGHEST;
- let hasPenis = false;
- let hasVagina = false;
- if (this.isCrotchVisible) {
- if (Thing.PartRelation.getRightTypeOne(this, HumanoidPenis) != undefined) {
- hasPenis = true;
- hasVagina = false;
- correctionValue += 0 * Bodypart.WEIGHT_LOWEST;
- correctionWeight += Bodypart.WEIGHT_LOWEST;
- }
- else if (Thing.PartRelation.getRightTypeOne(this, HumanoidVagina) != undefined) {
- hasPenis = false;
- hasVagina = true;
- correctionValue += 100 * Bodypart.WEIGHT_LOWEST;
- correctionWeight += Bodypart.WEIGHT_LOWEST;
- }
- }
- if (this.breastVisibleSize > 0) {
- correctionValue += 100 * Bodypart.WEIGHT_LOWEST;
- correctionWeight += Bodypart.WEIGHT_LOWEST;
- }
- if (this.crotchVisibleSize > 0 && !hasVagina) {
- correctionValue += 0 * Bodypart.WEIGHT_LOWEST;
- correctionWeight += Bodypart.WEIGHT_LOWEST;
- }
- let genderValueFinal = genderValue / genderWeight;
- let genderValueCorrected = (genderValue + correctionValue) / (genderWeight + correctionWeight);
- this.cachedGenderValue = {
- hasTits: this.breastVisibleSize > 1,
- hasPenisBulge: this.crotchVisibleSize > 0 && !hasVagina,
- hasPenis: hasPenis,
- hasVagina: hasVagina,
- genderValue: genderValueFinal,
- genderValueCorrected: genderValueCorrected
- };
- this.isGenderCached = true;
- }
- isVisibleOn(slot) {
- return this.uncoveredSlots.indexOf(slot) != -1;
- }
- updateSluttiness() {
- let clothingSluttiness = Clothing.getSluttinessValueOn(this);
- let bodypartSluttiness = Bodypart.getSluttinessValueOn(this);
- let sluttinessWeight = clothingSluttiness.weight + bodypartSluttiness.weight;
- let sluttinessValue = clothingSluttiness.value + bodypartSluttiness.value;
- let correctionWeight = 0;
- let correctionValue = 0;
- let somewhatSlutty = [Humanoid.SLOT_MIDRIFF, Humanoid.SLOT_LEG_UPPER, Humanoid.SLOT_WAIST, Humanoid.SLOT_HIPS, Humanoid.SLOT_BACK];
- for (let i = 0; i < somewhatSlutty.length; i++) {
- if (this.isVisibleOn(somewhatSlutty[i])) {
- correctionWeight += 1;
- correctionValue += 75;
- }
- }
- let verySlutty = [Humanoid.SLOT_BREASTS, Humanoid.SLOT_CROTCH_FRONT, Humanoid.SLOT_CROTCH_BACK, Humanoid.SLOT_BUTT];
- for (let i = 0; i < verySlutty.length; i++) {
- if (this.isVisibleOn(verySlutty[i])) {
- correctionWeight += 3;
- correctionValue += 75;
- }
- }
- if ((this.isVisibleOn.length / Humanoid.SLOT_SLOT_COUNT) > 0.75) {
- let extremeSlutty = [Humanoid.SLOT_BREASTS, Humanoid.SLOT_CROTCH_FRONT, Humanoid.SLOT_CROTCH_BACK, Humanoid.SLOT_BUTT];
- for (let i = 0; i < extremeSlutty.length; i++) {
- if (this.isVisibleOn(extremeSlutty[i])) {
- correctionWeight += 5;
- correctionValue += 85;
- }
- }
- }
- let halfNaked;
- let naked;
- if (!this.isMale()) {
- halfNaked = (this.isVisibleOn.length / Humanoid.SLOT_SLOT_COUNT) < 0.5 &&
- !this.isVisibleOnArray([Humanoid.SLOT_BREASTS, Humanoid.SLOT_CROTCH_FRONT, Humanoid.SLOT_CROTCH_BACK]);
- naked = (this.isVisibleOn.length / Humanoid.SLOT_SLOT_COUNT) < 0.3 &&
- this.isVisibleOnArray([Humanoid.SLOT_BREASTS, Humanoid.SLOT_CROTCH_FRONT, Humanoid.SLOT_CROTCH_BACK, Humanoid.SLOT_BUTT]);
- }
- else {
- if (this.hasBreasts()) {
- halfNaked = (this.isVisibleOn.length / Humanoid.SLOT_SLOT_COUNT) < 0.5 &&
- !this.isVisibleOnArray([Humanoid.SLOT_BREASTS, Humanoid.SLOT_CROTCH_FRONT, Humanoid.SLOT_CROTCH_BACK]);
- naked = (this.isVisibleOn.length / Humanoid.SLOT_SLOT_COUNT) < 0.3 &&
- this.isVisibleOnArray([Humanoid.SLOT_BREASTS, Humanoid.SLOT_CROTCH_FRONT, Humanoid.SLOT_CROTCH_BACK, Humanoid.SLOT_BUTT]);
- }
- else {
- halfNaked = (this.isVisibleOn.length / Humanoid.SLOT_SLOT_COUNT) < 0.5 &&
- !this.isVisibleOnArray([Humanoid.SLOT_CROTCH_FRONT, Humanoid.SLOT_CROTCH_BACK]);
- naked = (this.isVisibleOn.length / Humanoid.SLOT_SLOT_COUNT) < 0.3 &&
- this.isVisibleOnArray([Humanoid.SLOT_CROTCH_FRONT, Humanoid.SLOT_CROTCH_BACK, Humanoid.SLOT_BUTT]);
- }
- }
- let sluttinessValueFinal = sluttinessValue / sluttinessWeight;
- let sluttinessCorrected = (sluttinessValue + correctionValue) / (sluttinessWeight + correctionWeight);
- this.cachedSluttiness = {
- halfNaked: halfNaked,
- naked: naked,
- sluttiness: sluttinessValueFinal,
- sluttinessCorrected: sluttinessCorrected
- };
- this.isSluttinessCached = true;
- }
- isVisibleOnArray(arr) {
- for (let i = 0; i < arr.length; i++) {
- if (!this.isVisibleOn(arr[i])) {
- return false;
- }
- }
- return true;
- }
- addMaleParts() {
- if (!this.isMale() && !this.isHerm()) {
- this.addParts(new HumanoidTesticles(), new HumanoidPenis());
- }
- this.invalidateCaches();
- }
- addFemaleParts() {
- if (!this.isFemale() && !this.isHerm()) {
- this.addParts(new HumanoidVagina());
- }
- this.invalidateCaches();
- }
- removeGenderedParts() {
- this.removeParts(HumanoidVagina);
- this.removeParts(HumanoidPenis);
- this.removeParts(HumanoidTesticles);
- this.invalidateCaches();
- }
- setGenderValue(value) {
- let bp = this.getParts(Bodypart);
- for (let i = 0; i < bp.length; i++) {
- if (bp[i] instanceof HumanoidBreasts && this.isMale()) {
- bp[i].arrangeGenderValue(0);
- }
- else {
- bp[i].arrangeGenderValue(value);
- }
- }
- }
- updateBodyparts() {
- let parts = Thing.PartRelation.getRightType(this, Bodypart);
- for (let i = 0; i < parts.length; i++) {
- parts[i].updateStatus();
- }
- }
- updateClothing() {
- let clothes = Thing.WearRelation.getRightType(this, Clothing);
- for (let i = 0; i < clothes.length; i++) {
- clothes[i].updateStatus();
- }
- }
- updateBulges() {
- let clothes = Thing.WearRelation.getRightType(this, Clothing).sort(function (a, b) {
- return a.layer - b.layer;
- });
- this.isBreastVisible = true;
- this.isCrotchVisible = true;
- this.isButtVisible = true;
- let bras = [];
- let butts = [];
- let junks = [];
- clothes.forEach((cloth) => {
- cloth.updateStatus();
- if (cloth.slots.indexOf(Humanoid.SLOT_BREASTS) != -1) {
- bras.push(cloth);
- if (cloth.transparentSlots.indexOf(Humanoid.SLOT_BREASTS) == -1) {
- this.isBreastVisible = false;
- }
- }
- if (cloth.slots.indexOf(Humanoid.SLOT_BUTT) != -1) {
- butts.push(cloth);
- if (cloth.transparentSlots.indexOf(Humanoid.SLOT_BUTT) == -1) {
- this.isButtVisible = false;
- }
- }
- if (cloth.slots.indexOf(Humanoid.SLOT_CROTCH_FRONT) != -1) {
- junks.push(cloth);
- if (cloth.transparentSlots.indexOf(Humanoid.SLOT_CROTCH_FRONT) == -1) {
- this.isCrotchVisible = false;
- }
- }
- });
- this.updateBreastSizes(bras);
- this.updateCrotchSizes(junks);
- this.updateButtSizes(butts);
- this.cachedBulges = {
- breasts: this.breastVisibleSize,
- butt: this.buttVisibleSize,
- crotch: this.crotchVisibleSize,
- waist: 0
- };
- }
- getTopClothOn(slot) {
- return Thing.WearRelation.getRightType(this, Clothing).filter(otherCloth => {
- return otherCloth.visibleOn.includes(slot);
- }).sort((a, b) => {
- return a.layer - b.layer;
- })[0];
- }
- updateBreastSizes(bras) {
- this.isBreastTight = false;
- this.isBreastLoose = true;
- let breasts = Thing.PartRelation.getRightTypeOne(this, HumanoidBreasts);
- this.breastVisibleSize = breasts.getSize();
- bras.forEach((bra) => {
- if (bra.tightBreastSize >= 0 && this.breastVisibleSize > bra.tightBreastSize) {
- this.isBreastTight = true;
- }
- if (bra.maxBreastSize >= 0 && this.breastVisibleSize > bra.maxBreastSize) {
- this.breastVisibleSize = bra.maxBreastSize;
- }
- if (this.breastVisibleSize >= bra.looseBreastSize) {
- this.isBreastLoose = false;
- }
- this.breastVisibleSize += bra.breastPadding;
- if (this.breastVisibleSize < 0) {
- this.breastVisibleSize = 0;
- }
- });
- }
- updateCrotchSizes(cloths) {
- this.isCrotchTight = false;
- this.crotchVisibleSize = 0;
- let penis = Thing.PartRelation.getRightTypeOne(this, HumanoidPenis);
- let testicles = Thing.PartRelation.getRightTypeOne(this, HumanoidTesticles);
- this.crotchVisibleSize = 0;
- if (penis != undefined) {
- this.crotchVisibleSize += penis.getBulgeSize();
- }
- if (testicles != undefined) {
- this.crotchVisibleSize += testicles.getBulgeSize();
- }
- this.crotchVisibleSize = Math.floor(this.crotchVisibleSize * 10) / 10;
- cloths.forEach((worn) => {
- if (worn.tightCrotchSize >= 0 && this.crotchVisibleSize > worn.tightCrotchSize) {
- this.isCrotchTight = true;
- }
- if (worn.maxCrotchSize >= 0 && this.crotchVisibleSize > worn.maxCrotchSize) {
- this.crotchVisibleSize = worn.maxCrotchSize;
- }
- this.crotchVisibleSize += worn.crotchPadding;
- if (this.crotchVisibleSize < 0) {
- this.crotchVisibleSize = 0;
- }
- });
- }
- updateButtSizes(cloths) {
- this.isButtTight = false;
- let butt = Thing.PartRelation.getRightTypeOne(this, HumanoidButt);
- this.buttVisibleSize = butt == undefined ? 0 : butt.getSize();
- cloths.forEach((worn) => {
- if (worn.tightButtSize >= 0 && this.buttVisibleSize > worn.tightButtSize) {
- this.isButtTight = true;
- }
- if (worn.maxButtSize >= 0 && this.buttVisibleSize > worn.maxButtSize) {
- this.buttVisibleSize = worn.maxButtSize;
- }
- this.buttVisibleSize += worn.buttPadding;
- if (this.buttVisibleSize < 0) {
- this.buttVisibleSize = 0;
- }
- });
- }
- hasBreasts() {
- let breasts = this.getPart(HumanoidBreasts);
- if (breasts.size > 1) {
- return true;
- }
- return false;
- }
- isMale() {
- return this.getParts(HumanoidPenis).length > 0 && this.getParts(HumanoidVagina).length == 0;
- }
- isFemale() {
- return this.getParts(HumanoidPenis).length == 0 && this.getParts(HumanoidVagina).length > 0;
- }
- isHerm() {
- return this.getParts(HumanoidPenis).length > 0 && this.getParts(HumanoidVagina).length > 0;
- }
- getShortestDescription() {
- let playerGender = this.getGenderValue();
- let playerSluttiness = this.getSluttiness();
- let presentation = "";
- if (playerSluttiness.sluttinessCorrected > 75) {
- presentation += ("slutty, ");
- }
- else if (playerSluttiness.sluttinessCorrected > 35) {
- }
- else if (playerSluttiness.sluttinessCorrected > 20) {
- presentation += ("prude, ");
- }
- else {
- presentation += ("saintly, ");
- }
- if (playerGender.genderValueCorrected < 40) {
- presentation += ("masculine ");
- }
- else if (playerGender.genderValueCorrected < 60) {
- presentation += ("androgynous ");
- }
- else {
- presentation += ("feminine ");
- }
- if (playerGender.hasTits) {
- if (playerGender.hasPenis || playerGender.hasPenisBulge) {
- presentation += ("shemale");
- }
- else if (playerGender.hasVagina) {
- presentation += ("woman");
- }
- }
- else {
- if (playerGender.hasPenis) {
- if (playerGender.genderValueCorrected < 60) {
- presentation += ("man");
- }
- else {
- presentation += ("trap");
- }
- }
- else if (playerGender.hasPenisBulge) {
- if (playerGender.genderValueCorrected < 60) {
- presentation += ("man");
- }
- else {
- presentation += ("trap");
- }
- }
- else if (playerGender.hasVagina) {
- presentation += ("woman");
- }
- }
- return presentation;
- }
- static getPlayerDescription() {
- let say = new Say();
- say.add("You are ");
- let player = WorldState.player;
- let male = player.getParts(HumanoidPenis).length > 0;
- let female = player.getParts(HumanoidVagina).length > 0;
- if (male && female) {
- say.add("hermaphrodite");
- }
- else if (male) {
- say.add("male");
- }
- else {
- say.add("female");
- }
- say.add(". You are presenting as ", new SayAn(), player.getShortestDescription() + ". ");
- say.add(Attributes.GenderIdentity.getDescription(player.getStat(Attributes.GenderIdentity)));
- let sv = player.getSluttiness();
- let bulges = player.getBulges();
- let coveredPerc = 1 - (player.uncoveredSlots.length / Humanoid.SLOT_SLOT_COUNT);
- say.add(" ", player.getPart(HumanoidSkin).getDescription());
- if (sv.halfNaked) {
- say.add(" You are almost naked. ");
- }
- else if (sv.naked) {
- say.add(" You are naked. ");
- }
- else if (coveredPerc < 0.2) {
- say.add("You are not showing much of it, though.");
- }
- say.add(Attributes.Degeneration.getDescription(player.getStat(Attributes.Degeneration)));
- say.add(Say.PARAGRAPH_BREAK);
- say.add(player.getPart(HumanoidArms).getDescription(), " ");
- say.add(player.getPart(HumanoidHands).getDescription(), " ");
- say.add(player.getPart(HumanoidFeet).getDescription(), " ");
- let penis = player.getPart(HumanoidPenis);
- let vagina = player.getPart(HumanoidVagina);
- if (penis != undefined) {
- say.add("You have a ", penis.getSizeText(), (penis.isFlaccid() ? " flaccid " : " erect "), Say.COCK, " between your legs");
- if (!penis.isBig() && penis.isGrower() && penis.isFlaccid()) {
- say.add(", which is okay, since you're a grower, not a shower");
- }
- if (penis.isUncovered()) {
- let oneOf = new OneOf(OneOf.PURELY_AT_RANDOM, ...[
- ", it is not covered by any clothing",
- ", it is not covered by any clothes",
- ", it is uncovered",
- ", it is visible to all",
- ", it is hanging freely"
- ]);
- say.add(oneOf.getOne());
- }
- let testicles = player.getPart(HumanoidTesticles);
- if (HumanoidPenis.getSizeText(bulges.crotch) != HumanoidPenis.getSizeText(penis.getBulgeSize() + testicles.getBulgeSize())) {
- say.add(", but it looks like it's actually ", HumanoidPenis.getSizeText(bulges.crotch), " due to your clothing");
- }
- say.add(". ");
- if (testicles != undefined) {
- }
- }
- else {
- say.add(vagina.getDescription());
- }
- say.add(" ");
- let breasts = player.getPart(HumanoidBreasts);
- let butt = player.getPart(HumanoidButt);
- say.add("You have ", breasts.getSizeText(), " breasts and a ", butt.getSizeText(), " butt.");
- if (bulges.breasts != breasts.getSize() && bulges.butt != butt.getSize()) {
- say.add(" Your clothing makes your breasts look like they're actually ", HumanoidBreasts.getSizeText(bulges.breasts), " and make your butt appear ", HumanoidButt.getSizeText(bulges.butt), ".");
- }
- else if (bulges.breasts != breasts.getSize()) {
- say.add(" Your clothing makes your breasts look like they're actually ", HumanoidBreasts.getSizeText(bulges.breasts), ".");
- }
- else if (bulges.butt != butt.getSize()) {
- say.add(" Your clothing makes your butt appear ", HumanoidButt.getSizeText(bulges.butt), ".");
- }
- say.add(Say.PARAGRAPH_BREAK);
- let clothingSluttiness = Clothing.getSluttinessValueOn(player);
- let bodypartSluttiness = Bodypart.getSluttinessValueOn(player);
- if (clothingSluttiness.weight > 0) {
- let clothingSluttinessFinal = clothingSluttiness.value / clothingSluttiness.weight;
- if (clothingSluttinessFinal > 75) {
- say.add("Your outfit can only be described as \"whore-ish\", it is far too nasty.");
- }
- else if (clothingSluttinessFinal > 60) {
- say.add("Your clothing are obviously making you look a bit naughty.");
- }
- else if (clothingSluttinessFinal < 30 && sv.sluttinessCorrected < 30) {
- say.add("Your clothing are definitely a bit prude.");
- }
- else if (clothingSluttinessFinal < 15 && sv.sluttinessCorrected < 30) {
- say.add("Your outfit is so prude that it could be worn by a saint.");
- }
- }
- say.add(" ");
- if (bodypartSluttiness.weight > 0) {
- let bodypartSluttinessFinal = bodypartSluttiness.value / bodypartSluttiness.weight;
- if (bodypartSluttinessFinal > 75) {
- say.add("The way your body is makes you look like you were made purely for sex");
- if (coveredPerc > 0.7) {
- say.add(", thankfully it's mostly covered");
- }
- else if (coveredPerc < 0.2) {
- say.add(", and you didn't even bother covering it up");
- }
- say.add(".");
- }
- else if (bodypartSluttinessFinal > 60) {
- say.add("Your body definitely has a lot of sex-appeal going on");
- if (coveredPerc > 0.7) {
- say.add(", although it's covered");
- }
- else if (coveredPerc < 0.2) {
- say.add(", proudly displayed for all to see");
- }
- say.add(".");
- }
- else if (bodypartSluttinessFinal < 30) {
- say.add("You have very little sex-appeal, maybe you are a kitchen table?");
- if (coveredPerc > 0.7) {
- say.add(" At least you covered it up.");
- }
- else if (coveredPerc < 0.2) {
- say.add(" Maybe you could cover it up a bit.");
- }
- }
- }
- say.add(Say.PARAGRAPH_BREAK);
- let stats = new SayLeftRight();
- stats.addLeft(new SayBold("Strength: "), Attributes.Strength.getDescription(player.getStat(Attributes.Strength)));
- stats.addLeft(Say.LINE_BREAK);
- stats.addLeft(new SayBold("Agility: "), Attributes.Agility.getDescription(player.getStat(Attributes.Agility)));
- stats.addLeft(Say.LINE_BREAK);
- stats.addLeft(new SayBold("Charm: "), Attributes.Charm.getDescription(player.getStat(Attributes.Charm)));
- stats.addLeft(Say.LINE_BREAK);
- stats.addLeft(new SayBold("Intelligence: "), Attributes.Intelligence.getDescription(player.getStat(Attributes.Intelligence)));
- Skill.getSkills().forEach((skill) => {
- if (player.getSkill(skill) > 0) {
- stats.addRight(new SayBold(skill.id + ": "), skill.getDescription(player.getSkill(skill)));
- }
- });
- say.add(stats);
- return say;
- }
- }
- Humanoid.SEX_MALE = 0;
- Humanoid.SEX_FEMALE = 1;
- Humanoid.SEX_HERM = 2;
- Humanoid.SLOT_HAIR = 0;
- Humanoid.SLOT_HEADGEAR = 1;
- Humanoid.SLOT_FACE = 2;
- Humanoid.SLOT_EARS = 3;
- Humanoid.SLOT_EYES = 4;
- Humanoid.SLOT_NOSE = 5;
- Humanoid.SLOT_MOUTH = 6;
- Humanoid.SLOT_NECK = 7;
- Humanoid.SLOT_SHOULDERS = 8;
- Humanoid.SLOT_ARMS = 9;
- Humanoid.SLOT_HANDS = 10;
- Humanoid.SLOT_FINGERS = 11;
- Humanoid.SLOT_FINGERNAILS = 12;
- Humanoid.SLOT_UPPER_CHEST = 13;
- Humanoid.SLOT_MIDRIFF = 14;
- Humanoid.SLOT_WAIST = 15;
- Humanoid.SLOT_BACK = 16;
- Humanoid.SLOT_HIPS = 17;
- Humanoid.SLOT_CROTCH_FRONT = 18;
- Humanoid.SLOT_CROTCH_BACK = 19;
- Humanoid.SLOT_BUTT = 20;
- Humanoid.SLOT_LEG_UPPER = 21;
- Humanoid.SLOT_LEG_LOWER = 22;
- Humanoid.SLOT_FEET = 23;
- Humanoid.SLOT_FEET_NAILS = 24;
- Humanoid.SLOT_BREASTS = 25;
- Humanoid.SLOT_SLOT_COUNT = 26;
- Humanoid.cacheInvalidationActionRule = new Rule({
- name: "Invalidate humanoid caches",
- firstPriority: Rule.PRIORITY_LOWEST,
- code: (runner) => {
- runner.noun.actor.invalidateCaches();
- },
- conditions: (runner) => {
- return runner.noun.actor instanceof Humanoid;
- }
- });
- ActionWear.carry.addRule(Humanoid.cacheInvalidationActionRule);
- ActionRemove.carry.addRule(Humanoid.cacheInvalidationActionRule);
- var WorldState;
- (function (WorldState) {
- var worldTurn = 0;
- var playerTurn = 0;
- WorldState.player = new Humanoid({ isMale: false });
- WorldState.player.description = Humanoid.getPlayerDescription;
- var rememberedRooms = new StoredVariable({
- id: "Remembered Rooms",
- value: []
- });
- var rememberedFodder = [];
- let rememberedRoomsForIntelligence = 2;
- let rememberedRoomsForSurvival = 1;
- WorldState.RememberingRoomRulebook = new Rulebook("Remembering Room something");
- function isTurnWaiting() {
- return worldTurn < playerTurn;
- }
- WorldState.isTurnWaiting = isTurnWaiting;
- function incrementWorldTurn() {
- worldTurn++;
- }
- WorldState.incrementWorldTurn = incrementWorldTurn;
- function incrementPlayerTurn() {
- playerTurn++;
- }
- WorldState.incrementPlayerTurn = incrementPlayerTurn;
- function getCurrentTurn() {
- return playerTurn;
- }
- WorldState.getCurrentTurn = getCurrentTurn;
- function setCurrentTurn(turn) {
- playerTurn = turn;
- worldTurn = turn;
- }
- WorldState.setCurrentTurn = setCurrentTurn;
- WorldState.RememberingRoomInList = WorldState.RememberingRoomRulebook.createAndAddRule({
- name: "Is room listed in remembered rooms?",
- firstPriority: Rule.PRIORITY_LOWEST,
- priority: Rule.PRIORITY_LOW,
- code: runner => {
- if (rememberedRooms.value.indexOf(runner.noun.getName()) != -1 || rememberedFodder.indexOf(runner.noun) != -1) {
- return true;
- }
- }
- });
- WorldState.RememberingRoomInMap = WorldState.RememberingRoomRulebook.createAndAddRule({
- name: "Is room shown on a map?",
- firstPriority: Rule.PRIORITY_LOWEST,
- priority: Rule.PRIORITY_LOWEST,
- code: runner => {
- let maps = Thing.CarryRelation.getRightType(WorldState.player, MapNote);
- for (let i = 0; i < maps.length; i++) {
- if (maps[i].contains(runner.noun)) {
- return true;
- }
- }
- }
- });
- async function isRoomRemembered(room) {
- let result = await WorldState.RememberingRoomRulebook.execute({ noun: room });
- return result == true;
- }
- WorldState.isRoomRemembered = isRoomRemembered;
- function getRememberedRooms() {
- return rememberedRooms.value;
- }
- WorldState.getRememberedRooms = getRememberedRooms;
- function getRememberedRoomsAsRooms() {
- let rooms = [];
- rememberedRooms.value.forEach(roomName => {
- let room = Room.getRoom(roomName);
- if (room != undefined)
- rooms.push(room);
- });
- return rooms;
- }
- WorldState.getRememberedRoomsAsRooms = getRememberedRoomsAsRooms;
- function getMaximumRememberedRooms() {
- let intRooms = WorldState.player.getStat(Attributes.Intelligence) * rememberedRoomsForIntelligence;
- let skillRooms = WorldState.player.getSkill(Skills.Survival) * rememberedRoomsForSurvival;
- return intRooms + skillRooms;
- }
- WorldState.getMaximumRememberedRooms = getMaximumRememberedRooms;
- function truncateRooms() {
- while (rememberedRooms.value.length > getMaximumRememberedRooms()) {
- rememberedRooms.value.pop();
- }
- }
- WorldState.truncateRooms = truncateRooms;
- function rememberRoom(...rooms) {
- rooms.forEach((value) => {
- if (value instanceof Room) {
- if (value.fodder) {
- if (rememberedFodder.indexOf(value) == -1) {
- rememberedFodder.push(value);
- }
- }
- else {
- let idx = rememberedRooms.value.indexOf(value.getName());
- if (idx != -1) {
- rememberedRooms.value.splice(idx, 1);
- }
- rememberedRooms.value.unshift(value.getName());
- }
- }
- });
- truncateRooms();
- }
- WorldState.rememberRoom = rememberRoom;
- function saveState() {
- let things = {
- carried: [],
- worn: [],
- wielded: []
- };
- return {
- Things: things
- };
- }
- WorldState.saveState = saveState;
- WorldState.CorrectRememberedRoomsRule = PlayBegins.rulebook.createAndAddRule({
- name: "Correct remembered rooms",
- firstPriority: Rule.PRIORITY_LOWEST,
- priority: Rule.PRIORITY_MEDIUM,
- code: () => {
- let allRooms = rememberedRooms.value;
- let currentRoom = WorldState.player.getRoom();
- if (allRooms.length == 0) {
- rememberedRooms.value = [currentRoom.getName()];
- return;
- }
- let newRooms = [];
- function recursivelyAddRooms(room) {
- if (room instanceof RoomRandom) {
- if (room.fodder) {
- rememberedFodder.push(room);
- room.connections.forEach((newRoom) => {
- recursivelyAddRooms(newRoom);
- });
- }
- else if (allRooms.indexOf(room.getName()) != -1 && newRooms.indexOf(room.getName()) == -1) {
- newRooms.push(room.getName());
- room.connections.forEach((newRoom) => {
- recursivelyAddRooms(newRoom);
- });
- }
- }
- }
- recursivelyAddRooms(currentRoom);
- rememberedRooms.value = newRooms;
- }
- });
- })(WorldState || (WorldState = {}));
- class Region {
- constructor(name) {
- this.name = name;
- }
- place(...rooms) {
- rooms.forEach(room => {
- if (room instanceof Room) {
- Region.RegionRoom.setRelation(this, room);
- }
- else {
- Region.RegionRegion.setRelation(this, room);
- }
- });
- }
- getRooms() {
- let rooms = Region.RegionRoom.getRight(this);
- Region.RegionRegion.getRight(this).forEach((region) => {
- Region.RegionRoom.getRight(region).forEach((room) => {
- rooms.push(room);
- });
- });
- return rooms;
- }
- containsRoom(room) {
- let directlyContained = Region.RegionRoom.getLeft(room) == this;
- if (directlyContained) {
- return true;
- }
- else if (Region.RegionRegion.getLeft(this) != undefined) {
- return this.getRooms().indexOf(room) != -1;
- }
- return false;
- }
- contains(thing) {
- let room = thing.getRoom();
- if (room == undefined) {
- return false;
- }
- else {
- let regions = Region.InRelation.getAllLeft(room);
- return regions.indexOf(this) != -1;
- }
- }
- }
- Region.RegionRoom = new RelationOneToMany();
- Region.RegionRegion = new RelationOneToMany();
- Region.InRelation = new RelationHandlerStrictOneToMany(Region.RegionRegion, Region.RegionRoom);
- class Shuffler {
- constructor(array, rng) {
- this.position = 0;
- this.rng = rng == undefined ? Math.random : rng;
- this.array = array;
- }
- restart() {
- this.position = 0;
- }
- getOne() {
- if (this.position >= this.array.length) {
- return undefined;
- }
- let randomIndex = Math.floor(this.rng() * (this.array.length - this.position)) + this.position;
- let localCopy = this.array[this.position];
- this.array[this.position] = this.array[randomIndex];
- this.array[randomIndex] = localCopy;
- return this.array[this.position++];
- }
- getShuffled() {
- let array = this.array.slice(0);
- var m = array.length, t, i;
- while (m) {
- i = Math.floor(this.rng() * m--);
- t = array[m];
- array[m] = array[i];
- array[i] = t;
- }
- return array;
- }
- }
- var AIRules;
- (function (AIRules) {
- AIRules.PickShiny = AI.rules.createAndAddRule({
- name: "Pick Shinies",
- firstPriority: AIRules.PRIORITY_ACTING_ON_PLACE,
- conditions: (runner) => {
- let person = runner.noun;
- return person.AI.picksShinies;
- },
- code: (runner) => {
- let person = runner.noun;
- let room = person.getRoom();
- let visibleThings = room.getContainedAndVisibleTo(person);
- if (visibleThings.length > 0) {
- for (let i = 0; i < visibleThings.length; i++) {
- if (!visibleThings[i].fixedInPlace && visibleThings[i].getShiny()) {
- return new ActionTake(person, visibleThings[i]);
- }
- }
- }
- }
- });
- })(AIRules || (AIRules = {}));
- var AIRules;
- (function (AIRules) {
- AIRules.Wander = AI.rules.createAndAddRule({
- name: "Wander",
- firstPriority: AIRules.PRIORITY_ACTING_ON_IDLE,
- conditions: (runner) => {
- let person = runner.noun;
- return person.AI.wanderer && (Math.random() * 100) > person.AI.wanderChance;
- },
- code: (runner) => {
- let person = runner.noun;
- let room = person.getRoom();
- if (person.AI.wandersOn != undefined) {
- if (person.AI.wandersOn.containsRoom(room)) {
- let connections = room.connections.slice();
- let realConnections = [];
- for (let i = 0; i < connections.length; i++) {
- if (connections[i] != undefined && person.AI.wandersOn.containsRoom(connections[i])) {
- realConnections.push(i);
- }
- }
- let direction = ((new Shuffler(realConnections)).getOne());
- return new ActionGo(person, direction);
- }
- else {
- let regionRooms = person.AI.wandersOn.getRooms().filter((a) => {
- if (a instanceof RoomRandom && a.placed) {
- return true;
- }
- });
- regionRooms.sort((a, b) => {
- let dist = a.getDistanceTo(b);
- if (dist != undefined) {
- return -dist;
- }
- else {
- return 0;
- }
- });
- let targetRoom = regionRooms.pop();
- return new ActionGo(person, targetRoom);
- }
- }
- else {
- let direction = room.getConnectedDirection();
- return new ActionGo(person, direction);
- }
- }
- });
- })(AIRules || (AIRules = {}));
- class ActionDrop extends Action {
- getCommandText() {
- return "drop " + (this.getNoun(0) != undefined ? this.getNoun(0).getPrintedName() : "");
- }
- }
- ActionDrop.check = new Rulebook("Check Dropping");
- ActionDrop.carry = new Rulebook("Carry out Dropping");
- ActionDrop.check.addRule(new Rule({
- name: "Check Dropping - Are you Wearing it?",
- firstPriority: Rule.PRIORITY_LOWEST,
- code: async (rulebook) => {
- let action = rulebook.noun;
- let actor = action.actor;
- let thing = action.getNoun(0);
- if (Thing.WearRelation.getLeft(thing) == actor || Thing.WieldRelation.getLeft(thing) == actor) {
- if (action.actor == WorldState.player) {
- action.say.add("(first taking off the ", thing, ")", Say.LINE_BREAK);
- }
- let takingAction = new ActionRemove(actor, thing);
- await takingAction.execute();
- action.say.add(takingAction.say);
- if (Thing.WearRelation.getLeft(thing) == actor || Thing.WieldRelation.getLeft(thing) == actor) {
- return false;
- }
- action.say.add(Say.LINE_BREAK);
- }
- }
- }));
- ActionDrop.check.addRule(new Rule({
- name: "Check Dropping - Do you have it??",
- firstPriority: Rule.PRIORITY_LOWEST,
- code: (rulebook) => {
- let action = rulebook.noun;
- let actor = action.actor;
- let thing = action.getNoun(0);
- if (Thing.CarryRelation.getLeft(thing) != actor) {
- if (actor == WorldState.player) {
- action.say.add("You don't have it.");
- }
- return false;
- }
- }
- }));
- ActionDrop.carry.addRule(new Rule({
- name: "Dropping - Place the noun on the floor",
- code: (rulebook) => {
- let action = rulebook.noun;
- let actor = action.actor;
- let thing = action.getNoun(0);
- Thing.EnclosedRelation.unsetRight(thing);
- actor.getRoom().place(thing);
- if (actor == WorldState.player) {
- action.say.add(new SayBold(action.getNoun(0).getPrintedName() + ": "), "Dropped.");
- }
- else {
- action.say.add(new SayThe(), actor, " drops ", new SayThe(), action.getNoun(0), " on the floor.");
- }
- }
- }));
- Elements.HyperlinkHandler.HyperlinkingRulebook.addRule(new Rule({
- name: "Hyperlink - Drop",
- firstPriority: Rule.PRIORITY_HIGHEST,
- code: (rulebook) => {
- let thing = rulebook.noun;
- if (Thing.CarryRelation.getLeft(thing) == WorldState.player || Thing.WieldRelation.getLeft(thing) == WorldState.player || Thing.WearRelation.getLeft(thing) == WorldState.player) {
- Elements.HyperlinkHandler.addAvailableAction("Drop", new ActionDrop(WorldState.player, thing));
- }
- }
- }));
- Elements.InventoryHandler.LinkingThing.addRule(new Rule({
- name: "Inventory - Drop",
- firstPriority: Rule.PRIORITY_LOWEST,
- code: (rulebook) => {
- let thing = rulebook.noun;
- Elements.InventoryHandler.printThingLink("D", new ActionDrop(WorldState.player, thing));
- }
- }));
- class ActionInventory extends Action {
- constructor() {
- super(...arguments);
- this.requiresTurn = false;
- this.requiresNoun = false;
- this.requiresVisibility = false;
- }
- getCommandText() {
- return "take inventory";
- }
- static async createButton(thing, resolve) {
- let p = document.createElement("p");
- p.classList.add("choice");
- let elements = await ((new Say(thing)).getPureElements());
- elements.forEach(ele => {
- p.appendChild(ele);
- });
- p.addEventListener("click", () => {
- resolve(thing);
- });
- Controls.KeyHandler.applyCode(p, Controls.KeyHandler.getFirstKeyCode());
- return p;
- }
- }
- ActionInventory.check = new Rulebook("Check Taking Inventory");
- ActionInventory.carry = new Rulebook("Carry out Taking Inventory");
- ActionInventory.checkInventoryRule = ActionInventory.check.createAndAddRule({
- name: "List inventory as options",
- code: async (rulebook) => {
- let player = WorldState.player;
- let wielded = Thing.WieldRelation.getRight(player).sort(Elements.InventoryHandler.thingSort);
- let worn = Thing.WearRelation.getRight(player).sort(Elements.InventoryHandler.thingSort);
- let carried = Thing.CarryRelation.getRight(player).sort(Elements.InventoryHandler.thingSort);
- let buttons;
- let chosenPromise = new Promise((async (resolve) => {
- Controls.KeyHandler.reset();
- let say = new Say();
- if (wielded.length > 0) {
- say.add(new SayBold("Wielded:"), Say.LINE_BREAK);
- for (let i = 0; i < wielded.length; i++) {
- say.add(await ActionInventory.createButton(wielded[i], resolve));
- }
- }
- if (worn.length > 0) {
- if (say.sequence.length > 0) {
- say.add(Say.PARAGRAPH_BREAK);
- }
- say.add(new SayBold("Worn:"), Say.LINE_BREAK);
- for (let i = 0; i < worn.length; i++) {
- say.add(await ActionInventory.createButton(worn[i], resolve));
- }
- }
- if (carried.length > 0) {
- if (say.sequence.length > 0) {
- say.add(Say.PARAGRAPH_BREAK);
- }
- say.add(new SayBold("Carried:"), Say.LINE_BREAK);
- for (let i = 0; i < carried.length; i++) {
- say.add(await ActionInventory.createButton(carried[i], resolve));
- }
- }
- if (say.sequence.length == 0) {
- return resolve(undefined);
- }
- buttons = await say.getHTMLContent();
- Elements.CurrentTurnHandler.print(...(buttons));
- }));
- let chosenThing = await chosenPromise;
- if (chosenThing != undefined) {
- Elements.CurrentTurnHandler.unprint(...buttons);
- Controls.KeyHandler.reset();
- return new ActionExamine(WorldState.player, chosenThing);
- }
- else {
- rulebook.noun.say.add("You have nothing.");
- return false;
- }
- }
- });
- Elements.HyperlinkHandler.CommonActionsRulebook.addRule(new Rule({
- name: "Add Take Inventory Command Rule",
- firstPriority: Rule.PRIORITY_LOWEST,
- priority: Rule.PRIORITY_MEDIUM,
- code: (rulebook) => {
- Elements.HyperlinkHandler.addCommonAction("Inventory", new ActionInventory(WorldState.player));
- }
- }));
- class ActionSaveGame extends Action {
- constructor() {
- super(...arguments);
- this.requiresTurn = false;
- this.requiresNoun = false;
- this.requiresVisibility = false;
- }
- getCommandText() {
- return "save to file";
- }
- }
- ActionSaveGame.check = new Rulebook("Check Saving");
- ActionSaveGame.carry = new Rulebook("Carry out Saving");
- ActionSaveGame.carry.addRule(new Rule({
- name: "Save the game",
- code: runner => {
- SaveHandler.saveToFile();
- runner.noun.say.add("Saved.");
- }
- }));
- Elements.HyperlinkHandler.CommonActionsRulebook.addRule(new Rule({
- name: "Add Save Command Rule",
- firstPriority: Rule.PRIORITY_LOWEST,
- priority: Rule.PRIORITY_LOWEST,
- code: (rulebook) => {
- Elements.HyperlinkHandler.addCommonAction("Save", new ActionSaveGame(WorldState.player));
- }
- }));
- class ActionTalk extends Action {
- getCommandText() {
- return "talk to " + (this.getNoun(0) != undefined ? this.getNoun(0).getPrintedName() : "");
- }
- }
- ActionTalk.PRIORITY_SITUATION_DIALOGUE = 9;
- ActionTalk.PRIORITY_POSSESSION_DIALOGUE = 7;
- ActionTalk.PRIORITY_LOCATION_DIALOGUE = 5;
- ActionTalk.PRIORITY_COMMON_DIALOGUE = 3;
- ActionTalk.PRIORITY_GLOBAL_DIALOGUE = 1;
- ActionTalk.check = new Rulebook("Check Talking");
- ActionTalk.carry = new Rulebook("Carry out Talking");
- ActionTalk.defaultCarryTalkingRule = ActionTalk.carry.createAndAddRule({
- name: "Talking - Doesn't want to talk",
- firstPriority: -1,
- priority: -1,
- code: (rulebook) => {
- let action = rulebook.noun;
- let thing = action.getNoun(0);
- if (thing instanceof Person) {
- action.say = new Say("It doesn't look like ", new SayHeSheIt(thing), " wants to talk.");
- }
- else {
- action.say = new Say("How are you going to talk to that?");
- }
- }
- });
- Elements.HyperlinkHandler.HyperlinkingRulebook.addRule(new Rule({
- name: "Hyperlink - Talk",
- firstPriority: Rule.PRIORITY_HIGHEST,
- code: (rulebook) => {
- let thing = rulebook.noun;
- if (thing instanceof Person && thing.getRoom() == WorldState.player.getRoom()) {
- Elements.HyperlinkHandler.addAvailableAction("Talk", new ActionTalk(WorldState.player, thing));
- }
- }
- }));
- class ActionWait extends Action {
- constructor() {
- super(...arguments);
- this.requiresTurn = true;
- this.requiresNoun = false;
- this.requiresVisibility = false;
- }
- getCommandText() {
- return "wait";
- }
- }
- ActionWait.check = new Rulebook("Check Waiting");
- ActionWait.carry = new Rulebook("Carry out Waiting");
- ActionWait.carry.addRule(new Rule({
- name: "Print waiting message",
- code: runner => {
- if (runner.noun.actor == WorldState.player) {
- runner.noun.say.add("You wait.");
- }
- }
- }));
- Elements.HyperlinkHandler.CommonActionsRulebook.addRule(new Rule({
- name: "Add Wait Command Rule",
- firstPriority: Rule.PRIORITY_HIGHEST,
- priority: Rule.PRIORITY_MEDIUM,
- code: (rulebook) => {
- Elements.HyperlinkHandler.addCommonAction("Wait", new ActionWait(WorldState.player));
- }
- }));
- class ContentDescription {
- constructor(name, group) {
- this.saidCount = 0;
- this.name = name;
- this.group = group;
- }
- getScore() {
- return (this.group).getScore();
- }
- getDescription(group) {
- this.saidCount++;
- if (typeof this.description == "function") {
- return this.description(this, group);
- }
- return this.description;
- }
- setDescription(description) {
- if (!(description instanceof Say)) {
- this.description = new Say(description);
- }
- else {
- this.description = description;
- }
- return this;
- }
- static pickDescriptions(cda, target) {
- let a = cda.slice();
- let groups = [];
- for (let i = 0; i < a.length; i++) {
- let randomIndex = Math.floor(Math.random() * (a.length - i)) + i;
- let temp = a[i];
- a[i] = a[randomIndex];
- a[randomIndex] = temp;
- }
- a.sort((a, b) => {
- let scoreA = a.getScore() / (a.saidCount + 1);
- let scoreB = b.getScore() / (b.saidCount + 1);
- if (scoreA != scoreB)
- return scoreB - scoreA;
- return 0;
- });
- a.forEach(description => {
- groups.push(description.group);
- });
- let matches = target.matchAgainst(groups);
- if (matches != undefined) {
- let result = [];
- matches.forEach(i => {
- result.push(a[i].getDescription(target));
- result.push(new Say(" "));
- });
- return result;
- }
- else {
- console.warn("No description available for", target);
- return [new Say("Warning: No description available for the current situation. Please report so it can be corrected.")];
- }
- }
- }
- class ContentDifferential {
- constructor(...nouns) {
- this.nouns = [];
- this.score = 0;
- this.addNoun(...nouns);
- }
- addNoun(...nouns) {
- nouns.forEach(noun => {
- this.nouns.push(noun);
- });
- this.score = this.getScore();
- return this;
- }
- getNouns() {
- return this.nouns;
- }
- replaceNouns(...nouns) {
- this.nouns = nouns;
- return this;
- }
- isMatch(cd, allowPartial = false) {
- let check = this.getUnmatched(cd);
- if ((allowPartial || check.unmatched.length == 0) && check.matching.length == 0) {
- return true;
- }
- else if (check.matching.length == 0) {
- for (let i = 0; i < check.unmatched.length; i++) {
- if (!(check.unmatched[i] instanceof ContentMarker)) {
- return false;
- }
- else {
- if (check.unmatched[i].isImportant()) {
- return false;
- }
- }
- }
- return true;
- }
- return false;
- }
- getUnmatched(cd) {
- let unmatched = cd.nouns.slice();
- let matching = this.nouns.slice();
- for (let i = matching.length - 1; i >= 0; i--) {
- for (let k = unmatched.length - 1; k >= 0; k--) {
- if (ContentDifferential.compareNouns(matching[i], unmatched[k])) {
- unmatched.splice(k, 1);
- matching.splice(i, 1);
- break;
- }
- }
- }
- return {
- matching: matching,
- unmatched: unmatched
- };
- }
- getScore() {
- let highest = 0;
- let count = this.nouns.length;
- this.nouns.forEach((noun) => {
- let level = ContentDifferential.getNounLevel(noun);
- if (highest < level) {
- highest = level;
- }
- });
- return highest + (count / 100);
- }
- static getNounLevel(noun) {
- if (noun == undefined || noun == null) {
- return 0;
- }
- else if (typeof noun == "function") {
- if (noun.prototype instanceof Thing) {
- let specifity = 2;
- let parentClass = Object.getPrototypeOf(noun);
- while (parentClass != Thing) {
- specifity += 0.1;
- parentClass = Object.getPrototypeOf(parentClass);
- }
- return specifity;
- }
- else {
- return 2.5;
- }
- }
- else if (noun instanceof Thing) {
- return 4;
- }
- else if (noun instanceof ContentDifferential) {
- return 1;
- }
- else {
- return 0.5;
- }
- }
- static compareNouns(a, b) {
- if (a == undefined || a == null) {
- return true;
- }
- if (typeof a == "function") {
- return b == a || b instanceof a || (typeof b == "function" && b.prototype instanceof a);
- }
- else if (a instanceof Thing) {
- return b == a;
- }
- return a === b;
- }
- static isMatch(matchFrom, matchAgainst) {
- let unmatched = matchAgainst.slice();
- let matching = matchFrom.slice();
- for (let i = matching.length - 1; i >= 0; i--) {
- for (let k = unmatched.length - 1; k >= 0; k--) {
- if (matching[i].isMatch(unmatched[k])) {
- unmatched.splice(k, 1);
- matching.splice(i, 1);
- break;
- }
- }
- }
- if (unmatched.length == 0 && matching.length == 0) {
- return true;
- }
- else if (unmatched.length == 0) {
- for (let i = 0; i < matching.length; i++) {
- let nouns = matching[i].getNouns();
- for (let k = 0; k < nouns.length; k++) {
- if (!(nouns[k] instanceof ContentMarker)) {
- return false;
- }
- else {
- if (nouns[k].isImportant()) {
- return false;
- }
- }
- }
- }
- return true;
- }
- return false;
- }
- }
- var ContentGroupMatch;
- (function (ContentGroupMatch) {
- ContentGroupMatch[ContentGroupMatch["NO_MATCH"] = 0] = "NO_MATCH";
- ContentGroupMatch[ContentGroupMatch["PARTIAL_MATCH"] = 1] = "PARTIAL_MATCH";
- ContentGroupMatch[ContentGroupMatch["PERFECT_MATCH"] = 2] = "PERFECT_MATCH";
- })(ContentGroupMatch || (ContentGroupMatch = {}));
- class ContentGroup {
- constructor(...units) {
- this.units = [];
- units.forEach(unit => {
- this.addUnit(unit);
- });
- }
- addUnit(unit) {
- this.units.push(unit);
- return this;
- }
- reset() {
- this.matching = this.units.slice();
- }
- isMatching() {
- return this.matching.length;
- }
- setMatching(matching) {
- this.matching = matching;
- }
- isMatch(cg) {
- let unmatched = cg.matching.slice();
- let matching = this.units.slice();
- for (let i = matching.length - 1; i >= 0; i--) {
- for (let k = unmatched.length - 1; k >= 0; k--) {
- if (matching[i].isMatch(unmatched[k])) {
- unmatched.splice(k, 1);
- matching.splice(i, 1);
- break;
- }
- }
- }
- return {
- type: matching.length > 0 ? ContentGroupMatch.NO_MATCH :
- unmatched.length == 0 ? ContentGroupMatch.PERFECT_MATCH :
- ContentGroupMatch.PARTIAL_MATCH,
- unmatched: unmatched
- };
- }
- getScore() {
- let score = 0;
- this.units.forEach(unit => {
- score += unit.getScore();
- });
- return Math.floor((score / this.units.length) * 10) + this.units.length;
- }
- matchAgainst(a) {
- let matches = [];
- this.reset();
- for (let i = 0; i < a.length; i++) {
- let match = a[i].isMatch(this);
- if (match.type != ContentGroupMatch.NO_MATCH) {
- matches.push(i);
- this.setMatching(match.unmatched);
- }
- if (!this.isMatching()) {
- return matches;
- }
- }
- return undefined;
- }
- }
- class ContentMarker {
- constructor(name, important) {
- this.important = false;
- this.name = name;
- this.important = important == true;
- }
- isImportant() {
- return this.important;
- }
- }
- class ContentUnit {
- constructor() {
- this.categories = [];
- }
- addCategory(...nouns) {
- this.categories.push(new ContentDifferential(...nouns));
- }
- isMatch(cu) {
- return ContentDifferential.isMatch(this.categories, cu.categories);
- }
- getScore() {
- let score = 0;
- this.categories.forEach(diff => {
- score += diff.score;
- });
- return score / this.categories.length;
- }
- matchAgainst(a) {
- for (let i = 0; i < a.length; i++) {
- if (a[i].isMatch(this)) {
- return [i];
- }
- }
- }
- }
- class CombatHit extends ContentMarker {
- }
- CombatHit.FULL_DODGE = new CombatHit("Full Dodge", true);
- CombatHit.PARTIAL_DODGE = new CombatHit("Partial Dodge", true);
- CombatHit.FULL_HIT = new CombatHit("Full Hit", true);
- class CombatDamage extends ContentMarker {
- }
- CombatDamage.LOW_DAMAGE = new CombatDamage("Low Damage");
- CombatDamage.MEDIUM_DAMAGE = new CombatDamage("Medium Damage");
- CombatDamage.HIGH_DAMAGE = new CombatDamage("High Damage");
- class CombatResult extends ContentMarker {
- }
- CombatResult.KNOCKED = new CombatResult("Target was knocked down by the attack", true);
- CombatResult.KNOCKED_OFF = new CombatResult("Target was knocked off by the attack, becoming unconscious", true);
- CombatResult.KILLED = new CombatResult("Target was killed by this attack", true);
- class CombatUnit extends ContentUnit {
- constructor() {
- super();
- this.actor = new ContentDifferential(Person);
- this.target = new ContentDifferential(Person);
- this.weapon = new ContentDifferential(Thing);
- this.markers = new ContentDifferential();
- }
- setActor(it) {
- this.actor = new ContentDifferential(it);
- return this;
- }
- setTarget(it) {
- this.target = new ContentDifferential(it);
- return this;
- }
- setWeapon(it) {
- this.weapon = new ContentDifferential(it);
- return this;
- }
- addMarker(marker) {
- this.markers.addNoun(marker);
- return this;
- }
- getScore() {
- return this.actor.getScore() + this.target.getScore() + this.weapon.getScore() + this.markers.getScore();
- }
- isMatch(cu) {
- if (cu instanceof CombatUnit) {
- return this.actor.isMatch(cu.actor) && this.target.isMatch(cu.target) &&
- this.weapon.isMatch(cu.weapon) && this.markers.isMatch(cu.markers);
- }
- return false;
- }
- }
- class FuckingDescription extends ContentDescription {
- constructor(name) {
- super(name, new ContentGroup());
- FuckingDescription.DESCRIPTIONS.push(this);
- }
- addUnit() {
- let unit = new FuckingUnit();
- this.group.addUnit(unit);
- return unit;
- }
- }
- FuckingDescription.DESCRIPTIONS = [];
- class FuckingStyle extends ContentMarker {
- }
- FuckingStyle.GENTLE = new FuckingStyle("Gentle");
- FuckingStyle.ROUGH = new FuckingStyle("Rough");
- class FuckingState extends ContentMarker {
- }
- FuckingState.PENETRATING = new FuckingState("Penetration Start", true);
- FuckingState.NORMAL = new FuckingState("Normal fucking", true);
- FuckingState.SPEEDING_UP = new FuckingState("Speeding up", true);
- FuckingState.CUM_START = new FuckingState("Started Cumming", true);
- FuckingState.CUMMING = new FuckingState("Cumming", true);
- FuckingState.CUM_END = new FuckingState("Finished Cumming", true);
- class FuckingUnit extends ContentUnit {
- constructor() {
- super();
- this.fucker = new ContentDifferential(Person);
- this.fucked = new ContentDifferential(Person);
- this.hole = new ContentDifferential(SexHole);
- this.stick = new ContentDifferential(SexStick);
- this.markers = new ContentDifferential();
- }
- setFucker(it) {
- this.fucker = new ContentDifferential(it);
- return this;
- }
- setFucked(it) {
- this.fucked = new ContentDifferential(it);
- return this;
- }
- setHole(it) {
- this.hole = new ContentDifferential(it);
- return this;
- }
- setStick(it) {
- this.stick = new ContentDifferential(it);
- return this;
- }
- addMarker(marker) {
- this.markers.addNoun(marker);
- return this;
- }
- getScore() {
- return this.fucker.getScore() + this.fucked.getScore() + this.hole.getScore() + this.stick.getScore() + this.markers.getScore();
- }
- isMatch(fu) {
- if (fu instanceof FuckingUnit) {
- return this.fucker.isMatch(fu.fucker) && this.fucked.isMatch(fu.fucked) &&
- this.hole.isMatch(fu.hole) && this.stick.isMatch(fu.stick) && this.markers.isMatch(fu.markers);
- }
- return false;
- }
- }
- class BranchingOption {
- constructor(say, appearCondition) {
- this.previouslyPicked = false;
- this.say = say;
- this.appearCondition = appearCondition;
- }
- }
- class BranchingDialogue {
- constructor(...options) {
- this.options = [];
- this.addOptions(...options);
- }
- addOptions(...options) {
- this.options.push(...options);
- arrayUnique(this.options);
- }
- async getChosenOption() {
- let validOptions = [];
- for (let i = 0, value = this.options[i]; value != undefined; value = this.options[++i]) {
- if (value.appearCondition == undefined || (typeof value.appearCondition == "function" && value.appearCondition()) || value.appearCondition) {
- validOptions.push(value);
- }
- }
- let choiceButtons = [];
- for (let i = 0; i < validOptions.length; i++) {
- let value = validOptions[i];
- let classes = ["choice"];
- if (value.previouslyPicked) {
- classes.push("picked");
- }
- choiceButtons.push((await value.say.getHTML("p", classes))[0]);
- }
- let PlayerInput = new Promise((resolve, reject) => {
- this.resolve = resolve;
- });
- Controls.KeyHandler.reset();
- for (let index = 0, value = choiceButtons[index]; value != undefined; value = choiceButtons[++index]) {
- Controls.KeyHandler.applyCode(value, Controls.KeyHandler.getFirstKeyCode());
- value.addEventListener("click", (e) => {
- validOptions[index].previouslyPicked = true;
- this.resolve(validOptions[index]);
- e.preventDefault();
- });
- }
- await Elements.CurrentTurnHandler.print(...choiceButtons);
- let choice = await PlayerInput;
- await Elements.CurrentTurnHandler.unprint(...choiceButtons);
- return choice;
- }
- }
- var NodeType;
- (function (NodeType) {
- NodeType[NodeType["Node"] = 0] = "Node";
- NodeType[NodeType["Tree"] = 1] = "Tree";
- NodeType[NodeType["Text"] = 2] = "Text";
- NodeType[NodeType["Set"] = 3] = "Set";
- NodeType[NodeType["Choice"] = 4] = "Choice";
- NodeType[NodeType["Branch"] = 5] = "Branch";
- })(NodeType || (NodeType = {}));
- class DialogueNode {
- constructor(id) {
- this.type = NodeType.Node;
- this.id = id;
- }
- setName(name) {
- this.name = name;
- }
- setNext(next) {
- this.next = next;
- }
- getNext() {
- return this.next;
- }
- setChoices(choices) {
- this.choices = choices;
- }
- hasChoices() {
- return this.choices != undefined && this.choices.length > 0;
- }
- }
- class DialogueBranch extends DialogueNode {
- constructor() {
- super(...arguments);
- this.type = NodeType.Branch;
- this.variable = () => { return false; };
- this.branchIds = [];
- this.branchConditions = [];
- }
- setVariable(varFunc) {
- this.variable = varFunc;
- }
- addBranch(targetid, valueFunc) {
- this.branchIds.push(targetid);
- this.branchConditions.push(valueFunc);
- }
- getNext() {
- let variable = this.variable();
- for (let i = 0; i < this.branchIds.length; i++) {
- let comparing = this.branchConditions[i]();
- if (comparing == variable) {
- return this.branchIds[i];
- }
- }
- return this.next;
- }
- }
- class DialogueText extends DialogueNode {
- constructor() {
- super(...arguments);
- this.type = NodeType.Text;
- }
- setSay(sayCreator) {
- this.sayCreator = sayCreator;
- }
- getSay() {
- return this.sayCreator();
- }
- }
- class DialogueChoice extends DialogueText {
- constructor() {
- super(...arguments);
- this.type = NodeType.Choice;
- this.conditions = () => { return true; };
- }
- isAvailable() {
- return this.conditions();
- }
- setConditions(conditions) {
- this.conditions = conditions;
- }
- }
- class DialogueNodeTree extends DialogueNode {
- constructor() {
- super(...arguments);
- this.type = NodeType.Tree;
- }
- setTree(treeFinder) {
- this.tree = treeFinder;
- }
- }
- class DialogueSet extends DialogueNode {
- constructor() {
- super(...arguments);
- this.type = NodeType.Set;
- }
- setFunction(code) {
- this.code = code;
- }
- run() {
- return this.code();
- }
- }
- class DialogueTree {
- constructor(id) {
- this.nodes = {};
- this.startNode = undefined;
- this.repeatChoices = true;
- this.id = id;
- }
- addNode(node) {
- this.nodes[node.id] = node;
- if (node.type == NodeType.Node) {
- this.nodes[node.name] = node;
- }
- }
- addStartNode(node) {
- this.addNode(node);
- this.startNode = node;
- }
- getNode(id) {
- return this.nodes[id];
- }
- getNext(node) {
- let next = node.getNext();
- if (next != undefined) {
- return this.getNode(next);
- }
- }
- setRepeatChoices(doIt) {
- this.repeatChoices = doIt;
- }
- async execute(startId) {
- console.debug(Rulebook.getIndentation() + "[DialogueTree] Running " + this.id);
- Rulebook.increaseIndentation(this);
- let node;
- if (startId == undefined) {
- node = this.startNode;
- }
- else {
- node = this.getNode(startId);
- }
- if (node == undefined) {
- Elements.CurrentTurnHandler.printAsError("Unable to start dialogue " + this.id + ": A starting node could not be found.");
- return;
- }
- let previousNode;
- while (node != undefined) {
- let nextNode = await this.processNode(node, previousNode);
- previousNode = node;
- node = nextNode;
- }
- Rulebook.decreaseIndentation();
- }
- async processNode(node, previousNode) {
- console.debug(Rulebook.getIndentation() + "[" + node.type + "] " + node.id);
- Rulebook.increaseIndentation(node);
- let doChoices = node.hasChoices();
- if (node.type == NodeType.Tree) {
- await node.tree().execute();
- }
- else if (node.type == NodeType.Text) {
- let say = node.getSay();
- Elements.CurrentTurnHandler.printAsContent(say);
- }
- else if (node.type == NodeType.Set) {
- let runningSet = node.run();
- if (runningSet instanceof Promise) {
- await runningSet;
- }
- }
- if (doChoices) {
- let branchingDialogue = new BranchingDialogue();
- let choices = node.choices;
- let options = [];
- for (let i = 0; i < choices.length; i++) {
- let choice = this.getNode(choices[i]);
- let branchingOption = new BranchingOption(choice.getSay(), choice.isAvailable());
- options.push(branchingOption);
- branchingDialogue.addOptions(branchingOption);
- }
- let chosenOption = await branchingDialogue.getChosenOption();
- let chosenNodeId = choices[options.indexOf(chosenOption)];
- let chosenNode = this.getNode(chosenNodeId);
- if (this.repeatChoices) {
- let say = new Say(new SayBold(" > ", chosenNode.getSay()));
- this.lastPrintedChoice = await Elements.CurrentTurnHandler.getSayElementsAsContent(say);
- await Elements.CurrentTurnHandler.print(...this.lastPrintedChoice);
- }
- console.debug(Rulebook.getIndentation() + "[Choice] Picked " + chosenNodeId);
- console.debug(Rulebook.getIndentation() + "[Choice] Going to " + chosenNode.getNext());
- Rulebook.increaseIndentation(chosenNodeId);
- Rulebook.decreaseIndentation();
- Rulebook.decreaseIndentation();
- return this.getNext(chosenNode);
- }
- else {
- Rulebook.decreaseIndentation();
- return this.getNext(node);
- }
- }
- unprintLastChoice() {
- Elements.CurrentTurnHandler.unprint(...this.lastPrintedChoice);
- }
- }
- var DialogueTrees;
- (function (DialogueTrees) {
- function findUnusedTrees() {
- let allCode = document.getElementById("appCode").innerHTML;
- let useCount = {};
- let unused = [];
- for (let dialogueName in DialogueTrees) {
- if (dialogueName != "findUnusedTrees") {
- let count = occurrences(allCode, "DialogueTrees." + dialogueName, false) - 1;
- if (count > 0) {
- useCount[dialogueName] = count;
- }
- else {
- unused.push(dialogueName);
- }
- }
- }
- for (let dialogueName in useCount) {
- let times = useCount[dialogueName];
- console.debug("[DialogueUsage] " + dialogueName + " is referenced " + times + (times > 1 ? " times." : " time."));
- }
- for (let i = 0; i < unused.length; i++) {
- console.error("[DialogueUsage] " + unused[i] + " is never referenced and will not appear in-game.");
- }
- }
- DialogueTrees.findUnusedTrees = findUnusedTrees;
- function occurrences(string, subString, allowOverlapping) {
- string += "";
- subString += "";
- if (subString.length <= 0)
- return (string.length + 1);
- var n = 0, pos = 0, step = allowOverlapping ? 1 : subString.length;
- while (true) {
- pos = string.indexOf(subString, pos);
- if (pos >= 0) {
- ++n;
- pos += step;
- }
- else
- break;
- }
- return n;
- }
- })(DialogueTrees || (DialogueTrees = {}));
- class RoomRandom extends Room {
- constructor(id, fodder) {
- super(id, fodder);
- this.connectableOn = [Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST];
- this.randomizable = true;
- this.placed = false;
- this.appearChance = 75;
- this.extraConnectionChance = 75;
- this.backgroundImage = "tomato";
- }
- getBackgroundClass() {
- if (this.isImageDefined()) {
- return this.backgroundImage;
- }
- return "tomato";
- }
- isImageDefined() {
- try {
- for (var i = 0; i < document.styleSheets.length; i++) {
- var rules = document.styleSheets[i]['rules'] || document.styleSheets[i]['cssRules'];
- for (var x in rules) {
- if (typeof rules[x].selectorText == 'string' && rules[x].selectorText == "." + this.backgroundImage) {
- return true;
- }
- }
- }
- return false;
- }
- catch (e) {
- console.warn("Unable to read image");
- return true;
- }
- }
- isConnectableOn(oppositeDirection) {
- return this.connectableOn.indexOf(oppositeDirection) != -1;
- }
- getAnyDirection(options) {
- let directionShuffler = new Shuffler(this.connectableOn);
- for (let direction = directionShuffler.getOne(); direction != undefined; direction = directionShuffler.getOne()) {
- let oppositeDirection = OppositeDirection[Direction[direction]];
- let otherCoordinates = options.map.getCoordinates(options.otherRoom);
- let wouldbeCoordinates = Room.shift(otherCoordinates, oppositeDirection);
- let trickyOptions = {
- otherRoom: options.otherRoom,
- otherRoomDirection: oppositeDirection,
- trickyRoomDirection: direction,
- map: options.map,
- region: options.region,
- x: wouldbeCoordinates[0],
- y: wouldbeCoordinates[1]
- };
- if (this.isPlaceable(trickyOptions)) {
- return trickyOptions;
- }
- }
- }
- isPlaceable(options) {
- if (!this.isConnectableOn(options.trickyRoomDirection) || !options.map.isFree(options.x, options.y)) {
- return false;
- }
- if (options.otherRoom == undefined || !options.otherRoom.isConnectableOn(options.otherRoomDirection)) {
- return false;
- }
- if (this.trickyCode != undefined) {
- return this.trickyCode(options);
- }
- return true;
- }
- getDistanceTo(room) {
- let myCoordinates = this.lastMap.getCoordinates(this);
- let otherCoordinates = this.lastMap.getCoordinates(room);
- if (myCoordinates != undefined && otherCoordinates != undefined) {
- let c1 = myCoordinates;
- let c2 = otherCoordinates;
- return Math.abs(c1[0] - c2[0]) + Math.abs(c1[1] - c2[1]);
- }
- }
- findPathTo(pathEnd, validRoom) {
- validRoom = validRoom == undefined ? () => { return true; } : validRoom;
- let map = this.lastMap;
- let endPosition = map.getCoordinates(pathEnd);
- let open = [];
- let distance = (c1, c2) => {
- return Math.abs(c1[0] - c2[0]) + Math.abs(c1[1] - c2[1]);
- };
- let neighbors = (room, x, y) => {
- let neighs = [];
- for (let direction = 0; direction < room.connections.length; direction++) {
- let otherRoom = room.connections[direction];
- if (otherRoom != undefined && open.indexOf(otherRoom) == -1 && validRoom(otherRoom)) {
- let dirCoordinates = Room.shift([x, y], direction);
- let dir = [otherRoom, dirCoordinates, distance(endPosition, dirCoordinates)];
- neighs.push(dir);
- }
- }
- return neighs.sort((a, b) => { return a[2] - b[2]; });
- };
- let shortestPath = {
- length: map.getRoomCount()
- };
- let noPath = shortestPath;
- let cPath = [];
- let findPath = (myArray) => {
- let room = myArray[0];
- cPath.push(myArray);
- if (room == pathEnd) {
- if (shortestPath.length >= cPath.length) {
- shortestPath = cPath.slice(0);
- }
- }
- else if (shortestPath.length > (cPath.length)) {
- open.push(room);
- let otherRooms = neighbors(room, myArray[1][0], myArray[1][1]);
- for (let i = 0; i < otherRooms.length; i++) {
- if ((cPath.length + 1) < shortestPath.length) {
- findPath(otherRooms[i]);
- }
- }
- open.pop();
- }
- cPath.pop();
- };
- findPath([this, map.getCoordinates(this)]);
- return shortestPath != noPath ? shortestPath : undefined;
- }
- getBestDirectionTo(otherRoom, validRoom) {
- let path = this.findPathTo(otherRoom, validRoom);
- if (path != undefined) {
- if (path.length == 1) {
- return undefined;
- }
- return this.connections.indexOf(path[1][0]);
- }
- }
- getAStarPathTo(otherRoom, validRoom) {
- validRoom = validRoom != undefined ? validRoom : () => { return true; };
- let distance = (c1, c2) => {
- return Math.abs(c1[0] - c2[0]) + Math.abs(c1[1] - c2[1]);
- };
- let isVisited = (room) => {
- return visited.indexOf(room) != -1;
- };
- let getNeighbors = (node) => {
- let neighbors = [];
- for (let direction = 0; direction < node.room.connections.length; direction++) {
- if (node.room.connections[direction] != undefined && !isVisited(node.room.connections[direction]) && validRoom(node.room.connections[direction])) {
- let coordinates = Room.shift(node.coordinates, direction);
- neighbors.push({
- room: node.room.connections[direction],
- coordinates: coordinates,
- distance: distance(coordinates, endNode.coordinates)
- });
- visited.push(node.room.connections[direction]);
- }
- }
- return neighbors;
- };
- let getClosestPath = () => {
- let shortest = 0;
- for (let i = 1; i < open.length; i++) {
- let lastPoint = open[i][open[i].length - 1];
- if (lastPoint.distance < open[shortest][open[shortest].length - 1].distance) {
- shortest = i;
- }
- }
- return shortest;
- };
- let endNode = { room: otherRoom, coordinates: this.lastMap.getCoordinates(otherRoom), distance: 0 };
- let startCoordinates = this.lastMap.getCoordinates(this);
- let startNode = { room: this, coordinates: startCoordinates, distance: distance(startCoordinates, endNode.coordinates) };
- let open = [[startNode]];
- let closed = [];
- let shortestPath = this.lastMap.getRoomCount();
- let shortestIndex;
- let myPath;
- let closest = 0;
- let visited = [this];
- while (open.length > 0) {
- myPath = open.splice(closest, 1)[0];
- if (myPath[myPath.length - 1].distance == 0) {
- let push = closed.push(myPath);
- if (myPath.length < shortestPath) {
- shortestPath = myPath.length;
- shortestIndex = push - 1;
- }
- break;
- }
- else {
- let neighbors = getNeighbors(myPath[myPath.length - 1]);
- for (let i = 0; i < neighbors.length; i++) {
- open.push(myPath.concat([neighbors[i]]));
- }
- }
- for (let i = open.length - 1; i >= 0; i--) {
- if (open[i].length >= shortestPath) {
- open.splice(i, 1);
- }
- }
- closest = getClosestPath();
- }
- return closed[shortestIndex];
- }
- getAStarBestDirectionTo(otherRoom, validRoom) {
- let path = this.getAStarPathTo(otherRoom, validRoom);
- if (path != undefined) {
- if (path.length == 1) {
- return undefined;
- }
- return this.connections.indexOf(path[1].room);
- }
- }
- getConnectedDirection() {
- let shuffler = new Shuffler(Room.DIRECTIONS);
- for (let direction = shuffler.getOne(); direction != undefined; direction = shuffler.getOne()) {
- if (this.connections[direction] != undefined) {
- return direction;
- }
- }
- }
- static getActive(type) {
- }
- }
- class RoomRandomMap {
- constructor() {
- this.positionTable = {};
- this.roomMap = new Map();
- this.lowestX = 0;
- this.lowestY = 0;
- this.highestX = 0;
- this.highestY = 0;
- this.limitsInvalid = false;
- }
- emptyCache() {
- this.availableConnections = [];
- Room.DIRECTIONS.forEach(() => {
- this.availableConnections.push([]);
- });
- this.rooms = 0;
- }
- getAvailableConnections() {
- return this.availableConnections.reduce((previousValue, currentValue, currentIndex, array) => {
- return previousValue + (currentValue.length);
- }, 0);
- }
- removeFromCache(coordinatesToRemove, direction) {
- let directionArray = this.availableConnections[direction];
- for (let k = 0, coordinates = directionArray[k]; coordinates != undefined; coordinates = directionArray[++k]) {
- if (coordinates.x == coordinatesToRemove.x && coordinates.y == coordinatesToRemove.y) {
- directionArray.splice(k, 1);
- return;
- }
- }
- }
- addToCache(coordinatesToAdd, direction) {
- let directionArray = this.availableConnections[direction];
- for (let k = 0, coordinates = directionArray[k]; coordinates != undefined; coordinates = directionArray[++k]) {
- if (coordinates.x == coordinatesToAdd.x && coordinates.y == coordinatesToAdd.y) {
- return;
- }
- }
- directionArray.push(coordinatesToAdd);
- }
- getAnyFromCache(direction) {
- let array = this.availableConnections[direction];
- if (array.length > 0) {
- let randomIndex = Math.floor(Math.random() * (array.length));
- let randomCoordinates = array[randomIndex];
- if (randomCoordinates != undefined) {
- return this.getRoom(randomCoordinates.x, randomCoordinates.y);
- }
- }
- }
- isFree(x, y) {
- return (this.positionTable[x] == undefined || this.positionTable[x][y] === undefined);
- }
- block(x, y) {
- if (this.isFree(x, y)) {
- if (this.positionTable[x] == undefined) {
- this.positionTable[x] = {};
- }
- this.positionTable[x][y] = null;
- this.updateCacheOnPosition(x, y);
- this.updateLimits(x, y);
- }
- }
- updateAllLimits() {
- this.highestX = 0;
- this.highestY = 0;
- this.lowestX = 0;
- this.lowestY = 0;
- for (let x in this.positionTable) {
- for (let y in this.positionTable[x]) {
- if (this.positionTable[x][y] != undefined && this.positionTable[x][y] != null) {
- this.updateLimits(parseInt(x), parseInt(y));
- }
- }
- }
- this.limitsInvalid = false;
- }
- updateLimits(x, y) {
- if (x > this.highestX)
- this.highestX = x;
- if (y > this.highestY)
- this.highestY = y;
- if (y < this.lowestY)
- this.lowestY = y;
- if (x < this.lowestX)
- this.lowestX = x;
- }
- map(room, x, y) {
- if (this.positionTable[x] == undefined) {
- this.positionTable[x] = {};
- }
- this.positionTable[x][y] = room;
- this.roomMap.set(room, [x, y]);
- this.updateCacheOnPosition(x, y);
- this.updateLimits(x, y);
- room.placed = true;
- room.lastMap = this;
- this.rooms++;
- }
- unmap(x, y) {
- if (this.positionTable[x] != undefined && this.positionTable[x][y] != undefined) {
- this.roomMap.delete(this.positionTable[x][y]);
- delete (this.positionTable[x][y]);
- this.rooms--;
- this.updateCacheOnPosition(x, y);
- this.limitsInvalid = true;
- }
- }
- updateCacheOnPosition(x, y) {
- let coordinates = [x, y, 0];
- let coordinatesMap = { x: x, y: y };
- let coordinatesBlocked = !this.isFree(x, y);
- let coordinatesRoom = this.getRoom(x, y);
- Room.DIRECTIONS.forEach(direction => {
- let oppositeDirection = OppositeDirection[Direction[direction]];
- let shifted = Room.shift(coordinates, direction);
- let shiftedMap = { x: shifted[0], y: shifted[1] };
- let shiftedBlocked = !this.isFree(shifted[0], shifted[1]);
- let shiftedRoom = this.getRoom(shifted[0], shifted[1]);
- if (coordinatesRoom != undefined) {
- if (shiftedBlocked) {
- this.removeFromCache(coordinatesMap, direction);
- }
- else if (coordinatesRoom.isConnectableOn(direction)) {
- this.addToCache(coordinatesMap, direction);
- }
- }
- else {
- this.removeFromCache(coordinatesMap, direction);
- }
- if (shiftedRoom != undefined) {
- if (coordinatesBlocked) {
- this.removeFromCache(shiftedMap, oppositeDirection);
- }
- else if (shiftedRoom.isConnectableOn(oppositeDirection)) {
- this.addToCache(shiftedMap, oppositeDirection);
- }
- }
- else {
- this.removeFromCache(shiftedMap, oppositeDirection);
- }
- });
- }
- getRoom(x, y) {
- if (this.positionTable[x] != undefined) {
- if (this.positionTable[x][y] != null) {
- return this.positionTable[x][y];
- }
- }
- return undefined;
- }
- getCoordinates(room) {
- return this.roomMap.get(room);
- }
- getRoomCount() {
- return this.roomMap.size;
- }
- getWidth() {
- return this.highestX - this.lowestX;
- }
- getHeight() {
- return this.highestY - this.lowestY;
- }
- getPreferredGrowth() {
- let ratio = this.getHeight() / this.getWidth();
- let idealRatio = 2.5;
- let difference = Math.abs(ratio - idealRatio);
- if (difference < 0.5) {
- return RoomRandomMap.PREFERRED_GROWTH_ANY;
- }
- else {
- if (ratio < idealRatio) {
- return RoomRandomMap.PREFERRED_GROWTH_VERTICAL;
- }
- else {
- return RoomRandomMap.PREFERRED_GROWTH_HORIZONTAL;
- }
- }
- }
- static isDirectionPreferred(direction, growth) {
- if (growth == RoomRandomMap.PREFERRED_GROWTH_ANY) {
- return true;
- }
- else if (direction == Direction.NORTH || direction == Direction.SOUTH) {
- return growth == RoomRandomMap.PREFERRED_GROWTH_VERTICAL;
- }
- else {
- return growth == RoomRandomMap.PREFERRED_GROWTH_HORIZONTAL;
- }
- }
- }
- RoomRandomMap.PREFERRED_GROWTH_HORIZONTAL = 0;
- RoomRandomMap.PREFERRED_GROWTH_VERTICAL = 1;
- RoomRandomMap.PREFERRED_GROWTH_ANY = 2;
- class ShufflerDirection extends Shuffler {
- constructor(array, preferredGrowth, rng) {
- super(array, rng);
- this.runner = 0;
- this.preferredGrowth = preferredGrowth;
- let goodDirections = [];
- let badDirections = [];
- for (let direction = this.getOne(); direction != undefined; direction = this.getOne()) {
- if (RoomRandomMap.isDirectionPreferred(direction, this.preferredGrowth)) {
- goodDirections.push(direction);
- }
- else {
- badDirections.push(direction);
- }
- }
- this.directionsArray = goodDirections.concat(badDirections);
- }
- getDirection() {
- return this.directionsArray[this.runner++];
- }
- }
- class RoomRandomFodder extends RoomRandom {
- constructor(id) {
- super(id, true);
- }
- }
- class RegionRandom extends Region {
- constructor(name, map) {
- super(name);
- this.randomized = false;
- this.fodderRoomClass = RoomRandomFodder;
- this.placedRooms = [];
- this.map = map == undefined ? new RoomRandomMap() : map;
- }
- async randomize() {
- if (!this.randomized) {
- await RegionRandom.rulebookRandomizeRegion.execute({
- noun: this
- });
- }
- }
- }
- RegionRandom.rng = () => { return Math.random(); };
- RegionRandom.rulebookRandomizeRegion = new Rulebook("Randomizing Random Region something");
- RegionRandom.rulebookPlaceRoom = new Rulebook("Placing Random Room something");
- RegionRandom.rulebookBeforePlaceRoom = new Rulebook("Before placing Random Room something");
- RegionRandom.rulebookAfterPlaceRoom = new Rulebook("After placing Random Room something");
- RegionRandom.ruleFirstRandomizeRegion = RegionRandom.rulebookRandomizeRegion.createAndAddRule({
- name: "Empty map cache to start randomizing region",
- firstPriority: Rule.PRIORITY_HIGHEST,
- code: runner => {
- let region = runner.noun;
- region.map.emptyCache();
- }
- });
- RegionRandom.ruleBasicRandomizeRegion = RegionRandom.rulebookRandomizeRegion.createAndAddRule({
- name: "Randomize all unplaced, randomizable rooms in region something",
- code: async (runner) => {
- let region = runner.noun;
- let roomShuffler = new Shuffler(Region.InRelation.getAllRightTypes(region, RoomRandom).filter((room) => {
- return room.randomizable && !room.placed &&
- (room == WorldState.player.getRoom() || (RegionRandom.rng() * 100) <= room.appearChance);
- }), RegionRandom.rng);
- for (let room = roomShuffler.getOne(); room != undefined; room = roomShuffler.getOne()) {
- while (region.map.rooms > 0 && region.map.getAvailableConnections() < 4) {
- let fodder = new region.fodderRoomClass();
- let options = {
- map: region.map,
- room: fodder,
- region: region
- };
- region.place(fodder);
- await RegionRandom.rulebookBeforePlaceRoom.execute({ noun: options });
- await RegionRandom.rulebookPlaceRoom.execute({ noun: options });
- await RegionRandom.rulebookAfterPlaceRoom.execute({ noun: options });
- }
- let options = {
- map: region.map,
- room: room,
- region: region
- };
- await RegionRandom.rulebookBeforePlaceRoom.execute({ noun: options });
- await RegionRandom.rulebookPlaceRoom.execute({ noun: options });
- await RegionRandom.rulebookAfterPlaceRoom.execute({ noun: options });
- if (!room.placed) {
- Elements.CurrentTurnHandler.printAsError(new Say("Was unable to place room ", room, ". Game might be unplayable."));
- }
- }
- }
- });
- RegionRandom.ruleAddExtraConnections = RegionRandom.rulebookRandomizeRegion.createAndAddRule({
- firstPriority: Rule.PRIORITY_LOWEST,
- name: "Add extra connections to rooms in region",
- code: runner => {
- let region = runner.noun;
- let placedRooms = Region.InRelation.getAllRightTypes(region, RoomRandom).filter((room) => {
- return room.randomizable && room.placed;
- });
- placedRooms.forEach((room) => {
- let myCoordinates = region.map.getCoordinates(room);
- let directionShuffler = new Shuffler(room.connectableOn.slice(0), RegionRandom.rng);
- for (let direction = directionShuffler.getOne(); direction != undefined && (RegionRandom.rng() * 100) <= room.extraConnectionChance; direction = directionShuffler.getOne()) {
- if (room.connections[direction] == undefined) {
- let otherCoordinates = Room.shift(myCoordinates, direction);
- let otherRoom = region.map.getRoom(otherCoordinates[0], otherCoordinates[1]);
- if (otherRoom != undefined && otherRoom.randomizable
- && otherRoom.isConnectableOn(OppositeDirection[Direction[direction]])
- && (RegionRandom.rng() * 100) <= otherRoom.extraConnectionChance) {
- room.mapRoom(otherRoom, direction);
- }
- }
- }
- });
- }
- });
- RegionRandom.rulePlaceFirstRoom = RegionRandom.rulebookPlaceRoom.createAndAddRule({
- name: "Placing First room something",
- firstPriority: Rule.PRIORITY_HIGHEST,
- code: runner => {
- let placingOptions = runner.noun;
- if (placingOptions.map.isFree(0, 0)) {
- placingOptions.map.map(placingOptions.room, 0, 0);
- return true;
- }
- },
- conditions: runner => {
- return runner.noun.map.rooms == 0;
- }
- });
- RegionRandom.rulePlaceNonTrickyRoom = RegionRandom.rulebookPlaceRoom.createAndAddRule({
- name: "Placing non-tricky room something",
- firstPriority: Rule.PRIORITY_HIGH,
- code: runner => {
- let placingOptions = runner.noun;
- let preferredGrowthDirection = placingOptions.map.getPreferredGrowth();
- let directionShuffler = new ShufflerDirection(placingOptions.room.connectableOn, preferredGrowthDirection);
- for (let direction = directionShuffler.getDirection(); direction != undefined; direction = directionShuffler.getDirection()) {
- let oppositeDirection = OppositeDirection[Direction[direction]];
- let connectableRoom = placingOptions.map.getAnyFromCache(oppositeDirection);
- if (connectableRoom != undefined) {
- let otherCoordinates = placingOptions.map.getCoordinates(connectableRoom);
- let myCoordinates = Room.shift(otherCoordinates, oppositeDirection);
- placingOptions.room.mapRoom(connectableRoom, direction);
- placingOptions.map.map(placingOptions.room, myCoordinates[0], myCoordinates[1]);
- return true;
- }
- }
- },
- conditions: runner => {
- return runner.noun.room.trickyCode == undefined;
- }
- });
- RegionRandom.rulePlaceTrickyRoom = RegionRandom.rulebookPlaceRoom.createAndAddRule({
- name: "Placing tricky room something",
- code: runner => {
- let placingOptions = runner.noun;
- let placedRooms = placingOptions.region.getRooms().filter((room) => {
- return room instanceof RoomRandom && room.placed;
- });
- if (placedRooms.length == 0) {
- Elements.CurrentTurnHandler.printAsError("Unable to place room " + placingOptions.room.getPrintedName() + ": There are no rooms to connect to!");
- return false;
- }
- let roomShuffler = new Shuffler(placedRooms, RegionRandom.rng);
- for (let connectableRoom = roomShuffler.getOne(); connectableRoom != undefined; connectableRoom = roomShuffler.getOne()) {
- let trickier = {
- region: placingOptions.region,
- map: placingOptions.map,
- otherRoom: connectableRoom
- };
- let tricky = placingOptions.room.getAnyDirection(trickier);
- if (tricky != undefined) {
- placingOptions.room.mapRoom(connectableRoom, tricky.trickyRoomDirection);
- placingOptions.map.map(placingOptions.room, tricky.x, tricky.y);
- return true;
- }
- }
- let connectableThroughFodder = (fodderStep, connectingRoom) => {
- let trickier = {
- region: placingOptions.region,
- map: placingOptions.map,
- otherRoom: connectingRoom
- };
- if (fodderStep == 0) {
- return placingOptions.room.getAnyDirection(trickier);
- }
- else {
- let newFodder = new (placingOptions.region.fodderRoomClass)();
- let preferredGrowthDirection = placingOptions.map.getPreferredGrowth();
- let directionShuffler = new ShufflerDirection(placingOptions.room.connectableOn, preferredGrowthDirection);
- for (let direction = directionShuffler.getDirection(); direction != undefined; direction = directionShuffler.getDirection()) {
- let oppositeDirection = OppositeDirection[Direction[direction]];
- let otherCoordinates = placingOptions.map.getCoordinates(connectingRoom);
- let wouldbeCoordinates = Room.shift(otherCoordinates, oppositeDirection);
- let fodderTricky = {
- otherRoom: connectingRoom,
- otherRoomDirection: oppositeDirection,
- trickyRoomDirection: direction,
- map: placingOptions.map,
- region: placingOptions.region,
- x: wouldbeCoordinates[0],
- y: wouldbeCoordinates[1]
- };
- if (newFodder.isPlaceable(fodderTricky)) {
- newFodder.mapRoom(connectingRoom, fodderTricky.trickyRoomDirection);
- placingOptions.map.map(newFodder, fodderTricky.x, fodderTricky.y);
- let nextTricky = connectableThroughFodder(fodderStep - 1, newFodder);
- if (nextTricky != undefined) {
- placingOptions.region.place(newFodder);
- return nextTricky;
- }
- else {
- newFodder.unmapRoom(fodderTricky.trickyRoomDirection);
- placingOptions.map.unmap(fodderTricky.x, fodderTricky.y);
- }
- }
- }
- }
- };
- for (let fodderLevel = 1; fodderLevel < 10; fodderLevel++) {
- roomShuffler.restart();
- for (let connectableRoom = roomShuffler.getOne(); connectableRoom != undefined; connectableRoom = roomShuffler.getOne()) {
- let tricky = connectableThroughFodder(fodderLevel, connectableRoom);
- if (tricky != undefined) {
- placingOptions.room.mapRoom(tricky.otherRoom, tricky.trickyRoomDirection);
- placingOptions.map.map(placingOptions.room, tricky.x, tricky.y);
- return true;
- }
- }
- }
- Elements.CurrentTurnHandler.printAsError("Unable to place room " + placingOptions.room.getPrintedName() + ": All attempts failed");
- return false;
- }
- });
- class SavedEvent extends StoredVariable {
- constructor(options) {
- super(options);
- this.description = options.description;
- this.getValueDescription = options.valueDescription;
- }
- getDescription() {
- return this.description;
- }
- }
- let EVENT_ORC_CHIEF_KILLED = new SavedEvent({
- id: "EVENT_ORC_CHIEF_KILLED",
- description: "Describer whether the orc chief is alive or dead.",
- value: false,
- valueDescription: (value) => {
- if (EVENT_ORC_CHIEF_KILLED.value) {
- return "The orc chief has been killed.";
- }
- else {
- return "The orc chief is alive.";
- }
- }
- });
- class Dice {
- constructor(testString) {
- this.range = [0, 0, 1, 1];
- this.minResult = 0;
- this.testString = testString;
- }
- roll(stat) {
- let rng = this.range.slice();
- if (stat >= 10) {
- rng.push(2, 1);
- }
- else if (stat >= 7) {
- rng.push(1, 1);
- }
- else if (stat >= 4) {
- rng.push(1);
- }
- let results = [];
- for (let i = 0; i < stat; i++) {
- let index = Math.floor(Math.random() * (rng.length));
- results.push(rng[index]);
- }
- return results;
- }
- static sum(a, b) {
- return a + b;
- }
- getSay(results) {
- let finalResult = results.reduce(Dice.sum);
- return new Say(new SayBold("[", this.testString, "] "), " = [", results.join("] ["), "]", results.length == 1 ? "" :
- (" = " + finalResult));
- }
- static testAgainstRoll(player, enemy) {
- let playerDice = new Dice(player.name);
- let playerResult = playerDice.roll(player.value);
- let enemyDice = new Dice(enemy.name);
- let enemyResult = enemyDice.roll(enemy.value);
- return playerResult.reduce(Dice.sum) - enemyResult.reduce(Dice.sum);
- }
- static testAgainstDifficulty(player, difficulty) {
- let playerDice = new Dice(player.name);
- let playerResult = playerDice.roll(player.value);
- return playerResult.reduce(Dice.sum) - difficulty;
- }
- }
- class DiceCommon extends Dice {
- constructor() {
- super(...arguments);
- this.range = [-1, 0, 0, 0, 1, 1, 1];
- this.minResult = -1;
- }
- static testAgainstRoll(player, enemy) {
- let playerDice = new DiceCommon(player.name);
- let playerResult = playerDice.roll(player.value);
- let enemyDice = new DiceCommon(enemy.name);
- let enemyResult = enemyDice.roll(enemy.value);
- return playerResult.reduce(Dice.sum) - enemyResult.reduce(Dice.sum);
- }
- static testAgainstDifficulty(player, difficulty) {
- let playerDice = new DiceCommon(player.name);
- let playerResult = playerDice.roll(player.value);
- return playerResult.reduce(Dice.sum) - difficulty;
- }
- }
- class DiceDangerous extends Dice {
- constructor() {
- super(...arguments);
- this.range = [-2, -1, 0, 0, 0, 0, 1, 1, 1, 1];
- this.minResult = -2;
- }
- static testAgainstRoll(player, enemy) {
- let playerDice = new DiceDangerous(player.name);
- let playerResult = playerDice.roll(player.value);
- let enemyDice = new DiceDangerous(enemy.name);
- let enemyResult = enemyDice.roll(enemy.value);
- return playerResult.reduce(Dice.sum) - enemyResult.reduce(Dice.sum);
- }
- static testAgainstDifficulty(player, difficulty) {
- let playerDice = new DiceDangerous(player.name);
- let playerResult = playerDice.roll(player.value);
- return playerResult.reduce(Dice.sum) - difficulty;
- }
- }
- class Liquid extends Thing {
- constructor(options) {
- super(options);
- options = options == undefined ? {} : options;
- if (options.taste != undefined) {
- this.taste = options.taste;
- }
- else {
- this.taste = new OneOf(OneOf.ROTATING_RANDOM, "It goes easily through your throat with no particular taste.", "You taste nothing as it softly slides through your tongue.");
- }
- }
- static async mix(container) {
- let result = await Liquid.rulebookMixing.execute({ noun: container });
- if (result != undefined) {
- let finalQuantity = result.quantityMultiplier != undefined ?
- (result.quantityMultiplier * container.liquidContents.length)
- :
- (container.liquidContents.length);
- container.liquidContents = new Array(finalQuantity);
- for (let i = 0; i < finalQuantity; i++) {
- container.liquidContents[i] = result.result;
- }
- }
- }
- static getMixtures() {
- if (Liquid.sortedMixtures) {
- return Liquid.mixtures;
- }
- Liquid.mixtures.sort((a, b) => {
- if (b.firstPriority < a.firstPriority)
- return -1;
- if (a.firstPriority < b.firstPriority)
- return 1;
- if (b.priority < a.priority)
- return -1;
- if (a.priority < b.priority)
- return 1;
- return 0;
- });
- Liquid.sortedMixtures = true;
- return Liquid.mixtures;
- }
- static addMixture(mixture) {
- Liquid.mixtures.push(mixture);
- Liquid.sortedMixtures = false;
- }
- }
- Liquid.rulebookMixing = new Rulebook("Mixing the liquid contents of something");
- Liquid.mixtures = [];
- Liquid.sortedMixtures = false;
- Liquid.ruleDefaultMixing = Liquid.rulebookMixing.createAndAddRule({
- name: "Mixing through Mixtures",
- code: runner => {
- if (runner.noun.liquidContents.length == 0) {
- return;
- }
- let mixture;
- for (let i = 0; i < Liquid.mixtures.length; i++) {
- mixture = Liquid.mixtures[i];
- let proportions = [];
- let mixtureIterator = mixture.quantities.entries();
- for (let mixtureLiquid = mixtureIterator.next(); !mixtureLiquid.done; mixtureLiquid = mixtureIterator.next()) {
- let mixtureType = mixtureLiquid.value[0];
- let mixtureQuantity = mixtureLiquid.value[1];
- let matchedQuantity = 0;
- runner.noun.liquidContents.forEach((liquidType) => {
- try {
- if (liquidType == mixtureType ||
- (typeof mixtureType == "function" &&
- (liquidType instanceof mixtureType || mixtureType(liquidType)))) {
- matchedQuantity++;
- }
- }
- catch (e) { }
- });
- proportions.push(matchedQuantity / mixtureQuantity);
- }
- if (proportions.every(function (element, index, array) {
- return element === array[0];
- })) {
- return mixture;
- }
- }
- }
- });
- class Scenery extends Thing {
- constructor() {
- super(...arguments);
- this.fixedInPlace = true;
- this.scenery = true;
- }
- }
- class OrcDebugger extends Humanoid {
- constructor() {
- super({
- isMale: true,
- name: (() => {
- let nameMod = OrcDebugger.nameModifier.getOne();
- if (nameMod == undefined) {
- nameMod = (OrcDebugger.counter++).toString();
- }
- return nameMod + " Orc";
- })(),
- unique: true,
- description: "This is one extremely ugly fellow."
- });
- this.AI.wanderer = true;
- this.AI.picksShinies = true;
- }
- }
- OrcDebugger.nameModifier = new Shuffler([
- "Ugly", "Muscular", "Veiny", "Angry", "Sad", "Smart", "Agile", "Short", "Bulging", "Intense", "Smouldering"
- ]);
- OrcDebugger.counter = 1;
- ActionTalk.carry.createAndAddRule({
- name: "Talking to the orc",
- firstPriority: ActionTalk.PRIORITY_GLOBAL_DIALOGUE,
- priority: ActionTalk.PRIORITY_COMMON_DIALOGUE,
- conditions: (runner) => {
- return runner.noun.getNoun(0) instanceof OrcDebugger;
- },
- code: (runner) => {
- let orc = runner.noun.getNoun(0);
- let result = Dice.testAgainstRoll({ name: "Charm + 2", value: WorldState.player.getStat(Attributes.Charm) + 2 }, { name: "Orc's wits + 2", value: orc.getStat(Attributes.Intelligence) + 2 });
- if (result > 0) {
- Elements.CurrentTurnHandler.printAsContent(new Say("You win!"));
- }
- else {
- Elements.CurrentTurnHandler.printAsContent(new Say("You lose."));
- }
- return true;
- }
- });
- class Semen extends Liquid {
- constructor(cummer, options) {
- super(options);
- this.cummer = cummer;
- }
- }
- var rooma = new RoomRandom("Room A");
- rooma.description = new Say("You are inside a box of metal painted blue. Your head almost touches the ceiling, making the room look smaller than it really is.", Say.LINE_BREAK, new SayIf(() => {
- return Thing.InsideRoomRelation.getLeft(vase) == rooma || Thing.InsideRoomRelation.getLeft(urn) == rooma;
- }, " Still, there are some things thrown about."));
- PlayBegins.setStartingRoom(rooma);
- let paddedBra = new Clothing({ name: "Padded Bra", unique: true });
- paddedBra.breastPadding = 3;
- paddedBra.slots = [Humanoid.SLOT_BREASTS];
- let paddedUnderwear = new Clothing({ name: "Padded Underwear", unique: true });
- paddedUnderwear.crotchPadding = 15;
- paddedUnderwear.slots = [Humanoid.SLOT_CROTCH_BACK, Humanoid.SLOT_CROTCH_FRONT];
- let player = WorldState.player;
- WorldState.player = player;
- var vase = new Thing({ name: "Vase" });
- vase.description = new Say("This is an ornamental vase that'd look very nice on your lap. Why? Who knows.");
- rooma.place(vase);
- let mapOfTest = new MapNote({ name: "Map of this Region",
- description: "This is a simple map showing all the rooms here.", unique: true });
- rooma.place(mapOfTest);
- let urn = new Thing({ unique: true, name: "Urn of Dreams", image: "image001" });
- urn.description = new Say("This appears to be a simple, black urn containing the ashes of your dreams.");
- rooma.place(urn);
- var roomb = new RoomRandom("Room B");
- roomb.place(vase);
- let frillyPouch = new CoinPouch({
- name: "Frilly Pouch",
- description: new Say("This is a very gay little pink pouch full of little hearts.")
- });
- frillyPouch.addCoins(502);
- rooma.place(frillyPouch);
- let bigSack = new CoinPouch({ name: "Big Sack" });
- bigSack.addCoins(100);
- rooma.place(bigSack);
- let region = new RegionRandom("Test Region");
- region.place(rooma, roomb);
- for (let i = 1; i < 6; i++) {
- let room = new RoomRandom("Room " + i.toString());
- region.place(room);
- if (Math.random() > 0.5) {
- }
- }
- mapOfTest.addRegion(region);
- let southestRoom = new RoomRandom("Southest Room");
- region.place(southestRoom);
- southestRoom.appearChance = 100;
- southestRoom.backgroundImage = "bloo";
- southestRoom.trickyCode = (options) => {
- let myCoordinates = [options.x, options.y];
- for (let i = 0; i < Room.DIRECTIONS.length; i++) {
- let direction = Room.DIRECTIONS[i];
- if (direction != Direction.NORTH) {
- let coordinates = Room.shift(myCoordinates, direction);
- if (!options.map.isFree(coordinates[0], coordinates[1])) {
- return false;
- }
- coordinates = Room.shift(coordinates, direction);
- if (!options.map.isFree(coordinates[0], coordinates[1])) {
- return false;
- }
- }
- }
- return true;
- };
- RegionRandom.rulebookAfterPlaceRoom.addRule(new Rule({
- name: "After placing the southest room",
- code: runner => {
- let options = runner.noun;
- let myCoordinates = options.map.getCoordinates(options.room);
- if (myCoordinates != undefined) {
- for (let i = 0; i < Room.DIRECTIONS.length; i++) {
- let direction = Room.DIRECTIONS[i];
- if (direction != Direction.NORTH) {
- let coordinates = Room.shift(myCoordinates, direction);
- options.map.block(coordinates[0], coordinates[1]);
- coordinates = Room.shift(coordinates, direction);
- options.map.block(coordinates[0], coordinates[1]);
- }
- }
- }
- },
- conditions: runner => {
- return runner.noun.room == southestRoom;
- }
- }));
- Thing.CarryRelation.setRelation(WorldState.player, mapOfTest);
- PlayBegins.rulebook.addRule(new Rule({
- name: "randomize region",
- firstPriority: Rule.PRIORITY_HIGHEST,
- code: async (runner) => {
- await region.randomize();
- }
- }));
- RegionRandom.rulebookRandomizeRegion.addRule(new Rule({
- name: "Add room A and B to region",
- firstPriority: Rule.PRIORITY_HIGHEST,
- code: async (runner) => {
- await RegionRandom.rulebookPlaceRoom.execute({
- noun: {
- map: region.map,
- room: rooma,
- region: region
- }
- }).then();
- await RegionRandom.rulebookPlaceRoom.execute({
- noun: {
- map: region.map,
- room: roomb,
- region: region
- }
- }).then();
- },
- conditions: runner => {
- return runner.noun == region;
- }
- }));
- function getPath(rooma, roomb) {
- console.debug("The best path from " + rooma.getPrintedName() + " to " + roomb.getPrintedName() + " is:");
- let t0, dir, t1;
- t0 = performance.now();
- dir = rooma.bestDirectionTo(roomb);
- t1 = performance.now();
- if (dir != undefined) {
- console.debug(DirectionNames[Direction[dir]]);
- }
- else {
- console.debug("There is no path.");
- }
- console.debug("Call to doSomething took " + (t1 - t0) + " milliseconds.");
- }
- let wanderRegion = new RegionRandom("OrcableRegion");
- wanderRegion.place(rooma, roomb);
- region.place(wanderRegion);
- let rooms = region.getRooms();
- let shuffler = new Shuffler(rooms);
- for (let i = 0; i < 0; i++) {
- AI.rules.createAndAddRule({
- name: "Pick Shinies",
- firstPriority: AIRules.PRIORITY_ACTING_ON_PLACE,
- conditions: (runner) => {
- let person = runner.noun;
- return person.AI.picksShinies;
- },
- code: (runner) => {
- let person = runner.noun;
- let room = person.getRoom();
- let visibleThings = room.getContainedAndVisibleTo(person);
- if (visibleThings.length > 0) {
- for (let i = 0; i < visibleThings.length; i++) {
- if (!visibleThings[i].fixedInPlace && visibleThings[i].getShiny()) {
- return new ActionTake(person, visibleThings[i]);
- }
- }
- }
- }
- });
- }
- let randomOrc;
- let randomOrc2;
- for (let i = 0; i < 10; i++) {
- let orc = new OrcDebugger();
- randomOrc = orc;
- if (randomOrc2 == undefined) {
- randomOrc2 = orc;
- }
- orc.AI.wanderer = true;
- orc.AI.picksShinies = true;
- orc.AI.wandersOn = wanderRegion;
- let room = new Shuffler(region.getRooms()).getOne();
- room.place(orc);
- }
- var fTarget = new ContentGroup();
- fTarget.addUnit(new FuckingUnit()
- .setFucked(WorldState.player)
- .setFucker(randomOrc)
- .setHole(WorldState.player.getPart(HumanoidVagina))
- .setStick(randomOrc.getPart(HumanoidPenis))
- .addMarker(FuckingState.CUM_START));
- (new FuckingDescription("Specific Orc in Vagina"))
- .setDescription(new Say("Specific Orc in Vagina"))
- .addUnit()
- .setFucker(randomOrc)
- .setHole(WorldState.player.getPart(HumanoidVagina))
- .setStick(randomOrc.getPart(HumanoidPenis));
- (new FuckingDescription("Specific Orc Starts Cumming in Vagina"))
- .setDescription(new Say("Specific Orc Starts Cumming in Vagina"))
- .addUnit()
- .setFucker(randomOrc)
- .setHole(WorldState.player.getPart(HumanoidVagina))
- .addMarker(FuckingState.CUM_START)
- .setStick(randomOrc.getPart(HumanoidPenis));
- var DialogueTrees;
- (function (DialogueTrees) {
- DialogueTrees.CreationIntro = (function () {
- let tree = new DialogueTree("CreationIntro");
- let node;
- let text;
- let set;
- node = new DialogueNode("ae981322-9151-49c8-a889-94455db7c262");
- node.setNext("81582dea-ba27-4baa-8df2-a77fbb5ed9ef");
- tree.addStartNode(node);
- text = new DialogueText("f72bf099-bae2-49df-9433-c9c3ec6a020d");
- text.setSay(() => { return new Say("As you approach the Obelisk, many dreams and nightmares will become reality as it attempts to dissuade you from getting too close, with the intensity increasing the closer you get to your objective.", Say.PARAGRAPH_BREAK, "Ultimately, the Obelisk wishes you no harm, for it is better to have you around as a protector than as a dead enemy, so the Obelisk will attempt to give you exactly what you want deep in your heart, trying to make you completely satisfied so that you no longer wish for the Obelisk's destruction or become unable to continue your quest. Of course, what your heart wants is not necessarily what you think it wants.", Say.PARAGRAPH_BREAK, "Orcs, the most common creature to come out of the Obelisk, are nothing more than humans warped by their own desire for unbridled violence. What will the Obelisk do to you?", Say.PARAGRAPH_BREAK, "On the following screens, you will define who you will be in this story. Please confirm carefully, as there is no turning back."); });
- text.setNext("66d4b27a-ff40-4a8e-a749-2b5e8237695a");
- tree.addNode(text);
- set = new DialogueSet("81582dea-ba27-4baa-8df2-a77fbb5ed9ef");
- set.setFunction(() => { Elements.startMenu(); });
- set.setNext("f72bf099-bae2-49df-9433-c9c3ec6a020d");
- tree.addNode(set);
- set = new DialogueSet("0b4fec87-a2b0-4e3b-81ed-a4150f94fc10");
- set.setFunction(() => { Elements.endMenu(); });
- tree.addNode(set);
- set = new DialogueSet("66d4b27a-ff40-4a8e-a749-2b5e8237695a");
- set.setFunction(() => { return Elements.waitForAnyKey(); });
- set.setNext("0b4fec87-a2b0-4e3b-81ed-a4150f94fc10");
- tree.addNode(set);
- return tree;
- })();
- })(DialogueTrees || (DialogueTrees = {}));
- var CharacterCreation;
- (function (CharacterCreation) {
- CharacterCreation.CreationIntro = CharacterCreation.rulebook.createAndAddRule({
- name: "Show small Intro",
- firstPriority: Rule.PRIORITY_HIGHEST,
- priority: Rule.PRIORITY_HIGHEST,
- code: async () => {
- await DialogueTrees.CreationIntro.execute();
- }
- });
- })(CharacterCreation || (CharacterCreation = {}));
- var CharacterCreation;
- (function (CharacterCreation) {
- let ccDiv = document.createElement("div");
- ccDiv.id = "characterCreation";
- let rightSide = document.createElement("div");
- rightSide.id = "ccRight";
- let leftSide = document.createElement("div");
- leftSide.id = "ccLeft";
- ccDiv.appendChild(leftSide);
- ccDiv.appendChild(rightSide);
- let resolver;
- async function printTable() {
- printOrigin();
- while (leftSide.firstChild)
- leftSide.removeChild(leftSide.firstChild);
- await (new Say(new SayBold("Character Origin:")).getHTMLContent().then(eles => {
- eles.forEach(ele => {
- leftSide.appendChild(ele);
- });
- }));
- let origins = CharacterOrigin.getOrigins();
- for (let i = 0; i < origins.length; i++) {
- let origin = origins[i];
- let say = new Say(origin.name);
- if (origin.id == CharacterCreation.PlayerOrigin.value) {
- say.add(" - SELECTED");
- }
- await (say).getHTML("p", ["choice"]).then(elementArray => {
- Controls.Links.makeCustomLink(elementArray[0], {
- mouseover: () => {
- printOrigin(origin);
- },
- mouseout: () => {
- printOrigin();
- },
- click: () => {
- CharacterCreation.PlayerOrigin.value = origin.id;
- reset();
- }
- });
- Controls.KeyHandler.applyCode(elementArray[0], Controls.KeyHandler.getSecondKeyCode());
- leftSide.appendChild(elementArray[0]);
- });
- }
- }
- function printConfirm() {
- (new Say("Confirm")).getHTML("p", ["choice"]).then(elementArray => {
- elementArray[0].addEventListener("click", () => {
- resolver();
- });
- Controls.KeyHandler.applyCode(elementArray[0], Controls.KeyHandler.getSecondKeyCode());
- Elements.CurrentTurnHandler.print(elementArray[0]);
- });
- }
- function printOrigin(origin) {
- if (origin == undefined) {
- origin = CharacterOrigin.getOrigin(CharacterCreation.PlayerOrigin.value);
- }
- let say = new Say(origin.description);
- if (origin.bonusStats != undefined) {
- say.add(Say.PARAGRAPH_BREAK, origin.bonusStats);
- }
- say.getHTMLContent().then((eles => {
- while (rightSide.firstChild)
- rightSide.removeChild(rightSide.firstChild);
- for (let i = 0; i < eles.length; i++) {
- rightSide.appendChild(eles[i]);
- }
- }));
- }
- function reset() {
- Elements.CurrentTurnHandler.clear();
- Elements.CurrentTurnHandler.print(ccDiv);
- printTable();
- Elements.CurrentTurnHandler.print(document.createElement("br"));
- Elements.CurrentTurnHandler.print(document.createElement("br"));
- printConfirm();
- }
- CharacterCreation.CCOrigin = CharacterCreation.rulebook.createAndAddRule({
- name: "Character Creation - Origin",
- firstPriority: Rule.PRIORITY_MEDIUM,
- priority: Rule.PRIORITY_HIGH,
- code: async () => {
- Elements.startMenu();
- let promise = new Promise(resolve => {
- resolver = resolve;
- });
- reset();
- await promise;
- CharacterCreation.getOrigin().confirmPicked();
- Elements.endMenu();
- }
- });
- })(CharacterCreation || (CharacterCreation = {}));
- var CharacterCreation;
- (function (CharacterCreation) {
- let ccDiv = document.createElement("div");
- ccDiv.id = "characterCreation";
- let rightSide = document.createElement("div");
- rightSide.id = "ccRight";
- let leftSide = document.createElement("div");
- leftSide.id = "ccLeft";
- ccDiv.appendChild(leftSide);
- ccDiv.appendChild(rightSide);
- let resolver;
- async function printTable() {
- while (leftSide.firstChild)
- leftSide.removeChild(leftSide.firstChild);
- await (new Say(new SayBold("Perks (Choose any):")).getHTMLContent().then(eles => {
- eles.forEach(ele => {
- leftSide.appendChild(ele);
- });
- }));
- let perks = Perk.getPerks();
- for (let i = 0; i < perks.length; i++) {
- let perk = perks[i];
- let say = new Say(perk.name);
- if (perk.isEnabled()) {
- if (perk.isForced()) {
- say.add(" (Mandatory)");
- }
- else {
- say.add(" - Selected");
- }
- }
- else if (perk.isForced()) {
- say.add(" (Forbidden)");
- }
- await (say).getHTML("p", ["choice"]).then(elementArray => {
- Controls.Links.makeCustomLink(elementArray[0], {
- mouseover: () => {
- printPerk(perk);
- },
- mouseout: () => {
- emptyPerk();
- },
- click: () => {
- if (!perk.isForced()) {
- perk.value = !perk.value;
- }
- reset();
- }
- });
- Controls.KeyHandler.applyCode(elementArray[0], Controls.KeyHandler.getSecondKeyCode());
- leftSide.appendChild(elementArray[0]);
- });
- }
- }
- function printConfirm() {
- (new Say("Confirm")).getHTML("p", ["choice"]).then(elementArray => {
- elementArray[0].addEventListener("click", () => {
- resolver();
- });
- Controls.KeyHandler.applyCode(elementArray[0], Controls.KeyHandler.getSecondKeyCode());
- Elements.CurrentTurnHandler.print(elementArray[0]);
- });
- }
- function emptyPerk() {
- while (rightSide.firstChild)
- rightSide.removeChild(rightSide.firstChild);
- }
- function printPerk(perk) {
- let say = new Say(perk.description);
- say.getHTMLContent().then((eles => {
- emptyPerk();
- for (let i = 0; i < eles.length; i++) {
- rightSide.appendChild(eles[i]);
- }
- }));
- }
- function reset() {
- Perk.updatePerks();
- Elements.CurrentTurnHandler.clear();
- Elements.CurrentTurnHandler.print(ccDiv);
- printTable();
- Elements.CurrentTurnHandler.print(document.createElement("br"));
- Elements.CurrentTurnHandler.print(document.createElement("br"));
- printConfirm();
- }
- CharacterCreation.CCPerk = CharacterCreation.rulebook.createAndAddRule({
- name: "Character Creation - Origin",
- firstPriority: Rule.PRIORITY_LOW,
- priority: Rule.PRIORITY_HIGH,
- code: async () => {
- Elements.startMenu();
- let promise = new Promise(resolve => {
- resolver = resolve;
- });
- reset();
- await promise;
- let perks = Perk.getPerks();
- perks.forEach(perk => {
- if (perk.isEnabled()) {
- perk.confirmPicked();
- }
- });
- Elements.endMenu();
- }
- });
- })(CharacterCreation || (CharacterCreation = {}));
- var CharacterCreation;
- (function (CharacterCreation) {
- function createRange(options) {
- let valueNode = document.createTextNode(String(options.value));
- let div = document.createElement("div");
- div.classList.add("ccOption");
- if (options.topLabel != undefined) {
- let topLabel = document.createElement("div");
- topLabel.classList.add("ccOptionTopLabel");
- topLabel.appendChild(document.createTextNode(options.topLabel + ":"));
- div.appendChild(topLabel);
- }
- let label = document.createElement("div");
- if (options.showValue != false) {
- label.classList.add("rangeValue");
- if (options.label != undefined) {
- let b = document.createElement("b");
- b.appendChild(document.createTextNode(options.label + ": "));
- label.appendChild(b);
- }
- label.appendChild(valueNode);
- }
- let input = document.createElement("input");
- input.classList.add("ccRange");
- input.type = "range";
- input.min = options.minValue.toString();
- input.max = options.maxValue.toString();
- input.step = options.step.toString();
- input.value = options.value.toString();
- let onChange = () => {
- valueNode.nodeValue = input.value;
- options.onChange(Number(input.value), valueNode, input);
- };
- input.addEventListener("change", onChange);
- let leftButton = document.createElement("a");
- leftButton.classList.add("ccButton");
- leftButton.addEventListener("click", () => {
- input.value = String(Number(input.value) - options.step);
- onChange();
- });
- Controls.KeyHandler.applyCode(leftButton, Controls.KeyHandler.getFirstKeyCode());
- if (options.leftLabel != undefined) {
- leftButton.appendChild(document.createTextNode(options.leftLabel));
- }
- let rightButton = document.createElement("a");
- rightButton.classList.add("ccButton");
- rightButton.addEventListener("click", () => {
- input.value = String(Number(input.value) + options.step);
- onChange();
- });
- Controls.KeyHandler.applyCode(rightButton, Controls.KeyHandler.getFirstKeyCode());
- ;
- if (options.rightLabel != undefined) {
- rightButton.appendChild(document.createTextNode(options.rightLabel));
- }
- div.appendChild(leftButton);
- div.appendChild(input);
- div.appendChild(rightButton);
- div.appendChild(label);
- onChange();
- return div;
- }
- CharacterCreation.CCSexStats = CharacterCreation.rulebook.createAndAddRule({
- name: "Character Creation - Sex and Stats",
- firstPriority: Rule.PRIORITY_HIGH,
- priority: Rule.PRIORITY_HIGH,
- code: () => {
- Elements.startMenu();
- let ccDiv = document.createElement("div");
- ccDiv.id = "characterCreation";
- let ccLeft = document.createElement("div");
- ccLeft.id = "ccLeft";
- ccDiv.appendChild(ccLeft);
- let ccRight = document.createElement("div");
- ccRight.id = "ccRight";
- ccDiv.appendChild(ccRight);
- let onChange = () => {
- (new Say(WorldState.player.description)).getHTMLContent().then((value => {
- while (ccRight.firstChild)
- ccRight.removeChild(ccRight.firstChild);
- value.forEach(val => {
- ccRight.appendChild(val);
- });
- }));
- };
- ccLeft.appendChild(createRange({
- minValue: 0, maxValue: 1, step: 1, value: 0, leftLabel: "Male", rightLabel: "Female", topLabel: "Sex",
- onChange: (value, labelValue, input) => {
- labelValue.nodeValue = (value == 0 ? "Male" : "Female");
- WorldState.player.removeGenderedParts();
- if (value == 0) {
- WorldState.player.addMaleParts();
- }
- else {
- WorldState.player.addFemaleParts();
- }
- let otherInputs = ccDiv.getElementsByTagName("input");
- for (let i = 0; i < otherInputs.length; i++) {
- let otherInput = otherInputs[i];
- if (otherInput != input) {
- otherInput.dispatchEvent(new Event("change"));
- }
- }
- onChange();
- }
- }));
- ccLeft.appendChild(createRange({
- minValue: 0, maxValue: 4, step: 1, value: 2, leftLabel: "Masculine", rightLabel: "Feminine", topLabel: "Gender",
- onChange: (value, labelValue) => {
- let names = ["Masculine", "Somewhat masculine", "Androgynous", "Somewhat feminine", "Feminine"];
- labelValue.nodeValue = names[value];
- let player = WorldState.player;
- let intendedValue;
- if (player.isMale()) {
- let values = [10, 25, 50, 55, 60];
- intendedValue = values[value];
- }
- else {
- let values = [35, 40, 50, 65, 75];
- intendedValue = values[value];
- }
- WorldState.player.setGenderValue(intendedValue);
- WorldState.player.setStat(Attributes.GenderIdentity, intendedValue);
- onChange();
- }
- }));
- let statsHeader = document.createElement("div");
- ccLeft.appendChild(statsHeader);
- statsHeader.classList.add("ccHeader");
- statsHeader.appendChild(document.createTextNode("Stats ("));
- let maxStats = 12;
- let statsRemaining = document.createTextNode("4 points remaining");
- statsHeader.appendChild(statsRemaining);
- statsHeader.appendChild(document.createTextNode(")"));
- let setStat = (attr, value, input) => {
- player.setStat(attr, value);
- let remaining = maxStats
- - player.getStat(Attributes.Strength)
- - player.getStat(Attributes.Agility)
- - player.getStat(Attributes.Intelligence)
- - player.getStat(Attributes.Charm);
- if (remaining < 0) {
- value += remaining;
- remaining = 0;
- input.value = value.toString();
- input.dispatchEvent(new Event("change"));
- return;
- }
- statsRemaining.nodeValue = (remaining == 0 ? "Done" :
- remaining > 1 ? remaining.toString() + " points remaining" :
- remaining.toString() + " point remaining");
- };
- ccLeft.appendChild(createRange({
- minValue: 1, maxValue: 5, step: 1, value: 2, leftLabel: "-", rightLabel: "+", topLabel: "Strength",
- onChange: (value, labelValue, input) => {
- setStat(Attributes.Strength, value, input);
- onChange();
- }
- }));
- ccLeft.appendChild(createRange({
- minValue: 1, maxValue: 5, step: 1, value: 2, leftLabel: "-", rightLabel: "+", topLabel: "Agility",
- onChange: (value, labelValue, input) => {
- setStat(Attributes.Agility, value, input);
- onChange();
- }
- }));
- ccLeft.appendChild(createRange({
- minValue: 1, maxValue: 5, step: 1, value: 2, leftLabel: "-", rightLabel: "+", topLabel: "Charm",
- onChange: (value, labelValue, input) => {
- setStat(Attributes.Charm, value, input);
- onChange();
- }
- }));
- ccLeft.appendChild(createRange({
- minValue: 1, maxValue: 5, step: 1, value: 2, leftLabel: "-", rightLabel: "+", topLabel: "Intelligence",
- onChange: (value, labelValue, input) => {
- setStat(Attributes.Intelligence, value, input);
- onChange();
- }
- }));
- let creationDone = new Promise((resolve) => {
- (new Say("Confirm")).getHTML("p", ["choice"]).then(elementArray => {
- elementArray[0].addEventListener("click", () => {
- Elements.endMenu();
- resolve();
- });
- Controls.KeyHandler.applyCode(elementArray[0], Controls.KeyHandler.getSecondKeyCode());
- Elements.CurrentTurnHandler.print(elementArray[0]);
- });
- });
- Elements.CurrentTurnHandler.print(ccDiv);
- return creationDone;
- }
- });
- })(CharacterCreation || (CharacterCreation = {}));
- var PlayBegins;
- (function (PlayBegins) {
- PlayBegins.LOAD_FAILED = false;
- PlayBegins.CONTINUE_FAILED = false;
- PlayBegins.IntroMenuRule = PlayBegins.rulebook.createAndAddRule({
- name: "Intro Menu Rule",
- firstPriority: Rule.PRIORITY_HIGHEST,
- priority: Rule.PRIORITY_HIGHEST,
- code: async (runner) => {
- await DialogueTrees.IntroMenu.execute();
- }
- });
- })(PlayBegins || (PlayBegins = {}));
- var DialogueTrees;
- (function (DialogueTrees) {
- DialogueTrees.IntroMenu = (function () {
- let tree = new DialogueTree("IntroMenu");
- let node;
- let choice;
- let text;
- let branch;
- let set;
- node = new DialogueNode("b018bb28-4efc-493b-ac37-31634c4e6406");
- node.setNext("f448e718-9d24-4191-9913-ccc36d97c4c0");
- tree.addStartNode(node);
- choice = new DialogueChoice("3b8c8bcb-0ac8-40dc-9f62-4abbde0d0f7f");
- choice.setSay(() => { return new Say("Start Game"); });
- choice.setNext("719e71dd-9989-4015-93af-9fb7096002c1");
- tree.addNode(choice);
- choice = new DialogueChoice("53710087-4002-41b7-b089-cadabedbcafd");
- choice.setSay(() => { return new Say("Load from file"); });
- choice.setNext("f25f6525-dad6-45d7-a391-246c1b02b569");
- tree.addNode(choice);
- choice = new DialogueChoice("b4593a36-ca83-4afc-b01b-e71344ca6e1f");
- choice.setSay(() => { return new Say("Settings"); });
- choice.setNext("d4a379b5-06c9-4fca-a25c-b1a31b6bf93d");
- tree.addNode(choice);
- choice = new DialogueChoice("4c5032a5-5509-4a00-b8c7-788e7ddbf17d");
- choice.setSay(() => { return new Say("About"); });
- choice.setNext("6b3f385b-8283-4635-9c73-e2303d77642d");
- tree.addNode(choice);
- node = new DialogueNode("674841a6-3752-4c81-977d-19e111536203");
- node.setName("2");
- node.setChoices(["3b8c8bcb-0ac8-40dc-9f62-4abbde0d0f7f", "53710087-4002-41b7-b089-cadabedbcafd", "4c5032a5-5509-4a00-b8c7-788e7ddbf17d", "b4593a36-ca83-4afc-b01b-e71344ca6e1f", "a55f46fa-98a9-4dff-9f1c-4f88c18ce8dd"]);
- tree.addNode(node);
- text = new DialogueText("bc32e411-3c54-4747-ad79-506fc5a9d6c9");
- text.setSay(() => { return new Say(Say.CENTERED, new SayImage("introLogo"), Say.LINE_BREAK, new SayItalic("The Obelisk is an adult interactive fiction game set in a post-apocalyptic world ravaged by a magical structure.")); });
- text.setNext("36da9ea6-909c-4c0c-94d1-a17fef44452d");
- tree.addNode(text);
- text = new DialogueText("36da9ea6-909c-4c0c-94d1-a17fef44452d");
- text.setSay(() => { return new Say("A sleek, black obelisk appeared, monsters pouring from it, threatening the world. Many tried to reach the obelisk, only to return changed - monstrous. Civilization was unable to cope with the creatures and humanity soon returned to its old, tribal ways, humans becoming rarer with each passing day. Centuries have passed and technology is now scarce, with people leading simpler lives in small settlements.", Say.PARAGRAPH_BREAK, "You were born in the ashes of the old world, living in isolation as you and your fellow men attempt to stay safe from the evils of The Obelisk. ", Say.PARAGRAPH_BREAK, "Now, fate has decided you must go, reach The Obelisk and destroy it. Will you succeed in stopping it, or will you lose yourself to all the changes it will bring to you?"); });
- text.setNext("674841a6-3752-4c81-977d-19e111536203");
- tree.addNode(text);
- node = new DialogueNode("9f11871f-eebd-4b9a-b3db-ed9be8cf78e7");
- node.setName("1");
- node.setNext("9eeb2100-917d-41fd-b756-6d3b80e92463");
- tree.addNode(node);
- branch = new DialogueBranch("5d1dfb86-abd9-4ad6-bf07-8ced5476e401");
- branch.setVariable(() => { return PlayBegins.LOAD_FAILED; });
- branch.addBranch("415dc32a-1549-429d-9ac4-8cd1b4c92c14", () => { return true; });
- branch.setNext("f82fc177-b4bd-4f06-b7ab-216259e056a5");
- tree.addNode(branch);
- set = new DialogueSet("f82fc177-b4bd-4f06-b7ab-216259e056a5");
- set.setFunction(() => { Elements.endMenu(); });
- tree.addNode(set);
- set = new DialogueSet("9eeb2100-917d-41fd-b756-6d3b80e92463");
- set.setFunction(() => { Elements.clearMainScreen(); });
- set.setNext("bc32e411-3c54-4747-ad79-506fc5a9d6c9");
- tree.addNode(set);
- node = new DialogueNode("415dc32a-1549-429d-9ac4-8cd1b4c92c14");
- node.setNext("1");
- tree.addNode(node);
- set = new DialogueSet("f448e718-9d24-4191-9913-ccc36d97c4c0");
- set.setFunction(() => { Elements.startMenu(); tree.setRepeatChoices(false); });
- set.setNext("9f11871f-eebd-4b9a-b3db-ed9be8cf78e7");
- tree.addNode(set);
- choice = new DialogueChoice("ef9253b9-5c24-46cc-8e2d-5562a1544f07");
- choice.setSay(() => { return new Say(SaveHandler.getSayForSlot(0)); });
- choice.setNext("9594cf06-6062-4952-b378-6aedaafe2951");
- tree.addNode(choice);
- choice = new DialogueChoice("82c512c6-0115-4d72-a413-5728a623f04b");
- choice.setSay(() => { return new Say(SaveHandler.getSayForSlot(1)); });
- choice.setNext("fe95cfb3-b9f5-4b12-83aa-94d26e5bcac0");
- tree.addNode(choice);
- choice = new DialogueChoice("7315835a-4d95-4377-828c-8a4ca7e49f87");
- choice.setSay(() => { return new Say(SaveHandler.getSayForSlot(2)); });
- choice.setNext("dc884974-7bb2-436f-b3a4-cdf8550bd494");
- tree.addNode(choice);
- choice = new DialogueChoice("50afd6f8-87ce-49bf-b689-4819bc5dc8e7");
- choice.setSay(() => { return new Say(SaveHandler.getSayForSlot(3)); });
- choice.setNext("62f5ea88-c6f0-4469-87f2-ea3b37638509");
- tree.addNode(choice);
- choice = new DialogueChoice("d79e9955-f81e-4ac9-8246-a02b0bd49dae");
- choice.setSay(() => { return new Say(SaveHandler.getSayForSlot(4)); });
- choice.setNext("ee4ecd8b-59e2-43a6-8150-8a835d6eeae1");
- tree.addNode(choice);
- node = new DialogueNode("719e71dd-9989-4015-93af-9fb7096002c1");
- node.setName("SlotChoices");
- node.setChoices(["ef9253b9-5c24-46cc-8e2d-5562a1544f07", "82c512c6-0115-4d72-a413-5728a623f04b", "7315835a-4d95-4377-828c-8a4ca7e49f87", "50afd6f8-87ce-49bf-b689-4819bc5dc8e7", "d79e9955-f81e-4ac9-8246-a02b0bd49dae", "9483a087-04d0-48dd-884f-946930771b95", "defe0f4c-4452-40f3-aff1-ba076263fcbc"]);
- tree.addNode(node);
- set = new DialogueSet("9594cf06-6062-4952-b378-6aedaafe2951");
- set.setFunction(() => { SaveHandler.setSlot(0); });
- set.setNext("a6b6b3d2-25ef-41b1-a5b5-25143f1b41f9");
- tree.addNode(set);
- set = new DialogueSet("fe95cfb3-b9f5-4b12-83aa-94d26e5bcac0");
- set.setFunction(() => { SaveHandler.setSlot(1); });
- set.setNext("a6b6b3d2-25ef-41b1-a5b5-25143f1b41f9");
- tree.addNode(set);
- set = new DialogueSet("dc884974-7bb2-436f-b3a4-cdf8550bd494");
- set.setFunction(() => { SaveHandler.setSlot(2); });
- set.setNext("a6b6b3d2-25ef-41b1-a5b5-25143f1b41f9");
- tree.addNode(set);
- set = new DialogueSet("62f5ea88-c6f0-4469-87f2-ea3b37638509");
- set.setFunction(() => { SaveHandler.setSlot(3); });
- set.setNext("a6b6b3d2-25ef-41b1-a5b5-25143f1b41f9");
- tree.addNode(set);
- set = new DialogueSet("ee4ecd8b-59e2-43a6-8150-8a835d6eeae1");
- set.setFunction(() => { SaveHandler.setSlot(4); });
- set.setNext("a6b6b3d2-25ef-41b1-a5b5-25143f1b41f9");
- tree.addNode(set);
- set = new DialogueSet("f25f6525-dad6-45d7-a391-246c1b02b569");
- set.setFunction(() => { return SaveHandler.loadFromFile(); });
- set.setNext("5d1dfb86-abd9-4ad6-bf07-8ced5476e401");
- tree.addNode(set);
- choice = new DialogueChoice("9483a087-04d0-48dd-884f-946930771b95");
- choice.setSay(() => { return new Say("Erase a save"); });
- choice.setConditions(() => { return !SaveHandler.isErasing(); });
- choice.setNext("ee65c84a-021f-44d3-aa34-50235f438c96");
- tree.addNode(choice);
- choice = new DialogueChoice("defe0f4c-4452-40f3-aff1-ba076263fcbc");
- choice.setSay(() => { return new Say("Don't erase my saves!"); });
- choice.setConditions(() => { return SaveHandler.isErasing(); });
- choice.setNext("ee65c84a-021f-44d3-aa34-50235f438c96");
- tree.addNode(choice);
- set = new DialogueSet("ee65c84a-021f-44d3-aa34-50235f438c96");
- set.setFunction(() => { SaveHandler.toggleErasing(); });
- set.setNext("6f15f7d6-4944-4b93-9d47-7046e8ae1f15");
- tree.addNode(set);
- node = new DialogueNode("6f15f7d6-4944-4b93-9d47-7046e8ae1f15");
- node.setNext("SlotChoices");
- tree.addNode(node);
- set = new DialogueSet("915492f1-8fa7-4ddc-9dc0-6b0340f738c8");
- set.setFunction(() => { return SaveHandler.loadFromStorage(); });
- set.setNext("f82fc177-b4bd-4f06-b7ab-216259e056a5");
- tree.addNode(set);
- node = new DialogueNode("d4a379b5-06c9-4fca-a25c-b1a31b6bf93d");
- node.setNext("Settings");
- tree.addNode(node);
- node = new DialogueNode("6b3f385b-8283-4635-9c73-e2303d77642d");
- node.setNext("About");
- tree.addNode(node);
- node = new DialogueNode("b75c038c-654c-4c62-8f49-2f4518f52cff");
- node.setName("Settings");
- node.setNext("d33456b8-72b6-4214-90b3-3eba2442b287");
- tree.addNode(node);
- text = new DialogueText("d33456b8-72b6-4214-90b3-3eba2442b287");
- text.setSay(() => { return new Say("Not implemented."); });
- text.setNext("bc24b446-d6a2-4284-93fb-67ad3598fcd1");
- tree.addNode(text);
- set = new DialogueSet("bc24b446-d6a2-4284-93fb-67ad3598fcd1");
- set.setFunction(() => { return Elements.waitForAnyKey(); });
- set.setNext("81f9d62b-907e-48ae-84fe-78c7cecc4fe3");
- tree.addNode(set);
- node = new DialogueNode("81f9d62b-907e-48ae-84fe-78c7cecc4fe3");
- node.setNext("1");
- tree.addNode(node);
- node = new DialogueNode("c342e112-5c73-4c82-8882-47ca3a71c914");
- node.setName("About");
- node.setNext("d33456b8-72b6-4214-90b3-3eba2442b287");
- tree.addNode(node);
- choice = new DialogueChoice("a55f46fa-98a9-4dff-9f1c-4f88c18ce8dd");
- choice.setSay(() => { return new Say("Note about content (Spoiler Alert)"); });
- choice.setNext("7c2060aa-66ce-4dbb-88d2-0c8f190e0a6c");
- tree.addNode(choice);
- text = new DialogueText("59a3cb30-d4ba-4b46-8157-b900fc7022dd");
- text.setSay(() => { return new Say(Say.CENTERED, new SayImage("introLogo"), Say.LINE_BREAK, new SayItalic("The Obelisk is an adult interactive fiction game set in a post-apocalyptic world ravaged by a magical structure.")); });
- text.setNext("1b8bdc9d-a4bf-40aa-a382-f7813c158840");
- tree.addNode(text);
- set = new DialogueSet("c27829b7-7199-4b1e-9334-536258546cfc");
- set.setFunction(() => { return Elements.waitForAnyKey(); });
- set.setNext("42401145-9154-40c3-a9d3-4f83df97b89e");
- tree.addNode(set);
- node = new DialogueNode("42401145-9154-40c3-a9d3-4f83df97b89e");
- node.setNext("1");
- tree.addNode(node);
- set = new DialogueSet("7c2060aa-66ce-4dbb-88d2-0c8f190e0a6c");
- set.setFunction(() => { Elements.clearMainScreen(); });
- set.setNext("59a3cb30-d4ba-4b46-8157-b900fc7022dd");
- tree.addNode(set);
- text = new DialogueText("1b8bdc9d-a4bf-40aa-a382-f7813c158840");
- text.setSay(() => { return new Say("In this story, the Obelisk will attempt to give the player exactly what the player wants, but that's not always what the player thinks they want. This is a pornographic game first and a roleplaying game second, which means that it is assumed that the player character wants sex - even if they don't act like it.", Say.PARAGRAPH_BREAK, "Therefore, this game will \"fit\" for players who go in with that mentality, but it ", new SayBold("will"), " look differently for players with a different point of view for their characters. While roleplaying is encouraged, that is not how the game was written, so if you're playing it that way, it's just your choice.", Say.PARAGRAPH_BREAK, "There is no sex without explicit consent from the NPCs: implicit consent is only used for the player character, because that's part of the story. It is possible to remove the player's consent, thereby having no unwanted sex scenes occur, by setting up the content options, which will disable content without explicit consent (i.e. disabling M/M Sex Scenes means this kind of thing will only happen if you actively ask an NPC for it).", Say.PARAGRAPH_BREAK, "While the content options are there to tailor your experience, the game is made with \"all content is available\" in mind, which might result in a playthrough that's not much fun if you disable too many things. Still, that's your choice. Game on."); });
- text.setNext("c27829b7-7199-4b1e-9334-536258546cfc");
- tree.addNode(text);
- branch = new DialogueBranch("a6b6b3d2-25ef-41b1-a5b5-25143f1b41f9");
- branch.setVariable(() => { return SaveHandler.isVirgin(); });
- branch.addBranch("d0dcd7c6-26ae-41d0-99a6-e0cae17ae381", () => { return true; });
- branch.setNext("915492f1-8fa7-4ddc-9dc0-6b0340f738c8");
- tree.addNode(branch);
- text = new DialogueText("b8ee6702-8d38-4bd7-9b24-df8c901a50d4");
- text.setSay(() => { return new Say(new SayBold("A note on saves: "), "The selected slot will be saved to browser storage, so it will be deleted if the browser ever decides to delete it. The game will write to that save slot every turn, so you don't need to worry about that. Alternatively, you can manually save in-game, which will save to a file."); });
- text.setNext("50876e13-23b9-43c0-b6b1-a89b1683d5e7");
- tree.addNode(text);
- set = new DialogueSet("50876e13-23b9-43c0-b6b1-a89b1683d5e7");
- set.setFunction(() => { return Elements.waitForAnyKey(); });
- set.setNext("915492f1-8fa7-4ddc-9dc0-6b0340f738c8");
- tree.addNode(set);
- set = new DialogueSet("d0dcd7c6-26ae-41d0-99a6-e0cae17ae381");
- set.setFunction(() => { Elements.clearMainScreen(); });
- set.setNext("b8ee6702-8d38-4bd7-9b24-df8c901a50d4");
- tree.addNode(set);
- return tree;
- })();
- })(DialogueTrees || (DialogueTrees = {}));
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXBwbGljYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9hcHAvRnVuY3Rpb25zLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvU2F2ZS9TdG9yZWRWYXJpYWJsZS50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL1J1bGVib29rLnRzIiwiLi4vYXBwL1dvcmxkL1NldHRpbmdzLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvUnVsZS50cyIsIi4uL2FwcC9Xb3JsZC9UdXJuU2VxdWVuY2UudHMiLCIuLi9hcHAvVmVyc2lvbi50cyIsIi4uL2FwcC9Db250cm9scy9Nb2R1bGVzL01lbW9yeS50cyIsIi4uL2FwcC9Db250cm9scy9DbGFzc2VzL1N0b3JlZE1lbW9yeS50cyIsIi4uL2FwcC9TYXZlSGFuZGxlci50cyIsIi4uL2FwcC9DaGFyYWN0ZXJDcmVhdGlvbi9DaGFyYWN0ZXJPcmlnaW4udHMiLCIuLi9hcHAvQ2hhcmFjdGVyQ3JlYXRpb24vT3JpZ2lucy9DaGFtcGlvbk9yaWdpbi50cyIsIi4uL2FwcC9DaGFyYWN0ZXJDcmVhdGlvbi9DaGFyYWN0ZXJDcmVhdGlvbi50cyIsIi4uL2FwcC9DaGFyYWN0ZXJDcmVhdGlvbi9QZXJrLnRzIiwiLi4vYXBwL0VsZW1lbnRzL0NsYXNzZXMvU2F5L09uZU9mLnRzIiwiLi4vYXBwL0NvbnRyb2xzL0NvbnRyb2xzLnRzIiwiLi4vYXBwL1dvcmxkL01hY2hpbmVCZWdpbnMudHMiLCIuLi9hcHAvRWxlbWVudHMvRWxlbWVudHMudHMiLCIuLi9hcHAvQ29udHJvbHMvTW9kdWxlcy9LZXlIYW5kbGVyLnRzIiwiLi4vYXBwL0VsZW1lbnRzL0NsYXNzZXMvU2F5L1NheUltYWdlLnRzIiwiLi4vYXBwL0VsZW1lbnRzL0NsYXNzZXMvU2F5LnRzIiwiLi4vYXBwL0NoYXJhY3RlckNyZWF0aW9uL09yaWdpbnMvRmFsc2VseUFjY3VzZWQudHMiLCIuLi9hcHAvQ2hhcmFjdGVyQ3JlYXRpb24vUGVya3MvSG9ybnlWaXJnaW4udHMiLCIuLi9hcHAvQ29udHJvbHMvTW9kdWxlcy9Db250ZW50SGFuZGxlci50cyIsIi4uL2FwcC9Db250cm9scy9DbGFzc2VzL0NvbnRlbnRUeXBlLnRzIiwiLi4vYXBwL0VsZW1lbnRzL01vZHVsZXMvQ3VycmVudFR1cm5IYW5kbGVyLnRzIiwiLi4vYXBwL0NvbnRyb2xzL01vZHVsZXMvTGlua3MudHMiLCIuLi9hcHAvRWxlbWVudHMvQ2xhc3Nlcy9Sb29tTm9kZS50cyIsIi4uL2FwcC9FbGVtZW50cy9DbGFzc2VzL1NheS9TYXlBbi50cyIsIi4uL2FwcC9FbGVtZW50cy9DbGFzc2VzL1NheS9TYXlCb2xkLnRzIiwiLi4vYXBwL0VsZW1lbnRzL0NsYXNzZXMvU2F5L1NheUhlU2hlSXQudHMiLCIuLi9hcHAvRWxlbWVudHMvQ2xhc3Nlcy9TYXkvU2F5SGltSGVySXQudHMiLCIuLi9hcHAvRWxlbWVudHMvQ2xhc3Nlcy9TYXkvU2F5SGlzSGVyc0l0cy50cyIsIi4uL2FwcC9FbGVtZW50cy9DbGFzc2VzL1NheS9TYXlJZi50cyIsIi4uL2FwcC9FbGVtZW50cy9DbGFzc2VzL1NheS9TYXlJdGFsaWMudHMiLCIuLi9hcHAvRWxlbWVudHMvQ2xhc3Nlcy9TYXkvU2F5TGVmdFJpZ2h0LnRzIiwiLi4vYXBwL0VsZW1lbnRzL0NsYXNzZXMvU2F5L1NheUxpbmsudHMiLCIuLi9hcHAvRWxlbWVudHMvQ2xhc3Nlcy9TYXkvU2F5VGhlLnRzIiwiLi4vYXBwL0VsZW1lbnRzL01vZHVsZXMvQXBwZWFyYW5jZUhhbmRsZXIudHMiLCIuLi9hcHAvRWxlbWVudHMvTW9kdWxlcy9Gb250U2l6ZS50cyIsIi4uL2FwcC9FbGVtZW50cy9Nb2R1bGVzL0Z1bGxzY3JlZW4udHMiLCIuLi9hcHAvRWxlbWVudHMvTW9kdWxlcy9Ib3ZlckluZm8udHMiLCIuLi9hcHAvRWxlbWVudHMvTW9kdWxlcy9IeXBlcmxpbmtIYW5kbGVyLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvQWN0aW9uLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvQWN0aW9uL0FjdGlvbkV4YW1pbmUudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9SZWxhdGlvbi50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL1JlbGF0aW9ucy9SZWxhdGlvbk9uZVRvTWFueS50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL1RoaW5nLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvQWN0aW9uL0FjdGlvblRha2UudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9BY3Rpb24vQWN0aW9uR28udHMiLCIuLi9hcHAvRWxlbWVudHMvTW9kdWxlcy9Sb29tSGFuZGxlci50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL1RoaW5ncy9Db2luUG91Y2gudHMiLCIuLi9hcHAvRWxlbWVudHMvTW9kdWxlcy9JbnZlbnRvcnlIYW5kbGVyLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvQWN0aW9uL0FjdGlvblJldHJhY2UudHMiLCIuLi9hcHAvRWxlbWVudHMvTW9kdWxlcy9SZW1lbWJlcmVkSGFuZGxlci50cyIsIi4uL2FwcC9FbGVtZW50cy9Nb2R1bGVzL1N0YXR1c0xpbmVIYW5kbGVyLnRzIiwiLi4vYXBwL1dvcmxkL0RlYnVnLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvQUkudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9UaGluZ3MvUGVyc29uL1BlcnNvblN0YXQudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9UaGluZ3MvUGVyc29uL0F0dHJpYnV0ZS50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL1RoaW5ncy9QZXJzb24vU2tpbGwudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9Db250YWluZXIvQ29udGFpbmVyLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvQ29udGFpbmVyL0NvcnBzZS50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL1RoaW5ncy9QZXJzb24udHMiLCIuLi9hcHAvV29ybGQvRXZlcnlUdXJuLnRzIiwiLi4vYXBwL1dvcmxkL0Z1Y2tpbmcudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9Sb29tLnRzIiwiLi4vYXBwL1dvcmxkL091dE9mUGxheS50cyIsIi4uL2FwcC9Xb3JsZC9QbGF5QmVnaW5zLnRzIiwiLi4vYXBwL1dvcmxkL1Rlc3RzLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvVGhpbmdzL01hcE5vdGUudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9UaGluZ3MvQm9keXBhcnQudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9UaGluZ3MvQm9keXBhcnQvU2V4U3RpY2sudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9UaGluZ3MvQm9keXBhcnQvU2V4SG9sZS50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL01lYXN1cmUudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9UaGluZ3MvQm9keXBhcnQvSHVtYW5vaWQvSHVtYW5vaWRBcm1zLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvVGhpbmdzL0JvZHlwYXJ0L0h1bWFub2lkL0h1bWFub2lkQnJlYXN0cy50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL1RoaW5ncy9Cb2R5cGFydC9IdW1hbm9pZC9IdW1hbm9pZEJ1dHQudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9UaGluZ3MvQm9keXBhcnQvSHVtYW5vaWQvSHVtYW5vaWRFeHRyZW1pdHkudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9UaGluZ3MvQm9keXBhcnQvSHVtYW5vaWQvSHVtYW5vaWRGZWV0LnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvVGhpbmdzL0JvZHlwYXJ0L0h1bWFub2lkL0h1bWFub2lkSGFuZHMudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9UaGluZ3MvQm9keXBhcnQvSHVtYW5vaWQvSHVtYW5vaWRIZWFkLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvVGhpbmdzL0JvZHlwYXJ0L0h1bWFub2lkL0h1bWFub2lkUGVuaXMudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9UaGluZ3MvQm9keXBhcnQvSHVtYW5vaWQvSHVtYW5vaWRTa2luLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvVGhpbmdzL0JvZHlwYXJ0L0h1bWFub2lkL0h1bWFub2lkVGVzdGljbGVzLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvVGhpbmdzL0JvZHlwYXJ0L0h1bWFub2lkL0h1bWFub2lkVmFnaW5hLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvVGhpbmdzL0JvZHlwYXJ0L0h1bWFub2lkL0h1bWFub2lkVG9yc28udHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9UaGluZ3MvQm9keXBhcnQvSHVtYW5vaWRQYXJ0cy50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL1RoaW5ncy9DbG90aGluZy50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL0FjdGlvbi9BY3Rpb25SZW1vdmUudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9BY3Rpb24vQWN0aW9uV2Vhci50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL1RoaW5ncy9IdW1hbm9pZC9IdW1hbm9pZC50cyIsIi4uL2FwcC9Xb3JsZC9Xb3JsZFN0YXRlLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvUmVnaW9uLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvU2h1ZmZsZXIudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9BSS9BSVBpY2tTaGlueS50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL0FJL0FJV2FuZGVyLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvQWN0aW9uL0FjdGlvbkRyb3AudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9BY3Rpb24vQWN0aW9uSW52ZW50b3J5LnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvQWN0aW9uL0FjdGlvblNhdmVHYW1lLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvQWN0aW9uL0FjdGlvblRhbGsudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9BY3Rpb24vQWN0aW9uV2FpdC50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL0NvbnRlbnRQaWNrZXIvQ29udGVudERlc2NyaXB0aW9uLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvQ29udGVudFBpY2tlci9Db250ZW50RGlmZmVyZW50aWFsLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvQ29udGVudFBpY2tlci9Db250ZW50R3JvdXAudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9Db250ZW50UGlja2VyL0NvbnRlbnRNYXJrZXIudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9Db250ZW50UGlja2VyL0NvbnRlbnRVbml0LnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvQ29udGVudFBpY2tlci9Db21iYXQvQ29tYmF0TWFya2VyLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvQ29udGVudFBpY2tlci9Db21iYXQvQ29tYmF0VW5pdC50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL0NvbnRlbnRQaWNrZXIvRnVja2luZy9GdWNraW5nRGVzY3JpcHRpb24udHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9Db250ZW50UGlja2VyL0Z1Y2tpbmcvRnVja2luZ01hcmtlci50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL0NvbnRlbnRQaWNrZXIvRnVja2luZy9GdWNraW5nVW5pdC50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL0RpYWxvZ3VlL0JyYW5jaGluZ09wdGlvbnMudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9EaWFsb2d1ZS9EaWFsb2d1ZU5vZGUudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9EaWFsb2d1ZS9EaWFsb2d1ZUJyYW5jaC50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL0RpYWxvZ3VlL0RpYWxvZ3VlVGV4dC50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL0RpYWxvZ3VlL0RpYWxvZ3VlQ2hvaWNlLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvRGlhbG9ndWUvRGlhbG9ndWVOb2RlVHJlZS50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL0RpYWxvZ3VlL0RpYWxvZ3VlU2V0LnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvRGlhbG9ndWUvRGlhbG9ndWVUcmVlLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvRGlhbG9ndWUvRGlhbG9ndWVUcmVlcy50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL1JhbmRvbUR1bmdlb25zL1Jvb21SYW5kb20udHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9SYW5kb21EdW5nZW9ucy9Sb29tUmFuZG9tTWFwLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvUmFuZG9tRHVuZ2VvbnMvU2h1ZmZsZXJEaXJlY3Rpb24udHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9SYW5kb21EdW5nZW9ucy9Sb29tUmFuZG9tRm9kZGVyLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvUmFuZG9tRHVuZ2VvbnMvUmVnaW9uUmFuZG9tLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvU2F2ZS9TYXZlZEV2ZW50LnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvVGVzdHMvRGljZS50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL1Rlc3RzL0RpY2VDb21tb24udHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9UZXN0cy9EaWNlRGFuZ2Vyb3VzLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvVGhpbmdzL0xpcXVpZC50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL1RoaW5ncy9TY2VuZXJ5LnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvVGhpbmdzL0h1bWFub2lkL09yYy9PcmNEZWJ1Z2dlci50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL1RoaW5ncy9MaXF1aWRzL1NlbWVuLnRzIiwiLi4vY29udGVudC9tYWluLnRzIiwiLi4vY29udGVudC9DaGFyYWN0ZXJDcmVhdGlvbi9EaWFsb2d1ZS9DcmVhdGlvbkludHJvLmRsLnRzIiwiLi4vY29udGVudC9DaGFyYWN0ZXJDcmVhdGlvbi9EaWFsb2d1ZXMudHMiLCIuLi9jb250ZW50L0NoYXJhY3RlckNyZWF0aW9uL09yaWdpbi50cyIsIi4uL2NvbnRlbnQvQ2hhcmFjdGVyQ3JlYXRpb24vUGVya3MudHMiLCIuLi9jb250ZW50L0NoYXJhY3RlckNyZWF0aW9uL1NleFN0YXRzLnRzIiwiLi4vY29udGVudC9QbGF5QmVnaW5zL0ludHJvTWVudS50cyIsIi4uL2NvbnRlbnQvUGxheUJlZ2lucy9EaWFsb2d1ZS9JbnRyb01lbnUuZGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsU0FBUyxXQUFXLENBQUMsQ0FBYztJQUMvQixLQUFJLElBQUksQ0FBQyxHQUFDLENBQUMsRUFBRSxDQUFDLEdBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtRQUMxQixLQUFJLElBQUksQ0FBQyxHQUFDLENBQUMsR0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDNUIsSUFBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDWixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3hCO0tBQ0o7SUFDRCxPQUFPLENBQUMsQ0FBQztBQUNiLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLENBQWM7SUFDdkMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNkLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNmLE9BQU8sQ0FBQyxDQUFDO0FBQ2IsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFFLENBQWM7SUFDakMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDL0IsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pELElBQUksSUFBSSxHQUFHLENBQUMs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RSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUM7UUFDakQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFHbEIsR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDOUQsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUM7UUFDakQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFHbEIsR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDOUQsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUM7UUFDakQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFHbEIsR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDOUQsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUM7UUFDakQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFHbEIsR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDOUQsR0FBRyxDQUFDLFdBQVcsQ0FBQyxH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TWFrZXMgdGhlIGFycmF5IGEgaGF2ZSB1bmlxdWUgZWxlbWVudHMuXHJcbiAqIFdBUk5JTkc6IFdJTEwgQUxURVIgVEhFIEFSUkFZIEdJVkVOXHJcbiAqIEBwYXJhbSBhXHJcbiAqL1xyXG5mdW5jdGlvbiBhcnJheVVuaXF1ZShhIDogQXJyYXk8YW55Pikge1xyXG4gICAgZm9yKHZhciBpPTA7IGk8YS5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgIGZvcih2YXIgaj1pKzE7IGo8YS5sZW5ndGg7ICsraikge1xyXG4gICAgICAgICAgICBpZihhW2ldID09PSBhW2pdKVxyXG4gICAgICAgICAgICAgICAgYS5zcGxpY2Uoai0tLCAxKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYTtcclxufVxyXG5cclxuZnVuY3Rpb24gYXJyYXlVbmlxdWVOZXdBcnJheShhIDogQXJyYXk8YW55Pikge1xyXG4gICAgYSA9IGEuc2xpY2UoKTtcclxuICAgIGFycmF5VW5pcXVlKGEpO1xyXG4gICAgcmV0dXJuIGE7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFycmF5U2h1ZmZsZSAoYSA6IEFycmF5PGFueT4pIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBwb3MgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoYS5sZW5ndGggLSBpKSkgKyBpO1xyXG4gICAgICAgIGxldCB0ZW1wID0gYVtpXTtcclxuICAgICAgICBhW2ldID0gYVtwb3NdO1xyXG4gICAgICAgIGFbcG9zXSA9IHRlbXA7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFycmF5U2h1ZmZsZU5ld0FycmF5IChhIDogQXJyYXk8YW55Pikge1xyXG4gICAgbGV0IG5BID0gYS5zbGljZSgpO1xyXG4gICAgYXJyYXlTaHVmZmxlKG5BKTtcclxuICAgIHJldHVybiBuQTtcclxufSIsImludGVyZmFjZSBTdG9yZWRWYXJpYWJsZU9wdGlvbnM8VD4ge1xyXG4gICAgaWQgOiBzdHJpbmc7XHJcbiAgICB2YWx1ZSA6IFQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTdG9yZWRWYXJpYWJsZXMgYXJlIHRoZSBvbmx5IHRoaW5nIHRoYXQgZ2V0cyBzdG9yZWQgb24gYSBTYXZlL1JlbG9hZC5cclxuICogSXQncyBvbmx5IGFsbG93ZWQgdG8gaGF2ZSBTdG9yZWRWYXJpYWJsZXMgdGhhdCBhcmUgZWl0aGVyIHByaW1pdGl2ZSBvciBzaW1wbGUgb2JqZWN0cy5cclxuICovXHJcbmNsYXNzIFN0b3JlZFZhcmlhYmxlPFQ+IHtcclxuICAgIHB1YmxpYyBpZCA6IHN0cmluZztcclxuICAgIHB1YmxpYyB2YWx1ZSA6IFQ7XHJcbiAgICBwdWJsaWMgZGVmVmFsdWUgOiBUO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAob3B0aW9ucyA6IFN0b3JlZFZhcmlhYmxlT3B0aW9uczxUPikge1xyXG4gICAgICAgIHRoaXMuaWQgPSBvcHRpb25zLmlkO1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSBvcHRpb25zLnZhbHVlO1xyXG4gICAgICAgIHRoaXMuZGVmVmFsdWUgPSB0aGlzLnZhbHVlO1xyXG5cclxuICAgICAgICBTdG9yZWRWYXJpYWJsZS5yZWdpc3RlclZhcmlhYmxlKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZXNldCAoKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuZGVmVmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZUZyb21PYmplY3QgKG9iaiA6IFQpIHtcclxuICAgICAgICB0aGlzLnZhbHVlID0gb2JqO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBleHBvcnRBc09iamVjdCAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgc3RvcmVkVmFyaWFibGVzIDoge1tpZCA6IHN0cmluZ10gOiBTdG9yZWRWYXJpYWJsZTxhbnk+fSA9IHt9O1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVnaXN0ZXJWYXJpYWJsZSAodmFyaWFibGUgOiBTdG9yZWRWYXJpYWJsZTxhbnk+KSB7XHJcbiAgICAgICAgaWYgKFN0b3JlZFZhcmlhYmxlLnN0b3JlZFZhcmlhYmxlc1t2YXJpYWJsZS5pZF0gPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIFN0b3JlZFZhcmlhYmxlLnN0b3JlZFZhcmlhYmxlc1t2YXJpYWJsZS5pZF0gPSB2YXJpYWJsZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJbU3RvcmVkVmFyaWFibGVdIFwiICsgdmFyaWFibGUuaWQgKyBcIiBhbHJlYWR5IGRlZmluZWQuIElnbm9yaW5nOlwiLCB2YXJpYWJsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VmFyaWFibGUgKGlkIDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIFN0b3JlZFZhcmlhYmxlLnN0b3JlZFZhcmlhYmxlc1tpZF07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRWYXJpYWJsZXMgKCkgOiBBcnJheTxTdG9yZWRWYXJpYWJsZTxhbnk+PntcclxuICAgICAgICBsZXQgbGlzdCA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGtleSBpbiBTdG9yZWRWYXJpYWJsZS5zdG9yZWRWYXJpYWJsZXMpIHtcclxuICAgICAgICAgICAgbGlzdC5wdXNoKFN0b3JlZFZhcmlhYmxlLnN0b3JlZFZhcmlhYmxlc1trZXldKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGxpc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBleHBvcnRBc09iamVjdCAoKSA6IHtbaWQgOiBzdHJpbmddIDogYW55fSB7XHJcbiAgICAgICAgbGV0IGxpc3QgPSB7fTtcclxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gU3RvcmVkVmFyaWFibGUuc3RvcmVkVmFyaWFibGVzKSB7XHJcbiAgICAgICAgICAgIGxpc3Rba2V5XSA9IFN0b3JlZFZhcmlhYmxlLnN0b3JlZFZhcmlhYmxlc1trZXldLnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbGlzdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHVwZGF0ZUZyb21PYmplY3QgKG9iaiA6IHtbaWQgOiBzdHJpbmddIDogYW55fSkge1xyXG4gICAgICAgIGZvciAobGV0IGtleSBpbiBTdG9yZWRWYXJpYWJsZS5zdG9yZWRWYXJpYWJsZXMpIHtcclxuICAgICAgICAgICAgaWYgKG9ialtrZXldICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgU3RvcmVkVmFyaWFibGUuc3RvcmVkVmFyaWFibGVzW2tleV0udXBkYXRlRnJvbU9iamVjdChvYmpba2V5XSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBTdG9yZWRWYXJpYWJsZS5zdG9yZWRWYXJpYWJsZXNba2V5XS5yZXNldCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL0Z1bmN0aW9ucy50c1wiIC8+XHJcbmludGVyZmFjZSBSdWxlYm9va09wdGlvbnM8VD4ge1xyXG4gICAgbm91bj8gOiBUO1xyXG59XHJcblxyXG4vKipcclxuICogV2l0aG91dCB0aGUgUnVubmVyLCBSdWxlYm9va3Mgd2VyZSBub3QgXCJ0aHJlYWQtc2FmZVwiLCBzbyB3ZSBuZWVkIHRoZSBydW5uZXIuXHJcbiAqL1xyXG5jbGFzcyBSdWxlYm9va1J1bm5lcjxUPiB7XHJcbiAgICBwdWJsaWMgbm91biA6IFQ7XHJcbiAgICBwcml2YXRlIHJ1bGVzVG9FeGVjdXRlIDogQXJyYXk8UnVsZT4gPSBbXTtcclxuICAgIHB1YmxpYyBydWxlYm9vayA6IFJ1bGVib29rPFQ+O1xyXG4gICAgcHVibGljIHJ1bGUgOiBSdWxlO1xyXG4gICAgcHJpdmF0ZSBydWxlUnVubmVyIDogbnVtYmVyID0gLTE7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChydWxlYm9vayA6IFJ1bGVib29rPFQ+LCBub3VuIDogVCkge1xyXG4gICAgICAgIHRoaXMucnVsZWJvb2sgPSBydWxlYm9vaztcclxuICAgICAgICB0aGlzLm5vdW4gPSBub3VuO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRSdWxlYm9va3MgKC4uLnJ1bGVib29rcyA6IEFycmF5PFJ1bGVib29rPFQ+Pikge1xyXG4gICAgICAgIHJ1bGVib29rcyA9IGFycmF5VW5pcXVlTmV3QXJyYXkocnVsZWJvb2tzKTtcclxuICAgICAgICBydWxlYm9va3MuZm9yRWFjaCgocnVsZWJvb2spID0+IHtcclxuICAgICAgICAgICAgdGhpcy5hZGRSdWxlcyguLi5ydWxlYm9vay5ydWxlcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZFJ1bGVzICguLi5ydWxlcykge1xyXG4gICAgICAgIGlmICh0aGlzLnJ1bGVSdW5uZXIgPCAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMucnVsZXNUb0V4ZWN1dGUucHVzaCguLi5ydWxlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBza2lwUnVsZSAocnVsZSA6IFJ1bGUpIHtcclxuICAgICAgICBpZiAodGhpcy5ydWxlUnVubmVyID49IDApIHtcclxuICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5ydWxlc1RvRXhlY3V0ZS5pbmRleE9mKHJ1bGUpO1xyXG4gICAgICAgICAgICBpZiAoaW5kZXggPiB0aGlzLnJ1bGVSdW5uZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucnVsZXNUb0V4ZWN1dGUuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJbUnVsZWJvb2tdXCIgKyB0aGlzLnJ1bGVib29rLm5hbWUgKyBcIiwgc2tpcHBpbmcgUnVsZSBcIiArIHJ1bGUubmFtZSArIFwiIGR1ZSB0byByZXF1ZXN0LlwiKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIltSdWxlYm9va11cIiArIHRoaXMucnVsZWJvb2submFtZSArIFwiOiB1bmFtZSB0byBza2lwIFJ1bGVcIiArIHJ1bGUubmFtZSArIFwiIGR1ZSB0byBpdCBiZWluZyB0b28gbGF0ZSB0byBzdG9wIGl0LlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZXhlY3V0ZSAoKSB7XHJcbiAgICAgICAgYXJyYXlVbmlxdWUodGhpcy5ydWxlc1RvRXhlY3V0ZSkuc29ydChmdW5jdGlvbiAoYTogUnVsZSwgYjogUnVsZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gYS5jb21wYXJlVG8oYik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGZvciAodGhpcy5ydWxlUnVubmVyID0gMDsgdGhpcy5ydWxlUnVubmVyIDwgdGhpcy5ydWxlc1RvRXhlY3V0ZS5sZW5ndGg7IHRoaXMucnVsZVJ1bm5lcisrKSB7XHJcbiAgICAgICAgICAgIHRoaXMucnVsZSA9IHRoaXMucnVsZXNUb0V4ZWN1dGVbdGhpcy5ydWxlUnVubmVyXTtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVsZS5leGVjdXRlKHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIFJ1bGVib29rPFQ+IHtcclxuICAgIHB1YmxpYyBydWxlcyA6IEFycmF5PFJ1bGU+ID0gW107XHJcbiAgICBwdWJsaWMgbmFtZSA6IHN0cmluZztcclxuICAgIHByaXZhdGUgc3RhdGljIGluZGVudGFudGlvblNwYWNlcyA9IDI7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJ1bGVib29rU3RhY2sgOiBBcnJheTxhbnk+ID0gW107XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRTdGFjayAoKSB7XHJcbiAgICAgICAgbGV0IHN0YWNrID0gW107XHJcbiAgICAgICAgUnVsZWJvb2sucnVsZWJvb2tTdGFjay5mb3JFYWNoKChybCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmwgaW5zdGFuY2VvZiBPYmplY3QgJiYgcmwubmFtZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHN0YWNrLnB1c2gocmwubmFtZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJsID09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgICAgIHN0YWNrLnB1c2gocmwpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJsIGluc3RhbmNlb2YgT2JqZWN0ICYmIHJsLmlkICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgc3RhY2sucHVzaChybC5pZCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzdGFjay5wdXNoKFwiVW5kZWZpbmVkXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHN0YWNrO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5kZW50YXRpb24gKCkge1xyXG4gICAgICAgIHJldHVybiBcIiBcIi5yZXBlYXQoUnVsZWJvb2suaW5kZW50YW50aW9uU3BhY2VzKS5yZXBlYXQoUnVsZWJvb2sucnVsZWJvb2tTdGFjay5sZW5ndGgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgaW5jcmVhc2VJbmRlbnRhdGlvbiAocnVsZWJvb2sgOiBhbnkpIHtcclxuICAgICAgICBSdWxlYm9vay5ydWxlYm9va1N0YWNrLnB1c2gocnVsZWJvb2spO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVjcmVhc2VJbmRlbnRhdGlvbiAoKSB7XHJcbiAgICAgICAgUnVsZWJvb2sucnVsZWJvb2tTdGFjay5wb3AoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGlzUnVubmluZyAociA6IFJ1bGUgfCBSdWxlYm9vazxhbnk+KSB7XHJcbiAgICAgICAgcmV0dXJuIFJ1bGVib29rLnJ1bGVib29rU3RhY2suaW5kZXhPZihyKSAhPSAtMTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNSdW5uaW5nICgpIHtcclxuICAgICAgICByZXR1cm4gUnVsZWJvb2suaXNSdW5uaW5nKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAobmFtZSA6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGV4ZWN1dGUgKG9wdGlvbnMgOiBSdWxlYm9va09wdGlvbnM8VD4sIC4uLnJ1bGVib29rcykgOiBQcm9taXNlPGFueT57XHJcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgPT0gdW5kZWZpbmVkID8ge30gOiBvcHRpb25zO1xyXG5cclxuICAgICAgICBsZXQgcnVubmVyID0gbmV3IFJ1bGVib29rUnVubmVyPFQ+KHRoaXMsIG9wdGlvbnMubm91bik7IC8vIGR1cGxpY2F0ZSBhcnJheVxyXG4gICAgICAgIHJ1bm5lci5hZGRSdWxlYm9va3ModGhpcywgLi4ucnVsZWJvb2tzKTtcclxuXHJcbiAgICAgICAgdmFyIG5hbWVzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBydWxlYm9va3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHJ1bGVib29rc1tpXSA9PT0gdGhpcykgY29udGludWU7XHJcbiAgICAgICAgICAgIG5hbWVzLnB1c2gocnVsZWJvb2tzW2ldLm5hbWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhSdWxlYm9vay5nZXRJbmRlbnRhdGlvbigpICsgXCJbUlVMRUJPT0tdIFwiICsgdGhpcy5uYW1lICsgKG5hbWVzLmxlbmd0aCA+IDAgPyAoXCIgbWVyZ2VkIHdpdGggXCIgKyBuYW1lcy5qb2luKFwiLCBcIikpIDogXCJcIikpO1xyXG4gICAgICAgIFJ1bGVib29rLmluY3JlYXNlSW5kZW50YXRpb24odGhpcyk7XHJcblxyXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBydW5uZXIuZXhlY3V0ZSgpO1xyXG5cclxuICAgICAgICBSdWxlYm9vay5kZWNyZWFzZUluZGVudGF0aW9uKCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY3JlYXRlQW5kQWRkUnVsZSAociA6IFJ1bGVPcHRpb25zPFQ+KSA6IFJ1bGUge1xyXG4gICAgICAgIGxldCBydWxlID0gbmV3IFJ1bGUocik7XHJcbiAgICAgICAgdGhpcy5hZGRSdWxlKHJ1bGUpO1xyXG4gICAgICAgIHJldHVybiBydWxlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRSdWxlIChyIDogUnVsZSkge1xyXG4gICAgICAgIHRoaXMucnVsZXMucHVzaChyKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc29ydFJ1bGVzICgpIHtcclxuICAgICAgICB0aGlzLnJ1bGVzLnNvcnQoZnVuY3Rpb24gKGEgOiBSdWxlLCBiIDogUnVsZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gYS5jb21wYXJlVG8oYik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJtb2R1bGUgU2V0dGluZ3Mge1xyXG4gICAgdmFyIGRlYnVnID0gY29uc29sZS5kZWJ1ZztcclxuICAgIHZhciBkZWJ1Z0VtcHR5ID0gKCkgPT4ge307XHJcblxyXG4gICAgZXhwb3J0IHZhciBoYXJkRGVidWcgPSBmYWxzZTtcclxuICAgIGV4cG9ydCB2YXIgc2F5VHVyblRpbWUgPSB0cnVlO1xyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBzZXREZWJ1ZyAoaXNEZWJ1ZyA6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAoaXNEZWJ1Zykge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnID0gZGVidWc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyA9IGRlYnVnRW1wdHk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0RlYnVnICgpIHtcclxuICAgICAgICByZXR1cm4gY29uc29sZS5kZWJ1ZyA9PSBkZWJ1ZztcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gc2V0SGFyZERlYnVnIChpc0hhcmREZWJ1ZyA6IGJvb2xlYW4pIHtcclxuICAgICAgICBoYXJkRGVidWcgPSBpc0hhcmREZWJ1ZztcclxuICAgIH1cclxufVxyXG5cclxuLy9TZXR0aW5ncy5zZXREZWJ1ZyhmYWxzZSk7XHJcbi8vU2V0dGluZ3Muc2F5VHVyblRpbWUgPSB0cnVlO1xyXG5cclxuLyoqXHJcbiAqIEZ1dHVyZSBub3RlcyBvbiBQZXJmb3JtYW5jZSBJc3N1ZXM6XHJcbiAqIC0gSXQgZG9lc24ndCByZWFsbHkgbWF0dGVyIGlmIG1vc3Qgb2YgdGhlIGNvZGUgaXMgb3B0aW1pemVkIG9yIG5vdC4gQ1BVcyBhcmUgZmFzdC5cclxuICogLSBJdCAqZG9lcyogbWF0dGVyIGlmIGNvZGUgdGhhdCBpcyBydW4gZnJlcXVlbnRseSBpcyBzdWItb3B0aW1pemVkLlxyXG4gKiAtLS0gQmlnZ2VzdCBwbGFjZSB0byBsb29rIGF0IGlzIGF0IEV2ZXJ5IFR1cm4gUnVsZXMsIHBhcnRpY3VsYXJseSBBSTogdGhlc2Ugd2lsbCBydW4gZm9yIGV2ZXJ5IGFjdGlvbiB0aGUgcGxheWVyIGRvZXMgZm9yIGV2ZXJ5IHNpbmdsZSBOUEMgaW4gdGhlIGdhbWUuXHJcbiAqIC0gVGhpcyBiZWluZyBhIHRleHQgZ2FtZSwgd2UgaGF2ZSB1cCB0byAxMDBtcyBiZWZvcmUgdGhlIHBsYXllciBcImZlZWxzXCIgdGhlIGdhbWUgaXNuJ3QgaW5zdGFudGFuZW91cy5cclxuICogLSBCZXlvbmQgdGhhdCwgd2UgaGF2ZSB1bnRpbCBhYm91dCAyNTBtcyBiZWZvcmUgdGhlIHBsYXllciBzdGFydHMgZ2V0dGluZyBsZWdpdCBwaXNzZWQuIFRoZXNlIGFyZSBib3RoIHBlciB0dXJuLlxyXG4gKlxyXG4gKiBCZWluZyB0aGF0IGFsbCBvdGhlciBjb2RlIHdpbGwgcnVuIG9uY2UgYW5kIHRoYXQncyB0aGUgZW5kIG9mIGl0LCB0aGUgb25seSBwb3J0aW9uIG9mIHRoZSBnYW1lIHRoYXQgQ0FOIGJyaW5nIHBlcmZvcm1hbmNlIGlzc3VlcyB3aWxsIGJlIHRoZSBBSS5cclxuICogRWFjaCBOUEMgYWRkZWQgaW5jcmVhc2VzIHRpbWUgc3BlbnQgYnkgQUkgYnkgYXJvdW5kICgobiArIDEpL24pLiBFYWNoIHJ1bGUgYWRkZWQgZG9lcyB0aGUgc2FtZS5cclxuICogU2luY2UgTlBDcyB3aWxsIGJlIGFkZGVkIGFuZCBtb3JlIGFuZCBtb3JlIHJ1bGVzIHdpbGwga2VlcCBnZXR0aW5nIGFkZGVkLCBBVCBTT01FIFBPSU5UIHdlJ2xsIGhhdmUgcHJvYmxlbXMuXHJcbiAqIFN0cmVzcyB0ZXN0aW5nIHdpdGggUGljayBTaGluaWVzIGFuZCBOUENzIHN1Z2dlc3RzIHRoYXQgd2UgY2FuIGhhdmUgYWJvdXQgMjAwIE5QQ3MgYW5kIGFib3V0IDgwMCBydWxlcyBiZWZvcmUgcHJvYmxlbXMsIGJ1dCB0aGUgdGVzdGluZyBpcyBub3QgaWRlYWw6XHJcbiAqIC0gUGljayBTaGluaWVzIGluY3JlYXNlcyBpbiBjb21wbGV4aXR5IHdpdGggdGhlIGFtb3VudCBvZiB0aGluZ3MgaW4gYSByb29tLiBTbyB0aGUgdGVzdCBtYWRlIHRoaXMgcnVsZSBwYXJ0aWN1bGFybHkgbmFzdHksIHNpbmNlIGFsbCBOUENzIHdlcmUgZ29pbmcgYW5kIGNvbWluZyBmcm9tIHRoZSBzYW1lIHJvb21zLlxyXG4gKiAtIEluIGEgcmVhbCBnYW1lIHNpdHVhdGlvbiwgaXQncyBleHBlY3RlZCBmb3Igcm9vbXMgdG8gcmFyZWx5IGhhdmUgbW9yZSB0aGFuIDUgdGhpbmdzL3Blb3BsZSBpbiB0aGVtIGFuZCBmb3IgTlBDcyB0byBiZSBkaXNwZXJzZS5cclxuICogV2Ugc2hvdWxkIG5ldmVyIHJlYWNoIG91ciAyNTBtcyBsaW1pdCBvbiBwb3dlcmZ1bCBDUFVzLlxyXG4gKlxyXG4gKiBSZWdhcmRsZXNzLCBpZiBwZXJmb3JtYW5jZSBldmVyIGJlY29tZXMgYW4gaXNzdWU6XHJcbiAqIC0gT3B0aW1pemUgQUkgdHJlZXMgc28gdGhhdCBDb25kaXRpb25zIGRvbid0IGhhdmUgdG8gYmUgY2hlY2tlZC4gQ29vayBlYWNoIE5QQydzIFJ1bGVib29rIHNvIHRoYXQgYWxsIHJ1bGVzIHRoYXQgYXJlbid0IGhpcyBhcmVuJ3QgZXZlciBsb29rZWQgYXQuIFRoaXMgaXMgdGhlIHNpbXBsZXN0LCBuby1sb3NzIGltcHJvdmVtZW50LCBidXQgb25seSBvZmZlcnMgaW1wcm92ZW1lbnRzIGlmIHRoZSBOUEMgKiBSVUxFUyBudW1iZXIgaXMgYmlnLlxyXG4gKiAtIElmIHRoZSBudW1iZXIgb2YgUnVsZXMgKiBOUENzIGlzIG5vdCB0aGUgaXNzdWUsIHRoZW4gZmlndXJlIG91dCB3aGljaCBzcGVjaWZpYyBydWxlcyBhcmUgYmVpbmcgYSBwcm9ibGVtIGFuZCBvcHRpbWl6ZSB0aGVtIHNwZWNpZmljYWxseS4gSW4gZ2VuZXJhbCwgZXhwZW5zaXZlIHJ1bGVzIHNob3VsZCBhbHNvIGJlIHJhcmUuIFRoaXMgc29sdXRpb24gbWlnaHQgbm90IGFsd2F5cyBiZSBhdmFpbGFibGUgYW5kIG1pZ2h0IG5vdCBnZXQgYWxsIHRoYXQgbXVjaCByZXN1bHQuXHJcbiAqIC0gU2xvdyBkb3duIEFJIGZvciBOUENzIGF3YXkgZnJvbSB0aGUgcGxheWVyLiBQb3NzaWJpbGl0aWVzOiBpZiBhbiBOUEMgaXMgbW9yZSB0aGFuIDIwIHJvb21zIGF3YXksIGl0IG9ubHkgZ2V0cyBvbmUgYWN0aW9uIGV2ZXJ5IDQgdHVybnMsIHRoZW4gMywgdGhlbiAyLi4uIHVudGlsIGl0J3MgY2xvc2UgZW5vdWdoIHRvIGFjdCBldmVyeSB0dXJuLlxyXG4gKiAtIFNpbXBseSBza2lwIEFJIGZvciBOUENzIGluIGRpZmZlcmVudCByZWdpb25zLiBpLmUuOiBpZiB0aGUgcGxheWVyIGlzIGluc2lkZSB0aGUgT2JlbGlzaywgZG9uJ3QgZXZlbiBib3RoZXIgd2l0aCBOUENzIGluIHRoZSBmb3Jlc3QuXHJcbiAqXHJcbiAqXHJcbiAqIFdlIGFsc28gZG8gYSBsb3Qgb2YgZGVidWdnaW5nLlxyXG4gKiBXaGlsZSBkaXNhYmxpbmcgY29uc29sZS5kZWJ1ZyBvZmZlcnMgYSBzdWJzdGFudGlhbCBwZXJmb3JtYW5jZSBnYWluIChhcm91bmQgNTAlKSBhbmQgaXMgYXZhaWxhYmxlIGFzIGFuIE9wdGlvbixcclxuICogZW50aXJlbHkgY29tbWVudGluZyBvdXQgY29uc29sZS5kZWJ1ZyBjYWxscyBnaXZlcyB1cyBhbiBhZGRpdGlvbmFsIDIwJSBnYWluIG9uIHRvcCBvZiB0aGF0LCBmb3IgYSB0b3RhbCBvZiBhcm91bmQgNjAlIHBlcmZvcm1hbmNlIGdhaW4uXHJcbiAqIENvbnNpZGVyaW5nIGRlYnVnZ2luZyBpcyBub3QgcmVhbGx5IHVzZWZ1bCBmb3IgcGxheWVycywgdGhpcyBzaG91bGQgYWx3YXlzIGJlIGtlcHQgaW4gbWluZC5cclxuICovIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1NldHRpbmdzLnRzXCIgLz5cclxuaW50ZXJmYWNlIFJ1bGVPcHRpb25zPFQ+IHtcclxuICAgIG5hbWUgOiBzdHJpbmc7XHJcbiAgICBmaXJzdFByaW9yaXR5PyA6IG51bWJlcjtcclxuICAgIHByaW9yaXR5PyA6IG51bWJlcjtcclxuICAgIGNvZGUgOiAocnVubmVyPyA6IFJ1bGVib29rUnVubmVyPFQ+KSA9PiAoUHJvbWlzZTxhbnk+IHwgYW55KTtcclxuICAgIGNvbmRpdGlvbnM/IDogKHJ1bm5lcj8gOiBSdWxlYm9va1J1bm5lcjxUPikgPT4gKGJvb2xlYW4pO1xyXG59XHJcblxyXG5jbGFzcyBSdWxlIHtcclxuICAgIHByaXZhdGUgX3ByaW9yaXR5IDogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBmaXJzdFByaW9yaXR5IDogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBuYW1lIDogc3RyaW5nO1xyXG5cclxuICAgIHByaXZhdGUgY29kZSA6IEZ1bmN0aW9uO1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVkV2hlcmUgOiBFcnJvcjtcclxuICAgIHByaXZhdGUgY29uZGl0aW9ucyA6IChydWxlYm9vaz8gOiBSdWxlYm9va1J1bm5lcjxhbnk+KSA9PiAoYm9vbGVhbik7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChvcHRpb25zIDogUnVsZU9wdGlvbnM8YW55Pikge1xyXG4gICAgICAgIHRoaXMucHJpb3JpdHkgPSBvcHRpb25zLnByaW9yaXR5ICE9IHVuZGVmaW5lZCA/IG9wdGlvbnMucHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX01FRElVTTtcclxuICAgICAgICB0aGlzLmZpcnN0UHJpb3JpdHkgPSBvcHRpb25zLmZpcnN0UHJpb3JpdHkgIT0gdW5kZWZpbmVkID8gb3B0aW9ucy5maXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9NRURJVU07XHJcbiAgICAgICAgdGhpcy5uYW1lID0gb3B0aW9ucy5uYW1lO1xyXG4gICAgICAgIHRoaXMuY29kZSA9IG9wdGlvbnMuY29kZTtcclxuICAgICAgICB0aGlzLmNyZWF0ZWRXaGVyZSA9IChuZXcgRXJyb3IoKSk7XHJcblxyXG4gICAgICAgIHRoaXMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyAhPSB1bmRlZmluZWQgPyBvcHRpb25zLmNvbmRpdGlvbnMgOiAoKSA9PiB7IHJldHVybiB0cnVlOyB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlIChydWxlYm9vaz8gOiBSdWxlYm9va1J1bm5lcjxhbnk+KSA6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbmRpdGlvbnMocnVsZWJvb2spKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhSdWxlYm9vay5nZXRJbmRlbnRhdGlvbigpICsgXCJbUlVMRV0gXCIgKyB0aGlzLm5hbWUpO1xyXG4gICAgICAgIFNldHRpbmdzLmhhcmREZWJ1ZyAmJiBjb25zb2xlLmRlYnVnKHRoaXMubmFtZSwgdGhpcy5jcmVhdGVkV2hlcmUpO1xyXG4gICAgICAgIFJ1bGVib29rLmluY3JlYXNlSW5kZW50YXRpb24odGhpcyk7XHJcblxyXG4gICAgICAgIHJ1bGVib29rLnJ1bGUgPSB0aGlzO1xyXG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLmNvZGUocnVsZWJvb2spO1xyXG4gICAgICAgIC8vIFdhcyB0aGUgZnVuY3Rpb24gYXN5bmM/XHJcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmVzdWx0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhSdWxlYm9vay5nZXRJbmRlbnRhdGlvbigpICsgXCJSZXN1bHQ6XCIsIHJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBSdWxlYm9vay5kZWNyZWFzZUluZGVudGF0aW9uKCk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHByaW9yaXR5KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ByaW9yaXR5O1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBwcmlvcml0eSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fcHJpb3JpdHkgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY29tcGFyZVRvIChiIDogUnVsZSkge1xyXG4gICAgICAgIHZhciBhID0gdGhpcztcclxuICAgICAgICAvLyBIaWdoZXIgcHJpb3JpdHkgZ29lcyBmaXJzdCBhcyB0aGlzIGlzIGEgcm9sbGluZyBhcnJheVxyXG4gICAgICAgIGlmIChiLmZpcnN0UHJpb3JpdHkgPCBhLmZpcnN0UHJpb3JpdHkpIHJldHVybiAtMTtcclxuICAgICAgICBpZiAoYS5maXJzdFByaW9yaXR5IDwgYi5maXJzdFByaW9yaXR5KSByZXR1cm4gMTtcclxuICAgICAgICBpZiAoYi5wcmlvcml0eSA8IGEucHJpb3JpdHkpIHJldHVybiAtMTtcclxuICAgICAgICBpZiAoYS5wcmlvcml0eSA8IGIucHJpb3JpdHkpIHJldHVybiAxO1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgUFJJT1JJVFlfSElHSEVTVCA6IG51bWJlciA9IDIwO1xyXG4gICAgcHVibGljIHN0YXRpYyBQUklPUklUWV9ISUdIIDogbnVtYmVyID0gMTU7XHJcbiAgICBwdWJsaWMgc3RhdGljIFBSSU9SSVRZX01FRElVTSA6IG51bWJlciA9IDEwO1xyXG4gICAgcHVibGljIHN0YXRpYyBQUklPUklUWV9MT1cgOiBudW1iZXIgPSA1O1xyXG4gICAgcHVibGljIHN0YXRpYyBQUklPUklUWV9MT1dFU1QgOiBudW1iZXIgPSAwO1xyXG59XHJcblxyXG4vLyB2YXIgZ29ibGluSnVtcGluZ1J1bGUgPSBuZXcgUnVsZSh7XHJcbi8vICAgICBuYW1lIDogXCJHb2JsaW4gSnVtcGluZyBSdWxlXCIsXHJcbi8vICAgICBjb2RlIDogYXN5bmMgKHJ1bGUgOiBSdWxlLCBydWxlUmVzb2x2ZXIgOiBGdW5jdGlvbikgPT4ge1xyXG4vLyAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJ3ZWVlXCIpO1xyXG4vLyAgICAgfVxyXG4vLyB9KTtcclxuLy9cclxuLy8gZ29ibGluSnVtcGluZ1J1bGUuZXhlY3V0ZSgpO1xyXG5cclxuLyoqXHJcbiB2YXIgZ29ibGluSnVtcGluZ1J1bGUgPSBuZXcgUnVsZSh7bmFtZSA6IFwiR29ibGluIEp1bXBpbmcgUnVsZVwiLCBjb2RlIDogKGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gdGhpcyBpcyBub3cgdGhlIFJ1bGUgYW5kIGhhcyBhY2Nlc3MgdG8gdGhpcy5jdXJyZW50UnVsZWJvb2tcclxuICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBuZWVkIGZvciBvd24gbW9kdWxlLCBpdCdzIG9rYXkgdG8gdXNlIGEgc2ltcGxlIGZ1bmN0aW9uXHJcbiAgICAgICAgLy8gSUYgWU9VUiBGVU5DVElPTiBTSE9VTEQgTk9UIENPTVBMRVRFIEFVVE9NQVRJQ0FMTFksIElUIE5FRURTIFRPIFJFVFVSTiBGQUxTRVxyXG4gICAgICAgIC8vIEZVTkNUSU9OUyBUSEFUIFJFVFVSTiBBTllUSElORyBFTFNFIFdJTEwgQVVUTyBDT01QTEVURSBBVCBUSEUgRU5EIE9GIFRIRUlSIENPREVcclxuXHJcbiAgICAgICAgLy8gSWYgeW91ciBydWxlIGRvZXMgbm90IGF1dG8tY29tcGxldGUsIHRoZW4gaXQgbXVzdCBjb21wbGV0ZSBtYW51YWxseSwgb3IgdGhlIGdhbWUgd2lsbCBTVEFMTC5cclxuXHJcbiAgICAgICAgLy8gSWYgYSBydWxlIG11c3QgcmV0dXJuIGVpdGhlciBcInRydWVcIiBvciBcImZhbHNlXCIgdG8gdGhlIHJ1bGVib29rLCB5b3UgbmVlZCB0byBzZXQgdGhlIHJ1bGUncyByZXN1bHQgdGhhdCB3YXk6XHJcbiAgICAgICAgLy8gdGhpcy5yZXN1bHQgPSB0cnVlIChvciBmYWxzZSlcclxuICAgIH07XHJcbiB9KSgpfSk7XHJcbiAqLyIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL0NsYXNzZXMvUnVsZWJvb2sudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9DbGFzc2VzL1J1bGUudHNcIiAvPlxyXG5cclxubW9kdWxlIFR1cm5TZXF1ZW5jZSB7XHJcbiAgICBleHBvcnQgdmFyIHJ1bGVib29rID0gbmV3IFJ1bGVib29rPEFjdGlvbj4oXCJUdXJuIFNlcXVlbmNlXCIpO1xyXG4gICAgZXhwb3J0IHZhciBwbGF5ZXJBY3Rpb25zID0gW107XHJcblxyXG4gICAgZXhwb3J0IGxldCBsYXN0VHVyblRpbWUgOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlIChhY3Rpb24/IDogQWN0aW9uKSB7XHJcbiAgICAgICAgLy8gT25seSBvbmUgYWN0aW9uIGF0IGEgdGltZVxyXG4gICAgICAgIGlmIChwbGF5ZXJBY3Rpb25zLnB1c2goYWN0aW9uKSA9PSAxKSB7XHJcbiAgICAgICAgICAgIGxldCB0MCA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKFJ1bGVib29rLmdldEluZGVudGF0aW9uKCkgKyBcIiAgIFBsYXllciBBY3Rpb246IFwiICsgKGFjdGlvbiA/IGFjdGlvbi5nZXRDb21tYW5kVGV4dCgpIDogXCJub25lXCIpKTtcclxuICAgICAgICAgICAgYXdhaXQgcnVsZWJvb2suZXhlY3V0ZSh7XHJcbiAgICAgICAgICAgICAgICBub3VuOiBhY3Rpb25cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBwbGF5ZXJBY3Rpb25zID0gW107XHJcbiAgICAgICAgICAgIGxldCB0MSA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG4gICAgICAgICAgICBsYXN0VHVyblRpbWUgPSB0MSAtIHQwO1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwiVG90YWw6IFwiICsgKHQxIC0gdDApICsgXCIgbWlsbGlzZWNvbmRzLlwiKTtcclxuICAgICAgICAgICAgaWYgKFNldHRpbmdzLnNheVR1cm5UaW1lKSB7XHJcbiAgICAgICAgICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIucHJpbnRBc0NvbnRlbnQobmV3IFNheShuZXcgU2F5Qm9sZChcIlRpbWUgdGFrZW4gZm9yIHR1cm46IFwiKSwgKHQxIC0gdDApLCBcIiBtaWxsaXNlY29uZHMuXCIpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgaXMgdGhlIFByZXBhcmUgRWxlbWVudHMgZm9yIHRoZSB0dXJuIHJ1bGUuXHJcbiAgICAgKiBAdHlwZSB7UnVsZX1cclxuICAgICAqL1xyXG4gICAgZXhwb3J0IHZhciBQcmVwYXJlRWxlbWVudHNSdWxlID0gbmV3IFJ1bGUoe1xyXG4gICAgICAgIGZpcnN0UHJpb3JpdHk6IFJ1bGUuUFJJT1JJVFlfSElHSEVTVCwgLy8gVGhpcyB3aWxsIGJlIGFib3V0IHRoZSBmaXJzdCBSdWxlIHRvIGJlIGV4ZWN1dGVkXHJcbiAgICAgICAgcHJpb3JpdHk6IFJ1bGUuUFJJT1JJVFlfTUVESVVNLCAvLyBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgYmVmb3JlIHRoZSBtYWpvcml0eSBvZiB0aGUgcnVsZXMsIGJ1dCB3ZSBkb24ndCB3YW50IGl0IHRvIGJlIHRoZSB2ZXJ5IGZpcnN0IG5vIG1hdHRlciB3aGF0XHJcbiAgICAgICAgbmFtZTogXCJCZWdpbiBUdXJuIChFbGVtZW50cyBTaWRlKVwiLFxyXG4gICAgICAgIGNvZGU6IGZ1bmN0aW9uIChydW5uZXIgOiBSdWxlYm9va1J1bm5lcjxBY3Rpb24+KSB7XHJcbiAgICAgICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5zdGFydFR1cm4ocnVubmVyLm5vdW4pO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgVHVyblNlcXVlbmNlLnJ1bGVib29rLmFkZFJ1bGUoUHJlcGFyZUVsZW1lbnRzUnVsZSk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGlzIHRoZSBEbyBQbGF5ZXIgQWN0aW9uIFJ1bGUuXHJcbiAgICAgKiBAdHlwZSB7UnVsZX1cclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGxldCBQbGF5ZXJBY3Rpb25SdWxlID0gbmV3IFJ1bGUoe1xyXG4gICAgICAgIGZpcnN0UHJpb3JpdHk6IFJ1bGUuUFJJT1JJVFlfSElHSCxcclxuICAgICAgICBwcmlvcml0eTogUnVsZS5QUklPUklUWV9NRURJVU0sXHJcbiAgICAgICAgbmFtZTogXCJEbyBQbGF5ZXIgQWN0aW9uXCIsXHJcbiAgICAgICAgY29kZTogYXN5bmMgKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8QWN0aW9uPikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcGxheWVyQWN0aW9uID0gPEFjdGlvbj4gcnVsZWJvb2subm91bjtcclxuICAgICAgICAgICAgaWYgKHBsYXllckFjdGlvbiAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGxldCBwcm9taXNlID0gcGxheWVyQWN0aW9uLmV4ZWN1dGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBwcm9taXNlO1xyXG5cclxuICAgICAgICAgICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5wcmludEFzQ29udGVudChwbGF5ZXJBY3Rpb24uc2F5KTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocGxheWVyQWN0aW9uLnJlcXVpcmVzVHVybikge1xyXG4gICAgICAgICAgICAgICAgICAgIFdvcmxkU3RhdGUuaW5jcmVtZW50UGxheWVyVHVybigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBydWxlYm9vay5hZGRSdWxlKFBsYXllckFjdGlvblJ1bGUpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpcyB0aGUgUnVuIEV2ZXJ5IFR1cm4gUnVsZXMuXHJcbiAgICAgKiBAdHlwZSB7UnVsZX1cclxuICAgICAqL1xyXG4gICAgZXhwb3J0IHZhciBSdW5FdmVyeVR1cm5SdWxlc1J1bGUgPSBuZXcgUnVsZSh7XHJcbiAgICAgICAgZmlyc3RQcmlvcml0eTogUnVsZS5QUklPUklUWV9NRURJVU0sXHJcbiAgICAgICAgcHJpb3JpdHk6IFJ1bGUuUFJJT1JJVFlfTUVESVVNLFxyXG4gICAgICAgIG5hbWU6IFwiUnVuIEV2ZXJ5IFR1cm4gUnVsZXNcIixcclxuICAgICAgICBjb2RlOiBhc3luYyBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHdoaWxlIChXb3JsZFN0YXRlLmlzVHVybldhaXRpbmcoKSkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgRXZlcnlUdXJuLkV2ZXJ5VHVybi5leGVjdXRlKHt9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcnVsZWJvb2suYWRkUnVsZShSdW5FdmVyeVR1cm5SdWxlc1J1bGUpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpcyB0aGUgSW5mb3JtIEVsZW1lbnRzIHRoZSB0dXJuIGhhcyBlbmRlZCBydWxlLlxyXG4gICAgICogQHR5cGUge1J1bGV9XHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCB2YXIgUmVtb3ZlVHVybkZyb21FbGVtZW50c1J1bGUgPSBuZXcgUnVsZSh7XHJcbiAgICAgICAgZmlyc3RQcmlvcml0eTogUnVsZS5QUklPUklUWV9MT1dFU1QsIC8vIFRoaXMgd2lsbCBiZSBhYm91dCB0aGUgbGFzdCBydWxlIHRvIGJlIGV4ZWN1dGVkXHJcbiAgICAgICAgcHJpb3JpdHk6IFJ1bGUuUFJJT1JJVFlfTUVESVVNLCAvLyBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgYWZ0ZXIgdGhlIG1ham9yaXR5IG9mIHRoZSBydWxlcywgYnV0IHdlIGRvbid0IGNhcmUgaWYgaXQncyB0aGUgdmVyeSBsYXN0IG9yIG5vdFxyXG4gICAgICAgIG5hbWU6IFwiRW5kIFR1cm4gKEVsZW1lbnRzL0NvbnRyb2xzIFNpZGUpXCIsXHJcbiAgICAgICAgY29kZTogYXN5bmMgZnVuY3Rpb24gKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8QWN0aW9uPikge1xyXG4gICAgICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIuZW5kVHVybigpO1xyXG5cclxuICAgICAgICAgICAgQ29udHJvbHMuS2V5SGFuZGxlci5yZXNldCgpO1xyXG5cclxuICAgICAgICAgICAgYXdhaXQgRWxlbWVudHMuSHlwZXJsaW5rSGFuZGxlci5oeXBlcmxpbmtDb21tb25BY3Rpb25zKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IEVsZW1lbnRzLlJvb21IYW5kbGVyLnVwZGF0ZVJvb20oKTtcclxuICAgICAgICAgICAgYXdhaXQgRWxlbWVudHMuUmVtZW1iZXJlZEhhbmRsZXIudXBkYXRlTWFwKCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgcGxheWVyQWN0aW9uID0gPEFjdGlvbj4gcnVsZWJvb2subm91bjtcclxuICAgICAgICAgICAgaWYgKHBsYXllckFjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgRWxlbWVudHMuSHlwZXJsaW5rSGFuZGxlci5oeXBlcmxpbmtPYmplY3QocGxheWVyQWN0aW9uLmdldE5vdW4oMCkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgRWxlbWVudHMuSHlwZXJsaW5rSGFuZGxlci5oeXBlcmxpbmtPYmplY3QoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYXdhaXQgRWxlbWVudHMuSW52ZW50b3J5SGFuZGxlci51cGRhdGVJbnZlbnRvcnkoKTtcclxuICAgICAgICAgICAgYXdhaXQgRWxlbWVudHMuQXBwZWFyYW5jZUhhbmRsZXIudXBkYXRlQXBwZWFyYW5jZSgpO1xyXG4gICAgICAgICAgICAvL2F3YWl0IEVsZW1lbnRzLlN0YXR1c0xpbmVIYW5kbGVyLnVwZGF0ZVN0YXR1c0xpbmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIFR1cm5TZXF1ZW5jZS5ydWxlYm9vay5hZGRSdWxlKFJlbW92ZVR1cm5Gcm9tRWxlbWVudHNSdWxlKTtcclxufSIsIm1vZHVsZSBWZXJzaW9uIHtcclxuICAgIGV4cG9ydCBsZXQgY3VycmVudFZlcnNpb24gPSBbMCwgMSwgMF07XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9uICh2MSA6IEFycmF5PG51bWJlcj4sIHYyIDogQXJyYXk8bnVtYmVyPikge1xyXG4gICAgICAgIGlmICh2MVswXSA8IHYyWzBdKSByZXR1cm4gLTE7XHJcbiAgICAgICAgZWxzZSBpZiAodjFbMF0gPiB2MlswXSkgcmV0dXJuIDE7XHJcblxyXG4gICAgICAgIGlmICh2MVsxXSA8IHYyWzFdKSByZXR1cm4gLTE7XHJcbiAgICAgICAgZWxzZSBpZiAodjFbMV0gPiB2MlsxXSkgcmV0dXJuIDE7XHJcblxyXG4gICAgICAgIGlmICh2MVsyXSA8IHYyWzJdKSByZXR1cm4gLTE7XHJcbiAgICAgICAgZWxzZSBpZiAodjFbMl0gPiB2MlsyXSkgcmV0dXJuIDE7XHJcblxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRDdXJyZW50VmVyc2lvbiAoKSB7XHJcbiAgICAgICAgbGV0IHYgPSBjdXJyZW50VmVyc2lvbjtcclxuICAgICAgICByZXR1cm4gdlswXSArIFwiLlwiICsgdlsxXSArIFwiLlwiICsgdlsyXTtcclxuICAgIH1cclxuXHJcbiAgICBkb2N1bWVudC50aXRsZSA9IGRvY3VtZW50LnRpdGxlICsgXCIgW1wiICsgZ2V0Q3VycmVudFZlcnNpb24oKSArIFwiXSAgXCI7XHJcbn1cclxuXHJcbi8vIFRoaXMgaXMgbm90IHJlYWxseSBuZWNlc3NhcnkuLi5cclxuLy8gY2xhc3MgVmVyc2lvblVwZGF0ZSB7XHJcbi8vICAgICBwcml2YXRlIHZlcnNpb24gOiBBcnJheTxudW1iZXI+O1xyXG4vLyAgICAgcHJpdmF0ZSBmdW5jIDogRnVuY3Rpb247XHJcbi8vXHJcbi8vICAgICBwdWJsaWMgY29uc3RydWN0b3IgKHZlcnNpb24gOiBBcnJheTxudW1iZXI+LCBmdW5jIDogRnVuY3Rpb24pIHtcclxuLy8gICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xyXG4vLyAgICAgICAgIHRoaXMuZnVuYyA9IGZ1bmM7XHJcbi8vICAgICB9XHJcbi8vXHJcbi8vICAgICBwdWJsaWMgcnVuICgpIHtcclxuLy8gICAgICAgICB0aGlzLmZ1bmMoKTtcclxuLy8gICAgIH1cclxuLy8gfVxyXG4vL1xyXG4vLyBjbGFzcyBWZXJzaW9uVXBkYXRlTGlzdCB7XHJcbi8vXHJcbi8vIH0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vVmVyc2lvbi50c1wiIC8+XHJcbm1vZHVsZSBDb250cm9scy5NZW1vcnkge1xyXG4gICAgbGV0IHZlcnNpb25TZXQgPSBmYWxzZTtcclxuICAgIGxldCBzZXR0aW5nc1ZlcnNpb24gOiBBcnJheTxudW1iZXI+ID0gVmVyc2lvbi5jdXJyZW50VmVyc2lvbjtcclxuICAgIGxldCB2ZXJzaW9uSWQgPSBcIlZlcnNpb25cIjtcclxuICAgIGxldCBtZW1vcnlQcmVmaXggPSBcIm9iZWxpc2tfXCI7XHJcbiAgICBsZXQgbWVtb3JpZXMgOiB7W2lkIDogc3RyaW5nXSA6IFN0b3JlZE1lbW9yeTxhbnk+fSA9IHt9O1xyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZSAoaWQgOiBzdHJpbmcsIGRlZlZhbHVlIDogYW55KSB7XHJcbiAgICAgICAgbGV0IHN0b3JhZ2UgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShtZW1vcnlQcmVmaXggKyBpZCk7XHJcbiAgICAgICAgcmV0dXJuIHN0b3JhZ2UgPT0gdW5kZWZpbmVkID8gZGVmVmFsdWUgOiBKU09OLnBhcnNlKHN0b3JhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBzZXRWYWx1ZSAoaWQgOiBzdHJpbmcsIHZhbHVlIDogYW55KSB7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obWVtb3J5UHJlZml4ICsgaWQsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XHJcblxyXG4gICAgICAgIGlmICghdmVyc2lvblNldCkge1xyXG4gICAgICAgICAgICB2ZXJzaW9uU2V0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgc2V0dGluZ3NWZXJzaW9uID0gZ2V0VmFsdWUodmVyc2lvbklkLCBWZXJzaW9uLmN1cnJlbnRWZXJzaW9uKTtcclxuICAgICAgICAgICAgc2V0VmFsdWUodmVyc2lvbklkLCBWZXJzaW9uLmN1cnJlbnRWZXJzaW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2h5IHNldHRpbmdzVmVyc2lvbiBleGlzdHMuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzVmVyc2lvbiA9PSB1bmRlZmluZWQpIHt9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyTWVtb3J5IChtZW0gOiBTdG9yZWRNZW1vcnk8YW55Pikge1xyXG4gICAgICAgIGlmIChtZW1vcmllc1ttZW0uZ2V0SWQoKV0gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbQ29udHJvbHMuTWVtb3J5XSBNZW1vcnkgYWxyZWFkeSByZWdpc3RlcmVkIG9uIGlkIFwiICsgbWVtLmdldElkKCksIFwiT2xkOlwiLCBtZW1vcmllc1ttZW0uZ2V0SWQoKV0sIFwiTmV3OlwiLCBtZW0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG1lbW9yaWVzW21lbS5nZXRJZCgpXSA9IG1lbTtcclxuICAgICAgICAgICAgbWVtLnNldFZhbHVlRnJvbUxvY2FsU3RvcmFnZURvTm90SW52b2tlKGdldFZhbHVlKG1lbS5nZXRJZCgpLCBtZW0uZ2V0VmFsdWUoKSkpO1xyXG4gICAgICAgICAgICBsZXQgdXBkYXRlRiA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIENvbnRyb2xzLk1lbW9yeS5zZXRWYWx1ZShtZW0uZ2V0SWQoKSwgbWVtLmdldFZhbHVlKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG1lbS5hZGRMaXN0ZW5lcih1cGRhdGVGKTtcclxuICAgICAgICAgICAgdXBkYXRlRigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsIi8qKlxyXG4gKiBUaGlzIGlzIHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIHZhbHVlcyB0by9mcm9tIERhdGEgU3RvcmFnZS5cclxuICogVGhlIHZhbHVlIHVzZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGlzIG1lcmVseSB0aGUgRGVmYXVsdCB2YWx1ZS4gSXQgaXMgc2FmZSB0byBhc3N1bWUgdGhhdCB0aGUgY29ycmVjdCB2YWx1ZSB3aWxsIGJlIGxvYWRlZCBpbW1lZGlhdGVseS5cclxuICogV0FSTklORzogSUYgWU9VIENIQU5HRSBUSEUgVFlQRSBPRiBWQUxVRSBBIE1FTU9SWSBTVE9SRVMsIFlPVSBBTFNPIE5FRUQgQSBORVcgSUQuIE9SIENIRUNLUy4gTkVXIElEIElTIEVBU0lFUi5cclxuICogT3B0aW9uYWxseTogdXNlIGxpc3RlbmVycyBpZiB5b3UgaGF2ZSB0byBjaGFuZ2UgdmFsdWUgb24gdGhlIGZseS5cclxuICovXHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9Nb2R1bGVzL01lbW9yeS50c1wiIC8+XHJcbmNsYXNzIFN0b3JlZE1lbW9yeTxUPiB7XHJcbiAgICBwcml2YXRlIGlkIDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSB2YWx1ZSA6IFQ7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVycyA6IEFycmF5PEZ1bmN0aW9uPiA9IFtdO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoaWQgOiBzdHJpbmcsIHZhbHVlIDogVCkge1xyXG4gICAgICAgIHRoaXMuaWQgPSBpZDtcclxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgQ29udHJvbHMuTWVtb3J5LnJlZ2lzdGVyTWVtb3J5ICh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvciB1c2UgZXhjbHVzaXZlbHkgYnkgQ29udHJvbHMuTWVtb3J5LiBEbyBub3QgaW52b2tlLiBVc2Ugc3RvcmVWYWx1ZSBpbnN0ZWFkLlxyXG4gICAgICogQHBhcmFtIHtUfSB2YWx1ZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0VmFsdWVGcm9tTG9jYWxTdG9yYWdlRG9Ob3RJbnZva2UgKHZhbHVlIDogVCkge1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RvcmVWYWx1ZSAodmFsdWUgOiBUKSB7XHJcbiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KHZhbHVlKSAhPT0gSlNPTi5zdHJpbmdpZnkodGhpcy52YWx1ZSkpIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJMaXN0ZW5lcnMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFZhbHVlICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0SWQgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmlkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRMaXN0ZW5lciAobGlzdGVuZXIgOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB0cmlnZ2VyTGlzdGVuZXJzICgpIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW2ldKHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJXb3JsZC9DbGFzc2VzL1NhdmUvU3RvcmVkVmFyaWFibGUudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiV29ybGQvVHVyblNlcXVlbmNlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIldvcmxkL0NsYXNzZXMvUnVsZS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJDb250cm9scy9DbGFzc2VzL1N0b3JlZE1lbW9yeS50c1wiIC8+XHJcbmludGVyZmFjZSBTYXZlZFRoaW5nIHtcclxuICAgIE5hbWUgOiBzdHJpbmc7XHJcbiAgICBVbmlxdWUgOiBib29sZWFuO1xyXG4gICAgQ2hhbmdlcyA6IHtbaWQgOiBzdHJpbmddIDogYW55fVxyXG59XHJcblxyXG4vLyBUaGUgcGxheWVyIGlzIGFsd2F5cyBhIGh1bWFub2lkXHJcbmludGVyZmFjZSBTYXZlZFBsYXllciB7XHJcbiAgICBQYXJ0cyA6IEFycmF5PFNhdmVkVGhpbmc+O1xyXG4gICAgUGxheWVyQ2hhbmdlcyA6IHtbaWQgOiBzdHJpbmddIDogYW55fTtcclxuICAgIE5hbWUgOiBzdHJpbmc7IC8vIEFyZSB3ZSBnb2luZyB0byBkbyBuYW1lcz8gSSBNZWFuIGl0J2QgYmUgZnVuXHJcbn1cclxuXHJcbmludGVyZmFjZSBTYXZlU3RydWN0dXJlIHtcclxuICAgIFZhcmlhYmxlcyA6IHtbaWQgOiBzdHJpbmddIDogYW55fTtcclxuICAgIFdpZWxkZWQgOiBBcnJheTxTYXZlZFRoaW5nPjtcclxuICAgIFdvcm4gOiBBcnJheTxTYXZlZFRoaW5nPjtcclxuICAgIENhcnJpZWQgOiBBcnJheTxTYXZlZFRoaW5nPjtcclxuICAgIFBsYXllciA6IFNhdmVkUGxheWVyO1xyXG4gICAgUm91bmRzIDogbnVtYmVyO1xyXG4gICAgRGF0ZSA6IHN0cmluZztcclxuICAgIFVuaXF1ZVRoaW5ncyA6IEFycmF5PFNhdmVkVGhpbmc+O1xyXG59XHJcblxyXG5tb2R1bGUgU2F2ZUhhbmRsZXIge1xyXG4gICAgbGV0IHNhdmVOYW1lID0gXCJPYmVsaXNrX1NhdmVcIlxyXG4gICAgbGV0IHNhdmVFeHRlbnNpb24gPSBcIm9ic2F2XCI7XHJcbiAgICBsZXQgc3RvcmFnZVByZWZpeCA9IFwic2F2ZV9cIjtcclxuICAgIGxldCBzYXZlU2xvdCA9IDA7XHJcbiAgICBsZXQgZXJyb3JzIDogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG4gICAgbGV0IGVyYXNpbmcgPSBmYWxzZTtcclxuICAgIGxldCB2aXJnaW4gPSBuZXcgU3RvcmVkTWVtb3J5KFwiRmlyc3QgdGltZSBzYXZpbmdcIiwgdHJ1ZSk7XHJcblxyXG4gICAgZXhwb3J0IGxldCBBZnRlckxvYWQgPSBuZXcgUnVsZWJvb2s8U2F2ZVN0cnVjdHVyZT4oXCJBZnRlciBsb2FkaW5nXCIpO1xyXG5cclxuICAgIGV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkRmlsZSAoKSA6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICAgICAgbGV0IGVsZW1lbnQgPSA8SFRNTElucHV0RWxlbWVudD4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xyXG4gICAgICAgIGVsZW1lbnQudHlwZSA9IFwiZmlsZVwiO1xyXG4gICAgICAgIGVsZW1lbnQuYWNjZXB0ID0gXCIuXCIgKyBzYXZlRXh0ZW5zaW9uO1xyXG5cclxuICAgICAgICBsZXQgcHJvbWlzZSA6IFByb21pc2U8c3RyaW5nPiA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgZWxlbWVudC5vbmNoYW5nZSA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmZpbGVzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZnIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBmci5vbmxvYWQgPSAoZXYpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShldi50YXJnZXRbJ3Jlc3VsdCddKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZyLnJlYWRBc1RleHQoZWxlbWVudC5maWxlc1swXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZWxlbWVudC5jbGljaygpO1xyXG4gICAgICAgIHJldHVybiBwcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRvd25sb2FkKGZpbGVuYW1lLCB0ZXh0KSB7XHJcbiAgICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgsJyArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KSk7XHJcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgZmlsZW5hbWUpO1xyXG5cclxuICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbGVtZW50KTtcclxuXHJcbiAgICAgICAgZWxlbWVudC5jbGljaygpO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBsb2FkU2F2ZSAoKSB7XHJcbiAgICAgICAgbGV0IGlucHV0ID0gPEhUTUxJbnB1dEVsZW1lbnQ+IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcclxuICAgICAgICBpbnB1dC50eXBlID0gXCJmaWxlXCI7XHJcbiAgICAgICAgaW5wdXQuYWNjZXB0ID0gXCIuXCIgKyBzYXZlRXh0ZW5zaW9uO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGlucHV0KTtcclxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsICgpID0+IHtcclxuICAgICAgICAgICAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGV4dCA9IHJlYWRlci5yZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBDaGVjayBpZiB0aGlzIGlzIGFjdHVhbGx5IHdvcmtpbmcuIFR5cGVzY3JpcHQgMyBzdWdnZXN0ZWQgaXQgd291bGRuJ3QuXHJcbiAgICAgICAgICAgICAgICBTYXZlSGFuZGxlci5sb2FkR2FtZSg8U2F2ZVN0cnVjdHVyZT4gSlNPTi5wYXJzZSg8c3RyaW5nPiB0ZXh0KSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNUZXh0KGlucHV0LmZpbGVzWzBdKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpbnB1dC5jbGljaygpO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaW5wdXQpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldEl0ZW0gKHRoaW5nIDogU2F2ZWRUaGluZykgOiBUaGluZyB7XHJcbiAgICAgICAgbGV0IGl0ZW0gOiBUaGluZztcclxuICAgICAgICBpZiAodGhpbmcuVW5pcXVlKSB7XHJcbiAgICAgICAgICAgIGl0ZW0gPSBUaGluZy5nZXRVbmlxdWUodGhpbmcuTmFtZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGl0ZW1zID0gVGhpbmcuZ2V0Tm9uVW5pcXVlKHRoaW5nLk5hbWUpO1xyXG4gICAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgaXRlbSA9IGl0ZW1zWzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpdGVtID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGVycm9yID0gdGhpbmcuTmFtZSArIFwiIG5vIGxvbmdlciBleGlzdHMuXCI7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiW1NhdmVIYW5kbGVyXSBcIiArIGVycm9yKTtcclxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGVycm9yKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0gPSBpdGVtLmNsb25lKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGl0ZW0uc2V0Q2hhbmdlcyh0aGluZy5DaGFuZ2VzKTtcclxuICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gbG9hZEdhbWUgKHNhdmVTdHJ1YyA6IFNhdmVTdHJ1Y3R1cmUpIHtcclxuICAgICAgICAvLyBpbnRlcmZhY2UgU2F2ZVN0cnVjdHVyZSB7XHJcbiAgICAgICAgLy8gICAgIFZhcmlhYmxlcyA6IHtbaWQgOiBzdHJpbmddIDogYW55fTtcclxuICAgICAgICAvLyAgICAgV2llbGRlZCA6IEFycmF5PFNhdmVkVGhpbmc+O1xyXG4gICAgICAgIC8vICAgICBXb3JuIDogQXJyYXk8U2F2ZWRUaGluZz47XHJcbiAgICAgICAgLy8gICAgIENhcnJpZWQgOiBBcnJheTxTYXZlZFRoaW5nPjtcclxuICAgICAgICAvLyAgICAgUGxheWVyIDogU2F2ZWRQbGF5ZXI7XHJcbiAgICAgICAgLy8gICAgIFJvdW5kcyA6IG51bWJlcjtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgbGV0IHBsYXllciA9IFdvcmxkU3RhdGUucGxheWVyO1xyXG4gICAgICAgIFN0b3JlZFZhcmlhYmxlLnVwZGF0ZUZyb21PYmplY3Qoc2F2ZVN0cnVjLlZhcmlhYmxlcyk7XHJcblxyXG4gICAgICAgIFdvcmxkU3RhdGUuc2V0Q3VycmVudFR1cm4oc2F2ZVN0cnVjLlJvdW5kcyk7XHJcblxyXG4gICAgICAgIFRoaW5nLldlYXJSZWxhdGlvbi5nZXRSaWdodChwbGF5ZXIpLmZvckVhY2goKHRoaW5nIDogVGhpbmcpID0+IHtcclxuICAgICAgICAgICAgVGhpbmcuV2VhclJlbGF0aW9uLnVuc2V0UmlnaHQodGhpbmcpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBUaGluZy5XaWVsZFJlbGF0aW9uLmdldFJpZ2h0KHBsYXllcikuZm9yRWFjaCgodGhpbmcgOiBUaGluZykgPT4ge1xyXG4gICAgICAgICAgICBUaGluZy5XaWVsZFJlbGF0aW9uLnVuc2V0UmlnaHQodGhpbmcpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBUaGluZy5DYXJyeVJlbGF0aW9uLmdldFJpZ2h0KHBsYXllcikuZm9yRWFjaCgodGhpbmcgOiBUaGluZykgPT4ge1xyXG4gICAgICAgICAgICBUaGluZy5DYXJyeVJlbGF0aW9uLnVuc2V0UmlnaHQodGhpbmcpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzYXZlU3RydWMuV2llbGRlZC5mb3JFYWNoKCh0aGluZyA6IFNhdmVkVGhpbmcpID0+IHtcclxuICAgICAgICAgICAgbGV0IGl0ZW0gPSBnZXRJdGVtKHRoaW5nKTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0gIT0gdW5kZWZpbmVkKSBXb3JsZFN0YXRlLnBsYXllci5zZXRXaWVsZGVkKGl0ZW0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzYXZlU3RydWMuV29ybi5mb3JFYWNoKCh0aGluZyA6IFNhdmVkVGhpbmcpID0+IHtcclxuICAgICAgICAgICAgbGV0IGl0ZW0gPSBnZXRJdGVtKHRoaW5nKTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0gIT0gdW5kZWZpbmVkKSBXb3JsZFN0YXRlLnBsYXllci5zZXRXb3JuKGl0ZW0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzYXZlU3RydWMuQ2FycmllZC5mb3JFYWNoKCh0aGluZyA6IFNhdmVkVGhpbmcpID0+IHtcclxuICAgICAgICAgICAgbGV0IGl0ZW0gPSBnZXRJdGVtKHRoaW5nKTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0gIT0gdW5kZWZpbmVkKSBXb3JsZFN0YXRlLnBsYXllci5zZXRDYXJyaWVkKGl0ZW0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgc2F2ZWRQbGF5ZXIgPSBzYXZlU3RydWMuUGxheWVyO1xyXG4gICAgICAgIHBsYXllci5zZXROYW1lKHNhdmVkUGxheWVyLk5hbWUpO1xyXG4gICAgICAgIHBsYXllci5zZXRDaGFuZ2VzKHNhdmVkUGxheWVyLlBsYXllckNoYW5nZXMpOyAvLyB0aGlzIGFkZHMgdGhlIHJpZ2h0IGdlbmRlcmVkIHBhcnRzXHJcbiAgICAgICAgc2F2ZWRQbGF5ZXIuUGFydHMuZm9yRWFjaCgocGFydCA6IFNhdmVkVGhpbmcpID0+IHtcclxuICAgICAgICAgICAgbGV0IGJwTGlzdCA9IDxBcnJheTxCb2R5cGFydD4+IHBsYXllci5nZXRQYXJ0c0J5TmFtZShwYXJ0Lk5hbWUpO1xyXG4gICAgICAgICAgICBpZiAoYnBMaXN0ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgYnBMaXN0WzBdLnNldENoYW5nZXMocGFydC5DaGFuZ2VzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzYXZlU3RydWMuVW5pcXVlVGhpbmdzLmZvckVhY2goKHNhdmVkVGhpbmcgOiBTYXZlZFRoaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCB0aGluZyA9IFRoaW5nLmdldFVuaXF1ZShzYXZlZFRoaW5nLk5hbWUpO1xyXG4gICAgICAgICAgICBpZiAodGhpbmcgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGluZy5zZXRDaGFuZ2VzKHNhdmVkVGhpbmcuQ2hhbmdlcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBleHBvcnRQbGF5ZXIgKCkgOiBTYXZlZFBsYXllciB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgTmFtZSA6IFdvcmxkU3RhdGUucGxheWVyLmdldE5hbWUoKSxcclxuICAgICAgICAgICAgUGxheWVyQ2hhbmdlcyA6IFdvcmxkU3RhdGUucGxheWVyLmdldENoYW5nZXMoKSxcclxuICAgICAgICAgICAgUGFydHMgOiBleHBvcnRUaGluZ3MoV29ybGRTdGF0ZS5wbGF5ZXIuZ2V0UGFydHMoKSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydFRoaW5ncyAoYXJyIDogQXJyYXk8VGhpbmc+LCBjaGFuZ2VkT25seT8gOiBib29sZWFuKSA6IEFycmF5PFNhdmVkVGhpbmc+IHtcclxuICAgICAgICBsZXQgb2JqID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHRoaW5nID0gPFRoaW5nPiBhcnJbaV07XHJcbiAgICAgICAgICAgIGxldCBzYXZlZFRoaW5nID0ge1xyXG4gICAgICAgICAgICAgICAgVW5pcXVlIDogdGhpbmcuaXNVbmlxdWUoKSxcclxuICAgICAgICAgICAgICAgIE5hbWUgOiB0aGluZy5nZXROYW1lKCksXHJcbiAgICAgICAgICAgICAgICBDaGFuZ2VzIDogdGhpbmcuZ2V0Q2hhbmdlcygpXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGlmICghY2hhbmdlZE9ubHkgfHwgT2JqZWN0LmtleXMoc2F2ZWRUaGluZy5DaGFuZ2VzKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBvYmoucHVzaChzYXZlZFRoaW5nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRTYXZlU3RydWN0dXJlICgpIDogU2F2ZVN0cnVjdHVyZSB7XHJcbiAgICAgICAgbGV0IHZhcmlhYmxlcyA9IFN0b3JlZFZhcmlhYmxlLmdldFZhcmlhYmxlcygpO1xyXG4gICAgICAgIGxldCBzYXZlZFZhcmlhYmxlcyA9IHt9O1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHNhdmVkVmFyaWFibGVzW3ZhcmlhYmxlc1tpXS5pZF0gPSB2YXJpYWJsZXNbaV0uZXhwb3J0QXNPYmplY3QoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB3aWVsZGVkID0gVGhpbmcuV2llbGRSZWxhdGlvbi5nZXRSaWdodChXb3JsZFN0YXRlLnBsYXllcik7XHJcbiAgICAgICAgbGV0IHdvcm4gPSBUaGluZy5XZWFyUmVsYXRpb24uZ2V0UmlnaHQoV29ybGRTdGF0ZS5wbGF5ZXIpO1xyXG4gICAgICAgIGxldCBjYXJyaWVkID0gVGhpbmcuQ2FycnlSZWxhdGlvbi5nZXRSaWdodChXb3JsZFN0YXRlLnBsYXllcik7XHJcblxyXG4gICAgICAgIGxldCBzYXZlU3RydWMgOiBTYXZlU3RydWN0dXJlID0ge1xyXG4gICAgICAgICAgICBWYXJpYWJsZXMgOiBzYXZlZFZhcmlhYmxlcyxcclxuICAgICAgICAgICAgVW5pcXVlVGhpbmdzIDogZXhwb3J0VGhpbmdzKFRoaW5nLmdldFVuaXF1ZXMoKSksXHJcbiAgICAgICAgICAgIFdpZWxkZWQgOiBleHBvcnRUaGluZ3Mod2llbGRlZCksXHJcbiAgICAgICAgICAgIFdvcm4gOiBleHBvcnRUaGluZ3Mod29ybiksXHJcbiAgICAgICAgICAgIENhcnJpZWQgOiBleHBvcnRUaGluZ3MoY2FycmllZCksXHJcbiAgICAgICAgICAgIFBsYXllciA6IGV4cG9ydFBsYXllcigpLFxyXG4gICAgICAgICAgICBSb3VuZHMgOiBXb3JsZFN0YXRlLmdldEN1cnJlbnRUdXJuKCksXHJcbiAgICAgICAgICAgIERhdGUgOiBuZXcgRGF0ZSgpLnRvTG9jYWxlU3RyaW5nKClcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zb2xlLmRlYnVnKFwiW1NhdmVIYW5kbGVyXSBDcmVhdGVkIFNhdmUgU3RydWN0dXJlXCIsIHNhdmVTdHJ1Yyk7XHJcblxyXG4gICAgICAgIHJldHVybiBzYXZlU3RydWM7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHNldFNsb3QgKHNsb3ROIDogbnVtYmVyKSB7XHJcbiAgICAgICAgc2F2ZVNsb3QgPSBzbG90TjtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gc2F2ZVRvU3RvcmFnZSAoKSB7XHJcbiAgICAgICAgQ29udHJvbHMuTWVtb3J5LnNldFZhbHVlKHN0b3JhZ2VQcmVmaXggKyBzYXZlU2xvdCwgZ2V0U2F2ZVN0cnVjdHVyZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEZyb21TdG9yYWdlICgpIHtcclxuICAgICAgICBpZiAoIWVyYXNpbmcpIHtcclxuICAgICAgICAgICAgbGV0IHNhdmVTdHJ1Y3QgPSAoQ29udHJvbHMuTWVtb3J5LmdldFZhbHVlKHN0b3JhZ2VQcmVmaXggKyBzYXZlU2xvdCwgdW5kZWZpbmVkKSk7XHJcbiAgICAgICAgICAgIGlmIChzYXZlU3RydWN0ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgbG9hZEdhbWUoc2F2ZVN0cnVjdCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgQWZ0ZXJMb2FkLmV4ZWN1dGUoe25vdW4gOiBzYXZlU3RydWN0fSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhpcyBpcyBhIG5ldyBnYW1lIVxyXG4gICAgICAgIGF3YWl0IENoYXJhY3RlckNyZWF0aW9uLnJ1bGVib29rLmV4ZWN1dGUoe30pO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkRnJvbUZpbGUgKCkge1xyXG4gICAgICAgIFBsYXlCZWdpbnMuTE9BRF9GQUlMRUQgPSBmYWxzZTtcclxuICAgICAgICBsZXQgcHJvbWlzZSA9IHJlYWRGaWxlKCk7XHJcblxyXG4gICAgICAgIGxldCBmaW5pc2hlZEFueTtcclxuICAgICAgICBsZXQgcmVhbFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICBmaW5pc2hlZEFueSA9IHJlc29sdmU7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGxldCBzYXkgPSBuZXcgU2F5KFwiTm8gc2F2ZSBmaWxlIHdhcyBsb2FkZWQuXCIsIFNheS5QQVJBR1JBUEhfQlJFQUssIFNheS5DRU5URVJFRCwgbmV3IFNheUJvbGQoXCJQcmVzcyBhbnkga2V5IHRvIHJldHVybi5cIikpO1xyXG4gICAgICAgIGxldCBzYXlFbGVtZW50cyA9IGF3YWl0IEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5nZXRTYXlFbGVtZW50c0FzQ29udGVudChzYXkpO1xyXG4gICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5wcmludCguLi5zYXlFbGVtZW50cyk7XHJcblxyXG4gICAgICAgIGxldCBuZXh0S2V5ID0gQ29udHJvbHMuS2V5SGFuZGxlci5nZXROZXh0S2V5KCk7XHJcblxyXG4gICAgICAgIHByb21pc2UudGhlbigoZmlsZSkgPT4ge1xyXG4gICAgICAgICAgICBDb250cm9scy5LZXlIYW5kbGVyLnN0b3BHaXZpbmdOZXh0S2V5KG5leHRLZXkpO1xyXG4gICAgICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIudW5wcmludCguLi5zYXlFbGVtZW50cyk7XHJcbiAgICAgICAgICAgIGxvYWRHYW1lKGdldEZyb21GaWxlKGZpbGUpKTsgLy8gSWYgbm8gZmlsZSB3YXMgY2hvc2VuIHRoZW4gY2hhbmdlIGlzbid0IHRyaWdnZXJlZCwgc28gaXQncyBuZXZlciB1bmRlZmluZWQuLi5cclxuICAgICAgICAgICAgZmluaXNoZWRBbnkoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbmV4dEtleS50aGVuKChrZXlDb2RlIDogS2V5Q29kZSkgPT4ge1xyXG4gICAgICAgICAgICBQbGF5QmVnaW5zLkxPQURfRkFJTEVEID0gdHJ1ZTtcclxuICAgICAgICAgICAgZmluaXNoZWRBbnkoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgYXdhaXQgcmVhbFByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFNheUZvclNsb3QgKHNsb3ROdW1iZXIgOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgc2F2ZVN0cnVjdCA6IFNhdmVTdHJ1Y3R1cmUgPSAoQ29udHJvbHMuTWVtb3J5LmdldFZhbHVlKHN0b3JhZ2VQcmVmaXggKyBzbG90TnVtYmVyLCB1bmRlZmluZWQpKTtcclxuICAgICAgICBpZiAoc2F2ZVN0cnVjdCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXkoXCJOZXcgR2FtZVwiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgZXJhc2luZ1RleHQgPSBlcmFzaW5nID8gXCIoRVJBU0UpIC0gXCIgOiBcIlwiO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFNheShlcmFzaW5nVGV4dCwgc2F2ZVN0cnVjdC5QbGF5ZXIuTmFtZSArIFwiIC0gVHVybnM6IFwiICsgc2F2ZVN0cnVjdC5Sb3VuZHMgKyBcIiAtIExhc3QgUGxheWVkOiBcIiArIHNhdmVTdHJ1Y3QuRGF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRGcm9tRmlsZSAoc2F2ZVRleHQpIDogU2F2ZVN0cnVjdHVyZSB7XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlVVJJQ29tcG9uZW50KGF0b2Ioc2F2ZVRleHQpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHNhdmVUb0ZpbGUgKCkge1xyXG4gICAgICAgIC8vIEl0J3Mgb2theSBpZiB5b3Ugd2FudCB0byBjaGVhdCwgYnV0IGlmIHlvdSB0YW1wZXIgd2l0aCB0aGUgc2F2ZSBmaWxlLCBwbGVhc2UgYmUgbWluZGZ1bCB3aGVuIHJlcG9ydGluZyBcImJ1Z3NcIi5cclxuICAgICAgICBkb3dubG9hZChzYXZlTmFtZSArIFwiLlwiICsgc2F2ZUV4dGVuc2lvbiwgYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoKEpTT04uc3RyaW5naWZ5KGdldFNhdmVTdHJ1Y3R1cmUoKSkpKSkpKTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNFcmFzaW5nICgpIHtcclxuICAgICAgICByZXR1cm4gZXJhc2luZztcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gdG9nZ2xlRXJhc2luZyAoKSB7XHJcbiAgICAgICAgZXJhc2luZyA9ICFlcmFzaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc1ZpcmdpbiAoKSB7XHJcbiAgICAgICAgbGV0IHdhcyA9IHZpcmdpbi5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIHZpcmdpbi5zdG9yZVZhbHVlKGZhbHNlKTtcclxuICAgICAgICByZXR1cm4gd2FzO1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIlNhdmVHYW1lQnV0dG9uXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcbi8vICAgICBTYXZlSGFuZGxlci5zYXZlVG9GaWxlKCk7XHJcbi8vIH0pO1xyXG5cclxuVHVyblNlcXVlbmNlLnJ1bGVib29rLmNyZWF0ZUFuZEFkZFJ1bGUoe1xyXG4gICAgbmFtZSA6IFwiU2F2ZSBnYW1lIHRvIFN0b3JhZ2VcIixcclxuICAgIHByaW9yaXR5IDogUnVsZS5QUklPUklUWV9MT1dFU1QsXHJcbiAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9MT1dFU1QsXHJcbiAgICBjb2RlIDogKCkgPT4ge1xyXG4gICAgICAgIFNhdmVIYW5kbGVyLnNhdmVUb1N0b3JhZ2UoKTtcclxuICAgIH1cclxufSkiLCJjbGFzcyBDaGFyYWN0ZXJPcmlnaW4ge1xyXG4gICAgcHVibGljIGlkIDogc3RyaW5nO1xyXG4gICAgcHVibGljIG5hbWUgOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgZGVzY3JpcHRpb24gOiBzdHJpbmcgfCBTYXk7XHJcbiAgICBwdWJsaWMgYm9udXNTdGF0cyA6IHN0cmluZztcclxuICAgIHB1YmxpYyBjb25maXJtUGlja2VkIDogKCgpID0+IHZvaWQpID0gKCkgPT4ge307XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChpZCA6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuaWQgPSBpZDtcclxuICAgICAgICBDaGFyYWN0ZXJPcmlnaW4uc3RvcmVPcmlnaW4odGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBvcmlnaW5zIDoge1tpZCA6IHN0cmluZ10gOiBDaGFyYWN0ZXJPcmlnaW59ID0ge307XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBzdG9yZU9yaWdpbiAob3JpZ2luIDogQ2hhcmFjdGVyT3JpZ2luKSB7XHJcbiAgICAgICAgQ2hhcmFjdGVyT3JpZ2luLm9yaWdpbnNbb3JpZ2luLmlkXSA9IG9yaWdpbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldE9yaWdpbiAoaWQgOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gQ2hhcmFjdGVyT3JpZ2luLm9yaWdpbnNbaWRdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0T3JpZ2lucyAoKSA6IEFycmF5PENoYXJhY3Rlck9yaWdpbj4ge1xyXG4gICAgICAgIGxldCBvcmlnaW5zID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaWQgaW4gQ2hhcmFjdGVyT3JpZ2luLm9yaWdpbnMpIHtcclxuICAgICAgICAgICAgb3JpZ2lucy5wdXNoKENoYXJhY3Rlck9yaWdpbi5vcmlnaW5zW2lkXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9yaWdpbnMuc29ydCgoYSA6IENoYXJhY3Rlck9yaWdpbiwgYiA6IENoYXJhY3Rlck9yaWdpbikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgbmEgPSBhLm5hbWUudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgbGV0IG5iID0gYi5uYW1lLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIGlmIChuYSA8IG5iKSByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgIGlmIChuYSA+IG5iKSByZXR1cm4gMTtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG9yaWdpbnM7XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQ2hhcmFjdGVyT3JpZ2luLnRzXCIgLz5cclxubW9kdWxlIENoYXJhY3RlckNyZWF0aW9uIHtcclxuICAgIGV4cG9ydCBsZXQgQ2hhbXBpb25PcmlnaW4gPSBuZXcgQ2hhcmFjdGVyT3JpZ2luKFwiQ2hhbXBpb25cIik7XHJcbiAgICBDaGFtcGlvbk9yaWdpbi5uYW1lID0gXCJDaGFtcGlvblwiO1xyXG4gICAgQ2hhbXBpb25PcmlnaW4uZGVzY3JpcHRpb249IFwiWW91IHdlcmUgYm9ybiBpbiB0aGUgc21hbGwgdmlsbGFnZSBvZiBTb3V0aHdvb2QgaW4gdGhlIHBvc3QtVG93ZXIgd29ybGQuIENob3NlbiBieSB0aGUgdmlsbGFnZSBlbGRlciwgeW91IHdlcmUgdHJhaW5lZCByZWxlbnRsZXNzbHkgYXMgc29vbiBhcyB5b3UgYmVjYW1lIGFibGUgdG8gd2Fsay4gWW91ciBtaXNzaW9uOiBnZXQgdG8gdGhlIFRvd2VyIGFuZCBmaW5kIGEgd2F5IHRvIGRlc3Ryb3kgaXQuIFVuYmVrbm93bnN0IHRvIHlvdSwgdGhpcyBpcyBsaXR0bGUgbW9yZSB0aGFuIGEgc2FjcmlmaWNlIHJpdHVhbCBhbmQgeW91IGFyZSBqdXN0IGl0J3MgbGF0ZXN0IHZpY3RpbS4gVGhlIHZpbGxhZ2UgZG9lc24ndCBhY3R1YWxseSBleHBlY3QgeW91IHRvIHN1Y2NlZWQsIHlvdSBhcmUgbWVyZWx5IGEgZ2lmdCB0byB0aGUgVG93ZXIsIHNvIHRoYXQgaXQgd2lsbCBub3QgZGVzdHJveSBTb3V0aHdvb2QuXCI7XHJcbiAgICBDaGFtcGlvbk9yaWdpbi5ib251c1N0YXRzID0gXCJUaGlzIG9yaWdpbiBncmFudHMgYSArMSBCb251cyB0byBldmVyeSBhdHRyaWJ1dGUsIGJ1dCB5b3Ugd2lsbCBiZSBzdHVjayB3aXRoIHNvbWUgcGVya3MgZ2FpbmVkIHRocm91Z2ggeW91ciB0cmFpbmluZy5cIjtcclxuXHJcbiAgICAvLyBHaXZlICsxIHRvIGFsbCBzdGF0cyBpZiBwaWNrZWRcclxuICAgIENoYW1waW9uT3JpZ2luLmNvbmZpcm1QaWNrZWQgPSAoKSA9PiB7XHJcbiAgICAgICAgbGV0IHBsYXllciA9IFdvcmxkU3RhdGUucGxheWVyO1xyXG4gICAgICAgIGZ1bmN0aW9uIGluY3JlYXNlU3RhdCAoYXR0ciA6IEF0dHJpYnV0ZSkge1xyXG4gICAgICAgICAgICBwbGF5ZXIuc2V0U3RhdChhdHRyLCBwbGF5ZXIuZ2V0U3RhdChhdHRyKSArIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpbmNyZWFzZVN0YXQoQXR0cmlidXRlcy5TdHJlbmd0aCk7XHJcbiAgICAgICAgaW5jcmVhc2VTdGF0KEF0dHJpYnV0ZXMuQ2hhcm0pO1xyXG4gICAgICAgIGluY3JlYXNlU3RhdChBdHRyaWJ1dGVzLkFnaWxpdHkpO1xyXG4gICAgICAgIGluY3JlYXNlU3RhdChBdHRyaWJ1dGVzLkludGVsbGlnZW5jZSk7XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vV29ybGQvQ2xhc3Nlcy9TYXZlL1N0b3JlZFZhcmlhYmxlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIk9yaWdpbnMvQ2hhbXBpb25PcmlnaW4udHNcIiAvPlxyXG5tb2R1bGUgQ2hhcmFjdGVyQ3JlYXRpb24ge1xyXG4gICAgZXhwb3J0IGxldCBQbGF5ZXJPcmlnaW4gPSBuZXcgU3RvcmVkVmFyaWFibGUoe2lkIDogXCJQbGF5ZXIgT3JpZ2luXCIsIHZhbHVlIDogQ2hhbXBpb25PcmlnaW4uaWR9KTtcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0T3JpZ2luICgpIDogQ2hhcmFjdGVyT3JpZ2luIHtcclxuICAgICAgICByZXR1cm4gQ2hhcmFjdGVyT3JpZ2luLmdldE9yaWdpbihQbGF5ZXJPcmlnaW4udmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBsZXQgcnVsZWJvb2sgPSBuZXcgUnVsZWJvb2soXCJDaGFyYWN0ZXIgQ3JlYXRpb25cIik7XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vV29ybGQvQ2xhc3Nlcy9TYXZlL1N0b3JlZFZhcmlhYmxlLnRzXCIgLz5cclxuY2xhc3MgUGVyayBleHRlbmRzIFN0b3JlZFZhcmlhYmxlPGJvb2xlYW4+IHtcclxuICAgIHB1YmxpYyBmb3JjZWRTdGF0dXMgOiAoKGUgOiBQZXJrKSA9PiBib29sZWFuIHwgdm9pZCkgPSAoKSA9PiB7IHJldHVybiB1bmRlZmluZWQgfTtcclxuICAgIHB1YmxpYyBkZXNjcmlwdGlvbiA6IFNheSB8IHN0cmluZyB8ICgocGVyayA6IFBlcmspID0+IFNheSB8IHN0cmluZykgPSBcIlVuZGVmaW5lZFwiO1xyXG4gICAgcHVibGljIG5hbWUgOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgY29uZmlybVBpY2tlZCA6ICgoKSA9PiB2b2lkKSA9ICgpID0+IHt9O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yIChpZCA6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgaWQgOiBcIlBlcmtfXCIgKyBpZCxcclxuICAgICAgICAgICAgdmFsdWUgOiBmYWxzZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IGlkO1xyXG5cclxuICAgICAgICBQZXJrLnN0b3JlUGVyayh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNFbmFibGVkICh2YWx1ZU9ubHk/IDogYm9vbGVhbikgOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodmFsdWVPbmx5ICE9IHRydWUpIHtcclxuICAgICAgICAgICAgbGV0IGZvcmNlZCA9IHRoaXMuZm9yY2VkU3RhdHVzKHRoaXMpO1xyXG4gICAgICAgICAgICBpZiAoZm9yY2VkICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxib29sZWFuPiBmb3JjZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzRm9yY2VkICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5mb3JjZWRTdGF0dXModGhpcykgIT0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXREZXNjcmlwdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmRlc2NyaXB0aW9uID09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbih0aGlzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBwZXJrcyA6IHtbaWQgOiBzdHJpbmddIDogUGVya30gPSB7fTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHN0b3JlUGVyayAocGVyayA6IFBlcmspIHtcclxuICAgICAgICBQZXJrLnBlcmtzW3BlcmsuaWRdID0gcGVyaztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFBlcmsgKGlkIDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIFBlcmsucGVya3NbaWRdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UGVya3MgKCkgOiBBcnJheTxQZXJrPiB7XHJcbiAgICAgICAgbGV0IHBlcmtzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaWQgaW4gUGVyay5wZXJrcykge1xyXG4gICAgICAgICAgICBwZXJrcy5wdXNoKFBlcmsucGVya3NbaWRdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcGVya3Muc29ydCgoYSA6IFBlcmssIGIgOiBQZXJrKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBuYSA9IGEubmFtZS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgICBsZXQgbmIgPSBiLm5hbWUudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgaWYgKG5hIDwgbmIpIHJldHVybiAtMTtcclxuICAgICAgICAgICAgaWYgKG5hID4gbmIpIHJldHVybiAxO1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcGVya3M7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyB1cGRhdGVQZXJrcygpIHtcclxuICAgICAgICBmb3IgKGxldCBpZCBpbiBQZXJrLnBlcmtzKSB7XHJcbiAgICAgICAgICAgIGxldCBwZXJrID0gUGVyay5wZXJrc1tpZF07XHJcbiAgICAgICAgICAgIGlmIChwZXJrLmlzRm9yY2VkKCkpIHtcclxuICAgICAgICAgICAgICAgIHBlcmsudmFsdWUgPSA8Ym9vbGVhbj4gcGVyay5mb3JjZWRTdGF0dXMocGVyayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vU2F5LnRzXCIgLz5cclxuY2xhc3MgT25lT2Yge1xyXG4gICAgcHJpdmF0ZSBwb3NzaWJpbGl0aWVzID0gW107XHJcbiAgICBwcml2YXRlIGF2YWlsYWJsZVBvc3NpYmlsaXRlcztcclxuICAgIHByaXZhdGUgcmFuZG9tTW9kZSA6IG51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFBVUkVMWV9BVF9SQU5ET00gOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIHN0YXRpYyBST1RBVElOR19SQU5ET00gOiBudW1iZXIgPSAxO1xyXG4gICAgcHVibGljIHN0YXRpYyBDWUNMSU5HIDogbnVtYmVyID0gMjtcclxuXHJcbiAgICBwcml2YXRlIGN5Y2xpbmdPcmRlciA6IG51bWJlciA9IDA7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChyYW5kb21Nb2RlIDogbnVtYmVyLCAuLi5wb3NzIDogQXJyYXk8YW55Pikge1xyXG4gICAgICAgIHRoaXMucmFuZG9tTW9kZSA9IHJhbmRvbU1vZGU7XHJcbiAgICAgICAgdGhpcy5wb3NzaWJpbGl0aWVzID0gcG9zcztcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucmFuZG9tTW9kZSA9PSBPbmVPZi5ST1RBVElOR19SQU5ET00pIHtcclxuICAgICAgICAgICAgdGhpcy5hdmFpbGFibGVQb3NzaWJpbGl0ZXMgPSB0aGlzLnBvc3NpYmlsaXRpZXMuc2xpY2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE9uZSAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucmFuZG9tTW9kZSA9PSBPbmVPZi5QVVJFTFlfQVRfUkFORE9NKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBvc3NpYmlsaXRpZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogdGhpcy5wb3NzaWJpbGl0aWVzLmxlbmd0aCldO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yYW5kb21Nb2RlID09IE9uZU9mLlJPVEFUSU5HX1JBTkRPTSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hdmFpbGFibGVQb3NzaWJpbGl0ZXMubGVuZ3RoIDwgMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdmFpbGFibGVQb3NzaWJpbGl0ZXMgPSB0aGlzLnBvc3NpYmlsaXRpZXMuc2xpY2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hdmFpbGFibGVQb3NzaWJpbGl0ZXMuc3BsaWNlKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRoaXMuYXZhaWxhYmxlUG9zc2liaWxpdGVzLmxlbmd0aCksIDEpWzBdXHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJhbmRvbU1vZGUgPT0gT25lT2YuQ1lDTElORykge1xyXG4gICAgICAgICAgICB2YXIgciA9IHRoaXMucG9zc2liaWxpdGllc1t0aGlzLmN5Y2xpbmdPcmRlcisrXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY3ljbGluZ09yZGVyID4gdGhpcy5wb3NzaWJpbGl0aWVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jeWNsaW5nT3JkZXIgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsIm1vZHVsZSBDb250cm9scyB7XHJcblxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vQ2xhc3Nlcy9SdWxlYm9vay50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL0NsYXNzZXMvUnVsZS50c1wiIC8+XHJcbm1vZHVsZSBNYWNoaW5lQmVnaW5zIHtcclxuICAgIGV4cG9ydCB2YXIgcnVsZWJvb2sgPSBuZXcgUnVsZWJvb2s8dm9pZD4oXCJNYWNoaW5lIEJlZ2luc1wiKTtcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZXhlY3V0ZSAoKSB7XHJcbiAgICAgICAgcnVsZWJvb2suZXhlY3V0ZSh7fSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsICgpID0+IHtcclxuICAgIE1hY2hpbmVCZWdpbnMuZXhlY3V0ZSgpO1xyXG59KTsiLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vV29ybGQvTWFjaGluZUJlZ2lucy50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9Xb3JsZC9UdXJuU2VxdWVuY2UudHNcIiAvPlxyXG5tb2R1bGUgRWxlbWVudHMge1xyXG4gICAgZXhwb3J0IHZhciBhbmltYXRpb25UaW1lID0gMTAwMDtcclxuICAgIGV4cG9ydCB2YXIgaXNNb2JpbGUgPSAvTW9iaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7IC8vIFRoaXMgY29ycmVjdGx5IGxldHMgTW9iaWxlIHVzZXJzIHdobyByZXF1ZXN0ZWQgdGhlIERlc2t0b3AgYXBwIG9yIGFyZSBvbiBhIHN1ZmZpY2llbnRseSBiaWcgdGFibGV0IHRvIGdldCB0aGUgcmlnaHQgZGVza3RvcCB2ZXJzaW9uXHJcblxyXG4gICAgZXhwb3J0IHZhciBzY3JlZW5XaWR0aCA9IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGg7XHJcbiAgICBleHBvcnQgdmFyIHNjcmVlbkhlaWdodCA9IGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0O1xyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRMaW5rRWxlbWVudHMgKGltYWdlPyA6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAoQ3VycmVudFR1cm5IYW5kbGVyID09IHVuZGVmaW5lZCkgcmV0dXJuIFtdO1xyXG4gICAgICAgIGlmIChDdXJyZW50VHVybkhhbmRsZXIuaXNUdXJuKCkgfHwgaW1hZ2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtDdXJyZW50VHVybkhhbmRsZXIuY3VycmVudFR1cm5UYWJdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbSHlwZXJsaW5rSGFuZGxlci5saW5rZWRBY3Rpb25zVGFiLCBSb29tSGFuZGxlci5jdXJyZW50Um9vbVRhYiwgSHlwZXJsaW5rSGFuZGxlci5jb21tb25BY3Rpb25zVGFiLCBDdXJyZW50VHVybkhhbmRsZXIuY3VycmVudFR1cm5UYWIsIFJvb21IYW5kbGVyLmN1cnJlbnRSb29tRXhpdHNdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gdXBkYXRlU2NyZWVuU2l6ZSAoKSB7XHJcbiAgICAgICAgc2NyZWVuV2lkdGggPSBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoO1xyXG4gICAgICAgIHNjcmVlbkhlaWdodCA9IGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCB2YXIgbWFpblBhZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1haW5QYWdlXCIpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyB0aGUgYmx1ciBlZmZlY3QgdG8gdGhlIHNjcmVlblxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gc3RhcnRUdXJuICgpIHtcclxuICAgICAgICBtYWluUGFnZS5jbGFzc0xpc3QuYWRkKFwidHVyblwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZSB0aGUgYmx1ciBlZmZlY3QgZnJvbSB0aGUgc2NyZWVuXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBlbmRUdXJuICgpIHtcclxuICAgICAgICBtYWluUGFnZS5jbGFzc0xpc3QucmVtb3ZlKFwidHVyblwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFyZSB3ZSBjdXJyZW50bHkgaW4gYSB0dXJuP1xyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0luVHVybiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIG1haW5QYWdlLmNsYXNzTGlzdC5jb250YWlucyhcInR1cm5cIik7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGxldCBtZW51T3V0c2lkZW9mVHVybiA9IGZhbHNlO1xyXG4gICAgbGV0IG1lbnVzID0gMDtcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gc3RhcnRNZW51ICgpIHtcclxuICAgICAgICBpZiAoIWlzSW5UdXJuKCkpIHtcclxuICAgICAgICAgICAgbWVudU91dHNpZGVvZlR1cm4gPSB0cnVlO1xyXG4gICAgICAgICAgICBzdGFydFR1cm4oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbWFpblBhZ2UuY2xhc3NMaXN0LmFkZChcIm1haW5tZW51XCIpO1xyXG4gICAgICAgIG1lbnVzKys7XHJcbiAgICAgICAgRWxlbWVudHMuQ3VycmVudFR1cm5IYW5kbGVyLmNsZWFyKCk7XHJcbiAgICAgICAgQ29udHJvbHMuS2V5SGFuZGxlci5yZXNldCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBlbmRNZW51ICgpIHtcclxuICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIuY2xlYXIoKTtcclxuICAgICAgICBpZiAoLS1tZW51cyA9PSAwKSB7XHJcbiAgICAgICAgICAgIGlmIChtZW51T3V0c2lkZW9mVHVybikge1xyXG4gICAgICAgICAgICAgICAgZW5kVHVybigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc2V0TWVudXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc2V0TWVudXMgKCkge1xyXG4gICAgICAgIGlmIChtZW51cyAhPSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJBIG1lbnUgd2Fzbid0IGZpbmlzaGVkIHByb3Blcmx5LiBQbGVhc2UgY29ycmVjdCB0aGUgZGlhbG9ndWUuXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBtZW51cyA9IDA7XHJcbiAgICAgICAgbWVudU91dHNpZGVvZlR1cm4gPSBmYWxzZTtcclxuICAgICAgICBtYWluUGFnZS5jbGFzc0xpc3QucmVtb3ZlKFwibWFpbm1lbnVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNsZWFyTWFpblNjcmVlbiAoKSB7XHJcbiAgICAgICAgRWxlbWVudHMuQ3VycmVudFR1cm5IYW5kbGVyLmNsZWFyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvYWRpbmdTY3JlZW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImxvYWRpbmdTY3JlZW5cIik7XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHN0b3BMb2FkaW5nICgpIHtcclxuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxvYWRpbmdTY3JlZW4pO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YWl0Rm9yQW55S2V5ICgpIHtcclxuICAgICAgICBsZXQgc2F5ID0gbmV3IFNheShTYXkuQ0VOVEVSRUQsIG5ldyBTYXlCb2xkKFwiUHJlc3MgYW55IGtleSB0byBjb250aW51ZS5cIikpO1xyXG4gICAgICAgIGxldCBlbGVtZW50cyA9IGF3YWl0IHNheS5nZXRIVE1MKFwicFwiLCBbXCJjb250ZW50XCJdKTtcclxuICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIucHJpbnQoLi4uZWxlbWVudHMpO1xyXG5cclxuICAgICAgICBhd2FpdCBDb250cm9scy5LZXlIYW5kbGVyLmdldE5leHRLZXkoKTtcclxuICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIudW5wcmludCguLi5lbGVtZW50cyk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JTcGFjZUtleSAoKSB7XHJcbiAgICAgICAgbGV0IHNheSA9IG5ldyBTYXkoU2F5LkNFTlRFUkVELCBuZXcgU2F5Qm9sZChcIlByZXNzIFNwYWNlIHRvIGNvbnRpbnVlLlwiKSk7XHJcbiAgICAgICAgbGV0IGVsZW1lbnRzID0gYXdhaXQgc2F5LmdldEhUTUwoXCJwXCIsIFtcImNvbnRlbnRcIl0pO1xyXG4gICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5wcmludCguLi5lbGVtZW50cyk7XHJcblxyXG4gICAgICAgIGxldCBsYXN0S2V5ID0gXCJub3RTcGFjZVwiO1xyXG4gICAgICAgIHdoaWxlIChsYXN0S2V5ICE9IFwiU3BhY2VcIiAmJiBsYXN0S2V5ICE9IFwiQ2xpY2tcIikge1xyXG4gICAgICAgICAgICBsYXN0S2V5ID0gKGF3YWl0IENvbnRyb2xzLktleUhhbmRsZXIuZ2V0TmV4dEtleSgpKS5ldkNvZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIudW5wcmludCguLi5lbGVtZW50cyk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHByaW50T2JlbGlza0xvZ28gKCkge1xyXG4gICAgICAgIGxldCBzYXkgPSBuZXcgU2F5KFNheS5DRU5URVJFRCwgbmV3IFNheUltYWdlKFwiaW50cm9Mb2dvXCIpLCBTYXkuTElORV9CUkVBSywgbmV3IFNheUl0YWxpYyhcIlRoZSBPYmVsaXNrIGlzIGFuIGFkdWx0IGludGVyYWN0aXZlIGZpY3Rpb24gZ2FtZSBzZXQgaW4gYSBwb3N0LWFwb2NhbHlwdGljIHdvcmxkIHJhdmFnZWQgYnkgYSBtYWdpY2FsIHN0cnVjdHVyZS5cIikpO1xyXG4gICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5wcmludEFzQ29udGVudChzYXkpO1xyXG4gICAgfVxyXG59XHJcblxyXG5pZiAoRWxlbWVudHMuaXNNb2JpbGUpIHtcclxuICAgIEVsZW1lbnRzLm1haW5QYWdlLmNsYXNzTGlzdC5hZGQoXCJtb2JpbGVcIik7XHJcbn1cclxuXHJcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgIEVsZW1lbnRzLnVwZGF0ZVNjcmVlblNpemUoKTtcclxufSk7XHJcblxyXG5cclxubW9kdWxlIE1hY2hpbmVCZWdpbnMge1xyXG4gICAgZXhwb3J0IGxldCBIaWRlTG9hZGluZ0RpdlJ1bGUgPSBNYWNoaW5lQmVnaW5zLnJ1bGVib29rLmNyZWF0ZUFuZEFkZFJ1bGUoe1xyXG4gICAgICAgIG5hbWUgOiBcIkhpZGUgbG9hZGluZyBkaXZcIixcclxuICAgICAgICBjb2RlIDogcnVubmVyID0+IHtcclxuICAgICAgICAgICAgRWxlbWVudHMuc3RvcExvYWRpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufVxyXG5cclxubW9kdWxlIFR1cm5TZXF1ZW5jZSB7XHJcbiAgICBleHBvcnQgbGV0IExhemlseUZpeE1lbnVzID0gVHVyblNlcXVlbmNlLnJ1bGVib29rLmNyZWF0ZUFuZEFkZFJ1bGUoe1xyXG4gICAgICAgIG5hbWUgOiBcIkZpeCBtZW51cyB0aGF0IHdlcmUgbmV2ZXIgY2xvc2VkIGJlY2F1c2UgdGhlIGRldiBpcyBzdHVwaWRcIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9MT1dFU1QsXHJcbiAgICAgICAgcHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0xPV0VTVCxcclxuICAgICAgICBjb2RlIDogKCkgPT4ge1xyXG4gICAgICAgICAgICBFbGVtZW50cy5yZXNldE1lbnVzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSlcclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9Db250cm9scy50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9DbGFzc2VzL1N0b3JlZE1lbW9yeS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9FbGVtZW50cy9FbGVtZW50cy50c1wiIC8+XHJcbmludGVyZmFjZSBLZXlDb2RlIHtcclxuICAgIGV2Q29kZSA6IHN0cmluZztcclxuICAgIHJlcHJlc2VudGF0aW9uIDogc3RyaW5nO1xyXG4gICAgbmFtZSA6IHN0cmluZztcclxufVxyXG5cclxubW9kdWxlIENvbnRyb2xzLktleUhhbmRsZXIge1xyXG4gICAgbGV0IHByb21pc2VTdGFjayA6IEFycmF5PCh2YWx1ZT86IEtleUNvZGUgfCBQcm9taXNlTGlrZTxLZXlDb2RlPikgPT4gdm9pZD4gPSBbXTtcclxuICAgIGxldCBwcm9taXNlT3JpZ2luYWxTdGFjayA6IEFycmF5PFByb21pc2U8S2V5Q29kZT4+ID0gW107XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlamVjdFByb21pc2UgKHByb21pc2UgOiAodmFsdWU/OiBLZXlDb2RlIHwgUHJvbWlzZUxpa2U8S2V5Q29kZT4pID0+IHZvaWQpIHtcclxuICAgICAgICBwcm9taXNlU3RhY2suc3BsaWNlKHByb21pc2VTdGFjay5pbmRleE9mKHByb21pc2UpLCAxKTtcclxuICAgICAgICBwcm9taXNlT3JpZ2luYWxTdGFjay5zcGxpY2UocHJvbWlzZVN0YWNrLmluZGV4T2YocHJvbWlzZSksIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVLZXlDb2RlIChldiA6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgICAgICBsZXQgbmFtZSA9IGV2LmtleS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgIGxldCByZXByZXNlbnRhdGlvbiA9IG5hbWU7XHJcbiAgICAgICAgbGV0IGV2Q29kZSA9IGV2LmNvZGU7XHJcbiAgICAgICAgaWYgKGV2LnNoaWZ0S2V5KSB7XHJcbiAgICAgICAgICAgIG5hbWUgPSBcIlNoaWZ0ICsgXCIgKyBuYW1lO1xyXG4gICAgICAgICAgICBldkNvZGUgPSBcIlNoXCIgKyBldkNvZGU7XHJcbiAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uID0gXCJTXCIgKyByZXByZXNlbnRhdGlvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGV2LmFsdEtleSkge1xyXG4gICAgICAgICAgICBuYW1lID0gXCJBbHQgKyBcIiArIG5hbWU7XHJcbiAgICAgICAgICAgIGV2Q29kZSA9IFwiQWxcIiArIGV2Q29kZTtcclxuICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gPSBcIkFcIiArIHJlcHJlc2VudGF0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZXYuY3RybEtleSkge1xyXG4gICAgICAgICAgICBuYW1lID0gXCJDb250cm9sICsgXCIgKyBuYW1lO1xyXG4gICAgICAgICAgICBldkNvZGUgPSBcIkN0XCIgKyBldkNvZGU7XHJcbiAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uID0gXCJDXCIgKyByZXByZXNlbnRhdGlvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGtleUNvZGUgOiBLZXlDb2RlID0gIHtcclxuICAgICAgICAgICAgZXZDb2RlIDogZXZDb2RlLFxyXG4gICAgICAgICAgICBuYW1lIDogbmFtZSxcclxuICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gOiByZXByZXNlbnRhdGlvblxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGtleUNvZGU7XHJcbiAgICB9XHJcblxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgbGV0IGtleUNvZGUgOiBLZXlDb2RlID0ge1xyXG4gICAgICAgICAgICByZXByZXNlbnRhdGlvbiA6IFwiQ2xpY2tcIixcclxuICAgICAgICAgICAgZXZDb2RlIDogXCJDbGlja1wiLFxyXG4gICAgICAgICAgICBuYW1lIDogXCJDbGlja1wiXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbGV0IHByb21pc2UgPSBwcm9taXNlU3RhY2suc2hpZnQoKTtcclxuICAgICAgICBpZiAocHJvbWlzZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcHJvbWlzZShrZXlDb2RlKTtcclxuICAgICAgICAgICAgcHJvbWlzZU9yaWdpbmFsU3RhY2suc2hpZnQoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAvL2V2ZW50LnByZXZlbnREZWZhdWx0KCk7IFRoaXMgZnVja3MgdXAgYnJvd3NlciBjb250cm9sLiBMZXQncyBqdXN0IGFzc3VtZSB0aGF0IHRoaXMgaXMgYWx3YXlzIGdvaW5nIHRvIGJlIHRoZSBsYXN0IHRoaW5nIHRvIGNhdGNoIGEga2V5LlxyXG4gICAgICAgIGxldCBrZXlDb2RlID0gY3JlYXRlS2V5Q29kZShldmVudCk7XHJcblxyXG4gICAgICAgIGxldCBwcm9taXNlID0gcHJvbWlzZVN0YWNrLnNoaWZ0KCk7XHJcbiAgICAgICAgaWYgKHByb21pc2UgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHByb21pc2Uoa2V5Q29kZSk7XHJcbiAgICAgICAgICAgIHByb21pc2VPcmlnaW5hbFN0YWNrLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChrZXlDb2RlLmV2Q29kZSA9PSBzY3JvbGxLZXlDb2RlLmdldFZhbHVlKCkuZXZDb2RlKSB7XHJcbiAgICAgICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5zY3JvbGxTcGFjZSgpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIGlmIChrZXlDb2RlLmV2Q29kZSA9PSBpbWFnZUtleUNvZGUuZ2V0VmFsdWUoKS5ldkNvZGUpIHtcclxuICAgICAgICAgICAgaWYgKFNheUltYWdlLmltYWdlVmlld2VyLnN0eWxlLmRpc3BsYXkgPT0gXCJibG9ja1wiKSB7XHJcbiAgICAgICAgICAgICAgICBTYXlJbWFnZS5pbWFnZVZpZXdlci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaW1hZ2VzID0gRWxlbWVudHMuQ3VycmVudFR1cm5IYW5kbGVyLmN1cnJlbnRUdXJuVGFiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJjb250ZW50SW1hZ2VcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW1hZ2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAoPEhUTUxFbGVtZW50PiBpbWFnZXNbaW1hZ2VzLmxlbmd0aCAtIDFdKS5jbGljaygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBlbGU7XHJcblxyXG4gICAgICAgIEVsZW1lbnRzLmdldExpbmtFbGVtZW50cygpLnNvbWUoKGVsZW1lbnQgOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQga2V5YWJsZXMgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJrZXlhYmxlXCIpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleWFibGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoKDxIVE1MRWxlbWVudD4ga2V5YWJsZXNbaV0pLmRhdGFzZXRbJ3Nob3J0Y3V0Y29kZSddID09IGtleUNvZGUuZXZDb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlID0ga2V5YWJsZXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoZWxlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBlbGUuY2xpY2soKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlS2V5Q29kZXMgKGNvZGVzIDogQXJyYXk8c3RyaW5nPiwga2V5cyA6IEFycmF5PHN0cmluZz4sIG1vZHM/IDogQXJyYXk8Ym9vbGVhbj4pIHtcclxuICAgICAgICBsZXQgYXJyID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgbW9kID0gMDsgbW9kIDwgNDsgbW9kKyspIHtcclxuICAgICAgICAgICAgaWYgKG1vZCA9PSAwIHx8IG1vZHNbbW9kXSA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBrZXlzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXByZXNlbnRhdGlvbiA9IGtleXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGV2Q29kZSA9IGNvZGVzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtb2QgPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gXCJTaGlmdCArIFwiICsgbmFtZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZDb2RlID0gXCJTaFwiICsgZXZDb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRhdGlvbiA9IFwiU1wiICsgcmVwcmVzZW50YXRpb247XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtb2QgPT0gMikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gXCJBbHQgKyBcIiArIG5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2Q29kZSA9IFwiQWxcIiArIGV2Q29kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gPSBcIkFcIiArIHJlcHJlc2VudGF0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAobW9kID09IDMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IFwiQ29udHJvbCArIFwiICsgbmFtZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZDb2RlID0gXCJDdFwiICsgZXZDb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRhdGlvbiA9IFwiQ1wiICsgcmVwcmVzZW50YXRpb247XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBrZXlDb2RlOiBLZXlDb2RlID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBldkNvZGU6IGV2Q29kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50YXRpb246IHJlcHJlc2VudGF0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lIDogbmFtZVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyLnB1c2goa2V5Q29kZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFycjtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgdmFyIHNjcm9sbEtleUNvZGUgPSBuZXcgU3RvcmVkTWVtb3J5KFwic2Nyb2xsS2V5Q29kZVwiLCA8S2V5Q29kZT4ge1xyXG4gICAgICAgIGV2Q29kZSA6IFwiU3BhY2VcIixcclxuICAgICAgICByZXByZXNlbnRhdGlvbiA6IFwiU3BhY2VcIlxyXG4gICAgfSk7XHJcblxyXG4gICAgZXhwb3J0IHZhciBpbWFnZUtleUNvZGUgPSBuZXcgU3RvcmVkTWVtb3J5KFwiaW1hZ2VLZXlDb2RlXCIsIDxLZXlDb2RlPiB7XHJcbiAgICAgICAgZXZDb2RlIDogXCJLZXlJXCIsXHJcbiAgICAgICAgcmVwcmVzZW50YXRpb24gOiBcIklcIlxyXG4gICAgfSk7XHJcblxyXG4gICAgZXhwb3J0IHZhciBrZXlDb2RlczEgPSBuZXcgU3RvcmVkTWVtb3J5KFxyXG4gICAgICAgIFwia2V5Q29kZXNSb29tXCIsXHJcbiAgICAgICAgY3JlYXRlS2V5Q29kZXMoIFtcIkRpZ2l0MVwiLCBcIkRpZ2l0MlwiLCBcIkRpZ2l0M1wiLCBcIkRpZ2l0NFwiLCBcIkRpZ2l0NVwiXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtcIjFcIiwgXCIyXCIsIFwiM1wiLCBcIjRcIiwgXCI1XCJdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV0pXHJcbiAgICApO1xyXG5cclxuICAgIGV4cG9ydCB2YXIga2V5Q29kZXMyID0gbmV3IFN0b3JlZE1lbW9yeShcclxuICAgICAgICBcImtleUNvZGVzQWN0aW9uc1wiLFxyXG4gICAgICAgIGNyZWF0ZUtleUNvZGVzKCBbXCJLZXlRXCIsIFwiS2V5V1wiLCBcIktleUVcIiwgXCJLZXlSXCIsIFwiS2V5VFwiXSxcclxuICAgICAgICAgICAgW1wiUVwiLCBcIldcIiwgXCJFXCIsIFwiUlwiLCBcIlRcIl0sXHJcbiAgICAgICAgICAgIFt0cnVlLCB0cnVlLCB0cnVlLCB0cnVlXSlcclxuICAgICk7XHJcblxyXG5cclxuXHJcbiAgICBleHBvcnQgdmFyIGtleUNvZGVzMyA9IG5ldyBTdG9yZWRNZW1vcnkoXHJcbiAgICAgICAgXCJrZXlDb2Rlc0dsb2JhbFwiLFxyXG4gICAgICAgIGNyZWF0ZUtleUNvZGVzKCBbXCJLZXlGXCIsIFwiS2V5VlwiLCBcIktleUdcIiwgXCJLZXlCXCJdLFxyXG4gICAgICAgICAgICBbXCJGXCIsIFwiVlwiLCBcIkdcIiwgXCJCXCJdLFxyXG4gICAgICAgICAgICBbdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV0pXHJcbiAgICApO1xyXG5cclxuICAgIGV4cG9ydCB2YXIga2V5Q29kZU5vcnRoID0gbmV3IFN0b3JlZE1lbW9yeShcclxuICAgICAgICBcImtleUNvZGVOb3J0aFwiLFxyXG4gICAgICAgIDxLZXlDb2RlPiB7XHJcbiAgICAgICAgICAgIGV2Q29kZSA6IFwiS2V5U1wiLFxyXG4gICAgICAgICAgICByZXByZXNlbnRhdGlvbiA6IFwiU1wiXHJcbiAgICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBleHBvcnQgdmFyIGtleUNvZGVFYXN0ID0gbmV3IFN0b3JlZE1lbW9yeShcclxuICAgICAgICBcImtleUNvZGVFYXN0XCIsXHJcbiAgICAgICAgPEtleUNvZGU+IHtcclxuICAgICAgICAgICAgZXZDb2RlIDogXCJLZXlDXCIsXHJcbiAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uIDogXCJDXCJcclxuICAgICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIGV4cG9ydCB2YXIga2V5Q29kZVNvdXRoID0gbmV3IFN0b3JlZE1lbW9yeShcclxuICAgICAgICBcImtleUNvZGVTb3V0aFwiLFxyXG4gICAgICAgIDxLZXlDb2RlPiB7XHJcbiAgICAgICAgICAgIGV2Q29kZSA6IFwiS2V5WFwiLFxyXG4gICAgICAgICAgICByZXByZXNlbnRhdGlvbiA6IFwiWFwiXHJcbiAgICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBleHBvcnQgdmFyIGtleUNvZGVXZXN0ID0gbmV3IFN0b3JlZE1lbW9yeShcclxuICAgICAgICBcImtleUNvZGVXZXN0XCIsXHJcbiAgICAgICAgPEtleUNvZGU+IHtcclxuICAgICAgICAgICAgZXZDb2RlIDogXCJLZXlaXCIsXHJcbiAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uIDogXCJaXCJcclxuICAgICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIGV4cG9ydCB2YXIga2V5Q29kZVVwID0gbmV3IFN0b3JlZE1lbW9yeShcclxuICAgICAgICBcImtleUNvZGVVcFwiLFxyXG4gICAgICAgIDxLZXlDb2RlPiB7XHJcbiAgICAgICAgICAgIGV2Q29kZSA6IFwiS2V5QVwiLFxyXG4gICAgICAgICAgICByZXByZXNlbnRhdGlvbiA6IFwiQVwiXHJcbiAgICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBleHBvcnQgdmFyIGtleUNvZGVEb3duID0gbmV3IFN0b3JlZE1lbW9yeShcclxuICAgICAgICBcImtleUNvZGVEb3duXCIsXHJcbiAgICAgICAgPEtleUNvZGU+IHtcclxuICAgICAgICAgICAgZXZDb2RlIDogXCJLZXlEXCIsXHJcbiAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uIDogXCJEXCJcclxuICAgICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIC8vIFRPRE86IE1ha2UgdGhpcyBzYWZlciBieSBjcmVhdGluZyBpdCB1c2luZyBSb29tLkRJUkVDVElPTlMuXHJcbiAgICB2YXIgZGlyZWN0aW9uQ29kZUJ5SW5kZXggPSBba2V5Q29kZU5vcnRoLCB1bmRlZmluZWQsIGtleUNvZGVFYXN0LCB1bmRlZmluZWQsXHJcbiAgICAgICAga2V5Q29kZVNvdXRoLCB1bmRlZmluZWQsIGtleUNvZGVXZXN0LCB1bmRlZmluZWQsIGtleUNvZGVVcCwga2V5Q29kZURvd25dO1xyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXREaXJlY3Rpb25Db2RlIChkaXJlY3Rpb24gOiBEaXJlY3Rpb24pIHtcclxuICAgICAgICByZXR1cm4gZ2V0RGlyZWN0aW9uQ29kZUJ5SW5kZXgoUm9vbS5ESVJFQ1RJT05TLmluZGV4T2YoZGlyZWN0aW9uKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldERpcmVjdGlvbkNvZGVCeUluZGV4IChpbmRleCA6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiBkaXJlY3Rpb25Db2RlQnlJbmRleFtpbmRleF0uZ2V0VmFsdWUoKTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgdmFyIGF2YWlsYWJsZTEgOiBBcnJheTxLZXlDb2RlPiA9IFtdO1xyXG4gICAgZXhwb3J0IHZhciBhdmFpbGFibGUyIDogQXJyYXk8S2V5Q29kZT4gPSBbXTtcclxuICAgIGV4cG9ydCB2YXIgYXZhaWxhYmxlMyA6IEFycmF5PEtleUNvZGU+ID0gW107XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc2V0ICgpIHtcclxuICAgICAgICBhdmFpbGFibGUxID0ga2V5Q29kZXMxLmdldFZhbHVlKCkuc2xpY2UoKTtcclxuICAgICAgICBhdmFpbGFibGUyID0ga2V5Q29kZXMyLmdldFZhbHVlKCkuc2xpY2UoKTtcclxuICAgICAgICBhdmFpbGFibGUzID0ga2V5Q29kZXMzLmdldFZhbHVlKCkuc2xpY2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgc2hvd0tleXMgPSBuZXcgU3RvcmVkTWVtb3J5KFwiU2hvd0tleXNcIiwgIUVsZW1lbnRzLmlzTW9iaWxlKTtcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gYXBwbHlDb2RlIChlbGVtZW50IDogSFRNTEVsZW1lbnQsIGNvZGUgOiBLZXlDb2RlKSB7XHJcbiAgICAgICAgaWYgKGNvZGUgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZShlbGVtZW50LmRhdGFzZXRbJ3Nob3J0Y3V0J10pO1xyXG4gICAgICAgICAgICBkZWxldGUoZWxlbWVudC5kYXRhc2V0WydzaG9ydGN1dGNvZGUnXSk7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcImtleWFibGVcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZWxlbWVudC5kYXRhc2V0WydzaG9ydGN1dGNvZGUnXSA9IGNvZGUuZXZDb2RlO1xyXG4gICAgICAgICAgICBpZiAoc2hvd0tleXMuZ2V0VmFsdWUoKSkge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5kYXRhc2V0WydzaG9ydGN1dCddID0gY29kZS5yZXByZXNlbnRhdGlvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJrZXlhYmxlXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0Rmlyc3RLZXlDb2RlICgpIHtcclxuICAgICAgICBsZXQgY2hvc2VuID0gYXZhaWxhYmxlMS5sZW5ndGggPiAwID8gYXZhaWxhYmxlMSA6XHJcbiAgICAgICAgICAgIGF2YWlsYWJsZTIubGVuZ3RoID4gMCA/IGF2YWlsYWJsZTIgOlxyXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlMy5sZW5ndGggPiAwID8gYXZhaWxhYmxlMyA6IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAoY2hvc2VuICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gY2hvc2VuLnNoaWZ0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFNlY29uZEtleUNvZGUgKCkge1xyXG4gICAgICAgIGxldCBjaG9zZW4gPSBhdmFpbGFibGUyLmxlbmd0aCA+IDAgPyBhdmFpbGFibGUyIDpcclxuICAgICAgICAgICAgYXZhaWxhYmxlMy5sZW5ndGggPiAwID8gYXZhaWxhYmxlMyA6IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAoY2hvc2VuICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gY2hvc2VuLnNwbGljZSgwLCAxKVswXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0VGhpcmRLZXlDb2RlICgpIHtcclxuICAgICAgICBsZXQgY2hvc2VuID0gYXZhaWxhYmxlMy5sZW5ndGggPiAwID8gYXZhaWxhYmxlMyA6IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAoY2hvc2VuICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gY2hvc2VuLnNwbGljZSgwLCAxKVswXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBwcm9taXNlIG9mIGEga2V5IHByZXNzLlxyXG4gICAgICogSWYgYWZ0ZXIgdGltZW91dCBzZWNvbmRzIGEga2V5IHdhcyBub3QgcHJlc3NlZCwgdGhlIHByb21pc2UgZmFpbHMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZW91dFxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0TmV4dEtleSAodGltZW91dD8gOiBudW1iZXIpIDogUHJvbWlzZTxLZXlDb2RlPiB7XHJcbiAgICAgICAgbGV0IHRpbWVvdXROdW1iZXI7XHJcbiAgICAgICAgbGV0IHByb21pc2UgPSA8UHJvbWlzZTxLZXlDb2RlPj4gKG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgcHJvbWlzZVN0YWNrLnB1c2gocmVzb2x2ZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGltZW91dCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRpbWVvdXROdW1iZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBLZXlIYW5kbGVyLnJlamVjdFByb21pc2UocmVzb2x2ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XHJcbiAgICAgICAgICAgICAgICB9LCB0aW1lb3V0ICogMTAwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgIHByb21pc2UudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0TnVtYmVyKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHN0b3BHaXZpbmdOZXh0S2V5IChvcmlnaW5hbFByb21pc2UgOiBQcm9taXNlPEtleUNvZGU+KSB7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gcHJvbWlzZU9yaWdpbmFsU3RhY2suaW5kZXhPZihvcmlnaW5hbFByb21pc2UpO1xyXG4gICAgICAgIGlmIChpbmRleCAhPSAtMSkge1xyXG4gICAgICAgICAgICByZWplY3RQcm9taXNlKHByb21pc2VTdGFja1tpbmRleF0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9TYXkudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vLi4vQ29udHJvbHMvTW9kdWxlcy9LZXlIYW5kbGVyLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL1dvcmxkL01hY2hpbmVCZWdpbnMudHNcIiAvPlxyXG5jbGFzcyBTYXlJbWFnZSBpbXBsZW1lbnRzIFByaW50YWJsZUVsZW1lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyBpbWFnZU5hbWVzIDogQXJyYXk8U2F5SW1hZ2U+ID0gW107XHJcbiAgICBwdWJsaWMgc3RhdGljIGxvYWRUaW1lQ2hlY2sgOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgc3RhdGljIGltYWdlVmlld2VyIDogSFRNTEVsZW1lbnQgPSA8SFRNTEVsZW1lbnQ+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaW1hZ2VWaWV3ZXJcIik7XHJcbiAgICBwcml2YXRlIGltZ05hbWUgOiBzdHJpbmc7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0ltYWdlRGVmaW5lZCAoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcnVsZXMgPSBkb2N1bWVudC5zdHlsZVNoZWV0c1tpXVsncnVsZXMnXSB8fCBkb2N1bWVudC5zdHlsZVNoZWV0c1tpXVsnY3NzUnVsZXMnXTtcclxuICAgICAgICAgICAgICAgIGZvcih2YXIgeCBpbiBydWxlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBydWxlc1t4XS5zZWxlY3RvclRleHQgPT0gJ3N0cmluZycgJiYgcnVsZXNbeF0uc2VsZWN0b3JUZXh0ID09IFwiLlwiICsgdGhpcy5pbWdOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJDYW4ndCBjaGVjayBmb3IgdW5kZWZpbmVkIGltYWdlcy5cIik7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKGltZ05hbWUgOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmltZ05hbWUgPSBpbWdOYW1lO1xyXG5cclxuICAgICAgICBpZiAoIVNheUltYWdlLmxvYWRUaW1lQ2hlY2sgJiYgU2F5SW1hZ2UuaW1hZ2VOYW1lcy5pbmRleE9mKHRoaXMpID09IC0xKSB7XHJcbiAgICAgICAgICAgIFNheUltYWdlLmltYWdlTmFtZXMucHVzaCh0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEltYWdlRWxlbWVudCAoKSA6IEVsZW1lbnQge1xyXG4gICAgICAgIGxldCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGlmICh0aGlzLmlzSW1hZ2VEZWZpbmVkKCkpIHtcclxuICAgICAgICAgICAgaW1nLmNsYXNzTGlzdC5hZGQodGhpcy5pbWdOYW1lKTtcclxuICAgICAgICAgICAgaW1nLmNsYXNzTGlzdC5hZGQoXCJjb250ZW50SW1hZ2VcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaW1nLmNsYXNzTGlzdC5hZGQoXCJlcnJvclwiKTtcclxuICAgICAgICAgICAgaW1nLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiSW1hZ2UgXFxcIlwiICsgdGhpcy5pbWdOYW1lICsgXCJcXFwiIG5vdCBmb3VuZC5cIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaW1nLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIFNheUltYWdlLnNob3dJblZpZXdlcih0aGlzKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgQ29udHJvbHMuS2V5SGFuZGxlci5hcHBseUNvZGUoaW1nLCBDb250cm9scy5LZXlIYW5kbGVyLmltYWdlS2V5Q29kZS5nZXRWYWx1ZSgpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGltZztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UHJpbnRlZEVsZW1lbnQgKCkge1xyXG4gICAgICAgIHJldHVybiBbdGhpcy5nZXRJbWFnZUVsZW1lbnQoKV07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkb0xvYWRUaW1lQ2hlY2soKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBTYXlJbWFnZS5pbWFnZU5hbWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBpbWFnZSA9IFNheUltYWdlLmltYWdlTmFtZXNbaV07XHJcbiAgICAgICAgICAgIGlmICghaW1hZ2UuaXNJbWFnZURlZmluZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKFNldHRpbmdzLmhhcmREZWJ1Zykge1xyXG4gICAgICAgICAgICAgICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5wcmludEFzRXJyb3IoXCJJbWFnZSBcXFwiXCIgKyBpbWFnZS5pbWdOYW1lICsgXCJcXFwiIHdhcyBub3QgZm91bmQuXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkltYWdlIFxcXCJcIiArIGltYWdlLmltZ05hbWUgKyBcIlxcXCIgd2FzIG5vdCBmb3VuZC5cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgU2F5SW1hZ2UubG9hZFRpbWVDaGVjayA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBzaG93SW5WaWV3ZXIgKGltYWdlIDogU2F5SW1hZ2UpIHtcclxuICAgICAgICBpZiAoIShTYXlJbWFnZS5pbWFnZVZpZXdlci5zdHlsZS5kaXNwbGF5ID09ICdibG9jaycpKSB7XHJcbiAgICAgICAgICAgIFNheUltYWdlLmltYWdlVmlld2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBTYXlJbWFnZS5pbWFnZVZpZXdlci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBTYXlJbWFnZS5pbWFnZVZpZXdlci5jbGFzc05hbWUgPSBpbWFnZS5pbWdOYW1lO1xyXG4gICAgICAgICAgICBTYXlJbWFnZS5pbWFnZVZpZXdlci5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIFNheUltYWdlLmltYWdlVmlld2VyLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG59XHJcblxyXG5tb2R1bGUgTWFjaGluZUJlZ2lucyB7XHJcbiAgICBleHBvcnQgbGV0IEltYWdlTG9hZFRpbWVDaGVjayA9IE1hY2hpbmVCZWdpbnMucnVsZWJvb2suY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfSElHSEVTVCwgLy8gV2Ugd2FudCB0aGlzIHRvIHByaW50IHRvIHRoZSB0b3Agb2YgdGhlIGNvbnNvbGVcclxuICAgICAgICBuYW1lIDogXCJDaGVjayBmb3IgdW5kZWZpbmVkIGltYWdlc1wiLFxyXG4gICAgICAgIGNvZGUgOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBTYXlJbWFnZS5kb0xvYWRUaW1lQ2hlY2soKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiQ2FuJ3QgY2hlY2sgZm9yIHVuZGVmaW5lZCBpbWFnZXMuXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vV29ybGQvQ2xhc3Nlcy9SdWxlYm9vay50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9Xb3JsZC9DbGFzc2VzL1J1bGUudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiU2F5L09uZU9mLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIlNheS9TYXlJbWFnZS50c1wiIC8+XHJcblxyXG5pbnRlcmZhY2UgUHJpbnRhYmxlIHtcclxuICAgIGdldFByaW50ZWROYW1lICgpIDogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgUHJpbnRhYmxlRWxlbWVudCB7XHJcbiAgICBnZXRQcmludGVkRWxlbWVudCAoKSA6IEFycmF5PEVsZW1lbnQ+O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgU2F5Tm91biB7XHJcbiAgICBzYXkgOiBTYXk7XHJcbiAgICBub3VuIDogYW55O1xyXG59XHJcblxyXG5jbGFzcyBTYXlhYmxlT2JqZWN0IHt9XHJcblxyXG5jbGFzcyBTYXkge1xyXG4gICAgLy8gVE9ETzogU2VwYXJhdGUgb3duIHNlcXVlbmNlIGZyb20gcHJvY2Vzc2luZyBxdWV1ZS4gVGhpcyB3YXkgYSBTYXkgd2l0aCBmdW5jdGlvbnMvb3RoZXIgc2F5cyBjYW4gYmUgcmV1dGlsaXplZCB3aXRoIGZyZXNoIHZhbHVlcy5cclxuICAgIHB1YmxpYyBzZXF1ZW5jZSA6IEFycmF5IDxPYmplY3Q+ID0gW107XHJcbiAgICBwdWJsaWMgc2tpcGJyZWFrcyA6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIExJTkVfQlJFQUsgOiBPYmplY3QgPSBuZXcgU2F5YWJsZU9iamVjdCgpO1xyXG4gICAgcHVibGljIHN0YXRpYyBQQVJBR1JBUEhfQlJFQUsgOiBPYmplY3QgPSBuZXcgU2F5YWJsZU9iamVjdCgpO1xyXG4gICAgcHVibGljIHN0YXRpYyBSVU5fUEFSQUdSQVBIIDogT2JqZWN0ID0gbmV3IFNheWFibGVPYmplY3QoKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgUlVOX1BBUkFHUkFQSF9PRkYgOiBPYmplY3QgPSBuZXcgU2F5YWJsZU9iamVjdCgpO1xyXG4gICAgcHVibGljIHN0YXRpYyBDRU5URVJFRCA6IE9iamVjdCA9IG5ldyBTYXlhYmxlT2JqZWN0KCk7XHJcbiAgICBwdWJsaWMgc3RhdGljIGIgOiBPYmplY3QgPSBuZXcgU2F5YWJsZU9iamVjdCgpO1xyXG4gICAgcHVibGljIHN0YXRpYyBET19QQVJBR1JBUEhfQlJFQUsgPSBuZXcgU2F5YWJsZU9iamVjdCgpO1xyXG4gICAgcHVibGljIHN0YXRpYyBET19MSU5FX0JSRUFLID0gbmV3IFNheWFibGVPYmplY3QoKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgQ09DSyA9IG5ldyBTYXlhYmxlT2JqZWN0KCk7XHJcbiAgICBwdWJsaWMgc3RhdGljIFBVU1NZID0gbmV3IFNheWFibGVPYmplY3QoKTtcclxuXHJcbiAgICBwcml2YXRlIGNlbnRlcmVkIDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoLi4ub2Jqcykge1xyXG4gICAgICAgIHRoaXMuYWRkKC4uLm9ianMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGQgKC4uLm9ianMgOiBBcnJheTxTYXkgfCBPbmVPZiB8IE9iamVjdCB8IFByaW50YWJsZSB8IHN0cmluZyB8IG51bWJlciB8IFN0cmluZyB8ICgoc2F5IDogU2F5KSA9PiBzdHJpbmcpPikge1xyXG4gICAgICAgIHRoaXMuc2VxdWVuY2UucHVzaCguLi5vYmpzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVtb3ZlICguLi5vYmpzKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuc2VxdWVuY2UuaW5kZXhPZihvYmpzW2ldKTtcclxuICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VxdWVuY2Uuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNFbXB0eSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VxdWVuY2UubGVuZ3RoIDwgMTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcGFyYWdyYXBocyA6IEFycmF5PEFycmF5PEVsZW1lbnQgfCBUZXh0Pj47XHJcbiAgICBwdWJsaWMgY3VycmVudFBhcmFncmFwaCA6IEFycmF5PEVsZW1lbnQgfCBUZXh0PjtcclxuICAgIHB1YmxpYyBzZXF1ZW5jZVJ1bm5lciA6IG51bWJlcjtcclxuXHJcbiAgICAvLyBUT0RPOiBDcmVhdGUgYSBzaW5nbGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBlbGVtZW50IG9mIGFueXRoaW5nXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0VGV4dE9mIChpbmRleCA6IG51bWJlciwgc2VxIDogYW55KSA6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICAgICAgbGV0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRFbGVtZW50Rm9yKGluZGV4LCBzZXEpO1xyXG5cclxuICAgICAgICBsZXQgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudHNbaV0gIT0gXCJudW1iZXJcIikge1xyXG4gICAgICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGVsZW1lbnRzW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZGl2LmlubmVyVGV4dDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZG9MaW5lQnJlYWsgKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRQYXJhZ3JhcGgubGVuZ3RoID4gMCAmJiAhdGhpcy5za2lwYnJlYWtzKSB7XHJcbiAgICAgICAgICAgIGxldCBiciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKTtcclxuICAgICAgICAgICAgYnIuY2xhc3NMaXN0LmFkZChcImxpbmVicmVha1wiKTtcclxuICAgICAgICAgICAgbGV0IHRpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XHJcbiAgICAgICAgICAgIHRpLmNsYXNzTGlzdC5hZGQoXCJ0ZXh0SW5kZW50ZXJcIik7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhcmFncmFwaC5wdXNoKGJyLCB0aSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkb1BhcmFncmFwaEJyZWFrICgpIHtcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50UGFyYWdyYXBoLmxlbmd0aCA+IDAgJiYgIXRoaXMuc2tpcGJyZWFrcykge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmFncmFwaHMucHVzaCh0aGlzLmN1cnJlbnRQYXJhZ3JhcGgpO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRQYXJhZ3JhcGggPSBbXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldFBhcmFncmFwaHMgKCkgOiBQcm9taXNlPEFycmF5PEFycmF5PEVsZW1lbnR8VGV4dD4+PiB7XHJcbiAgICAgICAgdGhpcy5wYXJhZ3JhcGhzID0gW107XHJcbiAgICAgICAgdGhpcy5jdXJyZW50UGFyYWdyYXBoID0gW107XHJcbiAgICAgICAgdGhpcy5za2lwYnJlYWtzID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGZvciAodGhpcy5zZXF1ZW5jZVJ1bm5lciA9IDA7IHRoaXMuc2VxdWVuY2VSdW5uZXIgPCB0aGlzLnNlcXVlbmNlLmxlbmd0aDsgdGhpcy5zZXF1ZW5jZVJ1bm5lcisrKSB7XHJcbiAgICAgICAgICAgIGxldCBzZXEgPSB0aGlzLnNlcXVlbmNlW3RoaXMuc2VxdWVuY2VSdW5uZXJdO1xyXG4gICAgICAgICAgICBpZiAoc2VxIGluc3RhbmNlb2YgT25lT2YpIHtcclxuICAgICAgICAgICAgICAgIHNlcSA9IHNlcS5nZXRPbmUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHNlcSA9PSBTYXkuQ0VOVEVSRUQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2VudGVyZWQodHJ1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VxID09IFNheS5iKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgYm9sZE9iamVjdHMgPSBbXTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLnNlcXVlbmNlUnVubmVyICsgMTsgaSA8IHRoaXMuc2VxdWVuY2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2FuZGlkYXRlID0gdGhpcy5zZXF1ZW5jZVJ1bm5lcltpXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlID09IFNheS5iKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VxdWVuY2Uuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBib2xkT2JqZWN0cy5wdXNoKHRoaXMuc2VxdWVuY2Uuc3BsaWNlKGksIDEpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoYm9sZE9iamVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBib2xkID0gbmV3IFNheUJvbGQoLi4uYm9sZE9iamVjdHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VxdWVuY2Uuc3BsaWNlKHRoaXMuc2VxdWVuY2VSdW5uZXIgKyAxLCAwLCBib2xkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChzZXEgPT0gU2F5LkNPQ0spIHtcclxuICAgICAgICAgICAgICAgIGlmIChIdW1hbm9pZFBlbmlzICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb2NrID0gSHVtYW5vaWRQZW5pcy5nZXRTeW5vbnltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UGFyYWdyYXBoLnB1c2goZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29jaykpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gIGVsc2UgaWYgKHNlcSA9PSBTYXkuUFVTU1kpIHtcclxuICAgICAgICAgICAgICAgIGlmIChIdW1hbm9pZFZhZ2luYSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFnaW5hID0gSHVtYW5vaWRWYWdpbmEuZ2V0U3lub255bSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFBhcmFncmFwaC5wdXNoKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHZhZ2luYSkpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VxID09IFNheS5MSU5FX0JSRUFLKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRvTGluZUJyZWFrKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VxID09IFNheS5QQVJBR1JBUEhfQlJFQUspIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZG9QYXJhZ3JhcGhCcmVhaygpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNlcSA9PSBTYXkuUlVOX1BBUkFHUkFQSCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5za2lwYnJlYWtzID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChzZXEgPT0gU2F5LlJVTl9QQVJBR1JBUEhfT0ZGKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNraXBicmVha3MgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc2VxID09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICAgICAgbGV0IGZPYmogPSAoPChzOiBTYXkpID0+IGFueT4gc2VxKSh0aGlzKTtcclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZPYmopKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IGZPYmoubGVuZ3RoIC0gMTsgayA+PSAwOyBrLS0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXF1ZW5jZS5zcGxpY2UodGhpcy5zZXF1ZW5jZVJ1bm5lciArIDEsIDAsIGZPYmpba10pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZk9iaiAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcXVlbmNlLnNwbGljZSh0aGlzLnNlcXVlbmNlUnVubmVyICsgMSwgMCwgZk9iaik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlcXVlbmNlLnNwbGljZSh0aGlzLnNlcXVlbmNlUnVubmVyLCAxKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VxdWVuY2VSdW5uZXItLTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChzZXEuY29uc3RydWN0b3IgPT0gdGhpcy5jb25zdHJ1Y3Rvcikge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgayA9ICg8U2F5PiBzZXEpLnNlcXVlbmNlLmxlbmd0aCAtIDE7IGsgPj0gMDsgay0tKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXF1ZW5jZS5zcGxpY2UodGhpcy5zZXF1ZW5jZVJ1bm5lciArIDEsIDAsICg8U2F5PiBzZXEpLnNlcXVlbmNlW2tdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuc2VxdWVuY2Uuc3BsaWNlKHRoaXMuc2VxdWVuY2VSdW5uZXIsIDEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXF1ZW5jZVJ1bm5lci0tO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNlcSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudEZvcih0aGlzLnNlcXVlbmNlUnVubmVyLCBzZXEpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50c1tpXSA9PT0gU2F5LkRPX0xJTkVfQlJFQUspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb0xpbmVCcmVhaygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudHNbaV0gPT09IFNheS5ET19QQVJBR1JBUEhfQlJFQUspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb1BhcmFncmFwaEJyZWFrKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UGFyYWdyYXBoLnB1c2goZWxlbWVudHNbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIGxpbmUgYnJlYWsgKyB0ZXh0IGluZGVudGVyIGlmIHRoZXkgYXJlIHRoZSBsYXN0IGluIHRoZSBzYXlcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50UGFyYWdyYXBoLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJhZ3JhcGhzLnB1c2godGhpcy5jdXJyZW50UGFyYWdyYXBoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnBhcmFncmFwaHM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb3JkIEhhdmUgbWVyY3ksIEkgd2lzaCB0byBuZXZlciBoYXZlIHRvIGRlYnVnIHRoaXMgcGllY2Ugb2YgZ29kLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XHJcbiAgICAgKiBAcGFyYW0ge1NheSB8IE9uZU9mIHwgT2JqZWN0IHwgUHJpbnRhYmxlIHwgc3RyaW5nIHwgbnVtYmVyIHwgKChzYXk6IFNheSkgPT4gc3RyaW5nKSB8ICgoc2F5OiBTYXkpID0+IFByb21pc2U8c3RyaW5nPikgfCBFbGVtZW50IHwgVGV4dH0gb2JqXHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxFbGVtZW50IHwgVGV4dD4+fVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0RWxlbWVudEZvciAoaW5kZXggOiBudW1iZXIsIG9iaiA6IFNheSB8IE9uZU9mIHwgT2JqZWN0IHwgUHJpbnRhYmxlIHwgc3RyaW5nIHwgbnVtYmVyIHwgU3RyaW5nIHwgKChzYXkgOiBTYXkpID0+IHN0cmluZykgfCAoKHNheSA6IFNheSkgPT4gUHJvbWlzZTxzdHJpbmc+KSB8IEVsZW1lbnQgfCBUZXh0KSA6IFByb21pc2U8QXJyYXk8RWxlbWVudHxUZXh0Pj4ge1xyXG4gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBQcm9taXNlKSB7XHJcbiAgICAgICAgICAgIG9iaiA9IGF3YWl0IG9iajtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBvYmogPT0gXCJzdHJpbmdcIiB8fCBvYmogaW5zdGFuY2VvZiBTdHJpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSg8c3RyaW5nPiBvYmopXTtcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmogPT0gXCJudW1iZXJcIiB8fCBvYmogaW5zdGFuY2VvZiBOdW1iZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgocGFyc2VGbG9hdCgoPG51bWJlcj4gb2JqKS50b0ZpeGVkKDIpKS8xKS50b1N0cmluZygpKV07XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqID09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICBsZXQgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldEVsZW1lbnRGb3IoLTEsICg8YW55PiBvYmopKHRoaXMpKTtcclxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRzO1xyXG4gICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgU2F5SW1hZ2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtvYmouZ2V0SW1hZ2VFbGVtZW50KCldO1xyXG4gICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgU2F5TGVmdFJpZ2h0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiAoYXdhaXQgb2JqLmdldFB1cmVFbGVtZW50cygpKTtcclxuICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFNheSkge1xyXG4gICAgICAgICAgICBsZXQgZWxlbWVudHMgPSBhd2FpdCBvYmouZ2V0UHVyZUVsZW1lbnRzKHRoaXMpO1xyXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudHM7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzUHJvcGVyRWxlbWVudChvYmopKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbPEVsZW1lbnQ+IG9ial07XHJcbiAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBPYmplY3QpIHtcclxuICAgICAgICAgICAgbGV0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5wcmludE5hbWUob2JqKTtcclxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRzO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0UHVyZUVsZW1lbnRzIChzYXk/IDogU2F5KSA6IFByb21pc2U8QXJyYXk8RWxlbWVudCB8IFRleHQ+PiB7XHJcbiAgICAgICAgbGV0IHBhcmFncmFwaHMgPSBhd2FpdCB0aGlzLmdldFBhcmFncmFwaHMoKTtcclxuICAgICAgICByZXR1cm4gcGFyYWdyYXBocy5sZW5ndGggPT0gMSA/IHBhcmFncmFwaHNbMF0gOiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBwYXJhZ3JhcGhzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0Q2VudGVyZWQgKGJvb2wgOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5jZW50ZXJlZCA9IGJvb2w7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldEhUTUwgKHRhZ05hbWUgOiBzdHJpbmcsIGNsYXNzTGlzdCA6IEFycmF5PHN0cmluZz4sIHNpbmdsZVBhcmFncmFwaD8gOiBib29sZWFuKSA6IFByb21pc2U8QXJyYXk8SFRNTEVsZW1lbnQ+PiB7XHJcbiAgICAgICAgbGV0IHBhcmFncmFwaHMgPSBhd2FpdCB0aGlzLmdldFBhcmFncmFwaHMoKTtcclxuXHJcbiAgICAgICAgLy8gUmVkdWNlIHRvIHNpbmdsZSBwYXJhZ3JhcGhcclxuICAgICAgICBpZiAoc2luZ2xlUGFyYWdyYXBoID09IHRydWUgJiYgcGFyYWdyYXBocy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIHBhcmFncmFwaHMgPSBbQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSwgcGFyYWdyYXBocyldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGVsZW1lbnRzID0gW107XHJcblxyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgcGFyYWdyYXBoID0gcGFyYWdyYXBoc1tpXTsgcGFyYWdyYXBoICE9IHVuZGVmaW5lZDsgcGFyYWdyYXBoID0gcGFyYWdyYXBoc1srK2ldKSB7XHJcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSA8SFRNTEVsZW1lbnQ+IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XHJcbiAgICAgICAgICAgIGlmIChjbGFzc0xpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50LmNsYXNzTGlzdC5hZGQoLi4uY2xhc3NMaXN0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgayA9IDAsIGVsZSA9IHBhcmFncmFwaFtrXTsgZWxlIT0gdW5kZWZpbmVkOyBlbGUgPSBwYXJhZ3JhcGhbKytrXSkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGVsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxlbWVudHMucHVzaChwYXJlbnQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuY2VudGVyZWQpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudC5jbGFzc0xpc3QuYWRkKFwiY2VudGVyZWRcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBlbGVtZW50cztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0SFRNTENvbnRlbnQgKCkgOiBQcm9taXNlPEFycmF5PEhUTUxFbGVtZW50Pj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEhUTUwoXCJwXCIsIFtcImNvbnRlbnRcIl0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc1Byb3BlckVsZW1lbnQgKG8pIDogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgdHlwZW9mIE5vZGUgPT09IFwib2JqZWN0XCIgPyBvIGluc3RhbmNlb2YgTm9kZSA6XHJcbiAgICAgICAgICAgICAgICBvICYmIHR5cGVvZiBvID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvLm5vZGVUeXBlID09PSBcIm51bWJlclwiICYmIHR5cGVvZiBvLm5vZGVOYW1lPT09XCJzdHJpbmdcIlxyXG4gICAgICAgICkgfHwgKFxyXG4gICAgICAgICAgICB0eXBlb2YgSFRNTEVsZW1lbnQgPT09IFwib2JqZWN0XCIgPyBvIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgOiAvL0RPTTJcclxuICAgICAgICAgICAgICAgIG8gJiYgdHlwZW9mIG8gPT09IFwib2JqZWN0XCIgJiYgbyAhPT0gbnVsbCAmJiBvLm5vZGVUeXBlID09PSAxICYmIHR5cGVvZiBvLm5vZGVOYW1lPT09XCJzdHJpbmdcIlxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBiZWZvcmVQcmludGluZyA9IG5ldyBSdWxlYm9vazxhbnk+KFwiQmVmb3JlIHByaW50aW5nIHRoZSBuYW1lIG9mIHNvbWV0aGluZ1wiKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgcHJpbnRpbmcgPSBuZXcgUnVsZWJvb2s8YW55PihcIlByaW50aW5nIHRoZSBuYW1lIG9mIHNvbWV0aGluZ1wiKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgYWZ0ZXJQcmludGluZyA9IG5ldyBSdWxlYm9vazxhbnk+KFwiQWZ0ZXIgcHJpbnRpbmcgdGhlIG5hbWUgb2Ygc29tZXRoaW5nXCIpO1xyXG5cclxuICAgIHB1YmxpYyBjdXJyZW50Tm91biA6IGFueTtcclxuICAgIHB1YmxpYyBjdXJyZW50Tm91bkVsZW1lbnRzIDogQXJyYXk8RWxlbWVudCB8IFRleHQ+O1xyXG5cclxuICAgIHB1YmxpYyBhc3luYyBwcmludE5hbWUgKHRoaW5nIDogYW55KSA6IFByb21pc2U8QXJyYXk8RWxlbWVudCB8IFRleHQ+PiB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Tm91biA9IHRoaW5nO1xyXG4gICAgICAgIHRoaXMuY3VycmVudE5vdW5FbGVtZW50cyA9IFtdO1xyXG4gICAgICAgIGxldCBiZWZvcmUgPSBTYXkuYmVmb3JlUHJpbnRpbmcuZXhlY3V0ZSh7bm91biA6IHRoaXN9KTtcclxuICAgICAgICBhd2FpdCBiZWZvcmU7XHJcbiAgICAgICAgbGV0IHByaW50ID0gU2F5LnByaW50aW5nLmV4ZWN1dGUoe25vdW4gOiB0aGlzfSk7XHJcbiAgICAgICAgYXdhaXQgcHJpbnQ7XHJcbiAgICAgICAgbGV0IGFmdGVyID0gU2F5LmFmdGVyUHJpbnRpbmcuZXhlY3V0ZSh7bm91biA6IHRoaXN9KTtcclxuICAgICAgICBhd2FpdCBhZnRlcjtcclxuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50Tm91bkVsZW1lbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgaGlzSGVyc0l0cyAodGFyZ2V0IDogVGhpbmcsIHN0YXJ0T2ZTZW50ZW5jZT8gOiBib29sZWFuKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTYXlIaXNIZXJzSXRzKHRhcmdldCk7XHJcbiAgICAgICAgLy8gbGV0IHJlc3VsdCA6IFN0cmluZztcclxuICAgICAgICAvLyBpZiAodGFyZ2V0ID09IFdvcmxkU3RhdGUucGxheWVyKSB7XHJcbiAgICAgICAgLy8gICAgIHJlc3VsdCA9IFwieW91clwiO1xyXG4gICAgICAgIC8vIH0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgUGVyc29uKSB7XHJcbiAgICAgICAgLy8gICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2hldGhlciB0YXJnZXQgaXMgbWFsZSBvciBmZW1hbGVcclxuICAgICAgICAvLyAgICAgcmVzdWx0ID0gXCJoaXNcIjtcclxuICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgICByZXN1bHQgPSBcIml0c1wiO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBpZiAoc3RhcnRPZlNlbnRlbmNlID09IHRydWUpIHtcclxuICAgICAgICAvLyAgICAgcmVzdWx0ID0gcmVzdWx0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcmVzdWx0LnN1YnN0cigxLCByZXN1bHQubGVuZ3RoIC0xKTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxufVxyXG5cclxuU2F5LnByaW50aW5nLmFkZFJ1bGUobmV3IFJ1bGUoe1xyXG4gICAgbmFtZSA6IFwiUHJpbnRpbmcgdGhlIG5hbWUgb2YgYSBQcmludGFibGUgRWxlbWVudFwiLFxyXG4gICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfTE9XLFxyXG4gICAgY29kZSA6IChydWxlYm9vayA6IFJ1bGVib29rUnVubmVyPGFueT4pID0+IHtcclxuICAgICAgICBsZXQgc2F5ID0gPFNheT4gcnVsZWJvb2subm91bjtcclxuICAgICAgICBpZiAoKDxhbnk+IHNheS5jdXJyZW50Tm91bikuZ2V0UHJpbnRlZEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgc2F5LmN1cnJlbnROb3VuRWxlbWVudHMucHVzaCguLi4oPFByaW50YWJsZUVsZW1lbnQ+IHNheS5jdXJyZW50Tm91bikuZ2V0UHJpbnRlZEVsZW1lbnQoKSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBXZSBvbmx5IHdhbnQgdG8gcHJpbnQgc29tZXRoaW5nIG9uY2UsIHNvIHJldHVybiB0cnVlIHRvIHN0b3Agb3RoZXJzIGZyb20gcnVubmluZ1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSkpO1xyXG5cclxuU2F5LnByaW50aW5nLmFkZFJ1bGUobmV3IFJ1bGUoe1xyXG4gICAgbmFtZSA6IFwiUHJpbnRpbmcgdGhlIG5hbWUgb2YgYSBQcmludGFibGVcIixcclxuICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0xPVyxcclxuICAgIGNvZGUgOiAocnVsZWJvb2sgOiBSdWxlYm9va1J1bm5lcjxhbnk+KSA9PiB7XHJcbiAgICAgICAgbGV0IHNheSA9IDxTYXk+IHJ1bGVib29rLm5vdW47XHJcbiAgICAgICAgaWYgKCg8YW55PiBzYXkuY3VycmVudE5vdW4pLmdldFByaW50ZWROYW1lKSB7XHJcbiAgICAgICAgICAgIGxldCB0aGluZ0VsZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFxyXG4gICAgICAgICAgICAgICAgKDxQcmludGFibGU+IHNheS5jdXJyZW50Tm91bikuZ2V0UHJpbnRlZE5hbWUoKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBzYXkuY3VycmVudE5vdW5FbGVtZW50cy5wdXNoKHRoaW5nRWxlKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIFdlIG9ubHkgd2FudCB0byBwcmludCBzb21ldGhpbmcgb25jZSwgc28gcmV0dXJuIHRydWUgdG8gc3RvcCBvdGhlcnMgZnJvbSBydW5uaW5nXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59KSk7XHJcblxyXG5TYXkucHJpbnRpbmcuYWRkUnVsZShuZXcgUnVsZSh7XHJcbiAgICBuYW1lIDogXCJQcmludGluZyB0aGUgbmFtZSBvZiBhbiB1bmtub3duIG9iamVjdFwiLFxyXG4gICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfTE9XRVNULFxyXG4gICAgcHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0xPV0VTVCxcclxuICAgIGNvZGUgOiAocnVsZWJvb2sgOiBSdWxlYm9va1J1bm5lcjxhbnk+KSA9PiB7XHJcbiAgICAgICAgbGV0IHNheSA9IDxTYXk+IHJ1bGVib29rLm5vdW47XHJcbiAgICAgICAgaWYgKCg8YW55PiBzYXkuY3VycmVudE5vdW4pLmdldFByaW50ZWROYW1lKSB7XHJcbiAgICAgICAgICAgIHNheS5jdXJyZW50Tm91bkVsZW1lbnRzLnB1c2goXHJcbiAgICAgICAgICAgICAgICAoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoKDxPYmplY3Q+IHNheS5jdXJyZW50Tm91bikudG9TdHJpbmcoKSkpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBXZSBvbmx5IHdhbnQgdG8gcHJpbnQgc29tZXRoaW5nIG9uY2UsIHNvIHJldHVybiB0cnVlIHRvIHN0b3Agb3RoZXJzIGZyb20gcnVubmluZ1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSkpO1xyXG5cclxuLy8gdmFyIG1zZyA9IG5ldyBTYXkgKFwiSGVsbG8hIFdlbGNvbWUgdG8gVGhlIE9iZWxpc2shIFRoaXMgaXMgYSBnYW1lIHdpdGggXCIsIGpvaG5UaGVPZ3JlLCBcIiBzbyB5b3UgbXVzdCBiZSBjYXJlZnVsIVwiKTtcclxuLy9cclxuLy8gdmFyIG90aGVyU2F5ID0gbmV3IFNheSAobXNnLCBcIldpbGwgaGF2ZSB0byBsZWFybiBob3cgdG8gaGFuZGxlIGRvdHMuXCIpOyIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9DaGFyYWN0ZXJPcmlnaW4udHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vRWxlbWVudHMvQ2xhc3Nlcy9TYXkudHNcIiAvPlxyXG5tb2R1bGUgQ2hhcmFjdGVyQ3JlYXRpb24ge1xyXG4gICAgZXhwb3J0IGxldCBGYWxzZWx5QWNjdXNlZCA9IG5ldyBDaGFyYWN0ZXJPcmlnaW4oXCJGYWxzZWx5IEFjY3VzZWRcIik7XHJcbiAgICBGYWxzZWx5QWNjdXNlZC5uYW1lID0gXCJGYWxzZWx5IEFjY3VzZWRcIjtcclxuICAgIEZhbHNlbHlBY2N1c2VkLmRlc2NyaXB0aW9uPSBuZXcgU2F5KFxyXG4gICAgICAgIFwiWW91IG1hZGUgc29tZSBhbGxlZ2F0aW9ucyBhZ2FpbnN0IGEgcG93ZXJmdWwgbWFuIGluIHlvdXIgdmlsbGFnZS4gV2hldGhlciB0aG9zZSB3ZXJlIHRydWUgb3Igbm90IGRpZG4ndCBtYXR0ZXIsIGhlIHdhcyBtb3N0IGRpc3BsZWFzZWQgd2l0aCB5b3VyIGFjdGlvbnMgYW5kIGRpZCBhbGwgaGUgY291bGQgdG8gZW5kIHlvdXIgbGlmZSBhcyB5b3Uga25ldyBpdC4gSnVzdCBhcyB5b3Ugd2VyZSBhYm91dCB0byBiZSBleGVjdXRlZCBmb3IgeW91ciBpbmV4aXN0ZW50IGNyaW1lcywgdGhlIG1hbiBhc2tlZCBmb3IgbWVyY3kuIFlvdSB0aG91Z2h0IGhlIHdhc24ndCB3aWxsaW5nIHRvIGdvIHRoaXMgZmFyIHdpdGggaGlzIGxpZXMsIG9ubHkgdG8gaGF2ZSB5b3VyIGhvcGVzIGNydXNoZWQgd2hlbiB5b3Ugbm90aWNlZCBhIHNtaXJrIGluIGhpcyBldmlsIGZhY2UuXFxuXCIsXHJcbiAgICAgICAgU2F5LlBBUkFHUkFQSF9CUkVBSyxcclxuICAgICAgICBcIlRoZSBtYW4gY2xhaW1lZCBoZSB3YW50ZWQgdG8gZm9yZ2l2ZSB5b3UsIGJ1dCB3b3VsZCBuZWVkIHByb29mIG9mIHlvdXIgcmVncmV0LiBZb3UgcmVjZWl2ZWQgYW4gYWx0ZXJuYXRpdmUgc2VudGVuY2U6IGdvIHRvIHRoZSBUb3dlciBhbmQgZmluZCBhIHdheSB0byBkZXN0cm95IGl0LiBTdXJlbHkgYW4gaW1wb3NzaWJsZSB0YXNrLiBTdXJlbHkganVzdCBhbm90aGVyIGRlYXRoIHNlbnRlbmNlLi4uIG9yIHdvcnNlLiBCdXQgaXQncyBub3QgbGlrZSB5b3UgaGF2ZSBhIGNob2ljZSBpbiB0aGUgbWF0dGVyLlwiXHJcbiAgICApO1xyXG4gICAgRmFsc2VseUFjY3VzZWQuYm9udXNTdGF0cyA9IFwiVGhpcyBvcmlnaW4gY29uZmVycyBubyBib251c2VzLCBidXQgeW91IGhhdmUgY29tcGxldGUgZnJlZWRvbSB3aXRoIHlvdXIgcGVya3MuXCI7XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vUGVyay50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9FbGVtZW50cy9DbGFzc2VzL1NheS50c1wiIC8+XHJcbm1vZHVsZSBDaGFyYWN0ZXJDcmVhdGlvbiB7XHJcbiAgICBleHBvcnQgbGV0IEhvcm55VmlyZ2luID0gbmV3IFBlcmsoXCJIb3JueSBWaXJnaW5cIik7XHJcbiAgICBIb3JueVZpcmdpbi5kZXNjcmlwdGlvbiA9IG5ldyBTYXkoXCJXaGljaGV2ZXIgbGlmZSB5b3UgbGVkIHVwIHRvIHRoaXMgcG9pbnQgbmV2ZXIgYWxsb3dlZCB5b3UgdG8gZXhwbG9yZSB5b3VyIHNleHVhbGl0eS4gQXMgYSByZXN1bHQsIHlvdSdyZSBib3RoIHZpcmdpbiBBTkQgZXh0cmVtZWx5IGhvcm55LiBUaGlzIHBlcmsgbWFrZXMgaXQgc28gdGhhdCB0aGUgV29ybGQgRGVwcmF2aXR5IGFyb3VuZCB0aGUgVG93ZXIgaXMgaW5pdGlhbGx5IGhpZ2hlciBhbmQgcmlzZXMgZmFzdGVyLCBob3dldmVyIHlvdSBhcmUgbm90IGFzIGFmZmVjdGVkIGJ5IHRoaXMgcmlzaW5nIERlcHJhdml0eSBhcm91bmQgeW91LlwiLFxyXG4gICAgICAgIFNheS5QQVJBR1JBUEhfQlJFQUssIFwiVGhpcyBwZXJrIGlzIG1hbmRhdG9yeSBmb3IgQ2hhbXBpb25zIGFuZCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIG1vc3Qgc2V4LXJlbGF0ZWQgcGVya3MuXCIpO1xyXG5cclxuICAgIEhvcm55VmlyZ2luLmZvcmNlZFN0YXR1cyA9IChob3JueVZpcmdpbiA6IFBlcmspID0+IHtcclxuICAgICAgICBpZiAoQ2hhcmFjdGVyQ3JlYXRpb24uZ2V0T3JpZ2luKCkgPT0gQ2hhcmFjdGVyQ3JlYXRpb24uQ2hhbXBpb25PcmlnaW4pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChTbHV0LmlzRW5hYmxlZCh0cnVlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcblxyXG5cclxuICAgIGV4cG9ydCBsZXQgU2x1dCA9IG5ldyBQZXJrKFwiVW5yZWRlZW1hYmxlIFNsdXRcIik7XHJcbiAgICBTbHV0LmRlc2NyaXB0aW9uID0gbmV3IFNheShcIlNpbXBseSBwdXQ6IHlvdSByZWFsbHkgbGlrZSBzZXguIFlvdXIgRGVwcmF2aXR5IHN0YXJ0cyBvZmYgaGlnaGVyIGFuZCByaXNlcyBldmVuIGZhc3RlciwgYWxzbyBhZmZlY3RpbmcgV29ybGQgRGVwcmF2aXR5LiBIb3dldmVyLCB5b3UgbGV2ZWwgdXAgc2V4LXJlbGF0ZWQgU2tpbGxzIGZhc3Rlci5cIixcclxuICAgICAgICBTYXkuUEFSQUdSQVBIX0JSRUFLLCBcIlRoaXMgcGVyayBpcyBub3QgY29tcGF0aWJsZSB3aXRoIFwiLCBIb3JueVZpcmdpbi5uYW1lLCBcIi5cIik7XHJcbiAgICBTbHV0LmZvcmNlZFN0YXR1cyA9ICgpID0+IHtcclxuICAgICAgICBpZiAoSG9ybnlWaXJnaW4uaXNFbmFibGVkKHRydWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuXHJcblxyXG4gICAgZXhwb3J0IGxldCBTZW5zaXRpdmVIb2xlcyA9IG5ldyBQZXJrKFwiU2Vuc2l0aXZlIEhvbGVzXCIpO1xyXG4gICAgU2Vuc2l0aXZlSG9sZXMuZGVzY3JpcHRpb24gPSBcIllvdSBhcmUgdmVyeSBzZW5zaXRpdmUgdG8gYW55IGtpbmQgb2YgcmVjZXB0aXZlIHBlbmV0cmF0aW9uLiBZb3UgaGF2ZSBhIGhhcmRlciB0aW1lIGVzY2FwaW5nIGdyYXBwbGVzIHdoaWxlIGJlaW5nIHBlbmV0cmF0ZWQgYW5kIGFuIGVhc2llciB0aW1lIG9yZ2FzbWluZyBmcm9tIGl0LCBidXQgZ2V0dGluZyBhcm91c2VkIGZhc3RlciBhbHNvIG1lYW5zIHlvdSB0YWtlIGxlc3MgZGFtYWdlIGZyb20gaXQuXCI7XHJcblxyXG5cclxuXHJcbn0iLCIvKipcclxuICogQ29udGVudCB0eXBlcyBuZWVkIHRvIGJlIGFsbG93ZWQvZm9yYmlkZGVuIGF0IHRoZSBnbG9iYWwgbGV2ZWwsIHJhdGhlciB0aGFuIGEgc2F2ZSBsZXZlbC5cclxuICogVGhleSBzaG91bGQgYmUgYWJsZSB0byBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lLlxyXG4gKiBUaGV5IHNob3VsZCBiZSBhcyBsaXR0bGUgdmFndWUgYXMgaXMgcmVhc29uYWJsZS5cclxuICovXHJcbm1vZHVsZSBDb250ZW50SGFuZGxlciB7XHJcbiAgICBsZXQgY29udGVudEhhc2ggOiB7W2lkIDogc3RyaW5nXSA6IENvbnRlbnRUeXBlfSA9IHt9O1xyXG4gICAgbGV0IGNvbnRlbnRBcnJheSA6IEFycmF5PENvbnRlbnRUeXBlPiA9IFtdO1xyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckNvbnRlbnRUeXBlICh0eXBlIDogQ29udGVudFR5cGUpIHtcclxuICAgICAgICBpZiAoY29udGVudEhhc2hbdHlwZS5nZXRJZCgpXSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIltDb250ZW50SGFuZGxlcn0gQ2FuJ3QgcmVnaXN0ZXIgdGhlIGNvbnRlbnQuXCIsIHR5cGUsIFwiT2xkOlwiLCBjb250ZW50SGFzaFt0eXBlLmdldElkKCldKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnRlbnRIYXNoW3R5cGUuZ2V0SWQoKV0gPSB0eXBlO1xyXG4gICAgICAgICAgICBjb250ZW50QXJyYXkucHVzaCh0eXBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldENvbnRlbnRUeXBlcyAoKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbnRlbnRBcnJheS5zbGljZSgpO1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIlN0b3JlZE1lbW9yeS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9FbGVtZW50cy9DbGFzc2VzL1NheS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9Nb2R1bGVzL0NvbnRlbnRIYW5kbGVyLnRzXCIgLz5cclxuaW50ZXJmYWNlIENvbnRlbnRUeXBlT3B0aW9ucyB7XHJcbiAgICBpZCA6IHN0cmluZztcclxuICAgIGRlZmF1bHRWYWx1ZSA6IGJvb2xlYW47XHJcbiAgICBkZXNjcmlwdGlvbiA6IFNheSB8IHN0cmluZztcclxuICAgIGN1cnJlbnRWYWx1ZURlc2NyaXB0aW9uPyA6IChjIDogQ29udGVudFR5cGUpID0+IFNheSB8IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFVzZSBzcGFyaW5nbHkuIENvbnRlbnQtVHlwZXMgdGhhdCBzaG91bGRuJ3QgYmUgYWxsb3dlZCB0byBjaGFuZ2UgYXJlIHRob3NlIHRoYXQgZWl0aGVyOlxyXG4gICAgICogLSBGdW5kYW1lbnRhbCB0byB0aGUgZ2FtZSBpbiBzb21lIHdheS4gTW9zdCBvZiB0aGVzZSB3aWxsIG9ubHkgcmVtYWluIHN0dWNrIHVudGlsIHRoZSBnYW1lIGhhcyBlbm91Z2ggY29udGVudCB0byBtYWtlIGRvIHdpdGhvdXQgaXQuXHJcbiAgICAgKiAtIFNvbWV0aGluZyB0aGF0J3Mgb25seSBhIG5lZ2F0aXZlIHNpZ25hbDogc2lnbmFsaXppbmcgdGhhdCB0aGlzIGNvbnRlbnQgd2lsbCBub3QgYXBwZWFyIGR1cmluZyBkZXZlbG9wbWVudC9nYW1lcGxheSBhdCBhbGwsIGxldHRpbmcgcGxheWVycyBrbm93IGl0IGlzbid0IGF2YWlsYWJsZSBhbmQgcHJvYmFibHkgd29uJ3QgYmUuXHJcbiAgICAgKi9cclxuICAgIGNoYW5nZWFibGU/IDogYm9vbGVhbjtcclxufVxyXG5cclxuY2xhc3MgQ29udGVudFR5cGUgZXh0ZW5kcyBTdG9yZWRNZW1vcnk8Ym9vbGVhbj4ge1xyXG4gICAgcHJpdmF0ZSBkZXNjcmlwdGlvbiA6IFNheTtcclxuICAgIHByaXZhdGUgdmFsdWVEZXNjcmlwdGlvbiA6IChjIDogQ29udGVudFR5cGUpID0+IFNheSB8IHN0cmluZyA9ICgpID0+IHsgcmV0dXJuIG5ldyBTYXkgKEpTT04uc3RyaW5naWZ5KHRoaXMuZ2V0VmFsdWUoKSkpOyB9O1xyXG4gICAgcHJpdmF0ZSBjaGFuZ2VhYmxlIDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgbWVtb3J5UHJlZml4ID0gXCJjdF9cIjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKG9wdGlvbnMgOiBDb250ZW50VHlwZU9wdGlvbnMpIHtcclxuICAgICAgICBzdXBlcihDb250ZW50VHlwZS5tZW1vcnlQcmVmaXggKyBvcHRpb25zLmlkLCBvcHRpb25zLmRlZmF1bHRWYWx1ZSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBvcHRpb25zLmRlc2NyaXB0aW9uIGluc3RhbmNlb2YgU2F5ID8gb3B0aW9ucy5kZXNjcmlwdGlvbiA6IG5ldyBTYXkob3B0aW9ucy5kZXNjcmlwdGlvbik7XHJcblxyXG4gICAgICAgIHRoaXMudmFsdWVEZXNjcmlwdGlvbiA9IG9wdGlvbnMuY3VycmVudFZhbHVlRGVzY3JpcHRpb24gPT0gdW5kZWZpbmVkID8gdGhpcy52YWx1ZURlc2NyaXB0aW9uIDogb3B0aW9ucy5jdXJyZW50VmFsdWVEZXNjcmlwdGlvbjtcclxuXHJcbiAgICAgICAgaWYgKG9wdGlvbnMuY2hhbmdlYWJsZSA9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JlVmFsdWUob3B0aW9ucy5kZWZhdWx0VmFsdWUpOyAvLyBwcmV2ZW50IGxvY2FsU3RvcmFnZSBhbHRlcmF0aW9ucyBmcm9tIGFmZmVjdGluZyBzb21ldGhpbmcgdGhhdCBjYW4ndCBiZSBjaGFuZ2VkXHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlYWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgQ29udGVudEhhbmRsZXIucmVnaXN0ZXJDb250ZW50VHlwZSh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RGVzY3JpcHRpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRWYWx1ZURlc2NyaXB0aW9uICgpIHtcclxuICAgICAgICBsZXQgZGVzYyA9IHRoaXMudmFsdWVEZXNjcmlwdGlvbih0aGlzKTtcclxuICAgICAgICBpZiAoZGVzYyBpbnN0YW5jZW9mIFNheSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZGVzYztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFNheShkZXNjKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHRvZ2dsZSAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2hhbmdlYWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JlVmFsdWUoIXRoaXMuZ2V0VmFsdWUoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc0FsbG93ZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIE1NID0gbmV3IENvbnRlbnRUeXBlKHtcclxuICAgICAgICBjaGFuZ2VhYmxlIDogZmFsc2UsIC8vIFRoZXJlIHdpbGwgYmUgdG9vIGxpdHRsZSBjb250ZW50IGF0IGZpcnN0IGZvciB1cyB0byBibG9jayBwYXJ0IG9mIGl0IGZvciBubyBnb29kIHJlYXNvbiwgbWF5YmUgYXQgc29tZSBwb2ludFxyXG4gICAgICAgIGRlc2NyaXB0aW9uIDogXCJIb21vc2V4dWFsIChNL00pIHNleHVhbCBldmVudHNcIixcclxuICAgICAgICBpZCA6IFwiTU1cIixcclxuICAgICAgICBkZWZhdWx0VmFsdWUgOiB0cnVlXHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBGRiA9IG5ldyBDb250ZW50VHlwZSh7XHJcbiAgICAgICAgY2hhbmdlYWJsZSA6IGZhbHNlLCAvLyBUaGVyZSB3aWxsIGJlIHRvbyBsaXR0bGUgY29udGVudCBhdCBmaXJzdCBmb3IgdXMgdG8gYmxvY2sgcGFydCBvZiBpdCBmb3Igbm8gZ29vZCByZWFzb24sIG1heWJlIGF0IHNvbWUgcG9pbnRcclxuICAgICAgICBkZXNjcmlwdGlvbiA6IFwiSG9tb3NleHVhbCAoRi9GKSBzZXh1YWwgZXZlbnRzXCIsXHJcbiAgICAgICAgaWQgOiBcIkZGXCIsXHJcbiAgICAgICAgZGVmYXVsdFZhbHVlIDogdHJ1ZVxyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgTUYgPSBuZXcgQ29udGVudFR5cGUoe1xyXG4gICAgICAgIGNoYW5nZWFibGUgOiBmYWxzZSwgLy8gVGhlcmUgd2lsbCBiZSB0b28gbGl0dGxlIGNvbnRlbnQgYXQgZmlyc3QgZm9yIHVzIHRvIGJsb2NrIHBhcnQgb2YgaXQgZm9yIG5vIGdvb2QgcmVhc29uLCBtYXliZSBhdCBzb21lIHBvaW50XHJcbiAgICAgICAgZGVzY3JpcHRpb24gOiBcIkhldGVyb3NleHVhbCAoTS9GKSBzZXh1YWwgZXZlbnRzXCIsXHJcbiAgICAgICAgaWQgOiBcIk1GXCIsXHJcbiAgICAgICAgZGVmYXVsdFZhbHVlIDogdHJ1ZVxyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgQmVhc3QgPSBuZXcgQ29udGVudFR5cGUoe1xyXG4gICAgICAgIGNoYW5nZWFibGUgOiB0cnVlLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uIDogXCJTZXh1YWwgZXZlbnRzIHdpdGggZWl0aGVyIG1vbnN0ZXJzIG9yIG1hZ2ljYWwgYmVhc3RzLiBNTS9NRi9GRiB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGlzIG9uZSBpZiBibG9ja2VkLiBTdWZmaWNpZW50bHkgaHVtYW4gY3JlYXR1cmVzIGRvIG5vdCBnZXQgY291bnRlZCBpbnRvIHRoaXMuXCIsXHJcbiAgICAgICAgaWQgOiBcIkJlYXN0XCIsXHJcbiAgICAgICAgZGVmYXVsdFZhbHVlIDogdHJ1ZVxyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgU2NhdCA9IG5ldyBDb250ZW50VHlwZSh7XHJcbiAgICAgICAgY2hhbmdlYWJsZSA6IGZhbHNlLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uIDogXCJTY2F0b2xvZ2ljIHNleHVhbCBldmVudHNcIixcclxuICAgICAgICBpZCA6IFwiU2NhdFwiLFxyXG4gICAgICAgIGRlZmF1bHRWYWx1ZSA6IGZhbHNlIC8vIFRoZXJlIGlzIG5vIGludGVudGlvbiBvZiBldmVyIGFkZGluZyB0aGVzZVxyXG4gICAgfSk7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBQZWUgPSBuZXcgQ29udGVudFR5cGUoe1xyXG4gICAgICAgIGNoYW5nZWFibGUgOiBmYWxzZSxcclxuICAgICAgICBkZXNjcmlwdGlvbiA6IFwiU2V4dWFsIGV2ZW50cyB3aXRoIHVyaW5lXCIsXHJcbiAgICAgICAgaWQgOiBcIlVyb3BoaWxpYVwiLFxyXG4gICAgICAgIGRlZmF1bHRWYWx1ZSA6IGZhbHNlIC8vIFRoZXJlIGlzIG5vIGludGVudGlvbiBvZiBldmVyIGFkZGluZyB0aGVzZVxyXG4gICAgfSk7XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vRWxlbWVudHMudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vQ29udHJvbHMvTW9kdWxlcy9LZXlIYW5kbGVyLnRzXCIgLz5cclxubW9kdWxlIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlciB7XHJcbiAgICBleHBvcnQgdmFyIGN1cnJlbnRUdXJuVGFiID0gPEhUTUxFbGVtZW50PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImN1cnJlbnRUdXJuVGFiXCIpO1xyXG4gICAgZXhwb3J0IHZhciBjdXJyZW50VHVybiA9IDxIVE1MRWxlbWVudD4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjdXJyZW50VHVyblwiKTtcclxuICAgIGV4cG9ydCB2YXIgdHVybkhyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XHJcbiAgICBleHBvcnQgdmFyIGxhc3RSZWFkT2Zmc2V0ID0gY3VycmVudFR1cm5UYWIuY2xpZW50SGVpZ2h0IC8gMjtcclxuICAgIHR1cm5Ici5jbGFzc0xpc3QuYWRkKFwidHVyblN0YXJ0XCIpO1xyXG4gICAgdHVybkhyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiU3RhcnQgb2YgVHVyblwiKSk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIHRoZSBcIlN0YXJ0IG9mIFR1cm5cIiBlbGVtZW50cyBhbmQgc2Nyb2xscyB0aGUgY29udGVudCBwYW5lbCB1bnRpbCB0aGUgc3RhcnQgb2YgdGhlIG5ldyB0dXJuLlxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gc3RhcnRUdXJuIChhY3Rpb24/IDogQWN0aW9uKSB7XHJcblxyXG4gICAgICAgIGxldCBvbGRDb250ZW50ID0gY3VycmVudFR1cm5UYWIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImNvbnRlbnRcIik7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvbGRDb250ZW50Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIG9sZENvbnRlbnRbaV0uY2xhc3NMaXN0LmFkZChcImNvbnRlbnRPbGRcIik7XHJcbiAgICAgICAgICAgIG9sZENvbnRlbnRbaV0uY2xhc3NMaXN0LnJlbW92ZShcImNvbnRlbnRcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjdXJyZW50VHVyblRhYi5hcHBlbmRDaGlsZCh0dXJuSHIpO1xyXG5cclxuICAgICAgICBFbGVtZW50cy5zdGFydFR1cm4oKTtcclxuXHJcbiAgICAgICAgc2Nyb2xsVG9OZXdUdXJuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcmUgd2UgaW4gdGhlIG1pZGRsZSBvZiBhIHR1cm4/XHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc1R1cm4gKCkge1xyXG4gICAgICAgIHJldHVybiBFbGVtZW50cy5pc0luVHVybigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgYmx1ciBlZmZlY3QgYXJvdW5kIHRoZSB0dXJuIHBhbmVsXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBlbmRUdXJuICgpIHtcclxuICAgICAgICBFbGVtZW50cy5lbmRUdXJuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFNheUVsZW1lbnRzQXNDb250ZW50IChzYXkgOiBTYXkpIDogUHJvbWlzZTxBcnJheTxIVE1MRWxlbWVudD4+IHtcclxuICAgICAgICByZXR1cm4gc2F5LmdldEhUTUwoXCJwXCIsIFtcImNvbnRlbnRcIl0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJpbnRzIGdpdmVuIFNheSBkaXJlY3RseVxyXG4gICAgICogQHBhcmFtIHNheVxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcHJpbnRBc0NvbnRlbnQgKHNheSA6IFNheSkge1xyXG4gICAgICAgIGxldCBub2RlID0gZ2V0TWFya2VyKCk7XHJcbiAgICAgICAgZ2V0U2F5RWxlbWVudHNBc0NvbnRlbnQoc2F5KS50aGVuKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgaW5zZXJ0QmVmb3JlKHZhbHVlLCBub2RlKTtcclxuICAgICAgICAgICAgdW5wcmludChub2RlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBzYXkgZm9yIHNheVZhbHVlcyBhbmQgdGhlbiBwcmludHMgaXQgYXMgY29udGVudC5cclxuICAgICAqIEBwYXJhbSBzYXlWYWx1ZXNcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHNpbXBsZVByaW50ICguLi5zYXlWYWx1ZXMgOiBBcnJheTxhbnk+KSB7XHJcbiAgICAgICAgcHJpbnRBc0NvbnRlbnQobmV3IFNheSguLi5zYXlWYWx1ZXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcHJpbnRBc0Vycm9yIChtc2cgOiBTYXkgfCBzdHJpbmcpIHtcclxuICAgICAgICBpZiAobXNnIGluc3RhbmNlb2YgU2F5KSB7XHJcbiAgICAgICAgICAgIG1zZy5nZXRIVE1MKFwiZGl2XCIsIFtcImVycm9yXCJdLCB0cnVlKS50aGVuKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgIHByaW50KC4uLnZhbHVlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKFwiZXJyb3JcIik7XHJcbiAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShtc2cpKTtcclxuICAgICAgICAgICAgcHJpbnQoZGl2KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNsZWFyICgpIHtcclxuICAgICAgICB3aGlsZSAoY3VycmVudFR1cm5UYWIuZmlyc3RDaGlsZCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY3VycmVudFR1cm5UYWIucmVtb3ZlQ2hpbGQoY3VycmVudFR1cm5UYWIuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIENvbnRyb2xzLktleUhhbmRsZXIucmVzZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluY2x1ZGVzIHRoZSBnaXZlbiBlbGVtZW50cyBhcyBjb250ZW50LlxyXG4gICAgICogVGhpcyBpcyB0aGUgb25seSBjb3JyZWN0IHdheSBvZiBwcmludGluZyBlbGVtZW50cy5cclxuICAgICAqIEBwYXJhbSBlbGVtZW50c1xyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcHJpbnQgKC4uLmVsZW1lbnRzIDogQXJyYXk8Tm9kZT4pIHtcclxuICAgICAgICBpZihlbGVtZW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRUdXJuVGFiLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHNjcm9sbFRvKGxhc3RSZWFkT2Zmc2V0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldE1hcmtlciAoKSB7XHJcbiAgICAgICAgbGV0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKTtcclxuICAgICAgICBjdXJyZW50VHVyblRhYi5hcHBlbmRDaGlsZChub2RlKTtcclxuICAgICAgICByZXR1cm4gbm9kZTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaW5zZXJ0QmVmb3JlIChuZXdDaGlsZHMgOiBBcnJheTxOb2RlPiwgb2xkQ2hpbGQpIHtcclxuICAgICAgICBuZXdDaGlsZHMuZm9yRWFjaCgobmV3Q2hpbGQpID0+IHtcclxuICAgICAgICAgICAgY3VycmVudFR1cm5UYWIuaW5zZXJ0QmVmb3JlKG5ld0NoaWxkLCBvbGRDaGlsZCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgc2Nyb2xsVG8obGFzdFJlYWRPZmZzZXQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBlbGVtZW50cyB0aGF0IGhhdmUgYmVlbiBwcmludGVkIGluIHRoZSBwYXN0LlxyXG4gICAgICogQHBhcmFtIGVsZW1lbnRzXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiB1bnByaW50ICguLi5lbGVtZW50cyA6IEFycmF5PE5vZGU+KSB7XHJcbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5wYXJlbnRFbGVtZW50ID09IGN1cnJlbnRUdXJuVGFiKSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50VHVyblRhYi5yZW1vdmVDaGlsZChlbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2Nyb2xscyB0byB0aGUgZmlyc3QgY3VycmVudCB0dXJuIGVsZW1lbnQuIChPciByYXRoZXIsIHRvIGp1c3QgYWZ0ZXIgdGhlIFN0YXJ0IG9mIFR1cm4gZWxlbWVudClcclxuICAgICAqIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IGFzIGEgbmV3IHR1cm4gYmVnaW5zLlxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gc2Nyb2xsVG9OZXdUdXJuICgpIHtcclxuICAgICAgICBsZXQgdGFyZ2V0ID0gdHVybkhyLm9mZnNldFRvcCArIHR1cm5Ici5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgbGFzdFJlYWRPZmZzZXQgPSB0YXJnZXQ7XHJcblxyXG4gICAgICAgIC8vdHVybkhyLnNjcm9sbEludG9WaWV3KHtiZWhhdmlvciA6IFwic21vb3RoXCIsIGJsb2NrIDogXCJzdGFydFwifSk7XHJcbiAgICAgICAgaWYgKHRhcmdldCA8IGN1cnJlbnRUdXJuLnNjcm9sbFRvcCkge1xyXG4gICAgICAgICAgICByZXR1cm47IC8vIFdlIGRvbid0IHdhbnQgdG8gc2Nyb2xsIFVQLlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2Nyb2xsVG8odGFyZ2V0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjcm9sbHMgdG8gdGhlIHZlcnkgYm90dG9tIG9mIHRoZSBjb250ZW50IHBhbmVsLlxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gc2Nyb2xsVG9Cb3R0b20gKCkge1xyXG4gICAgICAgIHNjcm9sbFRvKGN1cnJlbnRUdXJuLnNjcm9sbEhlaWdodCAtIGN1cnJlbnRUdXJuLmNsaWVudEhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTY3JvbGwgaGFsZiBhIHNjcmVlbiBmb3J3YXJkXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBzY3JvbGxTcGFjZSAoKSB7XHJcbiAgICAgICAgc2Nyb2xsVG8oY3VycmVudFR1cm4uc2Nyb2xsVG9wICsgKGN1cnJlbnRUdXJuLmNsaWVudEhlaWdodCAvIDIpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZSB0ZXh0IHRoYXQgd2FzIHJlYWQgYXMgcGxheWVyIHNjcm9sbHNcclxuICAgICAqL1xyXG4gICAgY3VycmVudFR1cm4uYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCAoKSA9PiB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRSZWFkID0gY3VycmVudFR1cm4uc2Nyb2xsVG9wICsgY3VycmVudFR1cm4uY2xpZW50SGVpZ2h0O1xyXG4gICAgICAgIGlmIChjdXJyZW50UmVhZCA+IGxhc3RSZWFkT2Zmc2V0KSB7XHJcbiAgICAgICAgICAgIGxhc3RSZWFkT2Zmc2V0ID0gY3VycmVudFJlYWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW5pbWF0aW9uLi4uIHJlbW92aW5nIGpxdWVyeVxyXG4gICAgICovXHJcbiAgICB2YXIgc3RhcnRPZmZzZXQgOiBudW1iZXI7XHJcbiAgICB2YXIgdGFyZ2V0T2Zmc2V0IDogbnVtYmVyO1xyXG4gICAgdmFyIHN0YXJ0VGltZSA6IG51bWJlcjtcclxuICAgIHZhciBmaW5pc2hUaW1lIDogbnVtYmVyO1xyXG4gICAgdmFyIHRvdGFsVGltZSA6IG51bWJlcjtcclxuICAgIHZhciBhbmltYXRpb25SZXF1ZXN0IDogbnVtYmVyO1xyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBzY3JvbGxUbyAob2Zmc2V0IDogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKG9mZnNldCA8PSBsYXN0UmVhZE9mZnNldCkge1xyXG4gICAgICAgICAgICBzdGFydE9mZnNldCA9IGN1cnJlbnRUdXJuLnNjcm9sbFRvcDtcclxuICAgICAgICAgICAgdGFyZ2V0T2Zmc2V0ID0gb2Zmc2V0O1xyXG4gICAgICAgICAgICBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgZmluaXNoVGltZSA9IHN0YXJ0VGltZSArIEVsZW1lbnRzLmFuaW1hdGlvblRpbWU7XHJcbiAgICAgICAgICAgIHRvdGFsVGltZSA9IGZpbmlzaFRpbWUgLSBzdGFydFRpbWU7XHJcbiAgICAgICAgICAgIHN0YXJ0U2Nyb2xsaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBzdGFydFNjcm9sbGluZyAoKSB7XHJcbiAgICAgICAgaWYgKGFuaW1hdGlvblJlcXVlc3QgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGFuaW1hdGlvblJlcXVlc3QgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodXBkYXRlRnJhbWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbGV0IHVwZGF0ZUZyYW1lID0gKCkgPT4ge1xyXG4gICAgICAgIGFuaW1hdGlvblJlcXVlc3QgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIGxldCBtb3ZpbmdPZmZzZXQgPSAodGFyZ2V0T2Zmc2V0IC0gc3RhcnRPZmZzZXQpO1xyXG4gICAgICAgIGxldCB0aW1lUGFzc2VkID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydFRpbWU7XHJcbiAgICAgICAgbGV0IGlkZWFsT2Zmc2V0ID0gbW92aW5nT2Zmc2V0ICogKHRpbWVQYXNzZWQgLyB0b3RhbFRpbWUpO1xyXG5cclxuICAgICAgICBsZXQgbWF4U2Nyb2xsID0gY3VycmVudFR1cm4uc2Nyb2xsSGVpZ2h0IC0gY3VycmVudFR1cm4uY2xpZW50SGVpZ2h0O1xyXG5cclxuICAgICAgICBjdXJyZW50VHVybi5zY3JvbGxUb3AgPSBzdGFydE9mZnNldCArIGlkZWFsT2Zmc2V0O1xyXG5cclxuICAgICAgICBpZiAoY3VycmVudFR1cm4uc2Nyb2xsVG9wIDwgdGFyZ2V0T2Zmc2V0ICYmIGN1cnJlbnRUdXJuLnNjcm9sbFRvcCA8IG1heFNjcm9sbCkge1xyXG4gICAgICAgICAgICBzdGFydFNjcm9sbGluZygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9FbGVtZW50cy9Nb2R1bGVzL0N1cnJlbnRUdXJuSGFuZGxlci50c1wiIC8+XHJcbmludGVyZmFjZSBDdXN0b21MaW5rT3B0aW9ucyB7XHJcbiAgICBtb3VzZW92ZXI/IDogKCkgPT4gdm9pZDtcclxuICAgIG1vdXNlb3V0PyA6ICgpID0+IHZvaWQ7XHJcbiAgICBjbGljaz8gOiAoZSA6IE1vdXNlRXZlbnQpID0+IHZvaWQ7XHJcbn1cclxuXHJcbm1vZHVsZSBDb250cm9scy5MaW5rcyB7XHJcbiAgICBleHBvcnQgZnVuY3Rpb24gbWFrZUN1c3RvbUxpbmsgKGVsZW1lbnQgOiBFbGVtZW50LCBvcHRpb25zIDogQ3VzdG9tTGlua09wdGlvbnMpIHtcclxuICAgICAgICBpZiAob3B0aW9ucy5tb3VzZW92ZXIgIT0gdW5kZWZpbmVkICYmIG9wdGlvbnMubW91c2VvdXQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3ZlclwiLCBvcHRpb25zLm1vdXNlb3Zlcik7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3V0XCIsIG9wdGlvbnMubW91c2VvdXQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgb3B0aW9ucy5jbGljayk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIG1ha2VMaW5rIChlbGVtZW50IDogRWxlbWVudCwgYWN0aW9uIDogQWN0aW9uKSB7XHJcbiAgICAgICAgbWFrZUN1c3RvbUxpbmsoZWxlbWVudCwge1xyXG4gICAgICAgICAgICBtb3VzZW92ZXIgOiAoKSA9PiB7IEVsZW1lbnRzLkh5cGVybGlua0hhbmRsZXIuaG92ZXJBY3Rpb24oYWN0aW9uKTsgfSxcclxuICAgICAgICAgICAgbW91c2VvdXQgOiAoKSA9PiB7IEVsZW1lbnRzLkh5cGVybGlua0hhbmRsZXIudW5ob3ZlckFjdGlvbigpOyB9LFxyXG4gICAgICAgICAgICBjbGljayA6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBUdXJuU2VxdWVuY2UuZXhlY3V0ZShhY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgRWxlbWVudHMuSHlwZXJsaW5rSGFuZGxlci51bmhvdmVyQWN0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJjbGFzcyBSb29tTm9kZSB7XHJcbiAgICBwcml2YXRlIHJvb20gOiBSb29tUmFuZG9tO1xyXG4gICAgcHJpdmF0ZSBtYWluRGl2IDogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAocm9vbSA6IFJvb21SYW5kb20pIHtcclxuICAgICAgICB0aGlzLnJvb20gPSByb29tO1xyXG4gICAgICAgIHRoaXMubWFpbkRpdi5jbGFzc0xpc3QuYWRkKFwibWFwUm9vbVwiKTtcclxuXHJcbiAgICAgICAgaWYgKHJvb20gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWFpbkRpdi5jbGFzc0xpc3QuYWRkKFwibGlua2VkXCIsIHJvb20uZ2V0QmFja2dyb3VuZENsYXNzKCkpO1xyXG5cclxuICAgICAgICAgICAgUm9vbS5ESVJFQ1RJT05TLmZvckVhY2goKGRpcmVjdGlvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJvb20uY29ubmVjdGlvbnNbZGlyZWN0aW9uXSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZGlyZWN0aW9uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb25EaXYuY2xhc3NMaXN0LmFkZChcIm1hcFJvb21Db25uZWN0aW9uXCIgKyBEaXJlY3Rpb25OYW1lc1tEaXJlY3Rpb25bZGlyZWN0aW9uXV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFpbkRpdi5hcHBlbmRDaGlsZChkaXJlY3Rpb25EaXYpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIENvbnRyb2xzLkxpbmtzLm1ha2VMaW5rKHRoaXMubWFpbkRpdiwgbmV3IEFjdGlvbkdvKFdvcmxkU3RhdGUucGxheWVyLCByb29tKSk7XHJcblxyXG4gICAgICAgICAgICAvLyBBU1NVTUUgVEhJUyBJUyBOT1QgVVBEQVRFRFxyXG4gICAgICAgICAgICAvL3RoaXMudXBkYXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBjcmVhdGVSb29tTmFtZUZsb2F0ZXIgKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnJvb20gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGxldCByb29tTmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblxyXG4gICAgICAgICAgICBsZXQgc2F5TmFtZSA9IG5ldyBTYXkodGhpcy5yb29tKTtcclxuICAgICAgICAgICAgYXdhaXQgc2F5TmFtZS5nZXRQdXJlRWxlbWVudHMoKS50aGVuKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgIHZhbHVlLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm9vbU5hbWUuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBFbGVtZW50cy5Ib3ZlckluZm8ubWFrZUhvdmVyYWJsZSh0aGlzLm1haW5EaXYsIHZhbHVlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyB1cGRhdGUgKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnJvb20gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGlmIChXb3JsZFN0YXRlLnBsYXllci5nZXRSb29tKCkgPT0gdGhpcy5yb29tKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1haW5EaXYuY2xhc3NMaXN0LmFkZChcImN1cnJlbnRcIik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1haW5EaXYuY2xhc3NMaXN0LnJlbW92ZShcImN1cnJlbnRcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICBsZXQgaXNSZW1lbWJlcmVkID0gYXdhaXQgV29ybGRTdGF0ZS5pc1Jvb21SZW1lbWJlcmVkKHRoaXMucm9vbSk7XHJcbiAgICAgICAgICAgIGlmICghaXNSZW1lbWJlcmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1haW5EaXYuY2xhc3NMaXN0LmFkZChcInVua25vd25cIik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1haW5EaXYuY2xhc3NMaXN0LnJlbW92ZShcInVua25vd25cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEVsZW1lbnQgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1haW5EaXY7XHJcbiAgICB9XHJcbn0iLCJjbGFzcyBTYXlBbiBleHRlbmRzIFNheSB7XHJcbiAgICBwcml2YXRlIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcImEgXCIpO1xyXG4gICAgcHJpdmF0ZSB1cHBlcmNhc2UgPSB0cnVlO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoYXV0b1VwcGVyY2FzZT8gOiBib29sZWFuKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICBpZiAoYXV0b1VwcGVyY2FzZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy51cHBlcmNhc2UgPSBhdXRvVXBwZXJjYXNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0UHVyZUVsZW1lbnRzIChzYXkgOiBTYXkpIDogUHJvbWlzZTxBcnJheTxFbGVtZW50IHwgVGV4dD4+IHtcclxuICAgICAgICBsZXQgbmV4dCA9IHNheS5zZXF1ZW5jZVtzYXkuc2VxdWVuY2VSdW5uZXIgKyAxXTtcclxuICAgICAgICBpZiAobmV4dCA9PSB1bmRlZmluZWQgfHwgKG5leHQgaW5zdGFuY2VvZiBUaGluZyAmJiAoPFRoaW5nPiBuZXh0KS5wcm9wZXJseU5hbWVkKSkge1xyXG4gICAgICAgICAgICB0aGlzLm5vZGUubm9kZVZhbHVlID0gXCJcIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgYWFuID0gQXZzQW4ucXVlcnkoKGF3YWl0IHNheS5nZXRUZXh0T2Yoc2F5LnNlcXVlbmNlUnVubmVyICsgMSwgbmV4dCkpLnRyaW0oKSk7XHJcbiAgICAgICAgICAgIGlmIChhYW4ucHJlZml4ICE9IFwiXCIpIHsgLy8gYXZvaWQgXCJhIDUyIGNvaW5zXCJcclxuICAgICAgICAgICAgICAgIHRoaXMubm9kZS5ub2RlVmFsdWUgPSBhYW4uYXJ0aWNsZSArIFwiIFwiO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy51cHBlcmNhc2UgJiYgc2F5LmN1cnJlbnRQYXJhZ3JhcGgubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm9kZS5ub2RlVmFsdWUgPSB0aGlzLm5vZGUubm9kZVZhbHVlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgKyB0aGlzLm5vZGUubm9kZVZhbHVlLnN1YnN0cigxLCB0aGlzLm5vZGUubm9kZVZhbHVlLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubm9kZS5ub2RlVmFsdWUgPSB0aGlzLm5vZGUubm9kZVZhbHVlICsgXCIgXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBbdGhpcy5ub2RlXTtcclxuICAgIH1cclxufVxyXG5cclxuLy9ieSBFYW1vbiBOZXJib25uZSAoZnJvbSBodHRwOi8vaG9tZS5uZXJib25uZS5vcmcvQS12cy1BbiksIEFwYWNoZSAyLjAgbGljZW5zZVxyXG52YXIgQXZzQW4gPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIGRpY3QgPSBcInAzZXp6OzR3cmxnOzJoOyMycmc7MjI7MjthOzc7O2lmO3o7OyY0aDsxYzsxO047Njs7KnlwOzZhOzQ7YTI7cTs7ZTE7cTs7aTE7aDs7bzs3Ozsvb3A7NW47OTthMztpOztlNTtoOztoOzsxO281Ozs7aTtyOztsOzsxOy87Njs7bjs7MTtvNjs7O28xO2E7O3I7OzE7ZTc7OztzOzsxOy8yO2o7OzA5cGE7eTM7MTs4ZTsxMDs7MTdxb3E7cW1tOzI7MTJocDs3bnc7YTswbzQ7NDU7MTswbjsydzs7MTVyOzFuOzI7ODs3Ozs5OzU7OzI4czt4OzszNHE7ejsxOzc7NTs7NDVuO247OzU5ODt3Ozs2NWs7dTs7NzRqO3k7Ozg1MDt5Ozs5M3g7Zzs7ODF1eDtoZ2s7YTswemI7ZWw7YTswcDs0aDs7MTE7MTY7OzIxOzEwOzszMjsxNTs7NDsxODs7NTQ7djs7NjsxMjs7NztzOzs4O3Y7Ozk7MTc7OzExazticTsxOyB2OzI7OzIyOTtmMzsyOyAxYTszOzvigJM1Ozs7MzF4O2pjOzE7IDEyOzI7OzQxdztrcTsyOyB6OzQ7O+KAkzU7Ozs1NTk7c3A7NTsgMms7MTs7LGg7OztoNzs7O2tkOzs7bTY7Ozs2MnA7cm07MjsgMWI7NTs7azU7Ozs3Mm47eTY7MjsgMTQ7OzvigJM1Ozs7ODJyOzE5MjsyOyAxOTs0OzssNTs7OzkzaTsxaWc7MjsgMTA7NDs74oCTNTs7Ozh5cztuc3U7OzxlOTsxeDsyO207OzE7ZDs2OztvOzY7Oz1rcTsxeDsxOz0zbTtnOzE7RTs2OztAMTY7MmE7O0Ezd247YnU3ZDs2O0Ficjt5MTsxO0E4Yjs1bzsxO1MzO2U7O2kyZzs0cmg7MTtyMjY7NGRnOzE7b2I7Mjs7bWc5OzU0OTA7MTthMWs7MTQwOzE7cnY7MWU7MTsgdDsxOztuNm47Z2ZsOzE7ZDI1OzFhZTsxO2ExYzs1YjsxO2wxYjs0YzsxO3UxYjszcjsxO2MxODtjOzE7aTs7MTthOzsxO247Njs7czNmO2ZldTsxO3RuO3NjOzE7dWg7MXQ7MTtyaDsxczsxO2loOzFxOzE7YWg7MXE7MTtzZzsxOzt0NzE7NDFoOzE7aDUzOzExMjsxO2w0eDs3aTsxO2U0dzs2bTsxO3Q0dzs2bTsxO2U0dzsyajsxO3M7Zjs7QjdjZWw7c3o7MjtobGI7NDI7MjthYXc7Mjg7MTtpajsxeTsxO3JmOzFzOzE7YWU7OzvDoTsxMTs7b2xoajsyODsxO3IxY3k7ajsxO2RlcztmOzE7IDM7Zjs7QzhsMDU7MTBqOzM7YTI5bmc7NXQ7MTtpOWM7YjsxO3M7OzE7czU7OztoMXNrYTs5cDs0O2FhMWE7MXg7MjtpMTE1O287MTtzNTtnOzE7ZTU7OztvNXA7NzsxO2k7Njs7bDE3O2w7MTvDoTtmOztya3hrOzE5OzE7bzl0O2E7MTvDrTs1Ozt1MnJlO3k7MjtpMTthOztyMmZxO2U7MTtyZTs1OzE7YTs1OztvMXZyazs4ODsxO25qcHk7MW07MTtnMzgwO2Y7MTtqOzU7O0Q0MGR4O2hoOzc7YWo1NjsxeTsxO28zNTs2OzE7cTs1OztpamhjOzJ0OzI7bmJ3O2o7MTthMTc7ZjsxO3M0O2Y7O29nejtnOzE7dDE7OTs7dWl2djsxcjsxO2FkMjs3OzE7bGNpOzc7MTtjOzc7O8OhMzA7NzsxOyA7NTs7w7I7NTs7w7kxO2U7O8awOzc7O0Vmb2U7NDJ6eTs3O1UzdDt6azsxO1Ixcjs0OztiZTs0MjsxO29jOzF0OzE7bGI7cDsxO2liOzs7bTJrOzczbTsxO3B3OzEzdzsxO2VoOzkxOzE7emQ7OztuN3g7Mjd6ejsxO2FmOzE0OzE7bWQ7Mzs7c3lwOzM1eDsxO3B3czs5Yzs1O2F3bjtwOzE7Yzs3OztlNDs3ZDs7aDs1OztvO2I7O3I7aDs7dWRqbDtoYzsxO2xqOzZvOzE7bzY7Ozt3cjsxZTsxO2lkOzI7O0Y0ZXRhO2hoeDsxMTsgY2Y7MXJ6OzssOzE3OzsuMmo7Nmg7Oy9pOzI5OzswNTsyeTs7MTI4O2UxOzsyMTY7OWc7OzMxMTs3ZDs7NDE4OzhpOzs1aTs1dTs7Njk7ejs7Nzs7MTswYTs7Ozg2O2o7Ozk3O2w7O0E0MDQ7NWlqO2U7QmU7Mzs7Q3Q5O215OztEeDs5OztGYzs7O0k7OzI7TDg7OztScTs7O0sxMTs7O0xsOzQ7O00xeDsxOztOeTsyOztQMTM7Mjs7UTloOzVqOztSYWQ7M3A7O1Mxbjs5OztUMnQ7Mjs7QjU3OzFqaTs7QzRzO2pwOzE7TWI7MTs7RDJnO2FrOztFN3I7Mzk7MjtDNjtrOztJNTtmOztGMzM7NjQ7MTtyNTs7O0h6OzF1OztJMXZ4O2JrOzM7QTI0OzQ1OzE7VG07MTs7Ujs7MTsgdzszMDs7VTI7YTs7SjU7Zjs7TGtrO2cxOzM7QzJwOzN2OztONDtlOztQMTtmOztNNnc7MWRzOztPZzM7MmU7MTsgNTtpOztQczQ7dzc7MTsuN2k7NTM7O1I4djszejsyO0ExZTtnOzE7IDM7ZTs7U2U7eTs7UzNnOzkxOztUOGE7MWFoOzE7UzF4OzY7O1VlbDszbTsyOywyO2I7Oy47azs7WG07MW87O1l6OzV3OzE7VjY7OztjMztsOztmOzsxO283Ozs7aDE7MzE7O8+DMTtpOztHNTV6MDtpZzs3O2Uxc2N0OzNoOzE7cjFmdmg7MW47MTtuOzsxO2U7YTs7aDFzZDszMTsxO2ExN2s7MmU7MztlO3E7O2k7bjs7bzs2OztpNGI5O3M7MTthbHQ7YzsxO25sMDtiOzE7ZzE7YTs7b3ZpMjsyZDsyO2Y7OzE7IDtiOzt0MjM4O2Y7MTt0Mno7NzsxOyA7Njs7cjE3anY7MzI7MTtpcWw7ZTsxO2E7OTs7dzQzOzY7MTthMXA7NTsxO3JkOzU7MTtyOzU7O8O6OzU7O0gyNHNuO2N3ZDtzOyA1aTttazs7JmI7MTc7OywxO2Y7Oy4zNzs0MjsyO0FpOzs7SWU7NDs7MWk7MWo7OzJyOzIyOzszOTtuOzs1YTsxOTs7NzI7YTs7QjJ6O2N4OzE7UDc7OztDMXE7MzU7O0RkMTt0Yjs7RjFsOzJ4OztHbDsxNDs7SHk7MzA7MTtJNTs7O0k4MDtpOTs2O0NjOzE7O0cxMDsyOztOYjsxOztQcTsyOztTOzsxO0QxO2o7O1RmOzE7O0s0azsxdzsxOzk7Nzs7TDFlOzM1OztNMzY7NnU7MTsuYzs7O055OzJ2OztPOTU7M2c7MjsgNzt0OztWYzsxNjs7UDRiO2JmOztSMnY7NHY7MTtUbjs3OztTOzsxO0Y1Ozs7VDljOzExNTs7VjFrOzN1OztlYW94OzdwOzI7aW0xOzExOzE7cjQ7bzs7cjI5dDsybTsxO3IxZDs3OzE7bjs1OztvaGgxOzZkMDsyO24zanI7NjV2OzY7ZDEyMTt2OztlNGM7MW07MTtzNzsxbTs7ZzIxZjtlOztrcDs7O29hZDs2MWI7MjtsMjY7MTs7cjdjOzVqejsxO2k7OzE7Zjs1Ozt2Njs7O3UycTQ7MzI7MTtyMjsyeDs7STI2Njs0bWdiOzM7STRvOzhmOzI7KjY7OztJMXY7ajs7bmlqOzFobTQ7MTtkOXA7d3RwOzE7ZTFjOzN3eTsxO3AxMjszcjY7MTtlMTI7M3I2OzE7bjEyOzNyNDsxO2QxMjszcjQ7MjtldDszcXc7MTtudDszcXc7MTtjNzs0MTsxO2k2Ozs7w6o4Ozs7czRoO2NpZjsxO2wyaTs0Mno7MTthMmg7M3lyOzE7bmU7Z3k7MTtkZTtneTsxO3NkOzM7O0oyNGI2OzdoOzE7aXc5O3Q7MTthOzsxO28yO287O0wydTk4O2FiZTt5OyA1czsxN3Q7OywyO3M7Oy4yNTs5cTs7MWw7MXQ7OzJqOzJoOzszYTsxMDs7NDg7bDs7ODtjOztBbmM7Y2U7MzsgMWU7NnE7O1BvOzJ0OztYMTthOztCMWo7MnI7O0M1OTtyNDs7RDQyO2xjOztFamc7aGc7MjsgMjtpOztENHg7ZTk7O0YyMDszczsxO1RpOzI7O0c4cztrbzs7SDs7MTtEazs2OztJZHk7MW07MTtSZDt1OztMYzA7MjVrOztNM2s7OTQ7O04yNjs1MTs7UDYzOzFnMDs7UjIzOzZ6OztTMno7ZjY7MTttNzs7O1QzNjs4Njs7VTFzO247MTsgNTtoOztWMTQ7MzU7MTtDNzs7O1c7OzE7VDs1OztaOTt0OzteOzU7O2FtNWQ7M2c7MTtvOTE7ZTsxO2k7OzE7ZztlOztvbG4yOzNyOzE7YzJpazsxOTsxO2gxczsxMTsxO2E3O3o7MTtiNjs7O3AxO2g7O3U1MWk7MXE7MTtzNHA7eDsxO2hnO3c7MTtvYjs7O+G7mTs1OztNNWJodTtza2Q7MTU7IDZuO24yOzsmYjsxaDs7LDtnOzsuMWtyOzVlcjsxO0FsbTsya2Y7MTsua2Y7Mmh0OzE7U2E7Mjs7LzQ7MWY7OzE0ZjtmNDs7MjJhOzZrOzszeTszMTs7NDFqOzVoOzs1bjsxYTs7NnI7M3E7Ozd0OzFmOzs4NzsxMTs7QTFmeDsybXQ7aTtCNTs7O0M5cTsxOztEMmQ7Mzs7RjEyOzQ7O0cxNzs0OztKMzg7OztMMTE7Mjs7TXY7MTs7TjJpO2E7O1AyZjs2OztSMm87OztTMnQ7Njs7VDJsO2Y7O1ZjOzI7O1c3Ozs7WDFoOzs7WWE7OztaNzs7O0JidjszOXM7MTtTYjtyOzE7VDk7OztDNWU7bmk7O0Q1ZTtuYTs7RWZqO2Q0OzM7UDFqOzlmOzE7Uzc7OztXOzc7O242O2k7O0Y2NDsxNHk7O0czMTthejs7SDJpOzdkOztJenE7aWo7NDsgZjt3Ozs1OzJvOzs2ZjszNTs7VDI1Ozd5OzE7TWk7MTs7SzFvOzNjOztMY2w7MTdyOztNY2M7cnA7O04xaTs0MDs7T3NsO2F2OzE7VTE3OzJjOztQZWw7M3h6OztRYTsxZzs7UjRsO253OztTa3U7MWxkOztUYWk7eWo7MTtSMXk7dzs7VWFzOzF0OzI7IDI7aTs7VjM7ZDs7VjNzO2E1OztYcTsycDs7YjFhO2k7MTt1cjtkOzE7bTE7YTs7ZjJxO2VrOztoZjsxZzs7b200ejs3aDsyO0Q7OzE7ZTc7OztVMmI7MzQ7MTsuNTs7O3A7OzE7MzE7Yjs7czIzO2g7MTtjMztjOztOM3F5eDtpcGk7eTsgN3A7cWU7Oys7OTs7Ljs7MTtFZzs1Ozs0NjtrOzs3Ozc7Ozg7Nzs7Ojs1OztBNGdhO2luOzM7QTNnOzZqOzE7Rm87Mjs7STFtOzUyOztTMmwzOzF4OzE7TGI7MWI7O0I4azsyZ2Q7O0NraDsyaWI7O0QydDthcTs7RWpwOzlyOzM7QTEwOzJyOztINTsxNjs7Uzs7MTsgMXk7MnY7O0Zhczsyc207MTtVYzsyOztHNXg7emI7O0g4bzsxb3E7O0k7Ozc7QzF3O2o7O0Q7OzE7IDs5OztLYTs7O0xkOzI7O05qOzs7Tzg7OztTMjA7bjs7SzFjOzRnOztMMnQ7OTQ7O00xczs5YTsxO001Ozs7TmRsOzM2OzI7UjE7ZDs7VDQ7aDs7UDs7MTtPMjVrOzFqNDsxO1YyNHk7MWk4OzE7Lzs7MTtCOzU7O1I5bjtmNjsyO0plOzM7O1QzeTtlOztTYnk7bHQ7MTtXNW07Zzs7VDNtOzloOzE7TDs7MTtENTs7O1U2MDsxYTsxO1M0O2k7O1YxYTs0aDs7VzY0OzRuOzI7QXU7MzA7O087OzE7SDs4OztYcDs0cDs7WXM1O2FmOzM7QzY0OzFpOzE7TDs2OztQMWs7M3Q7O1VqOzFwOzthMTBwejs4ZjsxO3NxMTtkOzE7YTs7MTtuMTs4Ozt0OzsxO2gxO2E7O3ZrOzFjOzvCsjs3OzvDlzs1OztPMW45OzFnN2Y7NTtOMTc7M2w7MTtFMTI7Mjs7bDI5Ozh5YjsxO3ZsOzI7O251aDsxdGk7MjtjOzsxO2VjOzI7O2V0YzsyMTsxO2kyOzFrOztvaTszZTsxO3BmOzE7O3UzeDsxZXk7MTtpM2M7Yjs7UDVkc2c7a2c7MTtobWI2OzNyOzI7aTM5ajt2OzE7YTs5OztvMTI4OzFzOzI7Ymg7MTk7MjtpODs7O285Ozs7aTE7ajs7UWIzYzsxbDsxO2k4Yzt0OzE7bjYxO2w7MTtnNHg7bDsxO3gxO2Y7O1IzdGU2O3Uwbjt6OyA2aDsxMTk7OyY4dDt6ZTs7LDtrOzsuMnI7NHQ7MTtKajszOzsvYTtxOzsxMXM7M2s7OzRhO3I7OzY3O2o7O0ExMmM7eW07MzsgZDsxbzs7LjE7YTs7Rjd2O3JhOzE7VGY7OztCNGI7djQ7MTtSazszOztDNTI7bDc7O0QzNDs5Yjs7RW5wOzNhOzM7IGI7cTs7UzN6O3E7MTtQYTtwOztVOzU7O0Z4bDs1Y2c7O0cxMTs1dzs7SDF4OzFhOzE7UzQ7Zjs7SWYyOzZvOzI7QTE3OzNzOztDOzsxOyBhOzFjOztKbjsyZTs7S3o7NWc7O0wxaDsyazsxO1A2Ozs7TTV1O2NnOzU7MWU7NDs7MjY7OzszNjs7OzU5Ozs7NjU7OztONHk7cTM7O09nczs4NjsyO0hrOzE2OztUMW47M2I7MjtBdjs7O083Ozs7UDR1O3E3OztRODtxOztSMjE7Mzc7MTtGNjs7O1MxcGw7MXVwOzQ7LDg1OzZiOzsuYmE7N2w7Oz8ybDt5OztUdjs2OztUNXQ7aXo7O1UyMzs0dTs0O0I1Ozs7TTU7OztOYjs7O1M5OzE7O1YxaDs4dTs7WGE7bzs7Yzs4OztmM3FoO2RiODsxO007OzE7Lmg7NDs7aDF4azsxYTsyO0E7NTs7Qjs1OzvDsjs1OztTN2xkZjtlYTc7MTE7IDluOzE4YTs7JjFvOzNzOzssMjtmOzsuZTg7OTE7NDtFNzttOztNYzsxMDs7T2E7MTg7O1Q7OzE7Ljs7MztCMjtiOztEMztjOztNMjtjOzsxbTsyOTs7MzU7bzs7NGI7czs7NTU7aTs7Njg7czs7ODQ7aTs7OTI7Yjs7QTFiMTtsMzszOyAyYTs3ZDs7ODs1OztTMnY7M3Q7MjtFcDs0OztJNjs7O0IzMDs3NDs7Q2xmO2E3OzM7QTJ6OzE1OzE7IDM7eTs7Ujs7MjtBcDs7O1U1Ozs7VDY7czs7RDY2O25zOztFcmk7anE7NjsgczsxZzs7NTs3OztDM2c7YmE7MztBYzs7O09oOzs7Umg7Mzs7STs7MTtGOTs7O08xYTsyODs7VTs1OztGNTg7N3c7MzsmNTs7O0g2Ozs7Tzs7MTtTODs7O0cyNDs1djsxO0RmOzU7O0g2bTszdDszOzI1O2g7OzMyO2c7O0w7Nzs7SXQwOzgzOzI7IGY7NTA7O1M7OzE7TzY7OztLOzsyO0k5OzE7O1loOzs7TDZ6OzhtOzM7QTJrO287MjsgMTtnOzsuOzU7O0l1O2U7MTsgMztjOztPbTs1OztNOWo7bGg7MztBMjg7bzsxOyA0O207O0lpOzU7O1U7OzE7UjY7OztOOzs1O0ExZTtiOztDOzszO0E4Ozs7QjU7OztDODsxOztFMTg7bzs7RmE7OztPNGc7MTs7T2k3O2RjOzU7IGM7dTs7QTRjOzFoOzE7STU7Zzs7RWc7MW07O1N2OzVtOzE7VTU7OztWOTtwOztQMXI4OzMyMDs3O0ExMDI7MWRuOzc7QWE7OztDaDs7O0QyMjs7O01yOzs7TmU7OztSMmY7OztTODsxOztFM2s7ajsxOyA0O2c7O0liOTsxNTU7NDtDbzs7O0Q2Ozs7TjU7OztSNTs7O0wxMzsyNjsxO082Ozs7TzE4O2U7O1UxeDs1OztZNTs7O1E7OzE7IDE7ZTs7UjNpOzl6OztTZjc7MWt2OzE7V2U7OztUamc7ZTc7OTtBNDY7dzsxOyA4O3M7O0M3O3I7O0RuOzJ6OztGNDtuOztJcTsxYzs7TDY7azs7TW07MTU7O1NiOzEyOztWNTsxMjs7VTs7NztCbjsxOztMNDI7Mjg7O01qOzs7TjE4Ozs7UDE1OzI7O1JmOzs7U2Y7OztWNmo7eTc7O1doZTsydjsxO1I1O207O1g7OzE7TTI7Yzs7aGE5bTsxNDsxO2kybTc7aTsxO2c7OzE7YTs7MTtvOzc7O3B4Ymw7M3U7MTtpMWxnO3M7MTtvNjtqOzE7bjY7Ozt0cG12OzMzOzI7Qjs1Oztpa3o7YjsxO2M1YjthOzE7aTs4OztUM2RhdjtpZjs0O2Fjenk7NGY7MjtpMXdqOzE1OzI7Zzs7MTthNjs7O3M7OzE7Yzs4Ozt2MXE7cTsxO2UxNztoOzE7cztoOztlZ2E2OzI5OzE7YTFvMjtvOzE7bWcyOzY7MTtwOzY7O3VjNHQ7MjI7MTtpOzsyO2wxOzg7O3I7ODs7w6AxO247O1Uyb2g4O2ExajttOy5qcWs7ODA7MTtONzg7aDsxOy43MDtoOzE7QztmOzsvMnI7ZjsxOzE7OTs7MTs7MTsgYzs7OzI0Yjt4OzE7MTc7azs7TDNxO2o7MTtUOzY7O003aDsxZDsxO044O3E7O040YnA7YW07NDtDMnU7azsxO0w7NTs7RDs7MjsgNjs7O1AxNDsyOztLOzU7O1I7OzE7IDU7OzthMzs0MDs7YjJyOzQzOzI7YW07NDs7aXM7OTs7ZGU7MTY7O2dscDszYTsxO2w7MW47O2k7OzE7Z3E7YTs7bDJ1OzE0cjsyO2lnOzQ7O3ljOzs7bXk7OG47O250cmM7MnVoO287IDU7azs7YTs7MTtuMWU7Yjs7YjM7MXE7O2NlOzl3OztkMXU7eDI7O2UxOTsxdDsxO3MxNjsyOztmMzsyZDs7ZztsOztoNjtsOztpdGozO2tiOzI7ZDM7ZTs7bjI7NjU7O2o7Nzs7azM7NTU7O2wzOzJjOzttNTsxZTs7bjI7dDs7bzQ7MTM7O3AyOzFwOztxOzU7O3I2OzcxOztzNTsydTs7dDExOzRhOzt1Njt2Ozt2MTthOzt3MTsxMDs7cDEyO3plOztyMWFwOzFyczszO2E0aDtrOztlYTs7O3V6NTtlMjsxO2sxO2Q7O3MxYXQ7NDE7MzsgOzc7O2g5O3Q7O3R3OzFyOzE7cnA7MTs7dGxhOzQ5OzQ7aDI7YTs7bjE7bjs7cmE7dTs7dDc7ajs7eDI7ajs7ejJkO2R5OzvDrTI7ZTs7VzNmemg7MXhwOzI7UGdoODsxa3c7MTs6ZHRwOzFqcjs0O0E7OzE7RnA7MWI7O0k7OzI7QjE7OTs7Tjs7MTtIODsxOztPZTI7N2I7MTtWO2E7O1Ixbjc7Y3Y7MTtGOzsxO0M7OzI7TjU7OztVMWI7ZTs7aTE1MHo7Nmw7MTtrdWNiOzVuOzE7aXUwczs1bDsxO0VsOzg7MTtsOzsxO2kxOzg7O1gxOGs7NXJ1Ozc7YTJvOzY7O2U3bzs1OztoMjI7OztpOHY7Yzs7b207NDs7dXg7NDs7eXQ7NDs7WWRyMTs1czszO2UxeHE7djsxO3QzNTthOzE7aDI7YTs7cDM7ZDs7czE7ODs7WzFmMztiMzs1O0E2O207O0U7Yjs7STE7YTs7YWk7MTM7O2VkOzMwOztfMXBkZTs1ZjM7MjtfMXBhMjs1ZW07MTtpOzY7O2U7NTs7YDRqOzE5OzM7YTE7Zzs7ZTs1OztpOzc7O2FhNGU7MWsxY3I7NzsgMmU2OzFyNDs7bTZoOzFibWM7MTthMms7Z2RrOzE7cjs7MTsgOTs7O24xeXE7NHRjejsxO2RzejsxMzY7Mjsgc207Njk7O8SbNTs7O3A4eDsydG4xOzE7cmo7ZTg7MTt0Njs7O3IxcWw7ZG02ZDsxO3QxYmI7N3JycDsxO8OtNjs7O3VhdDsyNzF5OzE7c2M7d207MTtzNjtsOzE7aTs7MTsgNTs7O3YzMTsycXN2OzE7dTU7MjE7MTt0NTs7O2QxNDEzMjs0c3A7MzthNGJoNzszaTsxO3MxcTM7MWo7MTsgOzFoOztlZGV6MjszdGw7Mjttb3NhOzFuOzE7IDI7MTA7O3I5b2M7M2IxOzE7IDE7M2FuOztpZHNkMDtreTsyO2NmZzE7azsxO2hkajtkOzE7IDtjOztlNTdrOzZ3OzE7czFybDtsOzE7ZTFwcDtrOzI7bTs1OztyOzU7O2U3d247emxyejs4O2MydTttbzI7MTtvMXo7ZWd5OzE7bjFnO2JidjsxO28xZTtiYmc7MTttMWU7YmJjOzE7aTFiOzljODsxO2E2Ozs7ZWU7MTVkOzE7dzg7OztsYnI7MnlpcTsxO2l0OzViaTsxO3RqOzNxaDsxO2VnOzNoczsxO2k1Ozs7bThnOzF0NWM7MTtwMno7b2llOzE7ZWQ7djY7MTt6ZDs7O255cDs2YjRqOzE7dDdqOzFnMnM7MTtlMTY7NWQ0OzE7bjU7cjsxO2Q1Ozs7czk2OzF5cHI7MjthOzsxOyA1Ozs7dDQ1OzE3MTY7NDthMmc7YzNsOzE7IGQ7OztlODtpMDsxOyA2Ozs7aWw7dGw4OzE7bWw7dGw1OzE7YWw7dGw0OzE7cjU7OztyZDtibzsxO3U7OzE7dDY7Ozt1MnFvOzc0OzE7cDExYTsyajsxOyA7aTs7dzJlO287O2YxbjlodDsxY3Q7MzsgMWI7NDQ7O003OzJqOzt5MWw7NzsxO2k7Nzs7aHBwNm87MXQwNDs5OyAzNztrcTs7LDE7OTs7Ljs1OztDMjsxZDs7YTR0cGU7bGE7MTt1MWplOzFyOzE7dG47MWo7MTtiNTs7O2UzcTNnOzN3bjsyO2lhamQ7MjRiOzE7cjF6OzIzMjsxO2ExNTsxOztyamFqOzFlcDsxO20xdWo7MTQ7MTthODM7ZTsxO247NTs7bzYzdDU7MWViMzs0O215bWc7MXJkOzI7YTE2dDsxbW47MTsgNjs7O21tOzFnOztuMWF3O293bzs4OyBhOzE7O2I4Ozs7ZGY7OztlejM7MzJyOzM7IDY7OztkZTs7O3l2bjsxOztnYTs7O2lmOzE7O2s0ZTs7O3ZkOzs7cm8yNzs3YjsxO3NjOGM7MXY7MTsgODsxNTs7dTFseXk7bXZyOzE7cjI2O211czs7cnk7NzsxOyA7NTs7dDJ0OzUxOzE7dDFlOzI0OzE7cDFlOzI0OzE7OnU7Zjs7aTU1MDt0NWM4OzY7YmM7M2E7MTtuNzs7O2U5O2w7MTtyNzs7O24yeDM7am1rYTsyO2Zibzsxam53OzI7bDFzO2ZsMzsxO3UxNztjdWg7MTvDqjk7OztvNnA7Z2FqOzE7YWQ7MTs7czg0OzFwdjE7MTt0M3k7d2hrOzE7YTE3OzlncTsxO2xkOzIxYzsxO2E1Ozs7cjJqO2VrZzsxOyA4OzE7O3NxejsxYWdrOzE7IGpkOzRxOzt1MTY7ODs7azN2NjM7NWY7MTt1cnM7bjsxOyAzO247O2wxZXd6bzt6cDszO2NqOzc7MTtkOzY7O3NsOzU7MTsgOzU7O3ZtOzg7MTthOzg7O20xcWw5ODsyNDM7YTsgMWI7OTM7Oyw7Nzs7UnM7M2U7O2I7OzE7YTU7OztlZ3VyMjs5cjsxO2kyYztkOzE7bjM7ZDs7ZjU7Zzs7cHo7NmI7O3Q7OzE7YWE7Ozt1NXFsODs1dDsxO2wxOTN0OzJ0OzE7dDE3dXM7MnQ7MTtpMTd0eTsydDsxO2MxZDQ7ODsxO2E0ejs2OzE7bW87NjsxO3A7OzE7aTs2OzvDlzthOztuMTRzZXE7M2I3OzY7IDlyOzFlaTs7Vjc7dzs7VzQ7cTs7ZHg7MW47MTsgZTs7O3RlO3U7O8OXMTtiOztvMXBvMTtnbXNlOzg7YzJsO2V3eTsyO2hiOzR3OzE7b2E7MTs7dTc7NnU7MTtwNzs7O2QyMTs2aWk7MTtkMW87NTllOzE7eWE7Oztma3o7MmNnOTsxOyBicjs1MTs7Z3A7ZmQ7MTtnZTsxMTsxO2lhOzs7bjFtdXk7MTUxdjtvOyA0YTs2eTY7Oyc7NTs7LDs4OzsvMTszdDs7YTE7ZTs7YjtkYjs7YzFxYztzZTsxO28zO3JuOztkMTtuOztlMWtxeDtidTsyO2k7Yjs7cjY7M2E7O2Y7OTs7ZzF0O2FkbTs7aTM7Y2E7O2w2cTtqdzc7O200OzE0OztuO2M7O28yOzU3OztyOzFhOztzNjsxMGY7O3Q2O2hiOzt1MTsxbDs7dzE7MWs7O3k7MTU7O3o7Nzs74oCTOzY7O3JodDsyc2FzOzE7aTMwO2d3bjsxO2cycDtmbDQ7MTtlNjs7O3QzNzs1MGk7MTtyOzsxO3M7ODs7dTdqOzFlNnQ7MTtpMTY7Njs7cjFmeGk2OzF1MTszOyAxNDs2Zzs7JjE7ODs7ZjEyOzUyOztzM2FybzU7M2lvOzk7LDtlOzs/OzU7O1IyO2g7O2Y7OzI7ZTg7OztvODs7O2lnZ244O2I5OzE7YzF2cDsxODsxO2hiOzE3OztsMjB1NDsxbTsxOyA7NTs7cGJhZG87ZGU7MjszMztqOztpcGljOzEyOzE7IDs1OztyMXQ7azsxO2c7Yzs7djs7MzthZTs7O2UxMTs7O2k2Ozs7dDFjMXA3OzFtdDsyO0ExOzk7O1MzOzJ1Ozt1NGRocTs4cm5jO2M7IDd4O247Oy45Ozs7YmVoOzNmOzI7ZTc7MW07O2w7NTs7Zmw7Njs7azZoOzJlOzI7YWU7MTE7O2k4O247O20xajs0a2o7MTthOzsxOyBmOzU7O24yZW81OzZ6bnk7MzthM2xuOzdqMDszOyAxcjs0OztuM2R6O2luOzU7YTI7Yzs7Yzs4OztuNTthNzs7czszNzs7dDszaDs7cjRhO2poOzE7eTQ2OzQ7O2UyODthOG07MjsgbTs7O2k3Ozs7aTI5cDM7d2Z1Ozg7YzE0YTsxNzsyO29lZztpOzE7cmNsO2g7MTtwO2E7O3U7OzE7bTs2OztkNHg7MmI5OzE7aTRkO2Y7MTtvOzc7O2c7OzE7bjs1Oztsc2w7MTc7MTtsO2k7O20yaTtyOTsxO28yYTsyOztuM3k7c3NwOztzOWo7bTsxO3M7Zjs7dmhnNTs1eDsxO29qOzE3OzE7Y2Q7Mzs7cjFjYjtiZDQ7NTthY287cjs7ZTN2O2g7O2loNztpOztsN207MWo7O280NztrOztzMXN6dzsxaWc7MzsgaDszZjs7aDE7OWY7O3UxYmg7aXY7MTtyZGE7Z3M7MjtlcTthOztwY2Q7Z2c7MzthM2I7MXk7O2U3cTszNjs7aWc7Ozt0MzNqOzFhaTsyO207cjs7dGE7MTZiOzt2M2M7Yzs7dzNlO2Q7MTthOzc7O3g7O2I7IDIzO2h3OzsnOzY7OywxO2M7Oy4yO2E7OzhvOzQ3OztiNTtmOztrOzEzOztsMTs4OzttZDt4OzE7YTc7Ozt0O2M7O3k0eTtlOzE7IDthOzt5NmF0bjtjYTsxO2wxO2M7O3s2cztyOzE7YTs3Ozt8NTg7bTsxO2ExO2I7O8KjNmNzOzhsOzE7ODJiOzZvOzvDgDs5OzvDgWE7bzs7w4QzO2M7O8OFMjtrOzvDhjQ7azs7w4lmOzJxOzvDkjtjOzvDkzE7MWQ7O8OWYTsxNjs7w5w0O3Y7O8OgNzt2OzvDoTU7bDs7w6YxO207O8OoOzY7O8OpNGM7Ymc7MTt0M2g7Mjk7MzthNDsxbjs7bzthOzt1MTtiOzvDrTs1OzvDtjI7ZTs7w7xkO3I7MTsgNzs7O8SAMTtiOzvEgTM7czs7xKs7NTs7xLA0O287O8WMMztvOzvFjTsybTs7xZM7ODs7zqkyO2U7O86xMWM7YzE7O861NTsxczs7z4k3OzF4OzvPtTs4OzvQtTs1OzvigJMzYTsxazsyO2U7YTs7aTs5OzvihJM7ZDs7XCI7XHJcbiAgICB2YXIgcm9vdCA9IHt9O1xyXG4gICAgZnVuY3Rpb24gZmlsbChwcmVmaXgsIG5vZGUsIGRpY3QpIHtcclxuICAgICAgICB2YXIgYSA9IGRpY3Quc3BsaXQoJzsnLCAzKVxyXG4gICAgICAgICAgICAsIG4gPSBhLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4gcGFyc2VJbnQoeCwgMzYpfHwwOyB9KTtcclxuICAgICAgICBub2RlLmRhdGE9e1xyXG4gICAgICAgICAgICBhQ291bnQ6blswXSxcclxuICAgICAgICAgICAgYW5Db3VudDpuWzFdLFxyXG4gICAgICAgICAgICBwcmVmaXg6cHJlZml4LFxyXG4gICAgICAgICAgICBhcnRpY2xlOm5bMF0+PW5bMV0/XCJhXCI6XCJhblwiXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRpY3QgPSBkaWN0LnN1YnN0cigxICsgYS5qb2luKCc7JykubGVuZ3RoKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5bMl07IGkrKylcclxuICAgICAgICAgICAgZGljdCA9IGZpbGwocHJlZml4ICsgZGljdFswXSwgbm9kZVtkaWN0WzBdXSA9IHt9LCBkaWN0LnN1YnN0cigxKSk7XHJcbiAgICAgICAgcmV0dXJuIGRpY3Q7XHJcbiAgICB9XHJcbiAgICBmaWxsKFwiXCIsIHJvb3QsIGRpY3QpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICByYXc6IHJvb3QsXHJcbiAgICAgICAgLy9Vc2FnZSBleGFtcGxlOiBBdnNBbi5xdWVyeShcImV4YW1wbGUgXCIpXHJcbiAgICAgICAgLy9Ob3RlIHRoYXQgdGhlIHRlcm1pbmFsIHNwYWNlIGluZGljYXRlcyB0aGlzIGlzIGEgY29tcGxldGUgd29yZCAtIHRoaXMgaXMgc29tZXRpbWVzIHNpZ25pZmljYW50LCBwYXJ0aWN1bGFybHkgZm9yIGFjcm9ueW1zIVxyXG4gICAgICAgIC8vcmV0dXJuczoge1xyXG4gICAgICAgIC8vICAgcHJlZml4OiBcImVcIiwgLy90aGUgcHJlZml4IHN1ZmZpY2llbnQgdG8gZGV0ZXJtaW5lIHRoZSBhcnRpY2xlXHJcbiAgICAgICAgLy8gICBhQ291bnQ6IDk2ODIsIC8vdGhlIG51bWJlciBvZiB0aW1lcyBcImFcIiB3YXMgc2VlbiBmb3IgdGhpcyBwcmVmaXhcclxuICAgICAgICAvLyAgIGFuQ291bnQ6IDEwMjgyNDYsIC8vdGhlIG51bWJlciBvZiB0aW1lcyBcImFuXCIgd2FzIHNlZW4gZm9yIHRoaXMgcHJlZml4XHJcbiAgICAgICAgLy8gICBhcnRpY2xlOiBcImFuXCIsIC8vdGhlIG1vc3QgY29tbW9uIGFydGljbGVcclxuICAgICAgICAvL31cclxuICAgICAgICBxdWVyeTogZnVuY3Rpb24gKHdvcmQpIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBub2RlIDogYW55ID0gcm9vdCwgc0kgPSAwLCByZXN1bHQsIGM7XHJcbiAgICAgICAgICAgIGRvIHtcclxuICAgICAgICAgICAgICAgIGMgPSB3b3JkW3NJKytdO1xyXG4gICAgICAgICAgICB9IHdoaWxlICgnXCLigJjigJnigJzigJ0kXFwnLSgnLmluZGV4T2YoYykgPj0gMCk7Ly9hbHNvIHRlcm1pbmF0ZXMgb24gZW5kLW9mLXN0cmluZyBcInVuZGVmaW5lZFwiLlxyXG5cclxuICAgICAgICAgICAgd2hpbGUgKDEpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5vZGUuZGF0YSB8fCByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZVtjXTtcclxuICAgICAgICAgICAgICAgIGlmICghbm9kZSkgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgIGMgPSB3b3JkW3NJKytdIHx8IFwiIFwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufSkoKTsiLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vU2F5LnRzXCIgLz5cclxuY2xhc3MgU2F5Qm9sZCBleHRlbmRzIFNheSB7XHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0UHVyZUVsZW1lbnRzICgpIDogUHJvbWlzZTxBcnJheTxFbGVtZW50IHwgVGV4dD4+IHtcclxuICAgICAgICBsZXQgcGFyYWdyYXBocyA9IGF3YWl0IHRoaXMuZ2V0UGFyYWdyYXBocygpO1xyXG5cclxuICAgICAgICBsZXQgZWxlbWVudHMgPSBwYXJhZ3JhcGhzLmxlbmd0aCA9PSAxID8gcGFyYWdyYXBoc1swXSA6IEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sIHBhcmFncmFwaHMpO1xyXG5cclxuICAgICAgICBsZXQgYiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiXCIpO1xyXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgYi5hcHBlbmRDaGlsZChlbGVtZW50KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gW2JdO1xyXG4gICAgfVxyXG59IiwiY2xhc3MgU2F5SGVTaGVJdCBleHRlbmRzIFNheSB7XHJcbiAgICBwcml2YXRlIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcImEgXCIpO1xyXG4gICAgcHJpdmF0ZSB0YXJnZXQgOiBUaGluZztcclxuICAgIHByaXZhdGUgdXBwZXJjYXNlID0gdHJ1ZTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKHRhcmdldCA6IFRoaW5nLCBhdXRvVXBwZXJjYXNlPyA6IGJvb2xlYW4pIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xyXG4gICAgICAgIGlmIChhdXRvVXBwZXJjYXNlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnVwcGVyY2FzZSA9IGF1dG9VcHBlcmNhc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXRQdXJlRWxlbWVudHMgKHNheSA6IFNheSkgOiBQcm9taXNlPEFycmF5PEVsZW1lbnQgfCBUZXh0Pj4ge1xyXG4gICAgICAgIGxldCBuZXh0ID0gdGhpcy50YXJnZXQ7XHJcbiAgICAgICAgaWYgKG5leHQgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubm9kZS5ub2RlVmFsdWUgPSBcIlwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChuZXh0IGluc3RhbmNlb2YgSHVtYW5vaWQpIHtcclxuICAgICAgICAgICAgICAgIGxldCBnZW5kZXIgPSBuZXh0LmdldEdlbmRlclZhbHVlKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZ2VuZGVyLmdlbmRlclZhbHVlQ29ycmVjdGVkID4gNjUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUubm9kZVZhbHVlID0gXCJzaGUgXCI7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdlbmRlci5nZW5kZXJWYWx1ZUNvcnJlY3RlZCA8IDM1KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlLm5vZGVWYWx1ZSA9IFwiaGUgXCI7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgcGVyc29uIGlzIGFuZHJvZ3lub3VzLi4uXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdlbmRlci5oYXNQZW5pc0J1bGdlIHx8IGdlbmRlci5oYXNQZW5pcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUubm9kZVZhbHVlID0gXCJoZSBcIjtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdlbmRlci5oYXNWYWdpbmEgfHwgZ2VuZGVyLmhhc1RpdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlLm5vZGVWYWx1ZSA9IFwic2hlIFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZS5ub2RlVmFsdWUgPSBcInRoZXkgXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogSWYgd2UgZXZlciBoYXZlIGdlbmRlcmVkIG5vbi1odW1hbm9pZHMsIHRoZXkgbXVzdCBiZSBhZGRlZCBoZXJlLlxyXG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlLm5vZGVWYWx1ZSA9IFwiaXQgXCI7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnVwcGVyY2FzZSAmJiBzYXkuY3VycmVudFBhcmFncmFwaC5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlLm5vZGVWYWx1ZSA9IHRoaXMubm9kZS5ub2RlVmFsdWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKClcclxuICAgICAgICAgICAgICAgICAgICArIHRoaXMubm9kZS5ub2RlVmFsdWUuc3Vic3RyKDEsIHRoaXMubm9kZS5ub2RlVmFsdWUubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFt0aGlzLm5vZGVdO1xyXG4gICAgfVxyXG59IiwiY2xhc3MgU2F5SGltSGVySXQgZXh0ZW5kcyBTYXkge1xyXG4gICAgcHJpdmF0ZSBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJhIFwiKTtcclxuICAgIHByaXZhdGUgdGFyZ2V0IDogVGhpbmc7XHJcbiAgICBwcml2YXRlIHVwcGVyY2FzZSA9IHRydWU7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yICh0YXJnZXQgOiBUaGluZywgYXV0b1VwcGVyY2FzZT8gOiBib29sZWFuKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcclxuICAgICAgICBpZiAoYXV0b1VwcGVyY2FzZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy51cHBlcmNhc2UgPSBhdXRvVXBwZXJjYXNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0UHVyZUVsZW1lbnRzIChzYXkgOiBTYXkpIDogUHJvbWlzZTxBcnJheTxFbGVtZW50IHwgVGV4dD4+IHtcclxuICAgICAgICBsZXQgbmV4dCA9IHRoaXMudGFyZ2V0O1xyXG4gICAgICAgIGlmIChuZXh0ID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm5vZGUubm9kZVZhbHVlID0gXCJcIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAobmV4dCBpbnN0YW5jZW9mIEh1bWFub2lkKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZ2VuZGVyID0gbmV4dC5nZXRHZW5kZXJWYWx1ZSgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGdlbmRlci5nZW5kZXJWYWx1ZUNvcnJlY3RlZCA+IDY1KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlLm5vZGVWYWx1ZSA9IFwiaGVyIFwiO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChnZW5kZXIuZ2VuZGVyVmFsdWVDb3JyZWN0ZWQgPCAzNSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZS5ub2RlVmFsdWUgPSBcImhpbSBcIjtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBwZXJzb24gaXMgYW5kcm9neW5vdXMuLi5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuZGVyLmhhc1BlbmlzQnVsZ2UgfHwgZ2VuZGVyLmhhc1BlbmlzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZS5ub2RlVmFsdWUgPSBcImhpbSBcIjtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdlbmRlci5oYXNWYWdpbmEgfHwgZ2VuZGVyLmhhc1RpdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlLm5vZGVWYWx1ZSA9IFwiaGVyIFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZS5ub2RlVmFsdWUgPSBcInRoZW0gXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogSWYgd2UgZXZlciBoYXZlIGdlbmRlcmVkIG5vbi1odW1hbm9pZHMsIHRoZXkgbXVzdCBiZSBhZGRlZCBoZXJlLlxyXG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlLm5vZGVWYWx1ZSA9IFwiaXQgXCI7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnVwcGVyY2FzZSAmJiBzYXkuY3VycmVudFBhcmFncmFwaC5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlLm5vZGVWYWx1ZSA9IHRoaXMubm9kZS5ub2RlVmFsdWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKClcclxuICAgICAgICAgICAgICAgICAgICArIHRoaXMubm9kZS5ub2RlVmFsdWUuc3Vic3RyKDEsIHRoaXMubm9kZS5ub2RlVmFsdWUubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFt0aGlzLm5vZGVdO1xyXG4gICAgfVxyXG59IiwiY2xhc3MgU2F5SGlzSGVyc0l0cyBleHRlbmRzIFNheSB7XHJcbiAgICBwcml2YXRlIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcImEgXCIpO1xyXG4gICAgcHJpdmF0ZSB0YXJnZXQgOiBUaGluZztcclxuICAgIHByaXZhdGUgdXBwZXJjYXNlID0gdHJ1ZTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKHRhcmdldCA6IFRoaW5nLCBhdXRvVXBwZXJjYXNlPyA6IGJvb2xlYW4pIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xyXG4gICAgICAgIGlmIChhdXRvVXBwZXJjYXNlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnVwcGVyY2FzZSA9IGF1dG9VcHBlcmNhc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXRQdXJlRWxlbWVudHMgKHNheSA6IFNheSkgOiBQcm9taXNlPEFycmF5PEVsZW1lbnQgfCBUZXh0Pj4ge1xyXG4gICAgICAgIGxldCBuZXh0ID0gdGhpcy50YXJnZXQ7XHJcbiAgICAgICAgaWYgKG5leHQgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubm9kZS5ub2RlVmFsdWUgPSBcIlwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChuZXh0IGluc3RhbmNlb2YgSHVtYW5vaWQpIHtcclxuICAgICAgICAgICAgICAgIGxldCBnZW5kZXIgPSBuZXh0LmdldEdlbmRlclZhbHVlKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZ2VuZGVyLmdlbmRlclZhbHVlQ29ycmVjdGVkID4gNjUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUubm9kZVZhbHVlID0gXCJoZXJzIFwiO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChnZW5kZXIuZ2VuZGVyVmFsdWVDb3JyZWN0ZWQgPCAzNSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZS5ub2RlVmFsdWUgPSBcImhpcyBcIjtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBwZXJzb24gaXMgYW5kcm9neW5vdXMuLi5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuZGVyLmhhc1BlbmlzQnVsZ2UgfHwgZ2VuZGVyLmhhc1BlbmlzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZS5ub2RlVmFsdWUgPSBcImhpcyBcIjtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdlbmRlci5oYXNWYWdpbmEgfHwgZ2VuZGVyLmhhc1RpdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlLm5vZGVWYWx1ZSA9IFwiaGVycyBcIjtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUubm9kZVZhbHVlID0gXCJ0aGVpciBcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBJZiB3ZSBldmVyIGhhdmUgZ2VuZGVyZWQgbm9uLWh1bWFub2lkcywgdGhleSBtdXN0IGJlIGFkZGVkIGhlcmUuXHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGUubm9kZVZhbHVlID0gXCJpdHMgXCI7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnVwcGVyY2FzZSAmJiBzYXkuY3VycmVudFBhcmFncmFwaC5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlLm5vZGVWYWx1ZSA9IHRoaXMubm9kZS5ub2RlVmFsdWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKClcclxuICAgICAgICAgICAgICAgICAgICArIHRoaXMubm9kZS5ub2RlVmFsdWUuc3Vic3RyKDEsIHRoaXMubm9kZS5ub2RlVmFsdWUubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFt0aGlzLm5vZGVdO1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1NheS50c1wiIC8+XHJcbmNsYXNzIFNheUlmIGV4dGVuZHMgU2F5IHtcclxuICAgIHByaXZhdGUgY29uZGl0aW9uIDogKCkgPT4gYm9vbGVhbjtcclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoY29uZGl0aW9uIDogKCkgPT4gYm9vbGVhbiwgLi4ub2JqcyA6IEFycmF5PGFueT4pIHtcclxuICAgICAgICBzdXBlciguLi5vYmpzKTtcclxuICAgICAgICB0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbiAhPSB1bmRlZmluZWQgPyBjb25kaXRpb24gOiAoKSA9PiB7IHJldHVybiB0cnVlOyB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXRQdXJlRWxlbWVudHMgKCkgOiBQcm9taXNlPEFycmF5PEVsZW1lbnQgfCBUZXh0Pj4ge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbmRpdGlvbigpKSB7XHJcbiAgICAgICAgICAgIGxldCBwYXJhZ3JhcGhzID0gYXdhaXQgIHRoaXMuZ2V0UGFyYWdyYXBocygpO1xyXG4gICAgICAgICAgICByZXR1cm4gcGFyYWdyYXBocy5sZW5ndGggPT0gMSA/IHBhcmFncmFwaHNbMF0gOiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBwYXJhZ3JhcGhzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1NheS50c1wiIC8+XHJcbmNsYXNzIFNheUl0YWxpYyBleHRlbmRzIFNheSB7XHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0UHVyZUVsZW1lbnRzICgpIDogUHJvbWlzZTxBcnJheTxFbGVtZW50IHwgVGV4dD4+IHtcclxuICAgICAgICBsZXQgcGFyYWdyYXBocyA9IGF3YWl0IHRoaXMuZ2V0UGFyYWdyYXBocygpO1xyXG5cclxuICAgICAgICBsZXQgZWxlbWVudHMgPSBwYXJhZ3JhcGhzLmxlbmd0aCA9PSAxID8gcGFyYWdyYXBoc1swXSA6IEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sIHBhcmFncmFwaHMpO1xyXG5cclxuICAgICAgICBsZXQgYiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpXCIpO1xyXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgYi5hcHBlbmRDaGlsZChlbGVtZW50KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gW2JdO1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1NheS50c1wiIC8+XHJcbmNsYXNzIFNheUxlZnRSaWdodCBleHRlbmRzIFNheSB7XHJcbiAgICBwcml2YXRlIGxlZnQgOiBTYXkgPSBuZXcgU2F5KCk7XHJcbiAgICBwcml2YXRlIHJpZ2h0IDogU2F5ID0gbmV3IFNheSgpO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkTGVmdCAoLi4ub2JqcyA6IEFycmF5PFNheSB8IE9uZU9mIHwgT2JqZWN0IHwgUHJpbnRhYmxlIHwgc3RyaW5nIHwgbnVtYmVyIHwgU3RyaW5nIHwgKChzYXkgOiBTYXkpID0+IHN0cmluZyk+KSB7XHJcbiAgICAgICAgdGhpcy5sZWZ0LmFkZCguLi5vYmpzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkUmlnaHQgKC4uLm9ianMgOiBBcnJheTxTYXkgfCBPbmVPZiB8IE9iamVjdCB8IFByaW50YWJsZSB8IHN0cmluZyB8IG51bWJlciB8IFN0cmluZyB8ICgoc2F5IDogU2F5KSA9PiBzdHJpbmcpPikge1xyXG4gICAgICAgIHRoaXMucmlnaHQuYWRkKC4uLm9ianMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXRQdXJlRWxlbWVudHMgKCkgOiBQcm9taXNlPEFycmF5PEVsZW1lbnQgfCBUZXh0Pj4ge1xyXG4gICAgICAgIGlmICh0aGlzLmxlZnQuc2VxdWVuY2UubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmlnaHQuZ2V0UHVyZUVsZW1lbnRzKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJpZ2h0LnNlcXVlbmNlLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmxlZnQuZ2V0UHVyZUVsZW1lbnRzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgbWFpbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgbWFpbkRpdi5jbGFzc0xpc3QuYWRkKFwiaG9yRmxleFwiKTtcclxuXHJcbiAgICAgICAgbGV0IGxlZnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGxlZnQuY2xhc3NMaXN0LmFkZChcImhvckZsZXhDb2x1bW5cIik7XHJcbiAgICAgICAgbWFpbkRpdi5hcHBlbmRDaGlsZChsZWZ0KTtcclxuXHJcbiAgICAgICAgbGV0IHJpZ2h0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICByaWdodC5jbGFzc0xpc3QuYWRkKFwiaG9yRmxleENvbHVtblwiKTtcclxuICAgICAgICBtYWluRGl2LmFwcGVuZENoaWxkKHJpZ2h0KTtcclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5sZWZ0LmdldFB1cmVFbGVtZW50cygpLnRoZW4odmFsdWUgPT4ge1xyXG4gICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGVmdC5hcHBlbmRDaGlsZChlbGVtZW50KTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5yaWdodC5nZXRQdXJlRWxlbWVudHMoKS50aGVuKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgdmFsdWUuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIHJpZ2h0LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gW21haW5EaXZdO1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1NheS50c1wiIC8+XHJcbmNsYXNzIFNheUxpbmsgZXh0ZW5kcyBTYXkge1xyXG4gICAgcHJpdmF0ZSBsaW5rZWRBY3Rpb24gOiBBY3Rpb247XHJcblxyXG4gICAgcHVibGljIHNldEFjdGlvbiAoYWN0aW9uIDogQWN0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5saW5rZWRBY3Rpb24gPSBhY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldFB1cmVFbGVtZW50cyAoKSA6IFByb21pc2U8QXJyYXk8RWxlbWVudCB8IFRleHQ+PiB7XHJcbiAgICAgICAgbGV0IHBhcmFncmFwaHMgPSBhd2FpdCB0aGlzLmdldFBhcmFncmFwaHMoKTtcclxuXHJcbiAgICAgICAgbGV0IGVsZW1lbnRzID0gcGFyYWdyYXBocy5sZW5ndGggPT0gMSA/IHBhcmFncmFwaHNbMF0gOiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBwYXJhZ3JhcGhzKTtcclxuXHJcbiAgICAgICAgbGV0IGIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYlwiKTtcclxuICAgICAgICBiLmNsYXNzTGlzdC5hZGQoXCJ0ZXh0TGlua1wiKTtcclxuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIENvbnRyb2xzLkxpbmtzLm1ha2VMaW5rKGIsIHRoaXMubGlua2VkQWN0aW9uKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIFtiXTtcclxuICAgIH1cclxufSIsImNsYXNzIFNheVRoZSBleHRlbmRzIFNheSB7XHJcbiAgICBwcml2YXRlIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKTtcclxuICAgIHByaXZhdGUgdXBwZXJjYXNlID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgYWx3YXlzUHJpbnQgPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKGF1dG9VcHBlcmNhc2U/IDogYm9vbGVhbiwgYWx3YXlzUHJpbnQ/IDogYm9vbGVhbikge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgaWYgKGF1dG9VcHBlcmNhc2UgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBwZXJjYXNlID0gYXV0b1VwcGVyY2FzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFsd2F5c1ByaW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWx3YXlzUHJpbnQgPSBhbHdheXNQcmludDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldFB1cmVFbGVtZW50cyAoc2F5IDogU2F5KSA6IFByb21pc2U8QXJyYXk8RWxlbWVudCB8IFRleHQ+PiB7XHJcbiAgICAgICAgbGV0IG5leHQgPSBzYXkuc2VxdWVuY2Vbc2F5LnNlcXVlbmNlUnVubmVyICsgMV07XHJcbiAgICAgICAgaWYgKHRoaXMuYWx3YXlzUHJpbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5ub2RlLm5vZGVWYWx1ZSA9IFwidGhlIFwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobmV4dCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5ub2RlLm5vZGVWYWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKG5leHQgaW5zdGFuY2VvZiBUaGluZykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCEoPFRoaW5nPiBuZXh0KS5wcm9wZXJseU5hbWVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlLm5vZGVWYWx1ZSA9IFwidGhlIFwiO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUubm9kZVZhbHVlID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm9kZS5ub2RlVmFsdWUgPSBcIlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVZhbHVlICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMudXBwZXJjYXNlICYmIHNheS5jdXJyZW50UGFyYWdyYXBoLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGUubm9kZVZhbHVlID0gdGhpcy5ub2RlLm5vZGVWYWx1ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKVxyXG4gICAgICAgICAgICAgICAgICAgICsgdGhpcy5ub2RlLm5vZGVWYWx1ZS5zdWJzdHIoMSwgdGhpcy5ub2RlLm5vZGVWYWx1ZS5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gW3RoaXMubm9kZV07XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vRWxlbWVudHMudHNcIiAvPlxyXG5tb2R1bGUgRWxlbWVudHMuQXBwZWFyYW5jZUhhbmRsZXIge1xyXG4gICAgdmFyIHRhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYXBwZWFyYW5jZVRhcmdldFwiKTtcclxuXHJcbiAgICBmdW5jdGlvbiBlbXB0eSAoKSB7XHJcbiAgICAgICAgd2hpbGUgKHRhcmdldC5maXJzdENoaWxkKSB7XHJcbiAgICAgICAgICAgIHRhcmdldC5yZW1vdmVDaGlsZCh0YXJnZXQuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmludCAoc2F5IDogU2F5KSB7XHJcbiAgICAgICAgYXdhaXQgc2F5LmdldEhUTUwoXCJwXCIsIFtcImFwcGVhcmFuY2VEZXNjcmlwdGlvblwiXSkudGhlbih2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHRhcmdldC5hcHBlbmRDaGlsZCh2YWx1ZVtpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlQXBwZWFyYW5jZSAoKSB7XHJcbiAgICAgICAgZW1wdHkoKTtcclxuICAgICAgICAvLyBUT0RPOiBtYXliZSB1c2UgbXVsdGlwbGUgbmFtZXMgZm9yIFwiZGlja1wiXHJcbiAgICAgICAgbGV0IHBsYXllcjogSHVtYW5vaWQgPSA8SHVtYW5vaWQ+IFdvcmxkU3RhdGUucGxheWVyO1xyXG5cclxuICAgICAgICBsZXQgcGxheWVyR2VuZGVyID0gcGxheWVyLmdldEdlbmRlclZhbHVlKCk7XHJcbiAgICAgICAgbGV0IHBsYXllclNsdXR0aW5lc3MgPSBwbGF5ZXIuZ2V0U2x1dHRpbmVzcygpO1xyXG4gICAgICAgIC8vIGxldCBwbGF5ZXJUb3AgPSBwbGF5ZXIuZ2V0VG9wQ2xvdGhPbihIdW1hbm9pZC5TTE9UX0JSRUFTVFMpO1xyXG4gICAgICAgIC8vIGxldCBwbGF5ZXJCb3R0b20gPSBwbGF5ZXIuZ2V0VG9wQ2xvdGhPbihIdW1hbm9pZC5TTE9UX0xFR19VUFBFUik7XHJcbiAgICAgICAgLy8gbGV0IHBsYXllclNob2VzID0gcGxheWVyLmdldFRvcENsb3RoT24oSHVtYW5vaWQuU0xPVF9GRUVUKTtcclxuXHJcbiAgICAgICAgbGV0IHlvdSA9IG5ldyBTYXlMaW5rKFwiWW91XCIpO1xyXG4gICAgICAgIHlvdS5zZXRBY3Rpb24obmV3IEFjdGlvbkV4YW1pbmUoV29ybGRTdGF0ZS5wbGF5ZXIsIFdvcmxkU3RhdGUucGxheWVyKSk7XHJcbiAgICAgICAgbGV0IHByZXNlbnRhdGlvbiA9IG5ldyBTYXkoeW91LCBcIiBhcmUgcHJlc2VudGluZyBhcyBcIiwgbmV3IFNheUFuKCksIHBsYXllci5nZXRTaG9ydGVzdERlc2NyaXB0aW9uKCksIFwiLlwiKTtcclxuXHJcbiAgICAgICAgaWYgKHBsYXllclNsdXR0aW5lc3MubmFrZWQpIHtcclxuICAgICAgICAgICAgcHJlc2VudGF0aW9uLmFkZChcIiBZb3UgYXJlIG5ha2VkLlwiKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHBsYXllclNsdXR0aW5lc3MuaGFsZk5ha2VkKSB7XHJcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbi5hZGQoXCIgWW91IGFyZSBhbG1vc3QgbmFrZWQuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRpdHMgPSA8SHVtYW5vaWRCcmVhc3RzPiBUaGluZy5QYXJ0UmVsYXRpb24uZ2V0UmlnaHRUeXBlT25lKHBsYXllciwgSHVtYW5vaWRCcmVhc3RzKTtcclxuICAgICAgICBsZXQgcGVuaXMgPSA8SHVtYW5vaWRQZW5pcz4gVGhpbmcuUGFydFJlbGF0aW9uLmdldFJpZ2h0VHlwZU9uZShwbGF5ZXIsIEh1bWFub2lkUGVuaXMpO1xyXG4gICAgICAgIGxldCBidWxnZXMgPSBwbGF5ZXIuZ2V0QnVsZ2VzKCk7XHJcblxyXG5cclxuXHJcbiAgICAgICAgaWYgKGJ1bGdlcy5icmVhc3RzID4gMCB8fCBwbGF5ZXJHZW5kZXIuZ2VuZGVyVmFsdWVDb3JyZWN0ZWQgPiA2MCkge1xyXG4gICAgICAgICAgICBsZXQgcmVhbFRpdHMgPSB0aXRzLmdldFNpemVUZXh0KCk7XHJcbiAgICAgICAgICAgIGxldCBmYWtlVGl0cyA9IEh1bWFub2lkQnJlYXN0cy5nZXRTaXplVGV4dChidWxnZXMuYnJlYXN0cyk7XHJcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbi5hZGQoXCIgWW91IGhhdmUgXCIgKyByZWFsVGl0cyArIFwiIGJyZWFzdHNcIik7XHJcbiAgICAgICAgICAgIGlmIChidWxnZXMuYnJlYXN0cyAhPSB0aXRzLmdldFNpemUoKSAmJiByZWFsVGl0cyAhPSBmYWtlVGl0cykge1xyXG4gICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uLmFkZChcIiwgcGFkZGVkIHRvIGFwcGVhciBhcyBcIiArIGZha2VUaXRzICsgXCIgdGhyb3VnaCB5b3VyIGNsb3RoaW5nLlwiKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGl0cy5pc1VuY292ZXJlZCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uLmFkZChcIiwgc2FmZWx5IGNvdmVyZWQuXCIpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbi5hZGQoXCIuXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgLy8gcHJlc2VudGF0aW9uLmFkZChTYXkuUEFSQUdSQVBIX0JSRUFLLCBuZXcgU2F5Qm9sZChcIkdlbmRlciBWYWx1ZTogXCIpLCBwbGF5ZXJHZW5kZXIuZ2VuZGVyVmFsdWVDb3JyZWN0ZWQpO1xyXG4gICAgICAgIC8vIHByZXNlbnRhdGlvbi5hZGQoU2F5LlBBUkFHUkFQSF9CUkVBSywgbmV3IFNheUJvbGQoXCJTbHV0dGluZXNzIFZhbHVlOiBcIiksIHBsYXllclNsdXR0aW5lc3Muc2x1dHRpbmVzc0NvcnJlY3RlZCk7XHJcbiAgICAgICAgLy9wcmVzZW50YXRpb24uYWRkKFNheS5QQVJBR1JBUEhfQlJFQUssIG5ldyBTYXlCb2xkKFwiQnJlYXN0czogXCIpLCB0aXRzLmdldFNpemVUZXh0KCksIFwiIChWaXNpYmxlIGFzIFwiICsgSHVtYW5vaWRCcmVhc3RzLmdldFNpemVUZXh0KGJ1bGdlcy5icmVhc3RzKSArIFwiKVwiKTtcclxuXHJcbiAgICAgICAgaWYgKHBlbmlzID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBwcmVzZW50YXRpb24uYWRkKFwiIFlvdSBoYXZlIFwiLCBuZXcgU2F5QW4oKSwgSHVtYW5vaWRQZW5pcy5nZXRTaXplVGV4dChidWxnZXMuY3JvdGNoKSArIFwiIGNyb3RjaCBidWxnZSB2aXNpYmxlIHRocm91Z2ggeW91ciBjbG90aGluZy5cIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHJlYWxEaWNrID0gcGVuaXMuZ2V0U2l6ZVRleHQoKTtcclxuICAgICAgICAgICAgbGV0IGZha2VEaWNrID0gSHVtYW5vaWRQZW5pcy5nZXRTaXplVGV4dChidWxnZXMuY3JvdGNoKTtcclxuICAgICAgICAgICAgcHJlc2VudGF0aW9uLmFkZChcIiBZb3UgaGF2ZSBcIiwgbmV3IFNheUFuKCksIHJlYWxEaWNrICsgXCIgZGlja1wiKTtcclxuICAgICAgICAgICAgaWYgKHBlbmlzLmdldEFjdHVhbFNpemUoKSAhPSBidWxnZXMuY3JvdGNoICYmIHJlYWxEaWNrICE9IGZha2VEaWNrKSB7XHJcbiAgICAgICAgICAgICAgICBwcmVzZW50YXRpb24uYWRkKFwiLCB3aGljaCBsb29rcyBsaWtlIGl0IGlzIFwiICsgZmFrZURpY2sgKyBcIiBkdWUgdG8geW91ciBjbG90aGluZy5cIilcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICghcGVuaXMuaXNVbmNvdmVyZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbi5hZGQoXCIsIHdoaWNoIGlzIGNvdmVyZWQuXCIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb24uYWRkKFwiLlwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaWYgKHBlbmlzID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIC8vICAgICBpZiAoYnVsZ2VzLmNyb3RjaCA+IDApIHtcclxuICAgICAgICAvLyAgICAgICAgIHByZXNlbnRhdGlvbi5hZGQoU2F5LlBBUkFHUkFQSF9CUkVBSywgXCJZb3UgaGF2ZSBcIiwgbmV3IFNheUFuKCksIEh1bWFub2lkUGVuaXMuZ2V0U2l6ZVRleHQoYnVsZ2VzLmNyb3RjaCkgKyBcIiBidWxnZSB2aXNpYmxlIG9uIHlvdXIgY3JvdGNoLlwiKTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgIHByZXNlbnRhdGlvbi5hZGQoU2F5LlBBUkFHUkFQSF9CUkVBSyxcclxuICAgICAgICAvLyAgICAgICAgIG5ldyBTYXlCb2xkKFwiRGljazogXCIpLFxyXG4gICAgICAgIC8vICAgICAgICAgcGVuaXMuZ2V0U2l6ZVRleHQoKSxcclxuICAgICAgICAvLyAgICAgICAgIFwiIChWaXNpYmxlIGFzIFwiLFxyXG4gICAgICAgIC8vICAgICAgICAgbmV3IFNheUFuKCksXHJcbiAgICAgICAgLy8gICAgICAgICBIdW1hbm9pZFBlbmlzLmdldFNpemVUZXh0KGJ1bGdlcy5jcm90Y2gpLFxyXG4gICAgICAgIC8vICAgICAgICAgICAgIHBsYXllckdlbmRlci5oYXNQZW5pcyA/XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIChwZW5pcy5pc0ZsYWNjaWQgPyBcIiBmbGFjY2lkXCIgOiBcIiBlcmVjdFwiKSArXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIChwZW5pcy5nZXRBY3R1YWxTaXplKCkgPCA5ID8gXCIgbWljcm9kaWNrXCIgOiBcIiBjb2NrXCIpXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgOiBcIiBidWxnZVwiLFxyXG4gICAgICAgIC8vICAgICAgICAgXCIpXCJcclxuICAgICAgICAvLyAgICAgKTtcclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIC8vIFRPRE86IENoZWNrIGlmIGhhcyBhIHNwZWNpZmljIGxvb2sgdG8gaXQuIE9wdGlvbmFsLiBIYXJkIHRvIGRvLlxyXG4gICAgICAgIC8vIEV4YW1wbGVzOiBcIllvdSBhcmUgZHJlc3NlZCBjYXN1YWxseSBsaWtlIGEgd29tYW4uXCIsIFwiWW91IGFyZSB3ZWFyaW5nIGZvcm1hbCB3b21lbidzIGNsb3RoaW5nLlwiIGV0Yy5cclxuXHJcbiAgICAgICAgYXdhaXQgcHJpbnQocHJlc2VudGF0aW9uKTtcclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9FbGVtZW50cy50c1wiIC8+XHJcblxyXG4vKipcclxuICogVXBkYXRlIGZvbnQgc2l6ZXMgYWNjb3JkaW5nIHRvIHNjcmVlbiByZXNvbHV0aW9uIGFuZC9vciBtb2JpbGUgc3RhdHVzXHJcbiAqL1xyXG5mdW5jdGlvbiB1cGRhdGVGb250U2l6ZSAoKSB7XHJcbiAgICB2YXIgbWluV2lkdGggPSBFbGVtZW50cy5pc01vYmlsZT8gODAwIDogMTI4MDtcclxuICAgIHZhciBwcm9wb3J0aW9uID0gRWxlbWVudHMuaXNNb2JpbGUgPyAxNyA6IDE0LjU7XHJcbiAgICB2YXIgd2lkdGggPSBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIDwgbWluV2lkdGggPyBtaW5XaWR0aCA6IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGg7XHJcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGVbIFwiZm9udC1zaXplXCIgXSA9ICh3aWR0aCAqIHByb3BvcnRpb24gLyAxMjgwKSArIFwicHhcIjtcclxufVxyXG5cclxudXBkYXRlRm9udFNpemUoKTtcclxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdXBkYXRlRm9udFNpemUpOyIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9FbGVtZW50cy50c1wiIC8+XHJcbmZ1bmN0aW9uIHRvZ2dsZUZ1bGxTY3JlZW4oKSB7XHJcbiAgICB2YXIgZG9jID0gPGFueT4gd2luZG93LmRvY3VtZW50O1xyXG4gICAgdmFyIGRvY0VsID0gPGFueT4gZG9jLmRvY3VtZW50RWxlbWVudDtcclxuXHJcbiAgICB2YXIgcmVxdWVzdEZ1bGxTY3JlZW4gPSBkb2NFbC5yZXF1ZXN0RnVsbHNjcmVlbiB8fCBkb2NFbC5tb3pSZXF1ZXN0RnVsbFNjcmVlbiB8fCBkb2NFbC53ZWJraXRSZXF1ZXN0RnVsbFNjcmVlbiB8fCBkb2NFbC5tc1JlcXVlc3RGdWxsc2NyZWVuO1xyXG4gICAgdmFyIGNhbmNlbEZ1bGxTY3JlZW4gPSBkb2MuZXhpdEZ1bGxzY3JlZW4gfHwgZG9jLm1vekNhbmNlbEZ1bGxTY3JlZW4gfHwgZG9jLndlYmtpdEV4aXRGdWxsc2NyZWVuIHx8IGRvYy5tc0V4aXRGdWxsc2NyZWVuO1xyXG5cclxuICAgIGlmKCFkb2MuZnVsbHNjcmVlbkVsZW1lbnQgJiYgIWRvYy5tb3pGdWxsU2NyZWVuRWxlbWVudCAmJiAhZG9jLndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50ICYmICFkb2MubXNGdWxsc2NyZWVuRWxlbWVudCkge1xyXG4gICAgICAgIHJlcXVlc3RGdWxsU2NyZWVuLmNhbGwoZG9jRWwpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgY2FuY2VsRnVsbFNjcmVlbi5jYWxsKGRvYyk7XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vRWxlbWVudHMudHNcIiAvPlxyXG5tb2R1bGUgRWxlbWVudHMuSG92ZXJJbmZvIHtcclxuICAgIHZhciBob3ZlcmJveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaG92ZXJJbmZvXCIpO1xyXG4gICAgdmFyIGNvbnRlbnRUYXJnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImhvdmVyQ29udGVudFwiKTtcclxuICAgIHZhciB3aWR0aCA9IDA7XHJcbiAgICB2YXIgaGVpZ2h0ID0gMDtcclxuXHJcbiAgICBmdW5jdGlvbiBlbXB0eSAoKSB7XHJcbiAgICAgICAgd2hpbGUgKGNvbnRlbnRUYXJnZXQuZmlyc3RDaGlsZCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29udGVudFRhcmdldC5yZW1vdmVDaGlsZChjb250ZW50VGFyZ2V0LmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gbWFrZUhvdmVyYWJsZSAoZWxlbWVudCA6IEVsZW1lbnQsIGNvbnRlbnRzIDogQXJyYXk8RWxlbWVudCB8IFRleHQ+KSB7XHJcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VlbnRlclwiLCAoZSA6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgRWxlbWVudHMuSG92ZXJJbmZvLmhvdmVyU3RhcnQoZSwgY29udGVudHMpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgKGUgOiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIEVsZW1lbnRzLkhvdmVySW5mby5ob3Zlck1vdmUoZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3V0XCIsIChlIDogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICBFbGVtZW50cy5Ib3ZlckluZm8uaG92ZXJFbmQoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaG92ZXJTdGFydCAoZSA6IE1vdXNlRXZlbnQsIGNvbnRlbnRzIDogQXJyYXk8RWxlbWVudCB8IFRleHQ+KSB7XHJcbiAgICAgICAgZW1wdHkoKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnRlbnRUYXJnZXQuYXBwZW5kQ2hpbGQoY29udGVudHNbaV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBob3ZlcmJveC5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xyXG5cclxuXHJcbiAgICAgICAgaG92ZXJib3guc3R5bGUubGVmdCA9IFwiMHB4XCI7XHJcbiAgICAgICAgaG92ZXJib3guc3R5bGUudG9wID0gXCIwcHhcIjtcclxuICAgICAgICB3aWR0aCA9IGhvdmVyYm94Lm9mZnNldFdpZHRoO1xyXG4gICAgICAgIGhlaWdodCA9IGhvdmVyYm94Lm9mZnNldEhlaWdodDtcclxuXHJcbiAgICAgICAgaG92ZXJNb3ZlKGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBob3Zlck1vdmUgKGUgOiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgbGV0IGxlZnQgPSBlLmNsaWVudFggLSAod2lkdGgvMik7XHJcbiAgICAgICAgbGV0IHRvcCA9IGUuY2xpZW50WSAtIChoZWlnaHQpIC0gNjtcclxuXHJcbiAgICAgICAgaWYgKHRvcCA8IDApIHtcclxuICAgICAgICAgICAgdG9wID0gZS5jbGllbnRZICsgNjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChsZWZ0IDwgd2lkdGgpIHtcclxuICAgICAgICAgICAgbGVmdCA9IHdpZHRoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gV2lkdGggc2VlbXMgdG8gbm90IGJlIGNvbnNpZGVyaW5nIHRoZSBib3JkZXIsIGV2ZW4gdGhvdWdoIHdlIGFwcGxpZWQgYm9yZGVyLWJveFxyXG4gICAgICAgIC8vIEkgZG9uJ3QgY2FyZSBlbm91Z2ggdG8gZmlndXJlIHRoaXMgb3V0IHNvIHRoZXJlJ3MgYSBtYXJnaW4gb24gdGhlIHNpZGUhXHJcbiAgICAgICAgaWYgKGxlZnQgKyB3aWR0aCA+IEVsZW1lbnRzLnNjcmVlbldpZHRoKSB7XHJcbiAgICAgICAgICAgIGxlZnQgPSBFbGVtZW50cy5zY3JlZW5XaWR0aCAtIHdpZHRoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaG92ZXJib3guc3R5bGUubGVmdCA9IE1hdGgucm91bmQobGVmdCkgKyBcInB4XCI7XHJcbiAgICAgICAgaG92ZXJib3guc3R5bGUudG9wID0gTWF0aC5yb3VuZCh0b3ApICsgXCJweFwiO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBob3ZlckVuZCAoKSB7XHJcbiAgICAgICAgaG92ZXJib3guc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0VsZW1lbnRzLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL1dvcmxkL0NsYXNzZXMvUnVsZWJvb2sudHNcIiAvPlxyXG5tb2R1bGUgRWxlbWVudHMuSHlwZXJsaW5rSGFuZGxlciB7XHJcbiAgICBleHBvcnQgdmFyIGxpbmtlZEFjdGlvbnNUYWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImxpbmtBY3Rpb25zXCIpO1xyXG4gICAgZXhwb3J0IHZhciBjb21tb25BY3Rpb25zVGFiID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb21tb25BY3Rpb25zVGFiXCIpO1xyXG5cclxuICAgIHZhciBjdXJyZW50Q29tbWFuZCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpO1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjdXJyZW50Q29tbWFuZFwiKS5hcHBlbmRDaGlsZChjdXJyZW50Q29tbWFuZCk7XHJcblxyXG4gICAgdmFyIGN1cnJlbnRBY3Rpb25UYXJnZXQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKTtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibGlua1RhcmdldFwiKS5hcHBlbmRDaGlsZChjdXJyZW50QWN0aW9uVGFyZ2V0KTtcclxuXHJcbiAgICB2YXIgY29tbW9uQWN0aW9ucyA9IFtdO1xyXG4gICAgdmFyIGF2YWlsYWJsZUFjdGlvbnMgPSBbXTtcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzZXRDb21tb25BY3Rpb25zICgpIHtcclxuICAgICAgICBjb21tb25BY3Rpb25zLnNwbGljZSgwLCBjb21tb25BY3Rpb25zLmxlbmd0aCk7XHJcbiAgICAgICAgd2hpbGUgKGNvbW1vbkFjdGlvbnNUYWIuZmlyc3RDaGlsZCkge1xyXG4gICAgICAgICAgICBjb21tb25BY3Rpb25zVGFiLnJlbW92ZUNoaWxkKGNvbW1vbkFjdGlvbnNUYWIuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBhZGRDb21tb25BY3Rpb24gKG5hbWUgOiBzdHJpbmcsIGFjdGlvbiA6IEFjdGlvbikge1xyXG4gICAgICAgIGNvbW1vbkFjdGlvbnMucHVzaChbbmFtZSwgYWN0aW9uXSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcmVzZXRBdmFpbGFibGVBY3Rpb25zICgpIHtcclxuICAgICAgICBhdmFpbGFibGVBY3Rpb25zID0gW107XHJcbiAgICAgICAgY3VycmVudEFjdGlvblRhcmdldC5ub2RlVmFsdWUgPSBcIlwiO1xyXG4gICAgICAgIHdoaWxlIChsaW5rZWRBY3Rpb25zVGFiLmZpcnN0Q2hpbGQpIHtcclxuICAgICAgICAgICAgbGlua2VkQWN0aW9uc1RhYi5yZW1vdmVDaGlsZChsaW5rZWRBY3Rpb25zVGFiLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gYWRkQXZhaWxhYmxlQWN0aW9uIChuYW1lIDogc3RyaW5nLCBhY3Rpb24gOiBBY3Rpb24pIHtcclxuICAgICAgICBhdmFpbGFibGVBY3Rpb25zLnB1c2goW25hbWUsIGFjdGlvbl0pO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBob3ZlckFjdGlvbiAoYWN0aW9uIDogQWN0aW9uKSB7XHJcbiAgICAgICAgY3VycmVudENvbW1hbmQubm9kZVZhbHVlID0gYWN0aW9uLmdldENvbW1hbmRUZXh0KCkudG9Mb3dlckNhc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gdW5ob3ZlckFjdGlvbiAoKSB7XHJcbiAgICAgICAgY3VycmVudENvbW1hbmQubm9kZVZhbHVlID0gXCJcIjtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlwZXJsaW5rT2JqZWN0ICh0aGluZz8gOiBhbnkpIHtcclxuICAgICAgICByZXNldEF2YWlsYWJsZUFjdGlvbnMoKTtcclxuICAgICAgICBpZiAodGhpbmcgaW5zdGFuY2VvZiBUaGluZyAmJiB0aGluZyAhPSBXb3JsZFN0YXRlLnBsYXllcikge1xyXG4gICAgICAgICAgICBhd2FpdCBIeXBlcmxpbmtpbmdSdWxlYm9vay5leGVjdXRlKHtub3VuOiB0aGluZ30pO1xyXG5cclxuICAgICAgICAgICAgY3VycmVudEFjdGlvblRhcmdldC5ub2RlVmFsdWUgPSB0aGluZy5nZXRQcmludGVkTmFtZSgpICsgXCI6IFwiO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIHZhbHVlID0gYXZhaWxhYmxlQWN0aW9uc1tpXTsgdmFsdWUgIT0gdW5kZWZpbmVkOyB2YWx1ZSA9IGF2YWlsYWJsZUFjdGlvbnNbKytpXSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGxpbmsgPSBjcmVhdGVMaW5rKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGxpbmsuY2xhc3NMaXN0LmFkZChcImNvbHVtbkxpbmtcIik7XHJcbiAgICAgICAgICAgICAgICBDb250cm9scy5LZXlIYW5kbGVyLmFwcGx5Q29kZShsaW5rLCBDb250cm9scy5LZXlIYW5kbGVyLmdldFNlY29uZEtleUNvZGUoKSk7XHJcbiAgICAgICAgICAgICAgICBsaW5rZWRBY3Rpb25zVGFiLmFwcGVuZENoaWxkKGxpbmspO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNyZWF0ZUxpbmsgKHZhbHVlIDogQXJyYXk8YW55Pikge1xyXG4gICAgICAgIGxldCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XHJcbiAgICAgICAgbGluay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2YWx1ZVswXSkpO1xyXG4gICAgICAgIENvbnRyb2xzLkxpbmtzLm1ha2VMaW5rKGxpbmssIHZhbHVlWzFdKTtcclxuICAgICAgICByZXR1cm4gbGluaztcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlwZXJsaW5rQ29tbW9uQWN0aW9ucyAoKSB7XHJcbiAgICAgICAgcmVzZXRDb21tb25BY3Rpb25zKCk7XHJcblxyXG4gICAgICAgIGF3YWl0IENvbW1vbkFjdGlvbnNSdWxlYm9vay5leGVjdXRlKHt9KTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHZhbHVlID0gY29tbW9uQWN0aW9uc1tpXTsgdmFsdWUgIT0gdW5kZWZpbmVkOyB2YWx1ZSA9IGNvbW1vbkFjdGlvbnNbKytpXSkge1xyXG4gICAgICAgICAgICBsZXQgbGluayA9IGNyZWF0ZUxpbmsodmFsdWUpO1xyXG4gICAgICAgICAgICBsaW5rLmNsYXNzTGlzdC5hZGQoXCJsaW5lTGlua1wiKTtcclxuICAgICAgICAgICAgQ29udHJvbHMuS2V5SGFuZGxlci5hcHBseUNvZGUobGluaywgQ29udHJvbHMuS2V5SGFuZGxlci5nZXRUaGlyZEtleUNvZGUoKSk7XHJcbiAgICAgICAgICAgIGNvbW1vbkFjdGlvbnNUYWIuYXBwZW5kQ2hpbGQobGluayk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGh5cGVybGlua2luZyBydWxlYm9vayBpcyByYW4gb3ZlciB0aGUgbGFzdCB0aGluZyB0aGUgcGxheWVyIGludGVyYWN0ZWQgd2l0aC5cclxuICAgICAqICBJdCBwb3B1bGF0ZXMgdGhlIGh5cGVybGlua3MgdGFiIHdpdGggaW5mb3JtYXRpb24gb24gdGhlIHRoaW5nIHRoYXQgd2FzIGludGVyYWN0ZWQgd2l0aC5cclxuICAgICAqIEB0eXBlIHtSdWxlYm9va31cclxuICAgICAqL1xyXG4gICAgZXhwb3J0IHZhciBIeXBlcmxpbmtpbmdSdWxlYm9vayA9IG5ldyBSdWxlYm9vazxUaGluZz4oXCJIeXBlcmxpbmtpbmcgc29tZXRoaW5nXCIpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGNvbW1vbiBhY3Rpb25zIHJ1bGVib29rIHNlcnZlcyB0byBzZXQgdXAgYWxsIHRoZSBhdmFpbGFibGUgY29tbW9uIGFjdGlvbnMgZm9yIHRoZSBwbGF5ZXIuXHJcbiAgICAgKiAgSXQgc2hvdWxkIGNoZWNrIHRoZSBwbGF5ZXIncyBjdXJyZW50IHN0YXRlIHRvIHNlZSBpZiBhIGNvbW1hbmQgaXMgYXBwbGljYWJsZSBhbmRcclxuICAgICAqICAgIHRoZW4gQUREIHNhaWQgY29tbWFuZCB0byB0aGUgSHlwZXJsaW5rSGFuZGxlci5cclxuICAgICAqIEB0eXBlIHtSdWxlYm9va31cclxuICAgICAqL1xyXG4gICAgZXhwb3J0IHZhciBDb21tb25BY3Rpb25zUnVsZWJvb2sgPSBuZXcgUnVsZWJvb2s8dm9pZD4oXCJDb21tb24gQWN0aW9ucyBSdWxlYm9va1wiKTtcclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJSdWxlYm9vay50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJSdWxlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL0VsZW1lbnRzL0NsYXNzZXMvU2F5LnRzXCIgLz5cclxuY2xhc3MgQWN0aW9uIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2sgPSBuZXcgUnVsZWJvb2s8QWN0aW9uPihcIkNoZWNrIGFueSBBY3Rpb25cIik7XHJcbiAgICBwdWJsaWMgc3RhdGljIGNhcnJ5ID0gbmV3IFJ1bGVib29rPEFjdGlvbj4oXCJDYXJyeSBvdXQgYW55IEFjdGlvblwiKTtcclxuXHJcbiAgICBwdWJsaWMgZXh0cmFDaGVja3MgOiBBcnJheTxSdWxlYm9vazxBY3Rpb24+PiA9IFtdO1xyXG4gICAgcHVibGljIGV4dHJhQ2FycmllcyA6IEFycmF5PFJ1bGVib29rPEFjdGlvbj4+ID0gW107XHJcblxyXG4gICAgcHVibGljIF9hY3RvciA6IFRoaW5nO1xyXG4gICAgcHVibGljIG5vdW5zIDogQXJyYXk8VGhpbmc+ID0gW107XHJcbiAgICBwdWJsaWMgc2F5IDogU2F5ID0gbmV3IFNheSgpO1xyXG5cclxuICAgIHB1YmxpYyBhY3RpbmdBZ3Jlc3NpdmVseSA9IGZhbHNlO1xyXG4gICAgcHVibGljIGFjdGluZ1N1Ym1pc3NpdmVseSA9IGZhbHNlO1xyXG4gICAgcHVibGljIHJlcXVpcmVzVHVybiA9IHRydWU7XHJcbiAgICBwdWJsaWMgcmVxdWlyZXNOb3VuID0gdHJ1ZTtcclxuICAgIHB1YmxpYyByZXF1aXJlc1Zpc2liaWxpdHkgPSB0cnVlOyAvLyBGaXJzdCBub3VuIG11c3QgYmUgdmlzaWJsZSBhbmQgaW4gdGhlIHNhbWUgcm9vbVxyXG5cclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKGFjdG9yIDogVGhpbmcsIC4uLm5vdW5zIDogQXJyYXk8YW55Pikge1xyXG4gICAgICAgIHRoaXMuYWN0b3IgPSBhY3RvcjtcclxuICAgICAgICBub3Vucy5mb3JFYWNoKCh2YWx1ZSwgaW5kZXgsIGFycmF5KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0Tm91bihpbmRleCwgdmFsdWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZXhlY3V0ZSAoKSA6IFByb21pc2U8U2F5PiB7XHJcbiAgICAgICAgdGhpcy5zYXkgPSBuZXcgU2F5KCk7XHJcblxyXG4gICAgICAgIGxldCBjaGVja1J1bGVib29rcyA9IFtdO1xyXG4gICAgICAgIGxldCBjYXJyeVJ1bGVib29rcyA9IFtdO1xyXG4gICAgICAgIGxldCBjQ2xhc3MgPSB0aGlzLmNvbnN0cnVjdG9yO1xyXG4gICAgICAgIHdoaWxlIChjQ2xhc3MgIT0gQWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGlmICgoPHR5cGVvZiBBY3Rpb24+IGNDbGFzcykuY2hlY2sgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjaGVja1J1bGVib29rcy5wdXNoKCg8dHlwZW9mIEFjdGlvbj4gY0NsYXNzKS5jaGVjayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCg8dHlwZW9mIEFjdGlvbj4gY0NsYXNzKS5jYXJyeSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNhcnJ5UnVsZWJvb2tzLnB1c2goKDx0eXBlb2YgQWN0aW9uPiBjQ2xhc3MpLmNhcnJ5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjQ2xhc3MgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY0NsYXNzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIENoZWNrIGlmIGFjdGlvbiBnb2VzIHRocm91Z2hcclxuICAgICAgICAgKi9cclxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgQWN0aW9uLmNoZWNrLmV4ZWN1dGUoe1xyXG4gICAgICAgICAgICBub3VuIDogdGhpc1xyXG4gICAgICAgIH0sIC4uLmNoZWNrUnVsZWJvb2tzKTtcclxuXHJcbiAgICAgICAgLy8gVGhlcmUgYXJlIG5vdyBtdWx0aXBsZSByZXN1bHRzISBBIGZhbHNlIHJlc3VsdCBtZWFucyBhIGZhaWwgQ2hlY2shIEJ1dCBpdCBjYW4gYWxzbyByZXR1cm4gYSBuZXcgYWN0aW9uIVxyXG4gICAgICAgIGlmIChyZXN1bHQgPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSBpZihyZXN1bHQgaW5zdGFuY2VvZiBBY3Rpb24pIHtcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhSdWxlYm9vay5nZXRJbmRlbnRhdGlvbigpICsgXCJbQUNUSU9OXSBJbnN0ZWFkIG9mLi4uXCIpO1xyXG4gICAgICAgICAgICBhd2FpdCByZXN1bHQuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLnNheS5hZGQocmVzdWx0LnNheSk7XHJcbiAgICAgICAgICAgIHRoaXMubm91bnMgPSByZXN1bHQubm91bnM7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIENhcnJ5IE91dFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGF3YWl0IEFjdGlvbi5jYXJyeS5leGVjdXRlKHtcclxuICAgICAgICAgICAgbm91biA6IHRoaXNcclxuICAgICAgICB9LCAuLi5jYXJyeVJ1bGVib29rcyk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnNheTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgYWN0b3IoKTogVGhpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hY3RvcjtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgYWN0b3IodmFsdWU6IFRoaW5nKSB7XHJcbiAgICAgICAgdGhpcy5fYWN0b3IgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Tm91biAobiA6IG51bWJlcikgOiBhbnkge1xyXG4gICAgICAgIGlmICh0aGlzLm5vdW5zLmxlbmd0aCA+IG4pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubm91bnNbbl07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldE5vdW4gKG4gOiBudW1iZXIsIG5vdW4gOiBhbnkpIHtcclxuICAgICAgICB3aGlsZSAodGhpcy5ub3Vucy5sZW5ndGggPCBuKSB7XHJcbiAgICAgICAgICAgIHRoaXMubm91bnMucHVzaCh1bmRlZmluZWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm5vdW5zW25dID0gbm91bjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE5lZWRzIHRvIHJldHVybiBhIHN0cmluZyBleHBsYWluaW5nIHdoYXQgdGhlIHBsYXllciB3aWxsIGRvIGlmIGhlIGRvZXMgdGhpcyBhY3Rpb24uXHJcbiAgICAgKiBGb3IgaW5zdGFuY2UsIEFjdGlvblRha2luZyBzaG91bGQgcmV0dXJuIHNvbWV0aGluZyBsaWtlIHJldHVybiBcInRha2UgXCIgKyB0aGlzLm5vdW5zWzBdLmdldE5hbWUoKSxcclxuICAgICAqICAgd2hpY2ggd291bGQgcmVhZCBhcyBcInRha2UgdGhpbmdcIi5cclxuICAgICAqICAgcmVtZW1iZXIgdGhhdCB0aGluZ3MgaW1wbGVtZW50IFBSSU5UQUJMRSBpbnRlcmZhY2UsIHNvIHlvdSBjYW4gZ2V0IHRoZWlyIG5hbWVzLlxyXG4gICAgICogQHJldHVybnMge3N0cmluZ31cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENvbW1hbmRUZXh0ICgpIHtcclxuICAgICAgICByZXR1cm4gXCJkb1wiO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSWYgYW4gYWN0aW9uIGlzIHN0b3BwZWQsIGl0IG1lYW5zIGl0IGZhaWxlZCBzbyBzcGVjdGFjdWxhcmx5IHRoYXQgaXQgZGlkbid0IGV2ZW4gYmVnaW4uXHJcbiAgICAgKiBXaGljaCBtZWFucyBpZiB0aGUgcGxheWVyIGlzIGRvaW5nIGl0LCBpdCdsbCBub3QgdGFrZSBhIHR1cm4uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdG9wICgpIHtcclxuICAgICAgICB0aGlzLnJlcXVpcmVzVHVybiA9IGZhbHNlO1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyBBY3Rpb24uYWRkQ2FycnlSdWxlKG5ldyBSdWxlKHtcclxuLy8gICAgIG5hbWUgOiBcIlRlc3Rpbmcgc2F5IGluIGFjdGlvbnMgcnVsZVwiLFxyXG4vLyAgICAgcHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0xPV0VTVCxcclxuLy8gICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0xPV0VTVCxcclxuLy8gICAgIGNvZGUgOiAocnVsZSwgcnVsZWJvb2spID0+IHtcclxuLy8gICAgICAgICBsZXQgYWN0aW9uID0gPEFjdGlvbj4gcnVsZWJvb2subm91bjtcclxuLy8gICAgICAgICBhY3Rpb24uc2F5LmFkZChcIllvdSBkbyBub3RoaW5nIGFsbCB0dXJuLiBXaGF0IHdhcyB0aGUgcG9pbnQsIHJlYWxseT9cIik7XHJcbi8vICAgICB9XHJcbi8vIH0pKVxyXG5cclxuQWN0aW9uLmNoZWNrLmFkZFJ1bGUoXHJcbiAgICBuZXcgUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiQ2hlY2sgYW55IEFjdGlvbiAtIFJlcXVpcmVzIE5vdW5cIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9ISUdIRVNULFxyXG4gICAgICAgIGNvZGUgOiAocnVsZWJvb2sgOiBSdWxlYm9va1J1bm5lcjxBY3Rpb24+KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBhY3Rpb24gPSA8QWN0aW9uPiBydWxlYm9vay5ub3VuO1xyXG4gICAgICAgICAgICBpZiAoYWN0aW9uLmdldE5vdW4oMCkgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbmRpdGlvbnMgOiBydW5uZXIgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gcnVubmVyLm5vdW4ucmVxdWlyZXNOb3VuO1xyXG4gICAgICAgIH1cclxuICAgIH0pXHJcbik7XHJcblxyXG5BY3Rpb24uY2hlY2suYWRkUnVsZShcclxuICAgIG5ldyBSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJDaGVjayBhbnkgQWN0aW9uIC0gUmVxdWlyZXMgVmlzaWJpbGl0eVwiLFxyXG4gICAgICAgIGNvZGUgOiAocnVsZWJvb2sgOiBSdWxlYm9va1J1bm5lcjxBY3Rpb24+KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBhY3Rpb24gPSA8QWN0aW9uPiBydWxlYm9vay5ub3VuO1xyXG4gICAgICAgICAgICBsZXQgYWN0b3IgPSBhY3Rpb24uYWN0b3I7XHJcbiAgICAgICAgICAgIGlmICghYWN0aW9uLmdldE5vdW4oMCkuaXNWaXNpYmxlVG8oYWN0b3IpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbmRpdGlvbnMgOiBydW5uZXIgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gcnVubmVyLm5vdW4ucmVxdWlyZXNWaXNpYmlsaXR5O1xyXG4gICAgICAgIH1cclxuICAgIH0pXHJcbik7IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0FjdGlvbi50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9SdWxlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1J1bGVib29rLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL0VsZW1lbnRzL0NsYXNzZXMvU2F5L1NheUJvbGQudHNcIiAvPlxyXG5cclxuY2xhc3MgQWN0aW9uRXhhbWluZSBleHRlbmRzIEFjdGlvbiB7XHJcbiAgICBwdWJsaWMgcmVxdWlyZXNUdXJuID0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBjaGVjayA9IG5ldyBSdWxlYm9vazxBY3Rpb25FeGFtaW5lPihcIkNoZWNrIEV4YW1pbmluZ1wiKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgY2FycnkgPSBuZXcgUnVsZWJvb2s8QWN0aW9uRXhhbWluZT4oXCJDYXJyeSBvdXQgRXhhbWluaW5nXCIpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTmVlZHMgdG8gcmV0dXJuIGEgc3RyaW5nIGV4cGxhaW5pbmcgd2hhdCB0aGUgcGxheWVyIHdpbGwgZG8gaWYgaGUgZG9lcyB0aGlzIGFjdGlvbi5cclxuICAgICAqIEZvciBpbnN0YW5jZSwgQWN0aW9uVGFraW5nIHNob3VsZCByZXR1cm4gc29tZXRoaW5nIGxpa2UgcmV0dXJuIFwidGFrZSBcIiArIHRoaXMubm91bnNbMF0uZ2V0TmFtZSgpLFxyXG4gICAgICogICB3aGljaCB3b3VsZCByZWFkIGFzIFwidGFrZSB0aGluZ1wiLlxyXG4gICAgICogICByZW1lbWJlciB0aGF0IHRoaW5ncyBpbXBsZW1lbnQgUFJJTlRBQkxFIGludGVyZmFjZSwgc28geW91IGNhbiBnZXQgdGhlaXIgbmFtZXMuXHJcbiAgICAgKiBAcmV0dXJucyB7U2F5fVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q29tbWFuZFRleHQgKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmdldE5vdW4oMCkgPT0gV29ybGRTdGF0ZS5wbGF5ZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFwiZXhhbWluZSBteXNlbGZcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFwiZXhhbWluZSBcIiArICh0aGlzLmdldE5vdW4oMCkgIT0gdW5kZWZpbmVkID8gdGhpcy5nZXROb3VuKDApLmdldFByaW50ZWROYW1lKCkgOiBcIlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFByaW50RGVzY3JpcHRpb25PZkV4YW1pbmVkVGhpbmdSdWxlID0gQWN0aW9uRXhhbWluZS5jYXJyeS5jcmVhdGVBbmRBZGRSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJFeGFtaW5lIC0gUHJpbnQgRGVzY3JpcHRpb24gb2YgRXhhbWluZWQgVGhpbmdcIixcclxuICAgICAgICBjb2RlIDogKHJ1bGVib29rKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBhY3Rpb24gPSBydWxlYm9vay5ub3VuO1xyXG5cclxuICAgICAgICAgICAgbGV0IG5vdW4gPSBhY3Rpb24uZ2V0Tm91bigwKTtcclxuICAgICAgICAgICAgaWYgKG5vdW4gaW5zdGFuY2VvZiBUaGluZyAmJiAoPFRoaW5nPiBub3VuKS5pbWFnZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGFjdGlvbi5zYXkuYWRkKCg8VGhpbmc+IG5vdW4pLmltYWdlLCBTYXkuUEFSQUdSQVBIX0JSRUFLKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYWN0aW9uLnNheS5hZGQoKDxUaGluZz4gYWN0aW9uLmdldE5vdW4oMCkpLmdldFByaW50ZWREZXNjcmlwdGlvbigpKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufVxyXG5cclxuRWxlbWVudHMuSHlwZXJsaW5rSGFuZGxlci5Db21tb25BY3Rpb25zUnVsZWJvb2suYWRkUnVsZShuZXcgUnVsZSh7XHJcbiAgICBuYW1lIDogXCJMb29rIGF0IG1lIVwiLFxyXG4gICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfTE9XRVNULFxyXG4gICAgcHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0hJR0gsXHJcbiAgICBjb2RlIDogKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8dm9pZD4pID0+IHtcclxuICAgICAgICBFbGVtZW50cy5IeXBlcmxpbmtIYW5kbGVyLmFkZENvbW1vbkFjdGlvbihcIkluc3BlY3RcIiwgbmV3IEFjdGlvbkV4YW1pbmUoV29ybGRTdGF0ZS5wbGF5ZXIsIFdvcmxkU3RhdGUucGxheWVyKSk7XHJcbiAgICB9XHJcbn0pKTsiLCJhYnN0cmFjdCBjbGFzcyBSZWxhdGlvbkhhbmRsZXIge1xyXG4gICAgcHJvdGVjdGVkIHJlbGF0aW9ucyA6IEFycmF5PFJlbGF0aW9uPjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKC4uLnJlbGF0aW9ucyA6IEFycmF5IDxSZWxhdGlvbj4pIHtcclxuICAgICAgICByZWxhdGlvbnMuZm9yRWFjaChyZWxhdGlvbiA9PiB7XHJcbiAgICAgICAgICAgIHJlbGF0aW9uLnNldEhhbmRsZXIodGhpcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5yZWxhdGlvbnMgPSByZWxhdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZFJlbGF0aW9uIChyZWxhdGlvbiA6IFJlbGF0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5yZWxhdGlvbnMucHVzaChyZWxhdGlvbik7XHJcbiAgICAgICAgcmVsYXRpb24uc2V0SGFuZGxlcih0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWJzdHJhY3Qgc2V0UmVsYXRpb24gKHJlbGF0aW9uIDogUmVsYXRpb24sIGxlZnQgOiBhbnksIHJpZ2h0IDogYW55LCB2YWx1ZT8gOiBhbnkpIDogYm9vbGVhbjtcclxufVxyXG5cclxuYWJzdHJhY3QgY2xhc3MgUmVsYXRpb24ge1xyXG4gICAgcHVibGljIGhhbmRsZXIgOiBSZWxhdGlvbkhhbmRsZXI7XHJcblxyXG4gICAgcHVibGljIHNldEhhbmRsZXIgKGhhbmRsZXIgOiBSZWxhdGlvbkhhbmRsZXIpIHtcclxuICAgICAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYXNIYW5kbGVyICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVyICE9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWJzdHJhY3Qgc2V0UmVsYXRpb24gKGxlZnQgOiBhbnksIHJpZ2h0IDogYW55LCB2YWx1ZT8gOiBhbnkpIDogdm9pZDtcclxuICAgIHB1YmxpYyBhYnN0cmFjdCB1bnNldFJpZ2h0IChyaWdodCA6IGFueSkgOiB2b2lkO1xyXG4gICAgcHVibGljIGFic3RyYWN0IHVuc2V0TGVmdCAobGVmdCA6IGFueSkgOiB2b2lkO1xyXG4gICAgcHVibGljIGFic3RyYWN0IGdldExlZnQgKHJpZ2h0IDogYW55KSA6IGFueTtcclxuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXRSaWdodCAobGVmdCA6IGFueSkgOiBhbnk7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVTdHJpbmcgKG9iajEgOiBhbnksIG9iajIgOiBhbnkpIDogc3RyaW5nIHtcclxuICAgICAgICBpZiAob2JqMSBpbnN0YW5jZW9mIE9iamVjdCAmJiBvYmoyIGluc3RhbmNlb2YgT2JqZWN0KSB7XHJcbiAgICAgICAgICAgIGxldCBpZDEgPSBSZWxhdGlvbi5nZXRJZChvYmoxKTtcclxuICAgICAgICAgICAgbGV0IGlkMiA9IFJlbGF0aW9uLmdldElkKG9iajIpO1xyXG4gICAgICAgICAgICByZXR1cm4gaWQxIDwgaWQyID9cclxuICAgICAgICAgICAgICAgIChpZDEgKyBcIjtcIiArIGlkMikgOlxyXG4gICAgICAgICAgICAgICAgKGlkMiArIFwiO1wiICsgaWQxKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0Q291bnQgPSAwO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0SWRGaWVsZCA9IFwiX1JFTEFUSU9OSU5URVJOQUxJRFwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogaWYgZ2V0SWQgPj0gMCwgdGhlbiBvYmogaXMgTk9UIGFuIE9iamVjdFxyXG4gICAgICogaWYgZ2V0SWQgIDwgMCwgdGhlbiBvYmogaXMgYW4gT2JqZWN0XHJcbiAgICAgKiBAcGFyYW0gb2JqXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldElkIChvYmogOiBPYmplY3QpIDogbnVtYmVyIHtcclxuICAgICAgICBpZiAob2JqW1JlbGF0aW9uLm9iamVjdElkRmllbGRdID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBvYmpbUmVsYXRpb24ub2JqZWN0SWRGaWVsZF0gPSBSZWxhdGlvbi5vYmplY3RDb3VudCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2JqW1JlbGF0aW9uLm9iamVjdElkRmllbGRdO1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1JlbGF0aW9uLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL0Z1bmN0aW9ucy50c1wiIC8+XHJcbmNsYXNzIFJlbGF0aW9uSGFuZGxlclN0cmljdE9uZVRvTWFueSBleHRlbmRzIFJlbGF0aW9uSGFuZGxlciB7XHJcblxyXG4gICAgcHVibGljIHNldFJlbGF0aW9uIChyZWxhdGlvbiA6IFJlbGF0aW9uLCBsZWZ0IDogYW55LCByaWdodCA6IGFueSwgdmFsdWU/IDogYW55KSA6IGJvb2xlYW4ge1xyXG4gICAgICAgIC8vIGEgTEVGVCBtdXN0IG5vdCBjaXJjbGUgaW4gb24gaXRzZWxmXHJcbiAgICAgICAgLy8gSXMgcmlnaHQgYW55IG9mIHRoZSBsZWZ0J3MgcGFyZW50cz9cclxuICAgICAgICBsZXQgcGFyZW50cyA9IHRoaXMuZ2V0QWxsTGVmdChsZWZ0KTtcclxuICAgICAgICBpZiAocGFyZW50cy5pbmRleE9mKHJpZ2h0KSAhPSAtMSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJbUmVsYXRpb25dIEF0dGVtcHQgdG8gY3JlYXRlIGEgY2lyY3VsYXIgcmVsYXRpb246XCIsIHRoaXMsIGxlZnQsIHJpZ2h0KTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBBbGxvd2luZyB0aGlzIHdvdWxkIGNyZWF0ZSBhIGNpcmN1bGFyIHJlbGF0aW9uXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBmcm9tIHRoaXMgcG9pbnQgb24gd2UnbGwgZ3VhcmFudGVlIHRoYXQgdGhlIG5ldyByZWxhdGlvbiBjYW4gYmUgbWFkZS5cclxuICAgICAgICAvLyBDaGFuZ2VzIHdpbGwgb2NjdXIsIHNvIFwicmV0dXJuIGZhbHNlXCIgaXMgbm8gbG9uZ2VyIGFjY2VwdGFibGUuXHJcbiAgICAgICAgLy8gYSBSSUdIVCBjYW4gb25seSBwb2ludCB0byBhIHNpbmdsZSBMRUZUXHJcbiAgICAgICAgdGhpcy51bnNldFJpZ2h0KHJpZ2h0KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVuc2V0ICh0aGluZyA6IGFueSkge1xyXG4gICAgICAgIHRoaXMudW5zZXRMZWZ0KHRoaW5nKTtcclxuICAgICAgICB0aGlzLnVuc2V0UmlnaHQodGhpbmcpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1bnNldExlZnQgKGxlZnQ6IGFueSkge1xyXG4gICAgICAgIHRoaXMucmVsYXRpb25zLmZvckVhY2gocmVsYXRpb24gPT4ge1xyXG4gICAgICAgICAgICByZWxhdGlvbi51bnNldExlZnQobGVmdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVuc2V0UmlnaHQgKHJpZ2h0IDogYW55KSB7XHJcbiAgICAgICAgdGhpcy5yZWxhdGlvbnMuZm9yRWFjaChyZWxhdGlvbiA9PiB7XHJcbiAgICAgICAgICAgIHJlbGF0aW9uLnVuc2V0UmlnaHQocmlnaHQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEEgbWFueSBjYW4gb25seSBoYXZlIG9uZSBvbmVcclxuICAgIHB1YmxpYyBnZXRMZWZ0IChyaWdodCA6IGFueSkge1xyXG4gICAgICAgIGxldCByZXN1bHQ7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJlbGF0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLnJlbGF0aW9uc1tpXS5nZXRMZWZ0KHJpZ2h0KTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIHJldHVybnMgYWxsIG9uZXMgdGhhdCBhcmUgcmVsZXZhbnQuXHJcbiAgICAgKiBTbyBpbiBhIHJlbGF0aW9uc2hpcCBsaWtlIEEgLT4gQiAtPiBDIGFuZCBhc2tpbmcgZm9yIEMsIHRoaXMgd2lsbCByZXR1cm5cclxuICAgICAqIEIgYmVjYXVzZSBpdCdzIHJlbGF0ZWQgdG8gQyBhbmQgdGhlbiBBIGJlY2F1c2UgdGhhdCdzIHJlbGF0ZWQgdG8gQi5cclxuICAgICAqIEBwYXJhbSByaWdodFxyXG4gICAgICogQHJldHVybnMge0FycmF5fVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0QWxsTGVmdCAocmlnaHQgOiBhbnkpIHtcclxuICAgICAgICBsZXQgbmV3UGFyZW50ID0gdGhpcy5nZXRMZWZ0KHJpZ2h0KTtcclxuICAgICAgICBsZXQgcGFyZW50cyA9IFtdO1xyXG4gICAgICAgIHdoaWxlIChuZXdQYXJlbnQgIT0gdW5kZWZpbmVkICkge1xyXG4gICAgICAgICAgICBwYXJlbnRzLnB1c2gobmV3UGFyZW50KTtcclxuICAgICAgICAgICAgbmV3UGFyZW50ID0gdGhpcy5nZXRMZWZ0KG5ld1BhcmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwYXJlbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBbGxMZWZ0VHlwZSAocmlnaHQgOiBhbnksIHR5cGUgOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRBbGxMZWZ0KHJpZ2h0KS5maWx0ZXIobGVmdCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBsZWZ0IGluc3RhbmNlb2YgdHlwZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGhpZ2hlc3QgT25lIHRoYXQgY2FuIGJlIGZvdW5kLlxyXG4gICAgICogZm9yIEEgLT4gQiAtPiBDIGFuZCBhc2tpbmcgZm9yIEMsIHRoaXMgd291bGQgcmV0dXJuIEFcclxuICAgICAqIGFzIHRoYXQncyB0aGUgb25lIFwib3JpZ2luYXRpbmdcIiB0aGUgb3RoZXIgcmVsYXRpb25zLlxyXG4gICAgICogQHBhcmFtIHJpZ2h0XHJcbiAgICAgKiBAcmV0dXJucyB7YW55fVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TGFzdExlZnQgKHJpZ2h0IDogYW55KSB7XHJcbiAgICAgICAgbGV0IHBhcmVudCA9IHRoaXMuZ2V0TGVmdChyaWdodCk7XHJcbiAgICAgICAgbGV0IG5ld1BhcmVudCA9IHRoaXMuZ2V0TGVmdChwYXJlbnQpO1xyXG4gICAgICAgIHdoaWxlIChuZXdQYXJlbnQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHBhcmVudCA9IG5ld1BhcmVudDtcclxuICAgICAgICAgICAgbmV3UGFyZW50ID0gdGhpcy5nZXRMZWZ0KHBhcmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwYXJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEFsbFJpZ2h0IChsZWZ0IDogYW55KSB7XHJcbiAgICAgICAgbGV0IHJpZ2h0cyA9IFtdO1xyXG4gICAgICAgIHRoaXMucmVsYXRpb25zLmZvckVhY2gocmVsYXRpb24gPT4ge1xyXG4gICAgICAgICAgICByaWdodHMucHVzaCguLi5yZWxhdGlvbi5nZXRSaWdodChsZWZ0KSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYXJyYXlVbmlxdWUocmlnaHRzKTtcclxuICAgICAgICByZXR1cm4gcmlnaHRzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBbGxSaWdodFR5cGVzIChsZWZ0IDogYW55LCByaWdodFR5cGUgOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRBbGxSaWdodChsZWZ0KS5maWx0ZXIocmlnaHQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gcmlnaHQgaW5zdGFuY2VvZiByaWdodFR5cGU7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIFJlbGF0aW9uT25lVG9NYW55IGV4dGVuZHMgUmVsYXRpb24ge1xyXG4gICAgcHJpdmF0ZSB2YWx1ZXNIYXNoIDoge1tpZGlkIDogc3RyaW5nXSA6IGFueX0gPSB7fTtcclxuICAgIHByaXZhdGUgb25lTWFwID0gbmV3IE1hcDxhbnksIEFycmF5PGFueT4+KCk7XHJcbiAgICBwcml2YXRlIG1hbnlNYXAgPSBuZXcgTWFwPGFueSwgYW55PigpO1xyXG5cclxuICAgIHB1YmxpYyBnZXRWYWx1ZSAobGVmdCA6IGFueSwgcmlnaHQgOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZXNIYXNoW1JlbGF0aW9uLmNyZWF0ZVN0cmluZyhsZWZ0LCByaWdodCldO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT25seSByZWxhdGlvbnNoaXBzIGJldHdlZW4gT2JqZXRzIGNhbiBoYXZlIHZhbHVlc1xyXG4gICAgICogQHBhcmFtIGxlZnRcclxuICAgICAqIEBwYXJhbSByaWdodFxyXG4gICAgICogQHBhcmFtIHZhbHVlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRWYWx1ZSAobGVmdCA6IGFueSwgcmlnaHQgOiBhbnksIHZhbHVlIDogYW55KSB7XHJcbiAgICAgICAgaWYgKHRoaXMubWFueU1hcC5nZXQocmlnaHQpID09IGxlZnQpIHtcclxuICAgICAgICAgICAgbGV0IHN0cmluZyA9IFJlbGF0aW9uLmNyZWF0ZVN0cmluZyhsZWZ0LCByaWdodCk7XHJcbiAgICAgICAgICAgIGlmIChzdHJpbmcgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlc0hhc2hbc3RyaW5nXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRSZWxhdGlvbiAobGVmdCA6IGFueSwgcmlnaHQgOiBhbnksIHZhbHVlPyA6IGFueSkge1xyXG4gICAgICAgIGxldCBwcm9jZWVkO1xyXG4gICAgICAgIGlmICh0aGlzLmhhbmRsZXIgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHByb2NlZWQgPSB0aGlzLmhhbmRsZXIuc2V0UmVsYXRpb24odGhpcywgbGVmdCwgcmlnaHQsIHZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwcm9jZWVkKSB7XHJcbiAgICAgICAgICAgIC8vIHNvbWV0aGluZyBvbiB0aGUgbGVmdCBjYW4ndCBiZSBvbiB0aGUgcmlnaHRcclxuICAgICAgICAgICAgdGhpcy51bnNldFJpZ2h0KGxlZnQpO1xyXG5cclxuICAgICAgICAgICAgLy8gc29tZXRoaW5nIG9uIHRoZSByaWdodCBjYW4ndCBiZSBvbiB0aGUgbGVmdFxyXG4gICAgICAgICAgICB0aGlzLnVuc2V0TGVmdChyaWdodCk7XHJcblxyXG4gICAgICAgICAgICAvLyBzb21ldGhpbmcgb24gdGhlIHJpZ2h0IGNhbiBvbmx5IGhhdmUgb25lIGxlZnRcclxuICAgICAgICAgICAgdGhpcy51bnNldFJpZ2h0KHJpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIGxldCBzdHJpbmcgPSBSZWxhdGlvbi5jcmVhdGVTdHJpbmcobGVmdCwgcmlnaHQpO1xyXG4gICAgICAgICAgICBpZiAoc3RyaW5nICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXNIYXNoW3N0cmluZ10gPSB2YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLm1hbnlNYXAuc2V0KHJpZ2h0LCBsZWZ0KTtcclxuICAgICAgICAgICAgaWYgKHRoaXMub25lTWFwLmdldChsZWZ0KSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25lTWFwLnNldChsZWZ0LCBbcmlnaHRdKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25lTWFwLmdldChsZWZ0KS5wdXNoKHJpZ2h0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TGVmdCAocmlnaHQgOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tYW55TWFwLmdldChyaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEFueUxlZnQgKCkge1xyXG4gICAgICAgIGxldCBsZWZ0ID0gW107XHJcbiAgICAgICAgdGhpcy5vbmVNYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICBsZWZ0LnB1c2goa2V5KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBhcnJheVVuaXF1ZShsZWZ0KTtcclxuICAgICAgICByZXR1cm4gbGVmdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QW55UmlnaHQgKCkge1xyXG4gICAgICAgIGxldCByaWdodHMgPSBbXTtcclxuICAgICAgICB0aGlzLm9uZU1hcC5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICByaWdodHMucHVzaCguLi52YWx1ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYXJyYXlVbmlxdWUocmlnaHRzKTtcclxuICAgICAgICByZXR1cm4gcmlnaHRzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBbnlSaWdodFR5cGUgKHR5cGUgOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRBbnlSaWdodCgpLmZpbHRlcih2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzUmlnaHQgKGxlZnQgOiBhbnksIG5lZWRsZSA6IGFueSkge1xyXG4gICAgICAgIGxldCByaWdodCA9IHRoaXMub25lTWFwLmdldChsZWZ0KTtcclxuICAgICAgICBpZiAocmlnaHQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByaWdodC5pbmRleE9mKG5lZWRsZSkgIT0gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UmlnaHQgKGxlZnQgOiBhbnkpIHtcclxuICAgICAgICBsZXQgcmlnaHQgPSB0aGlzLm9uZU1hcC5nZXQobGVmdCk7XHJcbiAgICAgICAgaWYgKHJpZ2h0ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gW10uY29uY2F0KC4uLnJpZ2h0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRSaWdodFR5cGUgKGxlZnQgOiBhbnksIHR5cGUgOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRSaWdodChsZWZ0KS5maWx0ZXIocmlnaHQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gcmlnaHQgaW5zdGFuY2VvZiB0eXBlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRSaWdodFR5cGVPbmUgKGxlZnQgOiBhbnksIHR5cGUgOiBhbnkpIHtcclxuICAgICAgICBsZXQgcmlnaHRzID0gdGhpcy5nZXRSaWdodFR5cGUobGVmdCwgdHlwZSk7XHJcbiAgICAgICAgaWYgKHJpZ2h0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByaWdodHNbMF07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRSZWxhdGlvblZhbHVlIChsZWZ0IDogYW55LCByaWdodCA6IGFueSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlc0hhc2hbUmVsYXRpb24uY3JlYXRlU3RyaW5nKGxlZnQsIHJpZ2h0KV07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVuc2V0UmlnaHQgKHJpZ2h0IDogYW55KSB7XHJcbiAgICAgICAgbGV0IGxlZnQgPSB0aGlzLm1hbnlNYXAuZ2V0KHJpZ2h0KTtcclxuICAgICAgICBpZiAobGVmdCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgbGV0IGFsbFJpZ2h0ID0gdGhpcy5vbmVNYXAuZ2V0KGxlZnQpO1xyXG4gICAgICAgICAgICBhbGxSaWdodC5zcGxpY2UoYWxsUmlnaHQuaW5kZXhPZihyaWdodCksIDEpO1xyXG4gICAgICAgICAgICB0aGlzLm1hbnlNYXAuZGVsZXRlKHJpZ2h0KTtcclxuICAgICAgICAgICAgaWYgKGFsbFJpZ2h0Lmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uZU1hcC5kZWxldGUobGVmdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHN0cmluZyA9IFJlbGF0aW9uLmNyZWF0ZVN0cmluZyhsZWZ0LCByaWdodCk7XHJcbiAgICAgICAgICAgIGlmIChzdHJpbmcgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUodGhpcy52YWx1ZXNIYXNoW3N0cmluZ10pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1bnNldExlZnQgKGxlZnQgOiBhbnkpIHtcclxuICAgICAgICBsZXQgYWxsUmlnaHQgPSB0aGlzLm9uZU1hcC5nZXQobGVmdCk7XHJcbiAgICAgICAgaWYgKGFsbFJpZ2h0ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBhbGxSaWdodC5mb3JFYWNoKChyaWdodCA6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tYW55TWFwLmRlbGV0ZShyaWdodCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgc3RyaW5nID0gUmVsYXRpb24uY3JlYXRlU3RyaW5nKGxlZnQsIHJpZ2h0KTtcclxuICAgICAgICAgICAgICAgIGlmIChzdHJpbmcgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlKHRoaXMudmFsdWVzSGFzaFtzdHJpbmddKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMub25lTWFwLmRlbGV0ZShsZWZ0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vRWxlbWVudHMvQ2xhc3Nlcy9TYXkudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiUmVsYXRpb25zL1JlbGF0aW9uT25lVG9NYW55LnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL0VsZW1lbnRzL0NsYXNzZXMvU2F5L1NheUltYWdlLnRzXCIgLz5cclxuXHJcbmludGVyZmFjZSBUaGluZ09wdGlvbnMge1xyXG4gICAgbmFtZT8gOiBzdHJpbmc7XHJcbiAgICBwcm9wZXJOYW1lPyA6IHN0cmluZztcclxuICAgIGRlc2NyaXB0aW9uPyA6IFNheSB8IGFueTtcclxuICAgIHVuaXF1ZT8gOiBib29sZWFuO1xyXG4gICAgaW1hZ2U/IDogU2F5SW1hZ2UgfCBzdHJpbmc7XHJcbiAgICBzaGlueT8gOiBib29sZWFuO1xyXG59XHJcblxyXG4vLyBBIHRoaW5nIGlzIHNvbWV0aGluZyB0aGF0IGV4aXN0cyBpbiB0aGUgV29ybGRcclxuY2xhc3MgVGhpbmcgaW1wbGVtZW50cyBQcmludGFibGUge1xyXG4gICAgcHJvdGVjdGVkIG5hbWUgOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgcHJvcGVybHlOYW1lZCA6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgc2NlbmVyeSA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBmaXhlZEluUGxhY2UgOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgYW5pbWF0ZWQgOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgdmlzaWJsZSA6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHVibGljIHVuaXF1ZSA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBpbWFnZSA6IFNheUltYWdlO1xyXG4gICAgcHJvdGVjdGVkIHNoaW55IDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHByb3RlY3RlZCBzZXRBbHRlcmF0aW9ucyA6IEFycmF5PCh0aGlzT2JqZWN0IDogVGhpbmcsIHNpbXBsZUFsdGVyYXRpb25PYmplY3QgOiB7W2lkIDogc3RyaW5nXSA6IGFueX0pID0+IHZvaWQ+ID0gW107XHJcbiAgICBwcm90ZWN0ZWQgZ2V0QWx0ZXJhdGlvbnMgOiBBcnJheTwodGhpc09iamVjdCA6IFRoaW5nKSA9PiB7W2lkIDogc3RyaW5nXSA6IGFueX0+ID0gW107XHJcbiAgICBwdWJsaWMgY2xvbmUgOiAoaW5jbHVkZUNoYW5nZXM/IDogYm9vbGVhbikgPT4gVGhpbmcgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9uLXVuaXF1ZSBPYmplY3RzIGNhbid0IGJlIGNsb25lZC5cIik7XHJcbiAgICB9O1xyXG4gICAgcHVibGljIGNsb25lT3B0aW9ucyA6IFRoaW5nT3B0aW9ucztcclxuXHJcbiAgICBwdWJsaWMgZGVzY3JpcHRpb24gOiBTYXkgfCBzdHJpbmcgfCAoKCkgPT4gU2F5IHwgc3RyaW5nKTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHVuaXF1ZVRoaW5ncyA6IHtbaWQgOiBzdHJpbmddIDogVGhpbmd9ID0ge307XHJcbiAgICBwdWJsaWMgc3RhdGljIHRoaW5ncyA6IHtbaWQgOiBzdHJpbmddIDogQXJyYXk8VGhpbmc+fSA9IHt9O1xyXG5cclxuICAgIC8vIFRoaXMgaXMgbm90IHNhZmUuXHJcbiAgICAvLyBwdWJsaWMgZHVwbGljYXRlICgpIHtcclxuICAgIC8vICAgICByZXR1cm4gbmV3ICg8YW55PiB0aGlzLmNvbnN0cnVjdG9yKSg8VGhpbmdPcHRpb25zPiB7XHJcbiAgICAvLyAgICAgICAgIG5hbWUgOiB0aGlzLm5hbWUsXHJcbiAgICAvLyAgICAgICAgIHByb3Blck5hbWUgOiB0aGlzLnByb3Blcmx5TmFtZWQgPyB0aGlzLm5hbWUgOiB1bmRlZmluZWQsXHJcbiAgICAvLyAgICAgICAgIGRlc2NyaXB0aW9uIDogdGhpcy5kZXNjcmlwdGlvbixcclxuICAgIC8vICAgICAgICAgdW5pcXVlIDogdGhpcy51bmlxdWUsXHJcbiAgICAvLyAgICAgICAgIGltYWdlIDogdGhpcy5pbWFnZVxyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAob3B0aW9ucz8gOiBUaGluZ09wdGlvbnMpIHtcclxuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyA9PSB1bmRlZmluZWQgPyB7fSA6IG9wdGlvbnM7XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zLnByb3Blck5hbWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IG9wdGlvbnMucHJvcGVyTmFtZTtcclxuICAgICAgICAgICAgdGhpcy5wcm9wZXJseU5hbWVkID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMubmFtZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5uYW1lID0gb3B0aW9ucy5uYW1lO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubmFtZSA9ICg8YW55PiB0aGlzLmNvbnN0cnVjdG9yKS5uYW1lOyAvLyBJZiB0aGVyZSBpcyBubyBuYW1lLCB1c2UgQ2xhc3MgYXMgbmFtZVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG9wdGlvbnMuZGVzY3JpcHRpb24gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmRlc2NyaXB0aW9uIGluc3RhbmNlb2YgU2F5KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gb3B0aW9ucy5kZXNjcmlwdGlvbjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBuZXcgU2F5KG9wdGlvbnMuZGVzY3JpcHRpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAob3B0aW9ucy51bmlxdWUpIHtcclxuICAgICAgICAgICAgVGhpbmcuc3RvcmVVbmlxdWUodGhpcyk7XHJcbiAgICAgICAgICAgIHRoaXMudW5pcXVlID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBUaGluZy5zdG9yZU5vblVuaXF1ZSh0aGlzKTtcclxuICAgICAgICAgICAgdGhpcy5jbG9uZU9wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgICAgICAgICB0aGlzLmNsb25lID0gKGluY2x1ZGVDaGFuZ2VzPyA6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBjb25zID0gPGFueT4gZXZhbCgoPGFueT4gdGhpcy5jb25zdHJ1Y3RvcikubmFtZSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgbmV3VGhpbmcgPSA8VGhpbmc+IG5ldyBjb25zKHRoaXMuY2xvbmVPcHRpb25zKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZUNoYW5nZXMgPT0gdW5kZWZpbmVkIHx8IGluY2x1ZGVDaGFuZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3VGhpbmcuc2V0Q2hhbmdlcyh0aGlzLmdldENoYW5nZXMoKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ld1RoaW5nO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG9wdGlvbnMuaW1hZ2UgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmltYWdlIGluc3RhbmNlb2YgU2F5SW1hZ2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW1hZ2UgPSBvcHRpb25zLmltYWdlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbWFnZSA9IG5ldyBTYXlJbWFnZShvcHRpb25zLmltYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zaGlueSA9IG9wdGlvbnMuc2hpbnkgPT0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5hZGRHZXRBbHRlcmF0aW9ucygodGhpbmcgOiBUaGluZykgPT4ge1xyXG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRDbG9zZXN0Um9vbSAoY3VycmVudFJvb20gOiBSb29tUmFuZG9tLCByb29tcyA6IEFycmF5PFJvb21SYW5kb20+KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFJvb20gaW5zdGFuY2VvZiBSb29tUmFuZG9tICYmIHJvb21zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICByb29tcy5zb3J0KChhIDogUm9vbVJhbmRvbSwgYiA6IFJvb21SYW5kb20pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoYSBpbnN0YW5jZW9mIFJvb21SYW5kb20pKSByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGIgaW5zdGFuY2VvZiBSb29tUmFuZG9tKSkgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYSA9IGEuZ2V0RGlzdGFuY2VUbyg8Um9vbVJhbmRvbT4gY3VycmVudFJvb20pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGIgPSBiLmdldERpc3RhbmNlVG8oPFJvb21SYW5kb20+IGN1cnJlbnRSb29tKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhIC0gZGI7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9jYXRpb24gOiByb29tc1swXS5nZXROYW1lKClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChUaGluZy5FbmNsb3NlZFJlbGF0aW9uLmdldExlZnQodGhpbmcpID09IHRoaW5nLmdldFJvb20oKSAmJiB0aGluZy5nZXRSb29tKCkgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpbmcuZ2V0Um9vbSgpLmZvZGRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGluZy5pc1BsYXllcigpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB1dCBhdCBjbG9zZXN0IHJlbWVtYmVyZWQgcm9vbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm9vbXMgPSBXb3JsZFN0YXRlLmdldFJlbWVtYmVyZWRSb29tc0FzUm9vbXMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRSb29tID0gdGhpbmcuZ2V0Um9vbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2xvc2VzdFJvb20oPFJvb21SYW5kb20+IGN1cnJlbnRSb29tLCA8QXJyYXk8Um9vbVJhbmRvbT4+IHJvb21zKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwdXQgYXQgY2xvc2VzdCByb29tXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb29tcyA9IHRoaW5nLmdldFJvb20oKS5nZXRDb25uZWN0ZWRSb29tcygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY3VycmVudFJvb20gPSB0aGluZy5nZXRSb29tKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZFJvb20gPSBnZXRDbG9zZXN0Um9vbSg8Um9vbVJhbmRvbT4gY3VycmVudFJvb20sIDxBcnJheTxSb29tUmFuZG9tPj4gcm9vbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRSb29tICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kUm9vbTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb21zID0gKDxSZWdpb24+IFJlZ2lvbi5JblJlbGF0aW9uLmdldExlZnQodGhpbmcuZ2V0Um9vbSgpKSkuZ2V0Um9vbXMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRDbG9zZXN0Um9vbSg8Um9vbVJhbmRvbT4gY3VycmVudFJvb20sIDxBcnJheTxSb29tUmFuZG9tPj4gcm9vbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBMb2NhdGlvbjogdGhpbmcuZ2V0Um9vbSgpLmdldE5hbWUoKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmFkZFNldEFsdGVyYXRpb25zKCh0aGluZyA6IFRoaW5nLCBjaGFuZ2VzKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzLkxvY2F0aW9uICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHJvb20gPSBSb29tLmdldFJvb20oY2hhbmdlcy5Mb2NhdGlvbik7XHJcbiAgICAgICAgICAgICAgICBpZiAocm9vbSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByb29tLnBsYWNlKHRoaW5nKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlVuYWJsZSB0byBwbGFjZSBcIiwgdGhpbmcsIFwiIGF0IHJvb20gXCIsIGNoYW5nZXMuTG9jYXRpb24pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZEdldEFsdGVyYXRpb25zIChuZXdHZXQpIHtcclxuICAgICAgICB0aGlzLmdldEFsdGVyYXRpb25zLnB1c2gobmV3R2V0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgYWRkcyBhIGZ1bmN0aW9uIHRvIHJ1biBvdmVyIHdoZW4gbG9hZGluZyBmcm9tIGEgc2F2ZSBmaWxlLlxyXG4gICAgICogQWx3YXlzIHJlbWVtYmVyIHRoYXQgc2F2ZSBmaWxlcyBhcmUgTk9UIFNBRkUuIElkZWFsbHkgd2Ugc2hvdWxkIGNoZWNrIGZvciBpbnZhbGlkIGluZm9ybWF0aW9uLFxyXG4gICAgICogYnV0IGF0IGxlYXN0IGNoZWNrIGlmIHRoZXkgZXhpc3QsIGJlY2F1c2UgaWYgeW91IGFkZGVkIHNvbWV0aGluZyBuZXcsIG9sZCBzYXZlcyB3aWxsIG5vdCBoYXZlIHRoZW0uXHJcbiAgICAgKiBJdCdzIG9rYXkgdG8gYnJlYWsgb24gYmFkIGluZm9ybWF0aW9uIGJlY2F1c2UgaWYgc29tZW9uZSBkZWNpZGVkIHRvIGhhY2sgdGhlaXIgc2F2ZSwgdGhlbSB0aGV5IHNob3VsZFxyXG4gICAgICogZGVhbCB3aXRoIHRoZSBpc3N1ZXMuXHJcbiAgICAgKiBAcGFyYW0gbmV3U2V0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRTZXRBbHRlcmF0aW9ucyAobmV3U2V0KSB7XHJcbiAgICAgICAgdGhpcy5zZXRBbHRlcmF0aW9ucy5wdXNoKG5ld1NldCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENoYW5nZXMgKCkgOiB7W2lkIDogc3RyaW5nXSA6IGFueX17XHJcbiAgICAgICAgbGV0IGNoYW5nZXMgPSB7fTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZ2V0QWx0ZXJhdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGNoYW5nZSA9IHRoaXMuZ2V0QWx0ZXJhdGlvbnNbaV0odGhpcyk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBjaGFuZ2UpIHtcclxuICAgICAgICAgICAgICAgIGNoYW5nZXNba2V5XSA9IGNoYW5nZVtrZXldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjaGFuZ2VzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRDaGFuZ2VzIChzaW1wbGVBbHRlcmF0aW9uT2JqZWN0IDoge1tpZCA6IHN0cmluZ10gOiBhbnl9KSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNldEFsdGVyYXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0QWx0ZXJhdGlvbnNbaV0odGhpcywgc2ltcGxlQWx0ZXJhdGlvbk9iamVjdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTaGlueSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hpbnk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldE5hbWUgKG5hbWUgOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOyAvLyBEb24ndCByZXN0b3JlLiBUaGUgb25seSB0aGluZyB0aGF0IGNoYW5nZXMgbmFtZXMgaXMgcGxheWVyLlxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXROYW1lICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgc3RvcmVOb25VbmlxdWUgKHRoaW5nIDogVGhpbmcpIHtcclxuICAgICAgICBpZiAoVGhpbmcudGhpbmdzW3RoaW5nLm5hbWVdID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBUaGluZy50aGluZ3NbdGhpbmcubmFtZV0gPSBbdGhpbmddO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIFRoaW5nLnRoaW5nc1t0aGluZy5uYW1lXS5wdXNoKHRoaW5nKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXROb25VbmlxdWUgKG5hbWUgOiBzdHJpbmcpIDogQXJyYXk8VGhpbmc+IHtcclxuICAgICAgICByZXR1cm4gVGhpbmcudGhpbmdzW25hbWVdID09IHVuZGVmaW5lZCA/IFtdIDogVGhpbmcudGhpbmdzW25hbWVdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0T25lVGhpbmcgKG5hbWUgOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgdGhpbmcgOiBUaGluZyA9IFRoaW5nLmdldFVuaXF1ZShuYW1lKTtcclxuICAgICAgICBpZiAodGhpbmcgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGxldCB0aGluZ3MgPSBUaGluZy5nZXROb25VbmlxdWUobmFtZSk7XHJcbiAgICAgICAgICAgIGlmICh0aGluZ3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpbmcgPSB0aGluZ3NbMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgc3RvcmVVbmlxdWUgKHVuaXF1ZSA6IFRoaW5nKSB7XHJcbiAgICAgICAgaWYgKFRoaW5nLnVuaXF1ZVRoaW5nc1t1bmlxdWUubmFtZV0gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2Fybih1bmlxdWUubmFtZSwgVGhpbmcudW5pcXVlVGhpbmdzW3VuaXF1ZS5uYW1lXSwgbmV3IEVycm9yKFwiVW5pcXVlIFRoaW5nIEFscmVhZHkgRXhpc3RzXCIpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBUaGluZy51bmlxdWVUaGluZ3NbdW5pcXVlLm5hbWVdID0gdW5pcXVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFVuaXF1ZSAobmFtZSA6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiBUaGluZy51bmlxdWVUaGluZ3NbbmFtZV07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRVbmlxdWVzICgpIDogQXJyYXk8VGhpbmc+IHtcclxuICAgICAgICBsZXQgdGhpbmdzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBUaGluZy51bmlxdWVUaGluZ3MpIHtcclxuICAgICAgICAgICAgdGhpbmdzLnB1c2goVGhpbmcudW5pcXVlVGhpbmdzW25hbWVdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaW5ncztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UHJpbnRlZE5hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UHJpbnRlZERlc2NyaXB0aW9uICgpIHtcclxuICAgICAgICBpZiAodGhpcy5kZXNjcmlwdGlvbiA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXkgKFwiWW91IHNlZSBub3RoaW5nIHNwZWNpYWwgYWJvdXQgXCIsIG5ldyBTYXlUaGUoKSwgdGhpcywgXCIuXCIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIEluc2lkZVJvb21SZWxhdGlvbiA6IFJlbGF0aW9uT25lVG9NYW55PSBuZXcgUmVsYXRpb25PbmVUb01hbnkoKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgUGFydFJlbGF0aW9uID0gbmV3IFJlbGF0aW9uT25lVG9NYW55KCk7XHJcbiAgICBwdWJsaWMgc3RhdGljIENhcnJ5UmVsYXRpb24gPSBuZXcgUmVsYXRpb25PbmVUb01hbnkoKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgV2llbGRSZWxhdGlvbiA9IG5ldyBSZWxhdGlvbk9uZVRvTWFueSgpO1xyXG4gICAgcHVibGljIHN0YXRpYyBXZWFyUmVsYXRpb24gPSBuZXcgUmVsYXRpb25PbmVUb01hbnkoKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgRW5jbG9zZWRSZWxhdGlvbiA9IG5ldyBSZWxhdGlvbkhhbmRsZXJTdHJpY3RPbmVUb01hbnkoVGhpbmcuSW5zaWRlUm9vbVJlbGF0aW9uLCBUaGluZy5QYXJ0UmVsYXRpb24sIFRoaW5nLkNhcnJ5UmVsYXRpb24sIFRoaW5nLldpZWxkUmVsYXRpb24sIFRoaW5nLldlYXJSZWxhdGlvbik7XHJcblxyXG4gICAgcHVibGljIGdldFBhcnRPbmUgKCkge1xyXG4gICAgICAgIHJldHVybiBUaGluZy5QYXJ0UmVsYXRpb24uZ2V0TGVmdCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2FycnlPbmUgKCkge1xyXG4gICAgICAgIHJldHVybiBUaGluZy5DYXJyeVJlbGF0aW9uLmdldExlZnQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFdpZWxkT25lICgpIHtcclxuICAgICAgICByZXR1cm4gVGhpbmcuV2llbGRSZWxhdGlvbi5nZXRMZWZ0KHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRXZWFyT25lICgpIHtcclxuICAgICAgICByZXR1cm4gVGhpbmcuV2VhclJlbGF0aW9uLmdldExlZnQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEVuY2xvc2VkT25lICgpIDogVGhpbmcgfCBSb29tIHtcclxuICAgICAgICByZXR1cm4gVGhpbmcuRW5jbG9zZWRSZWxhdGlvbi5nZXRMZWZ0KHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZW1vdmVQYXJ0cyAocGFydFR5cGU/IDogYW55KSB7XHJcbiAgICAgICAgbGV0IHBhcnRzID0gdGhpcy5nZXRQYXJ0cyhwYXJ0VHlwZSk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBUaGluZy5QYXJ0UmVsYXRpb24udW5zZXRSaWdodChwYXJ0c1tpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRQYXJ0cyAocGFydFR5cGU/IDogYW55KSB7XHJcbiAgICAgICAgaWYgKHBhcnRUeXBlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gVGhpbmcuUGFydFJlbGF0aW9uLmdldFJpZ2h0VHlwZSh0aGlzLCBwYXJ0VHlwZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBUaGluZy5QYXJ0UmVsYXRpb24uZ2V0UmlnaHQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFBhcnRzQnlOYW1lIChuYW1lIDogc3RyaW5nKSA6IEFycmF5PFRoaW5nPiB7XHJcbiAgICAgICAgbGV0IHBhcnRzID0gdGhpcy5nZXRQYXJ0cygpO1xyXG4gICAgICAgIHJldHVybiBwYXJ0cy5maWx0ZXIoKHBhcnQgOiBUaGluZykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gKHBhcnQuZ2V0TmFtZSgpID09IG5hbWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRQYXJ0IChwYXJ0VHlwZT8gOiBhbnkpIHtcclxuICAgICAgICBpZiAocGFydFR5cGUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBUaGluZy5QYXJ0UmVsYXRpb24uZ2V0UmlnaHRUeXBlT25lKHRoaXMsIHBhcnRUeXBlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFRoaW5nLlBhcnRSZWxhdGlvbi5nZXRSaWdodCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBXaWxsIHVzdWFsbHkgcmV0dXJuIHRoZSByb29tIGF0IHdoaWNoIHRoaXMgaXMuXHJcbiAgICAvLyBXaWxsIHJldHVybiB0aGUgaGlnaGVzdCBwYXJlbnQgaWYgdGhhdCBwYXJlbnQgaXMgb3V0IG9mIHdvcmxkLlxyXG4gICAgcHVibGljIGdldEhpZ2hlc3RFbmNsb3NlZE9uZSAoKSA6IFRoaW5nIHwgUm9vbSB7XHJcbiAgICAgICAgcmV0dXJuIFRoaW5nLkVuY2xvc2VkUmVsYXRpb24uZ2V0TGFzdExlZnQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEhpZ2hlc3RFbmNsb3NlZE9uZU5vdFJvb20gKCkgOiBUaGluZyB7XHJcbiAgICAgICAgbGV0IHBhcmVudCA9IFRoaW5nLkVuY2xvc2VkUmVsYXRpb24uZ2V0TGVmdCh0aGlzKTtcclxuICAgICAgICBpZiAocGFyZW50ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsZXQgbmV3UGFyZW50ID0gVGhpbmcuRW5jbG9zZWRSZWxhdGlvbi5nZXRMZWZ0KHBhcmVudCk7XHJcbiAgICAgICAgICAgIHdoaWxlIChuZXdQYXJlbnQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnQgPSBuZXdQYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICBuZXdQYXJlbnQgPSBUaGluZy5FbmNsb3NlZFJlbGF0aW9uLmdldExlZnQocGFyZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcGFyZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Um9vbSAoKSA6IFJvb20ge1xyXG4gICAgICAgIHZhciBwYXJ0T2YgPSA8VGhpbmcgfCBSb29tPiBUaGluZy5FbmNsb3NlZFJlbGF0aW9uLmdldExlZnQodGhpcyk7XHJcbiAgICAgICAgaWYgKHBhcnRPZiBpbnN0YW5jZW9mIFJvb20pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBhcnRPZjtcclxuICAgICAgICB9IGVsc2UgaWYgKHBhcnRPZiBpbnN0YW5jZW9mIFRoaW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwYXJ0T2YuZ2V0Um9vbSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVtb3ZlRnJvbVJvb20gKCkge1xyXG4gICAgICAgIHRoaXMuZ2V0Um9vbSgpLnJlbW92ZSh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNWaXNpYmxlVG8gKHRoaW5nIDogVGhpbmcpIHtcclxuICAgICAgICAvLyBFaXRoZXIgaW4gdGhlIHNhbWUgcm9vbSBvciBwYXJ0IG9mIC93aWVsZGVkIC8gY2FycmllZCBieSBwZXJzb25cclxuICAgICAgICByZXR1cm4gKHRoaXMuZ2V0Um9vbSgpID09IHRoaW5nLmdldFJvb20oKSAmJiB0aGlzLnZpc2libGUpO1xyXG4gICAgICAgIC8vIFRPRE8gOiBVcGRhdGUgdGhpcyBjb2RlIGZvciB0aGUgY2FzZXMgd2hlcmUgYSBjcmVhdHVyZSBpcyBub3QgdmlzaWJsZSBidXQgdGhlIG9ic2VydmVyIGNhbiBzZWUgdGhlbSBhbnl3YXlcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNQbGF5ZXIgKCkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkUGFydHMgKC4uLnBhcnRzIDogQXJyYXk8VGhpbmc+KSB7XHJcbiAgICAgICAgcGFydHMuZm9yRWFjaChwYXJ0ID0+IHtcclxuICAgICAgICAgICAgVGhpbmcuUGFydFJlbGF0aW9uLnNldFJlbGF0aW9uKHRoaXMsIHBhcnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc1VuaXF1ZSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudW5pcXVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRDYXJyaWVkICh0aGluZyA6IFRoaW5nKSB7XHJcbiAgICAgICAgVGhpbmcuQ2FycnlSZWxhdGlvbi5zZXRSZWxhdGlvbih0aGlzLCB0aGluZyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldFdvcm4gKHRoaW5nIDogVGhpbmcpIHtcclxuICAgICAgICBUaGluZy5XZWFyUmVsYXRpb24uc2V0UmVsYXRpb24odGhpcywgdGhpbmcpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRXaWVsZGVkICh0aGluZyA6IFRoaW5nKSB7XHJcbiAgICAgICAgVGhpbmcuV2llbGRSZWxhdGlvbi5zZXRSZWxhdGlvbih0aGlzLCB0aGluZyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVuc2V0Q2FycmllZCAodGhpbmcgOiBUaGluZykge1xyXG4gICAgICAgIGlmIChUaGluZy5FbmNsb3NlZFJlbGF0aW9uLmdldEFsbFJpZ2h0KHRoaXMpLmluZGV4T2YodGhpbmcpICE9IC0xKSB7XHJcbiAgICAgICAgICAgIFRoaW5nLkVuY2xvc2VkUmVsYXRpb24udW5zZXRSaWdodCh0aGluZyk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Um9vbSgpLnBsYWNlKHRoaW5nKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTbyBsb25nIGFzIGEgdGhpbmcgaXMgaW4gYSByZWxhdGlvbiwgaXQgY2FuJ3QgYmUgZ2FyYmFnZSBjbGVhbmVkLlxyXG4gICAgICogSWYgeW91J3JlIHRocm93aW5nIGEgdGhpbmcgYXdheSwgZG8gcnVuIGRlc3Ryb3kuXHJcbiAgICAgKiBXYXJuaW5nOiB0aGlzIHdpbGwgYWxzbyBkZXN0cm95IGV2ZXJ5dGhpbmcgdGhhdCdzIGJlbG93IGl0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGVzdHJveSAoKSB7XHJcbiAgICAgICAgbGV0IHJlbGF0ZWRSaWdodCA9IFRoaW5nLkVuY2xvc2VkUmVsYXRpb24uZ2V0QWxsUmlnaHQodGhpcyk7XHJcbiAgICAgICAgcmVsYXRlZFJpZ2h0LnB1c2godGhpcyk7XHJcbiAgICAgICAgcmVsYXRlZFJpZ2h0LmZvckVhY2gocmVsYXRlZCA9PiB7XHJcbiAgICAgICAgICAgIFRoaW5nLkVuY2xvc2VkUmVsYXRpb24udW5zZXQocmVsYXRlZCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQWN0aW9uLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL0VsZW1lbnRzL0NsYXNzZXMvU2F5L1NheUJvbGQudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vLi4vRWxlbWVudHMvQ2xhc3Nlcy9TYXkvU2F5VGhlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL0VsZW1lbnRzL01vZHVsZXMvSHlwZXJsaW5rSGFuZGxlci50c1wiIC8+XHJcblxyXG5jbGFzcyBBY3Rpb25UYWtlIGV4dGVuZHMgQWN0aW9uIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2sgOiBSdWxlYm9vazxBY3Rpb25UYWtlPiA9IG5ldyBSdWxlYm9vayhcIkNoZWNrIFRha2luZ1wiKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgY2FycnkgOiBSdWxlYm9vazxBY3Rpb25UYWtlPiA9IG5ldyBSdWxlYm9vayhcIkNhcnJ5IG91dCBUYWtpbmdcIik7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOZWVkcyB0byByZXR1cm4gYSBzdHJpbmcgZXhwbGFpbmluZyB3aGF0IHRoZSBwbGF5ZXIgd2lsbCBkbyBpZiBoZSBkb2VzIHRoaXMgYWN0aW9uLlxyXG4gICAgICogRm9yIGluc3RhbmNlLCBBY3Rpb25UYWtpbmcgc2hvdWxkIHJldHVybiBzb21ldGhpbmcgbGlrZSByZXR1cm4gXCJ0YWtlIFwiICsgdGhpcy5ub3Vuc1swXS5nZXROYW1lKCksXHJcbiAgICAgKiAgIHdoaWNoIHdvdWxkIHJlYWQgYXMgXCJ0YWtlIHRoaW5nXCIuXHJcbiAgICAgKiAgIHJlbWVtYmVyIHRoYXQgdGhpbmdzIGltcGxlbWVudCBQUklOVEFCTEUgaW50ZXJmYWNlLCBzbyB5b3UgY2FuIGdldCB0aGVpciBuYW1lcy5cclxuICAgICAqIEByZXR1cm5zIHtTYXl9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDb21tYW5kVGV4dCAoKSB7XHJcbiAgICAgICAgcmV0dXJuIFwidGFrZSBcIiArICh0aGlzLmdldE5vdW4oMCkgIT0gdW5kZWZpbmVkID8gdGhpcy5nZXROb3VuKDApLmdldFByaW50ZWROYW1lKCkgOiBcIlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmF1bHRDYXJyeVRha2luZ1J1bGUgPSBuZXcgUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiVGFraW5nIC0gQWRkIHRoZSB0aGluZyB0byB5b3VyIGludmVudG9yeVwiLFxyXG4gICAgICAgIGNvZGUgOiAocnVsZWJvb2sgOiBSdWxlYm9va1J1bm5lcjxBY3Rpb25UYWtlPikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgYWN0aW9uID0gPEFjdGlvbkdvPiBydWxlYm9vay5ub3VuO1xyXG4gICAgICAgICAgICBsZXQgYWN0b3IgPSBhY3Rpb24uYWN0b3I7XHJcbiAgICAgICAgICAgIGxldCB0aGluZyA9ICg8VGhpbmc+YWN0aW9uLmdldE5vdW4oMCkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaW5nLmdldEVuY2xvc2VkT25lKCkgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgUGFydCBPZiwgQ2FycmllZCBvciBXaWVsZGVkLiBJdCdzIGVzc2VudGlhbGx5IHN0ZWFsaW5nLlxyXG4gICAgICAgICAgICAgICAgVGhpbmcuRW5jbG9zZWRSZWxhdGlvbi51bnNldFJpZ2h0KHRoaW5nKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaW5nLnJlbW92ZUZyb21Sb29tKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIFRoaW5nLkNhcnJ5UmVsYXRpb24uc2V0UmVsYXRpb24oYWN0b3IsIGFjdGlvbi5nZXROb3VuKDApKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhY3RvciA9PSBXb3JsZFN0YXRlLnBsYXllcikge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uLnNheS5hZGQobmV3IFNheUJvbGQoKDxUaGluZz4gYWN0aW9uLmdldE5vdW4oMCkpLmdldFByaW50ZWROYW1lKCkgKyBcIjogXCIpLCBcIlRha2VuLlwiKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFjdGlvbi5zYXkuYWRkKG5ldyBTYXlUaGUoKSwgYWN0b3IsIFwiIHRha2VzIFwiLCBuZXcgU2F5VGhlKHVuZGVmaW5lZCwgdHJ1ZSksICg8VGhpbmc+IGFjdGlvbi5nZXROb3VuKDApKSwgXCIuXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn1cclxuXHJcbkFjdGlvblRha2UuY2hlY2suYWRkUnVsZShcclxuICAgIG5ldyBSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJDaGVjayBUYWtpbmcgLSBXaG8gaGFzIGl0LCByZWFsbHk/XCIsXHJcbiAgICAgICAgcHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0hJR0hFU1QsXHJcbiAgICAgICAgY29kZSA6IChydWxlYm9vayA6IFJ1bGVib29rUnVubmVyPEFjdGlvblRha2U+KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBhY3Rpb24gPSA8QWN0aW9uR28+IHJ1bGVib29rLm5vdW47XHJcbiAgICAgICAgICAgIGxldCBhY3RvciA9IGFjdGlvbi5hY3RvcjtcclxuICAgICAgICAgICAgbGV0IHRoaW5nID0gKDxUaGluZz5hY3Rpb24uZ2V0Tm91bigwKSk7XHJcbiAgICAgICAgICAgIGxldCBvd25lciA9IDxUaGluZz4gdGhpbmcuZ2V0RW5jbG9zZWRPbmUoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChvd25lciA9PSBhY3Rvcil7XHJcbiAgICAgICAgICAgICAgICBpZiAob3duZXIgPT0gV29ybGRTdGF0ZS5wbGF5ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb24uc2F5LmFkZChcIllvdSBhbHJlYWR5IGhhdmUgaXQuXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSlcclxuKTtcclxuXHJcbkFjdGlvblRha2UuY2hlY2suYWRkUnVsZShcclxuICAgIG5ldyBSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJDaGVjayBUYWtpbmcgLSBEb251dCBzdGVhbFwiLFxyXG4gICAgICAgIGNvZGUgOiAocnVsZWJvb2sgOiBSdWxlYm9va1J1bm5lcjxBY3Rpb25UYWtlPikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgYWN0aW9uID0gPEFjdGlvbkdvPiBydWxlYm9vay5ub3VuO1xyXG4gICAgICAgICAgICBsZXQgYWN0b3IgPSBhY3Rpb24uYWN0b3I7XHJcbiAgICAgICAgICAgIGxldCB0aGluZyA9ICg8VGhpbmc+YWN0aW9uLmdldE5vdW4oMCkpO1xyXG4gICAgICAgICAgICBsZXQgb3duZXIgPSA8VGhpbmc+IHRoaW5nLmdldEVuY2xvc2VkT25lKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAob3duZXIgIT0gdW5kZWZpbmVkICYmIG93bmVyLmFuaW1hdGVkKXtcclxuICAgICAgICAgICAgICAgIGlmIChhY3RvciA9PSBXb3JsZFN0YXRlLnBsYXllcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbi5zYXkuYWRkKG93bmVyLmdldFByaW50ZWROYW1lKCkgKyBcIiB3b3VsZG4ndCBsaWtlIHRoYXQuXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSlcclxuKTtcclxuXHJcbkFjdGlvblRha2UuY2hlY2suYWRkUnVsZShcclxuICAgIG5ldyBSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJDaGVjayBUYWtpbmcgLSBDYW4ndCB0YWtlIGZpeGVkIGluIHBsYWNlXCIsXHJcbiAgICAgICAgY29kZSA6IChydWxlYm9vayA6IFJ1bGVib29rUnVubmVyPEFjdGlvblRha2U+KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBhY3Rpb24gPSA8QWN0aW9uR28+IHJ1bGVib29rLm5vdW47XHJcbiAgICAgICAgICAgIGxldCBhY3RvciA9IGFjdGlvbi5hY3RvcjtcclxuICAgICAgICAgICAgbGV0IHRoaW5nID0gKDxUaGluZz5hY3Rpb24uZ2V0Tm91bigwKSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpbmcuZml4ZWRJblBsYWNlKXtcclxuICAgICAgICAgICAgICAgIGlmIChhY3RvciA9PSBXb3JsZFN0YXRlLnBsYXllcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbi5zYXkuYWRkKFwiWW91IGNhbid0IHRha2UgdGhhdC5cIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KVxyXG4pO1xyXG5cclxuQWN0aW9uVGFrZS5jYXJyeS5hZGRSdWxlKFxyXG4gICAgQWN0aW9uVGFrZS5kZWZhdWx0Q2FycnlUYWtpbmdSdWxlXHJcbik7XHJcblxyXG5FbGVtZW50cy5IeXBlcmxpbmtIYW5kbGVyLkh5cGVybGlua2luZ1J1bGVib29rLmFkZFJ1bGUobmV3IFJ1bGUoXHJcbiAgICB7XHJcbiAgICAgICAgbmFtZSA6IFwiSHlwZXJsaW5rIC0gVGFrZVwiLFxyXG4gICAgICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0hJR0hFU1QsXHJcbiAgICAgICAgY29kZSA6IChydWxlYm9vayA6IFJ1bGVib29rUnVubmVyPFRoaW5nPikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgdGhpbmcgPSA8VGhpbmc+IHJ1bGVib29rLm5vdW47XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaW5nLmFuaW1hdGVkICYmICF0aGluZy5maXhlZEluUGxhY2UgJiYgdGhpbmcuZ2V0Um9vbSgpID09IFdvcmxkU3RhdGUucGxheWVyLmdldFJvb20oKSAmJiB0aGluZy5nZXRFbmNsb3NlZE9uZSgpIGluc3RhbmNlb2YgUm9vbSkge1xyXG4gICAgICAgICAgICAgICAgRWxlbWVudHMuSHlwZXJsaW5rSGFuZGxlci5hZGRBdmFpbGFibGVBY3Rpb24oXCJUYWtlXCIsIG5ldyBBY3Rpb25UYWtlKFdvcmxkU3RhdGUucGxheWVyLCB0aGluZykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4pKTsiLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQWN0aW9uLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1J1bGUudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vUnVsZWJvb2sudHNcIiAvPlxyXG5cclxuY2xhc3MgQWN0aW9uR28gZXh0ZW5kcyBBY3Rpb24ge1xyXG4gICAgcHVibGljIHN0YXRpYyBjaGVjayA9IG5ldyBSdWxlYm9vazxBY3Rpb25Hbz4oXCJDaGVjayBHb2luZ1wiKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgY2FycnkgPSBuZXcgUnVsZWJvb2s8QWN0aW9uR28+KFwiQ2Fycnkgb3V0IEdvaW5nXCIpO1xyXG5cclxuICAgIHB1YmxpYyByb29tR29uZUZyb20gOiBSb29tO1xyXG4gICAgcHVibGljIHJvb21Hb25lVG8gOiBSb29tO1xyXG4gICAgcHVibGljIG9yaWdpbmFsVGFyZ2V0IDogUm9vbSB8IG51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKGFjdG9yIDogVGhpbmcsIC4uLm5vdW5zIDogQXJyYXk8YW55Pikge1xyXG4gICAgICAgIHN1cGVyKGFjdG9yLCAuLi5ub3Vucyk7XHJcbiAgICAgICAgdGhpcy5vcmlnaW5hbFRhcmdldCA9IG5vdW5zWzBdO1xyXG4gICAgICAgIHRoaXMucmVxdWlyZXNOb3VuID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5yZXF1aXJlc1Zpc2liaWxpdHkgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE5lZWRzIHRvIHJldHVybiBhIHN0cmluZyBleHBsYWluaW5nIHdoYXQgdGhlIHBsYXllciB3aWxsIGRvIGlmIGhlIGRvZXMgdGhpcyBhY3Rpb24uXHJcbiAgICAgKiBGb3IgaW5zdGFuY2UsIEFjdGlvblRha2luZyBzaG91bGQgcmV0dXJuIHNvbWV0aGluZyBsaWtlIHJldHVybiBcInRha2UgXCIgKyB0aGlzLm5vdW5zWzBdLmdldE5hbWUoKSxcclxuICAgICAqICAgd2hpY2ggd291bGQgcmVhZCBhcyBcInRha2UgdGhpbmdcIi5cclxuICAgICAqICAgcmVtZW1iZXIgdGhhdCB0aGluZ3MgaW1wbGVtZW50IFBSSU5UQUJMRSBpbnRlcmZhY2UsIHNvIHlvdSBjYW4gZ2V0IHRoZWlyIG5hbWVzLlxyXG4gICAgICogQHJldHVybnMge3N0cmluZ31cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENvbW1hbmRUZXh0ICgpIHtcclxuICAgICAgICBsZXQgbmFtZTtcclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3JpZ2luYWxUYXJnZXQgPT0gXCJudW1iZXJcIikge1xyXG4gICAgICAgICAgICBuYW1lID0gRGlyZWN0aW9uTmFtZXNbRGlyZWN0aW9uW3RoaXMub3JpZ2luYWxUYXJnZXRdXTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMub3JpZ2luYWxUYXJnZXQgaW5zdGFuY2VvZiBSb29tKSB7XHJcbiAgICAgICAgICAgIG5hbWUgPSBcInRvIFwiICsgKDxSb29tPiB0aGlzLm9yaWdpbmFsVGFyZ2V0KS5nZXRQcmludGVkTmFtZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gXCJnbyBcIiArIG5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBydWxlQ2hlY2tSZXN0b3JlT3JpZ2luYWxOb3VuID0gQWN0aW9uR28uY2hlY2suY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfSElHSEVTVCxcclxuICAgICAgICBwcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfSElHSEVTVCxcclxuICAgICAgICBuYW1lIDogXCJDaGVjayBHb2luZyAtIFJlc3RvcmUgb3JpZ2luYWwgbm91blwiLFxyXG4gICAgICAgIGNvZGUgOiAocnVsZWJvb2spID0+IHtcclxuICAgICAgICAgICAgbGV0IGFjdGlvbiA9IHJ1bGVib29rLm5vdW47XHJcbiAgICAgICAgICAgIGFjdGlvbi5zZXROb3VuKDAsIGFjdGlvbi5vcmlnaW5hbFRhcmdldCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBydWxlQ2hlY2tJc3RoZXJlYWN0b3IgPSBBY3Rpb25Hby5jaGVjay5jcmVhdGVBbmRBZGRSdWxlKHtcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9ISUdIRVNULFxyXG4gICAgICAgIHByaW9yaXR5IDogUnVsZS5QUklPUklUWV9ISUdIRVNULFxyXG4gICAgICAgIG5hbWUgOiBcIkNoZWNrIEdvaW5nIC0gSXMgdGhlcmUgYW4gYWN0b3I/XCIsXHJcbiAgICAgICAgY29kZSA6IChydWxlYm9vaykgPT4ge1xyXG4gICAgICAgICAgICBsZXQgYWN0aW9uID0gPEFjdGlvbkdvPiBydWxlYm9vay5ub3VuO1xyXG4gICAgICAgICAgICBpZiAoYWN0aW9uLmFjdG9yID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBSdWxlIGZhaWxzXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHJ1bGVDaGVja0NvbnZlcnRSb29tVG9EaXJlY3Rpb24gPSBBY3Rpb25Hby5jaGVjay5jcmVhdGVBbmRBZGRSdWxlKHtcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9ISUdIRVNULFxyXG4gICAgICAgIHByaW9yaXR5IDogUnVsZS5QUklPUklUWV9ISUdILFxyXG4gICAgICAgIG5hbWUgOiBcIkNoYW5nZSBSb29tIHRvIERpcmVjdGlvblwiLFxyXG4gICAgICAgIGNvZGUgOiAocnVsZWJvb2spID0+IHtcclxuICAgICAgICAgICAgbGV0IGFjdGlvbiA9IDxBY3Rpb25Hbz4gcnVsZWJvb2subm91bjtcclxuXHJcbiAgICAgICAgICAgIC8vIFNvbWVvbmUgYXNrZWQgZm9yIGEgcm9vbS4uLlxyXG4gICAgICAgICAgICBpZiAoYWN0aW9uLmdldE5vdW4oMCkgaW5zdGFuY2VvZiBSb29tUmFuZG9tKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgYWN0b3IgPSBhY3Rpb24uYWN0b3I7XHJcbiAgICAgICAgICAgICAgICBsZXQgY1Jvb20gPSBhY3Rvci5nZXRSb29tKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY1Jvb20gaW5zdGFuY2VvZiBSb29tUmFuZG9tKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRSb29tID0gYWN0aW9uLmdldE5vdW4oMCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjUm9vbSA9PSBkUm9vbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0b3IuaXNQbGF5ZXIoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLnNheS5hZGQoXCJZb3UgYXJlIGFscmVhZHkgdGhlcmUhXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb2RlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0b3IgPT0gV29ybGRTdGF0ZS5wbGF5ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IChyb29tOiBSb29tKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV29ybGRTdGF0ZS5pc1Jvb21SZW1lbWJlcmVkKHJvb20pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgZGlyZWN0aW9uID0gY1Jvb20uZ2V0QVN0YXJCZXN0RGlyZWN0aW9uVG8oZFJvb20sIGNvZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rvci5pc1BsYXllcigpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24uc2F5LmFkZChcIllvdSBkb24ndCByZW1lbWJlciBob3cgdG8gZ2V0IHRoZXJlLlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLnNldE5vdW4oMCwgZGlyZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHJ1bGVDaGVja0lzdGhlcmVkaXJlY3Rpb25hbmRyb29tID0gQWN0aW9uR28uY2hlY2suY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiQ2hlY2sgR29pbmcgLSBpcyB0aGVyZSBhIGRpcmVjdGlvbj8gRG9lcyBpdCBsZWFkIGFueXdoZXJlP1wiLFxyXG4gICAgICAgIGNvZGUgOiAocnVsZWJvb2spID0+IHtcclxuICAgICAgICAgICAgbGV0IGFjdGlvbiA9IDxBY3Rpb25Hbz4gcnVsZWJvb2subm91bjtcclxuICAgICAgICAgICAgbGV0IGNSb29tID0gYWN0aW9uLmFjdG9yLmdldFJvb20oKTtcclxuICAgICAgICAgICAgaWYgKGNSb29tID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBSdWxlIGZhaWxzLCBhY3RvciBpcyBvdXQgb2Ygd29ybGRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgZGlyZWN0aW9uID0gYWN0aW9uLmdldE5vdW4oMCk7XHJcbiAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIFJ1bGUgZmFpbHMsIG5vIGRpcmVjdGlvblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBuZXh0Um9vbSA9IGNSb29tLmNvbm5lY3Rpb25zW2RpcmVjdGlvbl07XHJcbiAgICAgICAgICAgIGlmIChuZXh0Um9vbSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gUnVsZSBmYWlscywgY2FuJ3QgZ28gZGlyZWN0aW9uIHRoYXQgZG9lc24ndCBoYXZlIGEgcm9vbVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBhY3Rpb24ucm9vbUdvbmVGcm9tID0gYWN0aW9uLmFjdG9yLmdldFJvb20oKTtcclxuICAgICAgICAgICAgYWN0aW9uLnJvb21Hb25lVG8gPSBuZXh0Um9vbTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHJ1bGVDYXJyeU1vdmUgPSBBY3Rpb25Hby5jYXJyeS5jcmVhdGVBbmRBZGRSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJHb2luZyAtIE1vdmUgQWN0b3IgdG8gTmV4dCBSb29tXCIsXHJcbiAgICAgICAgY29kZSA6IChydWxlYm9vaykgPT4ge1xyXG4gICAgICAgICAgICBsZXQgYWN0aW9uID0gPEFjdGlvbkdvPiBydWxlYm9vay5ub3VuO1xyXG4gICAgICAgICAgICBsZXQgcm9vbUdvbmVGcm9tID0gYWN0aW9uLmFjdG9yLmdldFJvb20oKTtcclxuICAgICAgICAgICAgbGV0IGRpcmVjdGlvbiA9IGFjdGlvbi5nZXROb3VuKDApO1xyXG4gICAgICAgICAgICBsZXQgcm9vbUdvbmVJbnRvID0gcm9vbUdvbmVGcm9tLmNvbm5lY3Rpb25zW2RpcmVjdGlvbl07XHJcbiAgICAgICAgICAgIHJvb21Hb25lSW50by5wbGFjZShhY3Rpb24uYWN0b3IpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGFjdG9yID0gYWN0aW9uLmFjdG9yO1xyXG4gICAgICAgICAgICBpZiAoYWN0b3IgPT0gV29ybGRTdGF0ZS5wbGF5ZXIpIHtcclxuICAgICAgICAgICAgICAgIGFjdGlvbi5zYXkuYWRkKFwiWW91IGdvIFwiICsgRGlyZWN0aW9uTmFtZXNbRGlyZWN0aW9uW2RpcmVjdGlvbl1dLnRvTG93ZXJDYXNlKCkgKyBcIi5cIik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocm9vbUdvbmVGcm9tID09IFdvcmxkU3RhdGUucGxheWVyLmdldFJvb20oKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbi5zYXkuYWRkKG5ldyBTYXlUaGUoKSwgYWN0b3IsIFwiIGdvZXMgXCIgKyBEaXJlY3Rpb25OYW1lc1tEaXJlY3Rpb25bZGlyZWN0aW9uXV0udG9Mb3dlckNhc2UoKSArIFwiLlwiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9wcG9zaXRlTmFtZSA9IERpcmVjdGlvbk5hbWVzW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBPcHBvc2l0ZURpcmVjdGlvbltkaXJlY3Rpb25dXHJcbiAgICAgICAgICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb24uc2F5LmFkZChuZXcgU2F5VGhlKCksIGFjdG9yLCBcIiBhcnJpdmVzIGZyb20gdGhlIFwiICsgb3Bwb3NpdGVOYW1lLnRvTG93ZXJDYXNlKCkgKyBcIi5cIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHJ1bGVDYXJyeVJlbWVtYmVyUm9vbXMgPSBBY3Rpb25Hby5jYXJyeS5jcmVhdGVBbmRBZGRSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJHb2luZyAtIFJlbWVtYmVyIHRoZSBpbnZvbHZlZCByb29tc1wiLFxyXG4gICAgICAgIGNvZGUgOiAocnVsZWJvb2spID0+IHtcclxuICAgICAgICAgICAgbGV0IGFjdGlvbiA9IDxBY3Rpb25Hbz4gcnVsZWJvb2subm91bjtcclxuICAgICAgICAgICAgbGV0IGFjdG9yID0gYWN0aW9uLmFjdG9yO1xyXG4gICAgICAgICAgICBsZXQgcm9vbUdvbmVJbnRvID0gYWN0aW9uLmFjdG9yLmdldFJvb20oKTtcclxuICAgICAgICAgICAgbGV0IGRpcmVjdGlvbiA9IGFjdGlvbi5nZXROb3VuKDApO1xyXG4gICAgICAgICAgICBsZXQgcm9vbUdvbmVGcm9tID0gcm9vbUdvbmVJbnRvLmNvbm5lY3Rpb25zW09wcG9zaXRlRGlyZWN0aW9uW0RpcmVjdGlvbltkaXJlY3Rpb25dXV07XHJcblxyXG4gICAgICAgICAgICBpZiAoYWN0b3IuaXNQbGF5ZXIoKSkge1xyXG4gICAgICAgICAgICAgICAgV29ybGRTdGF0ZS5yZW1lbWJlclJvb20ocm9vbUdvbmVGcm9tLCByb29tR29uZUludG8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vRWxlbWVudHMudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vV29ybGQvQ2xhc3Nlcy9BY3Rpb24vQWN0aW9uRXhhbWluZS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9Xb3JsZC9DbGFzc2VzL0FjdGlvbi9BY3Rpb25Hby50c1wiIC8+XHJcbm1vZHVsZSBFbGVtZW50cy5Sb29tSGFuZGxlciB7XHJcbiAgICBleHBvcnQgdmFyIGN1cnJlbnRSb29tVGFiID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjdXJyZW50Um9vbVRhYlwiKTtcclxuICAgIGV4cG9ydCB2YXIgY3VycmVudFJvb21EZXNjcmlwdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicm9vbURlc2NyaXB0aW9uXCIpO1xyXG4gICAgZXhwb3J0IHZhciBjdXJyZW50Um9vbUV4aXRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyb29tRXhpdHNcIik7XHJcblxyXG4gICAgZXhwb3J0IHZhciBjdXJyZW50Um9vbU5hbWUgOiBUZXh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIik7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJvb21OYW1lXCIpLmFwcGVuZENoaWxkKGN1cnJlbnRSb29tTmFtZSk7XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGxpbmtPYmplY3RzICgpIHtcclxuICAgICAgICBsZXQgb2JqcyA9IGN1cnJlbnRSb29tVGFiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJyb29tT2JqZWN0XCIpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9ianMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGxpbmtLZXlDb2RlID0gQ29udHJvbHMuS2V5SGFuZGxlci5nZXRGaXJzdEtleUNvZGUoKTtcclxuICAgICAgICAgICAgQ29udHJvbHMuS2V5SGFuZGxlci5hcHBseUNvZGUoPEhUTUxFbGVtZW50PiBvYmpzW2ldLCBsaW5rS2V5Q29kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBlbXB0eVJvb20gKCkge1xyXG4gICAgICAgIHdoaWxlIChjdXJyZW50Um9vbURlc2NyaXB0aW9uLmZpcnN0Q2hpbGQpIHtcclxuICAgICAgICAgICAgY3VycmVudFJvb21EZXNjcmlwdGlvbi5yZW1vdmVDaGlsZChjdXJyZW50Um9vbURlc2NyaXB0aW9uLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRSb29tRXhpdHMuZmlyc3RDaGlsZCkge1xyXG4gICAgICAgICAgICBjdXJyZW50Um9vbUV4aXRzLnJlbW92ZUNoaWxkKGN1cnJlbnRSb29tRXhpdHMuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjdXJyZW50Um9vbU5hbWUubm9kZVZhbHVlID0gXCJcIjtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlUm9vbSAoKSB7XHJcbiAgICAgICAgZW1wdHlSb29tKCk7XHJcblxyXG4gICAgICAgIGxldCByb29tID0gV29ybGRTdGF0ZS5wbGF5ZXIuZ2V0Um9vbSgpO1xyXG5cclxuICAgICAgICBpZiAocm9vbSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY3VycmVudFJvb21OYW1lLm5vZGVWYWx1ZSA9IHJvb20uZ2V0UHJpbnRlZE5hbWUoKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBkZXNjcmlwdGlvbiA9IHJvb20uZGVzY3JpcHRpb24uZ2V0SFRNTChcInBcIiwgW1wicm9vbURlc2NyaXB0aW9uXCJdKTtcclxuICAgICAgICAgICAgYXdhaXQgZGVzY3JpcHRpb24udGhlbih2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgcCA9IHZhbHVlW2ldOyBwICE9IHVuZGVmaW5lZDsgcCA9IHZhbHVlWysraV0pIHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Um9vbURlc2NyaXB0aW9uLmFwcGVuZENoaWxkKHApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGxldCB0aGluZ3MgPSByb29tLmdldENvbnRhaW5lZEFuZFZpc2libGUoKTtcclxuICAgICAgICAgICAgaWYgKHRoaW5ncy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGhpbmdMaXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XHJcbiAgICAgICAgICAgICAgICB0aGluZ0xpc3QuY2xhc3NMaXN0LmFkZChcInJvb21EZXNjcmlwdGlvblwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBQcmludGluZ1Zpc2libGVUaGluZ3NSdWxlYm9vay5leGVjdXRlKHtcclxuICAgICAgICAgICAgICAgICAgICBub3VuIDogPFZpc2libGVUaGluZ3NPcHRpb25zPiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5ncyA6IHRoaW5ncyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyIDogdGhpbmdMaXN0XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgY3VycmVudFJvb21EZXNjcmlwdGlvbi5hcHBlbmRDaGlsZCh0aGluZ0xpc3QpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDAsIHZhbHVlID0gcm9vbS5jb25uZWN0aW9uc1tpbmRleF07IGluZGV4IDwgcm9vbS5jb25uZWN0aW9ucy5sZW5ndGg7IHZhbHVlID0gcm9vbS5jb25uZWN0aW9uc1srK2luZGV4XSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcC5jbGFzc0xpc3QuYWRkKFwicm9vbUV4aXRcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgbGluay5jbGFzc0xpc3QuYWRkKFwicm9vbURpcmVjdGlvblwiKTtcclxuICAgICAgICAgICAgICAgICAgICBsaW5rLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKERpcmVjdGlvbk5hbWVzW0RpcmVjdGlvbltpbmRleF1dKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIENvbnRyb2xzLkxpbmtzLm1ha2VMaW5rKGxpbmssIG5ldyBBY3Rpb25HbyhXb3JsZFN0YXRlLnBsYXllciwgaW5kZXgpKTtcclxuICAgICAgICAgICAgICAgICAgICBDb250cm9scy5LZXlIYW5kbGVyLmFwcGx5Q29kZShsaW5rLCBDb250cm9scy5LZXlIYW5kbGVyLmdldERpcmVjdGlvbkNvZGVCeUluZGV4KGluZGV4KSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHAuYXBwZW5kQ2hpbGQobGluayk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBkaXJlY3Rpb25SZXN1bHQgPSBcIjogXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKFdvcmxkU3RhdGUuaXNSb29tUmVtZW1iZXJlZCh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uUmVzdWx0ICs9IHZhbHVlLmdldFByaW50ZWROYW1lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uUmVzdWx0ICs9IFwiQSBuZXcgcGxhY2VcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZGlyZWN0aW9uUmVzdWx0KSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSb29tRXhpdHMuYXBwZW5kQ2hpbGQocCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBWaXNpYmxlVGhpbmdzT3B0aW9ucyB7XHJcbiAgICAgICAgY29udGFpbmVyIDogSFRNTEVsZW1lbnQsXHJcbiAgICAgICAgdGhpbmdzIDogQXJyYXk8VGhpbmc+XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOb3VuID0gVmlzaWJsZVRoaW5nc09wdGlvbnNcclxuICAgICAqIEB0eXBlIHtSdWxlYm9va31cclxuICAgICAqL1xyXG4gICAgZXhwb3J0IHZhciBQcmludGluZ1Zpc2libGVUaGluZ3NSdWxlYm9vayA9IG5ldyBSdWxlYm9vayhcIlByaW50aW5nIHRoZSBuYW1lIG9mIHZpc2libGUgdGhpbmdzIGluIGEgcm9vbVwiKTtcclxuXHJcbiAgICBleHBvcnQgdmFyIFByaW50SW50cm9Ub1Zpc2libGVUaGluZ3NSdWxlID0gbmV3IFJ1bGUoe1xyXG4gICAgICAgIG5hbWUgOiBcIlByaW50IFxcXCJZb3UgY2FuIHNlZVxcXCIgdGV4dFwiLFxyXG4gICAgICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0hJR0gsXHJcbiAgICAgICAgY29kZSA6IChydWxlYm9vayA6IFJ1bGVib29rUnVubmVyPFZpc2libGVUaGluZ3NPcHRpb25zPikgPT4gIHtcclxuICAgICAgICAgICAgbGV0IG5vdW4gPSA8VmlzaWJsZVRoaW5nc09wdGlvbnM+IHJ1bGVib29rLm5vdW47XHJcbiAgICAgICAgICAgIG5vdW4uY29udGFpbmVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiWW91IGNhbiBzZWUgXCIpKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIFByaW50aW5nVmlzaWJsZVRoaW5nc1J1bGVib29rLmFkZFJ1bGUoUHJpbnRJbnRyb1RvVmlzaWJsZVRoaW5nc1J1bGUpO1xyXG5cclxuICAgIGV4cG9ydCB2YXIgUHJpbnRWaXNpYmxlVGhpbmdzUnVsZSA9IG5ldyBSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJQcmludCBhbGwgdmlzaWJsZSB0aGluZ3NcIixcclxuICAgICAgICBjb2RlIDogYXN5bmMgKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8VmlzaWJsZVRoaW5nc09wdGlvbnM+KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBub3VuID0gPFZpc2libGVUaGluZ3NPcHRpb25zPiBydWxlYm9vay5ub3VuO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vdW4udGhpbmdzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBub3VuLnRoaW5nc1tpXTtcclxuICAgICAgICAgICAgICAgIGxldCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XHJcbiAgICAgICAgICAgICAgICBsaW5rLmNsYXNzTGlzdC5hZGQoXCJyb29tT2JqZWN0XCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBzYXkgOiBTYXlcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFRoaW5nICYmIHZhbHVlLnVuaXF1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNheSA9IG5ldyBTYXkobmV3IFNheVRoZShmYWxzZSksIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2F5ID0gbmV3IFNheShuZXcgU2F5QW4oZmFsc2UpLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBzYXkuZ2V0UHVyZUVsZW1lbnRzKCkudGhlbih2YWx1ZTIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBlbGVtZW50ID0gdmFsdWUyW2ldOyBlbGVtZW50ICE9IHVuZGVmaW5lZDsgZWxlbWVudCA9IHZhbHVlMlsrK2ldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgQ29udHJvbHMuTGlua3MubWFrZUxpbmsobGluaywgbmV3IEFjdGlvbkV4YW1pbmUoV29ybGRTdGF0ZS5wbGF5ZXIsIHZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICBDb250cm9scy5LZXlIYW5kbGVyLmFwcGx5Q29kZShsaW5rLCBDb250cm9scy5LZXlIYW5kbGVyLmdldEZpcnN0S2V5Q29kZSgpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBub3VuLmNvbnRhaW5lci5hcHBlbmRDaGlsZChsaW5rKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoKGkgKyAxKSA8IG5vdW4udGhpbmdzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5vdW4uY29udGFpbmVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiLCBcIikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBQcmludGluZ1Zpc2libGVUaGluZ3NSdWxlYm9vay5hZGRSdWxlKFByaW50VmlzaWJsZVRoaW5nc1J1bGUpO1xyXG5cclxuICAgIGV4cG9ydCB2YXIgUHJpbnRPdXRyb1RvVmlzaWJsZVRoaW5nc1J1bGUgPSBuZXcgUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiUHJpbnQgXFxcIi4uLiBoZXJlXFxcIiB0ZXh0XCIsXHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfTE9XLFxyXG4gICAgICAgIGNvZGUgOiAocnVsZWJvb2sgOiBSdWxlYm9va1J1bm5lcjxWaXNpYmxlVGhpbmdzT3B0aW9ucz4pID0+ICB7XHJcbiAgICAgICAgICAgIGxldCBub3VuID0gPFZpc2libGVUaGluZ3NPcHRpb25zPiBydWxlYm9vay5ub3VuO1xyXG4gICAgICAgICAgICBub3VuLmNvbnRhaW5lci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIiBoZXJlLlwiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBQcmludGluZ1Zpc2libGVUaGluZ3NSdWxlYm9vay5hZGRSdWxlKFByaW50T3V0cm9Ub1Zpc2libGVUaGluZ3NSdWxlKTtcclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9UaGluZy50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9BY3Rpb24vQWN0aW9uVGFrZS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi9FbGVtZW50cy9Nb2R1bGVzL1Jvb21IYW5kbGVyLnRzXCIgLz5cclxuXHJcbmNsYXNzIENvaW5Qb3VjaCBleHRlbmRzIFRoaW5nIHtcclxuICAgIHByaXZhdGUgY29pbnMgOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBhZGRDb2lucyAoY29pbnMgOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLmNvaW5zICs9IGNvaW5zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZW1vdmVDb2lucyAoY29pbnMgOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLmNvaW5zIC09IGNvaW5zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDb2lucyAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29pbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFNoaW55ICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb2lucyA+IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChvcHRpb25zIDogVGhpbmdPcHRpb25zKSB7XHJcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XHJcblxyXG4gICAgICAgIHRoaXMuYWRkR2V0QWx0ZXJhdGlvbnMoKHB1cnNlKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBjb2lucyA6IHB1cnNlLmdldENvaW5zKClcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5hZGRTZXRBbHRlcmF0aW9ucygocHVyc2UsIGNoYW5nZU9iaikgPT4ge1xyXG4gICAgICAgICAgICBwdXJzZS5jb2lucyA9IChjaGFuZ2VPYmouY29pbnMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgY2FycnlPdXRUYWtpbmdDb2luUG91Y2hlcyA9IG5ldyBSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJDYXJyeSBvdXQgdGFraW5nIGNvaW4gcG91Y2hlc1wiLFxyXG4gICAgICAgIGZpcnN0UHJpb3JpdHkgOiBBY3Rpb25UYWtlLmRlZmF1bHRDYXJyeVRha2luZ1J1bGUuZmlyc3RQcmlvcml0eSxcclxuICAgICAgICBwcmlvcml0eSA6IEFjdGlvblRha2UuZGVmYXVsdENhcnJ5VGFraW5nUnVsZS5wcmlvcml0eSArIDEsXHJcbiAgICAgICAgY29kZSA6IGFzeW5jIChydWxlYm9vayA6IFJ1bGVib29rUnVubmVyPEFjdGlvblRha2U+KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBhY3Rpb24gPSA8QWN0aW9uVGFrZT4gcnVsZWJvb2subm91bjtcclxuICAgICAgICAgICAgbGV0IGFjdG9yID0gYWN0aW9uLmFjdG9yO1xyXG4gICAgICAgICAgICBsZXQgdGhpbmcgPSAoPENvaW5Qb3VjaD5hY3Rpb24uZ2V0Tm91bigwKSk7XHJcbiAgICAgICAgICAgIGxldCBhY3RvclBvdWNoZXMgPSBUaGluZy5DYXJyeVJlbGF0aW9uLmdldFJpZ2h0VHlwZShhY3RvciwgQ29pblBvdWNoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhY3RvclBvdWNoZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHRoaW5nQ29pbnMgPSB0aGluZy5nZXRDb2lucygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaW5nQ29pbnMgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcnVsZWJvb2suc2tpcFJ1bGUoQWN0aW9uVGFrZS5kZWZhdWx0Q2FycnlUYWtpbmdSdWxlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgKDxDb2luUG91Y2g+IGFjdG9yUG91Y2hlc1swXSkuYWRkQ29pbnModGhpbmdDb2lucyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpbmcucmVtb3ZlQ29pbnModGhpbmcuZ2V0Q29pbnMoKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3RvciA9PSBXb3JsZFN0YXRlLnBsYXllcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24uc2F5LmFkZChcIllvdSBlbXB0eSBcIiwgbmV3IFNheVRoZSgpLCB0aGluZywgXCIgaW50byB5b3VyIFwiLCBhY3RvclBvdWNoZXNbMF0sIFwiLiBZb3VyIFwiLCBhY3RvclBvdWNoZXNbMF0sIFwiIG5vdyBoYXMgXCIgKyBhY3RvclBvdWNoZXNbMF0uZ2V0Q29pbnMoKS50b1N0cmluZygpICsgXCIgY29pbnMuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbi5zYXkuYWRkKG5ldyBTYXlUaGUoKSwgYWN0b3IsIFwiIGVtcHRpZXMgXCIsIG5ldyBTYXlUaGUoKSwgdGhpbmcsIFwiIGludG8gXCIsIFNheS5oaXNIZXJzSXRzKGFjdG9yKSwgYWN0b3JQb3VjaGVzWzBdLCBcIi5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBnaXZlIHRoZW0gdGhlIG9sJyBzd2l0Y2hhcm9vXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG15Q29pbnMgPSBhY3RvclBvdWNoZXNbMF0uZ2V0Q29pbnMoKTtcclxuICAgICAgICAgICAgICAgICAgICBhY3RvclBvdWNoZXNbMF0ucmVtb3ZlQ29pbnMobXlDb2lucyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpbmcuYWRkQ29pbnMobXlDb2lucyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdG9yID09IFdvcmxkU3RhdGUucGxheWVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbi5zYXkuYWRkKFwiWW91IGVtcHR5IHlvdXIgXCIsIGFjdG9yUG91Y2hlc1swXSwgXCIgaW50byBcIiwgbmV3IFNheVRoZSgpLCB0aGluZywgXCIuXCIsIFNheS5QQVJBR1JBUEhfQlJFQUspO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBsZXQgZHJvcCA9IG5ldyBBY3Rpb25Ecm9wKGFjdG9yLCBhY3RvclBvdWNoZXNbMF0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGRyb3AuZXhlY3V0ZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoVGhpbmcuRW5jbG9zZWRSZWxhdGlvbi5nZXRMZWZ0KGFjdG9yUG91Y2hlc1swXSkgPT0gYWN0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdG9yID09IFdvcmxkU3RhdGUucGxheWVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24uc2F5LmFkZChcIllvdSBjYW4ndCBnZXQgcmlkIG9mIHlvdXIgXCIsIGFjdG9yUG91Y2hlc1swXSwgXCIhXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbmRpdGlvbnMgOiAocnVsZWJvb2sgOiBSdWxlYm9va1J1bm5lcjxBY3Rpb25UYWtlPikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gKCg8QWN0aW9uVGFrZT4gcnVsZWJvb2subm91bikuZ2V0Tm91bigwKSBpbnN0YW5jZW9mIENvaW5Qb3VjaCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn1cclxuXHJcbkFjdGlvblRha2UuY2FycnkuYWRkUnVsZShDb2luUG91Y2guY2FycnlPdXRUYWtpbmdDb2luUG91Y2hlcyk7XHJcblxyXG5TYXkuYWZ0ZXJQcmludGluZy5hZGRSdWxlKG5ldyBSdWxlKFxyXG4gICAge1xyXG4gICAgICAgIG5hbWUgOiBcIkluY2x1ZGUgY29udGVudHMgb2YgQ29pbiBQb3VjaCB3aGlsZSBQcmludGluZyBWaXNpYmxlIFRoaW5ncyBpbiBhIFJvb21cIixcclxuICAgICAgICBjb2RlIDogKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8U2F5PikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgc2F5ID0gPFNheT4gcnVsZWJvb2subm91bjtcclxuICAgICAgICAgICAgbGV0IHBvdWNoID0gPENvaW5Qb3VjaD4gc2F5LmN1cnJlbnROb3VuO1xyXG4gICAgICAgICAgICBzYXkuY3VycmVudE5vdW5FbGVtZW50cy5wdXNoKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiIHdpdGggXCIgKyBwb3VjaC5nZXRDb2lucygpLnRvU3RyaW5nKCkgKyBcIiBjb2luc1wiKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb25kaXRpb25zIDogKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8U2F5PikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gRWxlbWVudHMuUm9vbUhhbmRsZXIuUHJpbnRpbmdWaXNpYmxlVGhpbmdzUnVsZWJvb2suaXNSdW5uaW5nKClcclxuICAgICAgICAgICAgICAgICYmICg8U2F5PiBydWxlYm9vay5ub3VuKS5jdXJyZW50Tm91biBpbnN0YW5jZW9mIENvaW5Qb3VjaFxyXG4gICAgICAgICAgICAgICAgJiYgKDxDb2luUG91Y2g+ICg8U2F5PiBydWxlYm9vay5ub3VuKS5jdXJyZW50Tm91bikuZ2V0Q29pbnMoKSA+IDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4pKTtcclxuXHJcbkFjdGlvbkV4YW1pbmUuY2FycnkuYWRkUnVsZShuZXcgUnVsZSh7XHJcbiAgICBuYW1lIDogXCJQcmludCBkZXNjcmlwdGlvbiBvZiBjb2lucyBpbiBDb2luIFBvdWNoXCIsXHJcbiAgICBmaXJzdFByaW9yaXR5IDogQWN0aW9uRXhhbWluZS5QcmludERlc2NyaXB0aW9uT2ZFeGFtaW5lZFRoaW5nUnVsZS5maXJzdFByaW9yaXR5LFxyXG4gICAgcHJpb3JpdHkgOiBBY3Rpb25FeGFtaW5lLlByaW50RGVzY3JpcHRpb25PZkV4YW1pbmVkVGhpbmdSdWxlLnByaW9yaXR5IC0gMSxcclxuICAgIGNvZGUgOiAocnVsZWJvb2sgOiBSdWxlYm9va1J1bm5lcjxBY3Rpb25FeGFtaW5lPikgPT4ge1xyXG4gICAgICAgIGxldCBhY3Rpb24gPSA8QWN0aW9uRXhhbWluZT4gcnVsZWJvb2subm91bjtcclxuICAgICAgICBsZXQgdGhpbmcgPSA8Q29pblBvdWNoPiBhY3Rpb24uZ2V0Tm91bigwKTtcclxuICAgICAgICBpZiAodGhpbmcuZ2V0Q29pbnMoKSA+IDApIHtcclxuICAgICAgICAgICAgYWN0aW9uLnNheS5hZGQoXCIgVGhlcmUgYXJlIFwiICsgdGhpbmcuZ2V0Q29pbnMoKS50b1N0cmluZygpICsgXCIgY29pbnMgaW4gaXQuXCIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGFjdGlvbi5zYXkuYWRkKFwiIFRoZXJlIGFyZSBubyBjb2lucyBpbiBpdC5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIGNvbmRpdGlvbnMgOiAocnVsZWJvb2sgOiBSdWxlYm9va1J1bm5lcjxBY3Rpb25FeGFtaW5lPikgPT4ge1xyXG4gICAgICAgIHJldHVybiAoKDxBY3Rpb25FeGFtaW5lPiBydWxlYm9vay5ub3VuKS5nZXROb3VuKDApIGluc3RhbmNlb2YgQ29pblBvdWNoKTtcclxuICAgIH1cclxufSkpOyIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9FbGVtZW50cy50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9Xb3JsZC9DbGFzc2VzL1J1bGVib29rLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL1dvcmxkL0NsYXNzZXMvUnVsZS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9Xb3JsZC9DbGFzc2VzL0FjdGlvbi9BY3Rpb25FeGFtaW5lLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL1dvcmxkL0NsYXNzZXMvVGhpbmdzL0NvaW5Qb3VjaC50c1wiIC8+XHJcbm1vZHVsZSBFbGVtZW50cy5JbnZlbnRvcnlIYW5kbGVyIHtcclxuICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImludmVudG9yeVRhcmdldFwiKTtcclxuXHJcbiAgICBmdW5jdGlvbiBlbXB0eSAoKSB7XHJcbiAgICAgICAgd2hpbGUgKGNvbnRhaW5lci5maXJzdENoaWxkKSB7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjb250YWluZXIuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHByaW50SGVhZGVyIChoZWFkZXIgOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwXCIpO1xyXG4gICAgICAgIHAuY2xhc3NMaXN0LmFkZChcImludmVudG9yeUhlYWRlclwiKTtcclxuICAgICAgICBwLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGhlYWRlciArIFwiOlwiKSk7XHJcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHApO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBjdXJyZW50Um93IDogSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgZXhwb3J0IGxldCBMaW5raW5nVGhpbmcgPSBuZXcgUnVsZWJvb2s8VGhpbmc+KFwiSW52ZW50b3J5IC0gTGlua3MgZm9yIGEgVGhpbmdcIik7XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHByaW50VGhpbmdMaW5rIChzaG9ydGN1dCA6IHN0cmluZywgYWN0aW9uIDogQWN0aW9uKSB7XHJcbiAgICAgICAgbGV0IG5hbWVMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBuYW1lTGluay5jbGFzc0xpc3QuYWRkKFwiaW52ZW50b3J5TGlua1wiKTtcclxuICAgICAgICBuYW1lTGluay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzaG9ydGN1dCkpO1xyXG4gICAgICAgIGN1cnJlbnRSb3cuYXBwZW5kQ2hpbGQobmFtZUxpbmspO1xyXG5cclxuICAgICAgICBDb250cm9scy5MaW5rcy5tYWtlTGluayhuYW1lTGluaywgYWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBmdW5jdGlvbiBwcmludFRoaW5nICh0aGluZyA6IFRoaW5nKSB7XHJcbiAgICAgICAgY3VycmVudFJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgY3VycmVudFJvdy5jbGFzc0xpc3QuYWRkKFwiaW52ZW50b3J5Um93XCIpO1xyXG5cclxuICAgICAgICBsZXQgbmFtZUxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIG5hbWVMaW5rLmNsYXNzTGlzdC5hZGQoXCJpbnZlbnRvcnlMaW5rXCIsIFwibmFtZVwiKTtcclxuICAgICAgICBuYW1lTGluay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGluZy5nZXRQcmludGVkTmFtZSgpKSk7XHJcbiAgICAgICAgY3VycmVudFJvdy5hcHBlbmRDaGlsZChuYW1lTGluayk7XHJcblxyXG4gICAgICAgIENvbnRyb2xzLkxpbmtzLm1ha2VMaW5rKG5hbWVMaW5rLCBuZXcgQWN0aW9uRXhhbWluZShXb3JsZFN0YXRlLnBsYXllciwgdGhpbmcpKTtcclxuXHJcbiAgICAgICAgYXdhaXQgTGlua2luZ1RoaW5nLmV4ZWN1dGUoe25vdW4gOiB0aGluZ30pO1xyXG5cclxuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY3VycmVudFJvdyk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHRoaW5nU29ydCAoYSA6IFRoaW5nLCBiIDogVGhpbmcpIHtcclxuICAgICAgICBsZXQgbmEgPSBhLmdldFByaW50ZWROYW1lKCkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBsZXQgbmIgPSBiLmdldFByaW50ZWROYW1lKCkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBpZiAobmEgPCBuYikgcmV0dXJuIC0xO1xyXG4gICAgICAgIGlmIChuYSA+IG5iKSByZXR1cm4gMTtcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlSW52ZW50b3J5ICgpIHtcclxuICAgICAgICBsZXQgcGxheWVyID0gV29ybGRTdGF0ZS5wbGF5ZXI7XHJcblxyXG4gICAgICAgIGVtcHR5KCk7XHJcblxyXG4gICAgICAgIGxldCB3aWVsZGVkID0gVGhpbmcuV2llbGRSZWxhdGlvbi5nZXRSaWdodChwbGF5ZXIpLnNvcnQodGhpbmdTb3J0KTtcclxuICAgICAgICBsZXQgd29ybiA9IFRoaW5nLldlYXJSZWxhdGlvbi5nZXRSaWdodChwbGF5ZXIpLnNvcnQodGhpbmdTb3J0KTtcclxuICAgICAgICBsZXQgY2FycmllZCA9IFRoaW5nLkNhcnJ5UmVsYXRpb24uZ2V0UmlnaHQocGxheWVyKS5zb3J0KHRoaW5nU29ydCk7XHJcblxyXG4gICAgICAgIGlmICh3aWVsZGVkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcHJpbnRIZWFkZXIoXCJXaWVsZGVkXCIpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdpZWxkZWQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHByaW50VGhpbmcod2llbGRlZFtpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh3b3JuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcHJpbnRIZWFkZXIoXCJXb3JuXCIpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdvcm4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHByaW50VGhpbmcod29ybltpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjYXJyaWVkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcHJpbnRIZWFkZXIoXCJDYXJyaWVkXCIpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhcnJpZWQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHByaW50VGhpbmcoY2FycmllZFtpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBwb3VjaCA9IDxBcnJheTxDb2luUG91Y2g+PiBUaGluZy5DYXJyeVJlbGF0aW9uLmdldFJpZ2h0VHlwZShXb3JsZFN0YXRlLnBsYXllciwgQ29pblBvdWNoKTtcclxuICAgICAgICBpZiAocG91Y2gubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwXCIpO1xyXG4gICAgICAgICAgICBwLmNsYXNzTGlzdC5hZGQoXCJpbnZlbnRvcnlHb2xkXCIpO1xyXG4gICAgICAgICAgICBsZXQgcyA6IFNheTtcclxuICAgICAgICAgICAgaWYgKHBvdWNoWzBdLmdldENvaW5zKCkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBzID0gbmV3IFNheShcIlRoZXJlIGFyZSBcIiArIHBvdWNoWzBdLmdldENvaW5zKCkudG9TdHJpbmcoKSArIFwiIGNvaW5zIGluIHlvdXIgXCIsIHBvdWNoWzBdLCBcIi5cIik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzID0gbmV3IFNheShcIlRoZXJlIGFyZSBubyBjb2lucyBpbiB5b3VyIFwiLCBwb3VjaFswXSwgXCIuXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IHMuZ2V0UHVyZUVsZW1lbnRzKCkudGhlbihlbGVtZW50cyA9PiB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHAuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQWN0aW9uLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1J1bGUudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vUnVsZWJvb2sudHNcIiAvPlxyXG5cclxuY2xhc3MgQWN0aW9uUmV0cmFjZSBleHRlbmRzIEFjdGlvbiB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGNoZWNrID0gbmV3IFJ1bGVib29rPEFjdGlvblJldHJhY2U+KFwiQ2hlY2sgUmV0cmFjaW5nXCIpO1xyXG4gICAgcHVibGljIHN0YXRpYyBjYXJyeSA9IG5ldyBSdWxlYm9vazxBY3Rpb25SZXRyYWNlPihcIkNhcnJ5IG91dCBSZXRyYWNpbmdcIik7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChhY3RvciA6IFRoaW5nLCAuLi5ub3VucyA6IEFycmF5PGFueT4pIHtcclxuICAgICAgICBzdXBlcihhY3RvciwgLi4ubm91bnMpO1xyXG4gICAgICAgIHRoaXMucmVxdWlyZXNOb3VuID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5yZXF1aXJlc1Zpc2liaWxpdHkgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnJlcXVpcmVzVHVybiA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTmVlZHMgdG8gcmV0dXJuIGEgc3RyaW5nIGV4cGxhaW5pbmcgd2hhdCB0aGUgcGxheWVyIHdpbGwgZG8gaWYgaGUgZG9lcyB0aGlzIGFjdGlvbi5cclxuICAgICAqIEZvciBpbnN0YW5jZSwgQWN0aW9uVGFraW5nIHNob3VsZCByZXR1cm4gc29tZXRoaW5nIGxpa2UgcmV0dXJuIFwidGFrZSBcIiArIHRoaXMubm91bnNbMF0uZ2V0TmFtZSgpLFxyXG4gICAgICogICB3aGljaCB3b3VsZCByZWFkIGFzIFwidGFrZSB0aGluZ1wiLlxyXG4gICAgICogICByZW1lbWJlciB0aGF0IHRoaW5ncyBpbXBsZW1lbnQgUFJJTlRBQkxFIGludGVyZmFjZSwgc28geW91IGNhbiBnZXQgdGhlaXIgbmFtZXMuXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q29tbWFuZFRleHQgKCkge1xyXG4gICAgICAgIGxldCBuYW1lO1xyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5nZXROb3VuKDApID09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICAgICAgbmFtZSA9IERpcmVjdGlvbk5hbWVzW0RpcmVjdGlvblt0aGlzLmdldE5vdW4oMCldXTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0Tm91bigwKSBpbnN0YW5jZW9mIFJvb20pIHtcclxuICAgICAgICAgICAgbmFtZSA9ICg8Um9vbT4gdGhpcy5nZXROb3VuKDApKS5nZXRQcmludGVkTmFtZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gXCJ0aGluayBhYm91dCBob3cgdG8gZ2V0IHRvIFwiICsgbmFtZTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbkFjdGlvblJldHJhY2UuY2hlY2suYWRkUnVsZShuZXcgUnVsZSh7XHJcbiAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9ISUdIRVNULFxyXG4gICAgcHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0hJR0gsXHJcbiAgICBuYW1lIDogXCJDaGFuZ2UgUm9vbSB0byBEaXJlY3Rpb25cIixcclxuICAgIGNvZGUgOiAocnVsZWJvb2sgOiBSdWxlYm9va1J1bm5lcjxBY3Rpb25SZXRyYWNlPikgPT4ge1xyXG4gICAgICAgIGxldCBhY3Rpb24gPSA8QWN0aW9uR28+IHJ1bGVib29rLm5vdW47XHJcblxyXG4gICAgICAgIC8vIFNvbWVvbmUgYXNrZWQgZm9yIGEgcm9vbS4uLlxyXG4gICAgICAgIGlmIChhY3Rpb24uZ2V0Tm91bigwKSBpbnN0YW5jZW9mIFJvb20pIHtcclxuICAgICAgICAgICAgbGV0IGFjdG9yID0gYWN0aW9uLmFjdG9yO1xyXG4gICAgICAgICAgICBsZXQgY1Jvb20gPSBhY3Rvci5nZXRSb29tKCk7XHJcbiAgICAgICAgICAgIGlmIChjUm9vbSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgZFJvb20gPSBhY3Rpb24uZ2V0Tm91bigwKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjUm9vbSA9PSBkUm9vbSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFjdG9yLmlzUGxheWVyKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb24uc2F5LmFkZChcIllvdSBhcmUgYWxyZWFkeSB0aGVyZSFcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBjb2RlO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFjdG9yID09IFdvcmxkU3RhdGUucGxheWVyKSB7XHJcbiAgICAgICAgICAgICAgICBjb2RlID0gKHJvb20gOiBSb29tKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdvcmxkU3RhdGUuaXNSb29tUmVtZW1iZXJlZChyb29tKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGRpcmVjdGlvbiA9IGNSb29tLmJlc3REaXJlY3Rpb25UbyhkUm9vbSwgY29kZSk7XHJcbiAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWN0b3IuaXNQbGF5ZXIoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbi5zYXkuYWRkKFwiWW91IGRvbid0IHJlbWVtYmVyIGhvdyB0byBnZXQgdGhlcmUuXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uLnNldE5vdW4oMCwgZGlyZWN0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufSkpO1xyXG5cclxuQWN0aW9uUmV0cmFjZS5jYXJyeS5hZGRSdWxlKG5ldyBSdWxlKHtcclxuICAgIG5hbWUgOiBcIlJldHJhY2luZyAtIEZpbmQgRGlyZWN0aW9uXCIsXHJcbiAgICBjb2RlIDogKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8QWN0aW9uUmV0cmFjZT4pID0+IHtcclxuICAgICAgICBsZXQgYWN0aW9uID0gPEFjdGlvblJldHJhY2U+IHJ1bGVib29rLm5vdW47XHJcblxyXG4gICAgICAgIGFjdGlvbi5zYXkuYWRkKFwiVG8gZ2V0IHRoZXJlLCB5b3Ugc2hvdWxkIGdvIFwiICsgRGlyZWN0aW9uTmFtZXNbRGlyZWN0aW9uW2FjdGlvbi5nZXROb3VuKDApXV0gKyBcIi5cIik7XHJcbiAgICB9XHJcbn0pKTtcclxuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL1dvcmxkL0NsYXNzZXMvQWN0aW9uL0FjdGlvblJldHJhY2UudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vV29ybGQvQ2xhc3Nlcy9BY3Rpb24vQWN0aW9uR28udHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vQ29udHJvbHMvTW9kdWxlcy9MaW5rcy50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9FbGVtZW50cy50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJIb3ZlckluZm8udHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQ2xhc3Nlcy9Sb29tTm9kZS50c1wiIC8+XHJcbm1vZHVsZSBFbGVtZW50cy5SZW1lbWJlcmVkSGFuZGxlciB7XHJcbiAgICAvL3ZhciB0YXJnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlbWVtYmVyZWRSb29tc1RhcmdldFwiKTtcclxuICAgIHZhciBtYXBUYXJnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1hcFRhcmdldFwiKTtcclxuICAgIHZhciBsYXN0TWFwIDogUm9vbVJhbmRvbU1hcDtcclxuICAgIHZhciBlbGVtZW50cyA6IHsgW3h5IDogc3RyaW5nXSA6IFJvb21Ob2RlfTtcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZW1wdHkgKCkge1xyXG4gICAgICAgIC8vIHdoaWxlICh0YXJnZXQuZmlyc3RDaGlsZCkge1xyXG4gICAgICAgIC8vICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQodGFyZ2V0LmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgZWxlbWVudHMgPSB7fTtcclxuICAgICAgICBsYXN0TWFwID0gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICB3aGlsZSAobWFwVGFyZ2V0LmZpcnN0Q2hpbGQpIHtcclxuICAgICAgICAgICAgbWFwVGFyZ2V0LnJlbW92ZUNoaWxkKG1hcFRhcmdldC5maXJzdENoaWxkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZU1hcCAoKSB7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhSdWxlYm9vay5nZXRJbmRlbnRhdGlvbigpICsgXCJbTUFQXSBDcmVhdGluZyBNYXBcIik7XHJcblxyXG4gICAgICAgIGxldCByZWdpb25zID0gUmVnaW9uLkluUmVsYXRpb24uZ2V0QWxsTGVmdFR5cGUoV29ybGRTdGF0ZS5wbGF5ZXIuZ2V0Um9vbSgpLCBSZWdpb25SYW5kb20pO1xyXG4gICAgICAgIGxldCBiaWdnZXN0UmVnaW9uID0gPFJlZ2lvblJhbmRvbT4gcmVnaW9uc1tyZWdpb25zLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgIGlmIChiaWdnZXN0UmVnaW9uID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBlbXB0eSgpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYmlnZ2VzdFJlZ2lvbi5tYXAgIT0gbGFzdE1hcCkge1xyXG4gICAgICAgICAgICBlbXB0eSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHVwZGF0ZU9sZE1hcCgpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgbWFwID0gYmlnZ2VzdFJlZ2lvbi5tYXA7XHJcbiAgICAgICAgbGFzdE1hcCA9IG1hcDtcclxuXHJcbiAgICAgICAgbWFwLnVwZGF0ZUFsbExpbWl0cygpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCB5ID0gbWFwLmhpZ2hlc3RZOyB5ID49IG1hcC5sb3dlc3RZOyB5LS0pIHtcclxuICAgICAgICAgICAgbGV0IHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgICAgIHJvdy5jbGFzc0xpc3QuYWRkKFwibWFwUm93XCIpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCB4ID0gbWFwLmxvd2VzdFg7IHggPD0gbWFwLmhpZ2hlc3RYOyB4KyspIHtcclxuICAgICAgICAgICAgICAgIGxldCByb29tID0gbWFwLmdldFJvb20oeCwgeSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgcm9vbU5vZGUgPSBuZXcgUm9vbU5vZGUocm9vbSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCByb29tTm9kZS5jcmVhdGVSb29tTmFtZUZsb2F0ZXIoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgcm9vbURpdiA9IHJvb21Ob2RlLmdldEVsZW1lbnQoKTtcclxuICAgICAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChyb29tRGl2KTtcclxuXHJcbiAgICAgICAgICAgICAgICBlbGVtZW50c1t4LnRvU3RyaW5nKCkgKyBcIjtcIiArIHkudG9TdHJpbmcoKV0gPSByb29tTm9kZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBtYXBUYXJnZXQuYXBwZW5kQ2hpbGQocm93KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGF3YWl0IHVwZGF0ZU9sZE1hcCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVPbGRNYXAgKCkge1xyXG4gICAgICAgIGxldCBtYXAgPSBsYXN0TWFwO1xyXG4gICAgICAgIGZvciAobGV0IHkgPSBtYXAuaGlnaGVzdFk7IHkgPj0gbWFwLmxvd2VzdFk7IHktLSkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCB4ID0gbWFwLmxvd2VzdFg7IHggPD0gbWFwLmhpZ2hlc3RYOyB4KyspIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGVsZW1lbnRzW3gudG9TdHJpbmcoKSArIFwiO1wiICsgeS50b1N0cmluZygpXS51cGRhdGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsIi8vIC8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9FbGVtZW50cy50c1wiIC8+XHJcbi8vIG1vZHVsZSBFbGVtZW50cy5TdGF0dXNMaW5lSGFuZGxlciB7XHJcbi8vICAgICB2YXIgc3RhdHVzTGluZUZsZXggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInN0YXR1c0xpbmVGbGV4XCIpO1xyXG4vLyAgICAgdmFyIHN0YXJ0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzdGF0dXNMaW5lU3RhcnRcIik7XHJcbi8vICAgICB2YXIgZW5kID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzdGF0dXNMaW5lRW5kXCIpO1xyXG4vLyAgICAgZW5kLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuLy9cclxuLy8gICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEaXZpZGVyICgpIHtcclxuLy8gICAgICAgICAvLyAubm9zaHJpbmtGbGV4LnN0YXR1c0NvbHVtbkRpdmlkZXJcclxuLy8gICAgICAgICBsZXQgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuLy8gICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZChcIm5vc2hyaW5rRmxleFwiLCBcInN0YXR1c0NvbHVtbkRpdmlkZXJcIik7XHJcbi8vICAgICAgICAgcmV0dXJuIGRpdjtcclxuLy8gICAgIH1cclxuLy9cclxuLy8gICAgIGV4cG9ydCBmdW5jdGlvbiBwcmludCAoLi4uZWxlcyA6IEFycmF5PE5vZGU+KSB7XHJcbi8vICAgICAgICAgZm9yIChsZXQgZWxlIG9mIGVsZXMpIHtcclxuLy8gICAgICAgICAgICAgc3RhdHVzTGluZUZsZXguaW5zZXJ0QmVmb3JlKGVsZSwgZW5kKTtcclxuLy8gICAgICAgICB9XHJcbi8vICAgICB9XHJcbi8vXHJcbi8vICAgICBmdW5jdGlvbiBlbXB0eSAoKSB7XHJcbi8vICAgICAgICAgd2hpbGUgKHN0YXJ0Lm5leHRTaWJsaW5nICE9IGVuZCkge1xyXG4vLyAgICAgICAgICAgICBzdGF0dXNMaW5lRmxleC5yZW1vdmVDaGlsZChzdGFydC5uZXh0U2libGluZyk7XHJcbi8vICAgICAgICAgfVxyXG4vLyAgICAgfVxyXG4vL1xyXG4vLyAgICAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVN0YXR1c0xpbmUgKCkge1xyXG4vLyAgICAgICAgIGVtcHR5KCk7XHJcbi8vXHJcbi8vICAgICAgICAgbGV0IHNheSA9IG5ldyBTYXkoKDxIdW1hbm9pZD4gV29ybGRTdGF0ZS5wbGF5ZXIpLmdldFNob3J0ZXN0RGVzY3JpcHRpb24oKSk7XHJcbi8vXHJcbi8vICAgICAgICAgKGF3YWl0IHNheS5nZXRQdXJlRWxlbWVudHMoKSkuZm9yRWFjaCgoZWxlKSA9PiB7XHJcbi8vICAgICAgICAgICAgIHByaW50KGVsZSwgY3JlYXRlRGl2aWRlcigpKTtcclxuLy8gICAgICAgICB9KTtcclxuLy8gICAgIH1cclxuLy8gfSIsIm1vZHVsZSBEZWJ1ZyB7XHJcbiAgICBleHBvcnQgZnVuY3Rpb24ga25vd2Rld2FlICgpIHtcclxuICAgICAgICBsZXQgbWFwID0gbmV3IE1hcE5vdGUoe1xyXG4gICAgICAgICAgICBuYW1lIDogXCJEZSBXYWVcIixcclxuICAgICAgICAgICAgZGVzY3JpcHRpb24gOiBcIlRoaXMgbWFwIHNob3dzIGRlIHdhZSBhbGwgZGUgd2FlIHRvIFppbWJhYndlLlwiXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbWFwLmFkZFJvb20oLi4uUmVnaW9uLlJlZ2lvblJvb20uZ2V0QW55UmlnaHRUeXBlKFJvb21SYW5kb20pKTtcclxuICAgICAgICBXb3JsZFN0YXRlLnBsYXllci5zZXRDYXJyaWVkKG1hcCk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGh1cnQgKHRhcmdldCA6IFBlcnNvbiB8IEJvZHlwYXJ0LCBhbW91bnQgOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgYnAgOiBCb2R5cGFydDtcclxuICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgUGVyc29uKSB7XHJcbiAgICAgICAgICAgIGJwID0gdGFyZ2V0LmdldFBhcnQoSHVtYW5vaWRUb3Jzbyk7XHJcbiAgICAgICAgICAgIGlmIChicCA9PSB1bmRlZmluZWQpIHJldHVybjtcclxuICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEJvZHlwYXJ0KSB7XHJcbiAgICAgICAgICAgIGJwID0gdGFyZ2V0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBicC5jaGFuZ2VTb3JlbmVzcyhhbW91bnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnb1RvIChzdHIgOiBzdHJpbmcpIHtcclxuICAgICAgICAvLyBsZXQgdGhpbmcgPSBUaGluZy5nZXRPbmVUaGluZyhzdHIpO1xyXG4gICAgICAgIC8vIGxldCByb29tIDogUm9vbTtcclxuICAgICAgICAvLyBpZiAodGhpbmcgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgLy8gICAgIHJvb20gPSB0aGluZy5nZXRSb29tKCk7XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJSdWxlYm9vay50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJSdWxlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0V2ZXJ5VHVybi50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9GdW5jdGlvbnMudHNcIiAvPlxyXG5cclxuaW50ZXJmYWNlIEFJT3B0aW9ucyB7XHJcbiAgICB3YW5kZXJlcj8gOiBib29sZWFuLFxyXG4gICAgd2FuZGVyc09uPyA6IFJlZ2lvbixcclxuICAgIHBpY2tzU2hpbmllcz8gOiBib29sZWFuXHJcbn1cclxuXHJcbmNsYXNzIEFJIHtcclxuICAgIHB1YmxpYyB3YW5kZXJlciA9IHRydWU7XHJcbiAgICBwdWJsaWMgd2FuZGVyc09uIDogUmVnaW9uO1xyXG4gICAgcHVibGljIHdhbmRlckNoYW5jZSA9IDUwO1xyXG4gICAgcHVibGljIHBpY2tzU2hpbmllcyA9IHRydWU7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChvcHRpb25zIDogQUlPcHRpb25zKSB7XHJcbiAgICAgICAgZm9yIChsZXQga2V5IGluIG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgdGhpc1trZXldID0gb3B0aW9uc1trZXldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEV4ZWN1dGluZyBhbiBBSSByZXR1cm5zIGFuIEFjdGlvbi4gRE9FU04nVCBleGVjdXRlIHRoZSBhY3Rpb24sIGp1c3QgZmluZHMgaXQhXHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBY3Rpb24+fVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZXhlY3V0ZSAoYWN0b3IgOiBUaGluZykgOiBQcm9taXNlPEFjdGlvbj4ge1xyXG4gICAgICAgIGxldCBwcm9taXNlIDogUHJvbWlzZTxBY3Rpb24+O1xyXG4gICAgICAgIC8vIFRPRE86IGlmIGFjdG9yLmlzSW5Db21iYXQoKTtcclxuICAgICAgICBpZiAocHJvbWlzZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcHJvbWlzZSA9IEFJLmNvbWJhdFJ1bGVzLmV4ZWN1dGUoe1xyXG4gICAgICAgICAgICAgICAgbm91biA6IGFjdG9yXHJcbiAgICAgICAgICAgIH0sIC4uLnRoaXMuZXh0cmFDb21iYXRSdWxlcyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcHJvbWlzZSA9IEFJLnJ1bGVzLmV4ZWN1dGUoe1xyXG4gICAgICAgICAgICAgICAgbm91biA6IGFjdG9yXHJcbiAgICAgICAgICAgIH0sIC4uLnRoaXMuZXh0cmFSdWxlcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcmVzdWx0IDogQWN0aW9uID0gYXdhaXQgcHJvbWlzZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkUnVsZXNCb29rICguLi5ib29rcyA6IEFycmF5PFJ1bGVib29rPFRoaW5nPj4pIHtcclxuICAgICAgICB0aGlzLmV4dHJhUnVsZXMucHVzaCguLi5ib29rcylcclxuICAgICAgICBhcnJheVVuaXF1ZSh0aGlzLmV4dHJhUnVsZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRDb21iYXRSdWxlc0Jvb2sgKC4uLmJvb2tzIDogQXJyYXk8UnVsZWJvb2s8VGhpbmc+Pikge1xyXG4gICAgICAgIHRoaXMuZXh0cmFDb21iYXRSdWxlcy5wdXNoKC4uLmJvb2tzKVxyXG4gICAgICAgIGFycmF5VW5pcXVlKHRoaXMuZXh0cmFDb21iYXRSdWxlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBydWxlcyA9IG5ldyBSdWxlYm9vazxUaGluZz4oXCJEZWZhdWx0IEFJIFJ1bGVzXCIpO1xyXG4gICAgcHVibGljIGV4dHJhUnVsZXMgOiBBcnJheTxSdWxlYm9vazxUaGluZz4+ID0gW107XHJcbiAgICBwdWJsaWMgc3RhdGljIGNvbWJhdFJ1bGVzID0gbmV3IFJ1bGVib29rPFRoaW5nPihcIkRlZmF1bHQgQUkgQ29tYmF0IFJ1bGVzXCIpO1xyXG4gICAgcHVibGljIGV4dHJhQ29tYmF0UnVsZXMgOiBBcnJheTxSdWxlYm9vazxUaGluZz4+ID0gW107XHJcbn1cclxuXHJcbm1vZHVsZSBBSVJ1bGVzIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpcyBvciBiZWhhdmlvcmFsIHJ1bGVzIHJlZ2FyZGluZyBzb21ldGhpbmcgdGhhdCBpcyBoYXBwZW5pbmcgUklHSFQgTk9XLlxyXG4gICAgICogaS5lLiBSdWxlIGZvciB3aGF0IGEgbW9uc3RlciBkb2VzIHdoZW4gdGhlIHBsYXllciBoYXMganVzdCBpbnN1bHRlZCB0aGVtLCBvciBmb3Igd2hlbiB0aGUgcGxheWVyIHRyaWdnZXJzIGFuIGFsYXJtLCBldGMuXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXHJcbiAgICBleHBvcnQgdmFyIFBSSU9SSVRZX0FDVElOR19PTl9TSVRVQVRJT04gPSA1O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpcyBmb3IgYmVoYXZpb3JhbCBydWxlcyBhYm91dCB3aGF0IHRoZSBOUEMgU0VFUy5cclxuICAgICAqIGkuZS4gSXMgdGhlcmUgYSBzaGlueSBvbiB0aGUgZ3JvdW5kIGZvciBtZSB0byB0YWtlPyBEbyBJIHNlZSB0aGUgcGxheWVyIGFuZCBpZiBzbyBob3cgZG8gSSBmZWVsIGFib3V0IGl0P1xyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xyXG4gICAgZXhwb3J0IHZhciBQUklPUklUWV9BQ1RJTkdfT05fUExBQ0UgPSAzO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpcyBmb3IgcnVsZXMgZm9yIHdoZW4gdGhlIE5QQyBoYXMgbm90aGluZyBiZXR0ZXIgdG8gZG8uXHJcbiAgICAgKiBpLmUuIFN0YW5kYXJkIGd1YXJkaW5nIHJvdXRlcywgZXRjLlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xyXG4gICAgZXhwb3J0IHZhciBQUklPUklUWV9BQ1RJTkdfT05fSURMRSA9IDE7XHJcbn0iLCJjbGFzcyBQZXJzb25TdGF0IHtcclxuICAgIHB1YmxpYyBpZCA6IHN0cmluZztcclxuICAgIHByb3RlY3RlZCBkZXNjcmlwdGlvbiA6IHN0cmluZyB8IFNheSB8ICgodmFsdWUgOiBudW1iZXIpID0+IHN0cmluZyB8IFNheSk7XHJcbiAgICBwdWJsaWMgZGVmYXVsdFZhbHVlIDogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBtYXhWYWx1ZSA6IG51bWJlciA9IDEwO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoaWQgOiBzdHJpbmcsIGRlc2NyaXB0aW9uPyA6IHN0cmluZyB8IFNheSB8ICgodmFsdWUgOiBudW1iZXIpID0+IHN0cmluZyB8IFNheSkpIHtcclxuICAgICAgICB0aGlzLmlkID0gaWQ7XHJcbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uID09IHVuZGVmaW5lZCA/IFwiTm90IGRlZmluZWRcIiA6IGRlc2NyaXB0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXREZXNjcmlwdGlvbiAodmFsdWUgOiBudW1iZXIpIDogU2F5IHwgc3RyaW5nIHwgKCh2YWx1ZSA6IG51bWJlcikgPT4gKHN0cmluZyB8IFNheSkpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZGVzY3JpcHRpb24gPT0gXCJzdHJpbmdcIiB8fCB0aGlzLmRlc2NyaXB0aW9uIGluc3RhbmNlb2YgU2F5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uKHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiUGVyc29uU3RhdC50c1wiIC8+XHJcbmludGVyZmFjZSBBdHRyaWJ1dGVCZWFyZXIge1xyXG4gICAgZ2V0U3RhdCAoYXR0ciA6IEF0dHJpYnV0ZSkgOiBudW1iZXI7XHJcbiAgICBzZXRTdGF0IChhdHRyIDogQXR0cmlidXRlLCB2YWx1ZSA6IG51bWJlcikgOiB2b2lkO1xyXG59XHJcblxyXG5jbGFzcyBBdHRyaWJ1dGUgZXh0ZW5kcyBQZXJzb25TdGF0IHtcclxuICAgIHB1YmxpYyBkZWZhdWx0VmFsdWUgOiBudW1iZXIgPSAyO1xyXG4gICAgcHVibGljIG1heFZhbHVlIDogbnVtYmVyID0gNTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKGlkIDogc3RyaW5nLCBkZXNjcmlwdGlvbj8gOiBzdHJpbmcgfCBTYXkgfCAoKHZhbHVlIDogbnVtYmVyKSA9PiBzdHJpbmcgfCBTYXkpLCBkZWZWYWx1ZT8gOm51bWJlciwgbWF4VmFsdWU/Om51bWJlcikge1xyXG4gICAgICAgIHN1cGVyKGlkLCBkZXNjcmlwdGlvbik7XHJcbiAgICAgICAgaWYgKGRlZlZhbHVlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZlZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG1heFZhbHVlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heFZhbHVlID0gbWF4VmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBBdHRyaWJ1dGUuQXR0cmlidXRlc1tpZF0gPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIEF0dHJpYnV0ZXMgOiB7W2lkIDogc3RyaW5nXSA6IEF0dHJpYnV0ZX0gPSB7fTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEF0dHJpYnV0ZXMgKCkge1xyXG4gICAgICAgIGxldCBhdHRyaWJ1dGVzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQga2V5IGluIEF0dHJpYnV0ZS5BdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgIGF0dHJpYnV0ZXMucHVzaChBdHRyaWJ1dGUuQXR0cmlidXRlc1trZXldKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRBdHRyaWJ1dGUgKGlkIDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZS5BdHRyaWJ1dGVzW2lkXTtcclxuICAgIH1cclxufVxyXG5cclxubW9kdWxlIEF0dHJpYnV0ZXMge1xyXG4gICAgZXhwb3J0IGxldCBTdHJlbmd0aCA9IG5ldyBBdHRyaWJ1dGUoXHJcbiAgICAgICAgXCJTdHJlbmd0aFwiLFxyXG4gICAgICAgIHZhbHVlID0+IHtcclxuICAgICAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gXCJIZXJjdWxlcycgQmlnZ2VyIENvdXNpblwiO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gKFwiQ2lyY3VzIFN0cm9uZ1wiICsgKCg8SHVtYW5vaWQ+IFdvcmxkU3RhdGUucGxheWVyKS5pc01hbGUoKSA/IFwibWFuXCIgOiBcIndvbWFuXCIpKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFwiQmVhY2ggQnVsbHlcIjtcclxuICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIChcIkF2ZXJhZ2UgXCIgKyAoKDxIdW1hbm9pZD4gV29ybGRTdGF0ZS5wbGF5ZXIpLmlzTWFsZSgpID8gXCJKb2VcIiA6IFwiSmFuZVwiKSk7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBcIldldCBOb29kbGVcIjtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBcIk91dCBvZiBib3VuZHMuXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICApO1xyXG4gICAgZXhwb3J0IGxldCBBZ2lsaXR5ID0gbmV3IEF0dHJpYnV0ZShcclxuICAgICAgICBcIkFnaWxpdHlcIixcclxuICAgICAgICB2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFwiQ2F0bGlrZVwiO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gXCJHeW1uYXN0XCI7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBcIkFjY3VyYXRlXCI7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBcIkNvbW1vblwiO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gXCJBY2NpZGVudC1wcm9uZVwiO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIFwiT3V0IG9mIGJvdW5kcy5cIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgZXhwb3J0IGxldCBJbnRlbGxpZ2VuY2UgPSBuZXcgQXR0cmlidXRlKFxyXG4gICAgICAgIFwiSW50ZWxsaWdlbmNlXCIsXHJcbiAgICAgICAgdmFsdWUgPT4ge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBcIkdlbml1c1wiO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gXCJHaWZ0ZWRcIjtcclxuICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFwiS25vd2xlZGdlYWJsZVwiO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gXCJOb3JtYWxcIjtcclxuICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFwiRG9vclwiO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIFwiT3V0IG9mIGJvdW5kcy5cIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgZXhwb3J0IGxldCBDaGFybSA9IG5ldyBBdHRyaWJ1dGUoXHJcbiAgICAgICAgXCJDaGFybVwiLFxyXG4gICAgICAgIHZhbHVlID0+IHtcclxuICAgICAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gKCg8SHVtYW5vaWQ+IFdvcmxkU3RhdGUucGxheWVyKS5pc01hbGUoKSA/IFwiQ2FzYW5vdmFcIiA6IFwiU2VkdWN0cmVzc1wiKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFwiRGlwbG9tYXRcIjtcclxuICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIChcIkNoZWVyeSBTYWxlc1wiICsgKCg8SHVtYW5vaWQ+IFdvcmxkU3RhdGUucGxheWVyKS5pc01hbGUoKSA/IFwibWFuXCIgOiBcIndvbWFuXCIpKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFwiTm90IGV2ZW4gdHJ5aW5nXCI7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBcIlVucGxlYXNhbnRcIjtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBcIk91dCBvZiBib3VuZHMuXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIGV4cG9ydCBsZXQgQ29ycnVwdGlvbiA9IG5ldyBBdHRyaWJ1dGUoXHJcbiAgICAgICAgXCJDb3JydXB0aW9uXCIsXHJcbiAgICAgICAgdmFsdWUgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gXCJOb3QgZGVmaW5lZFwiXHJcbiAgICAgICAgfSxcclxuICAgICAgICAwLCAxMDBcclxuICAgICk7XHJcblxyXG5cclxuICAgIGV4cG9ydCBsZXQgR2VuZGVySWRlbnRpdHkgPSBuZXcgQXR0cmlidXRlKFxyXG4gICAgICAgIFwiR2VuZGVyIElkZW50aXR5XCIsXHJcbiAgICAgICAgdmFsdWUgPT4ge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgPj0gNzUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIllvdSBzdHJvbmdseSBmZWVsLCBhbmQgYWN0LCBsaWtlIGEgd29tYW4uXCI7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gNjApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIllvdSBmZWVsLCBhbmQgYWN0LCBsaWtlIGEgd29tYW4uXCI7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gNDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIllvdSBkb24ndCBmZWVsIG5vciBhY3QgbGlrZSBhbnkgcGFydGljdWxhciBnZW5kZXIuXCI7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gMjApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIllvdSBmZWVsLCBhbmQgYWN0LCBsaWtlIGEgbWFuLlwiO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiWW91IHN0cm9uZ2x5IGZlZWwsIGFuZCBhY3QsIGxpa2UgYSBtYW4uXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIDUwLCAxMDBcclxuICAgICk7XHJcblxyXG5cclxuICAgIGV4cG9ydCBsZXQgRGVnZW5lcmF0aW9uID0gbmV3IEF0dHJpYnV0ZShcclxuICAgICAgICBcIkRlZ2VuZXJhdGlvblwiLFxyXG4gICAgICAgIHZhbHVlID0+IHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlID49IDc1KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJTZXggaXMgYWJvdXQgdGhlIG9ubHkgdGhpbmcgb24geW91ciBtaW5kLCBhbmQgeW91IGRvbid0IGV2ZW4gdHJ5IHRvIGhpZGUgaXQgYW55bW9yZS5cIjtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+PSA2MCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiU29tZXRpbWVzIHlvdSBjYW4ndCBoaWRlIGhvdyBuYXVnaHR5IHlvdSdkIGxpa2UgdG8gYmUuXCI7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gNDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDIwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJZb3VyIGNvbXBvc3VyZSBpcyBwcnVkaXNoIGFuZCBjYWxtLlwiO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiWW91IGhhdmUgdGhlIGNvbXBvc3VyZSBvZiBhIHNhaW50LlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICAzMCwgMTAwXHJcbiAgICApO1xyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIlBlcnNvblN0YXQudHNcIiAvPlxyXG5pbnRlcmZhY2UgU2tpbGxCZWFyZXIge1xyXG4gICAgZ2V0U2tpbGwgKGF0dHIgOiBTa2lsbCkgOiBudW1iZXI7XHJcbiAgICBzZXRTa2lsbCAoYXR0ciA6IFNraWxsLCB2YWx1ZSA6IG51bWJlcikgOiB2b2lkO1xyXG59XHJcblxyXG5jbGFzcyBTa2lsbCBleHRlbmRzIFBlcnNvblN0YXQge1xyXG4gICAgcHVibGljIGRlZmF1bHRWYWx1ZSA6IG51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgbWF4VmFsdWUgOiBudW1iZXIgPSA1O1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoaWQgOiBzdHJpbmcsIGRlc2NyaXB0aW9uPyA6IHN0cmluZyB8IFNheSB8ICgodmFsdWUgOiBudW1iZXIpID0+IHN0cmluZyB8IFNheSkpIHtcclxuICAgICAgICBzdXBlcihpZCwgZGVzY3JpcHRpb24pO1xyXG4gICAgICAgIFNraWxsLlNraWxsc1tpZF0gPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIFNraWxscyA6IHtbaWQgOiBzdHJpbmddIDogU2tpbGx9ID0ge307XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRTa2lsbHMgKCkge1xyXG4gICAgICAgIGxldCBza2lsbHMgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gU2tpbGwuU2tpbGxzKSB7XHJcbiAgICAgICAgICAgIHNraWxscy5wdXNoKFNraWxsLlNraWxsc1trZXldKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2tpbGxzLnNvcnQoKGEgOiBTa2lsbCwgYiA6IFNraWxsKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBuYSA9IGEuaWQudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgbGV0IG5iID0gYi5pZC50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgICBpZiAobmEgPiBuYikgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgIGlmIChuYSA8IG5iKSByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBza2lsbHM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRTa2lsbCAoaWQgOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gU2tpbGwuU2tpbGxzW2lkXTtcclxuICAgIH1cclxufVxyXG5cclxubW9kdWxlIFNraWxscyB7XHJcbiAgICBleHBvcnQgbGV0IFN1cnZpdmFsID0gbmV3IFNraWxsKFxyXG4gICAgXCJTdXJ2aXZhbFwiLFxyXG4gICAgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFwiXCI7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gXCJcIjtcclxuICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFwiXCI7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBcIkFsZXJ0IENoaWh1YWh1YVwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgKTtcclxufSIsIi8vIEEgY29udGFpbmVyIGhhcyB0aGluZ3MgaW5zaWRlIHRoYXQgY2FuIGJlIHNlZW4gYW5kIGludGVyYWN0ZWQgd2l0aC5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1RoaW5nLnRzXCIgLz5cclxuY2xhc3MgQ29udGFpbmVyIGV4dGVuZHMgVGhpbmcge1xyXG4gICAgcHVibGljIHB1dCAoLi4udGhpbmdzIDogQXJyYXk8VGhpbmc+KSB7XHJcblxyXG4gICAgfVxyXG59IiwiLy8gQSBjb3Jwc2UgaXMganVzdCB0aGUgY29udGFpbmVyIG9mIGEgZGVhZCBwZXJzb24uXHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJDb250YWluZXIudHNcIiAvPlxyXG5jbGFzcyBDb3Jwc2UgZXh0ZW5kcyBDb250YWluZXIge1xyXG5cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9UaGluZy50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9BSS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJQZXJzb24vQXR0cmlidXRlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIlBlcnNvbi9Ta2lsbC50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9Db250YWluZXIvQ29ycHNlLnRzXCIgLz5cclxuLyoqXHJcbiAqIEEgcGVyc29uIGlzIGEgdGhpbmcgdGhhdCBoYXBwZW5zIHRvIGJlIFwiYWxpdmVcIiBpbiBzb21lIHNpZ25pZmljYW50IHdheSwgbm90IG5lY2Vzc2FyaWx5IGh1bWFuLlxyXG4gKiBBIHJvYm90IGlzIGEgcGVyc29uLlxyXG4gKiBBIGRvZyBpcyBhIHBlcnNvbi5cclxuICpcclxuICogRnVjayB5b3VyIHN0YW5kYXJkcy5cclxuICovXHJcbmNsYXNzIFBlcnNvbiBleHRlbmRzIFRoaW5nIGltcGxlbWVudHMgQXR0cmlidXRlQmVhcmVyLCBTa2lsbEJlYXJlciB7XHJcbiAgICBwdWJsaWMgQUkgPSBuZXcgQUkoe30pO1xyXG4gICAgcHVibGljIGFuaW1hdGVkID0gdHJ1ZTtcclxuXHJcbiAgICBwdWJsaWMgc29yZW5lc3MgPSAwO1xyXG4gICAgcHVibGljIGxhc3RIZWFsdGhVcGRhdGUgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBzdGFtaW5hID0gMTA7XHJcbiAgICBwdWJsaWMgbGFzdFN0YW1pbmFVcGRhdGUgPSAwO1xyXG4gICAgcHVibGljIHN0YW1pbmFQZXJUdXJuID0gMTtcclxuICAgIHB1YmxpYyBzdGF0aWMgTUFYX1NUQU1JTkEgPSAxMDtcclxuICAgIHB1YmxpYyBzdGF0aWMgU1RSRU5HVEhfU09SRU5FU1NfTVVMVElQTElFUiA9IDQ7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChvcHRpb25zIDogVGhpbmdPcHRpb25zKSB7XHJcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XHJcblxyXG4gICAgICAgIHRoaXMuYWRkR2V0QWx0ZXJhdGlvbnMoKHBlcnNvbiA6IFBlcnNvbikgPT4ge1xyXG4gICAgICAgICAgICAvLyBMZXQncyBub3QgZG8gdGhpcyBmb3IgTlBDcy4gSXQgY2FuIGJyZWFrIHBhdGNoZXMuXHJcbiAgICAgICAgICAgIGlmIChwZXJzb24uaXNQbGF5ZXIoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBTdGF0czogdGhpcy5hdHRyaWJ1dGVWYWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICBTa2lsbHM6IHRoaXMuc2tpbGxWYWx1ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuYWRkU2V0QWx0ZXJhdGlvbnMoKHBlcnNvbiA6IFBlcnNvbiwgY2hhbmdlcykgPT4ge1xyXG4gICAgICAgICAgICAvLyBMZXQncyBub3QgZG8gdGhpcyBmb3IgTlBDcy4gSXQgY2FuIGJyZWFrIHBhdGNoZXMuXHJcbiAgICAgICAgICAgIGlmIChwZXJzb24uaXNQbGF5ZXIoKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZXMuU3RhdHMgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBjaGFuZ2VzLlN0YXRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdHRyID0gQXR0cmlidXRlLmdldEF0dHJpYnV0ZShuYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHIgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXQoYXR0ciwgY2hhbmdlcy5TdGF0c1tuYW1lXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hhbmdlcy5Ta2lsbHMgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBjaGFuZ2VzLlNraWxscykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXR0ciA9IFNraWxsLmdldFNraWxsKG5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ciAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U2tpbGwoYXR0ciwgY2hhbmdlcy5Ta2lsbHNbbmFtZV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNoYW5nZUhlYWx0aCAobiA6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBib2R5cGFydHMgPSA8QXJyYXk8Qm9keXBhcnQ+PiB0aGlzLmdldFBhcnRzKEJvZHlwYXJ0KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJvZHlwYXJ0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBib2R5cGFydHNbaV0uY2hhbmdlU29yZW5lc3Mobik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudXBkYXRlSGVhbHRoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGhlYWx0aCBhcyBhIG51bWJlciBmcm9tIDAgdG8gMTAuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRIZWFsdGhPblNjYWxlICgpIHtcclxuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChcclxuICAgICAgICAgICAgKCh0aGlzLmdldEhlYWx0aCgpICogMTApIC8gKHRoaXMuZ2V0U3RhdChBdHRyaWJ1dGVzLlN0cmVuZ3RoKSAqIDIpKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGN1cnJlbnQgaGVhbHRoLlxyXG4gICAgICogSW1wb3J0YW50ID0gZm9yY2UgdXBkYXRlLCBvdGhlcndpc2UgdXNlIHN1ZmZpY2llbnRseSBhY2N1cmF0ZSBjdXJyZW50IHZhbHVlLiB0byBwcmV2ZW50IGxvb3BpbmcgdG9vIG11Y2guXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGltcG9ydGFudFxyXG4gICAgICogQHJldHVybnMge251bWJlcn1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEhlYWx0aCAoaW1wb3J0YW50PyA6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAoaW1wb3J0YW50ID09PSB0cnVlIHx8IHRoaXMubGFzdEhlYWx0aFVwZGF0ZSAhPSBXb3JsZFN0YXRlLmdldEN1cnJlbnRUdXJuKCkpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVIZWFsdGgoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc29yZW5lc3MgLyAodGhpcy5nZXRTdGF0KEF0dHJpYnV0ZXMuU3RyZW5ndGgpICogUGVyc29uLlNUUkVOR1RIX1NPUkVORVNTX01VTFRJUExJRVIpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMYXp5IHVwZGF0ZXMgYWxsb3cgdXMgdG8gY291bnQgSGVhbHRoL1N0YW1pbmEgZm9yIE5QQ3Mgd2l0aG91dCBvdmVybG9hZGluZyB0aGUgRXZlcnkgVHVybiBydWxlYm9vay5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZGF0ZUhlYWx0aCAoKSB7XHJcbiAgICAgICAgbGV0IGhlYWx0aCA9IDA7XHJcbiAgICAgICAgbGV0IGJvZHlwYXJ0cyA9IHRoaXMuZ2V0UGFydHMoQm9keXBhcnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm9keXBhcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGhlYWx0aCArPSBib2R5cGFydHNbaV0uZ2V0V2VpZ2h0ZWRTb3JlbmVzcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNvcmVuZXNzID0gaGVhbHRoO1xyXG4gICAgICAgIHRoaXMubGFzdEhlYWx0aFVwZGF0ZSA9IFdvcmxkU3RhdGUuZ2V0Q3VycmVudFR1cm4oKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2hhbmdlU3RhbWluYSAobiA6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMudXBkYXRlU3RhbWluYSgpO1xyXG4gICAgICAgIHRoaXMuc3RhbWluYSArPSBuO1xyXG4gICAgICAgIGlmICh0aGlzLnN0YW1pbmEgPiBQZXJzb24uTUFYX1NUQU1JTkEpIHtcclxuICAgICAgICAgICAgdGhpcy5zdGFtaW5hID0gUGVyc29uLk1BWF9TVEFNSU5BO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGFtaW5hIDwgMCkge1xyXG4gICAgICAgICAgICB0aGlzLnN0YW1pbmEgPSAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgc3RhbWluYSBhcyBhIG51bWJlciBmcm9tIDAgdG8gMTAuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTdGFtaW5hT25TY2FsZSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoXHJcbiAgICAgICAgICAgICgodGhpcy5zdGFtaW5hICogMTApIC8gUGVyc29uLk1BWF9TVEFNSU5BKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVN0YW1pbmEgKCkge1xyXG4gICAgICAgIHZhciBuVHVybnMgPSBXb3JsZFN0YXRlLmdldEN1cnJlbnRUdXJuKCkgLSB0aGlzLmxhc3RTdGFtaW5hVXBkYXRlO1xyXG4gICAgICAgIHRoaXMuc3RhbWluYSArPSB0aGlzLnN0YW1pbmFQZXJUdXJuICogblR1cm5zO1xyXG4gICAgICAgIGlmICh0aGlzLnN0YW1pbmEgPiBQZXJzb24uTUFYX1NUQU1JTkEpIHtcclxuICAgICAgICAgICAgdGhpcy5zdGFtaW5hID0gUGVyc29uLk1BWF9TVEFNSU5BO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNQbGF5ZXIgKCkge1xyXG4gICAgICAgIHJldHVybiAoPGFueT4gdGhpcykgPT0gV29ybGRTdGF0ZS5wbGF5ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGF0dHJpYnV0ZVZhbHVlIDoge1tpZCA6IHN0cmluZ10gOiBudW1iZXJ9ID0ge307XHJcbiAgICBwcm90ZWN0ZWQgc2tpbGxWYWx1ZSA6IHtbaWQgOiBzdHJpbmddIDogbnVtYmVyfSA9IHt9O1xyXG5cclxuICAgIHB1YmxpYyBnZXRTdGF0IChzdGF0IDogQXR0cmlidXRlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVbc3RhdC5pZF0gPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlVmFsdWVbc3RhdC5pZF0gPSBzdGF0LmRlZmF1bHRWYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlVmFsdWVbc3RhdC5pZF07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldFN0YXQgKHN0YXQgOiBBdHRyaWJ1dGUsIHZhbHVlIDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVtzdGF0LmlkXSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTa2lsbCAoc3RhdCA6IFNraWxsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2tpbGxWYWx1ZVtzdGF0LmlkXSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5za2lsbFZhbHVlW3N0YXQuaWRdID0gc3RhdC5kZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnNraWxsVmFsdWVbc3RhdC5pZF07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldFNraWxsIChzdGF0IDogU2tpbGwsIHZhbHVlIDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5za2lsbFZhbHVlW3N0YXQuaWRdID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpZSAoKSB7XHJcbiAgICAgICAgbGV0IGNvcnBzZSA9IG5ldyBDb3Jwc2Uoe1xyXG4gICAgICAgICAgICBuYW1lIDogdGhpcy5uYW1lICsgXCIncyBjb3Jwc2VcIixcclxuICAgICAgICAgICAgdW5pcXVlIDogZmFsc2UsXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uIDogbmV3IFNheShcIlRoZSBsaWZlbGVzcyBib2R5IG9mIFwiLCB0aGlzLCBcIi4gTWF5IFwiLCBuZXcgU2F5SGVTaGVJdCh0aGlzKSwgXCIgcmVzdCBpbiBwZWFjZS5cIilcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29ycHNlLnB1dCguLi5UaGluZy5DYXJyeVJlbGF0aW9uLmdldFJpZ2h0KHRoaXMpKTtcclxuICAgICAgICBjb3Jwc2UucHV0KC4uLlRoaW5nLldlYXJSZWxhdGlvbi5nZXRSaWdodCh0aGlzKSk7XHJcblxyXG4gICAgICAgIHRoaXMuZ2V0Um9vbSgpLnBsYWNlKGNvcnBzZSk7XHJcbiAgICAgICAgT3V0T2ZQbGF5LnJlbW92ZUZyb21QbGF5KHRoaXMpO1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vQ2xhc3Nlcy9SdWxlYm9vay50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL0NsYXNzZXMvUnVsZS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJDbGFzc2VzL1RoaW5ncy9QZXJzb24udHNcIiAvPlxyXG5tb2R1bGUgRXZlcnlUdXJuIHtcclxuICAgIGV4cG9ydCB2YXIgRXZlcnlUdXJuID0gbmV3IFJ1bGVib29rKFwiRXZlcnkgVHVyblwiKTtcclxuXHJcbiAgICBleHBvcnQgdmFyIFJ1bkFJUnVsZSA9IEV2ZXJ5VHVybi5jcmVhdGVBbmRBZGRSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJSdW4gTlBDIEFJIFJ1bGVcIixcclxuICAgICAgICBjb2RlIDogYXN5bmMgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBmdW5jdGlvbiBpc0FJQXZhaWxhYmxlIChwZXJzb24gOiBQZXJzb24pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAocGVyc29uICE9IFdvcmxkU3RhdGUucGxheWVyXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgKChwZXJzb24uZ2V0Um9vbSgpIGluc3RhbmNlb2YgUm9vbVJhbmRvbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiAoPFJvb21SYW5kb20+IHBlcnNvbi5nZXRSb29tKCkpLnBsYWNlZCkpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIGxldCBwZW9wbGUgPSA8QXJyYXk8UGVyc29uPj4gVGhpbmcuSW5zaWRlUm9vbVJlbGF0aW9uLmdldEFueVJpZ2h0VHlwZShQZXJzb24pLmZpbHRlcihpc0FJQXZhaWxhYmxlKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwZW9wbGUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBhY3Rpb24gPSBhd2FpdCBwZW9wbGVbaV0uQUkuZXhlY3V0ZShwZW9wbGVbaV0pO1xyXG4gICAgICAgICAgICAgICAgbGV0IHBlcnNvbiA9IHBlb3BsZVtpXTtcclxuICAgICAgICAgICAgICAgIGxldCB2aXNpYmxlID0gcGVvcGxlW2ldLmlzVmlzaWJsZVRvKFdvcmxkU3RhdGUucGxheWVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmludFZhbHVlOiBTYXkgPSBhd2FpdCBhY3Rpb24uZXhlY3V0ZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGUgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNvbi5pc1Zpc2libGVUbyhXb3JsZFN0YXRlLnBsYXllcilcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSAmJiBwcmludFZhbHVlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIucHJpbnRBc0NvbnRlbnQocHJpbnRWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgZXhwb3J0IHZhciBpbmNyZW1lbnRUdXJuQ291bnRlclJ1bGUgPSBFdmVyeVR1cm4uY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgZmlyc3RQcmlvcml0eTogUnVsZS5QUklPUklUWV9MT1dFU1QsXHJcbiAgICAgICAgcHJpb3JpdHk6IFJ1bGUuUFJJT1JJVFlfTE9XRVNULFxyXG4gICAgICAgIG5hbWU6IFwiSW5jcmVtZW50IFR1cm4gQ291bnRlclwiLFxyXG4gICAgICAgIGNvZGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgV29ybGRTdGF0ZS5pbmNyZW1lbnRXb3JsZFR1cm4oKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufSIsIi8qKlxyXG4gKiBDdXJyZW50IHBsYW5zOlxyXG4gKiBNYWtlIGNoZWNrcyBoaWdoZXIgbGV2ZWwuIEl0IHNob3VsZCBiZSBzaW1wbGUgdG8gd3JpdGUsIGV2ZW4gaWYgdGhlIHVuZGVybHlpbmcgY29kZSBiZWNvbWVzIG1vcmUgY29tcGxleCBpbiB0aGUgcHJvY2Vzcy5cclxuICogQ2hlY2tzIHNob3VsZCBiZSBzbWFydCBlbm91Z2ggdG8gdW5kZXJzdGFuZCB3aGF0IGtpbmQgb2Ygc3BlY2lmaWNpdHkgaXMgYmVpbmcgdXNlZCBpbiB0aGUgdGVzdC5cclxuICogQ2hlY2tzIHNob3VsZCBhbHNvIGJlIGNhcGFibGUgb2Ygc2F5aW5nIFwidGhpcyBmaXRzIHRoZSBzaXR1YXRpb24gcGVyZmVjdGx5XCIuXHJcbiAqIFNleCBzY2VuZXMgc2hvdWxkIGNoYW5nZSB2YXJpYWJsZXMgdGhhdCBhcmUgdXNlZCBpbiBjaGVja3MuXHJcbiAqXHJcbiAqIEN1cnJlbnQgaG93IHRvOlxyXG4gKiBDbGFzczogRnVja2luZ1NpdHVhdGlvbiwgd2hpY2ggc2hvdWxkIGluY2x1ZGUgYWxsIHRoZSB2YXJpYWJsZXMgdG8gdGhlIGN1cnJlbnQgZnVja2luZyBzY2VuZS5cclxuICogQ2xhc3M6IEZ1Y2tpbmdDaGVjaywgd2hpY2ggc2hvdWxkIGluY2x1ZGUgYSBwb3J0aW9uIG9mIHZhcmlhYmxlcyB0aGF0IGFyZSB0aGVuIGNvbXBhcmVkIHRvIHRoZSBGdWNraW5nU2l0dWF0aW9uLlxyXG4gKiBNb2R1bGU6IEZ1Y2tpbmcsIHdoaWNoIGNvbnRyb2xzIHdoYXQgVGhpbmdzIGFyZSBmdWNraW5nIHdoaWNoIFRoaW5ncyBhbmQgYXBwbGllcyB0aGUgYWJvdmUgdHdvLiBTaG91bGQgcHJvdmlkZSBnZW5lcmF0b3JzIGZvciBGdWNraW5nQ2hlY2suXHJcbiAqL1xyXG5cclxubW9kdWxlIEZ1Y2tpbmcge1xyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL0VsZW1lbnRzL0NsYXNzZXMvU2F5LnRzXCIgLz5cclxuZW51bSBEaXJlY3Rpb24ge1xyXG4gICAgTk9SVEgsIE5PUlRIRUFTVCwgRUFTVCxcclxuICAgIFNPVVRIRUFTVCwgU09VVEgsIFNPVVRIV0VTVCxcclxuICAgIFdFU1QsIE5PUlRIV0VTVCwgVVAsIERPV05cclxufVxyXG5cclxuXHJcblxyXG52YXIgRGlyZWN0aW9uTmFtZXMgOiB7W2lkOiBzdHJpbmddIDogc3RyaW5nfSA9ICgoKSA9PiB7XHJcbiAgICBlbnVtIG5hbWVzIHtcclxuICAgICAgICBOT1JUSCA9IFwiTm9ydGhcIixcclxuICAgICAgICBTT1VUSCA9IFwiU291dGhcIixcclxuICAgICAgICBFQVNUID0gXCJFYXN0XCIsXHJcbiAgICAgICAgV0VTVCA9IFwiV2VzdFwiLFxyXG4gICAgICAgIFNPVVRIRUFTVCA9IFwiU291dGhlYXN0XCIsXHJcbiAgICAgICAgTk9SVEhXRVNUID0gXCJOb3J0aHdlc3RcIixcclxuICAgICAgICBTT1VUSFdFU1QgPSBcIlNvdXRod2VzdFwiLFxyXG4gICAgICAgIE5PUlRIRUFTVCA9IFwiTm9ydGhlYXN0XCIsXHJcbiAgICAgICAgVVAgPSBcIkRvd25cIixcclxuICAgICAgICBET1dOID0gXCJVcFwiXHJcbiAgICB9O1xyXG4gICAgbGV0IG9iaiA6IHtbaWQ6IHN0cmluZ10gOiBzdHJpbmd9ID0ge307XHJcbiAgICBmb3IgKGxldCBuYW1lIGluIG5hbWVzKSB7XHJcbiAgICAgICAgb2JqW25hbWVdID0gbmFtZXNbbmFtZV07XHJcbiAgICAgICAgb2JqW0RpcmVjdGlvbltuYW1lXV0gPSBuYW1lc1tuYW1lXTtcclxuICAgIH1cclxuICAgIHJldHVybiBvYmo7XHJcbn0pKCk7XHJcblxyXG52YXIgT3Bwb3NpdGVEaXJlY3Rpb24gOiB7W2lkIDogbnVtYmVyXSA6IERpcmVjdGlvbn0gPSAoKCkgPT4ge1xyXG4gICAgbGV0IG9iaiA9IHt9O1xyXG4gICAgb2JqW0RpcmVjdGlvbi5OT1JUSF0gPSBEaXJlY3Rpb24uU09VVEg7XHJcbiAgICBvYmpbRGlyZWN0aW9uLlNPVVRIXSA9IERpcmVjdGlvbi5OT1JUSDtcclxuICAgIG9ialtEaXJlY3Rpb24uRUFTVF0gPSBEaXJlY3Rpb24uV0VTVDtcclxuICAgIG9ialtEaXJlY3Rpb24uV0VTVF0gPSBEaXJlY3Rpb24uRUFTVDtcclxuICAgIG9ialtEaXJlY3Rpb24uU09VVEhFQVNUXSA9IERpcmVjdGlvbi5OT1JUSFdFU1Q7XHJcbiAgICBvYmpbRGlyZWN0aW9uLk5PUlRIV0VTVF0gPSBEaXJlY3Rpb24uU09VVEhFQVNUO1xyXG4gICAgb2JqW0RpcmVjdGlvbi5TT1VUSFdFU1RdID0gRGlyZWN0aW9uLk5PUlRIRUFTVDtcclxuICAgIG9ialtEaXJlY3Rpb24uTk9SVEhFQVNUXSA9IERpcmVjdGlvbi5TT1VUSFdFU1Q7XHJcbiAgICBvYmpbRGlyZWN0aW9uLlVQXSA9IERpcmVjdGlvbi5ET1dOO1xyXG4gICAgb2JqW0RpcmVjdGlvbi5ET1dOXSA9IERpcmVjdGlvbi5VUDtcclxuXHJcbiAgICAvLyBNYWtlIGl0IHdvcmsgd2l0aCB0aGUgbmFtZSB0b29cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgT2JqZWN0LmtleXMoRGlyZWN0aW9uKS5sZW5ndGggLyAyOyBpKyspIHtcclxuICAgICAgICBvYmpbRGlyZWN0aW9uW2ldXSA9IG9ialtpXTtcclxuICAgIH1cclxuICAgIHJldHVybiBvYmo7XHJcbn0pKCk7XHJcblxyXG5jbGFzcyBSb29tIGltcGxlbWVudHMgUHJpbnRhYmxlIHtcclxuICAgIHByaXZhdGUgbmFtZSA6IHN0cmluZztcclxuICAgIHB1YmxpYyBjb25uZWN0aW9ucyA6IEFycmF5PFJvb20+O1xyXG4gICAgcHVibGljIGRlc2NyaXB0aW9uIDogU2F5ID0gbmV3IFNheSgpO1xyXG4gICAgcHVibGljIGZvZGRlciA6IGJvb2xlYW47XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChpZD8gOiBzdHJpbmcsIGZvZGRlcj8gOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gaWQgPT0gdW5kZWZpbmVkID8gXCJSb29tXCIgOiBpZDtcclxuICAgICAgICB0aGlzLmNvbm5lY3Rpb25zID0gbmV3IEFycmF5KFJvb20uRElSRUNUSU9OUy5sZW5ndGgpOyAvLyBBcnJheSB0aGUgc2FtZSBzaXplIGFzIGRpcmVjdGlvbnMsIGJ1dCBmaWxsZWQgd2l0aCB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgdGhpcy5mb2RkZXIgPSBmb2RkZXI7XHJcbiAgICAgICAgaWYgKGZvZGRlciAhPSB0cnVlKSB7XHJcbiAgICAgICAgICAgIFJvb20uYWRkUm9vbSh0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE5hbWUgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHBsYWNlICh0aGluZyA6IFRoaW5nKSB7XHJcbiAgICAgICAgVGhpbmcuSW5zaWRlUm9vbVJlbGF0aW9uLnNldFJlbGF0aW9uKHRoaXMsIHRoaW5nKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVtb3ZlICh0aGluZyA6IFRoaW5nKSB7XHJcbiAgICAgICAgLy8gRG9uJ3QgcmVtb3ZlIHN0dWZmIGZyb20gb3RoZXIgcm9vbXNcclxuICAgICAgICBpZiAoVGhpbmcuSW5zaWRlUm9vbVJlbGF0aW9uLmdldExlZnQodGhpbmcpID09IHRoaXMpIHtcclxuICAgICAgICAgICAgVGhpbmcuSW5zaWRlUm9vbVJlbGF0aW9uLnVuc2V0UmlnaHQodGhpbmcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q29udGFpbmVkICgpIDogQXJyYXk8VGhpbmc+IHtcclxuICAgICAgICByZXR1cm4gPEFycmF5PFRoaW5nPj4gVGhpbmcuSW5zaWRlUm9vbVJlbGF0aW9uLmdldFJpZ2h0KHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDb250YWluZWRBbmRWaXNpYmxlVG8gKG9ic2VydmVyIDogVGhpbmcpIDogQXJyYXk8VGhpbmc+IHtcclxuICAgICAgICBsZXQgY29udGFpbmVkID0gdGhpcy5nZXRDb250YWluZWQoKTtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gW107XHJcblxyXG4gICAgICAgIGNvbnRhaW5lZC5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUudmlzaWJsZSAmJiB2YWx1ZSAhPT0gb2JzZXJ2ZXIpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgRElSRUNUSU9OUyA6IEFycmF5PERpcmVjdGlvbj4gPSAoKCkgPT4ge1xyXG4gICAgICAgIGxldCBkaXJlY3Rpb25zIDogQXJyYXk8RGlyZWN0aW9uPiA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgT2JqZWN0LmtleXMoRGlyZWN0aW9uKS5sZW5ndGggLyAyOyBpKyspIHtcclxuICAgICAgICAgICAgZGlyZWN0aW9ucy5wdXNoKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZGlyZWN0aW9ucztcclxuICAgIH0pKCk7XHJcblxyXG4gICAgcHVibGljIGdldENvbnRhaW5lZEFuZFZpc2libGUgKCkgOiBBcnJheTxUaGluZz4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldENvbnRhaW5lZEFuZFZpc2libGVUbyhXb3JsZFN0YXRlLnBsYXllcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG1hcFJvb20gKHIgOiBSb29tLCBkaXJlY3Rpb24gOiBEaXJlY3Rpb24pIHtcclxuICAgICAgICBsZXQgb3Bwb3NpdGVEaXJlY3Rpb24gPSBPcHBvc2l0ZURpcmVjdGlvbltkaXJlY3Rpb25dO1xyXG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25zW2RpcmVjdGlvbl0gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlJlcGxhY2luZyBhIGNvbm5lY3RlZCByb29tLlwiLCB0aGlzLCBcIiBjb25uZWN0ZWQgdGhyb3VnaCBcIiwgZGlyZWN0aW9uLCBcIiB0byBcIiwgdGhpcy5jb25uZWN0aW9uc1tkaXJlY3Rpb25dKTtcclxuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uc1tkaXJlY3Rpb25dLnVubWFwUm9vbShvcHBvc2l0ZURpcmVjdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29ubmVjdGlvbnNbZGlyZWN0aW9uXSA9IHI7XHJcblxyXG4gICAgICAgIGlmIChyLmNvbm5lY3Rpb25zW29wcG9zaXRlRGlyZWN0aW9uXSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiUmVwbGFjaW5nIGEgY29ubmVjdGVkIHJvb20uXCIsIHIsIFwiIGNvbm5lY3RlZCB0aHJvdWdoIFwiLCBvcHBvc2l0ZURpcmVjdGlvbiwgXCIgdG8gXCIsIHIuY29ubmVjdGlvbnNbb3Bwb3NpdGVEaXJlY3Rpb25dKTtcclxuICAgICAgICAgICAgci51bm1hcFJvb20ob3Bwb3NpdGVEaXJlY3Rpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByLmNvbm5lY3Rpb25zW29wcG9zaXRlRGlyZWN0aW9uXSA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVubWFwUm9vbSAoZGlyZWN0aW9uIDogRGlyZWN0aW9uKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbnNbZGlyZWN0aW9uXSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgbGV0IHIgPSB0aGlzLmNvbm5lY3Rpb25zW2RpcmVjdGlvbl07XHJcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbnNbZGlyZWN0aW9uXSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgci51bm1hcFJvb20oT3Bwb3NpdGVEaXJlY3Rpb25bZGlyZWN0aW9uXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRQcmludGVkTmFtZSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q29ubmVjdGVkUm9vbXMgKCkgOiBBcnJheTxSb29tPiB7XHJcbiAgICAgICAgbGV0IHJvb21zID0gW107XHJcbiAgICAgICAgdGhpcy5jb25uZWN0aW9ucy5mb3JFYWNoKHJvb20gPT4ge1xyXG4gICAgICAgICAgICBpZiAocm9vbSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJvb21zLnB1c2gocm9vbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcm9vbXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIHJldHVybnMgdGhlIGJlc3QgZGlyZWN0aW9uIHRvIGZvbGxvdyBpZiBnb2luZyBmcm9tIHRoZSBjdXJyZW50IHJvb20gdG8gYW5vdGhlciByb29tLlxyXG4gICAgICogVEhJUyBDT0RFIElTIFJFQUxMWSBFWFBFTlNJVkUgQU5EIFNIT1VMRCBPTkxZIEJFIFVTRUQgQVMgQSBMQVNUIFJFU09SVFxyXG4gICAgICogV0FSTklORzogVEhJUyBDT0RFIFdJTEwgRkFJTCBJRiBUSEUgVEFSR0VUIFJPT00gSVMgVE9PIEZBUiBGUk9NIFRIRSBDVVJSRU5UIFJPT00gKEZPUiBTRUNVUklUWSBSRUFTT05TKS5cclxuICAgICAqIFRoaXMgY29kZSBydW5zIHRocm91Z2ggZXZlcnkuIHNpbmdsZS4gcm9vbS4gdG8gZmluZCB0aGUgYmVzdCByb3V0ZSB0byB0YWtlLlxyXG4gICAgICogSWYgeW91IG5lZWQgYW4gTlBDIHRvIHN0aWNrIHRvIGEgcmVnaW9uLCBkb24ndCBsZXQgaXQgZ28gb3V0IG9mIGl0IGluIHRoZSBmaXJzdCBwbGFjZSFcclxuICAgICAqIEBwYXJhbSByb29tXHJcbiAgICAgKiBAcGFyYW0gdmFsaWRpdHlDb2RlXHJcbiAgICAgKiBAcmV0dXJucyB7YW55fVxyXG4gICAgICovXHJcbiAgICAvLyBUT0RPOiBNYWtlIHRoaXMgc2hpdCBmYXN0XHJcbiAgICBwdWJsaWMgYmVzdERpcmVjdGlvblRvIChyb29tIDogUm9vbSwgdmFsaWRpdHlDb2RlPyA6IChyb29tIDogUm9vbSkgPT4gYm9vbGVhbikge1xyXG4gICAgICAgIGlmICh2YWxpZGl0eUNvZGUgPT0gdW5kZWZpbmVkKSB2YWxpZGl0eUNvZGUgPSAoKSA9PiB7cmV0dXJuIHRydWV9O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBNYXhpbXVtIGFtb3VudCBvZiBzdGVwcyB0aGF0IHdpbGwgYmUgY29uc2lkZXJlZCBmb3IgYSByb3V0ZS5cclxuICAgICAgICAgKiBUaGlzIGlzIHVzZWZ1bCB0byBwcmV2ZW50IHRoZSBjb2RlIGZyb20gc3Bhbm5pbmcgdG9vIG1hbnkgcm9vbXMsIGFzIGVhY2ggcm9vbSBjYW4gaGF2ZSBSb29tLkRJUkVDVElPTlMubGVuZ3RoIGRpcmVjdGlvbnMgdG8gbWFrZSBhbm90aGVyIGNhbGwsIGV0Yy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgbGV0IG1heFN0ZXBzID0gMTA7XHJcbiAgICAgICAgbWF4U3RlcHMgPSBtYXhTdGVwcyA+IFdvcmxkU3RhdGUuZ2V0TWF4aW11bVJlbWVtYmVyZWRSb29tcygpID8gbWF4U3RlcHMgOiBXb3JsZFN0YXRlLmdldE1heGltdW1SZW1lbWJlcmVkUm9vbXMoKTtcclxuXHJcbiAgICAgICAgbGV0IHJlY3Vyc2l2ZUJlc3RQYXRoID0gKGNQYXRoIDogQXJyYXk8Um9vbT4sIGNSb29tIDogUm9vbSwgZGVzdGluYXRpb24gOiBSb29tKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIElnbm9yZSBcImJhZFwiIHJvb21zXHJcbiAgICAgICAgICAgIGlmICghdmFsaWRpdHlDb2RlKGNSb29tKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIFByZXZlbnQgdGhlIGNvZGUgZnJvbSBzdHJheWluZyB0b28gZmFyXHJcbiAgICAgICAgICAgIGlmIChjUm9vbSA9PSBkZXN0aW5hdGlvbikge1xyXG4gICAgICAgICAgICAgICAgbWF4U3RlcHMgPSBtYXhTdGVwcyA+IGNQYXRoLmxlbmd0aCA/IGNQYXRoLmxlbmd0aCA6IG1heFN0ZXBzOyAvLyBTdG9wIGNvbnNpZGVyaW5nIHdvcnNlIHJvdXRlc1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNQYXRoO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNQYXRoLmxlbmd0aCA+IG1heFN0ZXBzKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IHBhdGhzID0gW107XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpbmRleCBpbiBSb29tLkRJUkVDVElPTlMpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZGlyZWN0aW9uID0gUm9vbS5ESVJFQ1RJT05TW2luZGV4XTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dFJvb20gPSBjUm9vbS5jb25uZWN0aW9uc1tkaXJlY3Rpb25dO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Um9vbSAhPSB1bmRlZmluZWQgJiYgY1BhdGguaW5kZXhPZihuZXh0Um9vbSkgPT0gLTEgJiYgdmFsaWRpdHlDb2RlKG5leHRSb29tKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IHJlY3Vyc2l2ZUJlc3RQYXRoKGNQYXRoLmNvbmNhdChbbmV4dFJvb21dKSwgbmV4dFJvb20sIGRlc3RpbmF0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGggIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRocy5wdXNoKHBhdGgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IHNob3J0ZXN0SW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgcGF0aHMuZm9yRWFjaCgodmFsdWUsIGluZGV4LCBhcnJheSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPCBwYXRoc1tzaG9ydGVzdEluZGV4XS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRlc3RJbmRleCA9IGluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhdGhzW3Nob3J0ZXN0SW5kZXhdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbGV0IHBhdGhzID0gQXJyYXkoUm9vbS5ESVJFQ1RJT05TLmxlbmd0aCk7XHJcbiAgICAgICAgbGV0IHNob3J0ZXN0SW5kZXg7XHJcbiAgICAgICAgZm9yIChsZXQgaW5kZXggaW4gUm9vbS5ESVJFQ1RJT05TKSB7XHJcbiAgICAgICAgICAgIGxldCBkaXJlY3Rpb24gPSBSb29tLkRJUkVDVElPTlNbaW5kZXhdO1xyXG4gICAgICAgICAgICBsZXQgbmV4dFJvb20gPSB0aGlzLmNvbm5lY3Rpb25zW2RpcmVjdGlvbl07XHJcbiAgICAgICAgICAgIGlmIChuZXh0Um9vbSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHBhdGhzW2RpcmVjdGlvbl0gPSByZWN1cnNpdmVCZXN0UGF0aChbdGhpcywgbmV4dFJvb21dLCBuZXh0Um9vbSwgcm9vbSk7XHJcbiAgICAgICAgICAgICAgICBpZiAocGF0aHNbZGlyZWN0aW9uXSAhPSB1bmRlZmluZWQgJiYgKHNob3J0ZXN0SW5kZXggPT0gdW5kZWZpbmVkIHx8IHBhdGhzW3Nob3J0ZXN0SW5kZXhdLmxlbmd0aCA+IHBhdGhzW2RpcmVjdGlvbl0ubGVuZ3RoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3J0ZXN0SW5kZXggPSBkaXJlY3Rpb247XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNob3J0ZXN0SW5kZXg7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXREaXJlY3Rpb25YWVogKGRpcmVjdGlvbiA6IERpcmVjdGlvbikge1xyXG4gICAgICAgIHZhciB5ID0gMDtcclxuICAgICAgICBpZiAoW0RpcmVjdGlvbi5OT1JUSCwgRGlyZWN0aW9uLk5PUlRIRUFTVCwgRGlyZWN0aW9uLk5PUlRIV0VTVF0uaW5kZXhPZihkaXJlY3Rpb24pICE9IC0xKSB7XHJcbiAgICAgICAgICAgIHkgPSAxO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoW0RpcmVjdGlvbi5TT1VUSCwgRGlyZWN0aW9uLlNPVVRIRUFTVCwgRGlyZWN0aW9uLlNPVVRIV0VTVF0uaW5kZXhPZihkaXJlY3Rpb24pICE9IC0xKSB7XHJcbiAgICAgICAgICAgIHkgPSAtMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciB4ID0gMDtcclxuICAgICAgICBpZiAoW0RpcmVjdGlvbi5FQVNULCBEaXJlY3Rpb24uU09VVEhFQVNULCBEaXJlY3Rpb24uTk9SVEhFQVNUXS5pbmRleE9mKGRpcmVjdGlvbikgIT0gLTEpIHtcclxuICAgICAgICAgICAgeCA9IDE7XHJcbiAgICAgICAgfSBlbHNlIGlmIChbRGlyZWN0aW9uLldFU1QsIERpcmVjdGlvbi5TT1VUSFdFU1QsIERpcmVjdGlvbi5OT1JUSFdFU1RdLmluZGV4T2YoZGlyZWN0aW9uKSAhPSAtMSkge1xyXG4gICAgICAgICAgICB4ID0gLTE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgeiA9IGRpcmVjdGlvbiA9PSBEaXJlY3Rpb24uVVAgPyAxIDpcclxuICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPT0gRGlyZWN0aW9uLkRPV04gPyAtMSA6XHJcbiAgICAgICAgICAgICAgICAgMDtcclxuXHJcbiAgICAgICAgcmV0dXJuIFt4LCB5LCB6XTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzdGF0aWMgc2hpZnQgKGNvb3JkaW5hdGVzIDogQXJyYXk8bnVtYmVyPiwgZGlyZWN0aW9uIDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IGNvb3JkaW5hdGVzVmVjdG9yID0gUm9vbS5nZXREaXJlY3Rpb25YWVooZGlyZWN0aW9uKTtcclxuICAgICAgICBjb29yZGluYXRlcy5mb3JFYWNoKCh2YWx1ZSwgaW5kZXgsIGFycmF5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzVmVjdG9yW2luZGV4XSArPSBjb29yZGluYXRlc1tpbmRleF07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGNvb3JkaW5hdGVzVmVjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgcm9vbXMgOiB7W2lkIDogc3RyaW5nXSA6IFJvb219ID0ge307XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBhZGRSb29tIChyb29tIDogUm9vbSkge1xyXG4gICAgICAgIFJvb20ucm9vbXNbcm9vbS5uYW1lXSA9IHJvb207XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRSb29tcyAoKSA6IEFycmF5PFJvb20+IHtcclxuICAgICAgICBsZXQgcm9vbXMgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBuYW1lIGluIFJvb20ucm9vbXMpIHtcclxuICAgICAgICAgICAgcm9vbXMucHVzaChSb29tLnJvb21zW25hbWVdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJvb21zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Um9vbSAoaWQgOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gUm9vbS5yb29tc1tpZF07XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiQ2xhc3Nlcy9Sb29tLnRzXCIgLz5cclxubW9kdWxlIE91dE9mUGxheSB7XHJcbiAgICAvKiogVGhlIHJlYXNvbiB3ZSBoYXZlIHRoaXMgaXMgc28gdGhhdCBOUENzIGFjdHVhbGx5IFNBVkUgd2hlbiB0aGV5J3JlIGRlYWQuIFRoaW5ncyB0aGF0IGFyZSBzaW1wbHkgb3V0c2lkZSBvZiByb29tcyBkbyBub3QgaGF2ZSB0aGVpciBwb3NpdGlvbiBzdG9yZWQsIHNpbmNlIHRoZXkgaGF2ZSBubyBwb3NpdGlvbi4gKiovXHJcbiAgICBleHBvcnQgbGV0IEhlYXZlbiA9IG5ldyBSb29tKFwiX19IZWF2ZW5fX1JJUF9fXCIpO1xyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZW1vdmVGcm9tUGxheSAodGhpbmcgOiBUaGluZykge1xyXG4gICAgICAgIEhlYXZlbi5wbGFjZSh0aGluZyk7XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9DbGFzc2VzL1J1bGVib29rLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vQ2xhc3Nlcy9SdWxlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIk1hY2hpbmVCZWdpbnMudHNcIiAvPlxyXG5tb2R1bGUgUGxheUJlZ2lucyB7XHJcbiAgICBleHBvcnQgdmFyIHJ1bGVib29rID0gbmV3IFJ1bGVib29rPHZvaWQ+KFwiUGxheSBCZWdpbnNcIik7XHJcbiAgICBleHBvcnQgdmFyIExPQURfRkFJTEVEID0gZmFsc2U7XHJcbiAgICBsZXQgc3RhcnRpbmdSb29tO1xyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBleGVjdXRlICgpIHtcclxuICAgICAgICBydWxlYm9vay5leGVjdXRlKHt9KTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gc2V0U3RhcnRpbmdSb29tIChyb29tIDogUm9vbSkge1xyXG4gICAgICAgIGlmIChzdGFydGluZ1Jvb20gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIltJbml0aWFsUm9vbV0gTXVsdGlwbGUgcmVxdWVzdHMgZm9yIHN0YXJ0aW5nIHJvb20sIHBsZWFzZSBjaGVjay5cIiwgc3RhcnRpbmdSb29tLCByb29tKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3RhcnRpbmdSb29tID0gcm9vbTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbGV0IFB1dFBsYXllckludG9GaXJzdFJvb20gPSBydWxlYm9vay5jcmVhdGVBbmRBZGRSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJQbGFjZSBwbGF5ZXIgaW50byBpbml0aWFsIHJvb21cIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9ISUdIRVNULFxyXG4gICAgICAgIHByaW9yaXR5IDogUnVsZS5QUklPUklUWV9NRURJVU0sXHJcbiAgICAgICAgY29kZSA6ICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKFdvcmxkU3RhdGUucGxheWVyLmdldFJvb20oKSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoUnVsZWJvb2suZ2V0SW5kZW50YXRpb24oKSArIFwiW0luaXRpYWxSb29tXSBQbGF5ZXIgYWxyZWFkeSBpbiBhIHJvb20uXCIsIFdvcmxkU3RhdGUucGxheWVyLmdldFJvb20oKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzdGFydGluZ1Jvb20ucGxhY2UoV29ybGRTdGF0ZS5wbGF5ZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgZXhwb3J0IHZhciBSdW5FbXB0eVR1cm5TZXF1ZW5jZVJ1bGUgPSBuZXcgUnVsZSAoe1xyXG4gICAgICAgIG5hbWUgOiBcIlJ1biBFbXB0eSBUdXJuIFNlcXVlbmNlIFJ1bGVcIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9MT1dFU1QsXHJcbiAgICAgICAgcHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0xPV0VTVCxcclxuICAgICAgICBjb2RlIDogKHJ1bGVib29rMiA6IFJ1bGVib29rUnVubmVyPHZvaWQ+KSA9PiB7XHJcbiAgICAgICAgICAgIFR1cm5TZXF1ZW5jZS5leGVjdXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBydWxlYm9vay5hZGRSdWxlKFJ1bkVtcHR5VHVyblNlcXVlbmNlUnVsZSk7XHJcbn1cclxuXHJcbm1vZHVsZSBNYWNoaW5lQmVnaW5zIHtcclxuICAgIGV4cG9ydCBsZXQgUnVuUGxheUJlZ2lucyA9IE1hY2hpbmVCZWdpbnMucnVsZWJvb2suY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfTE9XLFxyXG4gICAgICAgIG5hbWUgOiBcIlJ1biBQbGF5IEJlZ2luc1wiLFxyXG4gICAgICAgIGNvZGUgOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIFBsYXlCZWdpbnMuZXhlY3V0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59IiwibW9kdWxlIFRlc3RzIHtcclxuICAgIGV4cG9ydCB2YXIgTUlOX0RJQ0UgPSAwOyAvLyBEaWNlcyBjYW4gYmUgPCAwXHJcbiAgICBleHBvcnQgdmFyIE1BWF9ESUNFID0gMzsgLy8gRGljZXMgY2FuIGdvIHJlYWwgaGlnaFxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByb2xsRGljZSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChNQVhfRElDRSAtIE1JTl9ESUNFKSkgKyAxICsgTUlOX0RJQ0U7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHRlc3QgKGF0dHIgOiBudW1iZXIsIGRpZmZpY3VsdHkgOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gKGF0dHIgKyByb2xsRGljZSgpKSA+PSBkaWZmaWN1bHR5O1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1RoaW5nLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1Jvb20udHNcIiAvPlxyXG4vKipcclxuICogTWFwcyBjYW4gaG9sZCBpbmZvcm1hdGlvbiBvZiBjZXJ0YWluIHJvb21zIG9yIGEgcmVnaW9uLlxyXG4gKiBJZiBhIHBsYXllciBoYXMgYSBtYXAsIGFsbCB0aGUgcm9vbXMgaW4gdGhlIG1hcCBhcmUgYWx3YXlzIHJlbWVtYmVyZWQuXHJcbiAqL1xyXG5jbGFzcyBNYXBOb3RlIGV4dGVuZHMgVGhpbmcge1xyXG4gICAgcHVibGljIHJvb21zIDogQXJyYXk8Um9vbT4gPSBbXTtcclxuICAgIHB1YmxpYyByZWdpb25zIDogQXJyYXk8UmVnaW9uPiA9IFtdO1xyXG5cclxuICAgIHB1YmxpYyBhZGRSb29tICguLi5yb29tcyA6IEFycmF5PFJvb20+KSB7XHJcbiAgICAgICAgcm9vbXMuZm9yRWFjaCgocm9vbSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJvb21zLnB1c2gocm9vbSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZFJlZ2lvbiAoLi4ucmVnaW9ucyA6IEFycmF5PFJlZ2lvbj4pIHtcclxuICAgICAgICByZWdpb25zLmZvckVhY2gocmVnaW9uID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yZWdpb25zLnB1c2gocmVnaW9uKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY29udGFpbnMgKHJvb20gOiBSb29tKSB7XHJcbiAgICAgICAgaWYodGhpcy5yb29tcy5pbmRleE9mKHJvb20pICE9IC0xKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yZWdpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWdpb25zW2ldLmdldFJvb21zKCkuaW5kZXhPZihyb29tKSAhPSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1RoaW5nLnRzXCIgLz5cclxuaW50ZXJmYWNlIEJvZHlwYXJ0VmFsdWVSZXN1bHQge1xyXG4gICAgdmFsdWUgOiBudW1iZXI7XHJcbiAgICB3ZWlnaHQgOiBudW1iZXI7XHJcbn1cclxuXHJcbmNsYXNzIEJvZHlwYXJ0IGV4dGVuZHMgVGhpbmcge1xyXG4gICAgcHVibGljIHN0YXRpYyBXRUlHSFRfTE9XRVNUID0gMTtcclxuICAgIHB1YmxpYyBzdGF0aWMgV0VJR0hUX0xPVyA9IDM7XHJcbiAgICBwdWJsaWMgc3RhdGljIFdFSUdIVF9NRURJVU0gPSA1O1xyXG4gICAgcHVibGljIHN0YXRpYyBXRUlHSFRfSElHSCA9IDc7XHJcbiAgICBwdWJsaWMgc3RhdGljIFdFSUdIVF9ISUdIRVNUID0gOTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFNMVVRUSU5FU1NfTE9XRVNUX1NBSU5UTFkgPSAwO1xyXG4gICAgcHVibGljIHN0YXRpYyBTTFVUVElORVNTX0xPV19QUlVERSA9IDI1O1xyXG4gICAgcHVibGljIHN0YXRpYyBTTFVUVElORVNTX01FRElVTV9BVkVSQUdFID0gNTA7XHJcbiAgICBwdWJsaWMgc3RhdGljIFNMVVRUSU5FU1NfSElHSF9TTFVUID0gNzU7XHJcbiAgICBwdWJsaWMgc3RhdGljIFNMVVRUSU5FU1NfSElHSEVTVF9XSE9SRSA9IDEwMDtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIEdFTkRFUl9MT1dFU1RfTUFOTElFU1QgPSAwO1xyXG4gICAgcHVibGljIHN0YXRpYyBHRU5ERVJfTE9XX01BTkxZID0gMjU7XHJcbiAgICBwdWJsaWMgc3RhdGljIEdFTkRFUl9NRURJVU1fQU5EUk9HWU5FID0gNTA7XHJcbiAgICBwdWJsaWMgc3RhdGljIEdFTkRFUl9ISUdIX0ZFTUlOSU5FID0gNzU7XHJcbiAgICBwdWJsaWMgc3RhdGljIEdFTkRFUl9ISUdIRVNUX0ZFTUlOSU5FU1QgPSAxMDA7XHJcblxyXG4gICAgLy8gVGhlIGhpZ2hlciB0aGlzIG51bWJlciwgdGhlIG1vcmUgdGhlIGJvZHlwYXJ0IHdpbGwgYmUgd29ydGggZm9yIGhlYWx0aC5cclxuICAgIC8vIEZvciBpbnN0YW5jZSwgSEVBRCBzaG91bGQgYmUgd29ydGggbW9yZSB0aGFuIEZJTkdFUk5BSUwuXHJcbiAgICBwdWJsaWMgc29yZW5lc3NXZWlnaHQgOiBudW1iZXIgPSAxO1xyXG5cclxuICAgIC8vIDAgdG8gMTBcclxuICAgIC8vIHNheXMgaG93IGZ1Y2tlZCB1cCB0aGUgYm9keXBhcnQgaXNcclxuICAgIHB1YmxpYyBzb3JlbmVzcyA6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLy8gSG93IG11Y2ggc29yZW5lc3MgaXMgaGVhbGVkIGV2ZXJ5IHR1cm5cclxuICAgIHB1YmxpYyBzb3JlbmVzc1BlclR1cm4gOiBudW1iZXIgPSAwLjA1O1xyXG5cclxuICAgIC8vIExhc3QgdHVybiBzb3JlbmVzcyBnb3QgdXBkYXRlZFxyXG4gICAgcHVibGljIGxhc3RTb3JlbmVzc1VwZGF0ZSA6IG51bWJlciA9IDA7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChvcHRpb25zPyA6IFRoaW5nT3B0aW9ucykge1xyXG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xyXG4gICAgICAgIHRoaXMuYWRkR2V0QWx0ZXJhdGlvbnMoKGJwIDogQm9keXBhcnQpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIFNvcmVuZXNzIDogYnAuc29yZW5lc3MsXHJcbiAgICAgICAgICAgICAgICBHZW5kZXJWYWx1ZSA6IGJwLmdlbmRlclZhbHVlLFxyXG4gICAgICAgICAgICAgICAgU2x1dHRpbmVzcyA6IGJwLmdldFNsdXR0aW5lc3MoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuYWRkU2V0QWx0ZXJhdGlvbnMoKGJwIDogQm9keXBhcnQsIGNoYW5nZXMpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zb3JlbmVzcyA9IGNoYW5nZXMuU29yZW5lc3M7XHJcbiAgICAgICAgICAgIHRoaXMuZ2VuZGVyVmFsdWUgPSBjaGFuZ2VzLkdlbmRlclZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLnNsdXR0aW5lc3MgPSBjaGFuZ2VzLlNsdXR0aW5lc3M7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVNvcmVuZXNzICgpIHtcclxuICAgICAgICBsZXQgY1R1cm4gPSBXb3JsZFN0YXRlLmdldEN1cnJlbnRUdXJuKCk7XHJcbiAgICAgICAgaWYgKGNUdXJuID4gdGhpcy5sYXN0U29yZW5lc3NVcGRhdGUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc29yZW5lc3MgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvcmVuZXNzIC09ICh0aGlzLnNvcmVuZXNzUGVyVHVybiAqIChjVHVybiAtIHRoaXMubGFzdFNvcmVuZXNzVXBkYXRlKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc29yZW5lc3MgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3JlbmVzcyA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5sYXN0U29yZW5lc3NVcGRhdGUgPSBjVHVybjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNoYW5nZVNvcmVuZXNzIChzb3JlbmVzcyA6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMudXBkYXRlU29yZW5lc3MoKTtcclxuICAgICAgICB0aGlzLnNvcmVuZXNzICs9IHNvcmVuZXNzO1xyXG4gICAgICAgIGlmICh0aGlzLnNvcmVuZXNzIDwgMCkge1xyXG4gICAgICAgICAgICB0aGlzLnNvcmVuZXNzID0gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFNvcmVuZXNzICgpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNvcmVuZXNzKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc29yZW5lc3M7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXRXZWlnaHRlZFNvcmVuZXNzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFNvcmVuZXNzKCkgKiB0aGlzLnNvcmVuZXNzV2VpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTb3JlbmVzc1dlaWdodCAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc29yZW5lc3NXZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVGhlc2UgYXJlIHRoZSBzbG90cyB0aGUgYm9keXBhcnQgaXMgdmlzaWJsZSBvblxyXG4gICAgLy8gU2hvdWxkIHVzZSBIdW1hbm9pZC5TTE9UXyogIVxyXG4gICAgcHVibGljIHNsb3RzIDogQXJyYXk8bnVtYmVyPiA9IFtdO1xyXG4gICAgcHVibGljIHZpc2libGVTbG90cyA6IEFycmF5PG51bWJlcj4gPSBbXTtcclxuXHJcbiAgICAvLyBHZW5kZXJWYWx1ZSBpcyBob3cgbWFzY3VsaW5lL2ZlbWluaW5lIHRoaXMgYm9keXBhcnQgaXMuXHJcbiAgICAvLyBBdCAwID0gdGhlIG1vc3QgbWFzY3VsaW5lIHBvc3NpYmxlLCBhdCAxMDAgPSB0aGUgbW9zdCBmZW1pbmluZSBldmV0ZXJcclxuICAgIC8vIDUwIHdvdWxkIGJlIGNvbXBsZXRlbHkgYW5kcm9neW5vdXNcclxuICAgIHB1YmxpYyBnZW5kZXJWYWx1ZSA6IG51bWJlciA9IEJvZHlwYXJ0LkdFTkRFUl9NRURJVU1fQU5EUk9HWU5FO1xyXG5cclxuICAgIC8vIExpa2Ugd2l0aCBoZWFsdGgsIHRoZSB3ZWlnaHQgbWFrZXMgdGhpcyBib2R5cGFydCBtYXR0ZXIgbW9yZSBmb3IgZGVjaWRpbmcgZ2VuZGVyLlxyXG4gICAgLy8gR2VuZGVyIHByZXNlbnRhdGlvbiBpcyBub3QgYWJvdXQgcHJldHRpbmVzcywgc28sIGZvciBpbnN0YW5jZSwgaGF2aW5nIGh1Z2UgYnJlYXN0cyB3aWxsXHJcbiAgICAvLyBzdHJvbmdseSBwdXNoIHlvdSB0byB0aGUgXCJpcyBhIHdvbWFuXCIgc2lkZSwgZXZlbiBpZiB5b3UncmUgbWFubHkgYXMgZnVjayBldmVyeXdoZXJlIGVsc2UuXHJcbiAgICAvLyBJZiB5b3UncmUgdG9vIG1hbmx5IGV2ZXJ5d2hlcmUgZWxzZSwgdGhvdWdoLCB5b3UnbGwgcHJvYmFibHkgZW5kIHVwIGNsb3NlciBvbiB0aGUgc3BlY3RydW0gdG8gbWFsZVxyXG4gICAgLy8gb3IgYXQgbGVhc3QgYW5kcm9neW5vdXMsIHdoaWNoIG1pZ2h0IHJlc3VsdCBpbiBub3QgcGFzc2luZy5cclxuICAgIHB1YmxpYyBnZW5kZXJXZWlnaHQgOiBudW1iZXIgPSAxO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2x1dHRpbmVzcyBnb2VzIGZyb20gMCB0byAxMDAuXHJcbiAgICAgKiBBIGJvZHlwYXJ0J3Mgc2x1dHRpbmVzcyBpcyBkZXBlbmRlbnQgb24gaXQgYmVpbmcgc2Vlbi5cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzbHV0dGluZXNzIDogbnVtYmVyID0gMTA7XHJcblxyXG4gICAgcHVibGljIHNsdXR0aW5lc3NXZWlnaHQgOiBudW1iZXIgPSBCb2R5cGFydC5XRUlHSFRfTE9XRVNUO1xyXG5cclxuICAgIHB1YmxpYyBnZXRHZW5kZXJXZWlnaHQgKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNsb3RzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5nZW5kZXJXZWlnaHQgKiAodGhpcy52aXNpYmxlU2xvdHMubGVuZ3RoIC8gdGhpcy5zbG90cy5sZW5ndGgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRHZW5kZXJWYWx1ZSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZGVyVmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFdlaWdodGVkR2VuZGVyVmFsdWUgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEdlbmRlclZhbHVlKCkgKiB0aGlzLmdldEdlbmRlcldlaWdodCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTbHV0dGluZXNzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNsdXR0aW5lc3M7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFNsdXR0aW5lc3NXZWlnaHQgKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNsb3RzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5zbHV0dGluZXNzV2VpZ2h0ICogKHRoaXMudmlzaWJsZVNsb3RzLmxlbmd0aCAvIHRoaXMuc2xvdHMubGVuZ3RoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0V2VpZ2h0ZWRTbHV0dGluZXNzVmFsdWUgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFNsdXR0aW5lc3MoKSAqIHRoaXMuZ2V0U2x1dHRpbmVzc1dlaWdodCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVWaXNpYmlsaXR5ICgpIHtcclxuICAgICAgICB0aGlzLnZpc2libGVTbG90cyA9IHRoaXMuc2xvdHMuc2xpY2UoMCk7XHJcbiAgICAgICAgbGV0IHBhcmVudCA9IFRoaW5nLlBhcnRSZWxhdGlvbi5nZXRMZWZ0KHRoaXMpO1xyXG4gICAgICAgIGlmIChwYXJlbnQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGxldCBjbG90aGluZyA9IDxBcnJheTxDbG90aGluZz4+VGhpbmcuV2VhclJlbGF0aW9uLmdldFJpZ2h0KHBhcmVudCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xvdGhpbmcubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBjb3ZlcmluZyA9IGNsb3RoaW5nW2ldLmdldENvdmVyaW5nU2xvdHMoKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgY292ZXJpbmcubGVuZ3RoOyBrKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaWR4ID0gdGhpcy52aXNpYmxlU2xvdHMuaW5kZXhPZihjb3ZlcmluZ1trXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlzaWJsZVNsb3RzLnNwbGljZShpZHgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52aXNpYmxlU2xvdHMubGVuZ3RoID09IDApIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc1VuY292ZXJlZCAoKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5KCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaWJsZVNsb3RzLmxlbmd0aCA9PSB0aGlzLnNsb3RzLmxlbmd0aCAmJiB0aGlzLnNsb3RzLmxlbmd0aCA+IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVN0YXR1cyAoKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRTb3JlbmVzcyAodGhpbmcgOiBUaGluZykge1xyXG4gICAgICAgIGxldCBib2R5cGFydHMgPSBUaGluZy5QYXJ0UmVsYXRpb24uZ2V0UmlnaHRUeXBlKHRoaW5nLCBCb2R5cGFydCk7XHJcbiAgICAgICAgbGV0IHNvcmVuZXNzID0gMDtcclxuICAgICAgICBib2R5cGFydHMuZm9yRWFjaCgoYm9keXBhcnQgOiBCb2R5cGFydCkgPT4ge1xyXG4gICAgICAgICAgICBzb3JlbmVzcyArPSBib2R5cGFydC5nZXRXZWlnaHRlZFNvcmVuZXNzKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHNvcmVuZXNzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0R2VuZGVyVmFsdWVPbiAodGhpbmcgOiBUaGluZykgOiBCb2R5cGFydFZhbHVlUmVzdWx0IHtcclxuICAgICAgICBsZXQgd2VpZ2h0ID0gMDtcclxuICAgICAgICBsZXQgdmFsdWUgPSAwO1xyXG5cclxuICAgICAgICBsZXQgYm9keXBhcnRzID0gVGhpbmcuUGFydFJlbGF0aW9uLmdldFJpZ2h0VHlwZSh0aGluZywgQm9keXBhcnQpO1xyXG4gICAgICAgIGJvZHlwYXJ0cy5mb3JFYWNoKChib2R5cGFydCA6IEJvZHlwYXJ0KSA9PiB7XHJcbiAgICAgICAgICAgIHdlaWdodCArPSBib2R5cGFydC5nZXRHZW5kZXJXZWlnaHQoKTtcclxuICAgICAgICAgICAgdmFsdWUgKz0gYm9keXBhcnQuZ2V0V2VpZ2h0ZWRHZW5kZXJWYWx1ZSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB3ZWlnaHQgOiB3ZWlnaHQsXHJcbiAgICAgICAgICAgIHZhbHVlIDogdmFsdWVcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0U2x1dHRpbmVzc1ZhbHVlT24gKHRoaW5nIDogVGhpbmcpIDogQm9keXBhcnRWYWx1ZVJlc3VsdCB7XHJcbiAgICAgICAgbGV0IHdlaWdodCA9IDA7XHJcbiAgICAgICAgbGV0IHZhbHVlID0gMDtcclxuXHJcbiAgICAgICAgbGV0IGJvZHlwYXJ0cyA9IFRoaW5nLlBhcnRSZWxhdGlvbi5nZXRSaWdodFR5cGUodGhpbmcsIEJvZHlwYXJ0KTtcclxuICAgICAgICBib2R5cGFydHMuZm9yRWFjaCgoYm9keXBhcnQgOiBCb2R5cGFydCkgPT4ge1xyXG4gICAgICAgICAgICB3ZWlnaHQgKz0gYm9keXBhcnQuZ2V0U2x1dHRpbmVzc1dlaWdodCgpO1xyXG4gICAgICAgICAgICB2YWx1ZSArPSBib2R5cGFydC5nZXRXZWlnaHRlZFNsdXR0aW5lc3NWYWx1ZSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB3ZWlnaHQgOiB3ZWlnaHQsXHJcbiAgICAgICAgICAgIHZhbHVlIDogdmFsdWVcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hhbmdlcyB0aGUgYm9keXBhcnQgc28gdGhhdCBpdCBtYXRjaGVzIHRoZSBkZXNpcmVkIGdlbmRlclZhbHVlLlxyXG4gICAgICogVGhpcyBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZCBpbiBhbGwgY2xhc3NlcyBpbmhlcml0aW5nIGZyb20gQm9keXBhcnQsIGFzIG5vdCBhbGwgYm9keXBhcnRzIGhhdmUgYSBzaW1wbGUgXCJnZW5kZXJWYWx1ZVwiIHRvIGFzc2lnbi5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBnZW5kZXJWYWx1ZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXJyYW5nZUdlbmRlclZhbHVlIChnZW5kZXJWYWx1ZSA6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuZ2VuZGVyVmFsdWUgPSBnZW5kZXJWYWx1ZTtcclxuICAgICAgICAoPEh1bWFub2lkPiB0aGlzLmdldFBhcnRPbmUoKSkuaW52YWxpZGF0ZUNhY2hlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXR0ZW1wdHMgdG8gaW5jcmVhc2UgRmVtaW5pbml0eSBieSA1ICogYW1vdW50LiBXaWxsIHJlYWQgQ3VycmVudCBHZW5kZXIgVmFsdWUgYW5kIHRyeSB0byByZWFzc2lnbiBpdC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhbW91bnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGluY3JlYXNlRmVtaW5pbml0eSAoYW1vdW50IDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRHViA9IHRoaXMuZ2V0R2VuZGVyVmFsdWUoKTtcclxuICAgICAgICB0aGlzLmFycmFuZ2VHZW5kZXJWYWx1ZShjdXJyZW50R1YgKyAoNSAqIGFtb3VudCkpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEF0dGVtcHRzIHRvIGluY3JlYXNlIE1hc2N1bGluaXR5IGJ5IDUgKiBhbW91bnQuIFdpbGwgcmVhZCBDdXJyZW50IEdlbmRlciBWYWx1ZSBhbmQgdHJ5IHRvIHJlYXNzaWduIGl0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFtb3VudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5jcmVhc2VNYXNjdWxpbml0eSAoYW1vdW50IDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRHViA9IHRoaXMuZ2V0R2VuZGVyVmFsdWUoKTtcclxuICAgICAgICB0aGlzLmFycmFuZ2VHZW5kZXJWYWx1ZShjdXJyZW50R1YgLSAoNSAqIGFtb3VudCkpO1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0JvZHlwYXJ0LnRzXCIgLz5cclxuY2xhc3MgU2V4U3RpY2sgZXh0ZW5kcyBCb2R5cGFydCB7XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgaG93IHdpZGUgdGhlIG1lbWJlciBpcy4gSWYgdGhpcyBTZXhTdGljayBkZXBlbmRzbyBuIGFyb3VzYWwsIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gb2Nuc2lkZXIgdGhhdC5cclxuICAgICAqIFRoaXMgaXMgcmVsZXZhbnQgdG8gaG93IG11Y2ggYSBTZXhIb2xlIHdpbGwgYmUgc3RyZXRjaGVkIG91dCBieSB0aGlzIFNleFN0aWNrLlxyXG4gICAgICogQHJldHVybnMge251bWJlcn1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFdpZGUgKCkgOiBNZWFzdXJlIHtcclxuICAgICAgICByZXR1cm4gbmV3IE1lYXN1cmUoKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBob3cgbG9uZyB0aGUgbWVtYmVyIGlzLiBJZiB0aGlzIFNleFN0aWNrIGRlcGVuZHMgb24gYXJvdXNhbCwgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBjb25zaWRlciB0aGF0LlxyXG4gICAgICogVGhpcyBpcyByZWxldmFudCB0byBob3cgbXVjaCBhIFNleEhvbGUgd2lsbCBiZSBzdHJldGNoZWQgb3V0IGJ5IHRoaXMgU2V4U3RpY2suXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TG9uZyAoKSA6IE1lYXN1cmV7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBNZWFzdXJlKClcclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9Cb2R5cGFydC50c1wiIC8+XHJcbmNsYXNzIFNleEhvbGUgZXh0ZW5kcyBCb2R5cGFydCB7XHJcblxyXG59IiwiaW50ZXJmYWNlIE1lYXN1cmVtZW50IHtcclxuICAgIGdldFRleHQgOiAoKSA9PiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIG1lYXN1cmUgaXMgQUxXQVlTIGNyZWF0ZWQgaW4gQ2VudGltZXRlcnMuXHJcbiAqIEhvdyBhIG1lYXN1cmUgZ2V0cyBkaXNwbGF5ZWQgY2FuIGdldCBjaGFuZ2VkIGxhdGVyLCBzbyBhbHdheXMgdXNlIHRoaXMgY2xhc3MgZm9yIG1lYXN1cmVzIVxyXG4gKiBJZiB5b3UncmUgYW1lcmljYW4sIHVzZSB0aGUgaGVscGVyIHN0YXRpYyBmdW5jdGlvbnMgZnJvbUluY2hlcywgZnJvbUZlZXQgdG8gZ2V0IGNlbnRpbWV0ZXJzLlxyXG4gKiBGb3IgaW5zdGFuY2UsIDUnMTBcIiB3b3VsZCBnZXQgY3JlYXRlZCBhczpcclxuICogbmV3IE1lYXN1cmUoTWVhc3VyZS5mcm9tRmVldCg1KSArIE1lYXN1cmUuZnJvbUluY2hlcygxMClcclxuICpcclxuICogSWYgbXVsdGlwbGUgbWVhc3VyZW1lbnRzIGFyZSBhZGRlZCwgaXQncyB0cmVhdGVkIGFzIGFyZWEgb2Ygc29tZXRoaW5nIHNpbXBsZSBsaWtlIHJlY3RhbmdsZXMgb3IgY3ViZXMgb3Igd2hhdGV2ZXIsIHRoZXkncmUganVzdCBtdWx0aXBsaWVkLlxyXG4gKi9cclxuY2xhc3MgTWVhc3VyZSBpbXBsZW1lbnRzIE1lYXN1cmVtZW50IHtcclxuICAgIHByaXZhdGUgdW5pdHMgOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIHNpZGVzIDogbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoLi4uc2lkZXMgOiBBcnJheTxudW1iZXI+KSB7XHJcbiAgICAgICAgdGhpcy51bml0cyA9IDE7XHJcbiAgICAgICAgc2lkZXMuZm9yRWFjaCgoc2lkZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnVuaXRzICo9IHNpZGU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5zaWRlcyA9IHNpZGVzLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBbXCIwXCIsIFwiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiLCBcIjVcIiwgXCI2XCIsIFwiN1wiLCBcIjhcIiwgXCI5XCJdXHJcbiAgICBwcml2YXRlIHN1cGVyc2NyaXB0ID0gICBbXCJcIiAsIFwiXCIgLCBcIsKyXCIsIFwiwrNcIiwgXCLigbRcIiwgXCLigbVcIiwgXCLigbZcIiwgXCLigbdcIiwgXCLigbhcIiwgXCLigblcIl07XHJcblxyXG4gICAgcHVibGljIGdldFRleHQgKCkge1xyXG4gICAgICAgIGxldCBtZXRlcnMgPSBNYXRoLnBvdyh0aGlzLnNpZGVzLCAxMDApO1xyXG4gICAgICAgIGlmICh0aGlzLnVuaXRzID4gbWV0ZXJzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAoKyh0aGlzLnVuaXRzIC8gbWV0ZXJzKS50b0ZpeGVkKDIpKS50b1N0cmluZygpICsgXCJtXCIgKyB0aGlzLnN1cGVyc2NyaXB0W3RoaXMuc2lkZXNdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnVuaXRzLnRvU3RyaW5nKCkgKyBcImNtXCIgKyB0aGlzLnN1cGVyc2NyaXB0W3RoaXMuc2lkZXNdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TnVtYmVyICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy51bml0cztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0U2lkZXMgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNpZGVzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbUluY2hlcyAoaW5jaGVzIDogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIGluY2hlcyAqIDIuNTQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBmcm9tRmVldCAoZmVldCA6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiBmZWV0ICogMzAuNDg7XHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIE1lYXN1cmVMaXF1aWQgaW1wbGVtZW50cyBNZWFzdXJlbWVudCB7XHJcbiAgICBwcml2YXRlIHVuaXRzIDogbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAobWlsbGlsaXRlcnMgOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLnVuaXRzID0gbWlsbGlsaXRlcnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFRleHQgKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnVuaXRzID4gMTAwMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gKCsodGhpcy51bml0cyAvIDEwMDApLnRvRml4ZWQoMikpLnRvU3RyaW5nKCkgKyBcIkxcIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy51bml0cy50b1N0cmluZygpICsgXCJtTFwiO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGZyb21MaXRlcnMgKGxpdGVycyA6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiBsaXRlcnMgKiAxMDAwO1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL0JvZHlwYXJ0LnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL0h1bWFub2lkL0h1bWFub2lkLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1NleFN0aWNrLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1NleEhvbGUudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vLi4vTWVhc3VyZS50c1wiIC8+XHJcbmNsYXNzIEh1bWFub2lkQXJtcyBleHRlbmRzIEJvZHlwYXJ0IHtcclxuICAgIHB1YmxpYyBzb3JlbmVzc1dlaWdodCA9IEJvZHlwYXJ0LldFSUdIVF9MT1c7XHJcbiAgICBwdWJsaWMgZ2VuZGVyV2VpZ2h0ID0gQm9keXBhcnQuV0VJR0hUX01FRElVTTtcclxuICAgIHB1YmxpYyBzbG90cyA6IEFycmF5PG51bWJlcj4gPSBbSHVtYW5vaWQuU0xPVF9BUk1TXTtcclxuXHJcbiAgICBwdWJsaWMgZ2V0IHNsdXR0aW5lc3NXZWlnaHQoKSB7XHJcbiAgICAgICAgaWYgKCg8SHVtYW5vaWQ+IHRoaXMuZ2V0UGFydE9uZSgpKS5pc01hbGUoKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gQm9keXBhcnQuV0VJR0hUX0hJR0hFU1Q7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIEJvZHlwYXJ0LldFSUdIVF9NRURJVU07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgc2x1dHRpbmVzc1dlaWdodCh2YWwpIHt9XHJcblxyXG4gICAgcHVibGljIGdldFNsdXR0aW5lc3MgKCkge1xyXG4gICAgICAgIGlmICgoPEh1bWFub2lkPiB0aGlzLmdldFBhcnRPbmUoKSkuaXNNYWxlKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0R2VuZGVyVmFsdWUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMTAwIC0gdGhpcy5nZXRHZW5kZXJWYWx1ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RGVzY3JpcHRpb24gKCkge1xyXG4gICAgICAgIGxldCBodW1hbm9pZCA9IDxIdW1hbm9pZD4gdGhpcy5nZXRQYXJ0T25lKCk7XHJcbiAgICAgICAgbGV0IHN0ciA9IGh1bWFub2lkLmdldFN0YXQoQXR0cmlidXRlcy5TdHJlbmd0aCk7XHJcbiAgICAgICAgaWYgKHN0ciA+IDQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFwiWW91ciBhcm1zIGFuZCBsZWdzIGFyZSByaWRpY3Vsb3VzbHkgaHVnZSwgc2hvd2luZyBvZmYganVzdCBob3cgc3Ryb25nIHlvdSBhcmUuXCI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzdHIgPiAyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcIllvdXIgYXJtcyBhbmQgbGVncyBhcmUgcHJldHR5IGJpZyBiZWNhdXNlIG9mIHlvdXIgbXVzY2xlcy5cIjtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0ciA9PSAyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcIllvdSBsb29rIGxpa2UgeW91IGRvbid0IGV2ZW4gbGlmdC5cIjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEdlbmRlclZhbHVlICgpIHtcclxuICAgICAgICBsZXQgaHVtYW5vaWQgPSA8SHVtYW5vaWQ+IHRoaXMuZ2V0UGFydE9uZSgpO1xyXG4gICAgICAgIGxldCBzdHIgPSBodW1hbm9pZC5nZXRTdGF0KEF0dHJpYnV0ZXMuU3RyZW5ndGgpO1xyXG4gICAgICAgIHJldHVybiAyMCAqIHN0cjtcclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9Cb2R5cGFydC50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9IdW1hbm9pZC9IdW1hbm9pZC50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9TZXhTdGljay50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9TZXhIb2xlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL01lYXN1cmUudHNcIiAvPlxyXG5jbGFzcyBIdW1hbm9pZEJyZWFzdHMgZXh0ZW5kcyBCb2R5cGFydCB7XHJcbiAgICBwdWJsaWMgc2l6ZSA6IG51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgc2lsaWNvbmUgOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIG1pbGsgOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBzb3JlbmVzc1dlaWdodCA9IEJvZHlwYXJ0LldFSUdIVF9NRURJVU07XHJcbiAgICBwdWJsaWMgZ2VuZGVyV2VpZ2h0ID0gQm9keXBhcnQuV0VJR0hUX0hJR0g7XHJcbiAgICBwdWJsaWMgc2xvdHMgOiBBcnJheTxudW1iZXI+ID0gW0h1bWFub2lkLlNMT1RfQlJFQVNUU107XHJcbiAgICBwdWJsaWMgc2x1dHRpbmVzcyA9IEJvZHlwYXJ0LlNMVVRUSU5FU1NfSElHSF9TTFVUO1xyXG4gICAgcHVibGljIHNsdXR0aW5lc3NXZWlnaHQgPSBCb2R5cGFydC5XRUlHSFRfTUVESVVNO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAob3B0aW9ucz8gOiBUaGluZ09wdGlvbnMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zKTtcclxuICAgICAgICB0aGlzLmFkZEdldEFsdGVyYXRpb25zKCh0aGluZykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgU2l6ZSA6IHRoaXMuc2l6ZSxcclxuICAgICAgICAgICAgICAgIFNpbGljb25lIDogdGhpcy5zaWxpY29uZSxcclxuICAgICAgICAgICAgICAgIE1pbGsgOiB0aGlzLm1pbGtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmFkZFNldEFsdGVyYXRpb25zKCh0aGluZywgY2hhbmdlcykgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNpemUgPSBjaGFuZ2VzLlNpemU7XHJcbiAgICAgICAgICAgIHRoaXMuc2lsaWNvbmUgPSBjaGFuZ2VzLlNpbGljb25lO1xyXG4gICAgICAgICAgICB0aGlzLm1pbGsgPSBjaGFuZ2VzLk1pbGs7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFNpemUgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNpemUgKyB0aGlzLnNpbGljb25lICsgdGhpcy5taWxrO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTaXplVGV4dCAoKSB7XHJcbiAgICAgICAgcmV0dXJuIEh1bWFub2lkQnJlYXN0cy5nZXRTaXplVGV4dCh0aGlzLmdldFNpemUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRTaXplVGV4dCAoc2l6ZSA6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBuYW1lcyA9IFtcImZsYXRcIiwgXCJBQS1jdXBcIiwgXCJBLWN1cFwiLCBcIkItY3VwXCIsIFwiQy1jdXBcIiwgXCJELWN1cFwiLCBcIkUtY3VwXCIsIFwiRi1jdXBcIiwgXCJHLWN1cFwiLCBcIkgtY3VwXCJdO1xyXG4gICAgICAgIGlmIChzaXplID49IG5hbWVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gXCJIVUdFXCI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5hbWVzW3NpemVdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0R2VuZGVyVmFsdWUgKCkge1xyXG4gICAgICAgIHJldHVybiBIdW1hbm9pZEJyZWFzdHMuZ2V0R2VuZGVyRnJvbVNpemUodGhpcy5nZXRTaXplKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTbHV0dGluZXNzICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRHZW5kZXJWYWx1ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0R2VuZGVyRnJvbVNpemUgKHNpemUgOiBudW1iZXIpIHtcclxuICAgICAgICBpZiAoc2l6ZSA8PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAyMDtcclxuICAgICAgICB9IGVsc2UgaWYgKHNpemUgPD0gMykge1xyXG4gICAgICAgICAgICByZXR1cm4gMjAgKiBzaXplO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiA4MDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFycmFuZ2VHZW5kZXJWYWx1ZSAoZ3YgOiBudW1iZXIpIHtcclxuICAgICAgICBpZiAoZ3YgPD0gMjApIHtcclxuICAgICAgICAgICAgdGhpcy5zaXplID0gMDtcclxuICAgICAgICAgICAgdGhpcy5zaWxpY29uZSA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMubWlsayA9IDA7XHJcbiAgICAgICAgfSBlbHNlIGlmIChndiA8IDgwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IE1hdGgucm91bmQoZ3YgLyAyMCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zaXplID0gNDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vQm9keXBhcnQudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vSHVtYW5vaWQvSHVtYW5vaWQudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vU2V4U3RpY2sudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vU2V4SG9sZS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi9NZWFzdXJlLnRzXCIgLz5cclxuY2xhc3MgSHVtYW5vaWRCdXR0IGV4dGVuZHMgQm9keXBhcnQge1xyXG4gICAgcHVibGljIHNpemUgOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIHNpbGljb25lIDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwdWJsaWMgc29yZW5lc3NXZWlnaHQgPSBCb2R5cGFydC5XRUlHSFRfTUVESVVNO1xyXG4gICAgcHVibGljIGdlbmRlcldlaWdodCA9IEJvZHlwYXJ0LldFSUdIVF9NRURJVU07XHJcbiAgICBwdWJsaWMgc2xvdHMgOiBBcnJheTxudW1iZXI+ID0gW0h1bWFub2lkLlNMT1RfQlVUVF07XHJcbiAgICBwdWJsaWMgc2x1dHRpbmVzcyA9IEJvZHlwYXJ0LlNMVVRUSU5FU1NfSElHSF9TTFVUO1xyXG4gICAgcHVibGljIHNsdXR0aW5lc3NXZWlnaHQgPSBCb2R5cGFydC5XRUlHSFRfTUVESVVNO1xyXG5cclxuICAgIHB1YmxpYyBnZXRTbHV0dGluZXNzICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRTaXplKCkgKiAzMztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKG9wdGlvbnM/IDogVGhpbmdPcHRpb25zKSB7XHJcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5hZGRHZXRBbHRlcmF0aW9ucygodGhpbmcpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIFNpemUgOiB0aGlzLnNpemUsXHJcbiAgICAgICAgICAgICAgICBTaWxpY29uZSA6IHRoaXMuc2lsaWNvbmVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmFkZFNldEFsdGVyYXRpb25zKCh0aGluZywgY2hhbmdlcykgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNpemUgPSBjaGFuZ2VzLlNpemU7XHJcbiAgICAgICAgICAgIHRoaXMuc2lsaWNvbmUgPSBjaGFuZ2VzLlNpbGljb25lO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTaXplICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zaXplICsgdGhpcy5zaWxpY29uZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0U2l6ZVRleHQgKCkge1xyXG4gICAgICAgIHJldHVybiBIdW1hbm9pZEJ1dHQuZ2V0U2l6ZVRleHQodGhpcy5nZXRTaXplKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0U2l6ZVRleHQgKHNpemUgOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgbmFtZXMgPSBbXCJmbGF0XCIsIFwidGlueVwiLCBcInJvdW5kXCIsIFwicGx1bXBcIl07IC8vIFRPRE86IGZpbmlzaCB0aGlzXHJcbiAgICAgICAgaWYgKHNpemUgPj0gbmFtZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcImdhcmdhbnR1YW5cIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbmFtZXNbc2l6ZV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRHZW5kZXJWYWx1ZSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIEh1bWFub2lkQnJlYXN0cy5nZXRHZW5kZXJGcm9tU2l6ZSh0aGlzLmdldFNpemUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRHZW5kZXJGcm9tU2l6ZSAoc2l6ZSA6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChzaXplIDw9IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIDIwO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA8PSAyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAzMCAqIHNpemU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDgwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBUT0RPOiBSRVBMQUNFIE5VTUJFUlMgV0lUSCBUQUJMRVxyXG4gICAgcHVibGljIGFycmFuZ2VHZW5kZXJWYWx1ZSAoZ3YgOiBudW1iZXIpIHtcclxuICAgICAgICBpZiAoZ3YgPD0gMjApIHtcclxuICAgICAgICAgICAgdGhpcy5zaXplID0gMDtcclxuICAgICAgICB9IGVsc2UgaWYgKGd2IDw9IDYwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IDE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zaXplID0gMztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vQm9keXBhcnQudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vSHVtYW5vaWQvSHVtYW5vaWQudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vU2V4U3RpY2sudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vU2V4SG9sZS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi9NZWFzdXJlLnRzXCIgLz5cclxuY2xhc3MgSHVtYW5vaWRFeHRyZW1pdHkgZXh0ZW5kcyBCb2R5cGFydCB7XHJcbiAgICBwdWJsaWMgbmFpbHNQYWludGVkIDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIG5haWxDb2xvciA9IDA7XHJcbiAgICBwdWJsaWMgc3RhdGljIG5haWxDb2xvck5hbWVzID0gWydub25lJywgJ3JlZCcsICdwaW5rJ107XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb2xvciAoaW5kZXggOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gSHVtYW5vaWRFeHRyZW1pdHkubmFpbENvbG9yTmFtZXNbaW5kZXhdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAob3B0aW9ucz8gOiBUaGluZ09wdGlvbnMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zKTtcclxuICAgICAgICB0aGlzLmFkZEdldEFsdGVyYXRpb25zKCh0aGluZykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgUGFpbnRlZCA6IHRoaXMubmFpbHNQYWludGVkLFxyXG4gICAgICAgICAgICAgICAgQ29sb3IgOiB0aGlzLm5haWxDb2xvclxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuYWRkU2V0QWx0ZXJhdGlvbnMoKHRoaW5nLCBjaGFuZ2VzKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubmFpbHNQYWludGVkID0gY2hhbmdlcy5QYWludGVkO1xyXG4gICAgICAgICAgICB0aGlzLm5haWxDb2xvciA9IGNoYW5nZXMuQ29sb3I7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFNsdXR0aW5lc3MgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEdlbmRlclZhbHVlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEdlbmRlclZhbHVlICgpIHtcclxuICAgICAgICBsZXQgbmFpbFBhaW50ZWRDb3JyZWN0aW9uID0gdGhpcy5uYWlsQ29sb3IgKiA1MDsgLy8gVE9ETzogRG9uJ3QgbGVhdmUgdGhpcyBhcy1pcy4uLiB0aGVyZSBzaG91bGQgYmUgcGxlbnR5IG9mIGNvbG9ycy5cclxuICAgICAgICBsZXQgbmFpbFBhaW50ZWRDb3JyZWN0aW9uV2VpZ2h0ID0gdGhpcy5uYWlsc1BhaW50ZWQgPyAzIDogMDtcclxuXHJcbiAgICAgICAgbGV0IGd2ID0gdGhpcy5nZW5kZXJWYWx1ZTtcclxuICAgICAgICBsZXQgZ3cgPSB0aGlzLmdlbmRlcldlaWdodDtcclxuXHJcbiAgICAgICAgcmV0dXJuICgoZ3YgKiBndykgKyAobmFpbFBhaW50ZWRDb3JyZWN0aW9uICogbmFpbFBhaW50ZWRDb3JyZWN0aW9uV2VpZ2h0KSkgLyAoZ3cgKyBuYWlsUGFpbnRlZENvcnJlY3Rpb25XZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhcnJhbmdlR2VuZGVyVmFsdWUgKGd2IDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5nZW5kZXJWYWx1ZSA9IGd2OyAvLyBUT0RPOiBUaGlzIHdpbGwgYmUgZXh0cmVtaXR5IHNpemUvYXBwZWFyYW5jZS4gTWF5YmUgbWFrZSBpdCBtb3JlIGRldGFpbGVkIGlmIGludGVyZXN0ZWQuXHJcbiAgICAgICAgdGhpcy5uYWlsc1BhaW50ZWQgPSBndiA+IDYwO1xyXG4gICAgICAgIGlmICh0aGlzLm5haWxzUGFpbnRlZCkge1xyXG4gICAgICAgICAgICBpZiAoZ3YgPiA3MCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uYWlsQ29sb3IgPSAyO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uYWlsQ29sb3IgPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgICg8SHVtYW5vaWQ+IHRoaXMuZ2V0UGFydE9uZSgpKS5pbnZhbGlkYXRlQ2FjaGVzKCk7XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vQm9keXBhcnQudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vSHVtYW5vaWQvSHVtYW5vaWQudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vU2V4U3RpY2sudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vU2V4SG9sZS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi9NZWFzdXJlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkh1bWFub2lkRXh0cmVtaXR5LnRzXCIgLz5cclxuY2xhc3MgSHVtYW5vaWRGZWV0IGV4dGVuZHMgSHVtYW5vaWRFeHRyZW1pdHkge1xyXG4gICAgcHVibGljIHNvcmVuZXNzV2VpZ2h0ID0gQm9keXBhcnQuV0VJR0hUX0xPVztcclxuICAgIHB1YmxpYyBnZW5kZXJXZWlnaHQgPSBCb2R5cGFydC5XRUlHSFRfTE9XO1xyXG4gICAgcHVibGljIHNsb3RzIDogQXJyYXk8bnVtYmVyPiA9IFtIdW1hbm9pZC5TTE9UX0ZFRVRdO1xyXG5cclxuICAgIHB1YmxpYyBnZXREZXNjcmlwdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IHNheSA9IG5ldyBTYXkoKTtcclxuICAgICAgICBpZiAodGhpcy5nZW5kZXJWYWx1ZSA+IDU1KSB7XHJcbiAgICAgICAgICAgIHNheS5hZGQoXCJZb3VyIGZlZXQgYXJlIHNtYWxsIGFuZCBjdXRlLlwiKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2VuZGVyVmFsdWUgPCA0NSkge1xyXG4gICAgICAgICAgICBzYXkuYWRkKFwiWW91ciBmZWV0IGFyZSBiaWcgYW5kIG1hbm5pc2guXCIpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm5haWxzUGFpbnRlZCkge1xyXG4gICAgICAgICAgICBzYXkuYWRkKFwiIFlvdXIgdG9lbmFpbHMgYXJlIHBhaW50ZWQgXCIgKyBIdW1hbm9pZEV4dHJlbWl0eS5nZXRDb2xvcih0aGlzLm5haWxDb2xvcikgKyBcIi5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzYXk7XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vQm9keXBhcnQudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vSHVtYW5vaWQvSHVtYW5vaWQudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vU2V4U3RpY2sudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vU2V4SG9sZS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi9NZWFzdXJlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkh1bWFub2lkRXh0cmVtaXR5LnRzXCIgLz5cclxuY2xhc3MgSHVtYW5vaWRIYW5kcyBleHRlbmRzIEh1bWFub2lkRXh0cmVtaXR5IHtcclxuICAgIHB1YmxpYyBzb3JlbmVzc1dlaWdodCA9IEJvZHlwYXJ0LldFSUdIVF9MT1c7XHJcbiAgICBwdWJsaWMgZ2VuZGVyV2VpZ2h0ID0gQm9keXBhcnQuV0VJR0hUX01FRElVTTtcclxuICAgIHB1YmxpYyBzbG90cyA6IEFycmF5PG51bWJlcj4gPSBbSHVtYW5vaWQuU0xPVF9IQU5EU107XHJcblxyXG4gICAgcHVibGljIGdldERlc2NyaXB0aW9uICgpIHtcclxuICAgICAgICBsZXQgc2F5ID0gbmV3IFNheSgpO1xyXG4gICAgICAgIGlmICh0aGlzLmdlbmRlclZhbHVlID4gNTUpIHtcclxuICAgICAgICAgICAgc2F5LmFkZChcIllvdXIgaGFuZHMgYXJlIGRlbGljYXRlIGFuZCBzbGVuZGVyLlwiKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2VuZGVyVmFsdWUgPCA0NSkge1xyXG4gICAgICAgICAgICBzYXkuYWRkKFwiWW91ciBoYW5kcyBhcmUgcm91Z2ggYW5kIGxhcmdlLlwiKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5uYWlsc1BhaW50ZWQpIHtcclxuICAgICAgICAgICAgc2F5LmFkZChcIiBZb3VyIHRvZW5haWxzIGFyZSBwYWludGVkIFwiICsgSHVtYW5vaWRFeHRyZW1pdHkuZ2V0Q29sb3IodGhpcy5uYWlsQ29sb3IpICsgXCIuXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc2F5O1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL0JvZHlwYXJ0LnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL0h1bWFub2lkL0h1bWFub2lkLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1NleFN0aWNrLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1NleEhvbGUudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vLi4vTWVhc3VyZS50c1wiIC8+XHJcbmNsYXNzIEh1bWFub2lkSGVhZCBleHRlbmRzIEJvZHlwYXJ0IHtcclxuICAgIHB1YmxpYyBzb3JlbmVzc1dlaWdodCA9IEJvZHlwYXJ0LldFSUdIVF9NRURJVU07XHJcbiAgICBwdWJsaWMgZ2VuZGVyV2VpZ2h0ID0gQm9keXBhcnQuV0VJR0hUX0xPVztcclxuICAgIC8vIFRPRE86IG1ha2UgdGhlc2Ugc2xvdHMgYXMgb3duIGJvZHlwYXJ0cyBzbyB0aGF0IHRoZXkgY2FuIGJlIGhhbmRsZWQgYmV0dGVyXHJcbiAgICBwdWJsaWMgc2xvdHMgOiBBcnJheTxudW1iZXI+ID0gW0h1bWFub2lkLlNMT1RfSEVBREdFQVIsIEh1bWFub2lkLlNMT1RfSEFJUiwgSHVtYW5vaWQuU0xPVF9FQVJTLCBIdW1hbm9pZC5TTE9UX0ZBQ0UsIEh1bWFub2lkLlNMT1RfRVlFUywgLCBIdW1hbm9pZC5TTE9UX05PU0UsIEh1bWFub2lkLlNMT1RfTU9VVEhdO1xyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL0JvZHlwYXJ0LnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL0h1bWFub2lkL0h1bWFub2lkLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1NleFN0aWNrLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1NleEhvbGUudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vLi4vTWVhc3VyZS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi8uLi8uLi9FbGVtZW50cy9DbGFzc2VzL1NheS9PbmVPZi50c1wiIC8+XHJcbmNsYXNzIEh1bWFub2lkUGVuaXMgZXh0ZW5kcyBTZXhTdGljayB7XHJcblxyXG4gICAgcHVibGljIHNvcmVuZXNzV2VpZ2h0ID0gQm9keXBhcnQuV0VJR0hUX0hJR0g7XHJcbiAgICBwdWJsaWMgZ2VuZGVyVmFsdWUgPSAyNTtcclxuICAgIHB1YmxpYyBnZW5kZXJXZWlnaHQgPSBCb2R5cGFydC5XRUlHSFRfSElHSEVTVDtcclxuICAgIHB1YmxpYyBzbG90cyA6IEFycmF5PG51bWJlcj4gPSBbSHVtYW5vaWQuU0xPVF9DUk9UQ0hfRlJPTlRdO1xyXG4gICAgcHVibGljIHNsdXR0aW5lc3MgPSBCb2R5cGFydC5TTFVUVElORVNTX0hJR0hfU0xVVDtcclxuICAgIHB1YmxpYyBzbHV0dGluZXNzV2VpZ2h0ID0gQm9keXBhcnQuV0VJR0hUX01FRElVTTtcclxuXHJcbiAgICBwdWJsaWMgZmxhY2NpZFNpemUgPSBuZXcgTWVhc3VyZSg2KTtcclxuICAgIHB1YmxpYyBmbGFjY2lkV2lkdGggPSBuZXcgTWVhc3VyZSgzKTtcclxuICAgIHB1YmxpYyBlcmVjdFNpemUgPSBuZXcgTWVhc3VyZSgxNSk7XHJcbiAgICBwdWJsaWMgZXJlY3RXaWR0aCA9IG5ldyBNZWFzdXJlKDYpO1xyXG5cclxuICAgIHByaXZhdGUgYXJvdXNhbE1pbmltdW0gOiBudW1iZXIgPSA1O1xyXG4gICAgcHJpdmF0ZSBhcm91c2FsRXJlY3QgOiBudW1iZXIgPSAyNTtcclxuICAgIHByaXZhdGUgZmxhY2NpZE11bHQgOiBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIGdldFNsdXR0aW5lc3MgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ1bGdlU2l6ZSgpICogMztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNHcm93ZXIgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZsYWNjaWRNdWx0IDwgMC41O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAob3B0aW9ucz8gOiBUaGluZ09wdGlvbnMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zKTtcclxuICAgICAgICBpZiAoTWF0aC5yYW5kb20oKSA+PSAwLjUpIHtcclxuICAgICAgICAgICAgLy8gZ3Jvd2VyP1xyXG4gICAgICAgICAgICB0aGlzLmZsYWNjaWRNdWx0ID0gMC4zMztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBzaG93ZXI/XHJcbiAgICAgICAgICAgIHRoaXMuZmxhY2NpZE11bHQgPSAwLjc3O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFkZEdldEFsdGVyYXRpb25zKCh0aGluZykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgRlNpemUgOiB0aGlzLmZsYWNjaWRTaXplLmdldE51bWJlcigpLFxyXG4gICAgICAgICAgICAgICAgRldpZHRoIDogdGhpcy5mbGFjY2lkV2lkdGguZ2V0TnVtYmVyKCksXHJcbiAgICAgICAgICAgICAgICBFU2l6ZSA6IHRoaXMuZXJlY3RTaXplLmdldE51bWJlcigpLFxyXG4gICAgICAgICAgICAgICAgRVdpZHRoIDogdGhpcy5lcmVjdFdpZHRoLmdldE51bWJlcigpLFxyXG4gICAgICAgICAgICAgICAgQU1pbiA6IHRoaXMuYXJvdXNhbE1pbmltdW0sXHJcbiAgICAgICAgICAgICAgICBBRXJlY3QgOiB0aGlzLmFyb3VzYWxFcmVjdCxcclxuICAgICAgICAgICAgICAgIEZNdWx0IDogdGhpcy5mbGFjY2lkTXVsdFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuYWRkU2V0QWx0ZXJhdGlvbnMoKHRoaW5nLCBjaGFuZ2VzKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZmxhY2NpZFNpemUgPSBuZXcgTWVhc3VyZShjaGFuZ2VzLkZTaXplKTtcclxuICAgICAgICAgICAgdGhpcy5mbGFjY2lkV2lkdGggPSBuZXcgTWVhc3VyZShjaGFuZ2VzLkZXaWR0aCk7XHJcbiAgICAgICAgICAgIHRoaXMuZXJlY3RTaXplID0gbmV3IE1lYXN1cmUoY2hhbmdlcy5FU2l6ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZXJlY3RXaWR0aCA9IG5ldyBNZWFzdXJlKGNoYW5nZXMuRVdpZHRoKTtcclxuICAgICAgICAgICAgdGhpcy5hcm91c2FsTWluaW11bSA9IGNoYW5nZXMuQU1pbjtcclxuICAgICAgICAgICAgdGhpcy5hcm91c2FsRXJlY3QgPSBjaGFuZ2VzLkFFcmVjdDtcclxuICAgICAgICAgICAgdGhpcy5mbGFjY2lkTXVsdCA9IGNoYW5nZXMuRk11bHQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEFjdHVhbFNpemUgKCkge1xyXG4gICAgICAgIGxldCBtaW4gPSB0aGlzLmZsYWNjaWRTaXplLmdldE51bWJlcigpO1xyXG4gICAgICAgIGxldCBtYXggPSB0aGlzLmVyZWN0U2l6ZS5nZXROdW1iZXIoKTtcclxuICAgICAgICBsZXQgdmFyaWFibGVTaXplID0gKG1heCAtIG1pbik7XHJcblxyXG4gICAgICAgIGxldCBmaW5hbFNpemUgPSBtaW4gKyAodmFyaWFibGVTaXplICogdGhpcy5nZXRBcm91c2FsUGVyYygpKTtcclxuICAgICAgICByZXR1cm4gZmluYWxTaXplO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc0JpZyAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QnVsZ2VTaXplKCkgPiAyMjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QXJvdXNhbFBlcmMgKCkge1xyXG4gICAgICAgIC8vVE9ETzogR2V0IGFyb3VzYWwgZnJvbSBvd25lclxyXG4gICAgICAgIGxldCBhcm91c2FsID0gMDtcclxuICAgICAgICBsZXQgbnVtU3RlcHMgPSB0aGlzLmFyb3VzYWxFcmVjdCAtIHRoaXMuYXJvdXNhbE1pbmltdW07XHJcbiAgICAgICAgbGV0IGFyb3VzYWxQZXJjID0gKGFyb3VzYWwgLSB0aGlzLmFyb3VzYWxNaW5pbXVtKSAvIG51bVN0ZXBzO1xyXG4gICAgICAgIGFyb3VzYWxQZXJjID0gYXJvdXNhbFBlcmMgPCAwID8gMCA6XHJcbiAgICAgICAgICAgIGFyb3VzYWxQZXJjID4gMSA/IDEgOlxyXG4gICAgICAgICAgICAgICAgYXJvdXNhbFBlcmM7XHJcbiAgICAgICAgcmV0dXJuIGFyb3VzYWxQZXJjO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc0ZsYWNjaWQgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEFyb3VzYWxQZXJjKCkgPCAwLjY7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzRXJlY3QgKCkge1xyXG4gICAgICAgIHJldHVybiAhdGhpcy5pc0ZsYWNjaWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QWN0dWFsV2lkdGggKCkge1xyXG4gICAgICAgIGxldCBtaW4gPSB0aGlzLmZsYWNjaWRXaWR0aC5nZXROdW1iZXIoKTtcclxuICAgICAgICBsZXQgbWF4ID0gdGhpcy5lcmVjdFdpZHRoLmdldE51bWJlcigpO1xyXG4gICAgICAgIGxldCB2YXJpYWJsZVNpemUgPSAobWF4IC0gbWluKTtcclxuICAgICAgICBsZXQgbnVtU3RlcHMgPSB0aGlzLmFyb3VzYWxFcmVjdCAtIHRoaXMuYXJvdXNhbE1pbmltdW07XHJcblxyXG4gICAgICAgIC8vVE9ETzogR2V0IGFyb3VzYWwgZnJvbSBvd25lclxyXG4gICAgICAgIGxldCBhcm91c2FsID0gMDtcclxuICAgICAgICBsZXQgYXJvdXNhbFBlcmMgPSAoYXJvdXNhbCAtIHRoaXMuYXJvdXNhbE1pbmltdW0pIC8gbnVtU3RlcHM7XHJcbiAgICAgICAgYXJvdXNhbFBlcmMgPSBhcm91c2FsUGVyYyA8IDAgPyAwIDpcclxuICAgICAgICAgICAgYXJvdXNhbFBlcmMgPiAxID8gMSA6XHJcbiAgICAgICAgICAgICAgICBhcm91c2FsUGVyYztcclxuXHJcbiAgICAgICAgbGV0IGZpbmFsU2l6ZSA9IG1pbiArICh2YXJpYWJsZVNpemUgKiBhcm91c2FsUGVyYyk7XHJcbiAgICAgICAgcmV0dXJuIGZpbmFsU2l6ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TG9uZyAoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBNZWFzdXJlKHRoaXMuZ2V0QWN0dWFsU2l6ZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0V2lkZSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBNZWFzdXJlKHRoaXMuZ2V0QWN0dWFsV2lkdGgoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEJ1bGdlU2l6ZSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWN0dWFsU2l6ZSgpICsgKDMgKiB0aGlzLmdldEFjdHVhbFdpZHRoKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTaXplVGV4dCAoKSB7XHJcbiAgICAgICAgcmV0dXJuIEh1bWFub2lkUGVuaXMuZ2V0U2l6ZVRleHQodGhpcy5nZXRCdWxnZVNpemUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRTaXplVGV4dCAoc2l6ZSA6IG51bWJlcikge1xyXG4gICAgICAgIC8vIHNpemUgPSBsb25nICsgKHdpZHRoICogMylcclxuICAgICAgICAvLyBzbyBsb25nIGZyb20gMSB0byAyMCwgbGV0cyBzYXlcclxuICAgICAgICAvLyB3aWR0aCBmcm9tIDEgdG8gNiwgc28gMyB0byAxOFxyXG4gICAgICAgIGxldCBzaXplVGFibGUgPSBbXHJcbiAgICAgICAgICAgIFswLCBcIm5vbmV4aXN0ZW50XCJdLFxyXG4gICAgICAgICAgICBbMSwgXCJ0aW55XCJdLCAvLyAzbCAydyA9IDlcclxuICAgICAgICAgICAgWzIwLCBcInNtYWxsXCJdLCAvLyAxMGwgM3cgPSAxOVxyXG4gICAgICAgICAgICBbMjMsIFwibWVkaXVtXCJdLCAvLyAxNGwgM3cgPSAyNFxyXG4gICAgICAgICAgICBbMjcsIFwiYmlnXCJdLFxyXG4gICAgICAgICAgICBbMzIsIFwiaHVnZVwiXSxcclxuICAgICAgICAgICAgWzM2LCBcIm1vbnN0cm91c1wiXVxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIGxldCBpO1xyXG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBzaXplVGFibGUubGVuZ3RoICYmIHNpemVUYWJsZVtpXVswXSA8IHNpemU7IGkrKykge31cclxuICAgICAgICByZXR1cm4gc2l6ZVRhYmxlW2kgLSAxXVsxXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0R2VuZGVyVmFsdWUgKCkge1xyXG4gICAgICAgIGxldCBzaXplVGFibGUgPSBbXHJcbiAgICAgICAgICAgIFsxMCwgNjBdLCAvLyAzbCAydyA9IDlcclxuICAgICAgICAgICAgWzIwLCA0NV0sIC8vIDEwbCAzdyA9IDE5XHJcbiAgICAgICAgICAgIFsyMywgMzVdLCAvLyAxNGwgM3cgPSAyNFxyXG4gICAgICAgICAgICBbMjcsIDI4XSxcclxuICAgICAgICAgICAgWzMyLCAyNF0sXHJcbiAgICAgICAgICAgIFszNiwgMThdXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgbGV0IGk7XHJcbiAgICAgICAgZm9yIChpID0gMTsgaSA8IHNpemVUYWJsZS5sZW5ndGggJiYgc2l6ZVRhYmxlW2ldWzBdIDwgdGhpcy5nZXRBY3R1YWxTaXplKCk7IGkrKykge31cclxuICAgICAgICByZXR1cm4gc2l6ZVRhYmxlW2kgLSAxXVsxXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXJyYW5nZUdlbmRlclZhbHVlIChndiA6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBzaXplVGFibGUgPSBbXHJcbiAgICAgICAgICAgIFs2MCwgMywgMl0sIC8vIDNsIDJ3ID0gOVxyXG4gICAgICAgICAgICBbNDUsIDEwLCAzXSwgLy8gMTBsIDN3ID0gMTlcclxuICAgICAgICAgICAgWzM1LCAxNCwgM10sIC8vIDE0bCAzdyA9IDI0XHJcbiAgICAgICAgICAgIFsyOCwgMTcsIDNdLFxyXG4gICAgICAgICAgICBbMjQsIDE5LCA0XSxcclxuICAgICAgICAgICAgWzE4LCAyMiwgNC41XVxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIGxldCBpO1xyXG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBzaXplVGFibGUubGVuZ3RoICYmIHNpemVUYWJsZVtpXVswXSA+IGd2OyBpKyspIHt9XHJcblxyXG4gICAgICAgIHRoaXMuZmxhY2NpZFNpemUgPSBuZXcgTWVhc3VyZSh0aGlzLmZsYWNjaWRNdWx0ICogc2l6ZVRhYmxlW2kgLSAxXVsxXSk7XHJcbiAgICAgICAgdGhpcy5mbGFjY2lkV2lkdGggPSBuZXcgTWVhc3VyZSh0aGlzLmZsYWNjaWRNdWx0ICogc2l6ZVRhYmxlW2kgLSAxXVsyXSk7XHJcbiAgICAgICAgdGhpcy5lcmVjdFNpemUgPSBuZXcgTWVhc3VyZShzaXplVGFibGVbaSAtIDFdWzFdKTtcclxuICAgICAgICB0aGlzLmVyZWN0V2lkdGggPSBuZXcgTWVhc3VyZShzaXplVGFibGVbaSAtIDFdWzJdKTtcclxuXHJcbiAgICAgICAgKDxIdW1hbm9pZD4gdGhpcy5nZXRQYXJ0T25lKCkpLmludmFsaWRhdGVDYWNoZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFN5bm9ueW0gKCkge1xyXG4gICAgICAgIC8vIFRPRE86IEFkZCBtb3JlIHdoZW4gY3JlYXRpdmUuXHJcbiAgICAgICAgbGV0IGNvY2tOYW1lcyA9IFtcclxuICAgICAgICAgICAgXCJjb2NrXCIsXHJcbiAgICAgICAgICAgIFwiZGlja1wiXHJcbiAgICAgICAgXTtcclxuICAgICAgICByZXR1cm4gKG5ldyBPbmVPZihPbmVPZi5QVVJFTFlfQVRfUkFORE9NLCAuLi5jb2NrTmFtZXMpLmdldE9uZSgpKTtcclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9Cb2R5cGFydC50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9IdW1hbm9pZC9IdW1hbm9pZC50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9TZXhTdGljay50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9TZXhIb2xlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL01lYXN1cmUudHNcIiAvPlxyXG5jbGFzcyBIdW1hbm9pZFNraW4gZXh0ZW5kcyBCb2R5cGFydCB7XHJcbiAgICBwdWJsaWMgc29yZW5lc3NXZWlnaHQgPSAwO1xyXG4gICAgcHVibGljIGdlbmRlcldlaWdodCA9IEJvZHlwYXJ0LldFSUdIVF9NRURJVU07XHJcbiAgICBwdWJsaWMgc2xvdHMgOiBBcnJheTxudW1iZXI+ID0gW1xyXG4gICAgICAgIEh1bWFub2lkLlNMT1RfRkFDRSwgSHVtYW5vaWQuU0xPVF9ORUNLLCBIdW1hbm9pZC5TTE9UX1NIT1VMREVSUyxcclxuICAgICAgICBIdW1hbm9pZC5TTE9UX0FSTVMsIEh1bWFub2lkLlNMT1RfSEFORFMsIEh1bWFub2lkLlNMT1RfVVBQRVJfQ0hFU1QsXHJcbiAgICAgICAgSHVtYW5vaWQuU0xPVF9NSURSSUZGLCBIdW1hbm9pZC5TTE9UX1dBSVNULCBIdW1hbm9pZC5TTE9UX0JBQ0ssXHJcbiAgICAgICAgSHVtYW5vaWQuU0xPVF9ISVBTLCBIdW1hbm9pZC5TTE9UX0JVVFQsIEh1bWFub2lkLlNMT1RfTEVHX1VQUEVSLFxyXG4gICAgICAgIEh1bWFub2lkLlNMT1RfTEVHX0xPV0VSXHJcbiAgICBdO1xyXG5cclxuICAgIHB1YmxpYyBza2luU29mdG5lc3MgPSA1OyAvLyAwIHRvIDEwLCAwIGJlaW5nIHJvdWdoIGFuZCAxMCBiZWluZyBzaWxreVxyXG4gICAgcHVibGljIHNraW5IYWlyaW5lc3MgPSAyOyAvLyAwIHRvIDEwLCAxMCBiZWluZyBsaXRlcmFsIGdvcmlsbGEgYW5kIDAgYmVpbmcgc21vb3RoIGV2ZXJ5d2hlcmUsIDF+MiBwcm9iYWJseSBzb21lIGFybXBpdCBvciBzb21ldGhpbmdcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKG9wdGlvbnM/IDogVGhpbmdPcHRpb25zKSB7XHJcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5hZGRHZXRBbHRlcmF0aW9ucygodGhpbmcpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIFNvZnRuZXNzIDogdGhpcy5za2luU29mdG5lc3MsXHJcbiAgICAgICAgICAgICAgICBIYWlyaW5lc3MgOiB0aGlzLnNraW5IYWlyaW5lc3NcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmFkZFNldEFsdGVyYXRpb25zKCh0aGluZywgY2hhbmdlcykgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNraW5Tb2Z0bmVzcyA9IGNoYW5nZXMuU29mdG5lc3M7XHJcbiAgICAgICAgICAgIHRoaXMuc2tpbkhhaXJpbmVzcyA9IGNoYW5nZXMuSGFpcmluZXNzO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTbHV0dGluZXNzICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRHZW5kZXJWYWx1ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXREZXNjcmlwdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IG93bmVyID0gPFBlcnNvbj4gdGhpcy5nZXRQYXJ0T25lKCk7XHJcbiAgICAgICAgbGV0IGdyZWVuID0gKG93bmVyLmdldFN0YXQoQXR0cmlidXRlcy5Db3JydXB0aW9uKSA+IDUwKTtcclxuXHJcbiAgICAgICAgbGV0IHNheSA9IG5ldyBTYXkoXCJZb3VyIHNraW4gaXMgXCIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5za2luU29mdG5lc3MgPiA3KSB7XHJcbiAgICAgICAgICAgIHNheS5hZGQoXCJwZXJmZWN0bHkgc21vb3RoXCIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5za2luU29mdG5lc3MgPiA0KSB7XHJcbiAgICAgICAgICAgIHNheS5hZGQoXCJzbW9vdGhcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2F5LmFkZChcInJvdWdoXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2F5LmFkZChcIiBhbmQgXCIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5za2luSGFpcmluZXNzID4gOCkge1xyXG4gICAgICAgICAgICBzYXkuYWRkKFwiaGFpcnksIGxpa2UgYSBnb3JpbGxhJ3NcIilcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2tpbkhhaXJpbmVzcyA+IDYpIHtcclxuICAgICAgICAgICAgc2F5LmFkZChcImhhaXJ5XCIpXHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNraW5IYWlyaW5lc3MgPiAzKSB7XHJcbiAgICAgICAgICAgIHNheS5hZGQoXCJzb21ld2hhdCBoYWlybGVzc1wiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzYXkuYWRkKFwiY29tcGxldGVseSBoYWlybGVzc1wiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNheS5hZGQoXCIuXCIpO1xyXG5cclxuICAgICAgICBpZiAoZ3JlZW4pIHtcclxuICAgICAgICAgICAgc2F5LmFkZChcIiBUaGUgdGFpbnQgb2YgeW91ciBjb3JydXB0aW9uIGhhcyB0dXJuZWQgeW91ciBza2luIGdyZWVuLCBsaWtlIGFuIG9yYydzLlwiKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHNheTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0R2VuZGVyVmFsdWUgKCkge1xyXG4gICAgICAgIGxldCBzb2Z0bmVzc1JhbmsgPSB0aGlzLnNraW5Tb2Z0bmVzcyAqIDEwMDtcclxuICAgICAgICBsZXQgaGFpcmluZXNzUmFuayA9IDEwMDAgLSAodGhpcy5za2luSGFpcmluZXNzICogMTAwKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIChzb2Z0bmVzc1JhbmsgKyBoYWlyaW5lc3NSYW5rKSAvIDIwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhcnJhbmdlR2VuZGVyVmFsdWUgKGdlbmRlclZhbHVlIDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IGlkZWFsID0gZ2VuZGVyVmFsdWUgLyAxMDtcclxuICAgICAgICB0aGlzLnNraW5IYWlyaW5lc3M9IDEwIC0gTWF0aC5yb3VuZChpZGVhbCk7XHJcbiAgICAgICAgdGhpcy5za2luU29mdG5lc3MgID0gTWF0aC5yb3VuZChpZGVhbCk7XHJcbiAgICAgICAgKDxIdW1hbm9pZD4gdGhpcy5nZXRQYXJ0T25lKCkpLmludmFsaWRhdGVDYWNoZXMoKTtcclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9Cb2R5cGFydC50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9IdW1hbm9pZC9IdW1hbm9pZC50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9TZXhTdGljay50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9TZXhIb2xlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL01lYXN1cmUudHNcIiAvPlxyXG4vLyBUT0RPOiBEZWNpZGUgd2h0aGVyIHRoZXJlIHdpbGwgYmUgYSBzZW1lbi1wcm9kdWNpbmcgYm9keXBhcnRcclxuY2xhc3MgSHVtYW5vaWRUZXN0aWNsZXMgZXh0ZW5kcyBCb2R5cGFydCB7XHJcbiAgICBwdWJsaWMgc2l6ZSA6IG51bWJlciA9IDE7IC8vIFwiTm9ybWFsXCJcclxuXHJcbiAgICBwdWJsaWMgc29yZW5lc3NXZWlnaHQgPSBCb2R5cGFydC5XRUlHSFRfSElHSDtcclxuICAgIHB1YmxpYyBnZW5kZXJXZWlnaHQgPSBCb2R5cGFydC5XRUlHSFRfSElHSEVTVDtcclxuICAgIHB1YmxpYyBzbG90cyA6IEFycmF5PG51bWJlcj4gPSBbSHVtYW5vaWQuU0xPVF9DUk9UQ0hfRlJPTlRdO1xyXG4gICAgcHVibGljIHNsdXR0aW5lc3MgPSBCb2R5cGFydC5TTFVUVElORVNTX01FRElVTV9BVkVSQUdFO1xyXG4gICAgcHVibGljIHNsdXR0aW5lc3NXZWlnaHQgPSBCb2R5cGFydC5XRUlHSFRfTUVESVVNO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAob3B0aW9ucz8gOiBUaGluZ09wdGlvbnMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zKTtcclxuICAgICAgICB0aGlzLmFkZEdldEFsdGVyYXRpb25zKCh0aGluZykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgU2l6ZSA6IHRoaXMuc2l6ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuYWRkU2V0QWx0ZXJhdGlvbnMoKHRoaW5nLCBjaGFuZ2VzKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IGNoYW5nZXMuU2l6ZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QnVsZ2VTaXplICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zaXplO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRHZW5kZXJXZWlnaHQgKCkge1xyXG4gICAgICAgIHJldHVybiA4MDsgLy8gbWFsZSBzZXggb3JnYW5cclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9Cb2R5cGFydC50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9IdW1hbm9pZC9IdW1hbm9pZC50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9TZXhTdGljay50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9TZXhIb2xlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL01lYXN1cmUudHNcIiAvPlxyXG5jbGFzcyBIdW1hbm9pZFZhZ2luYSBleHRlbmRzIFNleEhvbGUge1xyXG4gICAgcHVibGljIGdlbmRlclZhbHVlID0gODU7XHJcbiAgICBwdWJsaWMgZ2VuZGVyV2VpZ2h0ID0gQm9keXBhcnQuV0VJR0hUX0hJR0hFU1Q7XHJcbiAgICBwdWJsaWMgc2xvdHMgOiBBcnJheTxudW1iZXI+ID0gW0h1bWFub2lkLlNMT1RfQ1JPVENIX0ZST05UXTtcclxuICAgIHB1YmxpYyBzbHV0dGluZXNzID0gNTA7XHJcbiAgICBwdWJsaWMgc2x1dHRpbmVzc1dlaWdodCA9IEJvZHlwYXJ0LldFSUdIVF9NRURJVU07XHJcblxyXG4gICAgcHVibGljIGdldFNsdXR0aW5lc3MgKCkge1xyXG4gICAgICAgIC8vIHJldmVyc2UgZmVtaW5pbml0eSFcclxuICAgICAgICBsZXQgc2x1dCA9IDEwMCAtIHRoaXMuZ2VuZGVyVmFsdWU7IC8vIGdlbmRlclZhbHVlIGdvZXMgZnJvbSA1MCB0byAxMDAsIHNvIHRoaXMgaXMgNTAgbWF4LlxyXG4gICAgICAgIGxldCBvYnNjZW5lbHlPcGVuID0gZmFsc2U7IC8vIFRPRE86IEdyYWIgZnJvbSBzZXhIb2xlIG9wZW5uZXNzLlxyXG5cclxuICAgICAgICBzbHV0ICs9IG9ic2NlbmVseU9wZW4gPyAyNSA6IDA7XHJcblxyXG4gICAgICAgIHJldHVybiBzbHV0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXREZXNjcmlwdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IHNheSA9IG5ldyBTYXkoXCJZb3VyIFwiKTtcclxuICAgICAgICBsZXQgaGFpcmxlc3MgPSB0aGlzLmdlbmRlclZhbHVlID49IDgwO1xyXG4gICAgICAgIGxldCBzbWFsbENsaXQgPSB0aGlzLmdlbmRlclZhbHVlID49IDU1O1xyXG4gICAgICAgIGxldCBpbm5pZSA9IHRoaXMuZ2VuZGVyVmFsdWUgPiA3MDtcclxuICAgICAgICBsZXQgb2JzY2VuZWx5T3BlbiA9IGZhbHNlOyAvLyBUT0RPOiBHcmFiIGZyb20gc2V4SG9sZSBvcGVubmVzcy5cclxuXHJcbiAgICAgICAgaWYgKGhhaXJsZXNzKSB7XHJcbiAgICAgICAgICAgIHNheS5hZGQoXCJoYWlybGVzcyBcIiwgU2F5LlBVU1NZKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzYXkuYWRkKFwiaGFpcnkgXCIsIFNheS5QVVNTWSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzYXkuYWRkKFwiIFwiKTtcclxuXHJcbiAgICAgICAgaWYgKGlubmllKSB7XHJcbiAgICAgICAgICAgIHNheS5hZGQoXCJpcyB1c3VhbGx5IGNvbXBsZXRlbHkgY292ZXJlZCBieSBpdHMgbGlwc1wiKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNheS5hZGQoXCJoYXMgc29tZSBjdXJ0YWlucyBlc2NhcGluZyBpdHMgbGlwc1wiKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFzbWFsbENsaXQpIHtcclxuICAgICAgICAgICAgc2F5LmFkZChcIiBhbmQgaGFzIGFuIG92ZXJzaXplZCBjbGl0XCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2F5LmFkZChcIi5cIik7XHJcblxyXG4gICAgICAgIGlmIChvYnNjZW5lbHlPcGVuKSB7XHJcbiAgICAgICAgICAgIHNheS5hZGQoXCIgSXQgaXMgY3VycmVudGx5IHN0cmV0Y2hlZCBvcGVuIG9ic2NlbmVseS5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc2F5O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhcnJhbmdlR2VuZGVyVmFsdWUgKGd2IDogbnVtYmVyKSB7XHJcbiAgICAgICAgLy8gUHVzc2llcyByYW5nZSBmcm9tIDUwIHRvIDEwMCBvbmx5LlxyXG4gICAgICAgIGd2ID0gKGd2IC8gMikgKyA1MDtcclxuICAgICAgICB0aGlzLmdlbmRlclZhbHVlID0gZ3Y7XHJcbiAgICAgICAgKDxIdW1hbm9pZD4gdGhpcy5nZXRQYXJ0T25lKCkpLmludmFsaWRhdGVDYWNoZXMoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRTeW5vbnltICgpIHtcclxuICAgICAgICAvLyBUT0RPOiBBZGQgbW9yZSB3aGVuIGNyZWF0aXZlLlxyXG4gICAgICAgIGxldCBjb2NrTmFtZXMgPSBbXHJcbiAgICAgICAgICAgIFwicHVzc3lcIixcclxuICAgICAgICAgICAgXCJ3b21hbmhvb2RcIlxyXG4gICAgICAgIF07XHJcbiAgICAgICAgcmV0dXJuIChuZXcgT25lT2YoT25lT2YuUFVSRUxZX0FUX1JBTkRPTSwgLi4uY29ja05hbWVzKS5nZXRPbmUoKSk7XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vQm9keXBhcnQudHNcIiAvPlxyXG5jbGFzcyBIdW1hbm9pZFRvcnNvIGV4dGVuZHMgQm9keXBhcnQge1xyXG4gICAgLy8gVGhpcyBvbmUgaXMgbW9zdGx5IHVzZWQgZm9yIHNvcmVuZXNzLiBJdCdzIHRoZSBkZWZhdWx0IGF0dGFjayB0YXJnZXQuXHJcblxyXG4gICAgcHVibGljIGdlbmRlcldlaWdodCA6IG51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgc2x1dHRpbmVzc1dlaWdodCA6IG51bWJlciA9IDA7XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiSHVtYW5vaWQvSHVtYW5vaWRBcm1zLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkh1bWFub2lkL0h1bWFub2lkQnJlYXN0cy50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJIdW1hbm9pZC9IdW1hbm9pZEJ1dHQudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiSHVtYW5vaWQvSHVtYW5vaWRFeHRyZW1pdHkudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiSHVtYW5vaWQvSHVtYW5vaWRGZWV0LnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkh1bWFub2lkL0h1bWFub2lkSGFuZHMudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiSHVtYW5vaWQvSHVtYW5vaWRIZWFkLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkh1bWFub2lkL0h1bWFub2lkUGVuaXMudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiSHVtYW5vaWQvSHVtYW5vaWRTa2luLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkh1bWFub2lkL0h1bWFub2lkVGVzdGljbGVzLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkh1bWFub2lkL0h1bWFub2lkVmFnaW5hLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkh1bWFub2lkL0h1bWFub2lkVG9yc28udHNcIiAvPlxyXG5cclxuXHJcbi8vIFRPRE86IEFkZCBuZWNrIGlmIHRoZXJlJ3MgYSBwb2ludCB0byBpdCIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9UaGluZy50c1wiIC8+XHJcbmludGVyZmFjZSBDbG90aGluZ09wdGlvbnMgZXh0ZW5kcyBUaGluZ09wdGlvbnMge1xyXG4gICAgdG9wRGVzY3JpcHRpb24/IDogU2F5O1xyXG4gICAgYm90dG9tRGVzY3JpcHRpb24/IDogU2F5O1xyXG4gICAgZmVldERlc2NyaXB0aW9uPyA6IFNheTtcclxufVxyXG5cclxuaW50ZXJmYWNlIENsb3RoaW5nV2VhcmVyVmFsdWUge1xyXG4gICAgd2VpZ2h0IDogbnVtYmVyO1xyXG4gICAgdmFsdWUgOiBudW1iZXI7XHJcbn1cclxuXHJcbmNsYXNzIENsb3RoaW5nIGV4dGVuZHMgVGhpbmcge1xyXG4gICAgcHVibGljIHNsb3RzIDogQXJyYXk8bnVtYmVyPiA9IFtdO1xyXG4gICAgcHVibGljIHRyYW5zcGFyZW50U2xvdHMgOiBBcnJheTxudW1iZXI+ID0gW107XHJcbiAgICBwdWJsaWMgbGF5ZXIgOiBudW1iZXIgPSBDbG90aGluZy5MQVlFUl9NRURJVU07XHJcbiAgICBwdWJsaWMgaXNWaXNpYmxlID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgdmlzaWJsZU9uIDogQXJyYXk8bnVtYmVyPiA9IFtdO1xyXG5cclxuICAgIC8vIFBhZGRpbmc6IGdldHMgYWRkZWQgdG8gY3VycmVudCBzaXplLiBDYW4gYmUgbmVnYXRpdmVcclxuICAgIC8vIG1heDogSWYgY3VycmVudCBzaXplID4gbWF4LCBjdXJyZW50IHNpemUgPSBtYXguIE9uIC0xIHRoaXMgaXMgbm90IGNvbnNpZGVyZWQuXHJcbiAgICAvLyB0aWdodDogSWYgY3VycmVudCBzaXplID4gdGlnaHQsIHBlcnNvbiBiZWNvbWVzIHRpZ2h0LiBPbiAtMSB0aGlzIGlzIG5vdCBjb25zaWRlcmVkLlxyXG4gICAgLy8gbG9vc2U6IGlmIGN1cnJlbnQgc2l6ZSA8IGxvb3NlLCBwZXJzb24gYmVjb21lcyBsb29zZSAtIGNhbiBiZSBvdmVycmlkZW4gYnkgY292ZXJpbmcgY2xvdGhlc1xyXG4gICAgLy8gSWYgc29tZXRoaW5nIGlzIG5vdCB1c2VkLCBsZWF2ZSBhcyB1bmRlZmluZWRcclxuICAgIC8vIFdvdWxkIGJlIGZ1biB0byBtYWtlIHRoZW0gYnVyc3QgaWYgdG9vIG11Y2ggb3ZlciBtYXgsIGJ1dCB0aGF0J3Mgbm90IGdvaW5nIHRvIGJlIHVzZWQgcmlnaHQgbm93XHJcbiAgICBwdWJsaWMgYnJlYXN0UGFkZGluZyA6IG51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgbWF4QnJlYXN0U2l6ZSA6IG51bWJlciA9IC0xO1xyXG4gICAgcHVibGljIHRpZ2h0QnJlYXN0U2l6ZSA6IG51bWJlciA9IC0xO1xyXG4gICAgcHVibGljIGxvb3NlQnJlYXN0U2l6ZSA6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLy8gUGFkZGluZzogZ2V0cyBhZGRlZCB0byBjdXJyZW50IHNpemUuIENhbiBiZSBuZWdhdGl2ZVxyXG4gICAgLy8gbWF4OiBJZiBjdXJyZW50IHNpemUgPiBtYXgsIGN1cnJlbnQgc2l6ZSA9IG1heC4gT24gLTEgdGhpcyBpcyBub3QgY29uc2lkZXJlZC5cclxuICAgIC8vIHRpZ2h0OiBJZiBjdXJyZW50IHNpemUgPiB0aWdodCwgcGVyc29uIGJlY29tZXMgdGlnaHQuIE9uIC0xIHRoaXMgaXMgbm90IGNvbnNpZGVyZWQuXHJcbiAgICAvLyBsb29zZTogaWYgY3VycmVudCBzaXplIDwgbG9vc2UsIHBlcnNvbiBiZWNvbWVzIGxvb3NlIC0gY2FuIGJlIG92ZXJyaWRlbiBieSBjb3ZlcmluZyBjbG90aGVzXHJcbiAgICAvLyBJZiBzb21ldGhpbmcgaXMgbm90IHVzZWQsIGxlYXZlIGFzIHVuZGVmaW5lZFxyXG4gICAgLy8gV291bGQgYmUgZnVuIHRvIG1ha2UgdGhlbSBidXJzdCBpZiB0b28gbXVjaCBvdmVyIG1heCwgYnV0IHRoYXQncyBub3QgZ29pbmcgdG8gYmUgdXNlZCByaWdodCBub3dcclxuICAgIHB1YmxpYyBjcm90Y2hQYWRkaW5nIDogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBtYXhDcm90Y2hTaXplIDogbnVtYmVyID0gLTE7XHJcbiAgICBwdWJsaWMgdGlnaHRDcm90Y2hTaXplIDogbnVtYmVyID0gLTE7XHJcbiAgICBwdWJsaWMgbG9vc2VDcm90Y2hTaXplIDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAvLyBQYWRkaW5nOiBnZXRzIGFkZGVkIHRvIGN1cnJlbnQgc2l6ZS4gQ2FuIGJlIG5lZ2F0aXZlXHJcbiAgICAvLyBtYXg6IElmIGN1cnJlbnQgc2l6ZSA+IG1heCwgY3VycmVudCBzaXplID0gbWF4LiBPbiAtMSB0aGlzIGlzIG5vdCBjb25zaWRlcmVkLlxyXG4gICAgLy8gdGlnaHQ6IElmIGN1cnJlbnQgc2l6ZSA+IHRpZ2h0LCBwZXJzb24gYmVjb21lcyB0aWdodC4gT24gLTEgdGhpcyBpcyBub3QgY29uc2lkZXJlZC5cclxuICAgIC8vIGxvb3NlOiBpZiBjdXJyZW50IHNpemUgPCBsb29zZSwgcGVyc29uIGJlY29tZXMgbG9vc2UgLSBjYW4gYmUgb3ZlcnJpZGVuIGJ5IGNvdmVyaW5nIGNsb3RoZXNcclxuICAgIC8vIElmIHNvbWV0aGluZyBpcyBub3QgdXNlZCwgbGVhdmUgYXMgdW5kZWZpbmVkXHJcbiAgICAvLyBXb3VsZCBiZSBmdW4gdG8gbWFrZSB0aGVtIGJ1cnN0IGlmIHRvbyBtdWNoIG92ZXIgbWF4LCBidXQgdGhhdCdzIG5vdCBnb2luZyB0byBiZSB1c2VkIHJpZ2h0IG5vd1xyXG4gICAgcHVibGljIGJ1dHRQYWRkaW5nIDogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBtYXhCdXR0U2l6ZSA6IG51bWJlciA9IC0xO1xyXG4gICAgcHVibGljIHRpZ2h0QnV0dFNpemUgOiBudW1iZXIgPSAtMTtcclxuICAgIHB1YmxpYyBsb29zZUJ1dHRTaXplIDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYW55IHRpbWUgYW55dGhpbmcgY291bGQgY2hhbmdlIGNsb3RoaW5nIG9uIGEgcGVyc29uLlxyXG4gICAgICogUmlwcGVkIGEgY2xvdGhpbmc/IFVwZGF0ZSBhbGwgY2xvdGhlcy5cclxuICAgICAqIENoYW5nZWQgYnJlYXN0IHNpemU/IFVwZGF0ZSBhbGwgY2xvdGhlcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZGF0ZVN0YXR1cyAoKSB7XHJcbiAgICAgICAgdGhpcy52aXNpYmxlT24gPSBbXTtcclxuICAgICAgICB0aGlzLnZpc2libGVPbi5wdXNoKC4uLnRoaXMuc2xvdHMpO1xyXG4gICAgICAgIGxldCB3ZWFyZXIgPSBUaGluZy5XZWFyUmVsYXRpb24uZ2V0TGVmdCh0aGlzKTtcclxuICAgICAgICBpZiAod2VhcmVyID09IHVuZGVmaW5lZCkgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgY2xvdGhzID0gVGhpbmcuV2VhclJlbGF0aW9uLmdldFJpZ2h0KHdlYXJlcik7XHJcbiAgICAgICAgbGV0IGNvdmVyZWRTbG90cyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xvdGhzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB3b3JuID0gY2xvdGhzW2ldO1xyXG4gICAgICAgICAgICBpZiAoKHdvcm4gIT0gdGhpcykgJiYgd29ybi5sYXllciA+IHRoaXMubGF5ZXIpIHtcclxuICAgICAgICAgICAgICAgIGNvdmVyZWRTbG90cy5wdXNoKC4uLndvcm4uZ2V0Q292ZXJpbmdTbG90cygpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy52aXNpYmxlT24gPSB0aGlzLnZpc2libGVPbi5maWx0ZXIodmlzaWJsZSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb3ZlcmVkU2xvdHMuaW5kZXhPZih2aXNpYmxlKSA9PSAtMTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5pc1Zpc2libGUgPSB0aGlzLnZpc2libGVPbi5sZW5ndGggPiAwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDb3ZlcmluZ1Nsb3RzICgpIHtcclxuICAgICAgICBpZiAodGhpcy50cmFuc3BhcmVudFNsb3RzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNsb3RzLnNsaWNlKDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2xvdHMuZmlsdGVyKCh2YWx1ZSwgaW5kZXgsIGFycmF5KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zcGFyZW50U2xvdHMuaW5kZXhPZih2YWx1ZSkgPT0gLTE7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBMQVlFUl9MT1dFU1QgPSAwO1xyXG4gICAgcHVibGljIHN0YXRpYyBMQVlFUl9MT1cgPSA1O1xyXG4gICAgcHVibGljIHN0YXRpYyBMQVlFUl9NRURJVU0gPSAxMDtcclxuICAgIHB1YmxpYyBzdGF0aWMgTEFZRVJfSElHSCA9IDE1O1xyXG4gICAgcHVibGljIHN0YXRpYyBMQVlFUl9ISUdIRVNUID0gMjA7XHJcblxyXG4gICAgcHVibGljIGdlbmRlclZhbHVlIDogbnVtYmVyID0gNTA7XHJcbiAgICBwdWJsaWMgc2x1dHRpbmVzc1ZhbHVlIDogbnVtYmVyID0gNDA7XHJcblxyXG4gICAgcHVibGljIGdldEdlbmRlcldlaWdodCAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaWJsZU9uLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0R2VuZGVyVmFsdWUgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdlbmRlclZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTbHV0dGluZXNzV2VpZ2h0ICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy52aXNpYmxlT24ubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTbHV0dGluZXNzVmFsdWUgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNsdXR0aW5lc3NWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEdlbmRlclZhbHVlT24gKHAgOiBUaGluZykgOiBDbG90aGluZ1dlYXJlclZhbHVlIHtcclxuICAgICAgICBsZXQgd2VpZ2h0ID0gMDtcclxuICAgICAgICBsZXQgdmFsdWUgPSAwO1xyXG4gICAgICAgIGxldCBjbG90aGVzID0gVGhpbmcuV2VhclJlbGF0aW9uLmdldFJpZ2h0KHApO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xvdGhlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB3ZWlnaHQgKz0gY2xvdGhlc1tpXS5nZXRHZW5kZXJXZWlnaHQoKTtcclxuICAgICAgICAgICAgdmFsdWUgKz0gY2xvdGhlc1tpXS5nZXRHZW5kZXJXZWlnaHQoKSAqIGNsb3RoZXNbaV0uZ2V0R2VuZGVyVmFsdWUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgd2VpZ2h0IDogd2VpZ2h0LFxyXG4gICAgICAgICAgICB2YWx1ZSA6IHZhbHVlXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFNsdXR0aW5lc3NWYWx1ZU9uIChwIDogVGhpbmcpIDogQ2xvdGhpbmdXZWFyZXJWYWx1ZSB7XHJcbiAgICAgICAgbGV0IHdlaWdodCA9IDA7XHJcbiAgICAgICAgbGV0IHZhbHVlID0gMDtcclxuICAgICAgICBsZXQgY2xvdGhlcyA9IFRoaW5nLldlYXJSZWxhdGlvbi5nZXRSaWdodChwKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsb3RoZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgd2VpZ2h0ICs9IGNsb3RoZXNbaV0uZ2V0U2x1dHRpbmVzc1dlaWdodCgpO1xyXG4gICAgICAgICAgICB2YWx1ZSArPSBjbG90aGVzW2ldLmdldFNsdXR0aW5lc3NXZWlnaHQoKSAqIGNsb3RoZXNbaV0uZ2V0U2x1dHRpbmVzc1ZhbHVlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHdlaWdodCA6IHdlaWdodCxcclxuICAgICAgICAgICAgdmFsdWUgOiB2YWx1ZVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cclxuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1RoaW5ncy9DbG90aGluZy50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9BY3Rpb24udHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vUnVsZS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9SdWxlYm9vay50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi9FbGVtZW50cy9DbGFzc2VzL1NheS9TYXlCb2xkLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL0VsZW1lbnRzL01vZHVsZXMvSHlwZXJsaW5rSGFuZGxlci50c1wiIC8+XHJcblxyXG5jbGFzcyBBY3Rpb25SZW1vdmUgZXh0ZW5kcyBBY3Rpb24ge1xyXG4gICAgcHVibGljIHN0YXRpYyBjaGVjazogUnVsZWJvb2s8QWN0aW9uUmVtb3ZlPiA9IG5ldyBSdWxlYm9vayhcIkNoZWNrIFJlbW92aW5nXCIpO1xyXG4gICAgcHVibGljIHN0YXRpYyBjYXJyeTogUnVsZWJvb2s8QWN0aW9uUmVtb3ZlPiA9IG5ldyBSdWxlYm9vayhcIkNhcnJ5IG91dCBSZW1vdmluZ1wiKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE5lZWRzIHRvIHJldHVybiBhIHN0cmluZyBleHBsYWluaW5nIHdoYXQgdGhlIHBsYXllciB3aWxsIGRvIGlmIGhlIGRvZXMgdGhpcyBhY3Rpb24uXHJcbiAgICAgKiBGb3IgaW5zdGFuY2UsIEFjdGlvblRha2luZyBzaG91bGQgcmV0dXJuIHNvbWV0aGluZyBsaWtlIHJldHVybiBcInRha2UgXCIgKyB0aGlzLm5vdW5zWzBdLmdldE5hbWUoKSxcclxuICAgICAqICAgd2hpY2ggd291bGQgcmVhZCBhcyBcInRha2UgdGhpbmdcIi5cclxuICAgICAqICAgcmVtZW1iZXIgdGhhdCB0aGluZ3MgaW1wbGVtZW50IFBSSU5UQUJMRSBpbnRlcmZhY2UsIHNvIHlvdSBjYW4gZ2V0IHRoZWlyIG5hbWVzLlxyXG4gICAgICogQHJldHVybnMge1NheX1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENvbW1hbmRUZXh0ICgpIHtcclxuICAgICAgICByZXR1cm4gXCJ0YWtlIG9mZiBcIiArICh0aGlzLmdldE5vdW4oMCkgIT0gdW5kZWZpbmVkID8gdGhpcy5nZXROb3VuKDApLmdldFByaW50ZWROYW1lKCkgOiBcIlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2xvdGhpbmcgKCkgOiBDbG90aGluZ3tcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXROb3VuKDApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2tJc1dlYXJhYmxlID0gQWN0aW9uUmVtb3ZlLmNoZWNrLmNyZWF0ZUFuZEFkZFJ1bGUoe1xyXG4gICAgICAgIG5hbWUgOiBcIklzIG5vdW4gYSBjbG90aGluZ1wiLFxyXG4gICAgICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0hJR0hFU1QsXHJcbiAgICAgICAgY29kZSA6IChydW5uZXIgOiBSdWxlYm9va1J1bm5lcjxBY3Rpb25SZW1vdmU+KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBhY3Rpb24gPSBydW5uZXIubm91bjtcclxuICAgICAgICAgICAgbGV0IG5vdW4gPSBhY3Rpb24uZ2V0Q2xvdGhpbmcoKTtcclxuICAgICAgICAgICAgaWYgKCEobm91biBpbnN0YW5jZW9mIENsb3RoaW5nKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbi5hY3RvciA9PSBXb3JsZFN0YXRlLnBsYXllcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbi5zYXkuYWRkKFwiWW91IGNhbiBvbmx5IHJlbW92ZSBDbG90aGluZy5cIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGNoZWNrSXNIZWxkID0gQWN0aW9uUmVtb3ZlLmNoZWNrLmNyZWF0ZUFuZEFkZFJ1bGUoe1xyXG4gICAgICAgIG5hbWUgOiBcIklzIG5vdW4gd29yblwiLFxyXG4gICAgICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0hJR0gsXHJcbiAgICAgICAgY29kZSA6IGFzeW5jIChydW5uZXIgOiBSdWxlYm9va1J1bm5lcjxBY3Rpb25SZW1vdmU+KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBhY3Rpb24gPSBydW5uZXIubm91bjtcclxuICAgICAgICAgICAgbGV0IG5vdW4gPSBhY3Rpb24uZ2V0Q2xvdGhpbmcoKTtcclxuICAgICAgICAgICAgaWYgKCFUaGluZy5XZWFyUmVsYXRpb24uaXNSaWdodChhY3Rpb24uYWN0b3IsIG5vdW4pKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLmFjdG9yID09IFdvcmxkU3RhdGUucGxheWVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uLnNheS5hZGQoXCJZb3UgYXJlIG5vdCB3ZWFyaW5nIGl0LlwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgY2FycnlEZWZhdWx0ID0gQWN0aW9uUmVtb3ZlLmNhcnJ5LmNyZWF0ZUFuZEFkZFJ1bGUoe1xyXG4gICAgICAgIG5hbWUgOiBcIlNldCBDbG90aGluZyBhcyBDYXJyaWVkXCIsXHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfTUVESVVNLFxyXG4gICAgICAgIGNvZGUgOiAocnVubmVyIDogUnVsZWJvb2tSdW5uZXI8QWN0aW9uUmVtb3ZlPikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgYWN0aW9uID0gcnVubmVyLm5vdW47XHJcbiAgICAgICAgICAgIGxldCBub3VuID0gYWN0aW9uLmdldENsb3RoaW5nKCk7XHJcbiAgICAgICAgICAgIFRoaW5nLkNhcnJ5UmVsYXRpb24uc2V0UmVsYXRpb24oYWN0aW9uLmFjdG9yLCBub3VuKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBhY3RvciA9IGFjdGlvbi5hY3RvcjtcclxuICAgICAgICAgICAgbGV0IHRoaW5nID0gKDxUaGluZz5hY3Rpb24uZ2V0Tm91bigwKSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYWN0b3IgPT0gV29ybGRTdGF0ZS5wbGF5ZXIpIHtcclxuICAgICAgICAgICAgICAgIGFjdGlvbi5zYXkuYWRkKG5ldyBTYXlCb2xkKHRoaW5nLCBcIjogXCIpLCBcIlJlbW92ZWQuXCIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uLnNheS5hZGQobmV3IFNheVRoZSgpLCBhY3RvciwgXCIgdGFrZXMgb2ZmIFwiLCBuZXcgU2F5VGhlKCksIHRoaW5nLCBcIi5cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufVxyXG4vKipcclxuICogSHlwZXJsaW5raW5nXHJcbiAqL1xyXG5FbGVtZW50cy5IeXBlcmxpbmtIYW5kbGVyLkh5cGVybGlua2luZ1J1bGVib29rLmFkZFJ1bGUobmV3IFJ1bGUoXHJcbiAgICB7XHJcbiAgICAgICAgbmFtZSA6IFwiSHlwZXJsaW5rIC0gUmVtb3ZlXCIsXHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfSElHSEVTVCxcclxuICAgICAgICBjb2RlIDogKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8VGhpbmc+KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCB0aGluZyA9IDxUaGluZz4gcnVsZWJvb2subm91bjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGluZyBpbnN0YW5jZW9mIENsb3RoaW5nICYmIChUaGluZy5XZWFyUmVsYXRpb24uaXNSaWdodChXb3JsZFN0YXRlLnBsYXllciwgdGhpbmcpKSkge1xyXG4gICAgICAgICAgICAgICAgRWxlbWVudHMuSHlwZXJsaW5rSGFuZGxlci5hZGRBdmFpbGFibGVBY3Rpb24oXCJSZW1vdmVcIiwgbmV3IEFjdGlvblJlbW92ZShXb3JsZFN0YXRlLnBsYXllciwgdGhpbmcpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuKSk7XHJcblxyXG4vKipcclxuIEludmVudG9yeVxyXG4gKi9cclxuRWxlbWVudHMuSW52ZW50b3J5SGFuZGxlci5MaW5raW5nVGhpbmcuYWRkUnVsZShuZXcgUnVsZShcclxuICAgIHtcclxuICAgICAgICBuYW1lIDogXCJJbnZlbnRvcnkgLSBSZW1vdmVcIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9MT1dFU1QsXHJcbiAgICAgICAgY29kZSA6IChydWxlYm9vayA6IFJ1bGVib29rUnVubmVyPFRoaW5nPikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgdGhpbmcgPSA8VGhpbmc+IHJ1bGVib29rLm5vdW47XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpbmcgaW5zdGFuY2VvZiBDbG90aGluZyAmJiAoVGhpbmcuV2VhclJlbGF0aW9uLmlzUmlnaHQoV29ybGRTdGF0ZS5wbGF5ZXIsIHRoaW5nKSkpIHtcclxuICAgICAgICAgICAgICAgIEVsZW1lbnRzLkludmVudG9yeUhhbmRsZXIucHJpbnRUaGluZ0xpbmsoXCJSXCIsIG5ldyBBY3Rpb25SZW1vdmUoV29ybGRTdGF0ZS5wbGF5ZXIsIHRoaW5nKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbikpOyIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9UaGluZ3MvQ2xvdGhpbmcudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQWN0aW9uLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1J1bGUudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vUnVsZWJvb2sudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vLi4vRWxlbWVudHMvQ2xhc3Nlcy9TYXkvU2F5Qm9sZC50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi9FbGVtZW50cy9Nb2R1bGVzL0h5cGVybGlua0hhbmRsZXIudHNcIiAvPlxyXG5cclxuY2xhc3MgQWN0aW9uV2VhciBleHRlbmRzIEFjdGlvbiB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGNoZWNrOiBSdWxlYm9vazxBY3Rpb25XZWFyPiA9IG5ldyBSdWxlYm9vayhcIkNoZWNrIFdlYXJpbmdcIik7XHJcbiAgICBwdWJsaWMgc3RhdGljIGNhcnJ5OiBSdWxlYm9vazxBY3Rpb25XZWFyPiA9IG5ldyBSdWxlYm9vayhcIkNhcnJ5IG91dCBXZWFyaW5nXCIpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTmVlZHMgdG8gcmV0dXJuIGEgc3RyaW5nIGV4cGxhaW5pbmcgd2hhdCB0aGUgcGxheWVyIHdpbGwgZG8gaWYgaGUgZG9lcyB0aGlzIGFjdGlvbi5cclxuICAgICAqIEZvciBpbnN0YW5jZSwgQWN0aW9uVGFraW5nIHNob3VsZCByZXR1cm4gc29tZXRoaW5nIGxpa2UgcmV0dXJuIFwidGFrZSBcIiArIHRoaXMubm91bnNbMF0uZ2V0TmFtZSgpLFxyXG4gICAgICogICB3aGljaCB3b3VsZCByZWFkIGFzIFwidGFrZSB0aGluZ1wiLlxyXG4gICAgICogICByZW1lbWJlciB0aGF0IHRoaW5ncyBpbXBsZW1lbnQgUFJJTlRBQkxFIGludGVyZmFjZSwgc28geW91IGNhbiBnZXQgdGhlaXIgbmFtZXMuXHJcbiAgICAgKiBAcmV0dXJucyB7U2F5fVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q29tbWFuZFRleHQgKCkge1xyXG4gICAgICAgIHJldHVybiBcIndlYXIgXCIgKyAodGhpcy5nZXROb3VuKDApICE9IHVuZGVmaW5lZCA/IHRoaXMuZ2V0Tm91bigwKS5nZXRQcmludGVkTmFtZSgpIDogXCJcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENsb3RoaW5nICgpIDogQ2xvdGhpbmd7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Tm91bigwKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGNoZWNrSXNXZWFyYWJsZSA9IEFjdGlvbldlYXIuY2hlY2suY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiSXMgbm91biBhIGNsb3RoaW5nXCIsXHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfSElHSEVTVCxcclxuICAgICAgICBjb2RlIDogKHJ1bm5lciA6IFJ1bGVib29rUnVubmVyPEFjdGlvbldlYXI+KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBhY3Rpb24gPSBydW5uZXIubm91bjtcclxuICAgICAgICAgICAgbGV0IG5vdW4gPSBhY3Rpb24uZ2V0Q2xvdGhpbmcoKTtcclxuICAgICAgICAgICAgaWYgKCEobm91biBpbnN0YW5jZW9mIENsb3RoaW5nKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbi5hY3RvciA9PSBXb3JsZFN0YXRlLnBsYXllcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbi5zYXkuYWRkKFwiWW91IGNhbiBvbmx5IHdlYXIgQ2xvdGhpbmcuXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBjaGVja0lzSGVsZCA9IEFjdGlvbldlYXIuY2hlY2suY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiSXMgbm91biBoZWxkXCIsXHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfSElHSCxcclxuICAgICAgICBjb2RlIDogYXN5bmMgKHJ1bm5lciA6IFJ1bGVib29rUnVubmVyPEFjdGlvbldlYXI+KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBhY3Rpb24gPSBydW5uZXIubm91bjtcclxuICAgICAgICAgICAgbGV0IG5vdW4gPSBhY3Rpb24uZ2V0Q2xvdGhpbmcoKTtcclxuICAgICAgICAgICAgaWYgKCFUaGluZy5DYXJyeVJlbGF0aW9uLmlzUmlnaHQoYWN0aW9uLmFjdG9yLCBub3VuKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbi5hY3RvciA9PSBXb3JsZFN0YXRlLnBsYXllcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbi5zYXkuYWRkKFwiKGZpcnN0IHRha2luZyB0aGUgXCIsIG5vdW4sIFwiKVwiLCBTYXkuTElORV9CUkVBSyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgdGFraW5nQWN0aW9uID0gbmV3IEFjdGlvblRha2UoYWN0aW9uLmFjdG9yLCBub3VuKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRha2luZ0FjdGlvbi5leGVjdXRlKCk7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb24uc2F5LmFkZCh0YWtpbmdBY3Rpb24uc2F5KTtcclxuICAgICAgICAgICAgICAgIGlmICghVGhpbmcuQ2FycnlSZWxhdGlvbi5pc1JpZ2h0KGFjdGlvbi5hY3Rvciwgbm91bikpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGNhcnJ5RGVmYXVsdCA9IEFjdGlvbldlYXIuY2FycnkuY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiU2V0IENsb3RoaW5nIGFzIFdvcm5cIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9NRURJVU0sXHJcbiAgICAgICAgY29kZSA6IChydW5uZXIgOiBSdWxlYm9va1J1bm5lcjxBY3Rpb25XZWFyPikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgYWN0aW9uID0gcnVubmVyLm5vdW47XHJcbiAgICAgICAgICAgIGxldCBub3VuID0gYWN0aW9uLmdldENsb3RoaW5nKCk7XHJcbiAgICAgICAgICAgIFRoaW5nLldlYXJSZWxhdGlvbi5zZXRSZWxhdGlvbihhY3Rpb24uYWN0b3IsIG5vdW4pO1xyXG5cclxuICAgICAgICAgICAgbGV0IGFjdG9yID0gYWN0aW9uLmFjdG9yO1xyXG4gICAgICAgICAgICBsZXQgdGhpbmcgPSAoPFRoaW5nPmFjdGlvbi5nZXROb3VuKDApKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhY3RvciA9PSBXb3JsZFN0YXRlLnBsYXllcikge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uLnNheS5hZGQobmV3IFNheUJvbGQodGhpbmcsIFwiOiBcIiksIFwiV29ybi5cIik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb24uc2F5LmFkZChuZXcgU2F5VGhlKCksIGFjdG9yLCBcIiBwdXRzIG9uIFwiLCBuZXcgU2F5VGhlKCksIHRoaW5nLCBcIi5cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEh5cGVybGlua2luZ1xyXG4gKi9cclxuRWxlbWVudHMuSHlwZXJsaW5rSGFuZGxlci5IeXBlcmxpbmtpbmdSdWxlYm9vay5hZGRSdWxlKG5ldyBSdWxlKFxyXG4gICAge1xyXG4gICAgICAgIG5hbWUgOiBcIkh5cGVybGluayAtIFdlYXJcIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9ISUdIRVNULFxyXG4gICAgICAgIGNvZGUgOiAocnVsZWJvb2sgOiBSdWxlYm9va1J1bm5lcjxUaGluZz4pID0+IHtcclxuICAgICAgICAgICAgbGV0IHRoaW5nID0gPFRoaW5nPiBydWxlYm9vay5ub3VuO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaW5nIGluc3RhbmNlb2YgQ2xvdGhpbmcgJiYgIShUaGluZy5XZWFyUmVsYXRpb24uaXNSaWdodChXb3JsZFN0YXRlLnBsYXllciwgdGhpbmcpKSkge1xyXG4gICAgICAgICAgICAgICAgRWxlbWVudHMuSHlwZXJsaW5rSGFuZGxlci5hZGRBdmFpbGFibGVBY3Rpb24oXCJXZWFyXCIsIG5ldyBBY3Rpb25XZWFyKFdvcmxkU3RhdGUucGxheWVyLCB0aGluZykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4pKTtcclxuXHJcbi8qKlxyXG4gSW52ZW50b3J5XHJcbiAqL1xyXG5FbGVtZW50cy5JbnZlbnRvcnlIYW5kbGVyLkxpbmtpbmdUaGluZy5hZGRSdWxlKG5ldyBSdWxlKFxyXG4gICAge1xyXG4gICAgICAgIG5hbWUgOiBcIkludmVudG9yeSAtIFdlYXJcIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9MT1dFU1QsXHJcbiAgICAgICAgY29kZSA6IChydWxlYm9vayA6IFJ1bGVib29rUnVubmVyPFRoaW5nPikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgdGhpbmcgPSA8VGhpbmc+IHJ1bGVib29rLm5vdW47XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpbmcgaW5zdGFuY2VvZiBDbG90aGluZyAmJiAhKFRoaW5nLldlYXJSZWxhdGlvbi5pc1JpZ2h0KFdvcmxkU3RhdGUucGxheWVyLCB0aGluZykpKSB7XHJcbiAgICAgICAgICAgICAgICBFbGVtZW50cy5JbnZlbnRvcnlIYW5kbGVyLnByaW50VGhpbmdMaW5rKFwiV1wiLCBuZXcgQWN0aW9uV2VhcihXb3JsZFN0YXRlLnBsYXllciwgdGhpbmcpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuKSk7IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1BlcnNvbi50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9Cb2R5cGFydC9IdW1hbm9pZFBhcnRzLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL0FjdGlvbi9BY3Rpb25SZW1vdmUudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vQWN0aW9uL0FjdGlvbldlYXIudHNcIiAvPlxyXG4vLyBUT0RPIDogSW1wbGVtZW50cyBMaXF1aWRDb250YWluZXIgZm9yIE1pbGsgdWRkZXJzLiBNYXliZSBwcm9zdGF0ZXMuXHJcblxyXG5pbnRlcmZhY2UgSHVtYW5vaWRPcHRpb25zIGV4dGVuZHMgVGhpbmdPcHRpb25zIHtcclxuICAgIGlzTWFsZSA6IGJvb2xlYW47XHJcbn1cclxuXHJcbmludGVyZmFjZSBIdW1hbm9pZEdlbmRlciB7XHJcbiAgICBoYXNQZW5pcyA6IGJvb2xlYW47XHJcbiAgICBoYXNQZW5pc0J1bGdlIDogYm9vbGVhbjtcclxuICAgIGhhc1ZhZ2luYSA6IGJvb2xlYW47XHJcbiAgICBoYXNUaXRzIDogYm9vbGVhbjtcclxuICAgIGdlbmRlclZhbHVlIDogbnVtYmVyOyAvLyBPbmx5IGluY2x1ZGVzIGNsb3RoaW5nIGFuZCBib2R5cGFydHMsIGdvb2QgbWVhc3VyZSBmb3IgYmlzZXh1YWwgTlBDc1xyXG4gICAgZ2VuZGVyVmFsdWVDb3JyZWN0ZWQgOiBudW1iZXI7IC8vIEluY2x1ZGVzIHNleHVhbCBjaGFyYWN0ZXJpc3RpY3MgYmVpbmcgdmlzaWJsZTogYnJlYXN0IHNpemUgZXhpc3RpbmcsIGEgY3JvdGNoIGJ1bGdlLCBldGMuIEhlYXZpbHkgYWx0ZXJlZCBieSBhIHBlbmlzL3ZhZ2luYSBiZWluZyBvdXQgaW4gdGhlIG9wZW5cclxufVxyXG5cclxuaW50ZXJmYWNlIEh1bWFub2lkU2x1dHRpbmVzcyB7XHJcbiAgICBoYWxmTmFrZWQgOiBib29sZWFuO1xyXG4gICAgbmFrZWQgOiBib29sZWFuO1xyXG4gICAgc2x1dHRpbmVzcyA6IG51bWJlcjsgLy8gT25seSBpbmNsdWRlcyBjbG90aGluZ1xyXG4gICAgc2x1dHRpbmVzc0NvcnJlY3RlZCA6IG51bWJlcjsgLy8gSW5jbHVkZXMgbWFubmVyaXNtcyBjYXVzZWQgYnkgcGVyc29uYWxpdHlcclxufVxyXG5cclxuaW50ZXJmYWNlIEh1bWFub2lkQnVsZ2VzIHtcclxuICAgIGJyZWFzdHMgOiBudW1iZXI7XHJcbiAgICBjcm90Y2ggOiBudW1iZXI7XHJcbiAgICBidXR0IDogbnVtYmVyO1xyXG4gICAgd2Fpc3QgOiBudW1iZXI7XHJcbn1cclxuXHJcbmNsYXNzIEh1bWFub2lkIGV4dGVuZHMgUGVyc29uIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgU0VYX01BTEUgPSAwO1xyXG4gICAgcHVibGljIHN0YXRpYyBTRVhfRkVNQUxFID0gMTtcclxuICAgIHB1YmxpYyBzdGF0aWMgU0VYX0hFUk0gPSAyO1xyXG5cclxuICAgIHB1YmxpYyBicmVhc3RWaXNpYmxlU2l6ZSA9IDA7XHJcbiAgICBwdWJsaWMgaXNCcmVhc3RWaXNpYmxlID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgaXNCcmVhc3RUaWdodCA9IGZhbHNlO1xyXG4gICAgcHVibGljIGlzQnJlYXN0TG9vc2UgPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgY3JvdGNoVmlzaWJsZVNpemUgPSAwO1xyXG4gICAgcHVibGljIGlzQ3JvdGNoVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgcHVibGljIGlzQ3JvdGNoVGlnaHQgPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgYnV0dFZpc2libGVTaXplID0gMDtcclxuICAgIHB1YmxpYyBpc0J1dHRWaXNpYmxlID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgaXNCdXR0VGlnaHQgPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgaXNHZW5kZXJDYWNoZWQgOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgaXNTbHV0dGluZXNzQ2FjaGVkIDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIGNhY2hlZEdlbmRlclZhbHVlIDogSHVtYW5vaWRHZW5kZXI7XHJcbiAgICBwdWJsaWMgY2FjaGVkU2x1dHRpbmVzcyA6IEh1bWFub2lkU2x1dHRpbmVzcztcclxuICAgIHB1YmxpYyBjYWNoZWRCdWxnZXMgOiBIdW1hbm9pZEJ1bGdlcztcclxuXHJcbiAgICBwdWJsaWMgdW5jb3ZlcmVkU2xvdHMgOiBBcnJheTxudW1iZXI+ID0gW107XHJcblxyXG4gICAgcHVibGljIGludmFsaWRhdGVDYWNoZXMgKCkge1xyXG4gICAgICAgIHRoaXMuaXNHZW5kZXJDYWNoZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzU2x1dHRpbmVzc0NhY2hlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRHZW5kZXJWYWx1ZSAoKSA6IEh1bWFub2lkR2VuZGVyIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNTbHV0dGluZXNzQ2FjaGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FjaGVzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRHZW5kZXJWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0U2x1dHRpbmVzcyAoKSA6IEh1bWFub2lkU2x1dHRpbmVzcyB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzU2x1dHRpbmVzc0NhY2hlZCkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlcygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkU2x1dHRpbmVzcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QnVsZ2VzICgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNHZW5kZXJDYWNoZWQpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVDYWNoZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkQnVsZ2VzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVDYWNoZXMgKCkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ2xvdGhpbmcoKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNsb3RzKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVCb2R5cGFydHMoKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUJ1bGdlcygpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlR2VuZGVyVmFsdWUoKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNsdXR0aW5lc3MoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlU2xvdHMgKCkge1xyXG4gICAgICAgIHRoaXMudW5jb3ZlcmVkU2xvdHMgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IEh1bWFub2lkLlNMT1RfU0xPVF9DT1VOVDsgaSsrKSB7IHRoaXMudW5jb3ZlcmVkU2xvdHMucHVzaChpKTsgfVxyXG5cclxuICAgICAgICBsZXQgY2xvdGhpbmcgPSA8QXJyYXk8Q2xvdGhpbmc+PlRoaW5nLldlYXJSZWxhdGlvbi5nZXRSaWdodFR5cGUodGhpcywgQ2xvdGhpbmcpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xvdGhpbmcubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGNvdmVyaW5nID0gY2xvdGhpbmdbaV0uZ2V0Q292ZXJpbmdTbG90cygpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGNvdmVyaW5nLmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaWR4ID0gdGhpcy51bmNvdmVyZWRTbG90cy5pbmRleE9mKGNvdmVyaW5nW2tdKTtcclxuICAgICAgICAgICAgICAgIGlmIChpZHggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudW5jb3ZlcmVkU2xvdHMuc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnVuY292ZXJlZFNsb3RzLmxlbmd0aCA9PSAwKSBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZUdlbmRlclZhbHVlICgpIHtcclxuICAgICAgICBsZXQgY2xvdGhpbmdHZW5kZXIgPSBDbG90aGluZy5nZXRHZW5kZXJWYWx1ZU9uKHRoaXMpO1xyXG4gICAgICAgIGxldCBib2R5cGFydEdlbmRlciA9IEJvZHlwYXJ0LmdldEdlbmRlclZhbHVlT24odGhpcyk7XHJcblxyXG4gICAgICAgIGxldCBnZW5kZXJXZWlnaHQgPSBjbG90aGluZ0dlbmRlci53ZWlnaHQgKyBib2R5cGFydEdlbmRlci53ZWlnaHQ7XHJcbiAgICAgICAgbGV0IGdlbmRlclZhbHVlID0gY2xvdGhpbmdHZW5kZXIudmFsdWUgKyBib2R5cGFydEdlbmRlci52YWx1ZTtcclxuICAgICAgICBsZXQgY29ycmVjdGlvbldlaWdodCA9IEJvZHlwYXJ0LldFSUdIVF9ISUdIRVNUO1xyXG4gICAgICAgIGxldCBjb3JyZWN0aW9uVmFsdWUgPSB0aGlzLmdldFN0YXQoQXR0cmlidXRlcy5HZW5kZXJJZGVudGl0eSkgKiBCb2R5cGFydC5XRUlHSFRfSElHSEVTVDsgLy8gR2VuZGVyIElkZW50aXR5IGhhcyB3ZWlnaHQgZm9yIEdlbmRlciBWYWx1ZS4gSXQgaW5jbHVkZXMgdGhpbmdzIHN1Y2ggYXMgaW50b25hdGlvbiBhbmQgbWFubmVpcmlzbXMsIHNvIGl0IGNvdW50cy5cclxuXHJcbiAgICAgICAgbGV0IGhhc1BlbmlzIDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBoYXNWYWdpbmEgOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNDcm90Y2hWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgIC8vIERvZXMgdGhpcyBoYXZlIGEgdmFnaW5hIG9yIG5vdD8gSXQncyB2aXNpYmxlLCBzbyBpdCBhZmZlY3RzIE9CVklPVVNMWSBNQUxFL0ZFTUFMRVxyXG4gICAgICAgICAgICBpZiAoVGhpbmcuUGFydFJlbGF0aW9uLmdldFJpZ2h0VHlwZU9uZSh0aGlzLCBIdW1hbm9pZFBlbmlzKSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGhhc1BlbmlzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGhhc1ZhZ2luYSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgY29ycmVjdGlvblZhbHVlICs9IDAgKiBCb2R5cGFydC5XRUlHSFRfTE9XRVNUO1xyXG4gICAgICAgICAgICAgICAgY29ycmVjdGlvbldlaWdodCArPSBCb2R5cGFydC5XRUlHSFRfTE9XRVNUO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFRoaW5nLlBhcnRSZWxhdGlvbi5nZXRSaWdodFR5cGVPbmUodGhpcywgSHVtYW5vaWRWYWdpbmEpICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaGFzUGVuaXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGhhc1ZhZ2luYSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBjb3JyZWN0aW9uVmFsdWUgKz0gMTAwICogQm9keXBhcnQuV0VJR0hUX0xPV0VTVDtcclxuICAgICAgICAgICAgICAgIGNvcnJlY3Rpb25XZWlnaHQgKz0gQm9keXBhcnQuV0VJR0hUX0xPV0VTVDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYnJlYXN0VmlzaWJsZVNpemUgPiAwKSB7XHJcbiAgICAgICAgICAgIGNvcnJlY3Rpb25WYWx1ZSArPSAxMDAgKiBCb2R5cGFydC5XRUlHSFRfTE9XRVNUO1xyXG4gICAgICAgICAgICBjb3JyZWN0aW9uV2VpZ2h0ICs9IEJvZHlwYXJ0LldFSUdIVF9MT1dFU1Q7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jcm90Y2hWaXNpYmxlU2l6ZSA+IDAgJiYgIWhhc1ZhZ2luYSkge1xyXG4gICAgICAgICAgICBjb3JyZWN0aW9uVmFsdWUgKz0gMCAqIEJvZHlwYXJ0LldFSUdIVF9MT1dFU1Q7XHJcbiAgICAgICAgICAgIGNvcnJlY3Rpb25XZWlnaHQgKz0gQm9keXBhcnQuV0VJR0hUX0xPV0VTVDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBnZW5kZXJWYWx1ZUZpbmFsID0gZ2VuZGVyVmFsdWUgLyBnZW5kZXJXZWlnaHQ7XHJcbiAgICAgICAgbGV0IGdlbmRlclZhbHVlQ29ycmVjdGVkID0gKGdlbmRlclZhbHVlICsgY29ycmVjdGlvblZhbHVlKSAvIChnZW5kZXJXZWlnaHQgKyBjb3JyZWN0aW9uV2VpZ2h0KTtcclxuXHJcbiAgICAgICAgdGhpcy5jYWNoZWRHZW5kZXJWYWx1ZSA9IHtcclxuICAgICAgICAgICAgaGFzVGl0cyA6IHRoaXMuYnJlYXN0VmlzaWJsZVNpemUgPiAxLCAvLyBpZ25vcmUgbWljcm90aXRzXHJcbiAgICAgICAgICAgIGhhc1BlbmlzQnVsZ2UgOiB0aGlzLmNyb3RjaFZpc2libGVTaXplID4gMCAmJiAhaGFzVmFnaW5hLCAvL3NhZmUgZ3VhcmQgYWdhaW5zdCBwdWZmeSB2YWdpbmFzIGlmIHRoZXkgZXZlciBjb21lIHVwXHJcbiAgICAgICAgICAgIGhhc1BlbmlzIDogaGFzUGVuaXMsXHJcbiAgICAgICAgICAgIGhhc1ZhZ2luYSA6IGhhc1ZhZ2luYSxcclxuICAgICAgICAgICAgZ2VuZGVyVmFsdWUgOiBnZW5kZXJWYWx1ZUZpbmFsLFxyXG4gICAgICAgICAgICBnZW5kZXJWYWx1ZUNvcnJlY3RlZCA6IGdlbmRlclZhbHVlQ29ycmVjdGVkXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmlzR2VuZGVyQ2FjaGVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNWaXNpYmxlT24gKHNsb3QgOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy51bmNvdmVyZWRTbG90cy5pbmRleE9mKHNsb3QpICE9IC0xO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIFRPRE86IFRoaXMgd2lsbCBzdWNrLiBHb2FsczogU2x1dHRpbmVzcyBvZiBhIG5ha2VkIG5vcm1hbCBwZXJzb24gc2hvdWxkIGJlIGJldHdlZW4gNDUtNTAuXHJcbiAgICAgKiAgICAgICAgQSBuYWtlZCBwZXJzb24gc2hvdWxkIG1heCBvdXQgYXQgYXJvdW5kIDgwIHdpdGggVEVSUklCTEUgaG9sZXMuIFNvIHNvbWUgY2xvdGhpbmcgaXMgc2x1dHRpZXIgdGhhbiBiZWluZyBvdXRyaWdodCBuYWtlZCwgYW5kIGJlaW5nIG5ha2VkIGlzIG5vdCB0aGF0IHNsdXR0eSB1bmxlc3MgeW91J3JlIGZ1Y2tlZCB1cC5cclxuICAgICAqICAgICAgICBCZWluZyBtb3N0bHkgY292ZXJlZCB3aXRoIHRoZSBleGNlcHRpb24gb2YgZ2VuaXRhbHMgc2hvdWxkIGJlIHNlZW4gYXMgd29yc2UgdGhhbiBiZWluZyBuYWtlLWRlciBhcyB3ZWxsLiBNaWdodCBqdXN0IGxlYXZlIHRoYXQgZm9yIHRoZSBvdXRmaXRzLCB0aG91Z2guXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVTbHV0dGluZXNzICgpIHtcclxuICAgICAgICAvLyBUT0RPOiBNYXliZSB1c2UgdGhlc2UuXHJcbiAgICAgICAgLy8gbGV0IG5ha2VkQnJlYWtwb2ludCA9IDAuMztcclxuICAgICAgICAvLyBsZXQgaGFsZm5ha2VkQnJlYWtwb2ludCA9IDAuNTtcclxuICAgICAgICBsZXQgY2xvdGhpbmdTbHV0dGluZXNzID0gQ2xvdGhpbmcuZ2V0U2x1dHRpbmVzc1ZhbHVlT24odGhpcyk7XHJcbiAgICAgICAgbGV0IGJvZHlwYXJ0U2x1dHRpbmVzcyA9IEJvZHlwYXJ0LmdldFNsdXR0aW5lc3NWYWx1ZU9uKHRoaXMpO1xyXG5cclxuICAgICAgICBsZXQgc2x1dHRpbmVzc1dlaWdodCA9IGNsb3RoaW5nU2x1dHRpbmVzcy53ZWlnaHQgKyBib2R5cGFydFNsdXR0aW5lc3Mud2VpZ2h0O1xyXG4gICAgICAgIGxldCBzbHV0dGluZXNzVmFsdWUgPSBjbG90aGluZ1NsdXR0aW5lc3MudmFsdWUgKyBib2R5cGFydFNsdXR0aW5lc3MudmFsdWU7XHJcblxyXG4gICAgICAgIGxldCBjb3JyZWN0aW9uV2VpZ2h0ID0gMDtcclxuICAgICAgICBsZXQgY29ycmVjdGlvblZhbHVlID0gMDtcclxuXHJcbiAgICAgICAgbGV0IHNvbWV3aGF0U2x1dHR5ID0gW0h1bWFub2lkLlNMT1RfTUlEUklGRiwgSHVtYW5vaWQuU0xPVF9MRUdfVVBQRVIsIEh1bWFub2lkLlNMT1RfV0FJU1QsIEh1bWFub2lkLlNMT1RfSElQUywgSHVtYW5vaWQuU0xPVF9CQUNLXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvbWV3aGF0U2x1dHR5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzVmlzaWJsZU9uKHNvbWV3aGF0U2x1dHR5W2ldKSkge1xyXG4gICAgICAgICAgICAgICAgY29ycmVjdGlvbldlaWdodCArPSAxO1xyXG4gICAgICAgICAgICAgICAgY29ycmVjdGlvblZhbHVlICs9IDc1O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdmVyeVNsdXR0eSA9IFtIdW1hbm9pZC5TTE9UX0JSRUFTVFMsIEh1bWFub2lkLlNMT1RfQ1JPVENIX0ZST05ULCBIdW1hbm9pZC5TTE9UX0NST1RDSF9CQUNLLCBIdW1hbm9pZC5TTE9UX0JVVFRdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmVyeVNsdXR0eS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1Zpc2libGVPbih2ZXJ5U2x1dHR5W2ldKSkge1xyXG4gICAgICAgICAgICAgICAgY29ycmVjdGlvbldlaWdodCArPSAzO1xyXG4gICAgICAgICAgICAgICAgY29ycmVjdGlvblZhbHVlICs9IDc1O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoKHRoaXMuaXNWaXNpYmxlT24ubGVuZ3RoIC8gSHVtYW5vaWQuU0xPVF9TTE9UX0NPVU5UKSA+IDAuNzUpIHtcclxuICAgICAgICAgICAgbGV0IGV4dHJlbWVTbHV0dHkgPSBbSHVtYW5vaWQuU0xPVF9CUkVBU1RTLCBIdW1hbm9pZC5TTE9UX0NST1RDSF9GUk9OVCwgSHVtYW5vaWQuU0xPVF9DUk9UQ0hfQkFDSywgSHVtYW5vaWQuU0xPVF9CVVRUXTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRyZW1lU2x1dHR5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1Zpc2libGVPbihleHRyZW1lU2x1dHR5W2ldKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvcnJlY3Rpb25XZWlnaHQgKz0gNTtcclxuICAgICAgICAgICAgICAgICAgICBjb3JyZWN0aW9uVmFsdWUgKz0gODU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBoYWxmTmFrZWQgOiBib29sZWFuO1xyXG4gICAgICAgIGxldCBuYWtlZCA6IGJvb2xlYW47XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzTWFsZSgpKSB7XHJcbiAgICAgICAgICAgIGhhbGZOYWtlZCA9ICh0aGlzLmlzVmlzaWJsZU9uLmxlbmd0aCAvIEh1bWFub2lkLlNMT1RfU0xPVF9DT1VOVCkgPCAwLjUgJiZcclxuICAgICAgICAgICAgICAgICF0aGlzLmlzVmlzaWJsZU9uQXJyYXkoW0h1bWFub2lkLlNMT1RfQlJFQVNUUywgSHVtYW5vaWQuU0xPVF9DUk9UQ0hfRlJPTlQsIEh1bWFub2lkLlNMT1RfQ1JPVENIX0JBQ0tdKTtcclxuICAgICAgICAgICAgbmFrZWQgPSAodGhpcy5pc1Zpc2libGVPbi5sZW5ndGggLyBIdW1hbm9pZC5TTE9UX1NMT1RfQ09VTlQpIDwgMC4zICYmXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzVmlzaWJsZU9uQXJyYXkoW0h1bWFub2lkLlNMT1RfQlJFQVNUUywgSHVtYW5vaWQuU0xPVF9DUk9UQ0hfRlJPTlQsIEh1bWFub2lkLlNMT1RfQ1JPVENIX0JBQ0ssIEh1bWFub2lkLlNMT1RfQlVUVF0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0JyZWFzdHMoKSkge1xyXG4gICAgICAgICAgICAgICAgaGFsZk5ha2VkID0gKHRoaXMuaXNWaXNpYmxlT24ubGVuZ3RoIC8gSHVtYW5vaWQuU0xPVF9TTE9UX0NPVU5UKSA8IDAuNSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICF0aGlzLmlzVmlzaWJsZU9uQXJyYXkoW0h1bWFub2lkLlNMT1RfQlJFQVNUUywgSHVtYW5vaWQuU0xPVF9DUk9UQ0hfRlJPTlQsIEh1bWFub2lkLlNMT1RfQ1JPVENIX0JBQ0tdKTtcclxuICAgICAgICAgICAgICAgIG5ha2VkID0gKHRoaXMuaXNWaXNpYmxlT24ubGVuZ3RoIC8gSHVtYW5vaWQuU0xPVF9TTE9UX0NPVU5UKSA8IDAuMyAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNWaXNpYmxlT25BcnJheShbSHVtYW5vaWQuU0xPVF9CUkVBU1RTLCBIdW1hbm9pZC5TTE9UX0NST1RDSF9GUk9OVCwgSHVtYW5vaWQuU0xPVF9DUk9UQ0hfQkFDSywgSHVtYW5vaWQuU0xPVF9CVVRUXSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBoYWxmTmFrZWQgPSAodGhpcy5pc1Zpc2libGVPbi5sZW5ndGggLyBIdW1hbm9pZC5TTE9UX1NMT1RfQ09VTlQpIDwgMC41ICYmXHJcbiAgICAgICAgICAgICAgICAgICAgIXRoaXMuaXNWaXNpYmxlT25BcnJheShbSHVtYW5vaWQuU0xPVF9DUk9UQ0hfRlJPTlQsIEh1bWFub2lkLlNMT1RfQ1JPVENIX0JBQ0tdKTtcclxuICAgICAgICAgICAgICAgIG5ha2VkID0gKHRoaXMuaXNWaXNpYmxlT24ubGVuZ3RoIC8gSHVtYW5vaWQuU0xPVF9TTE9UX0NPVU5UKSA8IDAuMyAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNWaXNpYmxlT25BcnJheShbSHVtYW5vaWQuU0xPVF9DUk9UQ0hfRlJPTlQsIEh1bWFub2lkLlNMT1RfQ1JPVENIX0JBQ0ssIEh1bWFub2lkLlNMT1RfQlVUVF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc2x1dHRpbmVzc1ZhbHVlRmluYWwgPSBzbHV0dGluZXNzVmFsdWUgLyBzbHV0dGluZXNzV2VpZ2h0O1xyXG4gICAgICAgIGxldCBzbHV0dGluZXNzQ29ycmVjdGVkID0gKHNsdXR0aW5lc3NWYWx1ZSArIGNvcnJlY3Rpb25WYWx1ZSkgLyAoc2x1dHRpbmVzc1dlaWdodCArIGNvcnJlY3Rpb25XZWlnaHQpO1xyXG5cclxuICAgICAgICB0aGlzLmNhY2hlZFNsdXR0aW5lc3MgPSB7XHJcbiAgICAgICAgICAgIGhhbGZOYWtlZCA6IGhhbGZOYWtlZCxcclxuICAgICAgICAgICAgbmFrZWQgOiBuYWtlZCxcclxuICAgICAgICAgICAgc2x1dHRpbmVzcyA6IHNsdXR0aW5lc3NWYWx1ZUZpbmFsLFxyXG4gICAgICAgICAgICBzbHV0dGluZXNzQ29ycmVjdGVkIDogc2x1dHRpbmVzc0NvcnJlY3RlZFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5pc1NsdXR0aW5lc3NDYWNoZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc1Zpc2libGVPbkFycmF5IChhcnIgOiBBcnJheTxudW1iZXI+KSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9MCA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzVmlzaWJsZU9uKGFycltpXSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkTWFsZVBhcnRzICgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNNYWxlKCkgJiYgIXRoaXMuaXNIZXJtKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRQYXJ0cyhcclxuICAgICAgICAgICAgICAgIG5ldyBIdW1hbm9pZFRlc3RpY2xlcygpLCBuZXcgSHVtYW5vaWRQZW5pcygpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaW52YWxpZGF0ZUNhY2hlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRGZW1hbGVQYXJ0cyAoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzRmVtYWxlKCkgJiYgIXRoaXMuaXNIZXJtKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRQYXJ0cyhcclxuICAgICAgICAgICAgICAgIG5ldyBIdW1hbm9pZFZhZ2luYSgpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaW52YWxpZGF0ZUNhY2hlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZW1vdmVHZW5kZXJlZFBhcnRzICgpIHtcclxuICAgICAgICB0aGlzLnJlbW92ZVBhcnRzKEh1bWFub2lkVmFnaW5hKTtcclxuICAgICAgICB0aGlzLnJlbW92ZVBhcnRzKEh1bWFub2lkUGVuaXMpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlUGFydHMoSHVtYW5vaWRUZXN0aWNsZXMpO1xyXG4gICAgICAgIHRoaXMuaW52YWxpZGF0ZUNhY2hlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRHZW5kZXJWYWx1ZSAodmFsdWUgOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgYnAgPSB0aGlzLmdldFBhcnRzKEJvZHlwYXJ0KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChicFtpXSBpbnN0YW5jZW9mIEh1bWFub2lkQnJlYXN0cyAmJiB0aGlzLmlzTWFsZSgpKSB7IC8vIGRvbid0IGFkZCBicmVhc3RzIGF1dG9tYXRpY2FsbHkgdG8gYSBtYWxlIVxyXG4gICAgICAgICAgICAgICAgYnBbaV0uYXJyYW5nZUdlbmRlclZhbHVlKDApO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYnBbaV0uYXJyYW5nZUdlbmRlclZhbHVlKHZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKG9wdGlvbnM/IDogSHVtYW5vaWRPcHRpb25zKSB7XHJcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5hZGRQYXJ0cyhcclxuICAgICAgICAgICAgbmV3IEh1bWFub2lkU2tpbigpLCBuZXcgSHVtYW5vaWRIZWFkKCksIG5ldyBIdW1hbm9pZEFybXMoKSxcclxuICAgICAgICAgICAgbmV3IEh1bWFub2lkSGFuZHMoKSwgbmV3IEh1bWFub2lkQnJlYXN0cygpLCBuZXcgSHVtYW5vaWRGZWV0KCksXHJcbiAgICAgICAgICAgIG5ldyBIdW1hbm9pZFRvcnNvKCksIG5ldyBIdW1hbm9pZEJ1dHQoKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zLmlzTWFsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZE1hbGVQYXJ0cygpO1xyXG4gICAgICAgICAgICB0aGlzLnNldEdlbmRlclZhbHVlKDI1KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFkZEZlbWFsZVBhcnRzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0R2VuZGVyVmFsdWUoNzUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5hZGRHZXRBbHRlcmF0aW9ucygoaHVtYW5vaWQgOiBIdW1hbm9pZCkgPT4ge1xyXG4gICAgICAgICAgICAvLyBMZXQncyBub3QgZG8gdGhpcyBmb3IgTlBDcy4gSXQgY2FuIGJyZWFrIHBhdGNoZXMuXHJcbiAgICAgICAgICAgIGlmIChodW1hbm9pZC5pc1BsYXllcigpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIEh1bWFub2lkR2VuZGVyOiBodW1hbm9pZC5pc01hbGUoKSA/IEh1bWFub2lkLlNFWF9NQUxFIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaHVtYW5vaWQuaXNGZW1hbGUoKSA/IEh1bWFub2lkLlNFWF9GRU1BTEUgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVtYW5vaWQuU0VYX0hFUk1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmFkZFNldEFsdGVyYXRpb25zKChodW1hbm9pZCA6IEh1bWFub2lkLCBjaGFuZ2VzKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIExldCdzIG5vdCBkbyB0aGlzIGZvciBOUENzLiBJdCBjYW4gYnJlYWsgcGF0Y2hlcy5cclxuICAgICAgICAgICAgaWYgKGh1bWFub2lkLmlzUGxheWVyKCkpIHtcclxuICAgICAgICAgICAgICAgIGh1bWFub2lkLnJlbW92ZUdlbmRlcmVkUGFydHMoKTtcclxuICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VzLkh1bWFub2lkR2VuZGVyID09IEh1bWFub2lkLlNFWF9NQUxFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaHVtYW5vaWQuYWRkTWFsZVBhcnRzKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZXMuSHVtYW5vaWRHZW5kZXIgPT0gSHVtYW5vaWQuU0VYX0ZFTUFMRSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGh1bWFub2lkLmFkZEZlbWFsZVBhcnRzKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGh1bWFub2lkLmFkZE1hbGVQYXJ0cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIGh1bWFub2lkLmFkZEZlbWFsZVBhcnRzKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlQm9keXBhcnRzICgpIHtcclxuICAgICAgICBsZXQgcGFydHMgPSA8QXJyYXk8Qm9keXBhcnQ+PiBUaGluZy5QYXJ0UmVsYXRpb24uZ2V0UmlnaHRUeXBlKHRoaXMsIEJvZHlwYXJ0KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHBhcnRzW2ldLnVwZGF0ZVN0YXR1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlQ2xvdGhpbmcgKCkge1xyXG4gICAgICAgIGxldCBjbG90aGVzID0gPEFycmF5PENsb3RoaW5nPj4gVGhpbmcuV2VhclJlbGF0aW9uLmdldFJpZ2h0VHlwZSh0aGlzLCBDbG90aGluZyk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbG90aGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNsb3RoZXNbaV0udXBkYXRlU3RhdHVzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVCdWxnZXMgKCkge1xyXG4gICAgICAgIGxldCBjbG90aGVzID0gVGhpbmcuV2VhclJlbGF0aW9uLmdldFJpZ2h0VHlwZSh0aGlzLCBDbG90aGluZykuc29ydChmdW5jdGlvbiAoYSA6IENsb3RoaW5nLCBiIDogQ2xvdGhpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGEubGF5ZXIgLSBiLmxheWVyO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmlzQnJlYXN0VmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5pc0Nyb3RjaFZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaXNCdXR0VmlzaWJsZSA9IHRydWU7XHJcblxyXG4gICAgICAgIGxldCBicmFzID0gW107XHJcbiAgICAgICAgbGV0IGJ1dHRzID0gW107XHJcbiAgICAgICAgbGV0IGp1bmtzID0gW107XHJcblxyXG4gICAgICAgIGNsb3RoZXMuZm9yRWFjaCgoY2xvdGggOiBDbG90aGluZykgPT4ge1xyXG4gICAgICAgICAgICBjbG90aC51cGRhdGVTdGF0dXMoKTtcclxuICAgICAgICAgICAgaWYgKGNsb3RoLnNsb3RzLmluZGV4T2YoSHVtYW5vaWQuU0xPVF9CUkVBU1RTKSAhPSAtMSkge1xyXG4gICAgICAgICAgICAgICAgYnJhcy5wdXNoKGNsb3RoKTtcclxuICAgICAgICAgICAgICAgIGlmIChjbG90aC50cmFuc3BhcmVudFNsb3RzLmluZGV4T2YoSHVtYW5vaWQuU0xPVF9CUkVBU1RTKSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNCcmVhc3RWaXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNsb3RoLnNsb3RzLmluZGV4T2YoSHVtYW5vaWQuU0xPVF9CVVRUKSAhPSAtMSkge1xyXG4gICAgICAgICAgICAgICAgYnV0dHMucHVzaChjbG90aCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2xvdGgudHJhbnNwYXJlbnRTbG90cy5pbmRleE9mKEh1bWFub2lkLlNMT1RfQlVUVCkgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQnV0dFZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY2xvdGguc2xvdHMuaW5kZXhPZihIdW1hbm9pZC5TTE9UX0NST1RDSF9GUk9OVCkgIT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIGp1bmtzLnB1c2goY2xvdGgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNsb3RoLnRyYW5zcGFyZW50U2xvdHMuaW5kZXhPZihIdW1hbm9pZC5TTE9UX0NST1RDSF9GUk9OVCkgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQ3JvdGNoVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlQnJlYXN0U2l6ZXMoYnJhcyk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVDcm90Y2hTaXplcyhqdW5rcyk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVCdXR0U2l6ZXMoYnV0dHMpO1xyXG5cclxuICAgICAgICB0aGlzLmNhY2hlZEJ1bGdlcyA9IHtcclxuICAgICAgICAgICAgYnJlYXN0cyA6IHRoaXMuYnJlYXN0VmlzaWJsZVNpemUsXHJcbiAgICAgICAgICAgIGJ1dHQgOiB0aGlzLmJ1dHRWaXNpYmxlU2l6ZSxcclxuICAgICAgICAgICAgY3JvdGNoIDogdGhpcy5jcm90Y2hWaXNpYmxlU2l6ZSxcclxuICAgICAgICAgICAgd2Fpc3QgOiAwXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0VG9wQ2xvdGhPbiAoc2xvdCA6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiBUaGluZy5XZWFyUmVsYXRpb24uZ2V0UmlnaHRUeXBlKHRoaXMsIENsb3RoaW5nKS5maWx0ZXIob3RoZXJDbG90aCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBvdGhlckNsb3RoLnZpc2libGVPbi5pbmNsdWRlcyhzbG90KTtcclxuICAgICAgICB9KS5zb3J0KChhIDogQ2xvdGhpbmcsIGIgOiBDbG90aGluZykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYS5sYXllciAtIGIubGF5ZXI7XHJcbiAgICAgICAgfSlbMF07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZUJyZWFzdFNpemVzIChicmFzIDogQXJyYXk8Q2xvdGhpbmc+KSB7XHJcbiAgICAgICAgdGhpcy5pc0JyZWFzdFRpZ2h0ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc0JyZWFzdExvb3NlID0gdHJ1ZTtcclxuICAgICAgICBsZXQgYnJlYXN0cyA9IDxIdW1hbm9pZEJyZWFzdHM+IFRoaW5nLlBhcnRSZWxhdGlvbi5nZXRSaWdodFR5cGVPbmUodGhpcywgSHVtYW5vaWRCcmVhc3RzKTtcclxuICAgICAgICB0aGlzLmJyZWFzdFZpc2libGVTaXplID0gYnJlYXN0cy5nZXRTaXplKCk7XHJcbiAgICAgICAgYnJhcy5mb3JFYWNoKChicmEgOiBDbG90aGluZykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoYnJhLnRpZ2h0QnJlYXN0U2l6ZSA+PSAwICYmIHRoaXMuYnJlYXN0VmlzaWJsZVNpemUgPiBicmEudGlnaHRCcmVhc3RTaXplKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzQnJlYXN0VGlnaHQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYnJhLm1heEJyZWFzdFNpemUgPj0gMCAmJiB0aGlzLmJyZWFzdFZpc2libGVTaXplID4gYnJhLm1heEJyZWFzdFNpemUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYnJlYXN0VmlzaWJsZVNpemUgPSBicmEubWF4QnJlYXN0U2l6ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuYnJlYXN0VmlzaWJsZVNpemUgPj0gYnJhLmxvb3NlQnJlYXN0U2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0JyZWFzdExvb3NlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuYnJlYXN0VmlzaWJsZVNpemUgKz0gYnJhLmJyZWFzdFBhZGRpbmc7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmJyZWFzdFZpc2libGVTaXplIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5icmVhc3RWaXNpYmxlU2l6ZSA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlQ3JvdGNoU2l6ZXMgKGNsb3RocyA6IEFycmF5PENsb3RoaW5nPikge1xyXG4gICAgICAgIHRoaXMuaXNDcm90Y2hUaWdodCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY3JvdGNoVmlzaWJsZVNpemUgPSAwO1xyXG4gICAgICAgIGxldCBwZW5pcyA9IDxIdW1hbm9pZFBlbmlzPiBUaGluZy5QYXJ0UmVsYXRpb24uZ2V0UmlnaHRUeXBlT25lKHRoaXMsIEh1bWFub2lkUGVuaXMpO1xyXG4gICAgICAgIGxldCB0ZXN0aWNsZXMgPSA8SHVtYW5vaWRUZXN0aWNsZXM+IFRoaW5nLlBhcnRSZWxhdGlvbi5nZXRSaWdodFR5cGVPbmUodGhpcywgSHVtYW5vaWRUZXN0aWNsZXMpO1xyXG4gICAgICAgIHRoaXMuY3JvdGNoVmlzaWJsZVNpemUgPSAwO1xyXG4gICAgICAgIGlmIChwZW5pcyAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5jcm90Y2hWaXNpYmxlU2l6ZSArPSBwZW5pcy5nZXRCdWxnZVNpemUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRlc3RpY2xlcyAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5jcm90Y2hWaXNpYmxlU2l6ZSArPSB0ZXN0aWNsZXMuZ2V0QnVsZ2VTaXplKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNyb3RjaFZpc2libGVTaXplID0gTWF0aC5mbG9vcih0aGlzLmNyb3RjaFZpc2libGVTaXplICogMTApIC8gMTA7XHJcblxyXG4gICAgICAgIGNsb3Rocy5mb3JFYWNoKCh3b3JuIDogQ2xvdGhpbmcpID0+IHtcclxuICAgICAgICAgICAgaWYgKHdvcm4udGlnaHRDcm90Y2hTaXplID49IDAgJiYgdGhpcy5jcm90Y2hWaXNpYmxlU2l6ZSA+IHdvcm4udGlnaHRDcm90Y2hTaXplKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzQ3JvdGNoVGlnaHQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAod29ybi5tYXhDcm90Y2hTaXplID49IDAgJiYgdGhpcy5jcm90Y2hWaXNpYmxlU2l6ZSA+IHdvcm4ubWF4Q3JvdGNoU2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcm90Y2hWaXNpYmxlU2l6ZSA9IHdvcm4ubWF4Q3JvdGNoU2l6ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jcm90Y2hWaXNpYmxlU2l6ZSArPSB3b3JuLmNyb3RjaFBhZGRpbmc7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNyb3RjaFZpc2libGVTaXplIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcm90Y2hWaXNpYmxlU2l6ZSA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlQnV0dFNpemVzIChjbG90aHMgOiBBcnJheTxDbG90aGluZz4pIHtcclxuICAgICAgICB0aGlzLmlzQnV0dFRpZ2h0ID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IGJ1dHQgPSA8SHVtYW5vaWRCdXR0PiBUaGluZy5QYXJ0UmVsYXRpb24uZ2V0UmlnaHRUeXBlT25lKHRoaXMsIEh1bWFub2lkQnV0dCk7XHJcbiAgICAgICAgdGhpcy5idXR0VmlzaWJsZVNpemUgPSBidXR0ID09IHVuZGVmaW5lZCA/IDAgOiBidXR0LmdldFNpemUoKTtcclxuXHJcbiAgICAgICAgY2xvdGhzLmZvckVhY2goKHdvcm4gOiBDbG90aGluZykgPT4ge1xyXG4gICAgICAgICAgICBpZiAod29ybi50aWdodEJ1dHRTaXplID49IDAgJiYgdGhpcy5idXR0VmlzaWJsZVNpemUgPiB3b3JuLnRpZ2h0QnV0dFNpemUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNCdXR0VGlnaHQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAod29ybi5tYXhCdXR0U2l6ZSA+PSAwICYmIHRoaXMuYnV0dFZpc2libGVTaXplID4gd29ybi5tYXhCdXR0U2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5idXR0VmlzaWJsZVNpemUgPSB3b3JuLm1heEJ1dHRTaXplO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmJ1dHRWaXNpYmxlU2l6ZSArPSB3b3JuLmJ1dHRQYWRkaW5nO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5idXR0VmlzaWJsZVNpemUgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJ1dHRWaXNpYmxlU2l6ZSA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFzQnJlYXN0cyAoKSB7XHJcbiAgICAgICAgbGV0IGJyZWFzdHMgPSA8SHVtYW5vaWRCcmVhc3RzPiB0aGlzLmdldFBhcnQoSHVtYW5vaWRCcmVhc3RzKTtcclxuICAgICAgICBpZiAoYnJlYXN0cy5zaXplID4gMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc01hbGUgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcnRzKEh1bWFub2lkUGVuaXMpLmxlbmd0aCA+IDAgJiYgdGhpcy5nZXRQYXJ0cyhIdW1hbm9pZFZhZ2luYSkubGVuZ3RoID09IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzRmVtYWxlICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJ0cyhIdW1hbm9pZFBlbmlzKS5sZW5ndGggPT0gMCAmJiB0aGlzLmdldFBhcnRzKEh1bWFub2lkVmFnaW5hKS5sZW5ndGggPiAwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc0hlcm0gKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcnRzKEh1bWFub2lkUGVuaXMpLmxlbmd0aCA+IDAgJiYgdGhpcy5nZXRQYXJ0cyhIdW1hbm9pZFZhZ2luYSkubGVuZ3RoID4gMDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0U2hvcnRlc3REZXNjcmlwdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IHBsYXllckdlbmRlciA9IHRoaXMuZ2V0R2VuZGVyVmFsdWUoKTtcclxuICAgICAgICBsZXQgcGxheWVyU2x1dHRpbmVzcyA9IHRoaXMuZ2V0U2x1dHRpbmVzcygpO1xyXG5cclxuICAgICAgICBsZXQgcHJlc2VudGF0aW9uID0gXCJcIjtcclxuICAgICAgICBpZiAocGxheWVyU2x1dHRpbmVzcy5zbHV0dGluZXNzQ29ycmVjdGVkID4gNzUpIHtcclxuICAgICAgICAgICAgcHJlc2VudGF0aW9uICs9IChcInNsdXR0eSwgXCIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocGxheWVyU2x1dHRpbmVzcy5zbHV0dGluZXNzQ29ycmVjdGVkID4gMzUpIHtcclxuXHJcbiAgICAgICAgfSBlbHNlIGlmIChwbGF5ZXJTbHV0dGluZXNzLnNsdXR0aW5lc3NDb3JyZWN0ZWQgPiAyMCkge1xyXG4gICAgICAgICAgICBwcmVzZW50YXRpb24gKz0gKFwicHJ1ZGUsIFwiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwcmVzZW50YXRpb24gKz0gKFwic2FpbnRseSwgXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBsYXllckdlbmRlci5nZW5kZXJWYWx1ZUNvcnJlY3RlZCA8IDQwKSB7XHJcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbiArPSAoXCJtYXNjdWxpbmUgXCIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocGxheWVyR2VuZGVyLmdlbmRlclZhbHVlQ29ycmVjdGVkIDwgNjApIHtcclxuICAgICAgICAgICAgcHJlc2VudGF0aW9uICs9IChcImFuZHJvZ3lub3VzIFwiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwcmVzZW50YXRpb24gKz0gKFwiZmVtaW5pbmUgXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBsYXllckdlbmRlci5oYXNUaXRzKSB7XHJcbiAgICAgICAgICAgIGlmIChwbGF5ZXJHZW5kZXIuaGFzUGVuaXMgfHwgcGxheWVyR2VuZGVyLmhhc1BlbmlzQnVsZ2UpIHtcclxuICAgICAgICAgICAgICAgIC8vIFNoZW1hbGUgU3RhdHVzIChUaXRzICsgUGVuaXMpXHJcbiAgICAgICAgICAgICAgICBwcmVzZW50YXRpb24gKz0gKFwic2hlbWFsZVwiKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwbGF5ZXJHZW5kZXIuaGFzVmFnaW5hKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpcyBhIHdvbWFuXHJcbiAgICAgICAgICAgICAgICBwcmVzZW50YXRpb24gKz0gKFwid29tYW5cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBObyB0aXRzXHJcbiAgICAgICAgICAgIGlmIChwbGF5ZXJHZW5kZXIuaGFzUGVuaXMpIHtcclxuICAgICAgICAgICAgICAgIC8vIFNpbXBseSBtYWxlXHJcbiAgICAgICAgICAgICAgICBpZiAocGxheWVyR2VuZGVyLmdlbmRlclZhbHVlQ29ycmVjdGVkIDwgNjApIHtcclxuICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb24gKz0gKFwibWFuXCIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb24gKz0gKFwidHJhcFwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwbGF5ZXJHZW5kZXIuaGFzUGVuaXNCdWxnZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gUG9zc2libGUgU2hlbWFsZSBzdGF0dXMgLSBoYXMgYnVsZ2UgYW5kIHRpdHMgbWF5YmUgZ2V0IGJldHRlciB0ZXJtcyBzb21ldGltZVxyXG4gICAgICAgICAgICAgICAgaWYgKHBsYXllckdlbmRlci5nZW5kZXJWYWx1ZUNvcnJlY3RlZCA8IDYwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uICs9IChcIm1hblwiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uICs9IChcInRyYXBcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGxheWVyR2VuZGVyLmhhc1ZhZ2luYSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaXMgYSB3b21hblxyXG4gICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uICs9IChcIndvbWFuXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcHJlc2VudGF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgU0xPVF9IQUlSID0gMDtcclxuICAgIHB1YmxpYyBzdGF0aWMgU0xPVF9IRUFER0VBUiA9IDE7XHJcbiAgICBwdWJsaWMgc3RhdGljIFNMT1RfRkFDRSA9IDI7XHJcbiAgICBwdWJsaWMgc3RhdGljIFNMT1RfRUFSUyA9IDM7XHJcbiAgICBwdWJsaWMgc3RhdGljIFNMT1RfRVlFUyA9IDQ7XHJcbiAgICBwdWJsaWMgc3RhdGljIFNMT1RfTk9TRSA9IDU7XHJcbiAgICBwdWJsaWMgc3RhdGljIFNMT1RfTU9VVEggPSA2O1xyXG4gICAgcHVibGljIHN0YXRpYyBTTE9UX05FQ0sgPSA3O1xyXG4gICAgcHVibGljIHN0YXRpYyBTTE9UX1NIT1VMREVSUyA9IDg7XHJcbiAgICBwdWJsaWMgc3RhdGljIFNMT1RfQVJNUyA9IDk7XHJcbiAgICBwdWJsaWMgc3RhdGljIFNMT1RfSEFORFMgPSAxMDtcclxuICAgIHB1YmxpYyBzdGF0aWMgU0xPVF9GSU5HRVJTID0gMTE7XHJcbiAgICBwdWJsaWMgc3RhdGljIFNMT1RfRklOR0VSTkFJTFMgPSAxMjtcclxuICAgIHB1YmxpYyBzdGF0aWMgU0xPVF9VUFBFUl9DSEVTVCA9IDEzO1xyXG4gICAgcHVibGljIHN0YXRpYyBTTE9UX01JRFJJRkYgPSAxNDtcclxuICAgIHB1YmxpYyBzdGF0aWMgU0xPVF9XQUlTVCA9IDE1O1xyXG4gICAgcHVibGljIHN0YXRpYyBTTE9UX0JBQ0sgPSAxNjtcclxuICAgIHB1YmxpYyBzdGF0aWMgU0xPVF9ISVBTID0gMTc7XHJcbiAgICBwdWJsaWMgc3RhdGljIFNMT1RfQ1JPVENIX0ZST05UID0gMTg7XHJcbiAgICBwdWJsaWMgc3RhdGljIFNMT1RfQ1JPVENIX0JBQ0sgPSAxOTtcclxuICAgIHB1YmxpYyBzdGF0aWMgU0xPVF9CVVRUID0gMjA7XHJcbiAgICBwdWJsaWMgc3RhdGljIFNMT1RfTEVHX1VQUEVSID0gMjE7XHJcbiAgICBwdWJsaWMgc3RhdGljIFNMT1RfTEVHX0xPV0VSID0gMjI7XHJcbiAgICBwdWJsaWMgc3RhdGljIFNMT1RfRkVFVCA9IDIzO1xyXG4gICAgcHVibGljIHN0YXRpYyBTTE9UX0ZFRVRfTkFJTFMgPSAyNDtcclxuICAgIHB1YmxpYyBzdGF0aWMgU0xPVF9CUkVBU1RTID0gMjU7XHJcbiAgICBwdWJsaWMgc3RhdGljIFNMT1RfU0xPVF9DT1VOVCA9IDI2O1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgY2FjaGVJbnZhbGlkYXRpb25BY3Rpb25SdWxlID0gbmV3IFJ1bGUoe1xyXG4gICAgICAgIG5hbWUgOiBcIkludmFsaWRhdGUgaHVtYW5vaWQgY2FjaGVzXCIsXHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfTE9XRVNULFxyXG4gICAgICAgIGNvZGUgOiAocnVubmVyIDogUnVsZWJvb2tSdW5uZXI8QWN0aW9uPikgPT4ge1xyXG4gICAgICAgICAgICAoPEh1bWFub2lkPiBydW5uZXIubm91bi5hY3RvcikuaW52YWxpZGF0ZUNhY2hlcygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29uZGl0aW9ucyA6IChydW5uZXIgOiBSdWxlYm9va1J1bm5lcjxBY3Rpb24+KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBydW5uZXIubm91bi5hY3RvciBpbnN0YW5jZW9mIEh1bWFub2lkO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UGxheWVyRGVzY3JpcHRpb24gKCkgOiBTYXkge1xyXG4gICAgICAgIGxldCBzYXkgPSBuZXcgU2F5KCk7XHJcblxyXG4gICAgICAgIHNheS5hZGQoXCJZb3UgYXJlIFwiKTtcclxuXHJcbiAgICAgICAgbGV0IHBsYXllciA9IDxIdW1hbm9pZD4gV29ybGRTdGF0ZS5wbGF5ZXI7XHJcblxyXG4gICAgICAgIGxldCBtYWxlID0gcGxheWVyLmdldFBhcnRzKEh1bWFub2lkUGVuaXMpLmxlbmd0aCA+IDA7XHJcbiAgICAgICAgbGV0IGZlbWFsZSA9IHBsYXllci5nZXRQYXJ0cyhIdW1hbm9pZFZhZ2luYSkubGVuZ3RoID4gMDtcclxuXHJcbiAgICAgICAgaWYgKG1hbGUgJiYgZmVtYWxlKSB7XHJcbiAgICAgICAgICAgIHNheS5hZGQoIFwiaGVybWFwaHJvZGl0ZVwiKTtcclxuICAgICAgICB9IGVsc2UgaWYgKG1hbGUpIHtcclxuICAgICAgICAgICAgc2F5LmFkZChcIm1hbGVcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2F5LmFkZChcImZlbWFsZVwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNheS5hZGQoXCIuIFlvdSBhcmUgcHJlc2VudGluZyBhcyBcIiwgbmV3IFNheUFuKCksIHBsYXllci5nZXRTaG9ydGVzdERlc2NyaXB0aW9uKCkgKyBcIi4gXCIpO1xyXG5cclxuICAgICAgICBzYXkuYWRkKEF0dHJpYnV0ZXMuR2VuZGVySWRlbnRpdHkuZ2V0RGVzY3JpcHRpb24ocGxheWVyLmdldFN0YXQoQXR0cmlidXRlcy5HZW5kZXJJZGVudGl0eSkpKTtcclxuXHJcbiAgICAgICAgLy9sZXQgZ3YgPSBwbGF5ZXIuZ2V0R2VuZGVyVmFsdWUoKTtcclxuICAgICAgICBsZXQgc3YgPSBwbGF5ZXIuZ2V0U2x1dHRpbmVzcygpO1xyXG4gICAgICAgIGxldCBidWxnZXMgPSBwbGF5ZXIuZ2V0QnVsZ2VzKCk7XHJcblxyXG4gICAgICAgIGxldCBjb3ZlcmVkUGVyYyA9IDEgLSAocGxheWVyLnVuY292ZXJlZFNsb3RzLmxlbmd0aCAvIEh1bWFub2lkLlNMT1RfU0xPVF9DT1VOVCk7XHJcblxyXG4gICAgICAgIHNheS5hZGQoXCIgXCIsICg8SHVtYW5vaWRTa2luPiBwbGF5ZXIuZ2V0UGFydChIdW1hbm9pZFNraW4pKS5nZXREZXNjcmlwdGlvbigpKTtcclxuXHJcbiAgICAgICAgaWYgKHN2LmhhbGZOYWtlZCkge1xyXG4gICAgICAgICAgICBzYXkuYWRkKFwiIFlvdSBhcmUgYWxtb3N0IG5ha2VkLiBcIik7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzdi5uYWtlZCkge1xyXG4gICAgICAgICAgICBzYXkuYWRkKFwiIFlvdSBhcmUgbmFrZWQuIFwiKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGNvdmVyZWRQZXJjIDwgMC4yKSB7XHJcbiAgICAgICAgICAgIHNheS5hZGQoXCJZb3UgYXJlIG5vdCBzaG93aW5nIG11Y2ggb2YgaXQsIHRob3VnaC5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzYXkuYWRkKEF0dHJpYnV0ZXMuRGVnZW5lcmF0aW9uLmdldERlc2NyaXB0aW9uKHBsYXllci5nZXRTdGF0KEF0dHJpYnV0ZXMuRGVnZW5lcmF0aW9uKSkpO1xyXG5cclxuICAgICAgICBzYXkuYWRkKFNheS5QQVJBR1JBUEhfQlJFQUspO1xyXG5cclxuICAgICAgICBzYXkuYWRkKCg8SHVtYW5vaWRBcm1zPiBwbGF5ZXIuZ2V0UGFydChIdW1hbm9pZEFybXMpKS5nZXREZXNjcmlwdGlvbigpLCBcIiBcIik7XHJcbiAgICAgICAgc2F5LmFkZCgoPEh1bWFub2lkSGFuZHM+IHBsYXllci5nZXRQYXJ0KEh1bWFub2lkSGFuZHMpKS5nZXREZXNjcmlwdGlvbigpLCBcIiBcIik7XHJcbiAgICAgICAgc2F5LmFkZCgoPEh1bWFub2lkRmVldD4gcGxheWVyLmdldFBhcnQoSHVtYW5vaWRGZWV0KSkuZ2V0RGVzY3JpcHRpb24oKSwgXCIgXCIpO1xyXG5cclxuICAgICAgICBsZXQgcGVuaXMgPSA8SHVtYW5vaWRQZW5pcz4gcGxheWVyLmdldFBhcnQoSHVtYW5vaWRQZW5pcyk7XHJcbiAgICAgICAgbGV0IHZhZ2luYSA9IDxIdW1hbm9pZFZhZ2luYT4gcGxheWVyLmdldFBhcnQoSHVtYW5vaWRWYWdpbmEpO1xyXG4gICAgICAgIGlmIChwZW5pcyAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgc2F5LmFkZChcIllvdSBoYXZlIGEgXCIsXHJcbiAgICAgICAgICAgICAgICBwZW5pcy5nZXRTaXplVGV4dCgpLCAocGVuaXMuaXNGbGFjY2lkKCkgPyBcIiBmbGFjY2lkIFwiIDogXCIgZXJlY3QgXCIpLFxyXG4gICAgICAgICAgICAgICAgU2F5LkNPQ0ssIFwiIGJldHdlZW4geW91ciBsZWdzXCJcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgaWYgKCFwZW5pcy5pc0JpZygpICYmIHBlbmlzLmlzR3Jvd2VyKCkgJiYgcGVuaXMuaXNGbGFjY2lkKCkpIHtcclxuICAgICAgICAgICAgICAgIHNheS5hZGQoXCIsIHdoaWNoIGlzIG9rYXksIHNpbmNlIHlvdSdyZSBhIGdyb3dlciwgbm90IGEgc2hvd2VyXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwZW5pcy5pc1VuY292ZXJlZCgpKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgb25lT2YgPSBuZXcgT25lT2YoT25lT2YuUFVSRUxZX0FUX1JBTkRPTSwgLi4uW1xyXG4gICAgICAgICAgICAgICAgICAgIFwiLCBpdCBpcyBub3QgY292ZXJlZCBieSBhbnkgY2xvdGhpbmdcIixcclxuICAgICAgICAgICAgICAgICAgICBcIiwgaXQgaXMgbm90IGNvdmVyZWQgYnkgYW55IGNsb3RoZXNcIixcclxuICAgICAgICAgICAgICAgICAgICBcIiwgaXQgaXMgdW5jb3ZlcmVkXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCIsIGl0IGlzIHZpc2libGUgdG8gYWxsXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCIsIGl0IGlzIGhhbmdpbmcgZnJlZWx5XCJcclxuICAgICAgICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgICAgICAgc2F5LmFkZChvbmVPZi5nZXRPbmUoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHRlc3RpY2xlcyA9IDxIdW1hbm9pZFRlc3RpY2xlcz4gcGxheWVyLmdldFBhcnQoSHVtYW5vaWRUZXN0aWNsZXMpO1xyXG4gICAgICAgICAgICBpZiAoSHVtYW5vaWRQZW5pcy5nZXRTaXplVGV4dChidWxnZXMuY3JvdGNoKSAhPSBIdW1hbm9pZFBlbmlzLmdldFNpemVUZXh0KHBlbmlzLmdldEJ1bGdlU2l6ZSgpICsgdGVzdGljbGVzLmdldEJ1bGdlU2l6ZSgpKSkge1xyXG4gICAgICAgICAgICAgICAgc2F5LmFkZChcIiwgYnV0IGl0IGxvb2tzIGxpa2UgaXQncyBhY3R1YWxseSBcIiwgSHVtYW5vaWRQZW5pcy5nZXRTaXplVGV4dChidWxnZXMuY3JvdGNoKSwgXCIgZHVlIHRvIHlvdXIgY2xvdGhpbmdcIilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzYXkuYWRkKFwiLiBcIik7XHJcbiAgICAgICAgICAgIGlmICh0ZXN0aWNsZXMgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBEZXNjcmliZSB0ZXN0aWNsZXMuIEFyZSB3ZSBtYWtpbmcgdGhlc2UgdmFyaWFibGU/XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzYXkuYWRkKHZhZ2luYS5nZXREZXNjcmlwdGlvbigpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vc2F5LmFkZChTYXkuUEFSQUdSQVBIX0JSRUFLKTtcclxuXHJcbiAgICAgICAgc2F5LmFkZCggXCIgXCIpO1xyXG5cclxuICAgICAgICBsZXQgYnJlYXN0cyA9IDxIdW1hbm9pZEJyZWFzdHM+IHBsYXllci5nZXRQYXJ0KEh1bWFub2lkQnJlYXN0cyk7XHJcbiAgICAgICAgbGV0IGJ1dHQgPSA8SHVtYW5vaWRCdXR0PiBwbGF5ZXIuZ2V0UGFydChIdW1hbm9pZEJ1dHQpO1xyXG5cclxuICAgICAgICBzYXkuYWRkKFwiWW91IGhhdmUgXCIsIGJyZWFzdHMuZ2V0U2l6ZVRleHQoKSwgXCIgYnJlYXN0cyBhbmQgYSBcIiwgYnV0dC5nZXRTaXplVGV4dCgpLCBcIiBidXR0LlwiKTtcclxuXHJcblxyXG4gICAgICAgIGlmIChidWxnZXMuYnJlYXN0cyAhPSBicmVhc3RzLmdldFNpemUoKSAmJiBidWxnZXMuYnV0dCAhPSBidXR0LmdldFNpemUoKSkge1xyXG4gICAgICAgICAgICBzYXkuYWRkKFwiIFlvdXIgY2xvdGhpbmcgbWFrZXMgeW91ciBicmVhc3RzIGxvb2sgbGlrZSB0aGV5J3JlIGFjdHVhbGx5IFwiLCBIdW1hbm9pZEJyZWFzdHMuZ2V0U2l6ZVRleHQoYnVsZ2VzLmJyZWFzdHMpLFxyXG4gICAgICAgICAgICAgICAgXCIgYW5kIG1ha2UgeW91ciBidXR0IGFwcGVhciBcIiwgSHVtYW5vaWRCdXR0LmdldFNpemVUZXh0KGJ1bGdlcy5idXR0KSwgXCIuXCIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoYnVsZ2VzLmJyZWFzdHMgIT0gYnJlYXN0cy5nZXRTaXplKCkpIHtcclxuICAgICAgICAgICAgc2F5LmFkZChcIiBZb3VyIGNsb3RoaW5nIG1ha2VzIHlvdXIgYnJlYXN0cyBsb29rIGxpa2UgdGhleSdyZSBhY3R1YWxseSBcIiwgSHVtYW5vaWRCcmVhc3RzLmdldFNpemVUZXh0KGJ1bGdlcy5icmVhc3RzKSwgXCIuXCIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoYnVsZ2VzLmJ1dHQgIT0gYnV0dC5nZXRTaXplKCkpIHtcclxuICAgICAgICAgICAgc2F5LmFkZChcIiBZb3VyIGNsb3RoaW5nIG1ha2VzIHlvdXIgYnV0dCBhcHBlYXIgXCIsIEh1bWFub2lkQnV0dC5nZXRTaXplVGV4dChidWxnZXMuYnV0dCksIFwiLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNheS5hZGQoU2F5LlBBUkFHUkFQSF9CUkVBSyk7XHJcblxyXG4gICAgICAgIGxldCBjbG90aGluZ1NsdXR0aW5lc3MgPSBDbG90aGluZy5nZXRTbHV0dGluZXNzVmFsdWVPbihwbGF5ZXIpO1xyXG4gICAgICAgIGxldCBib2R5cGFydFNsdXR0aW5lc3MgPSBCb2R5cGFydC5nZXRTbHV0dGluZXNzVmFsdWVPbihwbGF5ZXIpO1xyXG5cclxuICAgICAgICBpZiAoY2xvdGhpbmdTbHV0dGluZXNzLndlaWdodCA+IDApIHtcclxuICAgICAgICAgICAgbGV0IGNsb3RoaW5nU2x1dHRpbmVzc0ZpbmFsID0gY2xvdGhpbmdTbHV0dGluZXNzLnZhbHVlIC8gY2xvdGhpbmdTbHV0dGluZXNzLndlaWdodDtcclxuICAgICAgICAgICAgaWYgKGNsb3RoaW5nU2x1dHRpbmVzc0ZpbmFsID4gNzUpIHtcclxuICAgICAgICAgICAgICAgIHNheS5hZGQoXCJZb3VyIG91dGZpdCBjYW4gb25seSBiZSBkZXNjcmliZWQgYXMgXFxcIndob3JlLWlzaFxcXCIsIGl0IGlzIGZhciB0b28gbmFzdHkuXCIpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xvdGhpbmdTbHV0dGluZXNzRmluYWwgPiA2MCkge1xyXG4gICAgICAgICAgICAgICAgc2F5LmFkZChcIllvdXIgY2xvdGhpbmcgYXJlIG9idmlvdXNseSBtYWtpbmcgeW91IGxvb2sgYSBiaXQgbmF1Z2h0eS5cIilcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjbG90aGluZ1NsdXR0aW5lc3NGaW5hbCA8IDMwICYmIHN2LnNsdXR0aW5lc3NDb3JyZWN0ZWQgPCAzMCkge1xyXG4gICAgICAgICAgICAgICAgc2F5LmFkZChcIllvdXIgY2xvdGhpbmcgYXJlIGRlZmluaXRlbHkgYSBiaXQgcHJ1ZGUuXCIpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xvdGhpbmdTbHV0dGluZXNzRmluYWwgPCAxNSAmJiBzdi5zbHV0dGluZXNzQ29ycmVjdGVkIDwgMzApIHtcclxuICAgICAgICAgICAgICAgIHNheS5hZGQoXCJZb3VyIG91dGZpdCBpcyBzbyBwcnVkZSB0aGF0IGl0IGNvdWxkIGJlIHdvcm4gYnkgYSBzYWludC5cIilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2F5LmFkZChcIiBcIik7XHJcblxyXG4gICAgICAgIGlmIChib2R5cGFydFNsdXR0aW5lc3Mud2VpZ2h0ID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgYm9keXBhcnRTbHV0dGluZXNzRmluYWwgPSBib2R5cGFydFNsdXR0aW5lc3MudmFsdWUgLyBib2R5cGFydFNsdXR0aW5lc3Mud2VpZ2h0O1xyXG4gICAgICAgICAgICBpZiAoYm9keXBhcnRTbHV0dGluZXNzRmluYWwgPiA3NSkge1xyXG4gICAgICAgICAgICAgICAgc2F5LmFkZChcIlRoZSB3YXkgeW91ciBib2R5IGlzIG1ha2VzIHlvdSBsb29rIGxpa2UgeW91IHdlcmUgbWFkZSBwdXJlbHkgZm9yIHNleFwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChjb3ZlcmVkUGVyYyA+IDAuNykge1xyXG4gICAgICAgICAgICAgICAgICAgIHNheS5hZGQoXCIsIHRoYW5rZnVsbHkgaXQncyBtb3N0bHkgY292ZXJlZFwiKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb3ZlcmVkUGVyYyA8IDAuMikge1xyXG4gICAgICAgICAgICAgICAgICAgIHNheS5hZGQoXCIsIGFuZCB5b3UgZGlkbid0IGV2ZW4gYm90aGVyIGNvdmVyaW5nIGl0IHVwXCIpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBzYXkuYWRkKFwiLlwiKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChib2R5cGFydFNsdXR0aW5lc3NGaW5hbCA+IDYwKSB7XHJcbiAgICAgICAgICAgICAgICBzYXkuYWRkKFwiWW91ciBib2R5IGRlZmluaXRlbHkgaGFzIGEgbG90IG9mIHNleC1hcHBlYWwgZ29pbmcgb25cIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoY292ZXJlZFBlcmMgPiAwLjcpIHtcclxuICAgICAgICAgICAgICAgICAgICBzYXkuYWRkKFwiLCBhbHRob3VnaCBpdCdzIGNvdmVyZWRcIilcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY292ZXJlZFBlcmMgPCAwLjIpIHtcclxuICAgICAgICAgICAgICAgICAgICBzYXkuYWRkKFwiLCBwcm91ZGx5IGRpc3BsYXllZCBmb3IgYWxsIHRvIHNlZVwiKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgc2F5LmFkZChcIi5cIik7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYm9keXBhcnRTbHV0dGluZXNzRmluYWwgPCAzMCkge1xyXG4gICAgICAgICAgICAgICAgc2F5LmFkZChcIllvdSBoYXZlIHZlcnkgbGl0dGxlIHNleC1hcHBlYWwsIG1heWJlIHlvdSBhcmUgYSBraXRjaGVuIHRhYmxlP1wiKTtcclxuICAgICAgICAgICAgICAgIGlmIChjb3ZlcmVkUGVyYyA+IDAuNykge1xyXG4gICAgICAgICAgICAgICAgICAgIHNheS5hZGQoXCIgQXQgbGVhc3QgeW91IGNvdmVyZWQgaXQgdXAuXCIpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvdmVyZWRQZXJjIDwgMC4yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2F5LmFkZChcIiBNYXliZSB5b3UgY291bGQgY292ZXIgaXQgdXAgYSBiaXQuXCIpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNheS5hZGQoU2F5LlBBUkFHUkFQSF9CUkVBSyk7XHJcblxyXG5cclxuXHJcbiAgICAgICAgbGV0IHN0YXRzID0gbmV3IFNheUxlZnRSaWdodCgpO1xyXG5cclxuICAgICAgICBzdGF0cy5hZGRMZWZ0KG5ldyBTYXlCb2xkKFwiU3RyZW5ndGg6IFwiKSwgQXR0cmlidXRlcy5TdHJlbmd0aC5nZXREZXNjcmlwdGlvbihwbGF5ZXIuZ2V0U3RhdChBdHRyaWJ1dGVzLlN0cmVuZ3RoKSkpO1xyXG4gICAgICAgIHN0YXRzLmFkZExlZnQoU2F5LkxJTkVfQlJFQUspO1xyXG4gICAgICAgIHN0YXRzLmFkZExlZnQobmV3IFNheUJvbGQoXCJBZ2lsaXR5OiBcIiksIEF0dHJpYnV0ZXMuQWdpbGl0eS5nZXREZXNjcmlwdGlvbihwbGF5ZXIuZ2V0U3RhdChBdHRyaWJ1dGVzLkFnaWxpdHkpKSk7XHJcbiAgICAgICAgc3RhdHMuYWRkTGVmdChTYXkuTElORV9CUkVBSyk7XHJcbiAgICAgICAgc3RhdHMuYWRkTGVmdChuZXcgU2F5Qm9sZChcIkNoYXJtOiBcIiksIEF0dHJpYnV0ZXMuQ2hhcm0uZ2V0RGVzY3JpcHRpb24ocGxheWVyLmdldFN0YXQoQXR0cmlidXRlcy5DaGFybSkpKTtcclxuICAgICAgICBzdGF0cy5hZGRMZWZ0KFNheS5MSU5FX0JSRUFLKTtcclxuICAgICAgICBzdGF0cy5hZGRMZWZ0KG5ldyBTYXlCb2xkKFwiSW50ZWxsaWdlbmNlOiBcIiksIEF0dHJpYnV0ZXMuSW50ZWxsaWdlbmNlLmdldERlc2NyaXB0aW9uKHBsYXllci5nZXRTdGF0KEF0dHJpYnV0ZXMuSW50ZWxsaWdlbmNlKSkpO1xyXG5cclxuICAgICAgICBTa2lsbC5nZXRTa2lsbHMoKS5mb3JFYWNoKChza2lsbDogU2tpbGwpID0+IHtcclxuICAgICAgICAgICAgaWYgKHBsYXllci5nZXRTa2lsbChza2lsbCkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBzdGF0cy5hZGRSaWdodChuZXcgU2F5Qm9sZChza2lsbC5pZCArIFwiOiBcIiksIHNraWxsLmdldERlc2NyaXB0aW9uKHBsYXllci5nZXRTa2lsbChza2lsbCkpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzYXkuYWRkKHN0YXRzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNheTtcclxuICAgIH1cclxufVxyXG5cclxuQWN0aW9uV2Vhci5jYXJyeS5hZGRSdWxlKEh1bWFub2lkLmNhY2hlSW52YWxpZGF0aW9uQWN0aW9uUnVsZSk7XHJcbkFjdGlvblJlbW92ZS5jYXJyeS5hZGRSdWxlKEh1bWFub2lkLmNhY2hlSW52YWxpZGF0aW9uQWN0aW9uUnVsZSk7IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkNsYXNzZXMvVGhpbmdzL1BlcnNvbi50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJDbGFzc2VzL1RoaW5ncy9NYXBOb3RlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkNsYXNzZXMvVGhpbmdzL0h1bWFub2lkL0h1bWFub2lkLnRzXCIgLz5cclxuXHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJDbGFzc2VzL1J1bGVib29rLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkNsYXNzZXMvUnVsZS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJDbGFzc2VzL1NhdmUvU3RvcmVkVmFyaWFibGUudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiUGxheUJlZ2lucy50c1wiIC8+XHJcbm1vZHVsZSBXb3JsZFN0YXRlIHtcclxuICAgIHZhciB3b3JsZFR1cm4gOiBudW1iZXIgPSAwO1xyXG4gICAgdmFyIHBsYXllclR1cm4gOiBudW1iZXIgPSAwO1xyXG4gICAgZXhwb3J0IHZhciBwbGF5ZXIgOiBIdW1hbm9pZCA9IG5ldyBIdW1hbm9pZCh7aXNNYWxlIDogZmFsc2V9KTtcclxuXHJcbiAgICBwbGF5ZXIuZGVzY3JpcHRpb24gPSBIdW1hbm9pZC5nZXRQbGF5ZXJEZXNjcmlwdGlvbjtcclxuXHJcbiAgICB2YXIgcmVtZW1iZXJlZFJvb21zID0gbmV3IFN0b3JlZFZhcmlhYmxlPEFycmF5PHN0cmluZz4+KHtcclxuICAgICAgICBpZCA6IFwiUmVtZW1iZXJlZCBSb29tc1wiLFxyXG4gICAgICAgIHZhbHVlIDogW11cclxuICAgIH0pO1xyXG5cclxuICAgIHZhciByZW1lbWJlcmVkRm9kZGVyIDogQXJyYXk8Um9vbT4gPSBbXTtcclxuXHJcbiAgICBsZXQgcmVtZW1iZXJlZFJvb21zRm9ySW50ZWxsaWdlbmNlID0gMjtcclxuICAgIGxldCByZW1lbWJlcmVkUm9vbXNGb3JTdXJ2aXZhbCA9IDE7XHJcblxyXG4gICAgZXhwb3J0IHZhciBSZW1lbWJlcmluZ1Jvb21SdWxlYm9vayA6IFJ1bGVib29rPFJvb20+ID0gbmV3IFJ1bGVib29rKFwiUmVtZW1iZXJpbmcgUm9vbSBzb21ldGhpbmdcIik7XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzVHVybldhaXRpbmcgKCkge1xyXG4gICAgICAgIHJldHVybiB3b3JsZFR1cm4gPCBwbGF5ZXJUdXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpbmNyZW1lbnRXb3JsZFR1cm4gKCkge1xyXG4gICAgICAgIHdvcmxkVHVybisrO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpbmNyZW1lbnRQbGF5ZXJUdXJuICgpIHtcclxuICAgICAgICBwbGF5ZXJUdXJuKys7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldEN1cnJlbnRUdXJuICgpIHtcclxuICAgICAgICByZXR1cm4gcGxheWVyVHVybjtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gc2V0Q3VycmVudFR1cm4gKHR1cm4gOiBudW1iZXIpIHtcclxuICAgICAgICBwbGF5ZXJUdXJuID0gdHVybjtcclxuICAgICAgICB3b3JsZFR1cm4gPSB0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBsZXQgUmVtZW1iZXJpbmdSb29tSW5MaXN0ID0gUmVtZW1iZXJpbmdSb29tUnVsZWJvb2suY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiSXMgcm9vbSBsaXN0ZWQgaW4gcmVtZW1iZXJlZCByb29tcz9cIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9MT1dFU1QsXHJcbiAgICAgICAgcHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0xPVyxcclxuICAgICAgICBjb2RlIDogcnVubmVyID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlbWVtYmVyZWRSb29tcy52YWx1ZS5pbmRleE9mKHJ1bm5lci5ub3VuLmdldE5hbWUoKSkgIT0gLTEgfHwgcmVtZW1iZXJlZEZvZGRlci5pbmRleE9mKHJ1bm5lci5ub3VuKSAhPSAtMSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBleHBvcnQgbGV0IFJlbWVtYmVyaW5nUm9vbUluTWFwID0gUmVtZW1iZXJpbmdSb29tUnVsZWJvb2suY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiSXMgcm9vbSBzaG93biBvbiBhIG1hcD9cIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9MT1dFU1QsXHJcbiAgICAgICAgcHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0xPV0VTVCxcclxuICAgICAgICBjb2RlIDogcnVubmVyID0+IHtcclxuICAgICAgICAgICAgbGV0IG1hcHMgPSA8QXJyYXk8TWFwTm90ZT4+IFRoaW5nLkNhcnJ5UmVsYXRpb24uZ2V0UmlnaHRUeXBlKHBsYXllciwgTWFwTm90ZSk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFwcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKG1hcHNbaV0uY29udGFpbnMocnVubmVyLm5vdW4pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNSb29tUmVtZW1iZXJlZCAocm9vbSA6IFJvb20pIDogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IFJlbWVtYmVyaW5nUm9vbVJ1bGVib29rLmV4ZWN1dGUoe25vdW4gOiByb29tfSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdCA9PSB0cnVlOyAvLyBjYW4gcmV0dXJuIFwidW5kZWZpbmVkXCJcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0UmVtZW1iZXJlZFJvb21zICgpIHtcclxuICAgICAgICByZXR1cm4gcmVtZW1iZXJlZFJvb21zLnZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRSZW1lbWJlcmVkUm9vbXNBc1Jvb21zICgpIDogQXJyYXk8Um9vbT4ge1xyXG4gICAgICAgIGxldCByb29tcyA9IFtdO1xyXG4gICAgICAgIHJlbWVtYmVyZWRSb29tcy52YWx1ZS5mb3JFYWNoKHJvb21OYW1lID0+IHtcclxuICAgICAgICAgICAgbGV0IHJvb20gPSBSb29tLmdldFJvb20ocm9vbU5hbWUpO1xyXG4gICAgICAgICAgICBpZiAocm9vbSAhPSB1bmRlZmluZWQpIHJvb21zLnB1c2gocm9vbSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiByb29tcztcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0TWF4aW11bVJlbWVtYmVyZWRSb29tcyAoKSB7XHJcbiAgICAgICAgbGV0IGludFJvb21zID0gcGxheWVyLmdldFN0YXQoQXR0cmlidXRlcy5JbnRlbGxpZ2VuY2UpICogcmVtZW1iZXJlZFJvb21zRm9ySW50ZWxsaWdlbmNlO1xyXG4gICAgICAgIGxldCBza2lsbFJvb21zID0gcGxheWVyLmdldFNraWxsKFNraWxscy5TdXJ2aXZhbCkgKiByZW1lbWJlcmVkUm9vbXNGb3JTdXJ2aXZhbDtcclxuICAgICAgICByZXR1cm4gaW50Um9vbXMgKyBza2lsbFJvb21zO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiB0cnVuY2F0ZVJvb21zICgpIHtcclxuICAgICAgICB3aGlsZSAocmVtZW1iZXJlZFJvb21zLnZhbHVlLmxlbmd0aCA+IGdldE1heGltdW1SZW1lbWJlcmVkUm9vbXMoKSl7XHJcbiAgICAgICAgICAgIHJlbWVtYmVyZWRSb29tcy52YWx1ZS5wb3AoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlbWVtYmVyUm9vbSAoLi4ucm9vbXMgOiBBcnJheTxSb29tPikge1xyXG4gICAgICAgIHJvb21zLmZvckVhY2goKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJvb20pIHtcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5mb2RkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVtZW1iZXJlZEZvZGRlci5pbmRleE9mKHZhbHVlKSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1lbWJlcmVkRm9kZGVyLnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlkeCA9IHJlbWVtYmVyZWRSb29tcy52YWx1ZS5pbmRleE9mKHZhbHVlLmdldE5hbWUoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCAhPSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1lbWJlcmVkUm9vbXMudmFsdWUuc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJlbWVtYmVyZWRSb29tcy52YWx1ZS51bnNoaWZ0KHZhbHVlLmdldE5hbWUoKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0cnVuY2F0ZVJvb21zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHNhdmVTdGF0ZSAoKSB7XHJcbiAgICAgICAgbGV0IHRoaW5ncyA9IHtcclxuICAgICAgICAgICAgY2FycmllZDogW10sXHJcbiAgICAgICAgICAgIHdvcm46IFtdLFxyXG4gICAgICAgICAgICB3aWVsZGVkOiBbXVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIFRoaW5ncyA6IHRoaW5nc1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGxldCBDb3JyZWN0UmVtZW1iZXJlZFJvb21zUnVsZSA9IFBsYXlCZWdpbnMucnVsZWJvb2suY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiQ29ycmVjdCByZW1lbWJlcmVkIHJvb21zXCIsXHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfTE9XRVNULFxyXG4gICAgICAgIHByaW9yaXR5IDogUnVsZS5QUklPUklUWV9NRURJVU0sXHJcbiAgICAgICAgY29kZSA6ICgpID0+IHtcclxuICAgICAgICAgICAgbGV0IGFsbFJvb21zID0gcmVtZW1iZXJlZFJvb21zLnZhbHVlO1xyXG4gICAgICAgICAgICBsZXQgY3VycmVudFJvb20gPSBXb3JsZFN0YXRlLnBsYXllci5nZXRSb29tKCk7XHJcbiAgICAgICAgICAgIGlmIChhbGxSb29tcy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmVtZW1iZXJlZFJvb21zLnZhbHVlID0gW2N1cnJlbnRSb29tLmdldE5hbWUoKV07XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IG5ld1Jvb21zID0gW107XHJcblxyXG4gICAgICAgICAgICBmdW5jdGlvbiByZWN1cnNpdmVseUFkZFJvb21zIChyb29tIDogUm9vbSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJvb20gaW5zdGFuY2VvZiBSb29tUmFuZG9tKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvb20uZm9kZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbWVtYmVyZWRGb2RkZXIucHVzaChyb29tKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm9vbS5jb25uZWN0aW9ucy5mb3JFYWNoKChuZXdSb29tKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNpdmVseUFkZFJvb21zKG5ld1Jvb20pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFsbFJvb21zLmluZGV4T2Yocm9vbS5nZXROYW1lKCkpICE9IC0xICYmIG5ld1Jvb21zLmluZGV4T2Yocm9vbS5nZXROYW1lKCkpID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Jvb21zLnB1c2gocm9vbS5nZXROYW1lKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb29tLmNvbm5lY3Rpb25zLmZvckVhY2goKG5ld1Jvb20pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZWx5QWRkUm9vbXMobmV3Um9vbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmVjdXJzaXZlbHlBZGRSb29tcyhjdXJyZW50Um9vbSk7XHJcbiAgICAgICAgICAgIHJlbWVtYmVyZWRSb29tcy52YWx1ZSA9IG5ld1Jvb21zO1xyXG4gICAgICAgIH1cclxuICAgIH0pXHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiUmVsYXRpb25zL1JlbGF0aW9uT25lVG9NYW55LnRzXCIgLz5cclxuY2xhc3MgUmVnaW9uIHtcclxuICAgIHB1YmxpYyBuYW1lIDogc3RyaW5nO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAobmFtZSA6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBSZWdpb25Sb29tID0gbmV3IFJlbGF0aW9uT25lVG9NYW55KCk7XHJcbiAgICBwdWJsaWMgc3RhdGljIFJlZ2lvblJlZ2lvbiA9IG5ldyBSZWxhdGlvbk9uZVRvTWFueSgpO1xyXG4gICAgcHVibGljIHN0YXRpYyBJblJlbGF0aW9uID0gbmV3IFJlbGF0aW9uSGFuZGxlclN0cmljdE9uZVRvTWFueShSZWdpb24uUmVnaW9uUmVnaW9uLCBSZWdpb24uUmVnaW9uUm9vbSk7XHJcblxyXG4gICAgcHVibGljIHBsYWNlICguLi5yb29tcyA6IEFycmF5PFJvb20gfCBSZWdpb24+KSB7XHJcbiAgICAgICAgcm9vbXMuZm9yRWFjaChyb29tID0+IHtcclxuICAgICAgICAgICAgaWYgKHJvb20gaW5zdGFuY2VvZiBSb29tKSB7XHJcbiAgICAgICAgICAgICAgICBSZWdpb24uUmVnaW9uUm9vbS5zZXRSZWxhdGlvbih0aGlzLCByb29tKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIFJlZ2lvbi5SZWdpb25SZWdpb24uc2V0UmVsYXRpb24odGhpcywgcm9vbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Um9vbXMgKCkge1xyXG4gICAgICAgIGxldCByb29tcyA9IDxBcnJheTxSb29tPj4gUmVnaW9uLlJlZ2lvblJvb20uZ2V0UmlnaHQodGhpcyk7XHJcbiAgICAgICAgUmVnaW9uLlJlZ2lvblJlZ2lvbi5nZXRSaWdodCh0aGlzKS5mb3JFYWNoKChyZWdpb24gOiBSZWdpb24pID0+IHtcclxuICAgICAgICAgICAgKDxBcnJheTxSb29tPj4gUmVnaW9uLlJlZ2lvblJvb20uZ2V0UmlnaHQocmVnaW9uKSkuZm9yRWFjaCgocm9vbSA6IFJvb20pID0+IHtcclxuICAgICAgICAgICAgICAgIHJvb21zLnB1c2gocm9vbSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiByb29tcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY29udGFpbnNSb29tIChyb29tIDogUm9vbSkge1xyXG4gICAgICAgIGxldCBkaXJlY3RseUNvbnRhaW5lZCA9IFJlZ2lvbi5SZWdpb25Sb29tLmdldExlZnQocm9vbSkgPT0gdGhpcztcclxuICAgICAgICBpZiAoZGlyZWN0bHlDb250YWluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChSZWdpb24uUmVnaW9uUmVnaW9uLmdldExlZnQodGhpcykgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFJvb21zKCkuaW5kZXhPZihyb29tKSAhPSAtMTsgLy8gSWYgaXQncyBub3QgZGlyZWN0bHkgY29udGFpbmVkLCB3ZSBoYXZlIHRvIGNoZWNrIHJvb21zIGZvciBldmVyeSByZWdpb24gdGhhdCBjb250YWlucyB0aGlzIG9uZSBhbmQgSSBkb24ndCBjYXJlIGVub3VnaCB0byBkbyB0aGF0IHJpZ2h0IG5vd1xyXG4gICAgICAgICAgICAvLyBUT0RPOiBvcHRpbWl6ZSB0aGlzLlxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNvbnRhaW5zICh0aGluZyA6IFRoaW5nKSB7XHJcbiAgICAgICAgbGV0IHJvb20gPSB0aGluZy5nZXRSb29tKCk7XHJcbiAgICAgICAgaWYgKHJvb20gPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgcmVnaW9ucyA9IFJlZ2lvbi5JblJlbGF0aW9uLmdldEFsbExlZnQocm9vbSk7XHJcbiAgICAgICAgICAgIHJldHVybiByZWdpb25zLmluZGV4T2YodGhpcykgIT0gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiLyoqXHJcbiAqIFdhcm5pbmc6IFNodWZmbGVycyB3aWxsIGFsdGVyIHRoZSBnaXZlbiBhcnJheVxyXG4gKi9cclxuY2xhc3MgU2h1ZmZsZXI8VD4ge1xyXG4gICAgcHJpdmF0ZSBhcnJheSA6IEFycmF5PFQ+O1xyXG4gICAgcHJpdmF0ZSBwb3NpdGlvbiA9IDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYXliZSB1c2Ugc2VlZGVkIHJhbmRvbSBzb21lIGRheVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHJuZyA6ICgpID0+IG51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKGFycmF5IDogQXJyYXk8VD4sIHJuZz8gOiAoKSA9PiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLnJuZyA9IHJuZyA9PSB1bmRlZmluZWQgPyBNYXRoLnJhbmRvbSA6IHJuZztcclxuICAgICAgICB0aGlzLmFycmF5ID0gYXJyYXk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlc3RhcnQgKCkge1xyXG4gICAgICAgIHRoaXMucG9zaXRpb24gPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhIHJhbmRvbSBlbGVtZW50IGZyb20gdGhlIFNodWZmbGVyIEFycmF5XHJcbiAgICAgKiBDYW4gYmUgY2FsbGVkIHJlcGVhdGVkbHlcclxuICAgICAqIFdoZW4gdGhlcmUgYXJlIG5vIG1vcmUgZWxlbWVudHMgbGVmdCwgcmV0dXJucyB1bmRlZmluZWRcclxuICAgICAqIEByZXR1cm5zIHtUfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0T25lICgpIDogVCB7XHJcbiAgICAgICAgLy8gZ2V0IGEgcmFuZG9tIGVsZW1lbnQgZnJvbSB0aGlzLnBvc2l0aW9uIHRvIChhcnJheS5sZW5ndGggLSAxKVxyXG4gICAgICAgIC8vIHN0b3JlIGl0IGxvY2FsbHlcclxuICAgICAgICAvLyBzd2l0Y2ggaXQgd2l0aCBhcnJheVt0aGlzLnBvc2l0aW9uXVxyXG4gICAgICAgIC8vIHJldHVybiBpdFxyXG4gICAgICAgIGlmICh0aGlzLnBvc2l0aW9uID49IHRoaXMuYXJyYXkubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCByYW5kb21JbmRleCA9IE1hdGguZmxvb3IodGhpcy5ybmcoKSAqICh0aGlzLmFycmF5Lmxlbmd0aCAtIHRoaXMucG9zaXRpb24pKSArIHRoaXMucG9zaXRpb247XHJcbiAgICAgICAgbGV0IGxvY2FsQ29weSA9IHRoaXMuYXJyYXlbdGhpcy5wb3NpdGlvbl07XHJcbiAgICAgICAgdGhpcy5hcnJheVt0aGlzLnBvc2l0aW9uXSA9IHRoaXMuYXJyYXlbcmFuZG9tSW5kZXhdO1xyXG4gICAgICAgIHRoaXMuYXJyYXlbcmFuZG9tSW5kZXhdID0gbG9jYWxDb3B5O1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFycmF5W3RoaXMucG9zaXRpb24rK107XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGVyZSBzaG91bGQgYmUgbm8gcmVhc29uIHRvIHVzZSB0aGlzIHdpdGggdGhlIFwiZ2V0T25lXCIgY29kZSBhYm92ZS5cclxuICAgICAqIEByZXR1cm5zIHtUW119XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTaHVmZmxlZCAoKSA6IEFycmF5PFQ+IHtcclxuICAgICAgICBsZXQgYXJyYXkgPSB0aGlzLmFycmF5LnNsaWNlKDApO1xyXG4gICAgICAgIHZhciBtID0gYXJyYXkubGVuZ3RoLCB0LCBpO1xyXG4gICAgICAgIHdoaWxlIChtKSB7XHJcbiAgICAgICAgICAgIGkgPSBNYXRoLmZsb29yKHRoaXMucm5nKCkgKiBtLS0pO1xyXG4gICAgICAgICAgICB0ID0gYXJyYXlbbV07XHJcbiAgICAgICAgICAgIGFycmF5W21dID0gYXJyYXlbaV07XHJcbiAgICAgICAgICAgIGFycmF5W2ldID0gdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBhcnJheTtcclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9BSS50c1wiIC8+XHJcbm1vZHVsZSBBSVJ1bGVzIHtcclxuICAgIGV4cG9ydCB2YXIgUGlja1NoaW55ID0gQUkucnVsZXMuY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiUGljayBTaGluaWVzXCIsXHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IEFJUnVsZXMuUFJJT1JJVFlfQUNUSU5HX09OX1BMQUNFLFxyXG4gICAgICAgIGNvbmRpdGlvbnMgOiAocnVubmVyIDogUnVsZWJvb2tSdW5uZXI8UGVyc29uPikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcGVyc29uID0gcnVubmVyLm5vdW47XHJcbiAgICAgICAgICAgIHJldHVybiBwZXJzb24uQUkucGlja3NTaGluaWVzO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29kZSA6IChydW5uZXIgOiBSdWxlYm9va1J1bm5lcjxQZXJzb24+KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBwZXJzb24gPSBydW5uZXIubm91bjtcclxuICAgICAgICAgICAgbGV0IHJvb20gPSBwZXJzb24uZ2V0Um9vbSgpO1xyXG4gICAgICAgICAgICBsZXQgdmlzaWJsZVRoaW5ncyA9IHJvb20uZ2V0Q29udGFpbmVkQW5kVmlzaWJsZVRvKHBlcnNvbik7XHJcblxyXG4gICAgICAgICAgICBpZiAodmlzaWJsZVRoaW5ncy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZpc2libGVUaGluZ3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXZpc2libGVUaGluZ3NbaV0uZml4ZWRJblBsYWNlICYmIHZpc2libGVUaGluZ3NbaV0uZ2V0U2hpbnkoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFjdGlvblRha2UocGVyc29uLCB2aXNpYmxlVGhpbmdzW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9BSS50c1wiIC8+XHJcbm1vZHVsZSBBSVJ1bGVzIHtcclxuICAgIGV4cG9ydCB2YXIgV2FuZGVyID0gQUkucnVsZXMuY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiV2FuZGVyXCIsXHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IEFJUnVsZXMuUFJJT1JJVFlfQUNUSU5HX09OX0lETEUsXHJcbiAgICAgICAgY29uZGl0aW9ucyA6IChydW5uZXIgOiBSdWxlYm9va1J1bm5lcjxQZXJzb24+KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBwZXJzb24gPSBydW5uZXIubm91bjtcclxuICAgICAgICAgICAgcmV0dXJuIHBlcnNvbi5BSS53YW5kZXJlciAmJiAoTWF0aC5yYW5kb20oKSAqIDEwMCkgPiBwZXJzb24uQUkud2FuZGVyQ2hhbmNlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29kZSA6IChydW5uZXIgOiBSdWxlYm9va1J1bm5lcjxQZXJzb24+KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBwZXJzb24gPSBydW5uZXIubm91bjtcclxuICAgICAgICAgICAgbGV0IHJvb20gPSA8Um9vbVJhbmRvbT4gcGVyc29uLmdldFJvb20oKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwZXJzb24uQUkud2FuZGVyc09uICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gc3RpY2sgdG8gcmVnaW9uIHdoaWxlIHdhbmRlcmluZ1xyXG4gICAgICAgICAgICAgICAgaWYgKHBlcnNvbi5BSS53YW5kZXJzT24uY29udGFpbnNSb29tKHJvb20pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQWxyZWR5IGluIHJlZ2lvbiwgc28ganVzdCB3YW5kZXIgb2ZmIGluc2lkZSBpdFxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb25uZWN0aW9ucyA9IHJvb20uY29ubmVjdGlvbnMuc2xpY2UoKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVhbENvbm5lY3Rpb25zID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25uZWN0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbnNbaV0gIT0gdW5kZWZpbmVkICYmIHBlcnNvbi5BSS53YW5kZXJzT24uY29udGFpbnNSb29tKGNvbm5lY3Rpb25zW2ldKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbENvbm5lY3Rpb25zLnB1c2goaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRpcmVjdGlvbiA9ICgobmV3IFNodWZmbGVyKHJlYWxDb25uZWN0aW9ucykpLmdldE9uZSgpKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFjdGlvbkdvKHBlcnNvbiwgZGlyZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRvIHJlZ2lvblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZWdpb25Sb29tcyA9IHBlcnNvbi5BSS53YW5kZXJzT24uZ2V0Um9vbXMoKS5maWx0ZXIoKGEgOiBSb29tKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhIGluc3RhbmNlb2YgUm9vbVJhbmRvbSAmJiBhLnBsYWNlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJZGVhbGx5IHdlJ2QgYWN0dWFsbHkgbWFrZSBhIHBhdGggdG8gaXQgYW5kIGNoZWNrIHRoZSBkaXN0YW5jZSwgc2luY2UgbWF6ZXMgY2FuIG1ha2UgaXQgYmUgbG9uZ2VyIHRoYW4gaXQgcmVhbGx5IGlzXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQnV0IHRoaXMgaXMgcXVpY2sgYW5kIGRpcnR5IGVub3VnaC4gQW5kIHNpbmNlIHJlZ2lvbnMgYXJlIGNsb3NlbHkgcGFja2VkLCBldmVuIGlmIHRoaXMgaXMgbm90IHJlYWxseSB0aGUgY2xvc2VzdCByb29tLCB0aGUgTlBDIHdpbGwgZW5kIHVwXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZW50ZXJpbmcgdGhlIHJlZ2lvbiBlYXJsaWVyIGJ5IGFjY2lkZW50LlxyXG4gICAgICAgICAgICAgICAgICAgIHJlZ2lvblJvb21zLnNvcnQoKGEgOiBSb29tUmFuZG9tLCBiIDogUm9vbVJhbmRvbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGlzdCA9IGEuZ2V0RGlzdGFuY2VUbyhiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3QgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLWRpc3Q7IC8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgbGF0ZXN0IGVsZW1lbnQgd2lsbCBiZSB0aGUgY2xvc2VzdC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOyAvLyBUaGlzIG1lYW5zIHRoYXQgdGhlIGZpcnN0IGVsZW1lbnRzIHdpbGwgYmUgdW5yZWFjaGFibGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0Um9vbSA9IHJlZ2lvblJvb21zLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQWN0aW9uR28ocGVyc29uLCB0YXJnZXRSb29tKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIGp1c3Qgd2FuZGVyIGluIHJhbmRvbSBkaXJlY3Rpb25cclxuICAgICAgICAgICAgICAgIGxldCBkaXJlY3Rpb24gPSByb29tLmdldENvbm5lY3RlZERpcmVjdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBY3Rpb25HbyhwZXJzb24sIGRpcmVjdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9BY3Rpb24udHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vUnVsZS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9SdWxlYm9vay50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi9FbGVtZW50cy9DbGFzc2VzL1NheS9TYXlCb2xkLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL0VsZW1lbnRzL01vZHVsZXMvSHlwZXJsaW5rSGFuZGxlci50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi9FbGVtZW50cy9Nb2R1bGVzL0ludmVudG9yeUhhbmRsZXIudHNcIiAvPlxyXG5cclxuY2xhc3MgQWN0aW9uRHJvcCBleHRlbmRzIEFjdGlvbiB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGNoZWNrID0gbmV3IFJ1bGVib29rPEFjdGlvbkRyb3A+KFwiQ2hlY2sgRHJvcHBpbmdcIik7XHJcbiAgICBwdWJsaWMgc3RhdGljIGNhcnJ5ID0gbmV3IFJ1bGVib29rPEFjdGlvbkRyb3A+KFwiQ2Fycnkgb3V0IERyb3BwaW5nXCIpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTmVlZHMgdG8gcmV0dXJuIGEgc3RyaW5nIGV4cGxhaW5pbmcgd2hhdCB0aGUgcGxheWVyIHdpbGwgZG8gaWYgaGUgZG9lcyB0aGlzIGFjdGlvbi5cclxuICAgICAqIEZvciBpbnN0YW5jZSwgQWN0aW9uVGFraW5nIHNob3VsZCByZXR1cm4gc29tZXRoaW5nIGxpa2UgcmV0dXJuIFwidGFrZSBcIiArIHRoaXMubm91bnNbMF0uZ2V0TmFtZSgpLFxyXG4gICAgICogICB3aGljaCB3b3VsZCByZWFkIGFzIFwidGFrZSB0aGluZ1wiLlxyXG4gICAgICogICByZW1lbWJlciB0aGF0IHRoaW5ncyBpbXBsZW1lbnQgUFJJTlRBQkxFIGludGVyZmFjZSwgc28geW91IGNhbiBnZXQgdGhlaXIgbmFtZXMuXHJcbiAgICAgKiBAcmV0dXJucyB7U2F5fVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q29tbWFuZFRleHQgKCkge1xyXG4gICAgICAgIHJldHVybiBcImRyb3AgXCIgKyAodGhpcy5nZXROb3VuKDApICE9IHVuZGVmaW5lZCA/IHRoaXMuZ2V0Tm91bigwKS5nZXRQcmludGVkTmFtZSgpIDogXCJcIik7XHJcbiAgICB9XHJcbn1cclxuXHJcbkFjdGlvbkRyb3AuY2hlY2suYWRkUnVsZShcclxuICAgIG5ldyBSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJDaGVjayBEcm9wcGluZyAtIEFyZSB5b3UgV2VhcmluZyBpdD9cIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9MT1dFU1QsXHJcbiAgICAgICAgY29kZSA6IGFzeW5jIChydWxlYm9vayA6IFJ1bGVib29rUnVubmVyPEFjdGlvbkRyb3A+KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBhY3Rpb24gPSA8QWN0aW9uR28+IHJ1bGVib29rLm5vdW47XHJcbiAgICAgICAgICAgIGxldCBhY3RvciA9IGFjdGlvbi5hY3RvcjtcclxuICAgICAgICAgICAgbGV0IHRoaW5nID0gKDxUaGluZz5hY3Rpb24uZ2V0Tm91bigwKSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoVGhpbmcuV2VhclJlbGF0aW9uLmdldExlZnQodGhpbmcpID09IGFjdG9yIHx8IFRoaW5nLldpZWxkUmVsYXRpb24uZ2V0TGVmdCh0aGluZykgPT0gYWN0b3Ipe1xyXG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbi5hY3RvciA9PSBXb3JsZFN0YXRlLnBsYXllcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbi5zYXkuYWRkKFwiKGZpcnN0IHRha2luZyBvZmYgdGhlIFwiLCB0aGluZywgXCIpXCIsIFNheS5MSU5FX0JSRUFLKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCB0YWtpbmdBY3Rpb24gPSBuZXcgQWN0aW9uUmVtb3ZlKGFjdG9yLCB0aGluZyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0YWtpbmdBY3Rpb24uZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uLnNheS5hZGQodGFraW5nQWN0aW9uLnNheSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoVGhpbmcuV2VhclJlbGF0aW9uLmdldExlZnQodGhpbmcpID09IGFjdG9yIHx8IFRoaW5nLldpZWxkUmVsYXRpb24uZ2V0TGVmdCh0aGluZykgPT0gYWN0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBhY3Rpb24uc2F5LmFkZChTYXkuTElORV9CUkVBSyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KVxyXG4pO1xyXG5cclxuQWN0aW9uRHJvcC5jaGVjay5hZGRSdWxlKFxyXG4gICAgbmV3IFJ1bGUoe1xyXG4gICAgICAgIG5hbWUgOiBcIkNoZWNrIERyb3BwaW5nIC0gRG8geW91IGhhdmUgaXQ/P1wiLFxyXG4gICAgICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0xPV0VTVCxcclxuICAgICAgICBjb2RlIDogKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8QWN0aW9uRHJvcD4pID0+IHtcclxuICAgICAgICAgICAgbGV0IGFjdGlvbiA9IDxBY3Rpb25Hbz4gcnVsZWJvb2subm91bjtcclxuICAgICAgICAgICAgbGV0IGFjdG9yID0gYWN0aW9uLmFjdG9yO1xyXG4gICAgICAgICAgICBsZXQgdGhpbmcgPSAoPFRoaW5nPmFjdGlvbi5nZXROb3VuKDApKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChUaGluZy5DYXJyeVJlbGF0aW9uLmdldExlZnQodGhpbmcpICE9IGFjdG9yKXtcclxuICAgICAgICAgICAgICAgIGlmIChhY3RvciA9PSBXb3JsZFN0YXRlLnBsYXllcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbi5zYXkuYWRkKFwiWW91IGRvbid0IGhhdmUgaXQuXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSlcclxuKTtcclxuXHJcbkFjdGlvbkRyb3AuY2FycnkuYWRkUnVsZShcclxuICAgIG5ldyBSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJEcm9wcGluZyAtIFBsYWNlIHRoZSBub3VuIG9uIHRoZSBmbG9vclwiLFxyXG4gICAgICAgIGNvZGUgOiAocnVsZWJvb2sgOiBSdWxlYm9va1J1bm5lcjxBY3Rpb25Ecm9wPikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgYWN0aW9uID0gPEFjdGlvbkdvPiBydWxlYm9vay5ub3VuO1xyXG4gICAgICAgICAgICBsZXQgYWN0b3IgPSBhY3Rpb24uYWN0b3I7XHJcbiAgICAgICAgICAgIGxldCB0aGluZyA9ICg8VGhpbmc+YWN0aW9uLmdldE5vdW4oMCkpO1xyXG5cclxuICAgICAgICAgICAgVGhpbmcuRW5jbG9zZWRSZWxhdGlvbi51bnNldFJpZ2h0KHRoaW5nKTtcclxuXHJcbiAgICAgICAgICAgIGFjdG9yLmdldFJvb20oKS5wbGFjZSh0aGluZyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYWN0b3IgPT0gV29ybGRTdGF0ZS5wbGF5ZXIpIHtcclxuICAgICAgICAgICAgICAgIGFjdGlvbi5zYXkuYWRkKG5ldyBTYXlCb2xkKCg8VGhpbmc+IGFjdGlvbi5nZXROb3VuKDApKS5nZXRQcmludGVkTmFtZSgpICsgXCI6IFwiKSwgXCJEcm9wcGVkLlwiKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFjdGlvbi5zYXkuYWRkKG5ldyBTYXlUaGUoKSwgYWN0b3IsIFwiIGRyb3BzIFwiLCBuZXcgU2F5VGhlKCksICg8VGhpbmc+IGFjdGlvbi5nZXROb3VuKDApKSwgXCIgb24gdGhlIGZsb29yLlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pXHJcbik7XHJcblxyXG4vKipcclxuICogSHlwZXJsaW5raW5nXHJcbiAqL1xyXG5FbGVtZW50cy5IeXBlcmxpbmtIYW5kbGVyLkh5cGVybGlua2luZ1J1bGVib29rLmFkZFJ1bGUobmV3IFJ1bGUoXHJcbiAgICB7XHJcbiAgICAgICAgbmFtZSA6IFwiSHlwZXJsaW5rIC0gRHJvcFwiLFxyXG4gICAgICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0hJR0hFU1QsXHJcbiAgICAgICAgY29kZSA6IChydWxlYm9vayA6IFJ1bGVib29rUnVubmVyPFRoaW5nPikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgdGhpbmcgPSA8VGhpbmc+IHJ1bGVib29rLm5vdW47XHJcblxyXG4gICAgICAgICAgICBpZiAoVGhpbmcuQ2FycnlSZWxhdGlvbi5nZXRMZWZ0KHRoaW5nKSA9PSBXb3JsZFN0YXRlLnBsYXllciB8fCBUaGluZy5XaWVsZFJlbGF0aW9uLmdldExlZnQodGhpbmcpID09IFdvcmxkU3RhdGUucGxheWVyIHx8IFRoaW5nLldlYXJSZWxhdGlvbi5nZXRMZWZ0KHRoaW5nKSA9PSBXb3JsZFN0YXRlLnBsYXllcikge1xyXG4gICAgICAgICAgICAgICAgRWxlbWVudHMuSHlwZXJsaW5rSGFuZGxlci5hZGRBdmFpbGFibGVBY3Rpb24oXCJEcm9wXCIsIG5ldyBBY3Rpb25Ecm9wKFdvcmxkU3RhdGUucGxheWVyLCB0aGluZykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4pKTtcclxuXHJcbi8qKlxyXG4gSW52ZW50b3J5XHJcbiAqL1xyXG5FbGVtZW50cy5JbnZlbnRvcnlIYW5kbGVyLkxpbmtpbmdUaGluZy5hZGRSdWxlKG5ldyBSdWxlKFxyXG4gICAge1xyXG4gICAgICAgIG5hbWUgOiBcIkludmVudG9yeSAtIERyb3BcIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9MT1dFU1QsXHJcbiAgICAgICAgY29kZSA6IChydWxlYm9vayA6IFJ1bGVib29rUnVubmVyPFRoaW5nPikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgdGhpbmcgPSA8VGhpbmc+IHJ1bGVib29rLm5vdW47XHJcblxyXG4gICAgICAgICAgICBFbGVtZW50cy5JbnZlbnRvcnlIYW5kbGVyLnByaW50VGhpbmdMaW5rKFwiRFwiLCBuZXcgQWN0aW9uRHJvcChXb3JsZFN0YXRlLnBsYXllciwgdGhpbmcpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbikpOyIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9BY3Rpb24udHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vLi4vRWxlbWVudHMvTW9kdWxlcy9JbnZlbnRvcnlIYW5kbGVyLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL0VsZW1lbnRzL0NsYXNzZXMvU2F5LnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL0VsZW1lbnRzL0NsYXNzZXMvU2F5L1NheUJvbGQudHNcIiAvPlxyXG5cclxuY2xhc3MgQWN0aW9uSW52ZW50b3J5IGV4dGVuZHMgQWN0aW9uIHtcclxuICAgIHB1YmxpYyByZXF1aXJlc1R1cm4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyByZXF1aXJlc05vdW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyByZXF1aXJlc1Zpc2liaWxpdHkgPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGNoZWNrIDogUnVsZWJvb2s8QWN0aW9uSW52ZW50b3J5PiA9IG5ldyBSdWxlYm9vayhcIkNoZWNrIFRha2luZyBJbnZlbnRvcnlcIik7XHJcbiAgICBwdWJsaWMgc3RhdGljIGNhcnJ5IDogUnVsZWJvb2s8QWN0aW9uSW52ZW50b3J5PiA9IG5ldyBSdWxlYm9vayhcIkNhcnJ5IG91dCBUYWtpbmcgSW52ZW50b3J5XCIpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTmVlZHMgdG8gcmV0dXJuIGEgc3RyaW5nIGV4cGxhaW5pbmcgd2hhdCB0aGUgcGxheWVyIHdpbGwgZG8gaWYgaGUgZG9lcyB0aGlzIGFjdGlvbi5cclxuICAgICAqIEZvciBpbnN0YW5jZSwgQWN0aW9uVGFraW5nIHNob3VsZCByZXR1cm4gc29tZXRoaW5nIGxpa2UgcmV0dXJuIFwidGFrZSBcIiArIHRoaXMubm91bnNbMF0uZ2V0TmFtZSgpLFxyXG4gICAgICogICB3aGljaCB3b3VsZCByZWFkIGFzIFwidGFrZSB0aGluZ1wiLlxyXG4gICAgICogICByZW1lbWJlciB0aGF0IHRoaW5ncyBpbXBsZW1lbnQgUFJJTlRBQkxFIGludGVyZmFjZSwgc28geW91IGNhbiBnZXQgdGhlaXIgbmFtZXMuXHJcbiAgICAgKiBAcmV0dXJucyB7U2F5fVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q29tbWFuZFRleHQgKCkge1xyXG4gICAgICAgIHJldHVybiBcInRha2UgaW52ZW50b3J5XCI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVCdXR0b24gKHRoaW5nIDogVGhpbmcsIHJlc29sdmUgOiAodCA6IFRoaW5nKSA9PiB2b2lkKSB7XHJcbiAgICAgICAgbGV0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKTtcclxuICAgICAgICBwLmNsYXNzTGlzdC5hZGQoXCJjaG9pY2VcIik7XHJcbiAgICAgICAgbGV0IGVsZW1lbnRzID0gYXdhaXQgKChuZXcgU2F5KHRoaW5nKSkuZ2V0UHVyZUVsZW1lbnRzKCkpO1xyXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZWxlID0+IHtcclxuICAgICAgICAgICAgcC5hcHBlbmRDaGlsZChlbGUpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBwLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHJlc29sdmUodGhpbmcpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBDb250cm9scy5LZXlIYW5kbGVyLmFwcGx5Q29kZShwLCBDb250cm9scy5LZXlIYW5kbGVyLmdldEZpcnN0S2V5Q29kZSgpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBjaGVja0ludmVudG9yeVJ1bGUgPSBBY3Rpb25JbnZlbnRvcnkuY2hlY2suY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiTGlzdCBpbnZlbnRvcnkgYXMgb3B0aW9uc1wiLFxyXG4gICAgICAgIGNvZGUgOiBhc3luYyAocnVsZWJvb2sgOiBSdWxlYm9va1J1bm5lcjxBY3Rpb25UYWtlPikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcGxheWVyID0gV29ybGRTdGF0ZS5wbGF5ZXI7XHJcbiAgICAgICAgICAgIGxldCB3aWVsZGVkID0gVGhpbmcuV2llbGRSZWxhdGlvbi5nZXRSaWdodChwbGF5ZXIpLnNvcnQoRWxlbWVudHMuSW52ZW50b3J5SGFuZGxlci50aGluZ1NvcnQpO1xyXG4gICAgICAgICAgICBsZXQgd29ybiA9IFRoaW5nLldlYXJSZWxhdGlvbi5nZXRSaWdodChwbGF5ZXIpLnNvcnQoRWxlbWVudHMuSW52ZW50b3J5SGFuZGxlci50aGluZ1NvcnQpO1xyXG4gICAgICAgICAgICBsZXQgY2FycmllZCA9IFRoaW5nLkNhcnJ5UmVsYXRpb24uZ2V0UmlnaHQocGxheWVyKS5zb3J0KEVsZW1lbnRzLkludmVudG9yeUhhbmRsZXIudGhpbmdTb3J0KTtcclxuXHJcbiAgICAgICAgICAgIGxldCBidXR0b25zO1xyXG4gICAgICAgICAgICBsZXQgY2hvc2VuUHJvbWlzZSA9IG5ldyBQcm9taXNlKChhc3luYyByZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgICAgIENvbnRyb2xzLktleUhhbmRsZXIucmVzZXQoKTtcclxuICAgICAgICAgICAgICAgIGxldCBzYXkgPSBuZXcgU2F5KCk7XHJcbiAgICAgICAgICAgICAgICBpZiAod2llbGRlZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2F5LmFkZChuZXcgU2F5Qm9sZChcIldpZWxkZWQ6XCIpLCBTYXkuTElORV9CUkVBSyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aWVsZGVkLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNheS5hZGQoYXdhaXQgQWN0aW9uSW52ZW50b3J5LmNyZWF0ZUJ1dHRvbih3aWVsZGVkW2ldLCByZXNvbHZlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh3b3JuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2F5LnNlcXVlbmNlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2F5LmFkZChTYXkuUEFSQUdSQVBIX0JSRUFLKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgc2F5LmFkZChuZXcgU2F5Qm9sZChcIldvcm46XCIpLCBTYXkuTElORV9CUkVBSyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3b3JuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNheS5hZGQoYXdhaXQgQWN0aW9uSW52ZW50b3J5LmNyZWF0ZUJ1dHRvbih3b3JuW2ldLCByZXNvbHZlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjYXJyaWVkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2F5LnNlcXVlbmNlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2F5LmFkZChTYXkuUEFSQUdSQVBIX0JSRUFLKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgc2F5LmFkZChuZXcgU2F5Qm9sZChcIkNhcnJpZWQ6XCIpLCBTYXkuTElORV9CUkVBSyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYXJyaWVkLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNheS5hZGQoYXdhaXQgQWN0aW9uSW52ZW50b3J5LmNyZWF0ZUJ1dHRvbihjYXJyaWVkW2ldLCByZXNvbHZlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzYXkuc2VxdWVuY2UubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGJ1dHRvbnMgPSBhd2FpdCBzYXkuZ2V0SFRNTENvbnRlbnQoKTtcclxuICAgICAgICAgICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5wcmludCguLi4oYnV0dG9ucykpO1xyXG4gICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgY2hvc2VuVGhpbmcgPSBhd2FpdCBjaG9zZW5Qcm9taXNlO1xyXG4gICAgICAgICAgICBpZiAoY2hvc2VuVGhpbmcgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIudW5wcmludCguLi5idXR0b25zKTtcclxuICAgICAgICAgICAgICAgIENvbnRyb2xzLktleUhhbmRsZXIucmVzZXQoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQWN0aW9uRXhhbWluZShXb3JsZFN0YXRlLnBsYXllciwgY2hvc2VuVGhpbmcpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcnVsZWJvb2subm91bi5zYXkuYWRkKFwiWW91IGhhdmUgbm90aGluZy5cIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufVxyXG5cclxuRWxlbWVudHMuSHlwZXJsaW5rSGFuZGxlci5Db21tb25BY3Rpb25zUnVsZWJvb2suYWRkUnVsZShuZXcgUnVsZSh7XHJcbiAgICBuYW1lIDogXCJBZGQgVGFrZSBJbnZlbnRvcnkgQ29tbWFuZCBSdWxlXCIsXHJcbiAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9MT1dFU1QsXHJcbiAgICBwcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfTUVESVVNLFxyXG4gICAgY29kZSA6IChydWxlYm9vayA6IFJ1bGVib29rUnVubmVyPHZvaWQ+KSA9PiB7XHJcbiAgICAgICAgRWxlbWVudHMuSHlwZXJsaW5rSGFuZGxlci5hZGRDb21tb25BY3Rpb24oXCJJbnZlbnRvcnlcIiwgbmV3IEFjdGlvbkludmVudG9yeShXb3JsZFN0YXRlLnBsYXllcikpO1xyXG4gICAgfVxyXG59KSk7IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0FjdGlvbi50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi9FbGVtZW50cy9Nb2R1bGVzL0h5cGVybGlua0hhbmRsZXIudHNcIiAvPlxyXG5jbGFzcyBBY3Rpb25TYXZlR2FtZSBleHRlbmRzIEFjdGlvbiB7XHJcbiAgICBwdWJsaWMgcmVxdWlyZXNUdXJuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgcmVxdWlyZXNOb3VuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgcmVxdWlyZXNWaXNpYmlsaXR5ID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgc3RhdGljIGNoZWNrIDogUnVsZWJvb2s8QWN0aW9uU2F2ZUdhbWU+ID0gbmV3IFJ1bGVib29rKFwiQ2hlY2sgU2F2aW5nXCIpO1xyXG4gICAgcHVibGljIHN0YXRpYyBjYXJyeSA6IFJ1bGVib29rPEFjdGlvblNhdmVHYW1lPiA9IG5ldyBSdWxlYm9vayhcIkNhcnJ5IG91dCBTYXZpbmdcIik7XHJcblxyXG4gICAgcHVibGljIGdldENvbW1hbmRUZXh0ICgpIHtcclxuICAgICAgICByZXR1cm4gXCJzYXZlIHRvIGZpbGVcIjtcclxuICAgIH1cclxufVxyXG5cclxuQWN0aW9uU2F2ZUdhbWUuY2FycnkuYWRkUnVsZShuZXcgUnVsZSh7XHJcbiAgICBuYW1lIDogXCJTYXZlIHRoZSBnYW1lXCIsXHJcbiAgICBjb2RlIDogcnVubmVyID0+IHtcclxuICAgICAgICBTYXZlSGFuZGxlci5zYXZlVG9GaWxlKCk7XHJcbiAgICAgICAgcnVubmVyLm5vdW4uc2F5LmFkZChcIlNhdmVkLlwiKTtcclxuICAgIH1cclxufSkpO1xyXG5cclxuRWxlbWVudHMuSHlwZXJsaW5rSGFuZGxlci5Db21tb25BY3Rpb25zUnVsZWJvb2suYWRkUnVsZShuZXcgUnVsZSh7XHJcbiAgICBuYW1lIDogXCJBZGQgU2F2ZSBDb21tYW5kIFJ1bGVcIixcclxuICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0xPV0VTVCxcclxuICAgIHByaW9yaXR5IDogUnVsZS5QUklPUklUWV9MT1dFU1QsXHJcbiAgICBjb2RlIDogKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8dm9pZD4pID0+IHtcclxuICAgICAgICBFbGVtZW50cy5IeXBlcmxpbmtIYW5kbGVyLmFkZENvbW1vbkFjdGlvbihcIlNhdmVcIiwgbmV3IEFjdGlvblNhdmVHYW1lKFdvcmxkU3RhdGUucGxheWVyKSk7XHJcbiAgICB9XHJcbn0pKTsiLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQWN0aW9uLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL0VsZW1lbnRzL01vZHVsZXMvSHlwZXJsaW5rSGFuZGxlci50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi9FbGVtZW50cy9DbGFzc2VzL1NheS9TYXlIZVNoZUl0LnRzXCIgLz5cclxuXHJcbmNsYXNzIEFjdGlvblRhbGsgZXh0ZW5kcyBBY3Rpb24ge1xyXG4gICAgcHVibGljIHN0YXRpYyBQUklPUklUWV9TSVRVQVRJT05fRElBTE9HVUUgPSA5O1xyXG4gICAgcHVibGljIHN0YXRpYyBQUklPUklUWV9QT1NTRVNTSU9OX0RJQUxPR1VFID0gNztcclxuICAgIHB1YmxpYyBzdGF0aWMgUFJJT1JJVFlfTE9DQVRJT05fRElBTE9HVUUgPSA1O1xyXG4gICAgcHVibGljIHN0YXRpYyBQUklPUklUWV9DT01NT05fRElBTE9HVUUgPSAzO1xyXG4gICAgcHVibGljIHN0YXRpYyBQUklPUklUWV9HTE9CQUxfRElBTE9HVUUgPSAxO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2s6IFJ1bGVib29rPEFjdGlvblRhbGs+ID0gbmV3IFJ1bGVib29rKFwiQ2hlY2sgVGFsa2luZ1wiKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgY2Fycnk6IFJ1bGVib29rPEFjdGlvblRhbGs+ID0gbmV3IFJ1bGVib29rKFwiQ2Fycnkgb3V0IFRhbGtpbmdcIik7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWZhdWx0Q2FycnlUYWxraW5nUnVsZSA9IEFjdGlvblRhbGsuY2FycnkuY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiVGFsa2luZyAtIERvZXNuJ3Qgd2FudCB0byB0YWxrXCIsXHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IC0xLFxyXG4gICAgICAgIHByaW9yaXR5IDogLTEsXHJcbiAgICAgICAgY29kZSA6IChydWxlYm9vayA6IFJ1bGVib29rUnVubmVyPEFjdGlvblRha2U+KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBhY3Rpb24gPSA8QWN0aW9uR28+IHJ1bGVib29rLm5vdW47XHJcbiAgICAgICAgICAgIC8vbGV0IGFjdG9yID0gYWN0aW9uLmFjdG9yO1xyXG4gICAgICAgICAgICBsZXQgdGhpbmcgPSAoPFRoaW5nPmFjdGlvbi5nZXROb3VuKDApKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGluZyBpbnN0YW5jZW9mIFBlcnNvbikge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uLnNheSA9IG5ldyBTYXkoXCJJdCBkb2Vzbid0IGxvb2sgbGlrZSBcIiwgbmV3IFNheUhlU2hlSXQodGhpbmcpLCBcIiB3YW50cyB0byB0YWxrLlwiKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFjdGlvbi5zYXkgPSBuZXcgU2F5KFwiSG93IGFyZSB5b3UgZ29pbmcgdG8gdGFsayB0byB0aGF0P1wiKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcHVibGljIGdldENvbW1hbmRUZXh0ICgpIHtcclxuICAgICAgICByZXR1cm4gXCJ0YWxrIHRvIFwiICsgKHRoaXMuZ2V0Tm91bigwKSAhPSB1bmRlZmluZWQgPyB0aGlzLmdldE5vdW4oMCkuZ2V0UHJpbnRlZE5hbWUoKSA6IFwiXCIpO1xyXG4gICAgfVxyXG59XHJcblxyXG5FbGVtZW50cy5IeXBlcmxpbmtIYW5kbGVyLkh5cGVybGlua2luZ1J1bGVib29rLmFkZFJ1bGUobmV3IFJ1bGUoXHJcbiAgICB7XHJcbiAgICAgICAgbmFtZSA6IFwiSHlwZXJsaW5rIC0gVGFsa1wiLFxyXG4gICAgICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0hJR0hFU1QsXHJcbiAgICAgICAgY29kZSA6IChydWxlYm9vayA6IFJ1bGVib29rUnVubmVyPFRoaW5nPikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgdGhpbmcgPSA8VGhpbmc+IHJ1bGVib29rLm5vdW47XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpbmcgaW5zdGFuY2VvZiBQZXJzb24gJiYgdGhpbmcuZ2V0Um9vbSgpID09IFdvcmxkU3RhdGUucGxheWVyLmdldFJvb20oKSkge1xyXG4gICAgICAgICAgICAgICAgRWxlbWVudHMuSHlwZXJsaW5rSGFuZGxlci5hZGRBdmFpbGFibGVBY3Rpb24oXCJUYWxrXCIsIG5ldyBBY3Rpb25UYWxrKFdvcmxkU3RhdGUucGxheWVyLCB0aGluZykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4pKTsiLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQWN0aW9uLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL0VsZW1lbnRzL01vZHVsZXMvSHlwZXJsaW5rSGFuZGxlci50c1wiIC8+XHJcbmNsYXNzIEFjdGlvbldhaXQgZXh0ZW5kcyBBY3Rpb24ge1xyXG4gICAgcHVibGljIHJlcXVpcmVzVHVybiA9IHRydWU7XHJcbiAgICBwdWJsaWMgcmVxdWlyZXNOb3VuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgcmVxdWlyZXNWaXNpYmlsaXR5ID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgc3RhdGljIGNoZWNrIDogUnVsZWJvb2s8QWN0aW9uV2FpdD4gPSBuZXcgUnVsZWJvb2soXCJDaGVjayBXYWl0aW5nXCIpO1xyXG4gICAgcHVibGljIHN0YXRpYyBjYXJyeSA6IFJ1bGVib29rPEFjdGlvbldhaXQ+ID0gbmV3IFJ1bGVib29rKFwiQ2Fycnkgb3V0IFdhaXRpbmdcIik7XHJcblxyXG4gICAgcHVibGljIGdldENvbW1hbmRUZXh0ICgpIHtcclxuICAgICAgICByZXR1cm4gXCJ3YWl0XCI7XHJcbiAgICB9XHJcbn1cclxuXHJcbkFjdGlvbldhaXQuY2FycnkuYWRkUnVsZShuZXcgUnVsZSh7XHJcbiAgICBuYW1lIDogXCJQcmludCB3YWl0aW5nIG1lc3NhZ2VcIixcclxuICAgIGNvZGUgOiBydW5uZXIgPT4ge1xyXG4gICAgICAgIGlmIChydW5uZXIubm91bi5hY3RvciA9PSBXb3JsZFN0YXRlLnBsYXllcikge1xyXG4gICAgICAgICAgICBydW5uZXIubm91bi5zYXkuYWRkKFwiWW91IHdhaXQuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSkpO1xyXG5cclxuRWxlbWVudHMuSHlwZXJsaW5rSGFuZGxlci5Db21tb25BY3Rpb25zUnVsZWJvb2suYWRkUnVsZShuZXcgUnVsZSh7XHJcbiAgICBuYW1lIDogXCJBZGQgV2FpdCBDb21tYW5kIFJ1bGVcIixcclxuICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0hJR0hFU1QsXHJcbiAgICBwcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfTUVESVVNLFxyXG4gICAgY29kZSA6IChydWxlYm9vayA6IFJ1bGVib29rUnVubmVyPHZvaWQ+KSA9PiB7XHJcbiAgICAgICAgRWxlbWVudHMuSHlwZXJsaW5rSGFuZGxlci5hZGRDb21tb25BY3Rpb24oXCJXYWl0XCIsIG5ldyBBY3Rpb25XYWl0KFdvcmxkU3RhdGUucGxheWVyKSk7XHJcbiAgICB9XHJcbn0pKTsiLCJjbGFzcyBDb250ZW50RGVzY3JpcHRpb24ge1xuICAgIHB1YmxpYyBuYW1lIDogc3RyaW5nO1xuICAgIHB1YmxpYyBncm91cCA6IENvbnRlbnRVbml0IHwgQ29udGVudEdyb3VwO1xuXHRwdWJsaWMgZGVzY3JpcHRpb24gOiBTYXkgfCAoKGRlc2NyaXB0aW9uIDogQ29udGVudERlc2NyaXB0aW9uLCBncm91cCA6IENvbnRlbnRVbml0IHwgQ29udGVudEdyb3VwKSA9PiBTYXkpO1xuXHRwcml2YXRlIHNhaWRDb3VudCA9IDA7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKG5hbWUgOiBzdHJpbmcsIGdyb3VwIDogQ29udGVudFVuaXQgfCBDb250ZW50R3JvdXApIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5ncm91cCA9IGdyb3VwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTY29yZSAoKSB7XG4gICAgXHRyZXR1cm4gKHRoaXMuZ3JvdXApLmdldFNjb3JlKCk7XG5cdH1cblx0XG5cdHB1YmxpYyBnZXREZXNjcmlwdGlvbiAoZ3JvdXAgOiBDb250ZW50VW5pdCB8IENvbnRlbnRHcm91cCkgOiBTYXkge1xuXHRcdHRoaXMuc2FpZENvdW50Kys7XG5cdFx0aWYgKHR5cGVvZiB0aGlzLmRlc2NyaXB0aW9uID09IFwiZnVuY3Rpb25cIikge1xuXHRcdCAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbih0aGlzLCBncm91cCk7XG4gICAgICAgIH1cblx0XHRyZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjtcblx0fVxuXG5cdHB1YmxpYyBzZXREZXNjcmlwdGlvbiAoZGVzY3JpcHRpb24gOiBTYXkgfCBzdHJpbmcgfCAoKGRlc2NyaXB0aW9uIDogQ29udGVudERlc2NyaXB0aW9uLCBncm91cCA6IENvbnRlbnRVbml0IHwgQ29udGVudEdyb3VwKSA9PiBTYXkpICkge1xuICAgIFx0aWYgKCEoZGVzY3JpcHRpb24gaW5zdGFuY2VvZiBTYXkpKSB7XG4gICAgXHRcdHRoaXMuZGVzY3JpcHRpb24gPSBuZXcgU2F5KGRlc2NyaXB0aW9uKTtcblx0XHR9IGVsc2Uge1xuICAgIFx0XHR0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdFxuXHRwdWJsaWMgc3RhdGljIHBpY2tEZXNjcmlwdGlvbnMgKGNkYSA6IEFycmF5PENvbnRlbnREZXNjcmlwdGlvbj4sIHRhcmdldCA6IENvbnRlbnRHcm91cCB8IENvbnRlbnRVbml0KSA6IEFycmF5PFNheT4ge1xuXHRcdGxldCBhID0gY2RhLnNsaWNlKCk7XG5cdFx0bGV0IGdyb3VwcyA9IFtdO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJhbmRvbUluZGV4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGEubGVuZ3RoIC0gaSkpICsgaTtcbiAgICAgICAgICAgIGxldCB0ZW1wID0gYVtpXTtcbiAgICAgICAgICAgIGFbaV0gPSBhW3JhbmRvbUluZGV4XTtcbiAgICAgICAgICAgIGFbcmFuZG9tSW5kZXhdID0gdGVtcDtcbiAgICAgICAgfVxuXHRcdFxuXHRcdC8vIEFmdGVyIHNodWZmbGluZyB0aGUgbGlzdCwgZGVzY3JpcHRpb25zIHdpdGggdGhlIGhpZ2hlc3Qgc2NvcmVzIGdvIGF0IHRoZSB0b3AsIGFuZCBiZXR3ZWVuIHRob3NlIHRoZSBvbmVzIHdpdGggdGhlIGxvd2VzdCBzYWlkQ291bnRzIGdvIGZpcnN0XG4gICAgICAgIC8vIElmIG11bHRpcGxlIGRlc2NyaXB0aW9ucyBoYXZlIHRoZSBzYW1lIHNjb3JlL3NhaWRDb3VudCwgdGhleSBhcmUgcGlja2VkIHJhbmRvbWx5IGR1ZSB0byB0aGUgcHJldmlvdXMgc2h1ZmZsaW5nLlxuICAgICAgICBhLnNvcnQoKGEgOiBDb250ZW50RGVzY3JpcHRpb24sIGIgOiBDb250ZW50RGVzY3JpcHRpb24pID0+IHtcbiAgICAgICAgICAgIGxldCBzY29yZUEgPSBhLmdldFNjb3JlKCkgLyAoYS5zYWlkQ291bnQgKyAxKTtcbiAgICAgICAgICAgIGxldCBzY29yZUIgPSBiLmdldFNjb3JlKCkgLyAoYi5zYWlkQ291bnQgKyAxKTsgLy8gQnkgZGl2aWRpbmcgdGhlIHNjb3JlIGdieSB0aGUgYW1vdW50IG9mIHRpbWVzIGl0IHdhcyBzYWlkIHdlIGluY3JlYXNlIHJvdGF0aW9uIG9mIGRlc2NyaXB0aW9uc1xuICAgICAgICAgICAgaWYgKHNjb3JlQSAhPSBzY29yZUIpIHJldHVybiBzY29yZUIgLSBzY29yZUE7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSk7XG5cblx0XHRhLmZvckVhY2goZGVzY3JpcHRpb24gPT4ge1xuXHRcdFx0Z3JvdXBzLnB1c2goZGVzY3JpcHRpb24uZ3JvdXApO1xuXHRcdH0pO1xuXG4gICAgICAgIGxldCBtYXRjaGVzID0gKDxhbnk+IHRhcmdldCkubWF0Y2hBZ2FpbnN0KDxhbnk+IGdyb3Vwcyk7XG4gICAgICAgIGlmIChtYXRjaGVzICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0bGV0IHJlc3VsdCA9IFtdO1xuXHRcdFx0bWF0Y2hlcy5mb3JFYWNoKGkgPT4ge1xuXHRcdFx0XHRyZXN1bHQucHVzaChhW2ldLmdldERlc2NyaXB0aW9uKHRhcmdldCkpO1xuXHRcdFx0XHRyZXN1bHQucHVzaChuZXcgU2F5KFwiIFwiKSk7XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fSBlbHNlIHtcbiAgICAgICAgXHRjb25zb2xlLndhcm4oXCJObyBkZXNjcmlwdGlvbiBhdmFpbGFibGUgZm9yXCIsIHRhcmdldCk7XG4gICAgICAgIFx0cmV0dXJuIFtuZXcgU2F5KFwiV2FybmluZzogTm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlIGZvciB0aGUgY3VycmVudCBzaXR1YXRpb24uIFBsZWFzZSByZXBvcnQgc28gaXQgY2FuIGJlIGNvcnJlY3RlZC5cIildO1xuXHRcdH1cblx0fVxufSIsImludGVyZmFjZSBDb250ZW50RGlmZmVyZW50aWFsQ29tcGFyaXNvblJlc3VsdCB7XHJcbiAgICBtYXRjaGluZyA6IEFycmF5PFRoaW5nIHwgdHlwZW9mIFRoaW5nIHwgQ29udGVudERpZmZlcmVudGlhbCB8IENvbnRlbnRNYXJrZXI+O1xyXG4gICAgdW5tYXRjaGVkIDogQXJyYXk8VGhpbmcgfCB0eXBlb2YgVGhpbmcgfCBDb250ZW50RGlmZmVyZW50aWFsIHwgQ29udGVudE1hcmtlcj47XHJcbn1cclxuXHJcbmNsYXNzIENvbnRlbnREaWZmZXJlbnRpYWwge1xyXG4gICAgcHVibGljIG5vdW5zIDogQXJyYXk8VGhpbmcgfCB0eXBlb2YgVGhpbmcgfCBDb250ZW50RGlmZmVyZW50aWFsIHwgQ29udGVudE1hcmtlcj4gPSBbXTtcclxuICAgIHB1YmxpYyBzY29yZSA6IG51bWJlciA9IDA7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yICguLi5ub3VucyA6IEFycmF5PGFueT4pIHtcclxuICAgICAgICB0aGlzLmFkZE5vdW4oLi4ubm91bnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGROb3VuICguLi5ub3VucyA6IEFycmF5PGFueT4pIHtcclxuICAgICAgICBub3Vucy5mb3JFYWNoKG5vdW4gPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm5vdW5zLnB1c2gobm91bik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5zY29yZSA9IHRoaXMuZ2V0U2NvcmUoKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Tm91bnMgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5vdW5zO1xyXG4gICAgfVxyXG5cdFxyXG5cdHB1YmxpYyByZXBsYWNlTm91bnMgKC4uLm5vdW5zIDogQXJyYXk8YW55Pikge1xyXG5cdFx0dGhpcy5ub3VucyA9IG5vdW5zO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fVxyXG5cclxuICAgIHB1YmxpYyBpc01hdGNoIChjZCA6IENvbnRlbnREaWZmZXJlbnRpYWwsIGFsbG93UGFydGlhbCA9IGZhbHNlKSB7XHJcbiAgICAgICAgbGV0IGNoZWNrID0gdGhpcy5nZXRVbm1hdGNoZWQoY2QpO1xyXG4gICAgICAgIGlmICgoYWxsb3dQYXJ0aWFsIHx8IGNoZWNrLnVubWF0Y2hlZC5sZW5ndGggPT0gMCkgJiYgY2hlY2subWF0Y2hpbmcubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5tYXRjaGluZy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoZWNrLnVubWF0Y2hlZC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCEoY2hlY2sudW5tYXRjaGVkW2ldIGluc3RhbmNlb2YgQ29udGVudE1hcmtlcikpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgoPENvbnRlbnRNYXJrZXI+IGNoZWNrLnVubWF0Y2hlZFtpXSkuaXNJbXBvcnRhbnQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFVubWF0Y2hlZCAoY2QgOiBDb250ZW50RGlmZmVyZW50aWFsKSA6IENvbnRlbnREaWZmZXJlbnRpYWxDb21wYXJpc29uUmVzdWx0IHtcclxuICAgICAgICBsZXQgdW5tYXRjaGVkID0gY2Qubm91bnMuc2xpY2UoKTtcclxuICAgICAgICBsZXQgbWF0Y2hpbmcgPSB0aGlzLm5vdW5zLnNsaWNlKCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IG1hdGNoaW5nLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGsgPSB1bm1hdGNoZWQubGVuZ3RoIC0gMTsgayA+PSAwOyBrLS0pIHtcclxuICAgICAgICAgICAgICAgIGlmIChDb250ZW50RGlmZmVyZW50aWFsLmNvbXBhcmVOb3VucyhtYXRjaGluZ1tpXSwgdW5tYXRjaGVkW2tdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHVubWF0Y2hlZC5zcGxpY2UoaywgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmcuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG1hdGNoaW5nIDogbWF0Y2hpbmcsXHJcbiAgICAgICAgICAgIHVubWF0Y2hlZCA6IHVubWF0Y2hlZFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFNjb3JlICgpIHtcclxuICAgICAgICBsZXQgaGlnaGVzdCA9IDA7XHJcbiAgICAgICAgbGV0IGNvdW50ID0gdGhpcy5ub3Vucy5sZW5ndGg7XHJcblxyXG4gICAgICAgIHRoaXMubm91bnMuZm9yRWFjaCgobm91bikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgbGV2ZWwgPSBDb250ZW50RGlmZmVyZW50aWFsLmdldE5vdW5MZXZlbChub3VuKTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hlc3QgPCBsZXZlbCkge1xyXG4gICAgICAgICAgICAgICAgaGlnaGVzdCA9IGxldmVsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBoaWdoZXN0ICsgKGNvdW50IC8gMTAwKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldE5vdW5MZXZlbCAobm91biA6IFRoaW5nIHwgdHlwZW9mIFRoaW5nIHwgQ29udGVudERpZmZlcmVudGlhbCB8IENvbnRlbnRNYXJrZXIpIHtcclxuICAgICAgICBpZiAobm91biA9PSB1bmRlZmluZWQgfHwgbm91biA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG5vdW4gPT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICAgIGlmICg8YW55Pm5vdW4ucHJvdG90eXBlIGluc3RhbmNlb2YgVGhpbmcpIHtcclxuICAgICAgICAgICAgICAgIGxldCBzcGVjaWZpdHkgPSAyOyAvLyBWYWd1ZSBUaGluZ1xyXG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudENsYXNzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG5vdW4pO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudENsYXNzICE9IFRoaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3BlY2lmaXR5ICs9IDAuMTtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRDbGFzcyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwYXJlbnRDbGFzcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3BlY2lmaXR5O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDIuNTsgLy8gSXQncyBub3QgYSBcIlRoaW5nXCIsIHNvIGl0J3MgcHJvYmFibHkgYSB3ZWlyZCBjbGFzcywgd2hpY2ggaXMga2luZCBvZiBzcGVjaWZpY1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChub3VuIGluc3RhbmNlb2YgVGhpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDQ7IC8vIFNwZWNpZmljIHRoaW5nXHJcbiAgICAgICAgfSBlbHNlIGlmIChub3VuIGluc3RhbmNlb2YgQ29udGVudERpZmZlcmVudGlhbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gMTsgLy8gTWlub3IgdGhpbmdcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMC41O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGNvbXBhcmVOb3VucyAoYSA6IFRoaW5nIHwgdHlwZW9mIFRoaW5nIHwgQ29udGVudERpZmZlcmVudGlhbCB8IENvbnRlbnRNYXJrZXIsIGIgOiBUaGluZyB8IHR5cGVvZiBUaGluZyB8IENvbnRlbnREaWZmZXJlbnRpYWwgfCBDb250ZW50TWFya2VyKSB7XHJcbiAgICAgICAgaWYgKGEgPT0gdW5kZWZpbmVkIHx8IGEgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBhID09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICAvLyBiIG11c3QgaW5oZXJpdCBhIG9yIGJlIGFcclxuICAgICAgICAgICAgcmV0dXJuIGIgPT0gYSB8fCBiIGluc3RhbmNlb2YgYSB8fCAodHlwZW9mIGIgPT0gXCJmdW5jdGlvblwiICYmICg8YW55PmIpLnByb3RvdHlwZSBpbnN0YW5jZW9mIGEpXHJcbiAgICAgICAgfSBlbHNlIGlmIChhIGluc3RhbmNlb2YgVGhpbmcpIHtcclxuICAgICAgICAgICAgLy8gYiBtdXN0IGJlIGFcclxuICAgICAgICAgICAgcmV0dXJuIGIgPT0gYTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGEgPT09IGI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBpc01hdGNoIChtYXRjaEZyb20gOiBBcnJheTxDb250ZW50RGlmZmVyZW50aWFsPiwgbWF0Y2hBZ2FpbnN0IDogQXJyYXk8Q29udGVudERpZmZlcmVudGlhbD4pIHtcclxuICAgICAgICBsZXQgdW5tYXRjaGVkID0gbWF0Y2hBZ2FpbnN0LnNsaWNlKCk7XHJcbiAgICAgICAgbGV0IG1hdGNoaW5nID0gbWF0Y2hGcm9tLnNsaWNlKCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IG1hdGNoaW5nLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGsgPSB1bm1hdGNoZWQubGVuZ3RoIC0gMTsgayA+PSAwOyBrLS0pIHtcclxuICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZ1tpXS5pc01hdGNoKHVubWF0Y2hlZFtrXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB1bm1hdGNoZWQuc3BsaWNlKGssIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoaW5nLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodW5tYXRjaGVkLmxlbmd0aCA9PSAwICYmIG1hdGNoaW5nLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodW5tYXRjaGVkLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBvbmx5IHRoaW5nIG1pc3NpbmcgYXJlIHVuaW1wb3J0YW50IENvbnRlbnRNYXJrZXJzXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0Y2hpbmcubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBub3VucyA9IG1hdGNoaW5nW2ldLmdldE5vdW5zKCk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG5vdW5zLmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEobm91bnNba10gaW5zdGFuY2VvZiBDb250ZW50TWFya2VyKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCg8Q29udGVudE1hcmtlcj4gbm91bnNba10pLmlzSW1wb3J0YW50KCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBOb3RoaW5nIGltcG9ydGFudCBmb3VuZFxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG59IiwiZW51bSBDb250ZW50R3JvdXBNYXRjaCB7XHJcbiAgICBOT19NQVRDSCxcclxuICAgIFBBUlRJQUxfTUFUQ0gsXHJcbiAgICBQRVJGRUNUX01BVENIXHJcbn1cclxuXHJcbmludGVyZmFjZSBDb250ZW50R3JvdXBNYXRjaFJlc3VsdCB7XHJcbiAgICB0eXBlIDogQ29udGVudEdyb3VwTWF0Y2g7XHJcbiAgICB1bm1hdGNoZWQgOiBBcnJheTxDb250ZW50VW5pdD47XHJcbn1cclxuXHJcbmNsYXNzIENvbnRlbnRHcm91cCB7XHJcbiAgICBwcml2YXRlIHVuaXRzIDogQXJyYXk8Q29udGVudFVuaXQ+ID0gW107XHJcbiAgICBwcml2YXRlIG1hdGNoaW5nIDogQXJyYXk8Q29udGVudFVuaXQ+O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yICguLi51bml0cyA6IEFycmF5PENvbnRlbnRVbml0Pikge1xyXG4gICAgICAgIHVuaXRzLmZvckVhY2godW5pdCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkVW5pdCh1bml0KTtcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRVbml0ICh1bml0IDogQ29udGVudFVuaXQpIHtcclxuICAgICAgICB0aGlzLnVuaXRzLnB1c2godW5pdCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlc2V0ICgpIHtcclxuICAgICAgICB0aGlzLm1hdGNoaW5nID0gdGhpcy51bml0cy5zbGljZSgpO1xyXG4gICAgfVxyXG5cdFxyXG5cdHB1YmxpYyBpc01hdGNoaW5nICgpIHtcclxuXHRcdHJldHVybiB0aGlzLm1hdGNoaW5nLmxlbmd0aDtcclxuXHR9XHJcblxyXG4gICAgcHVibGljIHNldE1hdGNoaW5nIChtYXRjaGluZyA6IEFycmF5PENvbnRlbnRVbml0Pikge1xyXG4gICAgICAgIHRoaXMubWF0Y2hpbmcgPSBtYXRjaGluZztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNNYXRjaCAoY2cgOiBDb250ZW50R3JvdXApIDogQ29udGVudEdyb3VwTWF0Y2hSZXN1bHQge1xyXG4gICAgICAgIGxldCB1bm1hdGNoZWQgPSBjZy5tYXRjaGluZy5zbGljZSgpO1xyXG4gICAgICAgIGxldCBtYXRjaGluZyA9IHRoaXMudW5pdHMuc2xpY2UoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IG1hdGNoaW5nLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGsgPSB1bm1hdGNoZWQubGVuZ3RoIC0gMTsgayA+PSAwOyBrLS0pIHtcclxuICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZ1tpXS5pc01hdGNoKHVubWF0Y2hlZFtrXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB1bm1hdGNoZWQuc3BsaWNlKGssIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoaW5nLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdHlwZSA6IG1hdGNoaW5nLmxlbmd0aCA+IDAgPyBDb250ZW50R3JvdXBNYXRjaC5OT19NQVRDSCA6XHJcbiAgICAgICAgICAgICAgICAgICAgdW5tYXRjaGVkLmxlbmd0aCA9PSAwID8gQ29udGVudEdyb3VwTWF0Y2guUEVSRkVDVF9NQVRDSCA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRHcm91cE1hdGNoLlBBUlRJQUxfTUFUQ0gsXHJcbiAgICAgICAgICAgIHVubWF0Y2hlZCA6IHVubWF0Y2hlZFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0U2NvcmUgKCkge1xyXG4gICAgICAgIGxldCBzY29yZSA9IDA7XHJcbiAgICAgICAgdGhpcy51bml0cy5mb3JFYWNoKHVuaXQgPT4ge1xyXG4gICAgICAgICAgICBzY29yZSArPSB1bml0LmdldFNjb3JlKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKChzY29yZSAvIHRoaXMudW5pdHMubGVuZ3RoKSAqIDEwKSArIHRoaXMudW5pdHMubGVuZ3RoOyAvLyBJZiB3ZSBrZWVwIHByZWNpc2lvbiB0b28gaGlnaCwgcmFuZG9tIHdvbid0IHdvcmsuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG1hdGNoQWdhaW5zdCAoYSA6IEFycmF5PENvbnRlbnRHcm91cD4pIDogQXJyYXk8bnVtYmVyPiB7XHJcbiAgICAgICAgbGV0IG1hdGNoZXMgPSBbXTtcclxuICAgICAgICB0aGlzLnJlc2V0KCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBtYXRjaCA9IGFbaV0uaXNNYXRjaCh0aGlzKTtcclxuICAgICAgICAgICAgaWYgKG1hdGNoLnR5cGUgIT0gQ29udGVudEdyb3VwTWF0Y2guTk9fTUFUQ0gpIHtcclxuICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaChpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0TWF0Y2hpbmcobWF0Y2gudW5tYXRjaGVkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNNYXRjaGluZygpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG59IiwiY2xhc3MgQ29udGVudE1hcmtlciB7XHJcbiAgICBwdWJsaWMgbmFtZSA6IHN0cmluZztcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgaW1wb3J0YW50IDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yIChuYW1lIDogc3RyaW5nLCBpbXBvcnRhbnQ/IDogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICAgICAgdGhpcy5pbXBvcnRhbnQgPSBpbXBvcnRhbnQgPT0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNJbXBvcnRhbnQgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmltcG9ydGFudDtcclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJDb250ZW50RGlmZmVyZW50aWFsLnRzXCIgLz5cclxuY2xhc3MgQ29udGVudFVuaXQge1xyXG4gICAgcHVibGljIGNhdGVnb3JpZXMgOiBBcnJheTxDb250ZW50RGlmZmVyZW50aWFsPiA9IFtdO1xyXG5cclxuICAgIHB1YmxpYyBhZGRDYXRlZ29yeSAoLi4ubm91bnMgOiBBcnJheTxUaGluZyB8IHR5cGVvZiBUaGluZyB8IENvbnRlbnREaWZmZXJlbnRpYWw+KSB7XHJcbiAgICAgICAgdGhpcy5jYXRlZ29yaWVzLnB1c2gobmV3IENvbnRlbnREaWZmZXJlbnRpYWwoLi4ubm91bnMpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNNYXRjaCAoY3UgOiBDb250ZW50VW5pdCkge1xyXG4gICAgICAgIHJldHVybiBDb250ZW50RGlmZmVyZW50aWFsLmlzTWF0Y2godGhpcy5jYXRlZ29yaWVzLCBjdS5jYXRlZ29yaWVzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0U2NvcmUgKCkge1xyXG4gICAgICAgIGxldCBzY29yZSA9IDA7XHJcbiAgICAgICAgdGhpcy5jYXRlZ29yaWVzLmZvckVhY2goZGlmZiA9PiB7XHJcbiAgICAgICAgICAgIHNjb3JlICs9IGRpZmYuc2NvcmU7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBzY29yZSAvIHRoaXMuY2F0ZWdvcmllcy5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG1hdGNoQWdhaW5zdCAoYSA6IEFycmF5PENvbnRlbnRVbml0PikgOiBBcnJheTxudW1iZXI+IHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGFbaV0uaXNNYXRjaCh0aGlzKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9Db250ZW50TWFya2VyLnRzXCIgLz5cbi8qKlxuICogUXVpY2sgQ2hlYXQgU2hlZXQgb2YgbWFya2VycyFcbiAqIFdoZW4gbWFraW5nIGEgZGVzY3JpcHRpb24gdGFrZSB0aGVzZSBtYXJrZXJzIGludG8gYWNjb3VudCB3aGlsZSBkZXNjcmliaW5nIHRoZSBhY3Rpb24hIElmIGEgbWFya2VyIGRlc2NyaWJlcyBzb21ldGhpbmdcbiAqIHBsZWFzZSBpbmNsdWRlIGl0IGlmIHlvdSBhZGQgaXQgdG8gdGhlIGRlc2NyaXB0aW9uLiBFeGFtcGxlOiBpZiB5b3UgZGVzY3JpYmUgdGhlIGF0dGFjayBhcyBhIFwiaGVhdnkgaGl0IVwiLCBtYWtlIHN1cmVcbiAqIHRvIGFkZCB0aGUgSElHSF9EQU1BR0UgbWFya2VyLCB3ZSBkb24ndCB3YW50IGEgXCJoZWF2eSBoaXQhXCIgdG8gYmUgZGlzcGxheWVkIGZvciBhbiBhdHRhY2sgdGhhdCBjYXVzZWQgMSBkYW1hZ2UuXG4gKlxuICogTWFuZGF0b3J5IE1hcmtlcnMgLSBJbmNsdWRlIG9ubHkgb25lIGFuZCBjbG9uZSBkZXNjcmlwdGlvbiBmb3IgZWFjaFxuICogQ29tYmF0SGl0LkZVTExfRE9ER0VcbiAqIENvbWJhdEhpdC5QQVJUSUFMX0RPREdFXG4gKiBDb21iYXRIaXQuRlVMTF9ISVRcbiAqXG4gKiBNYW5kYXRvcnkgTWFya2VycyAtIEluY2x1ZGUgb25seSBvbmUgYW5kIGNsb25lIGRlc2NyaXB0aW9uIGZvciBlYWNoLiBUaGVzZSBkb24ndCBzaG93IHVwIGluIEZVTExfRE9ER0VcbiAqIENvbWJhdFJlc3VsdC5LTk9DS0VEXG4gKiBDb21iYXRSZXN1bHQuS05PQ0tFRF9PRkZcbiAqIENvbWJhdFJlc3VsdC5LSUxMRURcbiAqXG4gKiBOb24tTWFuZGF0b3J5IE1hcmtlcnMgLSBJbmNsdWRlIGF0IG1vc3Qgb25lIHBlciBkZXNjcmlwdGlvbiwgbm9uZSBtYWtlcyBhIGRlc2NyaXB0aW9uIGZpdCBtb3JlIGF0dGFja3MuIFRoZXNlIGRvbid0IHNob3cgdXAgaW4gRlVMTF9ET0RHRS5cbiAqIENvbWJhdERhbWFnZS5MT1dfREFNQUdFXG4gKiBDb21iYXREYW1hZ2UuTUVESVVNX0RBTUFHRVxuICogQ29tYmF0RGFtYWdlLkhJR0hfREFNQUdFXG4gKi9cblxuXG4vKipcbiAqIFRoZXNlIGFyZSB0aGUgb3ZlcmFsbCByZXN1bHRzIG9mIHRoZSByb2xsLiBFdmVyeSBhdHRhY2sgd2lsbCBoYXZlIGF0IGxlYXN0IG9uZSBvZiB0aGVzZS5cbiAqIElmIG1ha2luZyBhIG5ldyBkZXNjcmlwdGlvbiwgeW91IHNob3VsZCBjbG9uZSBpdCBmb3IgZWFjaCBDb21iYXRSZXN1bHQgdmFyaWFudC5cbiAqL1xuY2xhc3MgQ29tYmF0SGl0IGV4dGVuZHMgQ29udGVudE1hcmtlciB7XG4gICAgcHVibGljIHN0YXRpYyBGVUxMX0RPREdFID0gbmV3IENvbWJhdEhpdChcIkZ1bGwgRG9kZ2VcIiwgdHJ1ZSk7XG4gICAgcHVibGljIHN0YXRpYyBQQVJUSUFMX0RPREdFID0gbmV3IENvbWJhdEhpdChcIlBhcnRpYWwgRG9kZ2VcIiwgdHJ1ZSk7XG4gICAgcHVibGljIHN0YXRpYyBGVUxMX0hJVCA9IG5ldyBDb21iYXRIaXQoXCJGdWxsIEhpdFwiLCB0cnVlKTtcbn1cblxuLyoqXG4gKiBUaGVzZSBhcmUgbWFya2VycyB0aGF0IGV4cGxhaW4gaG93IG11Y2ggZGFtYWdlIHdhcyBjYXVzZWQgYnkgdGhlIGF0dGFjay5cbiAqIExvdy9IaWdoIGlzIHJlbGF0aXZlIHRvIGEgcGVyY2VudGFnZSBvZiBvdmVyYWxsIEhQLiBMb3cgPCAyNSUsIE1lZGl1bSA8IDUwJSwgSGlnaCA+PSA1MCUgb2YgbWF4IGhlYWx0aC5cbiAqIFRoZXNlIGFyZSBub24tbWFuZGF0b3J5LCBidXQgaWYgZGVzY3JpYmluZyB0aGUgYW1vdW50IG9mIGRhbWFnZSBjYXVzZWQgb25lIG9mIHRoZW0gc2hvdWxkIGJlIGluY2x1ZGVkLlxuICogTm90ZTogd2hpbGUgYSBkZXNjcmlwdGlvbiB3aXRob3V0IGFueSBvZiB0aGVzZSB3aWxsIHN0aWxsIHdvcmssIGEgZGVzY3JpcHRpb24gd2l0aCBtb3JlIHRoYW4gb25lIHdpbGwgbmV2ZXIgYmUgcGlja2VkLlxuICovXG5jbGFzcyBDb21iYXREYW1hZ2UgZXh0ZW5kcyBDb250ZW50TWFya2VyIHtcbiAgICBwdWJsaWMgc3RhdGljIExPV19EQU1BR0UgPSBuZXcgQ29tYmF0RGFtYWdlKFwiTG93IERhbWFnZVwiKTtcbiAgICBwdWJsaWMgc3RhdGljIE1FRElVTV9EQU1BR0UgPSBuZXcgQ29tYmF0RGFtYWdlKFwiTWVkaXVtIERhbWFnZVwiKTtcbiAgICBwdWJsaWMgc3RhdGljIEhJR0hfREFNQUdFID0gbmV3IENvbWJhdERhbWFnZShcIkhpZ2ggRGFtYWdlXCIpO1xufVxuXG4vKipcbiAqIFRoZXNlIGFyZSBtYXJrZXJzIHRoYXQgZXhwbGFpbiB3aGF0IGhhcHBlbmVkIGJlY2F1c2Ugb2YgdGhlIGF0dGFjay5cbiAqIFRoZXkgYXJlIG1hbmRhdG9yeS5cbiAqIFdoZW4gbWFraW5nIGFuIGF0dGFjaywgeW91IHNob3VsZCBjbG9uZSB0aGUgZGVzY3JpcHRpb24gZm9yIGVhY2ggb2YgdGhvc2UsIGFkZGluZyB0aGlzIGluZm9ybWF0aW9uIHRvIGl0LlxuICovXG5jbGFzcyBDb21iYXRSZXN1bHQgZXh0ZW5kcyBDb250ZW50TWFya2VyIHtcbiAgICBwdWJsaWMgc3RhdGljIEtOT0NLRUQgPSBuZXcgQ29tYmF0UmVzdWx0KFwiVGFyZ2V0IHdhcyBrbm9ja2VkIGRvd24gYnkgdGhlIGF0dGFja1wiLCB0cnVlKTtcbiAgICBwdWJsaWMgc3RhdGljIEtOT0NLRURfT0ZGID0gbmV3IENvbWJhdFJlc3VsdChcIlRhcmdldCB3YXMga25vY2tlZCBvZmYgYnkgdGhlIGF0dGFjaywgYmVjb21pbmcgdW5jb25zY2lvdXNcIiwgdHJ1ZSk7XG4gICAgcHVibGljIHN0YXRpYyBLSUxMRUQgPSBuZXcgQ29tYmF0UmVzdWx0KFwiVGFyZ2V0IHdhcyBraWxsZWQgYnkgdGhpcyBhdHRhY2tcIiwgdHJ1ZSk7XG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0NvbnRlbnRVbml0LnRzXCIgLz5cbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9UaGluZ3MvUGVyc29uLnRzXCIgLz5cbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9UaGluZ3MvQm9keXBhcnQvU2V4SG9sZS50c1wiIC8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vVGhpbmdzL0JvZHlwYXJ0L1NleFN0aWNrLnRzXCIgLz5cbmNsYXNzIENvbWJhdFVuaXQgZXh0ZW5kcyBDb250ZW50VW5pdCB7XG5cdHByaXZhdGUgYWN0b3IgOiBDb250ZW50RGlmZmVyZW50aWFsID0gbmV3IENvbnRlbnREaWZmZXJlbnRpYWwoUGVyc29uKTtcblx0cHJpdmF0ZSB0YXJnZXQgOiBDb250ZW50RGlmZmVyZW50aWFsID0gbmV3IENvbnRlbnREaWZmZXJlbnRpYWwoUGVyc29uKTtcblx0cHJpdmF0ZSB3ZWFwb24gOiBDb250ZW50RGlmZmVyZW50aWFsID0gbmV3IENvbnRlbnREaWZmZXJlbnRpYWwoVGhpbmcpO1xuXHRwcml2YXRlIG1hcmtlcnMgOiBDb250ZW50RGlmZmVyZW50aWFsID0gbmV3IENvbnRlbnREaWZmZXJlbnRpYWwoKTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IgKCkge1xuXHRcdHN1cGVyKCk7XG5cdH1cblxuXHRwdWJsaWMgc2V0QWN0b3IgKGl0IDogVGhpbmcgfCB0eXBlb2YgVGhpbmcpIHtcblx0XHR0aGlzLmFjdG9yID0gbmV3IENvbnRlbnREaWZmZXJlbnRpYWwoaXQpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIHNldFRhcmdldCAoaXQgOiBUaGluZyB8IHR5cGVvZiBUaGluZykge1xuXHRcdHRoaXMudGFyZ2V0ID0gbmV3IENvbnRlbnREaWZmZXJlbnRpYWwoaXQpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIHNldFdlYXBvbiAoaXQgOiBUaGluZyB8IHR5cGVvZiBUaGluZykge1xuXHRcdHRoaXMud2VhcG9uID0gbmV3IENvbnRlbnREaWZmZXJlbnRpYWwoaXQpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGFkZE1hcmtlciAobWFya2VyIDogQ29udGVudE1hcmtlcikge1xuXHRcdHRoaXMubWFya2Vycy5hZGROb3VuKG1hcmtlcik7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgZ2V0U2NvcmUgKCkge1xuXHRcdHJldHVybiB0aGlzLmFjdG9yLmdldFNjb3JlKCkgKyB0aGlzLnRhcmdldC5nZXRTY29yZSgpICsgdGhpcy53ZWFwb24uZ2V0U2NvcmUoKSArIHRoaXMubWFya2Vycy5nZXRTY29yZSgpO1xuXHR9XG5cblx0cHVibGljIGlzTWF0Y2ggKGN1IDogQ29tYmF0VW5pdCkge1xuXHRcdGlmIChjdSBpbnN0YW5jZW9mIENvbWJhdFVuaXQpIHtcblx0XHRcdHJldHVybiB0aGlzLmFjdG9yLmlzTWF0Y2goY3UuYWN0b3IpICYmIHRoaXMudGFyZ2V0LmlzTWF0Y2goY3UudGFyZ2V0KSAmJlxuXHRcdFx0XHR0aGlzLndlYXBvbi5pc01hdGNoKGN1LndlYXBvbikgJiYgdGhpcy5tYXJrZXJzLmlzTWF0Y2goY3UubWFya2Vycyk7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9Db250ZW50RGVzY3JpcHRpb24udHNcIiAvPlxuY2xhc3MgRnVja2luZ0Rlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHtcbiAgICBwdWJsaWMgc3RhdGljIERFU0NSSVBUSU9OUyA9IFtdO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChuYW1lIDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKG5hbWUsIG5ldyBDb250ZW50R3JvdXAoKSk7XG4gICAgICAgIEZ1Y2tpbmdEZXNjcmlwdGlvbi5ERVNDUklQVElPTlMucHVzaCh0aGlzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkVW5pdCAoKSB7XG4gICAgICAgIGxldCB1bml0ID0gbmV3IEZ1Y2tpbmdVbml0KCk7XG4gICAgICAgICg8Q29udGVudEdyb3VwPiB0aGlzLmdyb3VwKS5hZGRVbml0KHVuaXQpO1xuICAgICAgICByZXR1cm4gdW5pdDtcbiAgICB9XG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0NvbnRlbnRNYXJrZXIudHNcIiAvPlxyXG5jbGFzcyBGdWNraW5nU3R5bGUgZXh0ZW5kcyBDb250ZW50TWFya2VyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgR0VOVExFID0gbmV3IEZ1Y2tpbmdTdHlsZShcIkdlbnRsZVwiKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgUk9VR0ggPSBuZXcgRnVja2luZ1N0eWxlKFwiUm91Z2hcIik7XHJcbn1cclxuXHJcbmNsYXNzIEZ1Y2tpbmdTdGF0ZSBleHRlbmRzIENvbnRlbnRNYXJrZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyBQRU5FVFJBVElORyA9IG5ldyBGdWNraW5nU3RhdGUoXCJQZW5ldHJhdGlvbiBTdGFydFwiLCB0cnVlKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgTk9STUFMID0gbmV3IEZ1Y2tpbmdTdGF0ZShcIk5vcm1hbCBmdWNraW5nXCIsIHRydWUpO1xyXG4gICAgcHVibGljIHN0YXRpYyBTUEVFRElOR19VUCA9IG5ldyBGdWNraW5nU3RhdGUoXCJTcGVlZGluZyB1cFwiLHRydWUpO1xyXG4gICAgcHVibGljIHN0YXRpYyBDVU1fU1RBUlQgPSBuZXcgRnVja2luZ1N0YXRlKFwiU3RhcnRlZCBDdW1taW5nXCIsIHRydWUpO1xyXG4gICAgcHVibGljIHN0YXRpYyBDVU1NSU5HID0gbmV3IEZ1Y2tpbmdTdGF0ZShcIkN1bW1pbmdcIiwgdHJ1ZSk7XHJcbiAgICBwdWJsaWMgc3RhdGljIENVTV9FTkQgPSBuZXcgRnVja2luZ1N0YXRlKFwiRmluaXNoZWQgQ3VtbWluZ1wiLCB0cnVlKTtcclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9Db250ZW50VW5pdC50c1wiIC8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vVGhpbmdzL1BlcnNvbi50c1wiIC8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vVGhpbmdzL0JvZHlwYXJ0L1NleEhvbGUudHNcIiAvPlxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL1RoaW5ncy9Cb2R5cGFydC9TZXhTdGljay50c1wiIC8+XG5jbGFzcyBGdWNraW5nVW5pdCBleHRlbmRzIENvbnRlbnRVbml0IHtcbiAgICBwcml2YXRlIGZ1Y2tlciA6IENvbnRlbnREaWZmZXJlbnRpYWwgPSBuZXcgQ29udGVudERpZmZlcmVudGlhbChQZXJzb24pO1xuICAgIHByaXZhdGUgZnVja2VkIDogQ29udGVudERpZmZlcmVudGlhbCA9IG5ldyBDb250ZW50RGlmZmVyZW50aWFsKFBlcnNvbik7XG4gICAgcHJpdmF0ZSBob2xlIDogQ29udGVudERpZmZlcmVudGlhbCA9IG5ldyBDb250ZW50RGlmZmVyZW50aWFsKFNleEhvbGUpO1xuICAgIHByaXZhdGUgc3RpY2sgOiBDb250ZW50RGlmZmVyZW50aWFsID0gbmV3IENvbnRlbnREaWZmZXJlbnRpYWwoU2V4U3RpY2spO1xuICAgIHByaXZhdGUgbWFya2VycyA6IENvbnRlbnREaWZmZXJlbnRpYWwgPSBuZXcgQ29udGVudERpZmZlcmVudGlhbCgpO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RnVja2VyIChpdCA6IFRoaW5nIHwgdHlwZW9mIFRoaW5nKSB7XG4gICAgICAgIHRoaXMuZnVja2VyID0gbmV3IENvbnRlbnREaWZmZXJlbnRpYWwoaXQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RnVja2VkIChpdCA6IFRoaW5nIHwgdHlwZW9mIFRoaW5nKSB7XG4gICAgICAgIHRoaXMuZnVja2VkID0gbmV3IENvbnRlbnREaWZmZXJlbnRpYWwoaXQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0SG9sZSAoaXQgOiBUaGluZyB8IHR5cGVvZiBUaGluZykge1xuICAgICAgICB0aGlzLmhvbGUgPSBuZXcgQ29udGVudERpZmZlcmVudGlhbChpdCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRTdGljayAoaXQgOiBUaGluZyB8IHR5cGVvZiBUaGluZykge1xuICAgICAgICB0aGlzLnN0aWNrID0gbmV3IENvbnRlbnREaWZmZXJlbnRpYWwoaXQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkTWFya2VyIChtYXJrZXIgOiBDb250ZW50TWFya2VyKSB7XG4gICAgICAgIHRoaXMubWFya2Vycy5hZGROb3VuKG1hcmtlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTY29yZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZ1Y2tlci5nZXRTY29yZSgpICsgdGhpcy5mdWNrZWQuZ2V0U2NvcmUoKSArIHRoaXMuaG9sZS5nZXRTY29yZSgpICsgdGhpcy5zdGljay5nZXRTY29yZSgpICsgdGhpcy5tYXJrZXJzLmdldFNjb3JlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzTWF0Y2ggKGZ1IDogRnVja2luZ1VuaXQpIHtcbiAgICAgICAgaWYgKGZ1IGluc3RhbmNlb2YgRnVja2luZ1VuaXQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZ1Y2tlci5pc01hdGNoKGZ1LmZ1Y2tlcikgJiYgdGhpcy5mdWNrZWQuaXNNYXRjaChmdS5mdWNrZWQpICYmXG4gICAgICAgICAgICAgICAgdGhpcy5ob2xlLmlzTWF0Y2goZnUuaG9sZSkgJiYgdGhpcy5zdGljay5pc01hdGNoKGZ1LnN0aWNrKSAmJiB0aGlzLm1hcmtlcnMuaXNNYXRjaChmdS5tYXJrZXJzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi9GdW5jdGlvbnMudHNcIiAvPlxyXG5jbGFzcyBCcmFuY2hpbmdPcHRpb24ge1xyXG4gICAgcHVibGljIHNheSA6IFNheTtcclxuICAgIHB1YmxpYyBhcHBlYXJDb25kaXRpb24gOiAoKCkgPT4gYm9vbGVhbikgfCBib29sZWFuO1xyXG4gICAgcHVibGljIHByZXZpb3VzbHlQaWNrZWQgOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChzYXkgOiBTYXksIGFwcGVhckNvbmRpdGlvbj8gOiAoKCkgPT4gYm9vbGVhbikgfCBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5zYXkgPSBzYXk7XHJcbiAgICAgICAgdGhpcy5hcHBlYXJDb25kaXRpb24gPSBhcHBlYXJDb25kaXRpb247XHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIEJyYW5jaGluZ0RpYWxvZ3VlIHtcclxuICAgIHByaXZhdGUgb3B0aW9ucyA6IEFycmF5PEJyYW5jaGluZ09wdGlvbj4gPSBbXTtcclxuICAgIHByaXZhdGUgcmVzb2x2ZSA6IEZ1bmN0aW9uO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoLi4ub3B0aW9ucyA6IEFycmF5PEJyYW5jaGluZ09wdGlvbj4pIHtcclxuICAgICAgICB0aGlzLmFkZE9wdGlvbnMoLi4ub3B0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZE9wdGlvbnMgKC4uLm9wdGlvbnMgOiBBcnJheTxCcmFuY2hpbmdPcHRpb24+KSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLnB1c2goLi4ub3B0aW9ucyk7XHJcbiAgICAgICAgYXJyYXlVbmlxdWUodGhpcy5vcHRpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q2hvc2VuT3B0aW9uICgpIDogUHJvbWlzZTxCcmFuY2hpbmdPcHRpb24+IHtcclxuICAgICAgICBsZXQgdmFsaWRPcHRpb25zID0gW107XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCB2YWx1ZSA9IHRoaXMub3B0aW9uc1tpXTsgdmFsdWUgIT0gdW5kZWZpbmVkOyB2YWx1ZSA9IHRoaXMub3B0aW9uc1srK2ldKSB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZS5hcHBlYXJDb25kaXRpb24gPT0gdW5kZWZpbmVkIHx8ICh0eXBlb2YgdmFsdWUuYXBwZWFyQ29uZGl0aW9uID09IFwiZnVuY3Rpb25cIiAmJiB2YWx1ZS5hcHBlYXJDb25kaXRpb24oKSkgfHwgdmFsdWUuYXBwZWFyQ29uZGl0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICB2YWxpZE9wdGlvbnMucHVzaCh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBjaG9pY2VCdXR0b25zIDogQXJyYXk8SFRNTEVsZW1lbnQ+ID0gW107XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsaWRPcHRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHZhbGlkT3B0aW9uc1tpXTtcclxuICAgICAgICAgICAgbGV0IGNsYXNzZXMgPSBbXCJjaG9pY2VcIl07XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZS5wcmV2aW91c2x5UGlja2VkKSB7XHJcbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goXCJwaWNrZWRcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2hvaWNlQnV0dG9ucy5wdXNoKChhd2FpdCB2YWx1ZS5zYXkuZ2V0SFRNTChcInBcIiwgY2xhc3NlcykpWzBdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBQbGF5ZXJJbnB1dCA6IFByb21pc2U8QnJhbmNoaW5nT3B0aW9uPiA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yZXNvbHZlID0gcmVzb2x2ZTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgQ29udHJvbHMuS2V5SGFuZGxlci5yZXNldCgpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDAsIHZhbHVlID0gY2hvaWNlQnV0dG9uc1tpbmRleF07IHZhbHVlICE9IHVuZGVmaW5lZDsgdmFsdWUgPSBjaG9pY2VCdXR0b25zWysraW5kZXhdKSB7XHJcbiAgICAgICAgICAgIENvbnRyb2xzLktleUhhbmRsZXIuYXBwbHlDb2RlKHZhbHVlLCBDb250cm9scy5LZXlIYW5kbGVyLmdldEZpcnN0S2V5Q29kZSgpKTtcclxuICAgICAgICAgICAgdmFsdWUuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YWxpZE9wdGlvbnNbaW5kZXhdLnByZXZpb3VzbHlQaWNrZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlKHZhbGlkT3B0aW9uc1tpbmRleF0pO1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGF3YWl0IEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5wcmludCguLi5jaG9pY2VCdXR0b25zKTtcclxuXHJcbiAgICAgICAgbGV0IGNob2ljZSA9IGF3YWl0IFBsYXllcklucHV0O1xyXG5cclxuICAgICAgICBhd2FpdCBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIudW5wcmludCguLi5jaG9pY2VCdXR0b25zKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNob2ljZTtcclxuICAgIH1cclxufSIsImVudW0gTm9kZVR5cGUge1xyXG4gICAgTm9kZSwgVHJlZSwgVGV4dCwgU2V0LCBDaG9pY2UsIEJyYW5jaFxyXG59XHJcblxyXG5jbGFzcyBEaWFsb2d1ZU5vZGUge1xyXG4gICAgcHVibGljIHR5cGUgOiBOb2RlVHlwZSA9IE5vZGVUeXBlLk5vZGU7XHJcbiAgICAvLyBFbmQgbm9kZXMgYXJlIG5vdCBuZWNlc3NhcnkuIElmIG5leHQgaXMgdW5kZWZpbmVkLCB0aGVuIHRoYXQncyB0aGUgZW5kLlxyXG4gICAgLy9wdWJsaWMgc3RhdGljIEVORF9OT0RFID0gXCJFbmRcIjtcclxuICAgIHB1YmxpYyBpZCA6IHN0cmluZztcclxuICAgIHB1YmxpYyBuYW1lIDogc3RyaW5nO1xyXG5cclxuICAgIHByb3RlY3RlZCBuZXh0IDogc3RyaW5nO1xyXG4gICAgcHVibGljIGNob2ljZXMgOiBBcnJheTxzdHJpbmc+O1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoaWQgOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmlkID0gaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldE5hbWUgKG5hbWUgOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXROZXh0IChuZXh0IDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5uZXh0ID0gbmV4dDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TmV4dCAoKSA6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0Q2hvaWNlcyAoY2hvaWNlcyA6IEFycmF5PHN0cmluZz4pIHtcclxuICAgICAgICB0aGlzLmNob2ljZXMgPSBjaG9pY2VzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYXNDaG9pY2VzICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jaG9pY2VzICE9IHVuZGVmaW5lZCAmJiB0aGlzLmNob2ljZXMubGVuZ3RoID4gMDtcclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJEaWFsb2d1ZU5vZGUudHNcIiAvPlxyXG5jbGFzcyBEaWFsb2d1ZUJyYW5jaCBleHRlbmRzIERpYWxvZ3VlTm9kZSB7XHJcbiAgICBwdWJsaWMgdHlwZSA9IE5vZGVUeXBlLkJyYW5jaDtcclxuICAgIHB1YmxpYyB2YXJpYWJsZSA6ICgpID0+IGFueSA9ICgpID0+IHtyZXR1cm4gZmFsc2U7fVxyXG4gICAgcHVibGljIGJyYW5jaElkcyA6IEFycmF5PHN0cmluZz4gPSBbXTtcclxuICAgIHB1YmxpYyBicmFuY2hDb25kaXRpb25zIDogQXJyYXk8KCkgPT4gYW55PiA9IFtdO1xyXG5cclxuICAgIHB1YmxpYyBzZXRWYXJpYWJsZSAodmFyRnVuYyA6ICgpID0+IGFueSkge1xyXG4gICAgICAgIHRoaXMudmFyaWFibGUgPSB2YXJGdW5jO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRCcmFuY2ggKHRhcmdldGlkIDogc3RyaW5nLCB2YWx1ZUZ1bmMgOiAoKSA9PiBhbnkpIHtcclxuICAgICAgICB0aGlzLmJyYW5jaElkcy5wdXNoKHRhcmdldGlkKTtcclxuICAgICAgICB0aGlzLmJyYW5jaENvbmRpdGlvbnMucHVzaCh2YWx1ZUZ1bmMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXROZXh0ICgpIHtcclxuICAgICAgICBsZXQgdmFyaWFibGUgPSB0aGlzLnZhcmlhYmxlKCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmJyYW5jaElkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgY29tcGFyaW5nID0gdGhpcy5icmFuY2hDb25kaXRpb25zW2ldKCk7XHJcbiAgICAgICAgICAgIGlmIChjb21wYXJpbmcgPT0gdmFyaWFibGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJyYW5jaElkc1tpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5uZXh0O1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkRpYWxvZ3VlTm9kZS50c1wiIC8+XHJcbmNsYXNzIERpYWxvZ3VlVGV4dCBleHRlbmRzIERpYWxvZ3VlTm9kZSB7XHJcbiAgICBwdWJsaWMgdHlwZSA9IE5vZGVUeXBlLlRleHQ7XHJcbiAgICBwcml2YXRlIHNheUNyZWF0b3IgOiAoKSA9PiBTYXk7XHJcblxyXG4gICAgcHVibGljIHNldFNheSAoc2F5Q3JlYXRvciA6ICgpID0+IFNheSkge1xyXG4gICAgICAgIHRoaXMuc2F5Q3JlYXRvcj0gc2F5Q3JlYXRvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0U2F5ICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zYXlDcmVhdG9yKCk7XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiRGlhbG9ndWVUZXh0LnRzXCIgLz5cclxuY2xhc3MgRGlhbG9ndWVDaG9pY2UgZXh0ZW5kcyBEaWFsb2d1ZVRleHQge1xyXG4gICAgcHVibGljIHR5cGUgPSBOb2RlVHlwZS5DaG9pY2U7XHJcbiAgICBwcml2YXRlIGNvbmRpdGlvbnMgOiAoKSA9PiBib29sZWFuID0gKCkgPT4geyByZXR1cm4gdHJ1ZTsgfTtcclxuXHJcbiAgICBwdWJsaWMgaXNBdmFpbGFibGUgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0Q29uZGl0aW9ucyAoY29uZGl0aW9ucyA6ICgpID0+IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmNvbmRpdGlvbnMgPSBjb25kaXRpb25zO1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkRpYWxvZ3VlTm9kZS50c1wiIC8+XHJcbmNsYXNzIERpYWxvZ3VlTm9kZVRyZWUgZXh0ZW5kcyBEaWFsb2d1ZU5vZGUge1xyXG4gICAgcHVibGljIHR5cGUgPSBOb2RlVHlwZS5UcmVlO1xyXG4gICAgcHVibGljIHRyZWUgOiAoKSA9PiBEaWFsb2d1ZVRyZWU7XHJcblxyXG4gICAgcHVibGljIHNldFRyZWUgKHRyZWVGaW5kZXIgOiAoKSA9PiBEaWFsb2d1ZVRyZWUpIHtcclxuICAgICAgICB0aGlzLnRyZWUgPSB0cmVlRmluZGVyO1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkRpYWxvZ3VlTm9kZS50c1wiIC8+XHJcbmNsYXNzIERpYWxvZ3VlU2V0IGV4dGVuZHMgRGlhbG9ndWVOb2RlIHtcclxuICAgIHB1YmxpYyB0eXBlID0gTm9kZVR5cGUuU2V0O1xyXG4gICAgcHJpdmF0ZSBjb2RlIDogKCkgPT4gKHZvaWQgfCBQcm9taXNlPHZvaWQ+KTtcclxuXHJcbiAgICBwdWJsaWMgc2V0RnVuY3Rpb24gKGNvZGUgOiAoKSA9PiAodm9pZCB8IFByb21pc2U8dm9pZD4pKSB7XHJcbiAgICAgICAgdGhpcy5jb2RlID0gY29kZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcnVuICgpIDogdm9pZCB8IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvZGUoKTtcclxuICAgIH1cclxufSIsImNsYXNzIERpYWxvZ3VlVHJlZSB7XHJcbiAgICBwdWJsaWMgaWQgOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIG5vZGVzIDoge1tpZCA6IHN0cmluZ10gOiBEaWFsb2d1ZU5vZGV9ID0ge307XHJcbiAgICBwdWJsaWMgc3RhcnROb2RlIDogRGlhbG9ndWVOb2RlID0gdW5kZWZpbmVkO1xyXG4gICAgcHJpdmF0ZSByZXBlYXRDaG9pY2VzIDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwcml2YXRlIGxhc3RQcmludGVkQ2hvaWNlIDogQXJyYXk8SFRNTEVsZW1lbnQ+O1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoaWQgOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmlkID0gaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZE5vZGUgKG5vZGUgOiBEaWFsb2d1ZU5vZGUpIHtcclxuICAgICAgICB0aGlzLm5vZGVzW25vZGUuaWRdID0gbm9kZTtcclxuICAgICAgICBpZiAobm9kZS50eXBlID09IE5vZGVUeXBlLk5vZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5ub2Rlc1tub2RlLm5hbWVdID0gbm9kZTsgLy8gVGhpcyBpcyBhIGxhYmVsIVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkU3RhcnROb2RlIChub2RlIDogRGlhbG9ndWVOb2RlKSB7XHJcbiAgICAgICAgdGhpcy5hZGROb2RlKG5vZGUpO1xyXG4gICAgICAgIHRoaXMuc3RhcnROb2RlID0gbm9kZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Tm9kZSAoaWQgOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ub2Rlc1tpZF07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE5leHQgKG5vZGUgOiBEaWFsb2d1ZU5vZGUpIHtcclxuICAgICAgICBsZXQgbmV4dCA9IG5vZGUuZ2V0TmV4dCgpO1xyXG4gICAgICAgIGlmIChuZXh0ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXROb2RlKG5leHQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0UmVwZWF0Q2hvaWNlcyAoZG9JdCA6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLnJlcGVhdENob2ljZXMgPSBkb0l0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlIChzdGFydElkPyA6IHN0cmluZykge1xyXG5cclxuICAgICAgICBjb25zb2xlLmRlYnVnKFJ1bGVib29rLmdldEluZGVudGF0aW9uKCkgKyBcIltEaWFsb2d1ZVRyZWVdIFJ1bm5pbmcgXCIgKyB0aGlzLmlkKTtcclxuICAgICAgICBSdWxlYm9vay5pbmNyZWFzZUluZGVudGF0aW9uKHRoaXMpO1xyXG5cclxuICAgICAgICBsZXQgbm9kZSA6IERpYWxvZ3VlTm9kZTtcclxuICAgICAgICBpZiAoc3RhcnRJZCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgbm9kZSA9IHRoaXMuc3RhcnROb2RlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG5vZGUgPSB0aGlzLmdldE5vZGUoc3RhcnRJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChub2RlID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIucHJpbnRBc0Vycm9yKFwiVW5hYmxlIHRvIHN0YXJ0IGRpYWxvZ3VlIFwiICsgdGhpcy5pZCArIFwiOiBBIHN0YXJ0aW5nIG5vZGUgY291bGQgbm90IGJlIGZvdW5kLlwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHByZXZpb3VzTm9kZSA6IERpYWxvZ3VlTm9kZTtcclxuICAgICAgICB3aGlsZSAobm9kZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgbGV0IG5leHROb2RlID0gYXdhaXQgdGhpcy5wcm9jZXNzTm9kZShub2RlLCBwcmV2aW91c05vZGUpO1xyXG4gICAgICAgICAgICBwcmV2aW91c05vZGUgPSBub2RlO1xyXG4gICAgICAgICAgICBub2RlID0gbmV4dE5vZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFJ1bGVib29rLmRlY3JlYXNlSW5kZW50YXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgcHJvY2Vzc05vZGUgKG5vZGUgOiBEaWFsb2d1ZU5vZGUsIHByZXZpb3VzTm9kZSA6IERpYWxvZ3VlTm9kZSkge1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcoUnVsZWJvb2suZ2V0SW5kZW50YXRpb24oKSArIFwiW1wiICsgbm9kZS50eXBlICsgXCJdIFwiICsgbm9kZS5pZCk7XHJcbiAgICAgICAgUnVsZWJvb2suaW5jcmVhc2VJbmRlbnRhdGlvbihub2RlKTtcclxuICAgICAgICBsZXQgZG9DaG9pY2VzID0gbm9kZS5oYXNDaG9pY2VzKCk7XHJcblxyXG4gICAgICAgIGlmIChub2RlLnR5cGUgPT0gTm9kZVR5cGUuVHJlZSkge1xyXG4gICAgICAgICAgICBhd2FpdCAoPERpYWxvZ3VlTm9kZVRyZWU+IG5vZGUpLnRyZWUoKS5leGVjdXRlKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLnR5cGUgPT0gTm9kZVR5cGUuVGV4dCkge1xyXG4gICAgICAgICAgICBsZXQgc2F5ID0gKDxEaWFsb2d1ZVRleHQ+IG5vZGUpLmdldFNheSgpO1xyXG4gICAgICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIucHJpbnRBc0NvbnRlbnQoc2F5KTtcclxuICAgICAgICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PSBOb2RlVHlwZS5TZXQpIHtcclxuICAgICAgICAgICAgbGV0IHJ1bm5pbmdTZXQgPSAoPERpYWxvZ3VlU2V0PiBub2RlKS5ydW4oKTtcclxuICAgICAgICAgICAgaWYgKHJ1bm5pbmdTZXQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBydW5uaW5nU2V0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZG9DaG9pY2VzKSB7XHJcbiAgICAgICAgICAgIC8vIE5leHQgbm9kZSBpcyBkZWNpZGVkIGJ5IHRoZSBjaG9pY2VzXHJcbiAgICAgICAgICAgIGxldCBicmFuY2hpbmdEaWFsb2d1ZSA9IG5ldyBCcmFuY2hpbmdEaWFsb2d1ZSgpO1xyXG4gICAgICAgICAgICBsZXQgY2hvaWNlcyA9IG5vZGUuY2hvaWNlcztcclxuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSBbXTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaG9pY2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY2hvaWNlID0gPERpYWxvZ3VlQ2hvaWNlPiB0aGlzLmdldE5vZGUoY2hvaWNlc1tpXSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgYnJhbmNoaW5nT3B0aW9uID0gbmV3IEJyYW5jaGluZ09wdGlvbihjaG9pY2UuZ2V0U2F5KCksIGNob2ljZS5pc0F2YWlsYWJsZSgpKTtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMucHVzaChicmFuY2hpbmdPcHRpb24pO1xyXG4gICAgICAgICAgICAgICAgYnJhbmNoaW5nRGlhbG9ndWUuYWRkT3B0aW9ucyhicmFuY2hpbmdPcHRpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBjaG9zZW5PcHRpb24gOiBCcmFuY2hpbmdPcHRpb24gPSBhd2FpdCBicmFuY2hpbmdEaWFsb2d1ZS5nZXRDaG9zZW5PcHRpb24oKTtcclxuICAgICAgICAgICAgbGV0IGNob3Nlbk5vZGVJZCA9IGNob2ljZXNbb3B0aW9ucy5pbmRleE9mKGNob3Nlbk9wdGlvbildO1xyXG4gICAgICAgICAgICBsZXQgY2hvc2VuTm9kZSA9IDxEaWFsb2d1ZUNob2ljZT4gdGhpcy5nZXROb2RlKGNob3Nlbk5vZGVJZCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5yZXBlYXRDaG9pY2VzKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgc2F5ID0gbmV3IFNheShuZXcgU2F5Qm9sZChcIiA+IFwiLCBjaG9zZW5Ob2RlLmdldFNheSgpKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RQcmludGVkQ2hvaWNlID0gYXdhaXQgRWxlbWVudHMuQ3VycmVudFR1cm5IYW5kbGVyLmdldFNheUVsZW1lbnRzQXNDb250ZW50KHNheSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIucHJpbnQoLi4udGhpcy5sYXN0UHJpbnRlZENob2ljZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoUnVsZWJvb2suZ2V0SW5kZW50YXRpb24oKSArIFwiW0Nob2ljZV0gUGlja2VkIFwiICsgY2hvc2VuTm9kZUlkKTtcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhSdWxlYm9vay5nZXRJbmRlbnRhdGlvbigpICsgXCJbQ2hvaWNlXSBHb2luZyB0byBcIiArIGNob3Nlbk5vZGUuZ2V0TmV4dCgpKTtcclxuICAgICAgICAgICAgUnVsZWJvb2suaW5jcmVhc2VJbmRlbnRhdGlvbihjaG9zZW5Ob2RlSWQpO1xyXG4gICAgICAgICAgICBSdWxlYm9vay5kZWNyZWFzZUluZGVudGF0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICBSdWxlYm9vay5kZWNyZWFzZUluZGVudGF0aW9uKCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldE5leHQoY2hvc2VuTm9kZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgUnVsZWJvb2suZGVjcmVhc2VJbmRlbnRhdGlvbigpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXROZXh0KG5vZGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdW5wcmludExhc3RDaG9pY2UgKCkge1xyXG4gICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci51bnByaW50KC4uLnRoaXMubGFzdFByaW50ZWRDaG9pY2UpO1xyXG4gICAgfVxyXG59IiwibW9kdWxlIERpYWxvZ3VlVHJlZXMge1xyXG4gICAgLy8gbGV0IHRyZWVzIDoge1tuYW1lIDogc3RyaW5nXSA6IERpYWxvZ3VlVHJlZX0gPSB7fTtcclxuICAgIC8vXHJcbiAgICAvLyBleHBvcnQgZnVuY3Rpb24gYWRkVHJlZSh0cmVlIDogRGlhbG9ndWVUcmVlKSB7XHJcbiAgICAvLyAgICAgdHJlZXNbdHJlZS5pZF0gPSB0cmVlO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBwcmludHMgaW5mb3JtYXRpb24gYWJvdXQgdXNhZ2Ugb2YgZXZlcnkgRGlhbG9ndWVUcmVlIGF2YWlsYWJsZS5cclxuICAgICAqIE5vdGU6IEV2ZW4gdGhvdWdoIGEgRGlhbG9ndWVUcmVlIGlzIHJlZmVyZW5jZWQsIGl0ICptaWdodCogc3RpbGwgbm90IGJlIGFjY2Vzc2libGUgaWYgdGhlIGNvZGUgbGVhZGluZyB0byBpdCBpcyBmYXVsdHkuXHJcbiAgICAgKiBUaGlzIHNob3VsZCBiZSB1c2VkIHRvIGtub3cgd2hldGhlciBvciBub3QgYSBEaWFsb2d1ZVRyZWUgd2FzIFwiZm9yZ290dGVuXCIsIHNpbmNlIHRoZSBJREUgY2FuIG9ubHkgZG8gdGhpcyBtYW51YWxseS5cclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZpbmRVbnVzZWRUcmVlcyAoKSB7XHJcbiAgICAgICAgbGV0IGFsbENvZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFwcENvZGVcIikuaW5uZXJIVE1MO1xyXG5cclxuICAgICAgICBsZXQgdXNlQ291bnQgPSB7fTtcclxuICAgICAgICBsZXQgdW51c2VkID0gW107XHJcblxyXG4gICAgICAgIGZvciAobGV0IGRpYWxvZ3VlTmFtZSBpbiBEaWFsb2d1ZVRyZWVzKSB7XHJcbiAgICAgICAgICAgIGlmIChkaWFsb2d1ZU5hbWUgIT0gXCJmaW5kVW51c2VkVHJlZXNcIikge1xyXG4gICAgICAgICAgICAgICAgLy8gVGhlIGZpcnN0IG1lbnRpb24gd2lsbCBiZSB0aGUgb25lIGRlZmluaW5nIGl0IHRvIGV4aXN0LCBzbyB3ZSBuZWVkIGF0IGxlYXN0IHR3byBvY2N1cnJlbmNlcyBmb3IgaXQgdG8gYmUgdXNlZC5cclxuICAgICAgICAgICAgICAgIGxldCBjb3VudCA9IG9jY3VycmVuY2VzKGFsbENvZGUsIFwiRGlhbG9ndWVUcmVlcy5cIiArIGRpYWxvZ3VlTmFtZSwgZmFsc2UpIC0gMTtcclxuICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB1c2VDb3VudFtkaWFsb2d1ZU5hbWVdID0gY291bnQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHVudXNlZC5wdXNoKGRpYWxvZ3VlTmFtZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGRpYWxvZ3VlTmFtZSBpbiB1c2VDb3VudCkge1xyXG4gICAgICAgICAgICBsZXQgdGltZXMgPSB1c2VDb3VudFtkaWFsb2d1ZU5hbWVdO1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwiW0RpYWxvZ3VlVXNhZ2VdIFwiICsgZGlhbG9ndWVOYW1lICsgXCIgaXMgcmVmZXJlbmNlZCBcIiArIHRpbWVzICsgKHRpbWVzID4gMSA/IFwiIHRpbWVzLlwiIDogXCIgdGltZS5cIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1bnVzZWQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIltEaWFsb2d1ZVVzYWdlXSBcIiArIHVudXNlZFtpXSArIFwiIGlzIG5ldmVyIHJlZmVyZW5jZWQgYW5kIHdpbGwgbm90IGFwcGVhciBpbi1nYW1lLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEZ1bmN0aW9uIHRoYXQgY291bnQgb2NjdXJyZW5jZXMgb2YgYSBzdWJzdHJpbmcgaW4gYSBzdHJpbmc7XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nICAgICAgICAgICAgICAgVGhlIHN0cmluZ1xyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YlN0cmluZyAgICAgICAgICAgIFRoZSBzdWIgc3RyaW5nIHRvIHNlYXJjaCBmb3JcclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2FsbG93T3ZlcmxhcHBpbmddICBPcHRpb25hbC4gKERlZmF1bHQ6ZmFsc2UpXHJcbiAgICAgKlxyXG4gICAgICogQGF1dGhvciBWaXRpbS51cyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS92aWN0b3JucGIvNzczNjg2NVxyXG4gICAgICogQHNlZSBVbml0IFRlc3QgaHR0cHM6Ly9qc2ZpZGRsZS5uZXQvVmljdG9ybnBiLzVheHVoOTZ1L1xyXG4gICAgICogQHNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQwMDk3NTYvaG93LXRvLWNvdW50LXN0cmluZy1vY2N1cnJlbmNlLWluLXN0cmluZy83OTI0MjQwIzc5MjQyNDBcclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gb2NjdXJyZW5jZXMoc3RyaW5nLCBzdWJTdHJpbmcsIGFsbG93T3ZlcmxhcHBpbmcpIHtcclxuXHJcbiAgICAgICAgc3RyaW5nICs9IFwiXCI7XHJcbiAgICAgICAgc3ViU3RyaW5nICs9IFwiXCI7XHJcbiAgICAgICAgaWYgKHN1YlN0cmluZy5sZW5ndGggPD0gMCkgcmV0dXJuIChzdHJpbmcubGVuZ3RoICsgMSk7XHJcblxyXG4gICAgICAgIHZhciBuID0gMCxcclxuICAgICAgICAgICAgcG9zID0gMCxcclxuICAgICAgICAgICAgc3RlcCA9IGFsbG93T3ZlcmxhcHBpbmcgPyAxIDogc3ViU3RyaW5nLmxlbmd0aDtcclxuXHJcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcclxuICAgICAgICAgICAgcG9zID0gc3RyaW5nLmluZGV4T2Yoc3ViU3RyaW5nLCBwb3MpO1xyXG4gICAgICAgICAgICBpZiAocG9zID49IDApIHtcclxuICAgICAgICAgICAgICAgICsrbjtcclxuICAgICAgICAgICAgICAgIHBvcyArPSBzdGVwO1xyXG4gICAgICAgICAgICB9IGVsc2UgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuO1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1Jvb20udHNcIiAvPlxyXG5pbnRlcmZhY2UgVHJpY2tpZXJPcHRpb25zIHtcclxuICAgIHJlZ2lvbiA6IFJlZ2lvblJhbmRvbTtcclxuICAgIG1hcCA6IFJvb21SYW5kb21NYXA7XHJcbiAgICBvdGhlclJvb20gOiBSb29tUmFuZG9tO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgVHJpY2t5T3B0aW9ucyBleHRlbmRzIFRyaWNraWVyT3B0aW9ucyB7XHJcbiAgICBvdGhlclJvb21EaXJlY3Rpb24gOiBudW1iZXI7XHJcbiAgICB0cmlja3lSb29tRGlyZWN0aW9uIDogbnVtYmVyO1xyXG4gICAgeCA6IG51bWJlcjtcclxuICAgIHkgOiBudW1iZXI7XHJcbn1cclxuXHJcbmludGVyZmFjZSBSb29tUmFuZG9tTm9kZSB7XHJcbiAgICByb29tIDogUm9vbVJhbmRvbTtcclxuICAgIGNvb3JkaW5hdGVzIDogQXJyYXk8bnVtYmVyPjtcclxuICAgIGRpc3RhbmNlIDogbnVtYmVyO1xyXG59XHJcblxyXG5jbGFzcyBSb29tUmFuZG9tIGV4dGVuZHMgUm9vbSB7XHJcbiAgICBwdWJsaWMgY29ubmVjdGFibGVPbiA6IEFycmF5PG51bWJlcj4gPSBbRGlyZWN0aW9uLk5PUlRILCBEaXJlY3Rpb24uU09VVEgsIERpcmVjdGlvbi5FQVNULCBEaXJlY3Rpb24uV0VTVF07XHJcbiAgICBwdWJsaWMgcmFuZG9taXphYmxlID0gdHJ1ZTsgLy8gbm9uLXJhbmRvbWl6YWJsZSByb29tcyBkb24ndCBnZXQgcGxhY2VkIGF1dG9tYXRpY2FsbHlcclxuICAgIHB1YmxpYyBwbGFjZWQgPSBmYWxzZTtcclxuICAgIHB1YmxpYyBhcHBlYXJDaGFuY2UgPSA3NTtcclxuICAgIHB1YmxpYyBleHRyYUNvbm5lY3Rpb25DaGFuY2UgPSA3NTsgLy8gUmVxdWlyZXMgdHdvIHN1Y2Nlc3Nlc1xyXG4gICAgcHVibGljIGJhY2tncm91bmRJbWFnZSA9IFwidG9tYXRvXCI7XHJcblxyXG4gICAgcHVibGljIGxhc3RNYXAgOiBSb29tUmFuZG9tTWFwO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoaWQ/IDogc3RyaW5nLCBmb2RkZXI/IDogYm9vbGVhbikge1xyXG4gICAgICAgIHN1cGVyKGlkLCBmb2RkZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRCYWNrZ3JvdW5kQ2xhc3MgKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzSW1hZ2VEZWZpbmVkKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFja2dyb3VuZEltYWdlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gXCJ0b21hdG9cIjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzSW1hZ2VEZWZpbmVkICgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcnVsZXMgPSBkb2N1bWVudC5zdHlsZVNoZWV0c1tpXVsncnVsZXMnXSB8fCBkb2N1bWVudC5zdHlsZVNoZWV0c1tpXVsnY3NzUnVsZXMnXTtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIHggaW4gcnVsZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJ1bGVzW3hdLnNlbGVjdG9yVGV4dCA9PSAnc3RyaW5nJyAmJiBydWxlc1t4XS5zZWxlY3RvclRleHQgPT0gXCIuXCIgKyB0aGlzLmJhY2tncm91bmRJbWFnZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiVW5hYmxlIHRvIHJlYWQgaW1hZ2VcIik7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNDb25uZWN0YWJsZU9uIChvcHBvc2l0ZURpcmVjdGlvbiA6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3RhYmxlT24uaW5kZXhPZihvcHBvc2l0ZURpcmVjdGlvbikgIT0gLTE7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHRyaWNreUNvZGUgOiAob3B0aW9ucyA6IFRyaWNreU9wdGlvbnMpID0+IGJvb2xlYW47XHJcblxyXG4gICAgcHVibGljIGdldEFueURpcmVjdGlvbiAob3B0aW9ucyA6IFRyaWNraWVyT3B0aW9ucykgOiBUcmlja3lPcHRpb25zIHtcclxuICAgICAgICBsZXQgZGlyZWN0aW9uU2h1ZmZsZXIgPSBuZXcgU2h1ZmZsZXI8bnVtYmVyPih0aGlzLmNvbm5lY3RhYmxlT24pO1xyXG4gICAgICAgIGZvciAobGV0IGRpcmVjdGlvbiA9IGRpcmVjdGlvblNodWZmbGVyLmdldE9uZSgpOyBkaXJlY3Rpb24gIT0gdW5kZWZpbmVkOyBkaXJlY3Rpb24gPSBkaXJlY3Rpb25TaHVmZmxlci5nZXRPbmUoKSkge1xyXG4gICAgICAgICAgICBsZXQgb3Bwb3NpdGVEaXJlY3Rpb24gPSBPcHBvc2l0ZURpcmVjdGlvbltEaXJlY3Rpb25bZGlyZWN0aW9uXV07XHJcbiAgICAgICAgICAgIGxldCBvdGhlckNvb3JkaW5hdGVzID0gb3B0aW9ucy5tYXAuZ2V0Q29vcmRpbmF0ZXMob3B0aW9ucy5vdGhlclJvb20pO1xyXG4gICAgICAgICAgICBsZXQgd291bGRiZUNvb3JkaW5hdGVzID0gUm9vbS5zaGlmdChvdGhlckNvb3JkaW5hdGVzLCBvcHBvc2l0ZURpcmVjdGlvbik7XHJcbiAgICAgICAgICAgIGxldCB0cmlja3lPcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgb3RoZXJSb29tIDogb3B0aW9ucy5vdGhlclJvb20sXHJcbiAgICAgICAgICAgICAgICBvdGhlclJvb21EaXJlY3Rpb24gOiBvcHBvc2l0ZURpcmVjdGlvbixcclxuICAgICAgICAgICAgICAgIHRyaWNreVJvb21EaXJlY3Rpb24gOiBkaXJlY3Rpb24sXHJcbiAgICAgICAgICAgICAgICBtYXAgOiBvcHRpb25zLm1hcCxcclxuICAgICAgICAgICAgICAgIHJlZ2lvbiA6IG9wdGlvbnMucmVnaW9uLFxyXG4gICAgICAgICAgICAgICAgeCA6IHdvdWxkYmVDb29yZGluYXRlc1swXSxcclxuICAgICAgICAgICAgICAgIHkgOiB3b3VsZGJlQ29vcmRpbmF0ZXNbMV1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzUGxhY2VhYmxlKHRyaWNreU9wdGlvbnMpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJpY2t5T3B0aW9ucztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNQbGFjZWFibGUgKG9wdGlvbnMgOiBUcmlja3lPcHRpb25zKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzQ29ubmVjdGFibGVPbihvcHRpb25zLnRyaWNreVJvb21EaXJlY3Rpb24pIHx8ICFvcHRpb25zLm1hcC5pc0ZyZWUob3B0aW9ucy54LCBvcHRpb25zLnkpKSB7XHJcbiAgICAgICAgICAgIC8vIFRoaXMgY2FuJ3QgY29ubmVjdCB0aHJvdWdoIHRoYXQhXHJcbiAgICAgICAgICAgIC8vIFRoYXQgY29vcmRpbmF0ZSBpc24ndCBmcmVlIVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAob3B0aW9ucy5vdGhlclJvb20gPT0gdW5kZWZpbmVkIHx8ICFvcHRpb25zLm90aGVyUm9vbS5pc0Nvbm5lY3RhYmxlT24ob3B0aW9ucy5vdGhlclJvb21EaXJlY3Rpb24pKSB7XHJcbiAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIG90aGVyIHJvb20gdGhlcmU/XHJcbiAgICAgICAgICAgIC8vIFRoZSBvdGhlciByb29tIGRvZXNuJ3QgbGlrZSBpdCB0aGlzIHdheVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBEbyBJIGhhdmUgbXkgb3duIHRyaWNreSBjb2RlP1xyXG4gICAgICAgIGlmICh0aGlzLnRyaWNreUNvZGUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyaWNreUNvZGUob3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldERpc3RhbmNlVG8gKHJvb20gOiBSb29tUmFuZG9tKSB7XHJcbiAgICAgICAgbGV0IG15Q29vcmRpbmF0ZXMgPSB0aGlzLmxhc3RNYXAuZ2V0Q29vcmRpbmF0ZXModGhpcyk7XHJcbiAgICAgICAgbGV0IG90aGVyQ29vcmRpbmF0ZXMgPSB0aGlzLmxhc3RNYXAuZ2V0Q29vcmRpbmF0ZXMocm9vbSk7XHJcbiAgICAgICAgaWYgKG15Q29vcmRpbmF0ZXMgIT0gdW5kZWZpbmVkICYmIG90aGVyQ29vcmRpbmF0ZXMgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGxldCBjMSA9IG15Q29vcmRpbmF0ZXM7XHJcbiAgICAgICAgICAgIGxldCBjMiA9IG90aGVyQ29vcmRpbmF0ZXM7XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmFicyhjMVswXSAtIGMyWzBdKSArIE1hdGguYWJzKGMxWzFdIC0gYzJbMV0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgc3VmZmljaWVudGx5IGZhc3QgZm9yIGNvbnN0YW50IHVzZS5cclxuICAgICAqIEBwYXJhbSBwYXRoRW5kXHJcbiAgICAgKiBAcGFyYW0gbWFwXHJcbiAgICAgKiBAcGFyYW0gYXZhaWxhYmxlUm9vbXNcclxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGZpbmRQYXRoVG8gKHBhdGhFbmQgOiBSb29tUmFuZG9tLCB2YWxpZFJvb20/IDogKHJvb20gOiBSb29tUmFuZG9tKSA9PiBib29sZWFuKSB7XHJcbiAgICAgICAgdmFsaWRSb29tID0gdmFsaWRSb29tID09IHVuZGVmaW5lZCA/ICgpID0+IHtyZXR1cm4gdHJ1ZTt9IDogdmFsaWRSb29tO1xyXG4gICAgICAgIGxldCBtYXAgPSB0aGlzLmxhc3RNYXA7XHJcbiAgICAgICAgbGV0IGVuZFBvc2l0aW9uID0gbWFwLmdldENvb3JkaW5hdGVzKHBhdGhFbmQpO1xyXG4gICAgICAgIGxldCBvcGVuID0gW107XHJcblxyXG4gICAgICAgIGxldCBkaXN0YW5jZSA9IChjMSwgYzIpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGguYWJzKGMxWzBdIC0gYzJbMF0pICsgTWF0aC5hYnMoYzFbMV0gLSBjMlsxXSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbGV0IG5laWdoYm9ycyA9IChyb29tIDogUm9vbVJhbmRvbSwgeCA6IG51bWJlciwgeSA6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgbmVpZ2hzID0gW107XHJcbiAgICAgICAgICAgIGZvciAobGV0IGRpcmVjdGlvbiA9IDA7IGRpcmVjdGlvbiA8IHJvb20uY29ubmVjdGlvbnMubGVuZ3RoOyBkaXJlY3Rpb24rKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IG90aGVyUm9vbSA9IHJvb20uY29ubmVjdGlvbnNbZGlyZWN0aW9uXTtcclxuICAgICAgICAgICAgICAgIGlmIChvdGhlclJvb20gIT0gdW5kZWZpbmVkICYmIG9wZW4uaW5kZXhPZihvdGhlclJvb20pID09IC0xICYmIHZhbGlkUm9vbSg8Um9vbVJhbmRvbT4gb3RoZXJSb29tKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBkaXJDb29yZGluYXRlcyA9IFJvb20uc2hpZnQoW3gsIHldLCBkaXJlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBkaXIgPSBbb3RoZXJSb29tLCBkaXJDb29yZGluYXRlcywgZGlzdGFuY2UoZW5kUG9zaXRpb24sIGRpckNvb3JkaW5hdGVzKV07XHJcbiAgICAgICAgICAgICAgICAgICAgbmVpZ2hzLnB1c2goZGlyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbmVpZ2hzLnNvcnQoKGEsYikgPT4geyByZXR1cm4gKDxudW1iZXI+IGFbMl0pIC0gKDxudW1iZXI+IGJbMl0pO30pO1xyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICBsZXQgc2hvcnRlc3RQYXRoID0ge1xyXG4gICAgICAgICAgICBsZW5ndGggOiBtYXAuZ2V0Um9vbUNvdW50KClcclxuICAgICAgICB9O1xyXG4gICAgICAgIGxldCBub1BhdGggPSBzaG9ydGVzdFBhdGg7XHJcbiAgICAgICAgbGV0IGNQYXRoID0gW107XHJcbiAgICAgICAgbGV0IGZpbmRQYXRoID0gKG15QXJyYXkpID0+IHtcclxuICAgICAgICAgICAgbGV0IHJvb20gPSBteUFycmF5WzBdO1xyXG4gICAgICAgICAgICBjUGF0aC5wdXNoKG15QXJyYXkpO1xyXG4gICAgICAgICAgICBpZiAocm9vbSA9PSBwYXRoRW5kKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2hvcnRlc3RQYXRoLmxlbmd0aCA+PSBjUGF0aC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBzaG9ydGVzdFBhdGggPSBjUGF0aC5zbGljZSgwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaG9ydGVzdFBhdGgubGVuZ3RoID4gKGNQYXRoLmxlbmd0aCkpIHtcclxuICAgICAgICAgICAgICAgIG9wZW4ucHVzaChyb29tKTtcclxuICAgICAgICAgICAgICAgIGxldCBvdGhlclJvb21zID0gbmVpZ2hib3JzKHJvb20sIG15QXJyYXlbMV1bMF0sIG15QXJyYXlbMV1bMV0pO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdGhlclJvb21zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKChjUGF0aC5sZW5ndGggKyAxKSA8IHNob3J0ZXN0UGF0aC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmluZFBhdGgob3RoZXJSb29tc1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgb3Blbi5wb3AoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjUGF0aC5wb3AoKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBmaW5kUGF0aChbdGhpcywgbWFwLmdldENvb3JkaW5hdGVzKHRoaXMpXSk7XHJcbiAgICAgICAgcmV0dXJuIHNob3J0ZXN0UGF0aCAhPSBub1BhdGggPyBzaG9ydGVzdFBhdGggOiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEJlc3REaXJlY3Rpb25UbyAob3RoZXJSb29tIDogUm9vbVJhbmRvbSwgdmFsaWRSb29tPyA6IChyb29tIDogUm9vbVJhbmRvbSkgPT4gYm9vbGVhbikge1xyXG4gICAgICAgIGxldCBwYXRoID0gdGhpcy5maW5kUGF0aFRvKG90aGVyUm9vbSwgdmFsaWRSb29tKTtcclxuICAgICAgICBpZiAocGF0aCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbnMuaW5kZXhPZihwYXRoWzFdWzBdKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEFTdGFyUGF0aFRvIChvdGhlclJvb20gOiBSb29tUmFuZG9tLCB2YWxpZFJvb20/IDogKHJvb20gOiBSb29tUmFuZG9tKSA9PiBib29sZWFuKSB7XHJcbiAgICAgICAgdmFsaWRSb29tID0gdmFsaWRSb29tICE9IHVuZGVmaW5lZCA/IHZhbGlkUm9vbSA6ICgpID0+IHtyZXR1cm4gdHJ1ZX07XHJcblxyXG4gICAgICAgIGxldCBkaXN0YW5jZSA9IChjMSwgYzIpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGguYWJzKGMxWzBdIC0gYzJbMF0pICsgTWF0aC5hYnMoYzFbMV0gLSBjMlsxXSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbGV0IGlzVmlzaXRlZCA9IChyb29tKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB2aXNpdGVkLmluZGV4T2Yocm9vbSkgIT0gLTE7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbGV0IGdldE5laWdoYm9ycyA9IChub2RlIDogUm9vbVJhbmRvbU5vZGUpID0+IHtcclxuICAgICAgICAgICAgbGV0IG5laWdoYm9ycyA6IEFycmF5PFJvb21SYW5kb21Ob2RlPiA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBkaXJlY3Rpb24gPSAwOyBkaXJlY3Rpb24gPCBub2RlLnJvb20uY29ubmVjdGlvbnMubGVuZ3RoOyBkaXJlY3Rpb24rKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUucm9vbS5jb25uZWN0aW9uc1tkaXJlY3Rpb25dICE9IHVuZGVmaW5lZCAmJiAhaXNWaXNpdGVkKG5vZGUucm9vbS5jb25uZWN0aW9uc1tkaXJlY3Rpb25dKSAmJiB2YWxpZFJvb20oPFJvb21SYW5kb20+IG5vZGUucm9vbS5jb25uZWN0aW9uc1tkaXJlY3Rpb25dKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb29yZGluYXRlcyA9IFJvb20uc2hpZnQobm9kZS5jb29yZGluYXRlcywgZGlyZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBuZWlnaGJvcnMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb20gOiA8Um9vbVJhbmRvbT4gbm9kZS5yb29tLmNvbm5lY3Rpb25zW2RpcmVjdGlvbl0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzIDogY29vcmRpbmF0ZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlIDogZGlzdGFuY2UoY29vcmRpbmF0ZXMsIGVuZE5vZGUuY29vcmRpbmF0ZXMpXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmlzaXRlZC5wdXNoKDxSb29tUmFuZG9tPiBub2RlLnJvb20uY29ubmVjdGlvbnNbZGlyZWN0aW9uXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5laWdoYm9ycztcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBsZXQgZ2V0Q2xvc2VzdFBhdGggPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBzaG9ydGVzdCA9IDA7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgb3Blbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGxhc3RQb2ludCA9IG9wZW5baV1bb3BlbltpXS5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgICAgIGlmIChsYXN0UG9pbnQuZGlzdGFuY2UgPCBvcGVuW3Nob3J0ZXN0XVtvcGVuW3Nob3J0ZXN0XS5sZW5ndGggLSAxXS5kaXN0YW5jZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3J0ZXN0ID0gaTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gc2hvcnRlc3Q7XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIGxldCBlbmROb2RlID0ge3Jvb20gOiBvdGhlclJvb20sIGNvb3JkaW5hdGVzIDogdGhpcy5sYXN0TWFwLmdldENvb3JkaW5hdGVzKG90aGVyUm9vbSksIGRpc3RhbmNlIDogMH07XHJcbiAgICAgICAgbGV0IHN0YXJ0Q29vcmRpbmF0ZXMgPSB0aGlzLmxhc3RNYXAuZ2V0Q29vcmRpbmF0ZXModGhpcyk7XHJcbiAgICAgICAgbGV0IHN0YXJ0Tm9kZSA9IHtyb29tIDogdGhpcywgY29vcmRpbmF0ZXMgOiBzdGFydENvb3JkaW5hdGVzLCBkaXN0YW5jZSA6IGRpc3RhbmNlKHN0YXJ0Q29vcmRpbmF0ZXMsIGVuZE5vZGUuY29vcmRpbmF0ZXMpfTtcclxuICAgICAgICBsZXQgb3BlbiA6IEFycmF5PEFycmF5PFJvb21SYW5kb21Ob2RlPj4gPSBbW3N0YXJ0Tm9kZV1dO1xyXG4gICAgICAgIGxldCBjbG9zZWQgOiBBcnJheTxBcnJheTxSb29tUmFuZG9tTm9kZT4+ID0gW107XHJcbiAgICAgICAgbGV0IHNob3J0ZXN0UGF0aCA9IHRoaXMubGFzdE1hcC5nZXRSb29tQ291bnQoKTtcclxuICAgICAgICBsZXQgc2hvcnRlc3RJbmRleDtcclxuICAgICAgICBsZXQgbXlQYXRoO1xyXG4gICAgICAgIGxldCBjbG9zZXN0ID0gMDtcclxuICAgICAgICBsZXQgdmlzaXRlZCA6IEFycmF5PFJvb21SYW5kb20+ID0gW3RoaXNdO1xyXG4gICAgICAgIHdoaWxlIChvcGVuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbXlQYXRoID0gb3Blbi5zcGxpY2UoY2xvc2VzdCwgMSlbMF07XHJcblxyXG4gICAgICAgICAgICBpZiAobXlQYXRoW215UGF0aC5sZW5ndGggLSAxXS5kaXN0YW5jZSA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcHVzaCA9IGNsb3NlZC5wdXNoKG15UGF0aCk7XHJcbiAgICAgICAgICAgICAgICBpZiAobXlQYXRoLmxlbmd0aCA8IHNob3J0ZXN0UGF0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3J0ZXN0UGF0aCA9IG15UGF0aC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvcnRlc3RJbmRleCA9IHB1c2ggLSAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gbGF6eSwgZmlyc3QgcGF0aCBpcyB2ZXJ5IGxpa2VseSB0byBiZSB0aGUgYmVzdFxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbmVpZ2hib3JzID0gZ2V0TmVpZ2hib3JzKG15UGF0aFtteVBhdGgubGVuZ3RoIC0gMV0pO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZWlnaGJvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBvcGVuLnB1c2gobXlQYXRoLmNvbmNhdChbbmVpZ2hib3JzW2ldXSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBvcGVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAob3BlbltpXS5sZW5ndGggPj0gc2hvcnRlc3RQYXRoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3Blbi5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2xvc2VzdCA9IGdldENsb3Nlc3RQYXRoKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY2xvc2VkW3Nob3J0ZXN0SW5kZXhdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBU3RhckJlc3REaXJlY3Rpb25UbyAob3RoZXJSb29tIDogUm9vbVJhbmRvbSwgdmFsaWRSb29tPyA6IChyb29tIDogUm9vbVJhbmRvbSkgPT4gYm9vbGVhbikge1xyXG4gICAgICAgIGxldCBwYXRoID0gdGhpcy5nZXRBU3RhclBhdGhUbyhvdGhlclJvb20sIHZhbGlkUm9vbSk7XHJcbiAgICAgICAgaWYgKHBhdGggIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25zLmluZGV4T2YocGF0aFsxXS5yb29tKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENvbm5lY3RlZERpcmVjdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IHNodWZmbGVyID0gbmV3IFNodWZmbGVyKFJvb20uRElSRUNUSU9OUyk7XHJcbiAgICAgICAgZm9yIChsZXQgZGlyZWN0aW9uID0gc2h1ZmZsZXIuZ2V0T25lKCk7IGRpcmVjdGlvbiAhPSB1bmRlZmluZWQ7IGRpcmVjdGlvbiA9IHNodWZmbGVyLmdldE9uZSgpKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25zW2RpcmVjdGlvbl0gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGlyZWN0aW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE86IFJldHVybiBhbGwgdGhpbmdzIG9mIHR5cGUgdGhhdCBhcmUgaW4gcGxhY2VkIFJvb21SYW5kb20uXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEFjdGl2ZSAodHlwZSA6IHR5cGVvZiBUaGluZykge1xyXG5cclxuICAgIH1cclxufVxyXG5cclxuLy8gcmFuZG9tID0gbmV3IFJvb21SYW5kb20uLi5cclxuLy8gcmFuZG9tLmNvbm5lY3RhYmxlT24gPSBbUm9vbS5ESVJFQ1RJT05fTk9SVEgsIFJvb20uRElSRUNUSU9OX1NPVVRILi4uXSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9Sb29tLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIlJvb21SYW5kb20udHNcIiAvPlxyXG5cclxuaW50ZXJmYWNlIE1hcENvb3JkaW5hdGVzIHtcclxuICAgIHggOiBudW1iZXI7XHJcbiAgICB5IDogbnVtYmVyO1xyXG4gICAgeiA6IG51bWJlcjtcclxufVxyXG5cclxuY2xhc3MgUm9vbVJhbmRvbU1hcCB7XHJcbiAgICBwcml2YXRlIHBvc2l0aW9uVGFibGUgOiB7W3ggOiBudW1iZXJdIDoge1t5IDogbnVtYmVyXSA6IFJvb21SYW5kb219fSA9IHt9O1xyXG4gICAgcHJpdmF0ZSByb29tTWFwID0gbmV3IE1hcDxSb29tLCBBcnJheTxudW1iZXI+PigpO1xyXG4gICAgcHVibGljIGxvd2VzdFggPSAwO1xyXG4gICAgcHVibGljIGxvd2VzdFkgPSAwO1xyXG4gICAgcHVibGljIGhpZ2hlc3RYID0gMDtcclxuICAgIHB1YmxpYyBoaWdoZXN0WSA9IDA7XHJcbiAgICBwdWJsaWMgbGltaXRzSW52YWxpZCA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpcyBhIGNvdW50IG9mIGhvdyBtYW55IGNvbm5lY3Rpb25zIGFyZSBhY3R1YWxseSBhdmFpbGFibGUsIGFzc3VtaW5nIHJvb21zIHRoYXQgY2FuIGNvbm5lY3QgdGhyb3VnaCBzb21lIGRpcmVjdGlvbi5cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhdmFpbGFibGVDb25uZWN0aW9ucyA6IEFycmF5PEFycmF5PE1hcENvb3JkaW5hdGVzPj47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGlzIGEgY291bnQgb2Ygcm9vbXMgc2luY2UgdGhlIGxhc3QgY2FjaGUgY2xlYXIuIFVzZWQgdG8gbWVhbiBtb3JlLCBidXQgbm93IGlzIGp1c3QgYSBjb3VudCBvZiBob3cgbWFueSByb29tcyB3ZXJlIHBsYWNlZCBmcm9tIHRoZSBjdXJyZW50IHJlZ2lvbi5cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByb29tcztcclxuXHJcbiAgICAvKipcclxuICAgICAqIENsZWFycyB0aGUgY3VycmVudCByb29tIGNhY2hlIGFuZCBjcmVhdGVzIGEgbmV3IG9uZSB0aGF0IGlzIGVtcHR5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBlbXB0eUNhY2hlICgpIHtcclxuICAgICAgICB0aGlzLmF2YWlsYWJsZUNvbm5lY3Rpb25zID0gW107XHJcbiAgICAgICAgUm9vbS5ESVJFQ1RJT05TLmZvckVhY2goKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmF2YWlsYWJsZUNvbm5lY3Rpb25zLnB1c2goW10pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMucm9vbXMgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBdmFpbGFibGVDb25uZWN0aW9ucyAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXZhaWxhYmxlQ29ubmVjdGlvbnMucmVkdWNlKChwcmV2aW91c1ZhbHVlLCBjdXJyZW50VmFsdWUsIGN1cnJlbnRJbmRleCwgYXJyYXkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzVmFsdWUgKyAoY3VycmVudFZhbHVlLmxlbmd0aCk7XHJcbiAgICAgICAgfSwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlbW92ZUZyb21DYWNoZSAoY29vcmRpbmF0ZXNUb1JlbW92ZSA6IE1hcENvb3JkaW5hdGVzLCBkaXJlY3Rpb24gOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgZGlyZWN0aW9uQXJyYXkgPSB0aGlzLmF2YWlsYWJsZUNvbm5lY3Rpb25zW2RpcmVjdGlvbl07XHJcbiAgICAgICAgZm9yIChsZXQgayA9IDAsIGNvb3JkaW5hdGVzID0gZGlyZWN0aW9uQXJyYXlba107IGNvb3JkaW5hdGVzICE9IHVuZGVmaW5lZDsgY29vcmRpbmF0ZXMgPSBkaXJlY3Rpb25BcnJheVsrK2tdKSB7XHJcbiAgICAgICAgICAgIGlmIChjb29yZGluYXRlcy54ID09IGNvb3JkaW5hdGVzVG9SZW1vdmUueCAmJiBjb29yZGluYXRlcy55ID09IGNvb3JkaW5hdGVzVG9SZW1vdmUueSkge1xyXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uQXJyYXkuc3BsaWNlKGssIDEpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRUb0NhY2hlIChjb29yZGluYXRlc1RvQWRkIDogTWFwQ29vcmRpbmF0ZXMsIGRpcmVjdGlvbiA6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBkaXJlY3Rpb25BcnJheSA9IHRoaXMuYXZhaWxhYmxlQ29ubmVjdGlvbnNbZGlyZWN0aW9uXTtcclxuICAgICAgICBmb3IgKGxldCBrID0gMCwgY29vcmRpbmF0ZXMgPSBkaXJlY3Rpb25BcnJheVtrXTsgY29vcmRpbmF0ZXMgIT0gdW5kZWZpbmVkOyBjb29yZGluYXRlcyA9IGRpcmVjdGlvbkFycmF5Wysra10pIHtcclxuICAgICAgICAgICAgaWYgKGNvb3JkaW5hdGVzLnggPT0gY29vcmRpbmF0ZXNUb0FkZC54ICYmIGNvb3JkaW5hdGVzLnkgPT0gY29vcmRpbmF0ZXNUb0FkZC55KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZGlyZWN0aW9uQXJyYXkucHVzaChjb29yZGluYXRlc1RvQWRkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QW55RnJvbUNhY2hlIChkaXJlY3Rpb24gOiBudW1iZXIpIDogUm9vbVJhbmRvbSB7XHJcbiAgICAgICAgbGV0IGFycmF5ID0gdGhpcy5hdmFpbGFibGVDb25uZWN0aW9uc1tkaXJlY3Rpb25dO1xyXG4gICAgICAgIGlmIChhcnJheS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCByYW5kb21JbmRleCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChhcnJheS5sZW5ndGgpKTtcclxuICAgICAgICAgICAgbGV0IHJhbmRvbUNvb3JkaW5hdGVzID0gYXJyYXlbcmFuZG9tSW5kZXhdO1xyXG4gICAgICAgICAgICBpZiAocmFuZG9tQ29vcmRpbmF0ZXMgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRSb29tKHJhbmRvbUNvb3JkaW5hdGVzLngsIHJhbmRvbUNvb3JkaW5hdGVzLnkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc0ZyZWUgKHggOiBudW1iZXIsIHkgOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMucG9zaXRpb25UYWJsZVt4XSA9PSB1bmRlZmluZWQgfHwgdGhpcy5wb3NpdGlvblRhYmxlW3hdW3ldID09PSB1bmRlZmluZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBibG9jayAoeCA6IG51bWJlciwgeSA6IG51bWJlcikge1xyXG4gICAgICAgIGlmICh0aGlzLmlzRnJlZSh4LCB5KSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvblRhYmxlW3hdID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wb3NpdGlvblRhYmxlW3hdID0ge307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvblRhYmxlW3hdW3ldID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVDYWNoZU9uUG9zaXRpb24oeCwgeSk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTGltaXRzKHgsIHkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlQWxsTGltaXRzICgpIHtcclxuICAgICAgICB0aGlzLmhpZ2hlc3RYID0gMDtcclxuICAgICAgICB0aGlzLmhpZ2hlc3RZID0gMDtcclxuICAgICAgICB0aGlzLmxvd2VzdFggPSAwO1xyXG4gICAgICAgIHRoaXMubG93ZXN0WSA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgeCBpbiB0aGlzLnBvc2l0aW9uVGFibGUpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgeSBpbiB0aGlzLnBvc2l0aW9uVGFibGVbeF0pIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBvc2l0aW9uVGFibGVbeF1beV0gIT0gdW5kZWZpbmVkICYmIHRoaXMucG9zaXRpb25UYWJsZVt4XVt5XSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVMaW1pdHMocGFyc2VJbnQoeCksIHBhcnNlSW50KHkpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxpbWl0c0ludmFsaWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlTGltaXRzICh4LCB5KSB7XHJcbiAgICAgICAgaWYgKHggPiB0aGlzLmhpZ2hlc3RYKSB0aGlzLmhpZ2hlc3RYID0geDtcclxuICAgICAgICBpZiAoeSA+IHRoaXMuaGlnaGVzdFkpIHRoaXMuaGlnaGVzdFkgPSB5O1xyXG4gICAgICAgIGlmICh5IDwgdGhpcy5sb3dlc3RZKSB0aGlzLmxvd2VzdFkgPSB5O1xyXG4gICAgICAgIGlmICh4IDwgdGhpcy5sb3dlc3RYKSB0aGlzLmxvd2VzdFggPSB4O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBtYXAgKHJvb20gOiBSb29tUmFuZG9tLCB4IDogbnVtYmVyLCB5IDogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb25UYWJsZVt4XSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvblRhYmxlW3hdID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucG9zaXRpb25UYWJsZVt4XVt5XSA9IHJvb207XHJcbiAgICAgICAgdGhpcy5yb29tTWFwLnNldChyb29tLCBbeCwgeV0pO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlT25Qb3NpdGlvbih4LCB5KTtcclxuXHJcbiAgICAgICAgLy8gSWYgd2UgZXZlciB3YW50IHRvIGRyYXcgbWFwcywgdGhpcyB3aWxsIGJlIHVzZWZ1bFxyXG4gICAgICAgIHRoaXMudXBkYXRlTGltaXRzKHgsIHkpO1xyXG5cclxuICAgICAgICByb29tLnBsYWNlZCA9IHRydWU7XHJcbiAgICAgICAgcm9vbS5sYXN0TWFwID0gdGhpcztcclxuXHJcbiAgICAgICAgdGhpcy5yb29tcysrO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1bm1hcCAoeCA6IG51bWJlciwgeSA6IG51bWJlcikge1xyXG4gICAgICAgIGlmICh0aGlzLnBvc2l0aW9uVGFibGVbeF0gIT0gdW5kZWZpbmVkICYmIHRoaXMucG9zaXRpb25UYWJsZVt4XVt5XSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5yb29tTWFwLmRlbGV0ZSh0aGlzLnBvc2l0aW9uVGFibGVbeF1beV0pO1xyXG4gICAgICAgICAgICBkZWxldGUgKHRoaXMucG9zaXRpb25UYWJsZVt4XVt5XSk7XHJcbiAgICAgICAgICAgIHRoaXMucm9vbXMtLTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVDYWNoZU9uUG9zaXRpb24oeCwgeSk7XHJcbiAgICAgICAgICAgIHRoaXMubGltaXRzSW52YWxpZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlQ2FjaGVPblBvc2l0aW9uICh4IDogbnVtYmVyLCB5IDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IGNvb3JkaW5hdGVzID0gW3gsIHksIDBdO1xyXG4gICAgICAgIGxldCBjb29yZGluYXRlc01hcCA9IDxNYXBDb29yZGluYXRlcz4ge3ggOiB4LCB5IDogeX07XHJcbiAgICAgICAgbGV0IGNvb3JkaW5hdGVzQmxvY2tlZCA9ICF0aGlzLmlzRnJlZSh4LCB5KTtcclxuICAgICAgICBsZXQgY29vcmRpbmF0ZXNSb29tID0gdGhpcy5nZXRSb29tKHgsIHkpO1xyXG5cclxuICAgICAgICBSb29tLkRJUkVDVElPTlMuZm9yRWFjaChkaXJlY3Rpb24gPT4ge1xyXG4gICAgICAgICAgICBsZXQgb3Bwb3NpdGVEaXJlY3Rpb24gPSBPcHBvc2l0ZURpcmVjdGlvbltEaXJlY3Rpb25bZGlyZWN0aW9uXV07XHJcbiAgICAgICAgICAgIGxldCBzaGlmdGVkID0gUm9vbS5zaGlmdChjb29yZGluYXRlcywgZGlyZWN0aW9uKTtcclxuICAgICAgICAgICAgbGV0IHNoaWZ0ZWRNYXAgPSA8TWFwQ29vcmRpbmF0ZXM+IHt4IDogc2hpZnRlZFswXSwgeSA6IHNoaWZ0ZWRbMV19O1xyXG4gICAgICAgICAgICBsZXQgc2hpZnRlZEJsb2NrZWQgPSAhdGhpcy5pc0ZyZWUoc2hpZnRlZFswXSwgc2hpZnRlZFsxXSk7XHJcbiAgICAgICAgICAgIGxldCBzaGlmdGVkUm9vbSA9IHRoaXMuZ2V0Um9vbShzaGlmdGVkWzBdLCBzaGlmdGVkWzFdKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjb29yZGluYXRlc1Jvb20gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2hpZnRlZEJsb2NrZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUZyb21DYWNoZShjb29yZGluYXRlc01hcCwgZGlyZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29vcmRpbmF0ZXNSb29tLmlzQ29ubmVjdGFibGVPbihkaXJlY3Rpb24pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRUb0NhY2hlKGNvb3JkaW5hdGVzTWFwLCBkaXJlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVGcm9tQ2FjaGUoY29vcmRpbmF0ZXNNYXAsIGRpcmVjdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzaGlmdGVkUm9vbSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb29yZGluYXRlc0Jsb2NrZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUZyb21DYWNoZShzaGlmdGVkTWFwLCBvcHBvc2l0ZURpcmVjdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNoaWZ0ZWRSb29tLmlzQ29ubmVjdGFibGVPbihvcHBvc2l0ZURpcmVjdGlvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFRvQ2FjaGUoc2hpZnRlZE1hcCwgb3Bwb3NpdGVEaXJlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVGcm9tQ2FjaGUoc2hpZnRlZE1hcCwgb3Bwb3NpdGVEaXJlY3Rpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFJvb20gKHggOiBudW1iZXIsIHkgOiBudW1iZXIpIHtcclxuICAgICAgICBpZiAodGhpcy5wb3NpdGlvblRhYmxlW3hdICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvblRhYmxlW3hdW3ldICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBvc2l0aW9uVGFibGVbeF1beV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q29vcmRpbmF0ZXMgKHJvb20gOiBSb29tKSA6IEFycmF5PG51bWJlcj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJvb21NYXAuZ2V0KHJvb20pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRSb29tQ291bnQgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJvb21NYXAuc2l6ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0V2lkdGggKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmhpZ2hlc3RYIC0gdGhpcy5sb3dlc3RYO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRIZWlnaHQgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmhpZ2hlc3RZIC0gdGhpcy5sb3dlc3RZO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgUFJFRkVSUkVEX0dST1dUSF9IT1JJWk9OVEFMID0gMDtcclxuICAgIHB1YmxpYyBzdGF0aWMgUFJFRkVSUkVEX0dST1dUSF9WRVJUSUNBTCA9IDE7XHJcbiAgICBwdWJsaWMgc3RhdGljIFBSRUZFUlJFRF9HUk9XVEhfQU5ZID0gMjtcclxuXHJcbiAgICBwdWJsaWMgZ2V0UHJlZmVycmVkR3Jvd3RoICgpIHtcclxuICAgICAgICBsZXQgcmF0aW8gPSB0aGlzLmdldEhlaWdodCgpIC8gdGhpcy5nZXRXaWR0aCgpO1xyXG4gICAgICAgIGxldCBpZGVhbFJhdGlvID0gMi41OyAvLyBUaGlzIG1lYW5zIHdlJ2QgcHJlZmVyIGEgdGFsbCBtYXAgdGhhdCdkIGxvb2sgZ29vZCBvbiBvdXIgc2NyZWVuXHJcblxyXG4gICAgICAgIGxldCBkaWZmZXJlbmNlID0gTWF0aC5hYnMocmF0aW8gLSBpZGVhbFJhdGlvKTtcclxuICAgICAgICBpZiAoZGlmZmVyZW5jZSA8IDAuNSkge1xyXG4gICAgICAgICAgICByZXR1cm4gUm9vbVJhbmRvbU1hcC5QUkVGRVJSRURfR1JPV1RIX0FOWTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAocmF0aW8gPCBpZGVhbFJhdGlvKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUm9vbVJhbmRvbU1hcC5QUkVGRVJSRURfR1JPV1RIX1ZFUlRJQ0FMO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJvb21SYW5kb21NYXAuUFJFRkVSUkVEX0dST1dUSF9IT1JJWk9OVEFMO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgaXNEaXJlY3Rpb25QcmVmZXJyZWQgKGRpcmVjdGlvbiA6IG51bWJlciwgZ3Jvd3RoIDogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKGdyb3d0aCA9PSBSb29tUmFuZG9tTWFwLlBSRUZFUlJFRF9HUk9XVEhfQU5ZKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERpcmVjdGlvbi5OT1JUSCB8fCBkaXJlY3Rpb24gPT0gRGlyZWN0aW9uLlNPVVRIKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBncm93dGggPT0gUm9vbVJhbmRvbU1hcC5QUkVGRVJSRURfR1JPV1RIX1ZFUlRJQ0FMO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBncm93dGggPT0gUm9vbVJhbmRvbU1hcC5QUkVGRVJSRURfR1JPV1RIX0hPUklaT05UQUw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1NodWZmbGVyLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIlJvb21SYW5kb21NYXAudHNcIiAvPlxyXG5jbGFzcyBTaHVmZmxlckRpcmVjdGlvbiBleHRlbmRzIFNodWZmbGVyPG51bWJlcj4ge1xyXG4gICAgcHJpdmF0ZSBwcmVmZXJyZWRHcm93dGggOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIGRpcmVjdGlvbnNBcnJheSA6IEFycmF5PG51bWJlcj47XHJcbiAgICBwdWJsaWMgcnVubmVyIDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKGFycmF5IDogQXJyYXk8bnVtYmVyPiwgcHJlZmVycmVkR3Jvd3RoIDogbnVtYmVyLCBybmc/IDogKCkgPT4gbnVtYmVyKSB7XHJcbiAgICAgICAgc3VwZXIoYXJyYXksIHJuZyk7XHJcbiAgICAgICAgdGhpcy5wcmVmZXJyZWRHcm93dGggPSBwcmVmZXJyZWRHcm93dGg7XHJcblxyXG4gICAgICAgIGxldCBnb29kRGlyZWN0aW9ucyA9IFtdO1xyXG4gICAgICAgIGxldCBiYWREaXJlY3Rpb25zID0gW107XHJcblxyXG4gICAgICAgIGZvciAobGV0IGRpcmVjdGlvbiA9IHRoaXMuZ2V0T25lKCk7IGRpcmVjdGlvbiAhPSB1bmRlZmluZWQ7IGRpcmVjdGlvbiA9IHRoaXMuZ2V0T25lKCkpIHtcclxuICAgICAgICAgICAgaWYgKFJvb21SYW5kb21NYXAuaXNEaXJlY3Rpb25QcmVmZXJyZWQoZGlyZWN0aW9uLCB0aGlzLnByZWZlcnJlZEdyb3d0aCkpIHtcclxuICAgICAgICAgICAgICAgIGdvb2REaXJlY3Rpb25zLnB1c2goZGlyZWN0aW9uKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGJhZERpcmVjdGlvbnMucHVzaChkaXJlY3Rpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmRpcmVjdGlvbnNBcnJheSA9IGdvb2REaXJlY3Rpb25zLmNvbmNhdChiYWREaXJlY3Rpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgIGdldERpcmVjdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlyZWN0aW9uc0FycmF5W3RoaXMucnVubmVyKytdO1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIlJvb21SYW5kb20udHNcIiAvPlxyXG4vKipcclxuICogRm9kZGVyIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgYSByYW5kb20gcm9vbSwgZXhjZXB0OlxyXG4gKiAxIC0gSXQgbXVzdCBiZSBjcmVhdGVkIGFzIG5lZWRlZCBieSBhIFJlZ2lvblJhbmRvbSBhcyBpdCBhdHRlbXB0cyB0byBwbGFjZSBUcmlja3kgcm9vbXMuXHJcbiAqIDIgLSBJdCBkb2Vzbid0IGNvdW50IHRvd2FyZHMgYSBwbGF5ZXIncyBtYXhpbXVtIHJlbWVtYmVyZWQgcm9vbXNcclxuICovXHJcbmNsYXNzIFJvb21SYW5kb21Gb2RkZXIgZXh0ZW5kcyBSb29tUmFuZG9tIHtcclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoaWQ/IDogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoaWQsIHRydWUpO1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1JlZ2lvbi50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9TaHVmZmxlci50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJTaHVmZmxlckRpcmVjdGlvbi50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJSb29tUmFuZG9tTWFwLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIlJvb21SYW5kb20udHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiUm9vbVJhbmRvbUZvZGRlci50c1wiIC8+XHJcbmludGVyZmFjZSBSYW5kb21pemluZ1Jvb21PcHRpb25zIHtcclxuICAgIHJlZ2lvbiA6IFJlZ2lvblJhbmRvbTtcclxuICAgIHJvb20gOiBSb29tUmFuZG9tO1xyXG4gICAgbWFwIDogUm9vbVJhbmRvbU1hcDtcclxufVxyXG5cclxuY2xhc3MgUmVnaW9uUmFuZG9tIGV4dGVuZHMgUmVnaW9uIHtcclxuICAgIHByaXZhdGUgcmFuZG9taXplZCA9IGZhbHNlO1xyXG4gICAgcHVibGljIG1hcCA6IFJvb21SYW5kb21NYXA7XHJcbiAgICBwdWJsaWMgZm9kZGVyUm9vbUNsYXNzIDogdHlwZW9mIFJvb21SYW5kb20gPSBSb29tUmFuZG9tRm9kZGVyO1xyXG4gICAgcHVibGljIHBsYWNlZFJvb21zIDogQXJyYXk8Um9vbVJhbmRvbT4gPSBbXTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKG5hbWUgOiBzdHJpbmcsIG1hcD8gOiBSb29tUmFuZG9tTWFwKSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSk7XHJcbiAgICAgICAgdGhpcy5tYXAgPSBtYXAgPT0gdW5kZWZpbmVkID8gbmV3IFJvb21SYW5kb21NYXAoKSA6IG1hcDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgcmFuZG9taXplICgpIHtcclxuICAgICAgICBpZiAoIXRoaXMucmFuZG9taXplZCkge1xyXG4gICAgICAgICAgICBhd2FpdCBSZWdpb25SYW5kb20ucnVsZWJvb2tSYW5kb21pemVSZWdpb24uZXhlY3V0ZSh7XHJcbiAgICAgICAgICAgICAgICBub3VuIDogdGhpc1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBybmcgOiAoKSA9PiBudW1iZXIgPSAoKSA9PiB7IHJldHVybiBNYXRoLnJhbmRvbSgpOyB9O1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgcnVsZWJvb2tSYW5kb21pemVSZWdpb24gPSBuZXcgUnVsZWJvb2s8UmVnaW9uPihcIlJhbmRvbWl6aW5nIFJhbmRvbSBSZWdpb24gc29tZXRoaW5nXCIpO1xyXG4gICAgcHVibGljIHN0YXRpYyBydWxlYm9va1BsYWNlUm9vbSA9IG5ldyBSdWxlYm9vazxSYW5kb21pemluZ1Jvb21PcHRpb25zPihcIlBsYWNpbmcgUmFuZG9tIFJvb20gc29tZXRoaW5nXCIpO1xyXG4gICAgcHVibGljIHN0YXRpYyBydWxlYm9va0JlZm9yZVBsYWNlUm9vbSA9IG5ldyBSdWxlYm9vazxSYW5kb21pemluZ1Jvb21PcHRpb25zPihcIkJlZm9yZSBwbGFjaW5nIFJhbmRvbSBSb29tIHNvbWV0aGluZ1wiKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgcnVsZWJvb2tBZnRlclBsYWNlUm9vbSA9IG5ldyBSdWxlYm9vazxSYW5kb21pemluZ1Jvb21PcHRpb25zPihcIkFmdGVyIHBsYWNpbmcgUmFuZG9tIFJvb20gc29tZXRoaW5nXCIpO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgcnVsZUZpcnN0UmFuZG9taXplUmVnaW9uID0gUmVnaW9uUmFuZG9tLnJ1bGVib29rUmFuZG9taXplUmVnaW9uLmNyZWF0ZUFuZEFkZFJ1bGUoe1xyXG4gICAgICAgIG5hbWUgOiBcIkVtcHR5IG1hcCBjYWNoZSB0byBzdGFydCByYW5kb21pemluZyByZWdpb25cIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9ISUdIRVNULFxyXG4gICAgICAgIGNvZGUgOiBydW5uZXIgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcmVnaW9uID0gPFJlZ2lvblJhbmRvbT4gcnVubmVyLm5vdW47XHJcblxyXG4gICAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIGNvbm5lY3QgYSByZWdpb24gdG8gYW5vdGhlciByZWdpb24gdW5pbnRlbnRpb25hbGx5XHJcbiAgICAgICAgICAgIHJlZ2lvbi5tYXAuZW1wdHlDYWNoZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgcnVsZUJhc2ljUmFuZG9taXplUmVnaW9uID0gUmVnaW9uUmFuZG9tLnJ1bGVib29rUmFuZG9taXplUmVnaW9uLmNyZWF0ZUFuZEFkZFJ1bGUoe1xyXG4gICAgICAgIG5hbWUgOiBcIlJhbmRvbWl6ZSBhbGwgdW5wbGFjZWQsIHJhbmRvbWl6YWJsZSByb29tcyBpbiByZWdpb24gc29tZXRoaW5nXCIsXHJcbiAgICAgICAgY29kZSA6IGFzeW5jIHJ1bm5lciA9PiB7XHJcbiAgICAgICAgICAgIGxldCByZWdpb24gPSA8UmVnaW9uUmFuZG9tPiBydW5uZXIubm91bjtcclxuXHJcbiAgICAgICAgICAgIGxldCByb29tU2h1ZmZsZXIgPSBuZXcgU2h1ZmZsZXIoXHJcbiAgICAgICAgICAgICAgICBSZWdpb24uSW5SZWxhdGlvbi5nZXRBbGxSaWdodFR5cGVzKHJlZ2lvbiwgUm9vbVJhbmRvbSkuZmlsdGVyKChyb29tIDogUm9vbVJhbmRvbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByb29tLnJhbmRvbWl6YWJsZSAmJiAhcm9vbS5wbGFjZWQgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgKHJvb20gPT0gV29ybGRTdGF0ZS5wbGF5ZXIuZ2V0Um9vbSgpIHx8IChSZWdpb25SYW5kb20ucm5nKCkgKiAxMDApIDw9IHJvb20uYXBwZWFyQ2hhbmNlKTtcclxuICAgICAgICAgICAgICAgIH0pLCBSZWdpb25SYW5kb20ucm5nXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCByb29tID0gcm9vbVNodWZmbGVyLmdldE9uZSgpOyByb29tICE9IHVuZGVmaW5lZDsgcm9vbSA9IHJvb21TaHVmZmxlci5nZXRPbmUoKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gUHJldmVudCBhdmFpbGFibGUgY29ubmVjdGlvbnMgZnJvbSBnZXR0aW5nIHRvbyBsb3dcclxuICAgICAgICAgICAgICAgIC8vIElmIHdlJ3JlIHBsYWNpbmcgcm9vbXMgd2l0aCB0b28gZmV3IGF2YWlsYWJsZUNvbm5lY3Rpb25zLCB3ZSBtaWdodCBlbmQgdXAgcmVhY2hpbmcgMCBhdmFpbGFibGVDb25uZWN0aW9uc1xyXG4gICAgICAgICAgICAgICAgLy8gV2hpY2ggd291bGQgbWVhbiBubyBtb3JlIHJvb21zIGNhbiBiZSBwbGFjZWQuXHJcbiAgICAgICAgICAgICAgICB3aGlsZSAocmVnaW9uLm1hcC5yb29tcyA+IDAgJiYgcmVnaW9uLm1hcC5nZXRBdmFpbGFibGVDb25uZWN0aW9ucygpIDwgNCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmb2RkZXIgPSBuZXcgcmVnaW9uLmZvZGRlclJvb21DbGFzcygpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBvcHRpb25zID0gPFJhbmRvbWl6aW5nUm9vbU9wdGlvbnM+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwIDogcmVnaW9uLm1hcCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm9vbSA6IGZvZGRlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uIDogcmVnaW9uXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmVnaW9uLnBsYWNlKGZvZGRlcik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IFJlZ2lvblJhbmRvbS5ydWxlYm9va0JlZm9yZVBsYWNlUm9vbS5leGVjdXRlKHtub3VuIDogb3B0aW9uc30pO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IFJlZ2lvblJhbmRvbS5ydWxlYm9va1BsYWNlUm9vbS5leGVjdXRlKHtub3VuIDogb3B0aW9uc30pO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IFJlZ2lvblJhbmRvbS5ydWxlYm9va0FmdGVyUGxhY2VSb29tLmV4ZWN1dGUoe25vdW4gOiBvcHRpb25zfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSA8UmFuZG9taXppbmdSb29tT3B0aW9ucz4ge1xyXG4gICAgICAgICAgICAgICAgICAgIG1hcCA6IHJlZ2lvbi5tYXAsXHJcbiAgICAgICAgICAgICAgICAgICAgcm9vbSA6IHJvb20sXHJcbiAgICAgICAgICAgICAgICAgICAgcmVnaW9uIDogcmVnaW9uXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgUmVnaW9uUmFuZG9tLnJ1bGVib29rQmVmb3JlUGxhY2VSb29tLmV4ZWN1dGUoe25vdW4gOiBvcHRpb25zfSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBSZWdpb25SYW5kb20ucnVsZWJvb2tQbGFjZVJvb20uZXhlY3V0ZSh7bm91biA6IG9wdGlvbnN9KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IFJlZ2lvblJhbmRvbS5ydWxlYm9va0FmdGVyUGxhY2VSb29tLmV4ZWN1dGUoe25vdW4gOiBvcHRpb25zfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCFyb29tLnBsYWNlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5wcmludEFzRXJyb3IobmV3IFNheShcIldhcyB1bmFibGUgdG8gcGxhY2Ugcm9vbSBcIiwgcm9vbSwgXCIuIEdhbWUgbWlnaHQgYmUgdW5wbGF5YWJsZS5cIikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBydWxlQWRkRXh0cmFDb25uZWN0aW9ucyA9IFJlZ2lvblJhbmRvbS5ydWxlYm9va1JhbmRvbWl6ZVJlZ2lvbi5jcmVhdGVBbmRBZGRSdWxlKHtcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9MT1dFU1QsXHJcbiAgICAgICAgbmFtZSA6IFwiQWRkIGV4dHJhIGNvbm5lY3Rpb25zIHRvIHJvb21zIGluIHJlZ2lvblwiLFxyXG4gICAgICAgIGNvZGUgOiBydW5uZXIgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcmVnaW9uID0gPFJlZ2lvblJhbmRvbT4gcnVubmVyLm5vdW47XHJcbiAgICAgICAgICAgIGxldCBwbGFjZWRSb29tcyA9IFJlZ2lvbi5JblJlbGF0aW9uLmdldEFsbFJpZ2h0VHlwZXMocmVnaW9uLCBSb29tUmFuZG9tKS5maWx0ZXIoKHJvb20gOiBSb29tUmFuZG9tKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcm9vbS5yYW5kb21pemFibGUgJiYgcm9vbS5wbGFjZWQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcGxhY2VkUm9vbXMuZm9yRWFjaCgocm9vbSA6IFJvb21SYW5kb20pID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBteUNvb3JkaW5hdGVzID0gcmVnaW9uLm1hcC5nZXRDb29yZGluYXRlcyhyb29tKTtcclxuICAgICAgICAgICAgICAgIGxldCBkaXJlY3Rpb25TaHVmZmxlciA9IG5ldyBTaHVmZmxlcjxudW1iZXI+KHJvb20uY29ubmVjdGFibGVPbi5zbGljZSgwKSwgUmVnaW9uUmFuZG9tLnJuZyk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkaXJlY3Rpb24gPSBkaXJlY3Rpb25TaHVmZmxlci5nZXRPbmUoKTsgZGlyZWN0aW9uICE9IHVuZGVmaW5lZCAmJiAoUmVnaW9uUmFuZG9tLnJuZygpICogMTAwKSA8PSByb29tLmV4dHJhQ29ubmVjdGlvbkNoYW5jZTsgZGlyZWN0aW9uID0gZGlyZWN0aW9uU2h1ZmZsZXIuZ2V0T25lKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocm9vbS5jb25uZWN0aW9uc1tkaXJlY3Rpb25dID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3RoZXJDb29yZGluYXRlcyA9IFJvb20uc2hpZnQobXlDb29yZGluYXRlcywgZGlyZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG90aGVyUm9vbSA9IHJlZ2lvbi5tYXAuZ2V0Um9vbShvdGhlckNvb3JkaW5hdGVzWzBdLCBvdGhlckNvb3JkaW5hdGVzWzFdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG90aGVyUm9vbSAhPSB1bmRlZmluZWQgJiYgb3RoZXJSb29tLnJhbmRvbWl6YWJsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgb3RoZXJSb29tLmlzQ29ubmVjdGFibGVPbihPcHBvc2l0ZURpcmVjdGlvbltEaXJlY3Rpb25bZGlyZWN0aW9uXV0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoUmVnaW9uUmFuZG9tLnJuZygpICogMTAwKSA8PSBvdGhlclJvb20uZXh0cmFDb25uZWN0aW9uQ2hhbmNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb29tLm1hcFJvb20ob3RoZXJSb29tLCBkaXJlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHJ1bGVQbGFjZUZpcnN0Um9vbSA9IFJlZ2lvblJhbmRvbS5ydWxlYm9va1BsYWNlUm9vbS5jcmVhdGVBbmRBZGRSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJQbGFjaW5nIEZpcnN0IHJvb20gc29tZXRoaW5nXCIsXHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfSElHSEVTVCxcclxuICAgICAgICBjb2RlIDogcnVubmVyID0+IHtcclxuICAgICAgICAgICAgbGV0IHBsYWNpbmdPcHRpb25zID0gPFJhbmRvbWl6aW5nUm9vbU9wdGlvbnM+IHJ1bm5lci5ub3VuO1xyXG5cclxuICAgICAgICAgICAgaWYgKHBsYWNpbmdPcHRpb25zLm1hcC5pc0ZyZWUoMCwgMCkpIHtcclxuICAgICAgICAgICAgICAgIHBsYWNpbmdPcHRpb25zLm1hcC5tYXAocGxhY2luZ09wdGlvbnMucm9vbSwgMCwgMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29uZGl0aW9ucyA6IHJ1bm5lciA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBydW5uZXIubm91bi5tYXAucm9vbXMgPT0gMDtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHJ1bGVQbGFjZU5vblRyaWNreVJvb20gPSBSZWdpb25SYW5kb20ucnVsZWJvb2tQbGFjZVJvb20uY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiUGxhY2luZyBub24tdHJpY2t5IHJvb20gc29tZXRoaW5nXCIsXHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfSElHSCxcclxuICAgICAgICBjb2RlIDogcnVubmVyID0+IHtcclxuICAgICAgICAgICAgbGV0IHBsYWNpbmdPcHRpb25zID0gPFJhbmRvbWl6aW5nUm9vbU9wdGlvbnM+IHJ1bm5lci5ub3VuO1xyXG5cclxuXHJcbiAgICAgICAgICAgIC8vbGV0IGRpcmVjdGlvblNodWZmbGVyID0gbmV3IFNodWZmbGVyPG51bWJlcj4ocGxhY2luZ09wdGlvbnMucm9vbS5jb25uZWN0YWJsZU9uKTtcclxuICAgICAgICAgICAgbGV0IHByZWZlcnJlZEdyb3d0aERpcmVjdGlvbiA9IHBsYWNpbmdPcHRpb25zLm1hcC5nZXRQcmVmZXJyZWRHcm93dGgoKTtcclxuICAgICAgICAgICAgbGV0IGRpcmVjdGlvblNodWZmbGVyID0gbmV3IFNodWZmbGVyRGlyZWN0aW9uKHBsYWNpbmdPcHRpb25zLnJvb20uY29ubmVjdGFibGVPbiwgcHJlZmVycmVkR3Jvd3RoRGlyZWN0aW9uKTtcclxuICAgICAgICAgICAgLy9mb3IgKGxldCBkaXJlY3Rpb24gPSBkaXJlY3Rpb25TaHVmZmxlci5nZXRPbmUoKTsgZGlyZWN0aW9uICE9IHVuZGVmaW5lZDsgZGlyZWN0aW9uID0gZGlyZWN0aW9uU2h1ZmZsZXIuZ2V0T25lKCkpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgZGlyZWN0aW9uID0gZGlyZWN0aW9uU2h1ZmZsZXIuZ2V0RGlyZWN0aW9uKCk7IGRpcmVjdGlvbiAhPSB1bmRlZmluZWQ7IGRpcmVjdGlvbiA9IGRpcmVjdGlvblNodWZmbGVyLmdldERpcmVjdGlvbigpKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgb3Bwb3NpdGVEaXJlY3Rpb24gPSBPcHBvc2l0ZURpcmVjdGlvbltEaXJlY3Rpb25bZGlyZWN0aW9uXV07XHJcbiAgICAgICAgICAgICAgICBsZXQgY29ubmVjdGFibGVSb29tID0gcGxhY2luZ09wdGlvbnMubWFwLmdldEFueUZyb21DYWNoZShvcHBvc2l0ZURpcmVjdGlvbik7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGFibGVSb29tICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBvdGhlckNvb3JkaW5hdGVzID0gcGxhY2luZ09wdGlvbnMubWFwLmdldENvb3JkaW5hdGVzKGNvbm5lY3RhYmxlUm9vbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG15Q29vcmRpbmF0ZXMgPSBSb29tLnNoaWZ0KG90aGVyQ29vcmRpbmF0ZXMsIG9wcG9zaXRlRGlyZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBwbGFjaW5nT3B0aW9ucy5yb29tLm1hcFJvb20oY29ubmVjdGFibGVSb29tLCBkaXJlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIHBsYWNpbmdPcHRpb25zLm1hcC5tYXAocGxhY2luZ09wdGlvbnMucm9vbSwgbXlDb29yZGluYXRlc1swXSwgbXlDb29yZGluYXRlc1sxXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbmRpdGlvbnMgOiBydW5uZXIgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gcnVubmVyLm5vdW4ucm9vbS50cmlja3lDb2RlID09IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHJ1bGVQbGFjZVRyaWNreVJvb20gPSBSZWdpb25SYW5kb20ucnVsZWJvb2tQbGFjZVJvb20uY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiUGxhY2luZyB0cmlja3kgcm9vbSBzb21ldGhpbmdcIixcclxuICAgICAgICBjb2RlIDogcnVubmVyID0+IHtcclxuICAgICAgICAgICAgbGV0IHBsYWNpbmdPcHRpb25zID0gPFJhbmRvbWl6aW5nUm9vbU9wdGlvbnM+IHJ1bm5lci5ub3VuO1xyXG4gICAgICAgICAgICBsZXQgcGxhY2VkUm9vbXMgPSA8QXJyYXk8Um9vbVJhbmRvbT4+IHBsYWNpbmdPcHRpb25zLnJlZ2lvbi5nZXRSb29tcygpLmZpbHRlcigocm9vbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJvb20gaW5zdGFuY2VvZiBSb29tUmFuZG9tICYmIHJvb20ucGxhY2VkO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwbGFjZWRSb29tcy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgRWxlbWVudHMuQ3VycmVudFR1cm5IYW5kbGVyLnByaW50QXNFcnJvcihcIlVuYWJsZSB0byBwbGFjZSByb29tIFwiICsgcGxhY2luZ09wdGlvbnMucm9vbS5nZXRQcmludGVkTmFtZSgpICsgXCI6IFRoZXJlIGFyZSBubyByb29tcyB0byBjb25uZWN0IHRvIVwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHJvb21TaHVmZmxlciA9IG5ldyBTaHVmZmxlcihwbGFjZWRSb29tcywgUmVnaW9uUmFuZG9tLnJuZyk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGNvbm5lY3RhYmxlUm9vbSA9IHJvb21TaHVmZmxlci5nZXRPbmUoKTsgY29ubmVjdGFibGVSb29tICE9IHVuZGVmaW5lZDsgY29ubmVjdGFibGVSb29tID0gcm9vbVNodWZmbGVyLmdldE9uZSgpKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdHJpY2tpZXIgPSA8VHJpY2tpZXJPcHRpb25zPiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVnaW9uIDogcGxhY2luZ09wdGlvbnMucmVnaW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIG1hcCA6IHBsYWNpbmdPcHRpb25zLm1hcCxcclxuICAgICAgICAgICAgICAgICAgICBvdGhlclJvb20gOiBjb25uZWN0YWJsZVJvb21cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBsZXQgdHJpY2t5ID0gcGxhY2luZ09wdGlvbnMucm9vbS5nZXRBbnlEaXJlY3Rpb24odHJpY2tpZXIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRyaWNreSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBwbGFjaW5nT3B0aW9ucy5yb29tLm1hcFJvb20oY29ubmVjdGFibGVSb29tLCB0cmlja3kudHJpY2t5Um9vbURpcmVjdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2luZ09wdGlvbnMubWFwLm1hcChwbGFjaW5nT3B0aW9ucy5yb29tLCB0cmlja3kueCwgdHJpY2t5LnkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBUSElTIFdPUktTXHJcbiAgICAgICAgICAgIC8vIEkgRE9OJ1QgS05PVyBXSFlcclxuICAgICAgICAgICAgLy8gSSBET04nVCBDQVJFIFdIWVxyXG4gICAgICAgICAgICAvLyBMRUFWRVxyXG4gICAgICAgICAgICBsZXQgY29ubmVjdGFibGVUaHJvdWdoRm9kZGVyID0gKGZvZGRlclN0ZXAgOiBudW1iZXIsIGNvbm5lY3RpbmdSb29tIDogUm9vbVJhbmRvbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IHRyaWNraWVyID0gPFRyaWNraWVyT3B0aW9ucz4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlZ2lvbiA6IHBsYWNpbmdPcHRpb25zLnJlZ2lvbixcclxuICAgICAgICAgICAgICAgICAgICBtYXAgOiBwbGFjaW5nT3B0aW9ucy5tYXAsXHJcbiAgICAgICAgICAgICAgICAgICAgb3RoZXJSb29tIDogY29ubmVjdGluZ1Jvb21cclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGZvZGRlclN0ZXAgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGFjaW5nT3B0aW9ucy5yb29tLmdldEFueURpcmVjdGlvbih0cmlja2llcik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdGb2RkZXIgPSBuZXcgKHBsYWNpbmdPcHRpb25zLnJlZ2lvbi5mb2RkZXJSb29tQ2xhc3MpKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9sZXQgZGlyZWN0aW9uU2h1ZmZsZXIgPSBuZXcgU2h1ZmZsZXI8bnVtYmVyPihuZXdGb2RkZXIuY29ubmVjdGFibGVPbiwgUmVnaW9uUmFuZG9tLnJuZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByZWZlcnJlZEdyb3d0aERpcmVjdGlvbiA9IHBsYWNpbmdPcHRpb25zLm1hcC5nZXRQcmVmZXJyZWRHcm93dGgoKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZGlyZWN0aW9uU2h1ZmZsZXIgPSBuZXcgU2h1ZmZsZXJEaXJlY3Rpb24ocGxhY2luZ09wdGlvbnMucm9vbS5jb25uZWN0YWJsZU9uLCBwcmVmZXJyZWRHcm93dGhEaXJlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGRpcmVjdGlvbiA9IGRpcmVjdGlvblNodWZmbGVyLmdldERpcmVjdGlvbigpOyBkaXJlY3Rpb24gIT0gdW5kZWZpbmVkOyBkaXJlY3Rpb24gPSBkaXJlY3Rpb25TaHVmZmxlci5nZXREaXJlY3Rpb24oKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3Bwb3NpdGVEaXJlY3Rpb24gPSBPcHBvc2l0ZURpcmVjdGlvbltEaXJlY3Rpb25bZGlyZWN0aW9uXV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvdGhlckNvb3JkaW5hdGVzID0gcGxhY2luZ09wdGlvbnMubWFwLmdldENvb3JkaW5hdGVzKGNvbm5lY3RpbmdSb29tKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdvdWxkYmVDb29yZGluYXRlcyA9IFJvb20uc2hpZnQob3RoZXJDb29yZGluYXRlcywgb3Bwb3NpdGVEaXJlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm9kZGVyVHJpY2t5ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJSb29tIDogY29ubmVjdGluZ1Jvb20sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlclJvb21EaXJlY3Rpb24gOiBvcHBvc2l0ZURpcmVjdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWNreVJvb21EaXJlY3Rpb24gOiBkaXJlY3Rpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAgOiBwbGFjaW5nT3B0aW9ucy5tYXAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24gOiBwbGFjaW5nT3B0aW9ucy5yZWdpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IDogd291bGRiZUNvb3JkaW5hdGVzWzBdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA6IHdvdWxkYmVDb29yZGluYXRlc1sxXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0ZvZGRlci5pc1BsYWNlYWJsZShmb2RkZXJUcmlja3kpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb2RkZXIubWFwUm9vbShjb25uZWN0aW5nUm9vbSwgZm9kZGVyVHJpY2t5LnRyaWNreVJvb21EaXJlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2luZ09wdGlvbnMubWFwLm1hcChuZXdGb2RkZXIsIGZvZGRlclRyaWNreS54LCBmb2RkZXJUcmlja3kueSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRUcmlja3kgPSBjb25uZWN0YWJsZVRocm91Z2hGb2RkZXIoZm9kZGVyU3RlcCAtIDEsIG5ld0ZvZGRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dFRyaWNreSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjaW5nT3B0aW9ucy5yZWdpb24ucGxhY2UobmV3Rm9kZGVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dFRyaWNreTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9kZGVyLnVubWFwUm9vbShmb2RkZXJUcmlja3kudHJpY2t5Um9vbURpcmVjdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2luZ09wdGlvbnMubWFwLnVubWFwKGZvZGRlclRyaWNreS54LCBmb2RkZXJUcmlja3kueSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBmb2RkZXJMZXZlbCA9IDE7IGZvZGRlckxldmVsIDwgMTA7IGZvZGRlckxldmVsKyspIHtcclxuICAgICAgICAgICAgICAgIHJvb21TaHVmZmxlci5yZXN0YXJ0KCk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjb25uZWN0YWJsZVJvb20gPSByb29tU2h1ZmZsZXIuZ2V0T25lKCk7IGNvbm5lY3RhYmxlUm9vbSAhPSB1bmRlZmluZWQ7IGNvbm5lY3RhYmxlUm9vbSA9IHJvb21TaHVmZmxlci5nZXRPbmUoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB0cmlja3kgPSBjb25uZWN0YWJsZVRocm91Z2hGb2RkZXIoZm9kZGVyTGV2ZWwsIGNvbm5lY3RhYmxlUm9vbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyaWNreSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2luZ09wdGlvbnMucm9vbS5tYXBSb29tKHRyaWNreS5vdGhlclJvb20sIHRyaWNreS50cmlja3lSb29tRGlyZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2luZ09wdGlvbnMubWFwLm1hcChwbGFjaW5nT3B0aW9ucy5yb29tLCB0cmlja3kueCwgdHJpY2t5LnkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5wcmludEFzRXJyb3IoXCJVbmFibGUgdG8gcGxhY2Ugcm9vbSBcIiArIHBsYWNpbmdPcHRpb25zLnJvb20uZ2V0UHJpbnRlZE5hbWUoKSArIFwiOiBBbGwgYXR0ZW1wdHMgZmFpbGVkXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiU3RvcmVkVmFyaWFibGUudHNcIiAvPlxyXG5pbnRlcmZhY2UgU2F2ZWRFdmVudE9wdGlvbnM8VD4gZXh0ZW5kcyBTdG9yZWRWYXJpYWJsZU9wdGlvbnM8VD4ge1xyXG4gICAgZGVzY3JpcHRpb24gOiBzdHJpbmc7XHJcbiAgICB2YWx1ZURlc2NyaXB0aW9uIDogKHZhbHVlIDogVCkgPT4gc3RyaW5nO1xyXG59XHJcblxyXG5jbGFzcyBTYXZlZEV2ZW50PFQ+IGV4dGVuZHMgU3RvcmVkVmFyaWFibGU8VD4ge1xyXG4gICAgcHJpdmF0ZSBkZXNjcmlwdGlvbiA6IHN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgZ2V0VmFsdWVEZXNjcmlwdGlvbiA6ICh2YWx1ZSA6IFQpID0+IHN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKG9wdGlvbnMgOiBTYXZlZEV2ZW50T3B0aW9uczxUPikge1xyXG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xyXG5cclxuICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gb3B0aW9ucy5kZXNjcmlwdGlvbjtcclxuICAgICAgICB0aGlzLmdldFZhbHVlRGVzY3JpcHRpb24gPSBvcHRpb25zLnZhbHVlRGVzY3JpcHRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldERlc2NyaXB0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbi8vRXhhbXBsZVxyXG5sZXQgRVZFTlRfT1JDX0NISUVGX0tJTExFRCA9IG5ldyBTYXZlZEV2ZW50PGJvb2xlYW4+KFxyXG4gICAgPFNhdmVkRXZlbnRPcHRpb25zPGJvb2xlYW4+PiB7XHJcbiAgICAgICAgaWQ6IFwiRVZFTlRfT1JDX0NISUVGX0tJTExFRFwiLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIkRlc2NyaWJlciB3aGV0aGVyIHRoZSBvcmMgY2hpZWYgaXMgYWxpdmUgb3IgZGVhZC5cIixcclxuICAgICAgICB2YWx1ZTogZmFsc2UsXHJcbiAgICAgICAgdmFsdWVEZXNjcmlwdGlvbjogKHZhbHVlOiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChFVkVOVF9PUkNfQ0hJRUZfS0lMTEVELnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJUaGUgb3JjIGNoaWVmIGhhcyBiZWVuIGtpbGxlZC5cIjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIlRoZSBvcmMgY2hpZWYgaXMgYWxpdmUuXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuKTtcclxuIiwiaW50ZXJmYWNlIFRlc3RpbmdPcHRpb25zIHtcclxuICAgIG5hbWUgOiBzdHJpbmc7XHJcbiAgICB2YWx1ZSA6IG51bWJlcjtcclxufVxyXG5cclxuY2xhc3MgRGljZSB7XHJcbiAgICBwcm90ZWN0ZWQgcmFuZ2UgOiBBcnJheTxudW1iZXI+ID0gWzAsIDAsIDEsIDFdO1xyXG4gICAgcHVibGljIG1pblJlc3VsdCA9IDA7XHJcbiAgICBwcm90ZWN0ZWQgdGVzdFN0cmluZyA6IHN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKHRlc3RTdHJpbmcgOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLnRlc3RTdHJpbmcgPSB0ZXN0U3RyaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByb2xsIChzdGF0IDogbnVtYmVyKSA6IEFycmF5PG51bWJlcj4gIHtcclxuICAgICAgICBsZXQgcm5nID0gdGhpcy5yYW5nZS5zbGljZSgpO1xyXG4gICAgICAgIGlmIChzdGF0ID49IDEwKSB7XHJcbiAgICAgICAgICAgIHJuZy5wdXNoKDIsIDEpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdCA+PSA3KSB7XHJcbiAgICAgICAgICAgIHJuZy5wdXNoKDEsIDEpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdCA+PSA0KSB7XHJcbiAgICAgICAgICAgIHJuZy5wdXNoKDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcmVzdWx0cyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhdDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBpbmRleCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChybmcubGVuZ3RoKSk7XHJcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChybmdbaW5kZXhdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFRPRE86IFByaW50IHRoZSBkaWNlIHJlc3VsdHMgaWYgTWVtb3J5LlNob3dEaWNlID0gMVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0cztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHN1bSAoYSwgYikge1xyXG4gICAgICAgIHJldHVybiBhICsgYjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0U2F5IChyZXN1bHRzIDogQXJyYXk8bnVtYmVyPikgOiBTYXkge1xyXG4gICAgICAgIGxldCBmaW5hbFJlc3VsdCA9IHJlc3VsdHMucmVkdWNlKERpY2Uuc3VtKTtcclxuICAgICAgICByZXR1cm4gbmV3IFNheShcclxuICAgICAgICAgICAgbmV3IFNheUJvbGQoXCJbXCIsIHRoaXMudGVzdFN0cmluZywgXCJdIFwiKSxcclxuICAgICAgICAgICAgXCIgPSBbXCIsIHJlc3VsdHMuam9pbihcIl0gW1wiKSwgXCJdXCIsXHJcbiAgICAgICAgICAgIHJlc3VsdHMubGVuZ3RoID09IDEgPyBcIlwiIDpcclxuICAgICAgICAgICAgICAgIChcIiA9IFwiICsgZmluYWxSZXN1bHQpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHRlc3RBZ2FpbnN0Um9sbCAocGxheWVyIDogVGVzdGluZ09wdGlvbnMsIGVuZW15IDogVGVzdGluZ09wdGlvbnMpIDogbnVtYmVyIHtcclxuICAgICAgICBsZXQgcGxheWVyRGljZSA9IG5ldyBEaWNlKHBsYXllci5uYW1lKTtcclxuICAgICAgICBsZXQgcGxheWVyUmVzdWx0ID0gcGxheWVyRGljZS5yb2xsKHBsYXllci52YWx1ZSk7XHJcbiAgICAgICAgbGV0IGVuZW15RGljZSA9IG5ldyBEaWNlKGVuZW15Lm5hbWUpO1xyXG4gICAgICAgIGxldCBlbmVteVJlc3VsdCA9IGVuZW15RGljZS5yb2xsKGVuZW15LnZhbHVlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHBsYXllclJlc3VsdC5yZWR1Y2UoRGljZS5zdW0pIC0gZW5lbXlSZXN1bHQucmVkdWNlKERpY2Uuc3VtKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHRlc3RBZ2FpbnN0RGlmZmljdWx0eSAocGxheWVyIDogVGVzdGluZ09wdGlvbnMsIGRpZmZpY3VsdHkgOiBudW1iZXIpIDogbnVtYmVyIHtcclxuICAgICAgICBsZXQgcGxheWVyRGljZSA9IG5ldyBEaWNlKHBsYXllci5uYW1lKTtcclxuICAgICAgICBsZXQgcGxheWVyUmVzdWx0ID0gcGxheWVyRGljZS5yb2xsKHBsYXllci52YWx1ZSk7XHJcbiAgICAgICAgcmV0dXJuIHBsYXllclJlc3VsdC5yZWR1Y2UoRGljZS5zdW0pIC0gZGlmZmljdWx0eTtcclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJEaWNlLnRzXCIgLz5cclxuY2xhc3MgRGljZUNvbW1vbiBleHRlbmRzIERpY2Uge1xyXG4gICAgcHJvdGVjdGVkIHJhbmdlIDogQXJyYXk8bnVtYmVyPiA9IFstMSwgMCwgMCwgMCwgMSwgMSwgMV07XHJcbiAgICBwdWJsaWMgbWluUmVzdWx0ID0gLTE7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyB0ZXN0QWdhaW5zdFJvbGwgKHBsYXllciA6IFRlc3RpbmdPcHRpb25zLCBlbmVteSA6IFRlc3RpbmdPcHRpb25zKSA6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHBsYXllckRpY2UgPSBuZXcgRGljZUNvbW1vbihwbGF5ZXIubmFtZSk7XHJcbiAgICAgICAgbGV0IHBsYXllclJlc3VsdCA9IHBsYXllckRpY2Uucm9sbChwbGF5ZXIudmFsdWUpO1xyXG4gICAgICAgIGxldCBlbmVteURpY2UgPSBuZXcgRGljZUNvbW1vbihlbmVteS5uYW1lKTtcclxuICAgICAgICBsZXQgZW5lbXlSZXN1bHQgPSBlbmVteURpY2Uucm9sbChlbmVteS52YWx1ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiBwbGF5ZXJSZXN1bHQucmVkdWNlKERpY2Uuc3VtKSAtIGVuZW15UmVzdWx0LnJlZHVjZShEaWNlLnN1bSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyB0ZXN0QWdhaW5zdERpZmZpY3VsdHkgKHBsYXllciA6IFRlc3RpbmdPcHRpb25zLCBkaWZmaWN1bHR5IDogbnVtYmVyKSA6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHBsYXllckRpY2UgPSBuZXcgRGljZUNvbW1vbihwbGF5ZXIubmFtZSk7XHJcbiAgICAgICAgbGV0IHBsYXllclJlc3VsdCA9IHBsYXllckRpY2Uucm9sbChwbGF5ZXIudmFsdWUpO1xyXG4gICAgICAgIHJldHVybiBwbGF5ZXJSZXN1bHQucmVkdWNlKERpY2Uuc3VtKSAtIGRpZmZpY3VsdHk7XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiRGljZS50c1wiIC8+XHJcbmNsYXNzIERpY2VEYW5nZXJvdXMgZXh0ZW5kcyBEaWNlIHtcclxuICAgIHByb3RlY3RlZCByYW5nZSA6IEFycmF5PG51bWJlcj4gPSBbLTIsIC0xLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxXTtcclxuICAgIHB1YmxpYyBtaW5SZXN1bHQgPSAtMjtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHRlc3RBZ2FpbnN0Um9sbCAocGxheWVyIDogVGVzdGluZ09wdGlvbnMsIGVuZW15IDogVGVzdGluZ09wdGlvbnMpIDogbnVtYmVyIHtcclxuICAgICAgICBsZXQgcGxheWVyRGljZSA9IG5ldyBEaWNlRGFuZ2Vyb3VzKHBsYXllci5uYW1lKTtcclxuICAgICAgICBsZXQgcGxheWVyUmVzdWx0ID0gcGxheWVyRGljZS5yb2xsKHBsYXllci52YWx1ZSk7XHJcbiAgICAgICAgbGV0IGVuZW15RGljZSA9IG5ldyBEaWNlRGFuZ2Vyb3VzKGVuZW15Lm5hbWUpO1xyXG4gICAgICAgIGxldCBlbmVteVJlc3VsdCA9IGVuZW15RGljZS5yb2xsKGVuZW15LnZhbHVlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHBsYXllclJlc3VsdC5yZWR1Y2UoRGljZS5zdW0pIC0gZW5lbXlSZXN1bHQucmVkdWNlKERpY2Uuc3VtKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHRlc3RBZ2FpbnN0RGlmZmljdWx0eSAocGxheWVyIDogVGVzdGluZ09wdGlvbnMsIGRpZmZpY3VsdHkgOiBudW1iZXIpIDogbnVtYmVyIHtcclxuICAgICAgICBsZXQgcGxheWVyRGljZSA9IG5ldyBEaWNlRGFuZ2Vyb3VzKHBsYXllci5uYW1lKTtcclxuICAgICAgICBsZXQgcGxheWVyUmVzdWx0ID0gcGxheWVyRGljZS5yb2xsKHBsYXllci52YWx1ZSk7XHJcbiAgICAgICAgcmV0dXJuIHBsYXllclJlc3VsdC5yZWR1Y2UoRGljZS5zdW0pIC0gZGlmZmljdWx0eTtcclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9UaGluZy50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi9FbGVtZW50cy9DbGFzc2VzL1NheS9PbmVPZi50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9SdWxlYm9vay50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9SdWxlLnRzXCIgLz5cclxuaW50ZXJmYWNlIExpcXVpZE9wdGlvbnMgZXh0ZW5kcyBUaGluZ09wdGlvbnMge1xyXG4gICAgdGFzdGU/IDogT25lT2Y7XHJcbn1cclxuXHJcbmludGVyZmFjZSBMaXF1aWRDb250YWluZXIge1xyXG4gICAgbGlxdWlkQ29udGVudHMgOiBBcnJheTxMaXF1aWQ+O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgTGlxdWlkTWl4dHVyZSB7XHJcbiAgICBxdWFudGl0aWVzIDogTWFwPGFueSwgbnVtYmVyPjtcclxuICAgIHJlc3VsdCA6IExpcXVpZDtcclxuICAgIHF1YW50aXR5TXVsdGlwbGllcj8gOiBudW1iZXI7XHJcbiAgICBmaXJzdFByaW9yaXR5IDogbnVtYmVyO1xyXG4gICAgcHJpb3JpdHkgOiBudW1iZXI7XHJcbn1cclxuXHJcbmNsYXNzIExpcXVpZCBleHRlbmRzIFRoaW5nIHtcclxuICAgIHB1YmxpYyB0YXN0ZSA6IE9uZU9mO1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChvcHRpb25zPyA6IExpcXVpZE9wdGlvbnMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zKTtcclxuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyA9PSB1bmRlZmluZWQgPyB7fSA6IG9wdGlvbnM7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMudGFzdGUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGFzdGUgPSBvcHRpb25zLnRhc3RlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudGFzdGUgPSBuZXcgT25lT2YoXHJcbiAgICAgICAgICAgICAgICBPbmVPZi5ST1RBVElOR19SQU5ET00sXHJcbiAgICAgICAgICAgICAgICBcIkl0IGdvZXMgZWFzaWx5IHRocm91Z2ggeW91ciB0aHJvYXQgd2l0aCBubyBwYXJ0aWN1bGFyIHRhc3RlLlwiLFxyXG4gICAgICAgICAgICAgICAgXCJZb3UgdGFzdGUgbm90aGluZyBhcyBpdCBzb2Z0bHkgc2xpZGVzIHRocm91Z2ggeW91ciB0b25ndWUuXCJcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIHJ1bGVib29rIHdpbGwgcmV0dXJuIGEgTGlxdWlkTWl4dHVyZVxyXG4gICAgICogQHR5cGUge1J1bGVib29rPExpcXVpZENvbnRhaW5lcj59XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcnVsZWJvb2tNaXhpbmcgPSBuZXcgUnVsZWJvb2s8TGlxdWlkQ29udGFpbmVyPihcIk1peGluZyB0aGUgbGlxdWlkIGNvbnRlbnRzIG9mIHNvbWV0aGluZ1wiKTsgLy8gbm91biA9IExpcXVpZENvbnRhaW5lclxyXG4gICAgcHVibGljIHN0YXRpYyBtaXh0dXJlcyA6IEFycmF5PExpcXVpZE1peHR1cmU+ID0gW107XHJcbiAgICBwdWJsaWMgc3RhdGljIHNvcnRlZE1peHR1cmVzID0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBtaXggKGNvbnRhaW5lciA6IExpcXVpZENvbnRhaW5lcikge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBMaXF1aWQucnVsZWJvb2tNaXhpbmcuZXhlY3V0ZSh7bm91biA6IGNvbnRhaW5lcn0pO1xyXG4gICAgICAgIC8vIERpZCB3ZSBmaW5kIGEgbGlxdWlkP1xyXG4gICAgICAgIGlmIChyZXN1bHQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGxldCBmaW5hbFF1YW50aXR5ID0gcmVzdWx0LnF1YW50aXR5TXVsdGlwbGllciAhPSB1bmRlZmluZWQgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzdWx0LnF1YW50aXR5TXVsdGlwbGllciAqIGNvbnRhaW5lci5saXF1aWRDb250ZW50cy5sZW5ndGgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRhaW5lci5saXF1aWRDb250ZW50cy5sZW5ndGgpO1xyXG5cclxuXHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5saXF1aWRDb250ZW50cyA9IG5ldyBBcnJheShmaW5hbFF1YW50aXR5KTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaW5hbFF1YW50aXR5OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5saXF1aWRDb250ZW50c1tpXSA9IHJlc3VsdC5yZXN1bHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRNaXh0dXJlcyAoKSB7XHJcbiAgICAgICAgaWYgKExpcXVpZC5zb3J0ZWRNaXh0dXJlcykge1xyXG4gICAgICAgICAgICByZXR1cm4gTGlxdWlkLm1peHR1cmVzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBMaXF1aWQubWl4dHVyZXMuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoYi5maXJzdFByaW9yaXR5IDwgYS5maXJzdFByaW9yaXR5KSByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgIGlmIChhLmZpcnN0UHJpb3JpdHkgPCBiLmZpcnN0UHJpb3JpdHkpIHJldHVybiAxO1xyXG4gICAgICAgICAgICBpZiAoYi5wcmlvcml0eSA8IGEucHJpb3JpdHkpIHJldHVybiAtMTtcclxuICAgICAgICAgICAgaWYgKGEucHJpb3JpdHkgPCBiLnByaW9yaXR5KSByZXR1cm4gMTtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgTGlxdWlkLnNvcnRlZE1peHR1cmVzID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gTGlxdWlkLm1peHR1cmVzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgYWRkTWl4dHVyZShtaXh0dXJlIDogTGlxdWlkTWl4dHVyZSkge1xyXG4gICAgICAgIExpcXVpZC5taXh0dXJlcy5wdXNoKG1peHR1cmUpO1xyXG4gICAgICAgIExpcXVpZC5zb3J0ZWRNaXh0dXJlcyA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgcnVsZURlZmF1bHRNaXhpbmcgPSBMaXF1aWQucnVsZWJvb2tNaXhpbmcuY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiTWl4aW5nIHRocm91Z2ggTWl4dHVyZXNcIixcclxuICAgICAgICBjb2RlIDogcnVubmVyID0+IHtcclxuICAgICAgICAgICAgaWYgKHJ1bm5lci5ub3VuLmxpcXVpZENvbnRlbnRzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBtaXh0dXJlIDogTGlxdWlkTWl4dHVyZTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBMaXF1aWQubWl4dHVyZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIG1peHR1cmUgPSBMaXF1aWQubWl4dHVyZXNbaV07XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvcG9ydGlvbnMgPSBbXTtcclxuICAgICAgICAgICAgICAgIGxldCBtaXh0dXJlSXRlcmF0b3IgPSBtaXh0dXJlLnF1YW50aXRpZXMuZW50cmllcygpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbWl4dHVyZUxpcXVpZCA9IG1peHR1cmVJdGVyYXRvci5uZXh0KCk7ICFtaXh0dXJlTGlxdWlkLmRvbmU7IG1peHR1cmVMaXF1aWQgPSBtaXh0dXJlSXRlcmF0b3IubmV4dCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1peHR1cmVUeXBlID0gbWl4dHVyZUxpcXVpZC52YWx1ZVswXTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbWl4dHVyZVF1YW50aXR5ID0gbWl4dHVyZUxpcXVpZC52YWx1ZVsxXTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbWF0Y2hlZFF1YW50aXR5ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBydW5uZXIubm91bi5saXF1aWRDb250ZW50cy5mb3JFYWNoKChsaXF1aWRUeXBlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlxdWlkVHlwZSA9PSBtaXh0dXJlVHlwZSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgbWl4dHVyZVR5cGUgPT0gXCJmdW5jdGlvblwiICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaXF1aWRUeXBlIGluc3RhbmNlb2YgbWl4dHVyZVR5cGUgfHwgbWl4dHVyZVR5cGUobGlxdWlkVHlwZSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFF1YW50aXR5Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtaXh0dXJlVHlwZSBpcyBub3QgYWx3YXlzIGNhbGxhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHByb3BvcnRpb25zLnB1c2gobWF0Y2hlZFF1YW50aXR5IC8gbWl4dHVyZVF1YW50aXR5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgdmFsaWQgbWl4LCB0aGVuIGV2ZXJ5IHBhcnQgb2YgdGhlIHJlY2lwZSBpcyByZXByZXNlbnRlZCBwcm9wb3J0aW9uYWxseVxyXG4gICAgICAgICAgICAgICAgaWYgKHByb3BvcnRpb25zLmV2ZXJ5KGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4LCBhcnJheSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudCA9PT0gYXJyYXlbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgfSkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWl4dHVyZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59XHJcblxyXG4vLyBjbGFzcyBTZW1lbiBleHRlbmRzIExpcXVpZCB7fVxyXG4vLyBjbGFzcyBPcmNTZW1lbiBleHRlbmRzIFNlbWVuIHt9XHJcbi8vIGNsYXNzIE1pbm90YXVyU2VtZW4gZXh0ZW5kcyBTZW1lbiB7fVxyXG4vLyBjbGFzcyBQb3dlcmZ1bERyaW5rIGV4dGVuZHMgTGlxdWlkIHt9XHJcbi8vXHJcbi8vIGxldCBwb3dlcmZ1bERyaW5rUXVhbnRpdGllcyA9IG5ldyBNYXAoKTtcclxuLy8gcG93ZXJmdWxEcmlua1F1YW50aXRpZXMuc2V0KE9yY1NlbWVuLCAyKTtcclxuLy8gcG93ZXJmdWxEcmlua1F1YW50aXRpZXMuc2V0KE1pbm90YXVyU2VtZW4sIDEpO1xyXG4vLyBMaXF1aWQuYWRkTWl4dHVyZSh7XHJcbi8vICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9ISUdIRVNULFxyXG4vLyAgICAgcHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX01FRElVTSxcclxuLy8gICAgIHF1YW50aXR5TXVsdGlwbGllciA6IDAuNSxcclxuLy8gICAgIHJlc3VsdCA6IG5ldyBQb3dlcmZ1bERyaW5rKFwiUG93ZXJmdWwgRHJpbmtcIiksXHJcbi8vICAgICBxdWFudGl0aWVzIDogcG93ZXJmdWxEcmlua1F1YW50aXRpZXNcclxuLy8gfSk7XHJcbi8vIGxldCByZWNpcGllbnQgPSBuZXcgUmVjaXBpZW50KFwiQ3VwXCIpO1xyXG4vLyByZWNpcGllbnQubGlxdWlkQ29udGVudHMucHVzaChuZXcgT3JjU2VtZW4oXCJTZW1lbiBvZiB0aGUgQ2hpZWZcIikpO1xyXG4vLyByZWNpcGllbnQubGlxdWlkQ29udGVudHMucHVzaChuZXcgT3JjU2VtZW4oXCJTZW1lbiBvZiB0aGUgQ2hpZWZcIikpO1xyXG4vLyByZWNpcGllbnQubGlxdWlkQ29udGVudHMucHVzaChuZXcgT3JjU2VtZW4oXCJTZW1lbiBvZiB0aGUgQ2hpZWZcIikpO1xyXG4vLyByZWNpcGllbnQubGlxdWlkQ29udGVudHMucHVzaChuZXcgT3JjU2VtZW4oXCJTZW1lbiBvZiB0aGUgQ2hpZWZcIikpO1xyXG4vLyByZWNpcGllbnQubGlxdWlkQ29udGVudHMucHVzaChuZXcgTWlub3RhdXJTZW1lbihcIlNlbWVuIG9mIEhhcm9sZFwiKSk7XHJcbi8vIHJlY2lwaWVudC5saXF1aWRDb250ZW50cy5wdXNoKG5ldyBNaW5vdGF1clNlbWVuKFwiU2VtZW4gb2YgSGFyb2xkXCIpKTtcclxuLy9cclxuLy8ge1xyXG4vLyAgICAgU2V0dGluZ3Muc2V0RGVidWcoZmFsc2UpO1xyXG4vLyAgICAgbGV0IHQxID0gcGVyZm9ybWFuY2Uubm93KCk7XHJcbi8vICAgICBsZXQgdDAgPSBwZXJmb3JtYW5jZS5ub3coKTtcclxuLy8gICAgIExpcXVpZC5taXgocmVjaXBpZW50KTtcclxuLy8gICAgIHQxID0gcGVyZm9ybWFuY2Uubm93KCk7XHJcbi8vICAgICBjb25zb2xlLmxvZyh0MSAtIHQwKTtcclxuLy8gfSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9UaGluZy50c1wiIC8+XHJcbmNsYXNzIFNjZW5lcnkgZXh0ZW5kcyBUaGluZyB7XHJcbiAgICBwdWJsaWMgZml4ZWRJblBsYWNlID0gdHJ1ZTtcclxuICAgIHB1YmxpYyBzY2VuZXJ5ID0gdHJ1ZTtcclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9IdW1hbm9pZC50c1wiIC8+XHJcbmNsYXNzIE9yY0RlYnVnZ2VyIGV4dGVuZHMgSHVtYW5vaWQge1xyXG4gICAgcHVibGljIHN0YXRpYyBuYW1lTW9kaWZpZXIgPSBuZXcgU2h1ZmZsZXIoW1xyXG4gICAgICAgIFwiVWdseVwiLCBcIk11c2N1bGFyXCIsIFwiVmVpbnlcIiwgXCJBbmdyeVwiLCBcIlNhZFwiLCBcIlNtYXJ0XCIsIFwiQWdpbGVcIiwgXCJTaG9ydFwiLCBcIkJ1bGdpbmdcIiwgXCJJbnRlbnNlXCIsIFwiU21vdWxkZXJpbmdcIlxyXG4gICAgXSk7XHJcbiAgICBwdWJsaWMgc3RhdGljIGNvdW50ZXIgPSAxO1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yICgpIHtcclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGlzTWFsZTogdHJ1ZSxcclxuICAgICAgICAgICAgbmFtZSA6ICgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbmFtZU1vZCA9IE9yY0RlYnVnZ2VyLm5hbWVNb2RpZmllci5nZXRPbmUoKTtcclxuICAgICAgICAgICAgICAgIGlmIChuYW1lTW9kID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWVNb2QgPSAoT3JjRGVidWdnZXIuY291bnRlcisrKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5hbWVNb2QgKyBcIiBPcmNcIjtcclxuICAgICAgICAgICAgfSkoKSxcclxuICAgICAgICAgICAgdW5pcXVlIDogdHJ1ZSxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb24gOiBcIlRoaXMgaXMgb25lIGV4dHJlbWVseSB1Z2x5IGZlbGxvdy5cIlxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLkFJLndhbmRlcmVyID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLkFJLnBpY2tzU2hpbmllcyA9IHRydWU7XHJcbiAgICB9XHJcbn1cclxuXHJcbkFjdGlvblRhbGsuY2FycnkuY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICBuYW1lIDogXCJUYWxraW5nIHRvIHRoZSBvcmNcIixcclxuICAgIGZpcnN0UHJpb3JpdHkgOiBBY3Rpb25UYWxrLlBSSU9SSVRZX0dMT0JBTF9ESUFMT0dVRSxcclxuICAgIHByaW9yaXR5IDogQWN0aW9uVGFsay5QUklPUklUWV9DT01NT05fRElBTE9HVUUsXHJcbiAgICBjb25kaXRpb25zIDogKHJ1bm5lciA6IFJ1bGVib29rUnVubmVyPEFjdGlvblRhbGs+KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJ1bm5lci5ub3VuLmdldE5vdW4oMCkgaW5zdGFuY2VvZiBPcmNEZWJ1Z2dlcjtcclxuICAgIH0sXHJcbiAgICBjb2RlIDogKHJ1bm5lciA6IFJ1bGVib29rUnVubmVyPEFjdGlvblRhbGs+KSA9PiB7XHJcbiAgICAgICAgbGV0IG9yYyA9IDxPcmNEZWJ1Z2dlcj4gcnVubmVyLm5vdW4uZ2V0Tm91bigwKTtcclxuICAgICAgICAvL2F3YWl0IERpYWxvZ3VlVHJlZXMuQ29tcGlsYWJsZVRlc3QuZXhlY3V0ZSgpO1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBEaWNlLnRlc3RBZ2FpbnN0Um9sbChcclxuICAgICAgICAgICAge25hbWU6IFwiQ2hhcm0gKyAyXCIsIHZhbHVlIDogV29ybGRTdGF0ZS5wbGF5ZXIuZ2V0U3RhdChBdHRyaWJ1dGVzLkNoYXJtKSArIDJ9LFxyXG4gICAgICAgICAgICB7bmFtZTogXCJPcmMncyB3aXRzICsgMlwiLCB2YWx1ZSA6IG9yYy5nZXRTdGF0KEF0dHJpYnV0ZXMuSW50ZWxsaWdlbmNlKSArIDJ9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdCA+IDApIHtcclxuICAgICAgICAgICAgRWxlbWVudHMuQ3VycmVudFR1cm5IYW5kbGVyLnByaW50QXNDb250ZW50KG5ldyBTYXkoXCJZb3Ugd2luIVwiKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgRWxlbWVudHMuQ3VycmVudFR1cm5IYW5kbGVyLnByaW50QXNDb250ZW50KG5ldyBTYXkoXCJZb3UgbG9zZS5cIikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxufSk7IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0xpcXVpZC50c1wiIC8+XHJcblxyXG5jbGFzcyBTZW1lbiBleHRlbmRzIExpcXVpZCB7XHJcbiAgICBwdWJsaWMgY3VtbWVyIDogUGVyc29uO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoY3VtbWVyIDogUGVyc29uLCBvcHRpb25zPyA6IFRoaW5nT3B0aW9ucykge1xyXG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xyXG4gICAgICAgIHRoaXMuY3VtbWVyID0gY3VtbWVyO1xyXG4gICAgfVxyXG59IiwidmFyIHJvb21hID0gbmV3IFJvb21SYW5kb20oXCJSb29tIEFcIik7XG5yb29tYS5kZXNjcmlwdGlvbiA9IG5ldyBTYXkoXG4gICAgXCJZb3UgYXJlIGluc2lkZSBhIGJveCBvZiBtZXRhbCBwYWludGVkIGJsdWUuIFlvdXIgaGVhZCBhbG1vc3QgdG91Y2hlcyB0aGUgY2VpbGluZywgbWFraW5nIHRoZSByb29tIGxvb2sgc21hbGxlciB0aGFuIGl0IHJlYWxseSBpcy5cIixcbiAgICBTYXkuTElORV9CUkVBSyxcbiAgICBuZXcgU2F5SWYoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBUaGluZy5JbnNpZGVSb29tUmVsYXRpb24uZ2V0TGVmdCh2YXNlKSA9PSByb29tYSB8fCBUaGluZy5JbnNpZGVSb29tUmVsYXRpb24uZ2V0TGVmdCh1cm4pID09IHJvb21hO1xuICAgICAgICB9LFxuICAgICAgICBcIiBTdGlsbCwgdGhlcmUgYXJlIHNvbWUgdGhpbmdzIHRocm93biBhYm91dC5cIlxuICAgIClcbik7XG5cblBsYXlCZWdpbnMuc2V0U3RhcnRpbmdSb29tKHJvb21hKTtcblxubGV0IHBhZGRlZEJyYSA9IG5ldyBDbG90aGluZyh7bmFtZSA6IFwiUGFkZGVkIEJyYVwiLCB1bmlxdWUgOiB0cnVlfSk7XG5wYWRkZWRCcmEuYnJlYXN0UGFkZGluZyA9IDM7XG5wYWRkZWRCcmEuc2xvdHMgPSBbSHVtYW5vaWQuU0xPVF9CUkVBU1RTXTtcblxubGV0IHBhZGRlZFVuZGVyd2VhciA9IG5ldyBDbG90aGluZyh7bmFtZSA6IFwiUGFkZGVkIFVuZGVyd2VhclwiLCB1bmlxdWUgOiB0cnVlfSk7XG5wYWRkZWRVbmRlcndlYXIuY3JvdGNoUGFkZGluZyA9IDE1O1xucGFkZGVkVW5kZXJ3ZWFyLnNsb3RzID0gW0h1bWFub2lkLlNMT1RfQ1JPVENIX0JBQ0ssIEh1bWFub2lkLlNMT1RfQ1JPVENIX0ZST05UXTtcblxuLy8gVGhpbmcuV2VhclJlbGF0aW9uLnNldFJlbGF0aW9uKFdvcmxkU3RhdGUucGxheWVyLCBwYWRkZWRCcmEpO1xuLy8gVGhpbmcuV2VhclJlbGF0aW9uLnNldFJlbGF0aW9uKFdvcmxkU3RhdGUucGxheWVyLCBwYWRkZWRVbmRlcndlYXIpO1xuXG5sZXQgcGxheWVyID0gV29ybGRTdGF0ZS5wbGF5ZXI7XG5Xb3JsZFN0YXRlLnBsYXllciA9IHBsYXllcjtcbnZhciB2YXNlID0gbmV3IFRoaW5nKHtuYW1lIDogXCJWYXNlXCJ9KTtcbnZhc2UuZGVzY3JpcHRpb24gPSBuZXcgU2F5KFwiVGhpcyBpcyBhbiBvcm5hbWVudGFsIHZhc2UgdGhhdCdkIGxvb2sgdmVyeSBuaWNlIG9uIHlvdXIgbGFwLiBXaHk/IFdobyBrbm93cy5cIik7XG5yb29tYS5wbGFjZSh2YXNlKTtcblxubGV0IG1hcE9mVGVzdCA9IG5ldyBNYXBOb3RlKHtuYW1lOiBcIk1hcCBvZiB0aGlzIFJlZ2lvblwiLFxuZGVzY3JpcHRpb24gOiBcIlRoaXMgaXMgYSBzaW1wbGUgbWFwIHNob3dpbmcgYWxsIHRoZSByb29tcyBoZXJlLlwiLCB1bmlxdWUgOiB0cnVlfSk7XG5yb29tYS5wbGFjZShtYXBPZlRlc3QpO1xuXG5sZXQgdXJuID0gbmV3IFRoaW5nKHt1bmlxdWU6IHRydWUsIG5hbWUgOiBcIlVybiBvZiBEcmVhbXNcIiwgaW1hZ2UgOiBcImltYWdlMDAxXCJ9KTtcbnVybi5kZXNjcmlwdGlvbiA9IG5ldyBTYXkoXCJUaGlzIGFwcGVhcnMgdG8gYmUgYSBzaW1wbGUsIGJsYWNrIHVybiBjb250YWluaW5nIHRoZSBhc2hlcyBvZiB5b3VyIGRyZWFtcy5cIik7XG5yb29tYS5wbGFjZSh1cm4pO1xuXG52YXIgcm9vbWIgPSBuZXcgUm9vbVJhbmRvbShcIlJvb20gQlwiKTtcblxucm9vbWIucGxhY2UodmFzZSk7XG5cblxubGV0IGZyaWxseVBvdWNoID0gbmV3IENvaW5Qb3VjaCh7XG4gICAgbmFtZSA6IFwiRnJpbGx5IFBvdWNoXCIsXG4gICAgLy9pbWFnZSA6IG5ldyBTYXlJbWFnZShcImltYWdlMDAxXCIpLFxuICAgIGRlc2NyaXB0aW9uIDogbmV3IFNheShcIlRoaXMgaXMgYSB2ZXJ5IGdheSBsaXR0bGUgcGluayBwb3VjaCBmdWxsIG9mIGxpdHRsZSBoZWFydHMuXCIpXG59KTtcbmZyaWxseVBvdWNoLmFkZENvaW5zKDUwMik7XG5yb29tYS5wbGFjZShmcmlsbHlQb3VjaCk7XG5cbi8vIEFjdGlvblRha2UuY2hlY2suYWRkUnVsZShuZXcgUnVsZSg8UnVsZU9wdGlvbnM8YW55Pj4ge1xuLy8gICAgIGNvZGUgOiBmdW5jdGlvbiAoKSB7XG4vLyAgICAgICAgIGxldCBwcm9taXNlID0gbmV3IFByb21pc2UoKCkgPT4ge30pO1xuLy8gICAgICAgICByZXR1cm4gcHJvbWlzZTtcbi8vICAgICB9XG4vLyB9KSk7XG5cbmxldCBiaWdTYWNrID0gbmV3IENvaW5Qb3VjaCh7bmFtZSA6IFwiQmlnIFNhY2tcIn0pO1xuYmlnU2Fjay5hZGRDb2lucygxMDApO1xucm9vbWEucGxhY2UoYmlnU2Fjayk7XG5cbmxldCByZWdpb24gPSBuZXcgUmVnaW9uUmFuZG9tKFwiVGVzdCBSZWdpb25cIik7XG5cblxucmVnaW9uLnBsYWNlKHJvb21hLCByb29tYik7XG5mb3IgKGxldCBpID0gMTsgaSA8IDY7IGkrKykge1xuICAgIGxldCByb29tID0gbmV3IFJvb21SYW5kb20oXCJSb29tIFwiICsgaS50b1N0cmluZygpKTtcbiAgICAvLyBsZXQgcmFuZG9tRGlyZWN0aW9uID0gbmV3IFNodWZmbGVyKFtSb29tLk5PUlRILCBSb29tLlNPVVRILCBSb29tLkVBU1QsIFJvb20uV0VTVF0pXG4gICAgLy8gcm9vbS5jb25uZWN0YWJsZU9uID0gW3JhbmRvbURpcmVjdGlvbi5nZXRPbmUoKV07XG4gICAgLy9yb29tLmNvbm5lY3RhYmxlT24gPSBbUm9vbS5OT1JUSCwgUm9vbS5TT1VUSCwgUm9vbS5FQVNULCBSb29tLldFU1RdO1xuICAgIHJlZ2lvbi5wbGFjZShyb29tKTtcblxuICAgIGlmIChNYXRoLnJhbmRvbSgpID4gMC41KSB7XG4gICAgICAgIC8vbWFwT2ZUZXN0LmFkZFJvb20ocm9vbSk7XG4gICAgfVxuXG59XG5cbm1hcE9mVGVzdC5hZGRSZWdpb24ocmVnaW9uKTtcblxubGV0IHNvdXRoZXN0Um9vbSA9IG5ldyBSb29tUmFuZG9tKFwiU291dGhlc3QgUm9vbVwiKTtcbi8vc291dGhlc3RSb29tLmFwcGVhckNoYW5jZSA9IDA7XG5cbnJlZ2lvbi5wbGFjZShzb3V0aGVzdFJvb20pO1xuXG4vL3NvdXRoZXN0Um9vbS5jb25uZWN0YWJsZU9uID0gW1Jvb20uTk9SVEhdO1xuc291dGhlc3RSb29tLmFwcGVhckNoYW5jZSA9IDEwMDtcbnNvdXRoZXN0Um9vbS5iYWNrZ3JvdW5kSW1hZ2UgPSBcImJsb29cIjtcblxuc291dGhlc3RSb29tLnRyaWNreUNvZGUgPSAob3B0aW9ucyA6IFRyaWNreU9wdGlvbnMpID0+IHtcbiAgICBsZXQgbXlDb29yZGluYXRlcyA9IFtvcHRpb25zLngsIG9wdGlvbnMueV07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBSb29tLkRJUkVDVElPTlMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGRpcmVjdGlvbiA9IFJvb20uRElSRUNUSU9OU1tpXTtcbiAgICAgICAgaWYgKGRpcmVjdGlvbiAhPSBEaXJlY3Rpb24uTk9SVEgpIHtcbiAgICAgICAgICAgIGxldCBjb29yZGluYXRlcyA9IFJvb20uc2hpZnQobXlDb29yZGluYXRlcywgZGlyZWN0aW9uKTtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5tYXAuaXNGcmVlKGNvb3JkaW5hdGVzWzBdLCBjb29yZGluYXRlc1sxXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIFRoaXMgcm9vbSBjYW4gb25seSBoYXZlIHJvb21zIG9uIG5vcnRoIG9mIGl0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb29yZGluYXRlcyA9IFJvb20uc2hpZnQoY29vcmRpbmF0ZXMsIGRpcmVjdGlvbik7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMubWFwLmlzRnJlZShjb29yZGluYXRlc1swXSwgY29vcmRpbmF0ZXNbMV0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBUaGlzIHJvb20gY2FuIG9ubHkgaGF2ZSByb29tcyBvbiBub3J0aCBvZiBpdFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufTtcblxuUmVnaW9uUmFuZG9tLnJ1bGVib29rQWZ0ZXJQbGFjZVJvb20uYWRkUnVsZShuZXcgUnVsZSh7XG4gICAgbmFtZSA6IFwiQWZ0ZXIgcGxhY2luZyB0aGUgc291dGhlc3Qgcm9vbVwiLFxuICAgIGNvZGUgOiBydW5uZXIgPT4ge1xuICAgICAgICBsZXQgb3B0aW9ucyA9IDxSYW5kb21pemluZ1Jvb21PcHRpb25zPiBydW5uZXIubm91bjtcbiAgICAgICAgbGV0IG15Q29vcmRpbmF0ZXMgPSBvcHRpb25zLm1hcC5nZXRDb29yZGluYXRlcyhvcHRpb25zLnJvb20pO1xuICAgICAgICBpZiAobXlDb29yZGluYXRlcyAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgUm9vbS5ESVJFQ1RJT05TLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRpcmVjdGlvbiA9IFJvb20uRElSRUNUSU9OU1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uICE9IERpcmVjdGlvbi5OT1JUSCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29vcmRpbmF0ZXMgPSBSb29tLnNoaWZ0KG15Q29vcmRpbmF0ZXMsIGRpcmVjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMubWFwLmJsb2NrKGNvb3JkaW5hdGVzWzBdLCBjb29yZGluYXRlc1sxXSk7XG4gICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzID0gUm9vbS5zaGlmdChjb29yZGluYXRlcywgZGlyZWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5tYXAuYmxvY2soY29vcmRpbmF0ZXNbMF0sIGNvb3JkaW5hdGVzWzFdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGNvbmRpdGlvbnMgOiBydW5uZXIgPT4ge1xuICAgICAgICByZXR1cm4gcnVubmVyLm5vdW4ucm9vbSA9PSBzb3V0aGVzdFJvb207XG4gICAgfVxufSkpXG5cblRoaW5nLkNhcnJ5UmVsYXRpb24uc2V0UmVsYXRpb24oV29ybGRTdGF0ZS5wbGF5ZXIsIG1hcE9mVGVzdCk7XG5cbi8vIFNldHRpbmdzLnNldERlYnVnKGZhbHNlKTtcblBsYXlCZWdpbnMucnVsZWJvb2suYWRkUnVsZShuZXcgUnVsZSh7XG4gICAgbmFtZSA6IFwicmFuZG9taXplIHJlZ2lvblwiLFxuICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0hJR0hFU1QsXG4gICAgY29kZSA6IGFzeW5jIHJ1bm5lciA9PiB7XG4gICAgICAgIC8vbGV0IHQwID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgIGF3YWl0IHJlZ2lvbi5yYW5kb21pemUoKTtcbiAgICAgICAgLy9sZXQgdDEgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICB9XG59KSk7XG5cblJlZ2lvblJhbmRvbS5ydWxlYm9va1JhbmRvbWl6ZVJlZ2lvbi5hZGRSdWxlKG5ldyBSdWxlKHtcbiAgICBuYW1lIDogXCJBZGQgcm9vbSBBIGFuZCBCIHRvIHJlZ2lvblwiLFxuICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0hJR0hFU1QsXG4gICAgY29kZSA6IGFzeW5jIHJ1bm5lciA9PiB7XG4gICAgICAgIGF3YWl0IFJlZ2lvblJhbmRvbS5ydWxlYm9va1BsYWNlUm9vbS5leGVjdXRlKHtcbiAgICAgICAgICAgIG5vdW4gOiA8UmFuZG9taXppbmdSb29tT3B0aW9ucz4ge1xuICAgICAgICAgICAgICAgIG1hcCA6IHJlZ2lvbi5tYXAsXG4gICAgICAgICAgICAgICAgcm9vbSA6IHJvb21hLFxuICAgICAgICAgICAgICAgIHJlZ2lvbiA6IHJlZ2lvblxuICAgICAgICAgICAgfVxuICAgICAgICB9KS50aGVuKCk7XG4gICAgICAgIGF3YWl0IFJlZ2lvblJhbmRvbS5ydWxlYm9va1BsYWNlUm9vbS5leGVjdXRlKHtcbiAgICAgICAgICAgIG5vdW4gOiA8UmFuZG9taXppbmdSb29tT3B0aW9ucz4ge1xuICAgICAgICAgICAgICAgIG1hcCA6IHJlZ2lvbi5tYXAsXG4gICAgICAgICAgICAgICAgcm9vbSA6IHJvb21iLFxuICAgICAgICAgICAgICAgIHJlZ2lvbiA6IHJlZ2lvblxuICAgICAgICAgICAgfVxuICAgICAgICB9KS50aGVuKCk7XG4gICAgfSxcbiAgICBjb25kaXRpb25zIDogcnVubmVyID0+IHtcbiAgICAgICAgcmV0dXJuIHJ1bm5lci5ub3VuID09IHJlZ2lvbjtcbiAgICB9XG59KSk7XG5cbmZ1bmN0aW9uIGdldFBhdGggKHJvb21hIDogUm9vbSwgcm9vbWIgOiBSb29tKSB7XG4gICAgY29uc29sZS5kZWJ1ZyhcIlRoZSBiZXN0IHBhdGggZnJvbSBcIiArIHJvb21hLmdldFByaW50ZWROYW1lKCkgKyBcIiB0byBcIiArIHJvb21iLmdldFByaW50ZWROYW1lKCkgKyBcIiBpczpcIik7XG4gICAgbGV0IHQwLCBkaXIsIHQxO1xuICAgIHQwID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgZGlyID0gcm9vbWEuYmVzdERpcmVjdGlvblRvKHJvb21iKTtcbiAgICB0MSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGlmIChkaXIgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoRGlyZWN0aW9uTmFtZXNbRGlyZWN0aW9uW2Rpcl1dKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmRlYnVnKFwiVGhlcmUgaXMgbm8gcGF0aC5cIik7XG4gICAgfVxuICAgIGNvbnNvbGUuZGVidWcoXCJDYWxsIHRvIGRvU29tZXRoaW5nIHRvb2sgXCIgKyAodDEgLSB0MCkgKyBcIiBtaWxsaXNlY29uZHMuXCIpO1xufVxuXG4vLyBsZXQgdDAgPSBwZXJmb3JtYW5jZS5ub3coKTtcbi8vIGZvciAodmFyIGkgPSAwOyBpIDwgMTsgaSsrKSB7XG4vLyAgICAgZ2V0UGF0aChyb29tYSwgcm9vbWopO1xuLy8gfVxuLy8gd2luZG93Wydyb29tZSddID0gcm9vbWU7XG4vLyBsZXQgdDEgPSBwZXJmb3JtYW5jZS5ub3coKTtcbi8vIGNvbnNvbGUuZGVidWcoXCJUb3RhbDogXCIgKyAodDEgLSB0MCkgKyBcIiBtaWxsaXNlY29uZHMuXCIpO1xuXG5cbmxldCB3YW5kZXJSZWdpb24gPSBuZXcgUmVnaW9uUmFuZG9tKFwiT3JjYWJsZVJlZ2lvblwiKTtcbndhbmRlclJlZ2lvbi5wbGFjZShyb29tYSwgcm9vbWIpO1xucmVnaW9uLnBsYWNlKHdhbmRlclJlZ2lvbik7XG5cbi8vIFRlc3QgZG9uZSB3aXRoIGEgdGhvdXNhbmQgb3JjcyBzZWFyY2hpbmcgcGF0aHMgYW5kIHJlYWRpbmcgcm9vbXMuIFRvdGFsIHRpbWUgdGFrZW46IDIwMG1zLlxuLy8gMTAwMCBvcmNzLCBubyB3YW5kZXJlcnM6IDEzMG1zXG4vLyAxMDAgb3Jjcywgbm8gd2FuZGVyZXI6IDEzbXMgKHNvIHRoZSBzYW1lIGFtb3VudCBvZiB0aW1lIGFzIG5vdCBoYXZpbmcgYW55IG9yY3MpXG4vLyAxMDAgb3Jjcywgd2FuZGVyZXI6IDMwbXNcbi8vIDEwMCBvcmNzLCBubyBzaGlueSBwaWNrZXIsIHdhbmRlcmVyOiAzMG1zXG4vLyAxMDAgb3Jjcywgbm8gd2FuZGVyZXIsIG5vIHNoaW55IHBpY2tlcjogMTNtc1xuLy8gMTAwMCBvcmNzLCBubyB3YW5kZXJlciwgbm8gc2hpbnkgcGlja2VyOiA1MW1zXG4vKipcbiAqIENvbmNsdXNpb246XG4gKiBUaGUgdGVzdCBoYWQgYWxsIG9yY3MgcGxhY2VkIGluIHRoZSBzYW1lIHJvb20sIHNvIGV2ZXJ5IHRpbWUgU2hpbnlQaWNrZXIgQUkgcnVucywgYWxsIHRoZSBvcmNzIHdlcmUgbG9va2luZyBhdCBhbGwgdGhlIG90aGVyIG9yY3MuXG4gKiBHYW1lIGZlZWxzIFwiaW5zdGFudFwiIHVwIHRvIDEwMG1zIHR1cm5zLCB3aGljaCB3YXMgcmVhY2hlZCBhdCAyNTAgb3JjcyB3aXRoIEpVU1Qgb25lIFBJY2tzIFNoaW55IGFuZCBXYW5kZXJlciBydWxlcy5cbiAqIFdpdGggMTAwIEVNUFRZIHNoaW55IHJ1bGVzLCAyNTAgb3JjcyBhbHJlYWR5IHRha2UgdXAgNTAwbXMgcGVyIHR1cm4hXG4gKiBJZiB0aGUgb3JjcyBmYWlsIHRoZSBjb25kaXRpb25zIGZvciB3YW5kZXJlciBhbmQgc2hpbnkgcnVsZXMsIHRoZW4gdGhlcmUgaXMganVzdCBhIHNtYWxsIG92ZXJoZWFkIHRvIGhhdmluZyB0aGVzZSBydWxlcyB0aGVyZS5cbiAqIDEwMCBSdWxlcyBmYWlsaW5nIHRoZSBjb25kaXRpb25zIGFsbG93cyBmb3IgODAwIG9yY3MgYmVsb3cgMTAwbXMuXG4gKiA1MCBvcmNzIHdpdGggMTUwIFNoaW55IFJ1bGVzIHdoaWNoIGdvIHRocm91Z2ggYWxsIHRoZSBvdGhlciBvcmNzIHdoaWxlIHRoZXkgd2FuZGVyIHRvd2FyZHMgYSByZWdpb24gcmVzdWx0cyBpbiBhIDI1MG1zIHdhaXQuXG4gKiBUaGF0J3Mgbm90IGdvb2Qgc2luY2UgdGhvc2UgbnVtYmVycyBhcmUgc2ltaWxhciB0byB3aGF0IGVuZCBnYW1lIHNob3VsZCBoYXZlLCBob3dldmVyIHJlYWwgcnVsZXMgbWlnaHQgbm90IGJlIGFzIGV4cGVuc2l2ZSBhcyBQaWNrIFNoaW5pZXMgd2l0aCBhIHJvb20gZnVsbCBvZiBvcmNzLi5cbiAqIFdhaXQgaXMgYmVhcmFibGUgZm9yIDEwMCBvcmNzIHdpdGggODAwIGRpc2FibGVkIHJ1bGVzLCBzbyBpdCBzaG91bGQgYmUgXCJmaW5lXCIgdG8gaGF2ZSBhbGwgcnVsZXMgaW4gdGhlIHNhbWUgcnVsZWJvb2suXG4gKiBGaXJzdCBwb3NzaWJsZSBvcHRpbWl6YXRpb246IG1ha2UgQUkgcnVsZXMgaGF2ZSBhIHN0YXRpYyBcImNoZWNrXCIgYW5kIGJha2UgdGhlbSBpbnRvIGVhY2ggTlBDJ3MgcnVsZWJvb2sgc28gdGhhdCB0aGV5IGRvbid0IGhhdmUgdG8gYmUgY2hlY2tlZCBldmVyeSB0dXJuLlxuICogU2Vjb25kIHBvc3NpYmxlIG9wdGltaXphdGlvbjogdXNlIG1heGltdW0gZGlzdGFuY2UgZnJvbSBwbGF5ZXIgdG8gZGVjaWRlIHdoaWNoIE5QQ3MgaGF2ZSB0aGVpciBBSXMgZXhlY3V0ZWQgKGV2ZW4gYmV0dGVyOiBvbmx5IHJ1biBBSSBmb3IgdGhlIGN1cnJlbnQgcmVnaW9uKS5cbiAqIFRoaXJkIG9wdGltaXphdGlvbjogcmVkdWNlIG51bWJlciBvZiBydWxlcy4gTGFzdCByZXNvcnQuXG4gKi9cbmxldCByb29tcyA9IHJlZ2lvbi5nZXRSb29tcygpO1xubGV0IHNodWZmbGVyID0gbmV3IFNodWZmbGVyKHJvb21zKTtcbmZvciAobGV0IGkgPSAwOyBpIDwgMDsgaSsrKSB7XG4gICAgQUkucnVsZXMuY3JlYXRlQW5kQWRkUnVsZSh7XG4gICAgICAgIG5hbWUgOiBcIlBpY2sgU2hpbmllc1wiLFxuICAgICAgICBmaXJzdFByaW9yaXR5IDogQUlSdWxlcy5QUklPUklUWV9BQ1RJTkdfT05fUExBQ0UsXG4gICAgICAgIGNvbmRpdGlvbnMgOiAocnVubmVyIDogUnVsZWJvb2tSdW5uZXI8UGVyc29uPikgPT4ge1xuICAgICAgICAgICAgbGV0IHBlcnNvbiA9IHJ1bm5lci5ub3VuO1xuICAgICAgICAgICAgcmV0dXJuIHBlcnNvbi5BSS5waWNrc1NoaW5pZXM7XG4gICAgICAgIH0sXG4gICAgICAgIGNvZGUgOiAocnVubmVyIDogUnVsZWJvb2tSdW5uZXI8UGVyc29uPikgPT4ge1xuICAgICAgICAgICAgbGV0IHBlcnNvbiA9IHJ1bm5lci5ub3VuO1xuICAgICAgICAgICAgbGV0IHJvb20gPSBwZXJzb24uZ2V0Um9vbSgpO1xuICAgICAgICAgICAgbGV0IHZpc2libGVUaGluZ3MgPSByb29tLmdldENvbnRhaW5lZEFuZFZpc2libGVUbyhwZXJzb24pO1xuXG4gICAgICAgICAgICBpZiAodmlzaWJsZVRoaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2aXNpYmxlVGhpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmlzaWJsZVRoaW5nc1tpXS5maXhlZEluUGxhY2UgJiYgdmlzaWJsZVRoaW5nc1tpXS5nZXRTaGlueSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFjdGlvblRha2UocGVyc29uLCB2aXNpYmxlVGhpbmdzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxubGV0IHJhbmRvbU9yYztcbmxldCByYW5kb21PcmMyO1xuZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAgbGV0IG9yYyA9IG5ldyBPcmNEZWJ1Z2dlcigpO1xuICAgIHJhbmRvbU9yYyA9IG9yYztcbiAgICBpZiAocmFuZG9tT3JjMiA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmFuZG9tT3JjMiA9IG9yYztcbiAgICB9XG4gICAgb3JjLkFJLndhbmRlcmVyID0gdHJ1ZTtcbiAgICBvcmMuQUkucGlja3NTaGluaWVzID0gdHJ1ZTtcbiAgICBvcmMuQUkud2FuZGVyc09uID0gd2FuZGVyUmVnaW9uO1xuICAgIGxldCByb29tID0gbmV3IFNodWZmbGVyKHJlZ2lvbi5nZXRSb29tcygpKS5nZXRPbmUoKTtcbiAgICByb29tLnBsYWNlKG9yYyk7XG59XG5cbnZhciBmVGFyZ2V0ID0gbmV3IENvbnRlbnRHcm91cCgpO1xuZlRhcmdldC5hZGRVbml0KFxuICAgIG5ldyBGdWNraW5nVW5pdCgpXG4gICAgICAgIC5zZXRGdWNrZWQoV29ybGRTdGF0ZS5wbGF5ZXIpXG4gICAgICAgIC5zZXRGdWNrZXIocmFuZG9tT3JjKVxuICAgICAgICAuc2V0SG9sZShXb3JsZFN0YXRlLnBsYXllci5nZXRQYXJ0KEh1bWFub2lkVmFnaW5hKSlcbiAgICAgICAgLnNldFN0aWNrKHJhbmRvbU9yYy5nZXRQYXJ0KEh1bWFub2lkUGVuaXMpKVxuICAgICAgICAuYWRkTWFya2VyKEZ1Y2tpbmdTdGF0ZS5DVU1fU1RBUlQpXG4pO1xuXG5cbihuZXcgRnVja2luZ0Rlc2NyaXB0aW9uKFwiU3BlY2lmaWMgT3JjIGluIFZhZ2luYVwiKSlcbiAgICAuc2V0RGVzY3JpcHRpb24obmV3IFNheShcIlNwZWNpZmljIE9yYyBpbiBWYWdpbmFcIikpXG4gICAgLmFkZFVuaXQoKVxuICAgIC5zZXRGdWNrZXIocmFuZG9tT3JjKVxuICAgIC5zZXRIb2xlKFdvcmxkU3RhdGUucGxheWVyLmdldFBhcnQoSHVtYW5vaWRWYWdpbmEpKVxuICAgIC5zZXRTdGljayhyYW5kb21PcmMuZ2V0UGFydChIdW1hbm9pZFBlbmlzKSk7XG5cbihuZXcgRnVja2luZ0Rlc2NyaXB0aW9uKFwiU3BlY2lmaWMgT3JjIFN0YXJ0cyBDdW1taW5nIGluIFZhZ2luYVwiKSlcbiAgICAuc2V0RGVzY3JpcHRpb24obmV3IFNheShcIlNwZWNpZmljIE9yYyBTdGFydHMgQ3VtbWluZyBpbiBWYWdpbmFcIikpXG4gICAgLmFkZFVuaXQoKVxuICAgIC5zZXRGdWNrZXIocmFuZG9tT3JjKVxuICAgIC5zZXRIb2xlKFdvcmxkU3RhdGUucGxheWVyLmdldFBhcnQoSHVtYW5vaWRWYWdpbmEpKVxuICAgIC5hZGRNYXJrZXIoRnVja2luZ1N0YXRlLkNVTV9TVEFSVClcbiAgICAuc2V0U3RpY2socmFuZG9tT3JjLmdldFBhcnQoSHVtYW5vaWRQZW5pcykpOyIsIi8vIEZpbGUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGN1c3RvbSBEaWFsb2dnZXIgb24gNS8yMC8yMDE4LCA0OjUzOjUyIFBNXHJcbi8vIERvIG5vdCB0YW1wZXIgd2l0aCB0aGlzIGZpbGUuXHJcbi8vIEl0IHdpbGwgYmUgcmVwbGFjZWQgYXV0b21hdGljYWxseSBieSBEaWFsb2dnZXIgYW5kIGFsbCBjaGFuZ2VzIHdpbGwgYmUgbG9zdC5cclxuLy8gSW5zdGVhZCBjaGFuZ2UgQ3JlYXRpb25JbnRyby5kbC5cclxubW9kdWxlIERpYWxvZ3VlVHJlZXMge1xyXG5cdGV4cG9ydCBsZXQgQ3JlYXRpb25JbnRybyA9IChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IHRyZWUgOiBEaWFsb2d1ZVRyZWUgPSBuZXcgRGlhbG9ndWVUcmVlKFwiQ3JlYXRpb25JbnRyb1wiKTtcclxuICAgICAgICBsZXQgbm9kZSA6IERpYWxvZ3VlTm9kZTtcclxuICAgICAgICBsZXQgdGV4dCA6IERpYWxvZ3VlVGV4dDtcclxuICAgICAgICBsZXQgc2V0IDogRGlhbG9ndWVTZXQ7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgbm9kZSA9IG5ldyBEaWFsb2d1ZU5vZGUoXCJhZTk4MTMyMi05MTUxLTQ5YzgtYTg4OS05NDQ1NWRiN2MyNjJcIik7XHJcbiAgICAgICAgbm9kZS5zZXROZXh0KFwiODE1ODJkZWEtYmEyNy00YmFhLThkZjItYTc3ZmJiNWVkOWVmXCIpO1xyXG4gICAgICAgIHRyZWUuYWRkU3RhcnROb2RlKG5vZGUpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIHRleHQgPSBuZXcgRGlhbG9ndWVUZXh0KFwiZjcyYmYwOTktYmFlMi00OWRmLTk0MzMtYzljM2VjNmEwMjBkXCIpO1xyXG4gICAgICAgIHRleHQuc2V0U2F5KCgpID0+IHsgcmV0dXJuIG5ldyBTYXkoXCJBcyB5b3UgYXBwcm9hY2ggdGhlIE9iZWxpc2ssIG1hbnkgZHJlYW1zIGFuZCBuaWdodG1hcmVzIHdpbGwgYmVjb21lIHJlYWxpdHkgYXMgaXQgYXR0ZW1wdHMgdG8gZGlzc3VhZGUgeW91IGZyb20gZ2V0dGluZyB0b28gY2xvc2UsIHdpdGggdGhlIGludGVuc2l0eSBpbmNyZWFzaW5nIHRoZSBjbG9zZXIgeW91IGdldCB0byB5b3VyIG9iamVjdGl2ZS5cIiwgU2F5LlBBUkFHUkFQSF9CUkVBSywgXCJVbHRpbWF0ZWx5LCB0aGUgT2JlbGlzayB3aXNoZXMgeW91IG5vIGhhcm0sIGZvciBpdCBpcyBiZXR0ZXIgdG8gaGF2ZSB5b3UgYXJvdW5kIGFzIGEgcHJvdGVjdG9yIHRoYW4gYXMgYSBkZWFkIGVuZW15LCBzbyB0aGUgT2JlbGlzayB3aWxsIGF0dGVtcHQgdG8gZ2l2ZSB5b3UgZXhhY3RseSB3aGF0IHlvdSB3YW50IGRlZXAgaW4geW91ciBoZWFydCwgdHJ5aW5nIHRvIG1ha2UgeW91IGNvbXBsZXRlbHkgc2F0aXNmaWVkIHNvIHRoYXQgeW91IG5vIGxvbmdlciB3aXNoIGZvciB0aGUgT2JlbGlzaydzIGRlc3RydWN0aW9uIG9yIGJlY29tZSB1bmFibGUgdG8gY29udGludWUgeW91ciBxdWVzdC4gT2YgY291cnNlLCB3aGF0IHlvdXIgaGVhcnQgd2FudHMgaXMgbm90IG5lY2Vzc2FyaWx5IHdoYXQgeW91IHRoaW5rIGl0IHdhbnRzLlwiLCBTYXkuUEFSQUdSQVBIX0JSRUFLLCBcIk9yY3MsIHRoZSBtb3N0IGNvbW1vbiBjcmVhdHVyZSB0byBjb21lIG91dCBvZiB0aGUgT2JlbGlzaywgYXJlIG5vdGhpbmcgbW9yZSB0aGFuIGh1bWFucyB3YXJwZWQgYnkgdGhlaXIgb3duIGRlc2lyZSBmb3IgdW5icmlkbGVkIHZpb2xlbmNlLiBXaGF0IHdpbGwgdGhlIE9iZWxpc2sgZG8gdG8geW91P1wiLCBTYXkuUEFSQUdSQVBIX0JSRUFLLCBcIk9uIHRoZSBmb2xsb3dpbmcgc2NyZWVucywgeW91IHdpbGwgZGVmaW5lIHdobyB5b3Ugd2lsbCBiZSBpbiB0aGlzIHN0b3J5LiBQbGVhc2UgY29uZmlybSBjYXJlZnVsbHksIGFzIHRoZXJlIGlzIG5vIHR1cm5pbmcgYmFjay5cIik7fSk7XHJcbiAgICAgICAgdGV4dC5zZXROZXh0KFwiNjZkNGIyN2EtZmY0MC00YThlLWE3NDktMmI1ZTgyMzc2OTVhXCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZSh0ZXh0KTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBzZXQgPSBuZXcgRGlhbG9ndWVTZXQoXCI4MTU4MmRlYS1iYTI3LTRiYWEtOGRmMi1hNzdmYmI1ZWQ5ZWZcIik7XHJcbiAgICAgICAgc2V0LnNldEZ1bmN0aW9uKCgpID0+IHtFbGVtZW50cy5zdGFydE1lbnUoKTt9KTtcclxuICAgICAgICBzZXQuc2V0TmV4dChcImY3MmJmMDk5LWJhZTItNDlkZi05NDMzLWM5YzNlYzZhMDIwZFwiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUoc2V0KTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBzZXQgPSBuZXcgRGlhbG9ndWVTZXQoXCIwYjRmZWM4Ny1hMmIwLTRlM2ItODFlZC1hNDE1MGY5NGZjMTBcIik7XHJcbiAgICAgICAgc2V0LnNldEZ1bmN0aW9uKCgpID0+IHtFbGVtZW50cy5lbmRNZW51KCk7fSk7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKHNldCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgc2V0ID0gbmV3IERpYWxvZ3VlU2V0KFwiNjZkNGIyN2EtZmY0MC00YThlLWE3NDktMmI1ZTgyMzc2OTVhXCIpO1xyXG4gICAgICAgIHNldC5zZXRGdW5jdGlvbigoKSA9PiB7cmV0dXJuIEVsZW1lbnRzLndhaXRGb3JBbnlLZXkoKTt9KTtcclxuICAgICAgICBzZXQuc2V0TmV4dChcIjBiNGZlYzg3LWEyYjAtNGUzYi04MWVkLWE0MTUwZjk0ZmMxMFwiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUoc2V0KTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gdHJlZTtcclxuICAgIH0pKCk7XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiRGlhbG9ndWUvQ3JlYXRpb25JbnRyby5kbC50c1wiIC8+XHJcbm1vZHVsZSBDaGFyYWN0ZXJDcmVhdGlvbiB7XHJcbiAgICBleHBvcnQgbGV0IENyZWF0aW9uSW50cm8gPSBDaGFyYWN0ZXJDcmVhdGlvbi5ydWxlYm9vay5jcmVhdGVBbmRBZGRSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJTaG93IHNtYWxsIEludHJvXCIsXHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfSElHSEVTVCxcclxuICAgICAgICBwcmlvcml0eTogUnVsZS5QUklPUklUWV9ISUdIRVNULFxyXG4gICAgICAgIGNvZGUgOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIGF3YWl0IERpYWxvZ3VlVHJlZXMuQ3JlYXRpb25JbnRyby5leGVjdXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn0iLCJtb2R1bGUgQ2hhcmFjdGVyQ3JlYXRpb24ge1xyXG4gICAgbGV0IGNjRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgIGNjRGl2LmlkID0gXCJjaGFyYWN0ZXJDcmVhdGlvblwiO1xyXG4gICAgbGV0IHJpZ2h0U2lkZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICByaWdodFNpZGUuaWQgPSBcImNjUmlnaHRcIjtcclxuICAgIGxldCBsZWZ0U2lkZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICBsZWZ0U2lkZS5pZCA9IFwiY2NMZWZ0XCI7XHJcbiAgICBjY0Rpdi5hcHBlbmRDaGlsZChsZWZ0U2lkZSk7XHJcbiAgICBjY0Rpdi5hcHBlbmRDaGlsZChyaWdodFNpZGUpO1xyXG5cclxuICAgIGxldCByZXNvbHZlcjtcclxuXHJcbiAgICBhc3luYyBmdW5jdGlvbiBwcmludFRhYmxlICgpIHtcclxuICAgICAgICBwcmludE9yaWdpbigpO1xyXG5cclxuICAgICAgICB3aGlsZSAobGVmdFNpZGUuZmlyc3RDaGlsZCkgbGVmdFNpZGUucmVtb3ZlQ2hpbGQobGVmdFNpZGUuZmlyc3RDaGlsZCk7XHJcblxyXG4gICAgICAgIGF3YWl0IChuZXcgU2F5KG5ldyBTYXlCb2xkKFwiQ2hhcmFjdGVyIE9yaWdpbjpcIikpLmdldEhUTUxDb250ZW50KCkudGhlbihlbGVzID0+IHtcclxuICAgICAgICAgICAgZWxlcy5mb3JFYWNoKGVsZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZWZ0U2lkZS5hcHBlbmRDaGlsZChlbGUpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgbGV0IG9yaWdpbnMgPSBDaGFyYWN0ZXJPcmlnaW4uZ2V0T3JpZ2lucygpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3JpZ2lucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgb3JpZ2luID0gb3JpZ2luc1tpXTtcclxuICAgICAgICAgICAgbGV0IHNheSA9IG5ldyBTYXkob3JpZ2luLm5hbWUpO1xyXG4gICAgICAgICAgICBpZiAob3JpZ2luLmlkID09IENoYXJhY3RlckNyZWF0aW9uLlBsYXllck9yaWdpbi52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgc2F5LmFkZChcIiAtIFNFTEVDVEVEXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IChzYXkpLmdldEhUTUwoXCJwXCIsIFtcImNob2ljZVwiXSkudGhlbihlbGVtZW50QXJyYXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgQ29udHJvbHMuTGlua3MubWFrZUN1c3RvbUxpbmsoZWxlbWVudEFycmF5WzBdLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50T3JpZ2luKG9yaWdpbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmludE9yaWdpbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgY2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyQ3JlYXRpb24uUGxheWVyT3JpZ2luLnZhbHVlID0gb3JpZ2luLmlkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNldCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgQ29udHJvbHMuS2V5SGFuZGxlci5hcHBseUNvZGUoZWxlbWVudEFycmF5WzBdLCBDb250cm9scy5LZXlIYW5kbGVyLmdldFNlY29uZEtleUNvZGUoKSk7XHJcbiAgICAgICAgICAgICAgICBsZWZ0U2lkZS5hcHBlbmRDaGlsZChlbGVtZW50QXJyYXlbMF0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcHJpbnRDb25maXJtICgpIHtcclxuICAgICAgICAobmV3IFNheShcIkNvbmZpcm1cIikpLmdldEhUTUwoXCJwXCIsIFtcImNob2ljZVwiXSkudGhlbihlbGVtZW50QXJyYXkgPT4ge1xyXG4gICAgICAgICAgICBlbGVtZW50QXJyYXlbMF0uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmVyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBDb250cm9scy5LZXlIYW5kbGVyLmFwcGx5Q29kZShlbGVtZW50QXJyYXlbMF0sIENvbnRyb2xzLktleUhhbmRsZXIuZ2V0U2Vjb25kS2V5Q29kZSgpKTtcclxuICAgICAgICAgICAgRWxlbWVudHMuQ3VycmVudFR1cm5IYW5kbGVyLnByaW50KGVsZW1lbnRBcnJheVswXSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcHJpbnRPcmlnaW4gKG9yaWdpbj8gOiBDaGFyYWN0ZXJPcmlnaW4pIHtcclxuICAgICAgICBpZiAob3JpZ2luID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBvcmlnaW4gPSBDaGFyYWN0ZXJPcmlnaW4uZ2V0T3JpZ2luKENoYXJhY3RlckNyZWF0aW9uLlBsYXllck9yaWdpbi52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBzYXkgPSBuZXcgU2F5KG9yaWdpbi5kZXNjcmlwdGlvbik7XHJcbiAgICAgICAgaWYgKG9yaWdpbi5ib251c1N0YXRzICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBzYXkuYWRkKFNheS5QQVJBR1JBUEhfQlJFQUssIG9yaWdpbi5ib251c1N0YXRzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2F5LmdldEhUTUxDb250ZW50KCkudGhlbigoZWxlcyA9PiB7XHJcbiAgICAgICAgICAgIHdoaWxlIChyaWdodFNpZGUuZmlyc3RDaGlsZCkgcmlnaHRTaWRlLnJlbW92ZUNoaWxkKHJpZ2h0U2lkZS5maXJzdENoaWxkKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgcmlnaHRTaWRlLmFwcGVuZENoaWxkKGVsZXNbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHJlc2V0ICgpIHtcclxuICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIuY2xlYXIoKTtcclxuICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIucHJpbnQoY2NEaXYpO1xyXG4gICAgICAgIHByaW50VGFibGUoKTtcclxuICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIucHJpbnQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKTtcclxuICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIucHJpbnQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKTtcclxuICAgICAgICBwcmludENvbmZpcm0oKTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbGV0IENDT3JpZ2luID0gQ2hhcmFjdGVyQ3JlYXRpb24ucnVsZWJvb2suY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgbmFtZTogXCJDaGFyYWN0ZXIgQ3JlYXRpb24gLSBPcmlnaW5cIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5OiBSdWxlLlBSSU9SSVRZX01FRElVTSxcclxuICAgICAgICBwcmlvcml0eTogUnVsZS5QUklPUklUWV9ISUdILFxyXG4gICAgICAgIGNvZGU6IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgRWxlbWVudHMuc3RhcnRNZW51KCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgcHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZXIgPSByZXNvbHZlO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHJlc2V0KCk7XHJcblxyXG4gICAgICAgICAgICBhd2FpdCBwcm9taXNlO1xyXG5cclxuICAgICAgICAgICAgQ2hhcmFjdGVyQ3JlYXRpb24uZ2V0T3JpZ2luKCkuY29uZmlybVBpY2tlZCgpO1xyXG5cclxuICAgICAgICAgICAgRWxlbWVudHMuZW5kTWVudSgpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59IiwibW9kdWxlIENoYXJhY3RlckNyZWF0aW9uIHtcclxuICAgIGxldCBjY0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICBjY0Rpdi5pZCA9IFwiY2hhcmFjdGVyQ3JlYXRpb25cIjtcclxuICAgIGxldCByaWdodFNpZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgcmlnaHRTaWRlLmlkID0gXCJjY1JpZ2h0XCI7XHJcbiAgICBsZXQgbGVmdFNpZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgbGVmdFNpZGUuaWQgPSBcImNjTGVmdFwiO1xyXG4gICAgY2NEaXYuYXBwZW5kQ2hpbGQobGVmdFNpZGUpO1xyXG4gICAgY2NEaXYuYXBwZW5kQ2hpbGQocmlnaHRTaWRlKTtcclxuXHJcbiAgICBsZXQgcmVzb2x2ZXI7XHJcblxyXG4gICAgYXN5bmMgZnVuY3Rpb24gcHJpbnRUYWJsZSAoKSB7XHJcbiAgICAgICAgd2hpbGUgKGxlZnRTaWRlLmZpcnN0Q2hpbGQpIGxlZnRTaWRlLnJlbW92ZUNoaWxkKGxlZnRTaWRlLmZpcnN0Q2hpbGQpO1xyXG5cclxuICAgICAgICBhd2FpdCAobmV3IFNheShuZXcgU2F5Qm9sZChcIlBlcmtzIChDaG9vc2UgYW55KTpcIikpLmdldEhUTUxDb250ZW50KCkudGhlbihlbGVzID0+IHtcclxuICAgICAgICAgICAgZWxlcy5mb3JFYWNoKGVsZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZWZ0U2lkZS5hcHBlbmRDaGlsZChlbGUpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgbGV0IHBlcmtzID0gUGVyay5nZXRQZXJrcygpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGVya3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHBlcmsgPSBwZXJrc1tpXTtcclxuICAgICAgICAgICAgbGV0IHNheSA9IG5ldyBTYXkocGVyay5uYW1lKTtcclxuICAgICAgICAgICAgaWYgKHBlcmsuaXNFbmFibGVkKCkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChwZXJrLmlzRm9yY2VkKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBzYXkuYWRkIChcIiAoTWFuZGF0b3J5KVwiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2F5LmFkZChcIiAtIFNlbGVjdGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBlcmsuaXNGb3JjZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgc2F5LmFkZChcIiAoRm9yYmlkZGVuKVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCAoc2F5KS5nZXRIVE1MKFwicFwiLCBbXCJjaG9pY2VcIl0pLnRoZW4oZWxlbWVudEFycmF5ID0+IHtcclxuICAgICAgICAgICAgICAgIENvbnRyb2xzLkxpbmtzLm1ha2VDdXN0b21MaW5rKGVsZW1lbnRBcnJheVswXSwge1xyXG4gICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmludFBlcmsocGVyayk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbXB0eVBlcmsoKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGVyay5pc0ZvcmNlZCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJrLnZhbHVlID0gIXBlcmsudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXQoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIENvbnRyb2xzLktleUhhbmRsZXIuYXBwbHlDb2RlKGVsZW1lbnRBcnJheVswXSwgQ29udHJvbHMuS2V5SGFuZGxlci5nZXRTZWNvbmRLZXlDb2RlKCkpO1xyXG4gICAgICAgICAgICAgICAgbGVmdFNpZGUuYXBwZW5kQ2hpbGQoZWxlbWVudEFycmF5WzBdKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHByaW50Q29uZmlybSAoKSB7XHJcbiAgICAgICAgKG5ldyBTYXkoXCJDb25maXJtXCIpKS5nZXRIVE1MKFwicFwiLCBbXCJjaG9pY2VcIl0pLnRoZW4oZWxlbWVudEFycmF5ID0+IHtcclxuICAgICAgICAgICAgZWxlbWVudEFycmF5WzBdLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlcigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgQ29udHJvbHMuS2V5SGFuZGxlci5hcHBseUNvZGUoZWxlbWVudEFycmF5WzBdLCBDb250cm9scy5LZXlIYW5kbGVyLmdldFNlY29uZEtleUNvZGUoKSk7XHJcbiAgICAgICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5wcmludChlbGVtZW50QXJyYXlbMF0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGVtcHR5UGVyayAoKSB7XHJcbiAgICAgICAgd2hpbGUgKHJpZ2h0U2lkZS5maXJzdENoaWxkKSByaWdodFNpZGUucmVtb3ZlQ2hpbGQocmlnaHRTaWRlLmZpcnN0Q2hpbGQpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHByaW50UGVyayAocGVyayA6IFBlcmspIHtcclxuICAgICAgICBsZXQgc2F5ID0gbmV3IFNheShwZXJrLmRlc2NyaXB0aW9uKTtcclxuICAgICAgICBzYXkuZ2V0SFRNTENvbnRlbnQoKS50aGVuKChlbGVzID0+IHtcclxuICAgICAgICAgICAgZW1wdHlQZXJrKCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgcmlnaHRTaWRlLmFwcGVuZENoaWxkKGVsZXNbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHJlc2V0ICgpIHtcclxuICAgICAgICBQZXJrLnVwZGF0ZVBlcmtzKCk7XHJcbiAgICAgICAgRWxlbWVudHMuQ3VycmVudFR1cm5IYW5kbGVyLmNsZWFyKCk7XHJcbiAgICAgICAgRWxlbWVudHMuQ3VycmVudFR1cm5IYW5kbGVyLnByaW50KGNjRGl2KTtcclxuICAgICAgICBwcmludFRhYmxlKCk7XHJcbiAgICAgICAgRWxlbWVudHMuQ3VycmVudFR1cm5IYW5kbGVyLnByaW50KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSk7XHJcbiAgICAgICAgRWxlbWVudHMuQ3VycmVudFR1cm5IYW5kbGVyLnByaW50KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSk7XHJcbiAgICAgICAgcHJpbnRDb25maXJtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGxldCBDQ1BlcmsgPSBDaGFyYWN0ZXJDcmVhdGlvbi5ydWxlYm9vay5jcmVhdGVBbmRBZGRSdWxlKHtcclxuICAgICAgICBuYW1lOiBcIkNoYXJhY3RlciBDcmVhdGlvbiAtIE9yaWdpblwiLFxyXG4gICAgICAgIGZpcnN0UHJpb3JpdHk6IFJ1bGUuUFJJT1JJVFlfTE9XLFxyXG4gICAgICAgIHByaW9yaXR5OiBSdWxlLlBSSU9SSVRZX0hJR0gsXHJcbiAgICAgICAgY29kZTogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICBFbGVtZW50cy5zdGFydE1lbnUoKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBwcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlciA9IHJlc29sdmU7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcmVzZXQoKTtcclxuXHJcbiAgICAgICAgICAgIGF3YWl0IHByb21pc2U7XHJcblxyXG4gICAgICAgICAgICBsZXQgcGVya3MgPSBQZXJrLmdldFBlcmtzKCk7XHJcbiAgICAgICAgICAgIHBlcmtzLmZvckVhY2gocGVyayA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocGVyay5pc0VuYWJsZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBlcmsuY29uZmlybVBpY2tlZCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIEVsZW1lbnRzLmVuZE1lbnUoKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufSIsIm1vZHVsZSBDaGFyYWN0ZXJDcmVhdGlvbiB7XHJcbiAgICBpbnRlcmZhY2UgcmFuZ2VPcHRpb25zIHtcclxuICAgICAgICBsYWJlbD8gOiBzdHJpbmc7XHJcbiAgICAgICAgc2hvd1ZhbHVlPyA6IGJvb2xlYW47XHJcbiAgICAgICAgb25DaGFuZ2UgOiAodmFsdWUgOiBudW1iZXIsIGxhYmVsVmFsdWUgOiBUZXh0LCBpbnB1dCA6IEhUTUxJbnB1dEVsZW1lbnQpID0+IHZvaWQ7XHJcbiAgICAgICAgbWluVmFsdWUgOiBudW1iZXI7XHJcbiAgICAgICAgbWF4VmFsdWUgOiBudW1iZXI7XHJcbiAgICAgICAgbGVmdExhYmVsPyA6IHN0cmluZztcclxuICAgICAgICByaWdodExhYmVsPyA6IHN0cmluZztcclxuICAgICAgICB0b3BMYWJlbD8gOiBzdHJpbmc7XHJcbiAgICAgICAgdmFsdWUgOiBudW1iZXI7XHJcbiAgICAgICAgc3RlcCA6IG51bWJlcjtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjcmVhdGVSYW5nZSAob3B0aW9ucyA6IHJhbmdlT3B0aW9ucykge1xyXG4gICAgICAgIGxldCB2YWx1ZU5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcob3B0aW9ucy52YWx1ZSkpO1xyXG5cclxuICAgICAgICBsZXQgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZChcImNjT3B0aW9uXCIpO1xyXG4gICAgICAgIGlmIChvcHRpb25zLnRvcExhYmVsICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsZXQgdG9wTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgICAgICB0b3BMYWJlbC5jbGFzc0xpc3QuYWRkKFwiY2NPcHRpb25Ub3BMYWJlbFwiKTtcclxuICAgICAgICAgICAgdG9wTGFiZWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUob3B0aW9ucy50b3BMYWJlbCArIFwiOlwiKSk7XHJcbiAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZCh0b3BMYWJlbCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGlmIChvcHRpb25zLnNob3dWYWx1ZSAhPSBmYWxzZSkge1xyXG4gICAgICAgICAgICBsYWJlbC5jbGFzc0xpc3QuYWRkKFwicmFuZ2VWYWx1ZVwiKTtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMubGFiZWwgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgYiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiXCIpO1xyXG4gICAgICAgICAgICAgICAgYi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShvcHRpb25zLmxhYmVsICsgXCI6IFwiKSk7XHJcbiAgICAgICAgICAgICAgICBsYWJlbC5hcHBlbmRDaGlsZChiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsYWJlbC5hcHBlbmRDaGlsZCh2YWx1ZU5vZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGlucHV0ID0gPEhUTUxJbnB1dEVsZW1lbnQ+IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcclxuICAgICAgICBpbnB1dC5jbGFzc0xpc3QuYWRkKFwiY2NSYW5nZVwiKTtcclxuICAgICAgICBpbnB1dC50eXBlID0gXCJyYW5nZVwiO1xyXG4gICAgICAgIGlucHV0Lm1pbiA9IG9wdGlvbnMubWluVmFsdWUudG9TdHJpbmcoKTtcclxuICAgICAgICBpbnB1dC5tYXggPSBvcHRpb25zLm1heFZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgaW5wdXQuc3RlcCA9IG9wdGlvbnMuc3RlcC50b1N0cmluZygpO1xyXG4gICAgICAgIGlucHV0LnZhbHVlID0gb3B0aW9ucy52YWx1ZS50b1N0cmluZygpO1xyXG5cclxuICAgICAgICBsZXQgb25DaGFuZ2UgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIHZhbHVlTm9kZS5ub2RlVmFsdWUgPSBpbnB1dC52YWx1ZTtcclxuICAgICAgICAgICAgb3B0aW9ucy5vbkNoYW5nZShOdW1iZXIoaW5wdXQudmFsdWUpLCB2YWx1ZU5vZGUsIGlucHV0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgb25DaGFuZ2UpO1xyXG5cclxuICAgICAgICBsZXQgbGVmdEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xyXG4gICAgICAgIGxlZnRCdXR0b24uY2xhc3NMaXN0LmFkZChcImNjQnV0dG9uXCIpO1xyXG4gICAgICAgIGxlZnRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgaW5wdXQudmFsdWUgPSBTdHJpbmcoTnVtYmVyKGlucHV0LnZhbHVlKSAtIG9wdGlvbnMuc3RlcCk7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgQ29udHJvbHMuS2V5SGFuZGxlci5hcHBseUNvZGUobGVmdEJ1dHRvbiwgQ29udHJvbHMuS2V5SGFuZGxlci5nZXRGaXJzdEtleUNvZGUoKSk7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMubGVmdExhYmVsICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsZWZ0QnV0dG9uLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG9wdGlvbnMubGVmdExhYmVsKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcmlnaHRCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcclxuICAgICAgICByaWdodEJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwiY2NCdXR0b25cIik7XHJcbiAgICAgICAgcmlnaHRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgaW5wdXQudmFsdWUgPSBTdHJpbmcoTnVtYmVyKGlucHV0LnZhbHVlKSArIG9wdGlvbnMuc3RlcCk7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgQ29udHJvbHMuS2V5SGFuZGxlci5hcHBseUNvZGUocmlnaHRCdXR0b24sIENvbnRyb2xzLktleUhhbmRsZXIuZ2V0Rmlyc3RLZXlDb2RlKCkpOztcclxuICAgICAgICBpZiAob3B0aW9ucy5yaWdodExhYmVsICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByaWdodEJ1dHRvbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShvcHRpb25zLnJpZ2h0TGFiZWwpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRpdi5hcHBlbmRDaGlsZChsZWZ0QnV0dG9uKTtcclxuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoaW5wdXQpO1xyXG4gICAgICAgIGRpdi5hcHBlbmRDaGlsZChyaWdodEJ1dHRvbik7XHJcbiAgICAgICAgZGl2LmFwcGVuZENoaWxkKGxhYmVsKTtcclxuXHJcbiAgICAgICAgb25DaGFuZ2UoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRpdjtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbGV0IENDU2V4U3RhdHMgPSBDaGFyYWN0ZXJDcmVhdGlvbi5ydWxlYm9vay5jcmVhdGVBbmRBZGRSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJDaGFyYWN0ZXIgQ3JlYXRpb24gLSBTZXggYW5kIFN0YXRzXCIsXHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfSElHSCxcclxuICAgICAgICBwcmlvcml0eTogUnVsZS5QUklPUklUWV9ISUdILFxyXG4gICAgICAgIGNvZGUgOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIEVsZW1lbnRzLnN0YXJ0TWVudSgpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGNjRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAgICAgY2NEaXYuaWQgPSBcImNoYXJhY3RlckNyZWF0aW9uXCI7XHJcblxyXG4gICAgICAgICAgICBsZXQgY2NMZWZ0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAgICAgY2NMZWZ0LmlkID0gXCJjY0xlZnRcIjtcclxuICAgICAgICAgICAgY2NEaXYuYXBwZW5kQ2hpbGQoY2NMZWZ0KTtcclxuXHJcbiAgICAgICAgICAgIGxldCBjY1JpZ2h0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAgICAgY2NSaWdodC5pZCA9IFwiY2NSaWdodFwiO1xyXG4gICAgICAgICAgICBjY0Rpdi5hcHBlbmRDaGlsZChjY1JpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIGxldCBvbkNoYW5nZSA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIChuZXcgU2F5KFdvcmxkU3RhdGUucGxheWVyLmRlc2NyaXB0aW9uKSkuZ2V0SFRNTENvbnRlbnQoKS50aGVuKCh2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNjUmlnaHQuZmlyc3RDaGlsZCkgY2NSaWdodC5yZW1vdmVDaGlsZChjY1JpZ2h0LmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLmZvckVhY2godmFsID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2NSaWdodC5hcHBlbmRDaGlsZCh2YWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY2NMZWZ0LmFwcGVuZENoaWxkKGNyZWF0ZVJhbmdlKHtcclxuICAgICAgICAgICAgICAgIG1pblZhbHVlIDogMCwgbWF4VmFsdWUgOiAxLCBzdGVwOiAxLCB2YWx1ZSA6IDAsIGxlZnRMYWJlbCA6IFwiTWFsZVwiLCByaWdodExhYmVsIDogXCJGZW1hbGVcIiwgdG9wTGFiZWwgOiBcIlNleFwiLFxyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgOiAodmFsdWUgOiBudW1iZXIsIGxhYmVsVmFsdWUgOiBUZXh0LCBpbnB1dCA6IEhUTUxJbnB1dEVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbFZhbHVlLm5vZGVWYWx1ZSA9ICh2YWx1ZSA9PSAwID8gXCJNYWxlXCIgOiBcIkZlbWFsZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAoPEh1bWFub2lkPiBXb3JsZFN0YXRlLnBsYXllcikucmVtb3ZlR2VuZGVyZWRQYXJ0cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICg8SHVtYW5vaWQ+IFdvcmxkU3RhdGUucGxheWVyKS5hZGRNYWxlUGFydHMoKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAoPEh1bWFub2lkPiBXb3JsZFN0YXRlLnBsYXllcikuYWRkRmVtYWxlUGFydHMoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU29tZSBzdGF0cyBiZWNvbWUgZGlmZmVyZW50IHdoZXRoZXIgdGUgcGxheWVyIGlzIG1hbGUgb3IgZmVtYWxlLCBzbyB3ZSBoYXZlIHRvIHVwZGF0ZSB0aGVtIGFsbC5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgb3RoZXJJbnB1dHMgPSBjY0Rpdi5nZXRFbGVtZW50c0J5VGFnTmFtZShcImlucHV0XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3RoZXJJbnB1dHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG90aGVySW5wdXQgPSBvdGhlcklucHV0c1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG90aGVySW5wdXQgIT0gaW5wdXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVySW5wdXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJjaGFuZ2VcIikpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcblxyXG5cclxuICAgICAgICAgICAgY2NMZWZ0LmFwcGVuZENoaWxkKGNyZWF0ZVJhbmdlKHtcclxuICAgICAgICAgICAgICAgIG1pblZhbHVlIDogMCwgbWF4VmFsdWUgOiA0LCBzdGVwOiAxLCB2YWx1ZSA6IDIsIGxlZnRMYWJlbCA6IFwiTWFzY3VsaW5lXCIsIHJpZ2h0TGFiZWwgOiBcIkZlbWluaW5lXCIsIHRvcExhYmVsIDogXCJHZW5kZXJcIixcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlIDogKHZhbHVlIDogbnVtYmVyLCBsYWJlbFZhbHVlIDogVGV4dCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBuYW1lcyA9IFtcIk1hc2N1bGluZVwiLCBcIlNvbWV3aGF0IG1hc2N1bGluZVwiLCBcIkFuZHJvZ3lub3VzXCIsIFwiU29tZXdoYXQgZmVtaW5pbmVcIiwgXCJGZW1pbmluZVwiXTtcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbFZhbHVlLm5vZGVWYWx1ZSA9IG5hbWVzW3ZhbHVlXTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcGxheWVyID0gKDxIdW1hbm9pZD4gV29ybGRTdGF0ZS5wbGF5ZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBpbnRlbmRlZFZhbHVlIDogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXIuaXNNYWxlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlcyA9IFsxMCwgMjUsIDUwLCA1NSwgNjBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlbmRlZFZhbHVlID0gdmFsdWVzW3ZhbHVlXTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzID0gWzM1LCA0MCwgNTAsIDY1LCA3NV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVuZGVkVmFsdWUgPSB2YWx1ZXNbdmFsdWVdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAoPEh1bWFub2lkPiBXb3JsZFN0YXRlLnBsYXllcikuc2V0R2VuZGVyVmFsdWUoaW50ZW5kZWRWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgV29ybGRTdGF0ZS5wbGF5ZXIuc2V0U3RhdChBdHRyaWJ1dGVzLkdlbmRlcklkZW50aXR5LCBpbnRlbmRlZFZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgc3RhdHNIZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgICAgICBjY0xlZnQuYXBwZW5kQ2hpbGQoc3RhdHNIZWFkZXIpO1xyXG4gICAgICAgICAgICBzdGF0c0hlYWRlci5jbGFzc0xpc3QuYWRkKFwiY2NIZWFkZXJcIik7XHJcbiAgICAgICAgICAgIHN0YXRzSGVhZGVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiU3RhdHMgKFwiKSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgbWF4U3RhdHMgPSAxMjtcclxuICAgICAgICAgICAgbGV0IHN0YXRzUmVtYWluaW5nID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCI0IHBvaW50cyByZW1haW5pbmdcIik7XHJcblxyXG5cclxuICAgICAgICAgICAgc3RhdHNIZWFkZXIuYXBwZW5kQ2hpbGQoc3RhdHNSZW1haW5pbmcpO1xyXG4gICAgICAgICAgICBzdGF0c0hlYWRlci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIilcIikpO1xyXG5cclxuICAgICAgICAgICAgbGV0IHNldFN0YXQgPSAoYXR0ciA6IEF0dHJpYnV0ZSwgdmFsdWUgOiBudW1iZXIsIGlucHV0IDogSFRNTElucHV0RWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcGxheWVyLnNldFN0YXQoYXR0ciwgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHJlbWFpbmluZyA9IG1heFN0YXRzXHJcbiAgICAgICAgICAgICAgICAgICAgLSBwbGF5ZXIuZ2V0U3RhdChBdHRyaWJ1dGVzLlN0cmVuZ3RoKVxyXG4gICAgICAgICAgICAgICAgICAgIC0gcGxheWVyLmdldFN0YXQoQXR0cmlidXRlcy5BZ2lsaXR5KVxyXG4gICAgICAgICAgICAgICAgICAgIC0gcGxheWVyLmdldFN0YXQoQXR0cmlidXRlcy5JbnRlbGxpZ2VuY2UpXHJcbiAgICAgICAgICAgICAgICAgICAgLSBwbGF5ZXIuZ2V0U3RhdChBdHRyaWJ1dGVzLkNoYXJtKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IHJlbWFpbmluZztcclxuICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICBpbnB1dC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImNoYW5nZVwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHN0YXRzUmVtYWluaW5nLm5vZGVWYWx1ZSA9IChyZW1haW5pbmcgPT0gMCA/IFwiRG9uZVwiIDpcclxuICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgPiAxID8gcmVtYWluaW5nLnRvU3RyaW5nKCkgKyBcIiBwb2ludHMgcmVtYWluaW5nXCIgOlxyXG4gICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZy50b1N0cmluZygpICsgXCIgcG9pbnQgcmVtYWluaW5nXCIpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY2NMZWZ0LmFwcGVuZENoaWxkKGNyZWF0ZVJhbmdlKHtcclxuICAgICAgICAgICAgICAgIG1pblZhbHVlIDogMSwgbWF4VmFsdWUgOiA1LCBzdGVwOiAxLCB2YWx1ZSA6IDIsIGxlZnRMYWJlbCA6IFwiLVwiLCByaWdodExhYmVsIDogXCIrXCIsIHRvcExhYmVsIDogXCJTdHJlbmd0aFwiLFxyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgOiAodmFsdWUgOiBudW1iZXIsIGxhYmVsVmFsdWUgOiBUZXh0LCBpbnB1dCA6IEhUTUxJbnB1dEVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzZXRTdGF0KEF0dHJpYnV0ZXMuU3RyZW5ndGgsIHZhbHVlLCBpbnB1dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2UoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgY2NMZWZ0LmFwcGVuZENoaWxkKGNyZWF0ZVJhbmdlKHtcclxuICAgICAgICAgICAgICAgIG1pblZhbHVlIDogMSwgbWF4VmFsdWUgOiA1LCBzdGVwOiAxLCB2YWx1ZSA6IDIsIGxlZnRMYWJlbCA6IFwiLVwiLCByaWdodExhYmVsIDogXCIrXCIsIHRvcExhYmVsIDogXCJBZ2lsaXR5XCIsXHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZSA6ICh2YWx1ZSA6IG51bWJlciwgbGFiZWxWYWx1ZSA6IFRleHQsIGlucHV0IDogSFRNTElucHV0RWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldFN0YXQoQXR0cmlidXRlcy5BZ2lsaXR5LCB2YWx1ZSwgaW5wdXQpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIGNjTGVmdC5hcHBlbmRDaGlsZChjcmVhdGVSYW5nZSh7XHJcbiAgICAgICAgICAgICAgICBtaW5WYWx1ZSA6IDEsIG1heFZhbHVlIDogNSwgc3RlcDogMSwgdmFsdWUgOiAyLCBsZWZ0TGFiZWwgOiBcIi1cIiwgcmlnaHRMYWJlbCA6IFwiK1wiLCB0b3BMYWJlbCA6IFwiQ2hhcm1cIixcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlIDogKHZhbHVlIDogbnVtYmVyLCBsYWJlbFZhbHVlIDogVGV4dCwgaW5wdXQgOiBIVE1MSW5wdXRFbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0U3RhdChBdHRyaWJ1dGVzLkNoYXJtLCB2YWx1ZSwgaW5wdXQpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIGNjTGVmdC5hcHBlbmRDaGlsZChjcmVhdGVSYW5nZSh7XHJcbiAgICAgICAgICAgICAgICBtaW5WYWx1ZSA6IDEsIG1heFZhbHVlIDogNSwgc3RlcDogMSwgdmFsdWUgOiAyLCBsZWZ0TGFiZWwgOiBcIi1cIiwgcmlnaHRMYWJlbCA6IFwiK1wiLCB0b3BMYWJlbCA6IFwiSW50ZWxsaWdlbmNlXCIsXHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZSA6ICh2YWx1ZSA6IG51bWJlciwgbGFiZWxWYWx1ZSA6IFRleHQsIGlucHV0IDogSFRNTElucHV0RWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldFN0YXQoQXR0cmlidXRlcy5JbnRlbGxpZ2VuY2UsIHZhbHVlLCBpbnB1dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2UoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGNyZWF0aW9uRG9uZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAobmV3IFNheShcIkNvbmZpcm1cIikpLmdldEhUTUwoXCJwXCIsIFtcImNob2ljZVwiXSkudGhlbihlbGVtZW50QXJyYXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRBcnJheVswXS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50cy5lbmRNZW51KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBDb250cm9scy5LZXlIYW5kbGVyLmFwcGx5Q29kZShlbGVtZW50QXJyYXlbMF0sIENvbnRyb2xzLktleUhhbmRsZXIuZ2V0U2Vjb25kS2V5Q29kZSgpKTtcclxuICAgICAgICAgICAgICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIucHJpbnQoZWxlbWVudEFycmF5WzBdKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5wcmludChjY0Rpdik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gY3JlYXRpb25Eb25lO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuXHJcbiAgICAvLyBUT0RPOiBQaWNrIG9yaWdpblxyXG4gICAgLy8gVE9ETzogUGljayBQZXJrc1xyXG59IiwibW9kdWxlIFBsYXlCZWdpbnMge1xyXG4gICAgZXhwb3J0IHZhciBMT0FEX0ZBSUxFRCA9IGZhbHNlO1xyXG4gICAgZXhwb3J0IHZhciBDT05USU5VRV9GQUlMRUQgPSBmYWxzZTtcclxuXHJcbiAgICBleHBvcnQgdmFyIEludHJvTWVudVJ1bGUgPSBQbGF5QmVnaW5zLnJ1bGVib29rLmNyZWF0ZUFuZEFkZFJ1bGUoe1xyXG4gICAgICAgIG5hbWUgOiBcIkludHJvIE1lbnUgUnVsZVwiLFxyXG4gICAgICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0hJR0hFU1QsXHJcbiAgICAgICAgcHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0hJR0hFU1QsXHJcbiAgICAgICAgY29kZSA6IGFzeW5jIChydW5uZXIgOiBSdWxlYm9va1J1bm5lcjx2b2lkPikgPT4ge1xyXG4gICAgICAgICAgICBhd2FpdCBEaWFsb2d1ZVRyZWVzLkludHJvTWVudS5leGVjdXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn0iLCIvLyBGaWxlIGNyZWF0ZWQgYXV0b21hdGljYWxseSBieSBjdXN0b20gRGlhbG9nZ2VyIG9uIDUvMjAvMjAxOCwgNDo1MzoyMiBQTVxyXG4vLyBEbyBub3QgdGFtcGVyIHdpdGggdGhpcyBmaWxlLlxyXG4vLyBJdCB3aWxsIGJlIHJlcGxhY2VkIGF1dG9tYXRpY2FsbHkgYnkgRGlhbG9nZ2VyIGFuZCBhbGwgY2hhbmdlcyB3aWxsIGJlIGxvc3QuXHJcbi8vIEluc3RlYWQgY2hhbmdlIEludHJvTWVudS5kbC5cclxubW9kdWxlIERpYWxvZ3VlVHJlZXMge1xyXG5cdGV4cG9ydCBsZXQgSW50cm9NZW51ID0gKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgdHJlZSA6IERpYWxvZ3VlVHJlZSA9IG5ldyBEaWFsb2d1ZVRyZWUoXCJJbnRyb01lbnVcIik7XHJcbiAgICAgICAgbGV0IG5vZGUgOiBEaWFsb2d1ZU5vZGU7XHJcbiAgICAgICAgbGV0IGNob2ljZSA6IERpYWxvZ3VlQ2hvaWNlO1xyXG4gICAgICAgIGxldCB0ZXh0IDogRGlhbG9ndWVUZXh0O1xyXG4gICAgICAgIGxldCBicmFuY2ggOiBEaWFsb2d1ZUJyYW5jaDtcclxuICAgICAgICBsZXQgc2V0IDogRGlhbG9ndWVTZXQ7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgbm9kZSA9IG5ldyBEaWFsb2d1ZU5vZGUoXCJiMDE4YmIyOC00ZWZjLTQ5M2ItYWMzNy0zMTYzNGM0ZTY0MDZcIik7XHJcbiAgICAgICAgbm9kZS5zZXROZXh0KFwiZjQ0OGU3MTgtOWQyNC00MTkxLTk5MTMtY2NjMzZkOTdjNGMwXCIpO1xyXG4gICAgICAgIHRyZWUuYWRkU3RhcnROb2RlKG5vZGUpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIGNob2ljZSA9IG5ldyBEaWFsb2d1ZUNob2ljZShcIjNiOGM4YmNiLTBhYzgtNDBkYy05ZjYyLTRhYmJkZTBkMGY3ZlwiKTtcclxuICAgICAgICBjaG9pY2Uuc2V0U2F5KCgpID0+IHsgcmV0dXJuIG5ldyBTYXkoXCJTdGFydCBHYW1lXCIpO30pO1xyXG4gICAgICAgIGNob2ljZS5zZXROZXh0KFwiNzE5ZTcxZGQtOTk4OS00MDE1LTkzYWYtOWZiNzA5NjAwMmMxXCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShjaG9pY2UpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIGNob2ljZSA9IG5ldyBEaWFsb2d1ZUNob2ljZShcIjUzNzEwMDg3LTQwMDItNDFiNy1iMDg5LWNhZGFiZWRiY2FmZFwiKTtcclxuICAgICAgICBjaG9pY2Uuc2V0U2F5KCgpID0+IHsgcmV0dXJuIG5ldyBTYXkoXCJMb2FkIGZyb20gZmlsZVwiKTt9KTtcclxuICAgICAgICBjaG9pY2Uuc2V0TmV4dChcImYyNWY2NTI1LWRhZDYtNDVkNy1hMzkxLTI0NmMxYjAyYjU2OVwiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUoY2hvaWNlKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBjaG9pY2UgPSBuZXcgRGlhbG9ndWVDaG9pY2UoXCJiNDU5M2EzNi1jYTgzLTRhZmMtYjAxYi1lNzEzNDRjYTZlMWZcIik7XHJcbiAgICAgICAgY2hvaWNlLnNldFNheSgoKSA9PiB7IHJldHVybiBuZXcgU2F5KFwiU2V0dGluZ3NcIik7fSk7XHJcbiAgICAgICAgY2hvaWNlLnNldE5leHQoXCJkNGEzNzliNS0wNmM5LTRmY2EtYTI1Yy1iMWEzMWI2YmY5M2RcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKGNob2ljZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgY2hvaWNlID0gbmV3IERpYWxvZ3VlQ2hvaWNlKFwiNGM1MDMyYTUtNTUwOS00YTAwLWI4YzctNzg4ZTdkZGJmMTdkXCIpO1xyXG4gICAgICAgIGNob2ljZS5zZXRTYXkoKCkgPT4geyByZXR1cm4gbmV3IFNheShcIkFib3V0XCIpO30pO1xyXG4gICAgICAgIGNob2ljZS5zZXROZXh0KFwiNmIzZjM4NWItODI4My00NjM1LTljNzMtZTIzMDNkNzc2NDJkXCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShjaG9pY2UpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIG5vZGUgPSBuZXcgRGlhbG9ndWVOb2RlKFwiNjc0ODQxYTYtMzc1Mi00YzgxLTk3N2QtMTllMTExNTM2MjAzXCIpO1xyXG4gICAgICAgIG5vZGUuc2V0TmFtZShcIjJcIik7XHJcbiAgICAgICAgbm9kZS5zZXRDaG9pY2VzKFtcIjNiOGM4YmNiLTBhYzgtNDBkYy05ZjYyLTRhYmJkZTBkMGY3ZlwiLFwiNTM3MTAwODctNDAwMi00MWI3LWIwODktY2FkYWJlZGJjYWZkXCIsXCI0YzUwMzJhNS01NTA5LTRhMDAtYjhjNy03ODhlN2RkYmYxN2RcIixcImI0NTkzYTM2LWNhODMtNGFmYy1iMDFiLWU3MTM0NGNhNmUxZlwiLFwiYTU1ZjQ2ZmEtOThhOS00ZGZmLTlmMWMtNGY4OGMxOGNlOGRkXCJdKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUobm9kZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgdGV4dCA9IG5ldyBEaWFsb2d1ZVRleHQoXCJiYzMyZTQxMS0zYzU0LTQ3NDctYWQ3OS01MDZmYzVhOWQ2YzlcIik7XHJcbiAgICAgICAgdGV4dC5zZXRTYXkoKCkgPT4geyByZXR1cm4gbmV3IFNheShTYXkuQ0VOVEVSRUQsIG5ldyBTYXlJbWFnZShcImludHJvTG9nb1wiKSwgU2F5LkxJTkVfQlJFQUssIG5ldyBTYXlJdGFsaWMoXCJUaGUgT2JlbGlzayBpcyBhbiBhZHVsdCBpbnRlcmFjdGl2ZSBmaWN0aW9uIGdhbWUgc2V0IGluIGEgcG9zdC1hcG9jYWx5cHRpYyB3b3JsZCByYXZhZ2VkIGJ5IGEgbWFnaWNhbCBzdHJ1Y3R1cmUuXCIpKTt9KTtcclxuICAgICAgICB0ZXh0LnNldE5leHQoXCIzNmRhOWVhNi05MDljLTRjMGMtOTRkMS1hMTdmZWY0NDQ1MmRcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKHRleHQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIHRleHQgPSBuZXcgRGlhbG9ndWVUZXh0KFwiMzZkYTllYTYtOTA5Yy00YzBjLTk0ZDEtYTE3ZmVmNDQ0NTJkXCIpO1xyXG4gICAgICAgIHRleHQuc2V0U2F5KCgpID0+IHsgcmV0dXJuIG5ldyBTYXkoXCJBIHNsZWVrLCBibGFjayBvYmVsaXNrIGFwcGVhcmVkLCBtb25zdGVycyBwb3VyaW5nIGZyb20gaXQsIHRocmVhdGVuaW5nIHRoZSB3b3JsZC4gTWFueSB0cmllZCB0byByZWFjaCB0aGUgb2JlbGlzaywgb25seSB0byByZXR1cm4gY2hhbmdlZCAtIG1vbnN0cm91cy4gQ2l2aWxpemF0aW9uIHdhcyB1bmFibGUgdG8gY29wZSB3aXRoIHRoZSBjcmVhdHVyZXMgYW5kIGh1bWFuaXR5IHNvb24gcmV0dXJuZWQgdG8gaXRzIG9sZCwgdHJpYmFsIHdheXMsIGh1bWFucyBiZWNvbWluZyByYXJlciB3aXRoIGVhY2ggcGFzc2luZyBkYXkuIENlbnR1cmllcyBoYXZlIHBhc3NlZCBhbmQgdGVjaG5vbG9neSBpcyBub3cgc2NhcmNlLCB3aXRoIHBlb3BsZSBsZWFkaW5nIHNpbXBsZXIgbGl2ZXMgaW4gc21hbGwgc2V0dGxlbWVudHMuXCIsICAgICAgICAgICAgICAgICAgICAgU2F5LlBBUkFHUkFQSF9CUkVBSywgICAgICAgICAgICAgICAgICAgICBcIllvdSB3ZXJlIGJvcm4gaW4gdGhlIGFzaGVzIG9mIHRoZSBvbGQgd29ybGQsIGxpdmluZyBpbiBpc29sYXRpb24gYXMgeW91IGFuZCB5b3VyIGZlbGxvdyBtZW4gYXR0ZW1wdCB0byBzdGF5IHNhZmUgZnJvbSB0aGUgZXZpbHMgb2YgVGhlIE9iZWxpc2suIFwiLCAgICAgICAgICAgICAgICAgICAgIFNheS5QQVJBR1JBUEhfQlJFQUssICAgICAgICAgICAgICAgICAgICAgXCJOb3csIGZhdGUgaGFzIGRlY2lkZWQgeW91IG11c3QgZ28sIHJlYWNoIFRoZSBPYmVsaXNrIGFuZCBkZXN0cm95IGl0LiBXaWxsIHlvdSBzdWNjZWVkIGluIHN0b3BwaW5nIGl0LCBvciB3aWxsIHlvdSBsb3NlIHlvdXJzZWxmIHRvIGFsbCB0aGUgY2hhbmdlcyBpdCB3aWxsIGJyaW5nIHRvIHlvdT9cIik7fSk7XHJcbiAgICAgICAgdGV4dC5zZXROZXh0KFwiNjc0ODQxYTYtMzc1Mi00YzgxLTk3N2QtMTllMTExNTM2MjAzXCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZSh0ZXh0KTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBub2RlID0gbmV3IERpYWxvZ3VlTm9kZShcIjlmMTE4NzFmLWVlYmQtNGI5YS1iM2RiLWVkOWJlOGNmNzhlN1wiKTtcclxuICAgICAgICBub2RlLnNldE5hbWUoXCIxXCIpO1xyXG4gICAgICAgIG5vZGUuc2V0TmV4dChcIjllZWIyMTAwLTkxN2QtNDFmZC1iNzU2LTZkM2I4MGU5MjQ2M1wiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUobm9kZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgYnJhbmNoID0gbmV3IERpYWxvZ3VlQnJhbmNoKFwiNWQxZGZiODYtYWJkOS00YWQ2LWJmMDctOGNlZDU0NzZlNDAxXCIpO1xyXG4gICAgICAgIGJyYW5jaC5zZXRWYXJpYWJsZSgoKSA9PiB7IHJldHVybiBQbGF5QmVnaW5zLkxPQURfRkFJTEVEO30pO1xyXG4gICAgICAgIGJyYW5jaC5hZGRCcmFuY2goXCI0MTVkYzMyYS0xNTQ5LTQyOWQtOWFjNC04Y2QxYjRjOTJjMTRcIiwgKCkgPT4geyByZXR1cm4gdHJ1ZTt9KTtcclxuICAgICAgICBicmFuY2guc2V0TmV4dChcImY4MmZjMTc3LWI0YmQtNGYwNi1iN2FiLTIxNjI1OWUwNTZhNVwiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUoYnJhbmNoKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBzZXQgPSBuZXcgRGlhbG9ndWVTZXQoXCJmODJmYzE3Ny1iNGJkLTRmMDYtYjdhYi0yMTYyNTllMDU2YTVcIik7XHJcbiAgICAgICAgc2V0LnNldEZ1bmN0aW9uKCgpID0+IHtFbGVtZW50cy5lbmRNZW51KCk7fSk7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKHNldCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgc2V0ID0gbmV3IERpYWxvZ3VlU2V0KFwiOWVlYjIxMDAtOTE3ZC00MWZkLWI3NTYtNmQzYjgwZTkyNDYzXCIpO1xyXG4gICAgICAgIHNldC5zZXRGdW5jdGlvbigoKSA9PiB7RWxlbWVudHMuY2xlYXJNYWluU2NyZWVuKCk7fSk7XHJcbiAgICAgICAgc2V0LnNldE5leHQoXCJiYzMyZTQxMS0zYzU0LTQ3NDctYWQ3OS01MDZmYzVhOWQ2YzlcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKHNldCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgbm9kZSA9IG5ldyBEaWFsb2d1ZU5vZGUoXCI0MTVkYzMyYS0xNTQ5LTQyOWQtOWFjNC04Y2QxYjRjOTJjMTRcIik7XHJcbiAgICAgICAgbm9kZS5zZXROZXh0KFwiMVwiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUobm9kZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgc2V0ID0gbmV3IERpYWxvZ3VlU2V0KFwiZjQ0OGU3MTgtOWQyNC00MTkxLTk5MTMtY2NjMzZkOTdjNGMwXCIpO1xyXG4gICAgICAgIHNldC5zZXRGdW5jdGlvbigoKSA9PiB7RWxlbWVudHMuc3RhcnRNZW51KCk7IHRyZWUuc2V0UmVwZWF0Q2hvaWNlcyhmYWxzZSk7fSk7XHJcbiAgICAgICAgc2V0LnNldE5leHQoXCI5ZjExODcxZi1lZWJkLTRiOWEtYjNkYi1lZDliZThjZjc4ZTdcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKHNldCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgY2hvaWNlID0gbmV3IERpYWxvZ3VlQ2hvaWNlKFwiZWY5MjUzYjktNWMyNC00NmNjLThlMmQtNTU2MmExNTQ0ZjA3XCIpO1xyXG4gICAgICAgIGNob2ljZS5zZXRTYXkoKCkgPT4geyByZXR1cm4gbmV3IFNheShTYXZlSGFuZGxlci5nZXRTYXlGb3JTbG90KDApKTt9KTtcclxuICAgICAgICBjaG9pY2Uuc2V0TmV4dChcIjk1OTRjZjA2LTYwNjItNDk1Mi1iMzc4LTZhZWRhYWZlMjk1MVwiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUoY2hvaWNlKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBjaG9pY2UgPSBuZXcgRGlhbG9ndWVDaG9pY2UoXCI4MmM1MTJjNi0wMTE1LTRkNzItYTQxMy01NzI4YTYyM2YwNGJcIik7XHJcbiAgICAgICAgY2hvaWNlLnNldFNheSgoKSA9PiB7IHJldHVybiBuZXcgU2F5KFNhdmVIYW5kbGVyLmdldFNheUZvclNsb3QoMSkpO30pO1xyXG4gICAgICAgIGNob2ljZS5zZXROZXh0KFwiZmU5NWNmYjMtYjlmNS00YjEyLTgzYWEtOTRkMjZlNWJjYWMwXCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShjaG9pY2UpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIGNob2ljZSA9IG5ldyBEaWFsb2d1ZUNob2ljZShcIjczMTU4MzVhLTRkOTUtNDM3Ny04MjhjLThhNGNhN2U0OWY4N1wiKTtcclxuICAgICAgICBjaG9pY2Uuc2V0U2F5KCgpID0+IHsgcmV0dXJuIG5ldyBTYXkoU2F2ZUhhbmRsZXIuZ2V0U2F5Rm9yU2xvdCgyKSk7fSk7XHJcbiAgICAgICAgY2hvaWNlLnNldE5leHQoXCJkYzg4NDk3NC03YmIyLTQzNmYtYjNhNC1jZGY4NTUwYmQ0OTRcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKGNob2ljZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgY2hvaWNlID0gbmV3IERpYWxvZ3VlQ2hvaWNlKFwiNTBhZmQ2ZjgtODdjZS00OWJmLWI2ODktNDgxOWJjNWRjOGU3XCIpO1xyXG4gICAgICAgIGNob2ljZS5zZXRTYXkoKCkgPT4geyByZXR1cm4gbmV3IFNheShTYXZlSGFuZGxlci5nZXRTYXlGb3JTbG90KDMpKTt9KTtcclxuICAgICAgICBjaG9pY2Uuc2V0TmV4dChcIjYyZjVlYTg4LWM2ZjAtNDQ2OS04N2YyLWVhM2IzNzYzODUwOVwiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUoY2hvaWNlKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBjaG9pY2UgPSBuZXcgRGlhbG9ndWVDaG9pY2UoXCJkNzllOTk1NS1mODFlLTRhYzktODI0Ni1hMDJiMGJkNDlkYWVcIik7XHJcbiAgICAgICAgY2hvaWNlLnNldFNheSgoKSA9PiB7IHJldHVybiBuZXcgU2F5KFNhdmVIYW5kbGVyLmdldFNheUZvclNsb3QoNCkpO30pO1xyXG4gICAgICAgIGNob2ljZS5zZXROZXh0KFwiZWU0ZWNkOGItNTllMi00M2E2LTgxNTAtOGE4MzVkNmVlYWUxXCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShjaG9pY2UpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIG5vZGUgPSBuZXcgRGlhbG9ndWVOb2RlKFwiNzE5ZTcxZGQtOTk4OS00MDE1LTkzYWYtOWZiNzA5NjAwMmMxXCIpO1xyXG4gICAgICAgIG5vZGUuc2V0TmFtZShcIlNsb3RDaG9pY2VzXCIpO1xyXG4gICAgICAgIG5vZGUuc2V0Q2hvaWNlcyhbXCJlZjkyNTNiOS01YzI0LTQ2Y2MtOGUyZC01NTYyYTE1NDRmMDdcIixcIjgyYzUxMmM2LTAxMTUtNGQ3Mi1hNDEzLTU3MjhhNjIzZjA0YlwiLFwiNzMxNTgzNWEtNGQ5NS00Mzc3LTgyOGMtOGE0Y2E3ZTQ5Zjg3XCIsXCI1MGFmZDZmOC04N2NlLTQ5YmYtYjY4OS00ODE5YmM1ZGM4ZTdcIixcImQ3OWU5OTU1LWY4MWUtNGFjOS04MjQ2LWEwMmIwYmQ0OWRhZVwiLFwiOTQ4M2EwODctMDRkMC00OGRkLTg4NGYtOTQ2OTMwNzcxYjk1XCIsXCJkZWZlMGY0Yy00NDUyLTQwZjMtYWZmMS1iYTA3NjI2M2ZjYmNcIl0pO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShub2RlKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBzZXQgPSBuZXcgRGlhbG9ndWVTZXQoXCI5NTk0Y2YwNi02MDYyLTQ5NTItYjM3OC02YWVkYWFmZTI5NTFcIik7XHJcbiAgICAgICAgc2V0LnNldEZ1bmN0aW9uKCgpID0+IHtTYXZlSGFuZGxlci5zZXRTbG90KDApO30pO1xyXG4gICAgICAgIHNldC5zZXROZXh0KFwiYTZiNmIzZDItMjVlZi00MWIxLWE1YjUtMjUxNDNmMWI0MWY5XCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShzZXQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIHNldCA9IG5ldyBEaWFsb2d1ZVNldChcImZlOTVjZmIzLWI5ZjUtNGIxMi04M2FhLTk0ZDI2ZTViY2FjMFwiKTtcclxuICAgICAgICBzZXQuc2V0RnVuY3Rpb24oKCkgPT4ge1NhdmVIYW5kbGVyLnNldFNsb3QoMSk7fSk7XHJcbiAgICAgICAgc2V0LnNldE5leHQoXCJhNmI2YjNkMi0yNWVmLTQxYjEtYTViNS0yNTE0M2YxYjQxZjlcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKHNldCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgc2V0ID0gbmV3IERpYWxvZ3VlU2V0KFwiZGM4ODQ5NzQtN2JiMi00MzZmLWIzYTQtY2RmODU1MGJkNDk0XCIpO1xyXG4gICAgICAgIHNldC5zZXRGdW5jdGlvbigoKSA9PiB7U2F2ZUhhbmRsZXIuc2V0U2xvdCgyKTt9KTtcclxuICAgICAgICBzZXQuc2V0TmV4dChcImE2YjZiM2QyLTI1ZWYtNDFiMS1hNWI1LTI1MTQzZjFiNDFmOVwiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUoc2V0KTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBzZXQgPSBuZXcgRGlhbG9ndWVTZXQoXCI2MmY1ZWE4OC1jNmYwLTQ0NjktODdmMi1lYTNiMzc2Mzg1MDlcIik7XHJcbiAgICAgICAgc2V0LnNldEZ1bmN0aW9uKCgpID0+IHtTYXZlSGFuZGxlci5zZXRTbG90KDMpO30pO1xyXG4gICAgICAgIHNldC5zZXROZXh0KFwiYTZiNmIzZDItMjVlZi00MWIxLWE1YjUtMjUxNDNmMWI0MWY5XCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShzZXQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIHNldCA9IG5ldyBEaWFsb2d1ZVNldChcImVlNGVjZDhiLTU5ZTItNDNhNi04MTUwLThhODM1ZDZlZWFlMVwiKTtcclxuICAgICAgICBzZXQuc2V0RnVuY3Rpb24oKCkgPT4ge1NhdmVIYW5kbGVyLnNldFNsb3QoNCk7fSk7XHJcbiAgICAgICAgc2V0LnNldE5leHQoXCJhNmI2YjNkMi0yNWVmLTQxYjEtYTViNS0yNTE0M2YxYjQxZjlcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKHNldCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgc2V0ID0gbmV3IERpYWxvZ3VlU2V0KFwiZjI1ZjY1MjUtZGFkNi00NWQ3LWEzOTEtMjQ2YzFiMDJiNTY5XCIpO1xyXG4gICAgICAgIHNldC5zZXRGdW5jdGlvbigoKSA9PiB7cmV0dXJuIFNhdmVIYW5kbGVyLmxvYWRGcm9tRmlsZSgpO30pO1xyXG4gICAgICAgIHNldC5zZXROZXh0KFwiNWQxZGZiODYtYWJkOS00YWQ2LWJmMDctOGNlZDU0NzZlNDAxXCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShzZXQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIGNob2ljZSA9IG5ldyBEaWFsb2d1ZUNob2ljZShcIjk0ODNhMDg3LTA0ZDAtNDhkZC04ODRmLTk0NjkzMDc3MWI5NVwiKTtcclxuICAgICAgICBjaG9pY2Uuc2V0U2F5KCgpID0+IHsgcmV0dXJuIG5ldyBTYXkoXCJFcmFzZSBhIHNhdmVcIik7fSk7XHJcbiAgICAgICAgY2hvaWNlLnNldENvbmRpdGlvbnMoKCkgPT4geyByZXR1cm4gIVNhdmVIYW5kbGVyLmlzRXJhc2luZygpO30pO1xyXG4gICAgICAgIGNob2ljZS5zZXROZXh0KFwiZWU2NWM4NGEtMDIxZi00NGQzLWFhMzQtNTAyMzVmNDM4Yzk2XCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShjaG9pY2UpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIGNob2ljZSA9IG5ldyBEaWFsb2d1ZUNob2ljZShcImRlZmUwZjRjLTQ0NTItNDBmMy1hZmYxLWJhMDc2MjYzZmNiY1wiKTtcclxuICAgICAgICBjaG9pY2Uuc2V0U2F5KCgpID0+IHsgcmV0dXJuIG5ldyBTYXkoXCJEb24ndCBlcmFzZSBteSBzYXZlcyFcIik7fSk7XHJcbiAgICAgICAgY2hvaWNlLnNldENvbmRpdGlvbnMoKCkgPT4geyByZXR1cm4gU2F2ZUhhbmRsZXIuaXNFcmFzaW5nKCk7fSk7XHJcbiAgICAgICAgY2hvaWNlLnNldE5leHQoXCJlZTY1Yzg0YS0wMjFmLTQ0ZDMtYWEzNC01MDIzNWY0MzhjOTZcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKGNob2ljZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgc2V0ID0gbmV3IERpYWxvZ3VlU2V0KFwiZWU2NWM4NGEtMDIxZi00NGQzLWFhMzQtNTAyMzVmNDM4Yzk2XCIpO1xyXG4gICAgICAgIHNldC5zZXRGdW5jdGlvbigoKSA9PiB7U2F2ZUhhbmRsZXIudG9nZ2xlRXJhc2luZygpfSk7XHJcbiAgICAgICAgc2V0LnNldE5leHQoXCI2ZjE1ZjdkNi00OTQ0LTRiOTMtOWQ0Ny03MDQ2ZThhZTFmMTVcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKHNldCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgbm9kZSA9IG5ldyBEaWFsb2d1ZU5vZGUoXCI2ZjE1ZjdkNi00OTQ0LTRiOTMtOWQ0Ny03MDQ2ZThhZTFmMTVcIik7XHJcbiAgICAgICAgbm9kZS5zZXROZXh0KFwiU2xvdENob2ljZXNcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKG5vZGUpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIHNldCA9IG5ldyBEaWFsb2d1ZVNldChcIjkxNTQ5MmYxLThmYTctNGRkYy05ZGMwLTZiMDM0MGY3MzhjOFwiKTtcclxuICAgICAgICBzZXQuc2V0RnVuY3Rpb24oKCkgPT4ge3JldHVybiBTYXZlSGFuZGxlci5sb2FkRnJvbVN0b3JhZ2UoKTt9KTtcclxuICAgICAgICBzZXQuc2V0TmV4dChcImY4MmZjMTc3LWI0YmQtNGYwNi1iN2FiLTIxNjI1OWUwNTZhNVwiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUoc2V0KTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBub2RlID0gbmV3IERpYWxvZ3VlTm9kZShcImQ0YTM3OWI1LTA2YzktNGZjYS1hMjVjLWIxYTMxYjZiZjkzZFwiKTtcclxuICAgICAgICBub2RlLnNldE5leHQoXCJTZXR0aW5nc1wiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUobm9kZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgbm9kZSA9IG5ldyBEaWFsb2d1ZU5vZGUoXCI2YjNmMzg1Yi04MjgzLTQ2MzUtOWM3My1lMjMwM2Q3NzY0MmRcIik7XHJcbiAgICAgICAgbm9kZS5zZXROZXh0KFwiQWJvdXRcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKG5vZGUpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIG5vZGUgPSBuZXcgRGlhbG9ndWVOb2RlKFwiYjc1YzAzOGMtNjU0Yy00YzYyLThmNDktMmY0NTE4ZjUyY2ZmXCIpO1xyXG4gICAgICAgIG5vZGUuc2V0TmFtZShcIlNldHRpbmdzXCIpO1xyXG4gICAgICAgIG5vZGUuc2V0TmV4dChcImQzMzQ1NmI4LTcyYjYtNDIxNC05MGIzLTNlYmEyNDQyYjI4N1wiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUobm9kZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgdGV4dCA9IG5ldyBEaWFsb2d1ZVRleHQoXCJkMzM0NTZiOC03MmI2LTQyMTQtOTBiMy0zZWJhMjQ0MmIyODdcIik7XHJcbiAgICAgICAgdGV4dC5zZXRTYXkoKCkgPT4geyByZXR1cm4gbmV3IFNheShcIk5vdCBpbXBsZW1lbnRlZC5cIik7fSk7XHJcbiAgICAgICAgdGV4dC5zZXROZXh0KFwiYmMyNGI0NDYtZDZhMi00Mjg0LTkzZmItNjdhZDM1OThmY2QxXCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZSh0ZXh0KTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBzZXQgPSBuZXcgRGlhbG9ndWVTZXQoXCJiYzI0YjQ0Ni1kNmEyLTQyODQtOTNmYi02N2FkMzU5OGZjZDFcIik7XHJcbiAgICAgICAgc2V0LnNldEZ1bmN0aW9uKCgpID0+IHtyZXR1cm4gRWxlbWVudHMud2FpdEZvckFueUtleSgpO30pO1xyXG4gICAgICAgIHNldC5zZXROZXh0KFwiODFmOWQ2MmItOTA3ZS00OGFlLTg0ZmUtNzhjN2NlY2M0ZmUzXCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShzZXQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIG5vZGUgPSBuZXcgRGlhbG9ndWVOb2RlKFwiODFmOWQ2MmItOTA3ZS00OGFlLTg0ZmUtNzhjN2NlY2M0ZmUzXCIpO1xyXG4gICAgICAgIG5vZGUuc2V0TmV4dChcIjFcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKG5vZGUpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIG5vZGUgPSBuZXcgRGlhbG9ndWVOb2RlKFwiYzM0MmUxMTItNWM3My00YzgyLTg4ODItNDdjYTNhNzFjOTE0XCIpO1xyXG4gICAgICAgIG5vZGUuc2V0TmFtZShcIkFib3V0XCIpO1xyXG4gICAgICAgIG5vZGUuc2V0TmV4dChcImQzMzQ1NmI4LTcyYjYtNDIxNC05MGIzLTNlYmEyNDQyYjI4N1wiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUobm9kZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgY2hvaWNlID0gbmV3IERpYWxvZ3VlQ2hvaWNlKFwiYTU1ZjQ2ZmEtOThhOS00ZGZmLTlmMWMtNGY4OGMxOGNlOGRkXCIpO1xyXG4gICAgICAgIGNob2ljZS5zZXRTYXkoKCkgPT4geyByZXR1cm4gbmV3IFNheShcIk5vdGUgYWJvdXQgY29udGVudCAoU3BvaWxlciBBbGVydClcIik7fSk7XHJcbiAgICAgICAgY2hvaWNlLnNldE5leHQoXCI3YzIwNjBhYS02NmNlLTRkYmItODhkMi0wYzhmMTkwZTBhNmNcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKGNob2ljZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgdGV4dCA9IG5ldyBEaWFsb2d1ZVRleHQoXCI1OWEzY2IzMC1kNGJhLTRiNDYtODE1Ny1iOTAwZmM3MDIyZGRcIik7XHJcbiAgICAgICAgdGV4dC5zZXRTYXkoKCkgPT4geyByZXR1cm4gbmV3IFNheShTYXkuQ0VOVEVSRUQsIG5ldyBTYXlJbWFnZShcImludHJvTG9nb1wiKSwgU2F5LkxJTkVfQlJFQUssIG5ldyBTYXlJdGFsaWMoXCJUaGUgT2JlbGlzayBpcyBhbiBhZHVsdCBpbnRlcmFjdGl2ZSBmaWN0aW9uIGdhbWUgc2V0IGluIGEgcG9zdC1hcG9jYWx5cHRpYyB3b3JsZCByYXZhZ2VkIGJ5IGEgbWFnaWNhbCBzdHJ1Y3R1cmUuXCIpKTt9KTtcclxuICAgICAgICB0ZXh0LnNldE5leHQoXCIxYjhiZGM5ZC1hNGJmLTQwYWEtYTM4Mi1mNzgxM2MxNTg4NDBcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKHRleHQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIHNldCA9IG5ldyBEaWFsb2d1ZVNldChcImMyNzgyOWI3LTcxOTktNGIxZS05MzM0LTUzNjI1ODU0NmNmY1wiKTtcclxuICAgICAgICBzZXQuc2V0RnVuY3Rpb24oKCkgPT4ge3JldHVybiBFbGVtZW50cy53YWl0Rm9yQW55S2V5KCk7fSk7XHJcbiAgICAgICAgc2V0LnNldE5leHQoXCI0MjQwMTE0NS05MTU0LTQwYzMtYTlkMy00ZjgzZGY5N2I4OWVcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKHNldCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgbm9kZSA9IG5ldyBEaWFsb2d1ZU5vZGUoXCI0MjQwMTE0NS05MTU0LTQwYzMtYTlkMy00ZjgzZGY5N2I4OWVcIik7XHJcbiAgICAgICAgbm9kZS5zZXROZXh0KFwiMVwiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUobm9kZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgc2V0ID0gbmV3IERpYWxvZ3VlU2V0KFwiN2MyMDYwYWEtNjZjZS00ZGJiLTg4ZDItMGM4ZjE5MGUwYTZjXCIpO1xyXG4gICAgICAgIHNldC5zZXRGdW5jdGlvbigoKSA9PiB7RWxlbWVudHMuY2xlYXJNYWluU2NyZWVuKCk7fSk7XHJcbiAgICAgICAgc2V0LnNldE5leHQoXCI1OWEzY2IzMC1kNGJhLTRiNDYtODE1Ny1iOTAwZmM3MDIyZGRcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKHNldCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgdGV4dCA9IG5ldyBEaWFsb2d1ZVRleHQoXCIxYjhiZGM5ZC1hNGJmLTQwYWEtYTM4Mi1mNzgxM2MxNTg4NDBcIik7XHJcbiAgICAgICAgdGV4dC5zZXRTYXkoKCkgPT4geyByZXR1cm4gbmV3IFNheShcIkluIHRoaXMgc3RvcnksIHRoZSBPYmVsaXNrIHdpbGwgYXR0ZW1wdCB0byBnaXZlIHRoZSBwbGF5ZXIgZXhhY3RseSB3aGF0IHRoZSBwbGF5ZXIgd2FudHMsIGJ1dCB0aGF0J3Mgbm90IGFsd2F5cyB3aGF0IHRoZSBwbGF5ZXIgdGhpbmtzIHRoZXkgd2FudC4gVGhpcyBpcyBhIHBvcm5vZ3JhcGhpYyBnYW1lIGZpcnN0IGFuZCBhIHJvbGVwbGF5aW5nIGdhbWUgc2Vjb25kLCB3aGljaCBtZWFucyB0aGF0IGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgcGxheWVyIGNoYXJhY3RlciB3YW50cyBzZXggLSBldmVuIGlmIHRoZXkgZG9uJ3QgYWN0IGxpa2UgaXQuXCIsIFNheS5QQVJBR1JBUEhfQlJFQUssIFwiVGhlcmVmb3JlLCB0aGlzIGdhbWUgd2lsbCBcXFwiZml0XFxcIiBmb3IgcGxheWVycyB3aG8gZ28gaW4gd2l0aCB0aGF0IG1lbnRhbGl0eSwgYnV0IGl0IFwiLCBuZXcgU2F5Qm9sZChcIndpbGxcIiksIFwiIGxvb2sgZGlmZmVyZW50bHkgZm9yIHBsYXllcnMgd2l0aCBhIGRpZmZlcmVudCBwb2ludCBvZiB2aWV3IGZvciB0aGVpciBjaGFyYWN0ZXJzLiBXaGlsZSByb2xlcGxheWluZyBpcyBlbmNvdXJhZ2VkLCB0aGF0IGlzIG5vdCBob3cgdGhlIGdhbWUgd2FzIHdyaXR0ZW4sIHNvIGlmIHlvdSdyZSBwbGF5aW5nIGl0IHRoYXQgd2F5LCBpdCdzIGp1c3QgeW91ciBjaG9pY2UuXCIsIFNheS5QQVJBR1JBUEhfQlJFQUssIFwiVGhlcmUgaXMgbm8gc2V4IHdpdGhvdXQgZXhwbGljaXQgY29uc2VudCBmcm9tIHRoZSBOUENzOiBpbXBsaWNpdCBjb25zZW50IGlzIG9ubHkgdXNlZCBmb3IgdGhlIHBsYXllciBjaGFyYWN0ZXIsIGJlY2F1c2UgdGhhdCdzIHBhcnQgb2YgdGhlIHN0b3J5LiBJdCBpcyBwb3NzaWJsZSB0byByZW1vdmUgdGhlIHBsYXllcidzIGNvbnNlbnQsIHRoZXJlYnkgaGF2aW5nIG5vIHVud2FudGVkIHNleCBzY2VuZXMgb2NjdXIsIGJ5IHNldHRpbmcgdXAgdGhlIGNvbnRlbnQgb3B0aW9ucywgd2hpY2ggd2lsbCBkaXNhYmxlIGNvbnRlbnQgd2l0aG91dCBleHBsaWNpdCBjb25zZW50IChpLmUuIGRpc2FibGluZyBNL00gU2V4IFNjZW5lcyBtZWFucyB0aGlzIGtpbmQgb2YgdGhpbmcgd2lsbCBvbmx5IGhhcHBlbiBpZiB5b3UgYWN0aXZlbHkgYXNrIGFuIE5QQyBmb3IgaXQpLlwiLCBTYXkuUEFSQUdSQVBIX0JSRUFLLCBcIldoaWxlIHRoZSBjb250ZW50IG9wdGlvbnMgYXJlIHRoZXJlIHRvIHRhaWxvciB5b3VyIGV4cGVyaWVuY2UsIHRoZSBnYW1lIGlzIG1hZGUgd2l0aCBcXFwiYWxsIGNvbnRlbnQgaXMgYXZhaWxhYmxlXFxcIiBpbiBtaW5kLCB3aGljaCBtaWdodCByZXN1bHQgaW4gYSBwbGF5dGhyb3VnaCB0aGF0J3Mgbm90IG11Y2ggZnVuIGlmIHlvdSBkaXNhYmxlIHRvbyBtYW55IHRoaW5ncy4gU3RpbGwsIHRoYXQncyB5b3VyIGNob2ljZS4gR2FtZSBvbi5cIik7fSk7XHJcbiAgICAgICAgdGV4dC5zZXROZXh0KFwiYzI3ODI5YjctNzE5OS00YjFlLTkzMzQtNTM2MjU4NTQ2Y2ZjXCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZSh0ZXh0KTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBicmFuY2ggPSBuZXcgRGlhbG9ndWVCcmFuY2goXCJhNmI2YjNkMi0yNWVmLTQxYjEtYTViNS0yNTE0M2YxYjQxZjlcIik7XHJcbiAgICAgICAgYnJhbmNoLnNldFZhcmlhYmxlKCgpID0+IHsgcmV0dXJuIFNhdmVIYW5kbGVyLmlzVmlyZ2luKCk7fSk7XHJcbiAgICAgICAgYnJhbmNoLmFkZEJyYW5jaChcImQwZGNkN2M2LTI2YWUtNDFkMC05OWE2LWUwY2FlMTdhZTM4MVwiLCAoKSA9PiB7IHJldHVybiB0cnVlO30pO1xyXG4gICAgICAgIGJyYW5jaC5zZXROZXh0KFwiOTE1NDkyZjEtOGZhNy00ZGRjLTlkYzAtNmIwMzQwZjczOGM4XCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShicmFuY2gpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIHRleHQgPSBuZXcgRGlhbG9ndWVUZXh0KFwiYjhlZTY3MDItOGQzOC00YmQ3LTliMjQtZGY4YzkwMWE1MGQ0XCIpO1xyXG4gICAgICAgIHRleHQuc2V0U2F5KCgpID0+IHsgcmV0dXJuIG5ldyBTYXkobmV3IFNheUJvbGQoXCJBIG5vdGUgb24gc2F2ZXM6IFwiKSwgXCJUaGUgc2VsZWN0ZWQgc2xvdCB3aWxsIGJlIHNhdmVkIHRvIGJyb3dzZXIgc3RvcmFnZSwgc28gaXQgd2lsbCBiZSBkZWxldGVkIGlmIHRoZSBicm93c2VyIGV2ZXIgZGVjaWRlcyB0byBkZWxldGUgaXQuIFRoZSBnYW1lIHdpbGwgd3JpdGUgdG8gdGhhdCBzYXZlIHNsb3QgZXZlcnkgdHVybiwgc28geW91IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhhdC4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBtYW51YWxseSBzYXZlIGluLWdhbWUsIHdoaWNoIHdpbGwgc2F2ZSB0byBhIGZpbGUuXCIpO30pO1xyXG4gICAgICAgIHRleHQuc2V0TmV4dChcIjUwODc2ZTEzLTIzYjktNDNjMC1iNmIxLWE4OWIxNjgzZDVlN1wiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUodGV4dCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgc2V0ID0gbmV3IERpYWxvZ3VlU2V0KFwiNTA4NzZlMTMtMjNiOS00M2MwLWI2YjEtYTg5YjE2ODNkNWU3XCIpO1xyXG4gICAgICAgIHNldC5zZXRGdW5jdGlvbigoKSA9PiB7cmV0dXJuIEVsZW1lbnRzLndhaXRGb3JBbnlLZXkoKTt9KTtcclxuICAgICAgICBzZXQuc2V0TmV4dChcIjkxNTQ5MmYxLThmYTctNGRkYy05ZGMwLTZiMDM0MGY3MzhjOFwiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUoc2V0KTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBzZXQgPSBuZXcgRGlhbG9ndWVTZXQoXCJkMGRjZDdjNi0yNmFlLTQxZDAtOTlhNi1lMGNhZTE3YWUzODFcIik7XHJcbiAgICAgICAgc2V0LnNldEZ1bmN0aW9uKCgpID0+IHtFbGVtZW50cy5jbGVhck1haW5TY3JlZW4oKTt9KTtcclxuICAgICAgICBzZXQuc2V0TmV4dChcImI4ZWU2NzAyLThkMzgtNGJkNy05YjI0LWRmOGM5MDFhNTBkNFwiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUoc2V0KTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gdHJlZTtcclxuICAgIH0pKCk7XHJcbn0iXX0=
|