12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174 |
- (function() {
- var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
- var __module = nodeEnv ? module : {exports:{}};
- var __filename = 'preview-scripts/assets/script/common/fight.js';
- var __require = nodeEnv ? function (request) {
- return cc.require(request);
- } : function (request) {
- return __quick_compile_project__.require(request, __filename);
- };
- function __define (exports, require, module) {
- if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
- cc._RF.push(module, 'f5f42tcbclIcpDHlnWP5kBv', 'fight');
- // script/common/fight.ts
- // import * as Xys from "./Xys";
- // import Gamecfg from "./gameCfg";
- // import { SeedRand, gameMethod } from "./gameMethod";
- // //辅助函数 - 添加属性值
- // interface skbuff_add_cs {
- // fiid: string; //添加对象
- // key: string; //属性key
- // minZhen: number; //开始帧
- // maxZhen: number; //结束帧
- // overlayType: number; // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: number; //增加层数
- // eps: { [key: string]: number }; //属性
- // }
- // interface Gzhit {
- // pghit: number; //普攻伤害
- // skhit: number; //技能伤害
- // bjhit: number; //暴击伤害
- // gdhit: number; //格挡伤害
- // fjhit: number; //反击伤害
- // ljhit: number; //连击伤害
- // jshit: number; //溅射伤害(没有折损比例系数)
- // xxhit: number; //吸血值
- // xxRate: number; //吸血概率
- // jsRate: number; //溅射概率
- // fjsRate: number; //反击溅射概率
- // }
- // interface timer_add_cs {
- // iid: string; //触发者
- // fiids: string[]; //触发对象
- // key: string; //定时器标识
- // type: number[]; //执行触发点
- // func: "sk_effect" | "sk_action"; //执行的函数名
- // lzhen: number; //轮询执行时间
- // ezhen: number; //结束时间
- // skid: string; //技能ID
- // aeid: string; //效果ID|行为ID
- // cs: { [key: string]: number }; //参数
- // overlayType: number; // 1:叠加 2:不叠加替换
- // }
- // export class Fight {
- // teams: { [iid: string]: Xys.FightTeam } = {}; //战斗成员列表
- // seedRand: SeedRand; //随机种子函数
- // from: string; //战斗类型
- // timerId: number = 1; //定时计数器
- // uuids: {
- // [iid: string]: {
- // drain_sk: number; // 是否带有灵力术法
- // last: number; //最后一次出手帧
- // last2: number; //真正出手的帧
- // cons: number[]; //攻击次数 (普通+技能,被动不算) [攻击次数,连击次数,反击次数]
- // fcons: number[]; //被攻击次数 (普通+技能,被动不算) [攻击次数,连击次数,反击次数]
- // dzhen: number; //死亡的帧数
- // fpk: string; //最后一次伤害我的对象
- // ipk: string; //我打的最后一个
- // ipks: { [zhen: number]: string[] }; //我打的最后一个
- // podun: string[]; //盾没有了需要清除buff
- // skbuff: {
- // [key: string]: {
- // szhen: number; //开始帧
- // ezhen: number; //结束帧
- // eps: { [key: string]: number }; //属性值
- // }[];
- // };
- // skbase: {
- // //技能触发
- // [base_id: string]: {
- // last: number; //技能最后一次出手帧
- // count: number;
- // action: {
- // [action_id: string]: {};
- // };
- // effect: {
- // [effect_id: string]: {
- // effectZhen: number; //触发效果的帧(有时候同时一个攻击 好几个人触发效果分开计算的 会导致第一个人有触发 后面的没有触发)
- // effectEndZhen: number; //效果结束帧率(持续x秒,冷却x秒用的)
- // nextcd: number; //下一次冷却完成时间
- // count: number; //执行次数
- // f: number; //执行次数
- // };
- // };
- // };
- // };
- // //定时执行 [执行触发点,执行的函数名,轮询执行时间,技能ID, 效果ID|行为ID]
- // timer: {
- // [key: string]: {
- // [timerId: string]: {
- // fiids: string[]; //触发对象
- // type: number[]; //执行触发点
- // func: "sk_effect" | "sk_action"; //执行的函数名
- // szhen: number; //触发的帧
- // lzhen: number; //轮询执行时间
- // ezhen: number; //结束时间帧
- // skid: string; //技能ID
- // aeid: string; //效果ID|行为ID
- // cs: { [key: string]: number }; //
- // };
- // };
- // };
- // //执行触发点=>
- // //1:每帧开始执行 2:扣血执行 3:攻击后触发 4攻击前触发 5护体罡气破碎时触发
- // //6 :己方单位施加击退时 7 :普通攻击触发 8自身受到超过当前气血10%以上伤害时
- // //9:暴击触发
- // };
- // } = {}; //存放身份
- // objects: {
- // [len: string]: {
- // [type: string]: {
- // // 作用对象 1主角 2弟子 3兽灵
- // [skid: string]: {
- // //技能触发
- // cd: number; // 技能触发cd
- // sklv: number; // 技能等级
- // iids: {
- // [iid: string]: {
- // next: number; //技能最后一次出手帧
- // };
- // };
- // };
- // };
- // };
- // } = {}; //存放uid类型触发技能
- // zhen: number = 0; //初始帧
- // //单次出手临时记录
- // oneAtk: {
- // [iid: string]: {
- // [fiid: string]: {
- // aType: Xys.ActionType; //战斗动作类型
- // aSkid: ""; //使用的技能ID
- // effect: [string, number][]; //触发效果 [ [属性key,层数]]
- // buff: [string, number][]; //触发效果 [ [属性key,数值]]
- // };
- // };
- // } = {};
- // oneAtkiids: string[] = []; //日志顺序
- // //单帧出手对象
- // oneFiids: { [iid: string]: { [key: string]: string[] } } = {};
- // oneHit: {
- // [iid: string]: {
- // [fiid: string]: Gzhit;
- // };
- // } = {};
- // oneBuff: { [iid: string]: number } = {}; //存储当前帧 有改变buff的角色ID
- // mpfiids: { [iid: string]: [number, number] } = {}; // 单帧MP指回复一次
- // jsFiids: { [iid: string]: { [fiid: string]: number } } = {}; //溅射
- // //存储所有战场日志
- // outf: Xys.OverBack = {
- // win: 0, //0失败 1胜利
- // start: {
- // //初始阵容
- // from: "", //战斗类型
- // seed: 0, //随机种子
- // teams: {},
- // power: 0,
- // fPower: 0,
- // },
- // log: {}, //战斗日志列表
- // hurt: 0,
- // hp: 0, //战斗结束 对手剩余血量
- // tongji: {},
- // xhid:""
- // };
- // //血量变化相关字段
- // xueku: string[] = ["hp", "baoji", "lianji", "fanji", "canbeatback"];
- // // 减益buff
- // bateBuff: string[] = ["effect_i_1", "effect_i_3", "effect_i_4", "effect_i_5", "effect_i_6", "effect_i_7"];
- // teamFiids: string[] = [];
- // skBuff: {
- // [iid: string]: {
- // key: any;
- // value: any;
- // buff: {
- // [key: string]: {
- // key: any;
- // value: any;
- // };
- // };
- // };
- // } = {};
- // skTimer: {
- // [iid: string]: {
- // key: any;
- // value: any;
- // timer: {
- // [key: string]: {
- // key: any;
- // value: any;
- // };
- // };
- // };
- // } = {};
- // damage: {
- // [iid: string]: {
- // [fiid: string]: number;
- // };
- // } = {};
- // constructor(fightStart: Xys.ActFightStart) {
- // this.powerDisparity("1000", "100", fightStart.power, fightStart.fPower);
- // this.outf.start = gameMethod.objCopy(fightStart);
- // this.teams = gameMethod.objCopy(fightStart.teams); //战斗成员列表
- // this.seedRand = new SeedRand(fightStart.seed); //随机种子
- // this.from = fightStart.from; //战斗类型
- // this.teamFiids = Object.keys(this.teams);
- // this.war_init();
- // this.war_loop();
- // }
- // /*
- // * 技能buff
- // * this.uuids[cs.fiid].skbuff[cs.key]
- // * */
- // private changeSkBuff(sType: number, iid?: string | null, key?: string | null, type: number = 1, data?: any) {
- // switch (sType) {
- // case 1: // 查询 type:1.keys 2.values
- // if (iid) {
- // return this.getSkBuff(type, iid, key);
- // }
- // break;
- // case 2: // 更新/新增 type:1.替换 2.叠加
- // if (data) {
- // this.setSkBuff(data, iid, key, type);
- // }
- // break;
- // case 3: // 删除
- // if (iid) {
- // this.delSkBuff(iid, key);
- // }
- // break;
- // }
- // }
- // private setSkBuff(data: any, iid?: string | null, key?: string | null, type: number = 1) {
- // if (iid && key) {
- // if (type == 1) {
- // this.uuids[iid].skbuff[key] = data;
- // } else {
- // if (this.uuids[iid].skbuff[key] == null) {
- // this.uuids[iid].skbuff[key] = [];
- // }
- // this.uuids[iid].skbuff[key].push(...data);
- // }
- // if (this.skBuff[iid] == null) {
- // this.skBuff[iid] = { key: [], value: [], buff: {} };
- // }
- // if (this.skBuff[iid].buff[key] == null) {
- // this.skBuff[iid].buff[key] = { key: [], value: [] };
- // }
- // let keys2 = Object.keys(this.uuids[iid].skbuff);
- // let values2 = Object.values(this.uuids[iid].skbuff);
- // this.skBuff[iid].key = keys2;
- // this.skBuff[iid].value = values2;
- // this.skBuff[iid].buff[key].key = Object.keys(this.uuids[iid].skbuff[key]);
- // this.skBuff[iid].buff[key].value = Object.values(this.uuids[iid].skbuff[key]);
- // } else if (iid && !key) {
- // if (type == 1) {
- // this.uuids[iid].skbuff = data;
- // this.skBuff[iid] = { key: [], value: [], buff: {} };
- // } else {
- // this.uuids[iid].skbuff = Object.assign(this.uuids[iid].skbuff, data);
- // }
- // if (this.skBuff[iid] == null) {
- // this.skBuff[iid] = { key: [], value: [], buff: {} };
- // }
- // let keys2 = Object.keys(this.uuids[iid].skbuff);
- // let values2 = Object.values(this.uuids[iid].skbuff);
- // this.skBuff[iid].key = keys2;
- // this.skBuff[iid].value = values2;
- // for (let k = 0; k < keys2.length; k++) {
- // if (this.skBuff[iid].buff[keys2[k]] == null) {
- // this.skBuff[iid].buff[keys2[k]] = { key: [], value: [] };
- // }
- // this.skBuff[iid].buff[keys2[k]].key = Object.keys(this.uuids[iid].skbuff[keys2[k]]);
- // this.skBuff[iid].buff[keys2[k]].value = Object.values(this.uuids[iid].skbuff[keys2[k]]);
- // }
- // } else if (!iid && !key && data) {
- // let keys = this.teamFiids;
- // for (let i = 0; i < keys.length; i++) {
- // let keys2 = Object.keys(this.uuids[keys[i]].skbuff);
- // let values2 = Object.values(this.uuids[keys[i]].skbuff);
- // if (this.skBuff[keys[i]] == null) {
- // this.skBuff[keys[i]] = { key: [], value: [], buff: {} };
- // }
- // this.skBuff[keys[i]].key = keys2;
- // this.skBuff[keys[i]].value = values2;
- // for (let k = 0; k < keys2.length; k++) {
- // if (this.skBuff[keys[i]].buff[keys2[k]] == null) {
- // this.skBuff[keys[i]].buff[keys2[k]] = { key: [], value: [] };
- // }
- // this.skBuff[keys[i]].buff[keys2[k]].key = Object.keys(this.uuids[keys[i]].skbuff[keys2[k]]);
- // this.skBuff[keys[i]].buff[keys2[k]].value = Object.values(this.uuids[keys[i]].skbuff[keys2[k]]);
- // }
- // }
- // }
- // }
- // private delSkBuff(iid: string, key?: string | null) {
- // if (iid && key) {
- // delete this.uuids[iid].skbuff[key];
- // if (this.skBuff[iid] == null) {
- // this.skBuff[iid] = { key: [], value: [], buff: {} };
- // }
- // delete this.skBuff[iid].buff[key];
- // this.skBuff[iid].key = Object.keys(this.uuids[iid].skbuff);
- // this.skBuff[iid].value = Object.values(this.uuids[iid].skbuff);
- // } else if (iid && !key) {
- // if (this.skBuff[iid] == null) {
- // this.skBuff[iid] = { key: [], value: [], buff: {} };
- // }
- // this.uuids[iid].skbuff = {};
- // this.skBuff[iid].buff = {};
- // this.skBuff[iid].key = [];
- // this.skBuff[iid].value = [];
- // }
- // }
- // private getSkBuff(type: number, iid: string, key?: string | null) {
- // if (type == 1) {
- // if (iid && key) {
- // if (this.skBuff[iid] && this.skBuff[iid].buff[key]) {
- // return this.skBuff[iid].buff[key].key;
- // } else {
- // return [];
- // }
- // } else if (iid) {
- // if (this.skBuff[iid]) {
- // return this.skBuff[iid].key;
- // } else {
- // return [];
- // }
- // }
- // } else {
- // if (iid && key) {
- // if (this.skBuff[iid] && this.skBuff[iid].buff[key]) {
- // return this.skBuff[iid].buff[key].value;
- // } else {
- // return [];
- // }
- // } else if (iid) {
- // if (this.skBuff[iid]) {
- // return this.skBuff[iid].value;
- // } else {
- // return [];
- // }
- // }
- // }
- // }
- // /*
- // * 定时器timer
- // * this.uuids[iid].timer[key]
- // * */
- // private changeTimer(sType: number, iid?: string | null, key?: string | null, type: number = 1, data?: any) {
- // switch (sType) {
- // case 1: // 查询 type:1.keys 2.values
- // if (iid) {
- // return this.getTimer(type, iid, key);
- // }
- // break;
- // case 2: // 更新/新增 type:1.替换 2.叠加
- // if (data) {
- // this.setTimer(data, iid, key, type);
- // }
- // break;
- // case 3: // 删除
- // if (iid) {
- // this.delTimer(iid, key);
- // }
- // break;
- // }
- // }
- // private setTimer(data: any, iid?: string | null, key?: string | null, type: number = 1) {
- // if (iid && key) {
- // if (type == 1) {
- // this.uuids[iid].timer[key] = data;
- // } else {
- // if (this.uuids[iid].timer[key] == null) {
- // this.uuids[iid].timer[key] = {};
- // }
- // this.uuids[iid].timer[key] = Object.assign(this.uuids[iid].timer[key], data);
- // }
- // if (this.skTimer[iid] == null) {
- // this.skTimer[iid] = { key: [], value: [], timer: {} };
- // }
- // if (this.skTimer[iid].timer[key] == null) {
- // this.skTimer[iid].timer[key] = { key: [], value: [] };
- // }
- // let keys2 = Object.keys(this.uuids[iid].timer);
- // let values2 = Object.values(this.uuids[iid].timer);
- // this.skTimer[iid].key = keys2;
- // this.skTimer[iid].value = values2;
- // this.skTimer[iid].timer[key].key = Object.keys(this.uuids[iid].timer[key]);
- // this.skTimer[iid].timer[key].value = Object.values(this.uuids[iid].timer[key]);
- // } else if (iid && !key) {
- // if (type == 1) {
- // this.uuids[iid].timer = data;
- // this.skTimer[iid] = { key: [], value: [], timer: {} };
- // } else {
- // this.uuids[iid].timer = Object.assign(this.uuids[iid].timer, data);
- // }
- // if (this.skTimer[iid] == null) {
- // this.skTimer[iid] = { key: [], value: [], timer: {} };
- // }
- // let keys2 = Object.keys(this.uuids[iid].timer);
- // let values2 = Object.values(this.uuids[iid].timer);
- // this.skTimer[iid].key = keys2;
- // this.skTimer[iid].value = values2;
- // for (let k = 0; k < keys2.length; k++) {
- // if (this.skTimer[iid].timer[keys2[k]] == null) {
- // this.skTimer[iid].timer[keys2[k]] = { key: [], value: [] };
- // }
- // this.skTimer[iid].timer[keys2[k]].key = Object.keys(this.uuids[iid].timer[keys2[k]]);
- // this.skTimer[iid].timer[keys2[k]].value = Object.values(this.uuids[iid].timer[keys2[k]]);
- // }
- // } else if (!iid && !key && data) {
- // let keys = this.teamFiids;
- // for (let i = 0; i < keys.length; i++) {
- // let keys2 = Object.keys(this.uuids[keys[i]].timer);
- // let values2 = Object.values(this.uuids[keys[i]].timer);
- // if (this.skTimer[keys[i]] == null) {
- // this.skTimer[keys[i]] = { key: [], value: [], timer: {} };
- // }
- // this.skTimer[keys[i]].key = keys2;
- // this.skTimer[keys[i]].value = values2;
- // for (let k = 0; k < keys2.length; k++) {
- // if (this.skTimer[keys[i]].timer[keys2[k]] == null) {
- // this.skTimer[keys[i]].timer[keys2[k]] = { key: [], value: [] };
- // }
- // this.skTimer[keys[i]].timer[keys2[k]].key = Object.keys(this.uuids[keys[i]].timer[keys2[k]]);
- // this.skTimer[keys[i]].timer[keys2[k]].value = Object.values(this.uuids[keys[i]].timer[keys2[k]]);
- // }
- // }
- // }
- // }
- // private delTimer(iid: string, key?: string | null) {
- // if (iid && key) {
- // delete this.uuids[iid].timer[key];
- // if (this.skTimer[iid] == null) {
- // this.skTimer[iid] = { key: [], value: [], timer: {} };
- // }
- // if (this.skTimer[iid] && this.skTimer[iid].timer[key]) {
- // delete this.skTimer[iid].timer[key];
- // }
- // this.skTimer[iid].key = Object.keys(this.uuids[iid].timer);
- // this.skTimer[iid].value = Object.values(this.uuids[iid].timer);
- // } else if (iid && !key) {
- // if (this.skTimer[iid] == null) {
- // this.skTimer[iid] = { key: [], value: [], timer: {} };
- // }
- // this.uuids[iid].timer = {};
- // this.skTimer[iid].timer = {};
- // this.skTimer[iid].key = [];
- // this.skTimer[iid].value = [];
- // }
- // }
- // private getTimer(type: number, iid: string, key?: string | null) {
- // if (type == 1) {
- // if (iid && key) {
- // if (this.skTimer[iid] && this.skTimer[iid].timer[key]) {
- // return this.skTimer[iid].timer[key].key;
- // } else {
- // return [];
- // }
- // } else if (iid) {
- // if (this.skTimer[iid]) {
- // return this.skTimer[iid].key;
- // } else {
- // return [];
- // }
- // }
- // } else {
- // if (iid && key) {
- // if (this.skTimer[iid] && this.skTimer[iid].timer[key]) {
- // return this.skTimer[iid].timer[key].value;
- // } else {
- // return [];
- // }
- // } else if (iid) {
- // if (this.skTimer[iid]) {
- // return this.skTimer[iid].value;
- // } else {
- // return [];
- // }
- // }
- // }
- // }
- // /**
- // * 初始化战斗
- // */
- // private war_init() {
- // this.zhen = 1;
- // let minLast: number = 99999;
- // for (let index = 0; index < this.teamFiids.length; index++) {
- // let fiid = this.teamFiids[index];
- // //初始化 这里in没关系
- // let last = Math.ceil(30 / (this.teams[fiid].eps.speed / 10000));
- // minLast = Math.min(minLast, last);
- // }
- // minLast = -1 * (minLast - 5); // 最快的那个人从第五帧开始打
- // //初始化存储
- // let drain_sk: number = 0;
- // for (let index = 0; index < this.teamFiids.length; index++) {
- // let fiid = this.teamFiids[index];
- // if (drain_sk == 0 && ["100", "1000"].includes(fiid)) {
- // drain_sk = 1; // 直接都可以加
- // /*let skids: string[] = Object.keys(this.teams[fiid].sk);
- // for (let index = 0; index < skids.length; index++) {
- // let sk_base = Gamecfg.skillBase.getItem(skids[index], "1");
- // if (sk_base && sk_base.drain > 0) {
- // drain_sk = 1;
- // break;
- // }
- // }*/
- // }
- // //初始化 这里in没关系
- // this.uuids[fiid] = {
- // drain_sk: drain_sk,
- // last: minLast,
- // last2: 0,
- // cons: [0, 0, 0],
- // fcons: [0, 0, 0],
- // podun: [],
- // skbuff: {},
- // skbase: {},
- // fpk: "",
- // ipk: "", //我打的最后一个
- // ipks: {}, //我打的最后一个
- // dzhen: 0,
- // timer: {},
- // };
- // }
- // }
- // /**
- // * 开始战斗
- // */
- // private war_loop() {
- // this.outf.win = 0;
- // while (this.zhen < 1350) {
- // this.outf.log[this.zhen] = [];
- // this.oneAtkiids = [];
- // this.oneAtk = {};
- // this.mpfiids = {};
- // this.oneFiids = {}; //上一帧的对手清空
- // this.oneHit = {}; //上一帧的伤害清空
- // this.oneBuff = {}; //清除上一帧的变动buff的fiid
- // this.jsFiids = {};
- // if (this.zhen == 1) {
- // //触发进入战斗技能
- // for (let i = 0; i < this.teamFiids.length; i++) {
- // this.sk_baseObjRun4(this.teamFiids[i]); //技能转换
- // }
- // for (let i = 0; i < this.teamFiids.length; i++) {
- // this.sk_base(this.teamFiids[i], 4); //技能触发
- // }
- // //灵力满怒时释放
- // if (this.teams["100"] != null && this.teams["100"].eps.mp >= 10000) {
- // let result = this.sk_base("100", 3); //技能触发
- // if (result){ // 技能释放成功才扣怒气
- // this.add_mp("100", -10000, 2);
- // }
- // }
- // if (this.teams["1000"] != null && this.teams["1000"].eps.mp >= 10000) {
- // let result = this.sk_base("1000", 3); //技能触发
- // if (result){ // 技能释放成功才扣怒气
- // this.add_mp("1000", -10000, 2);
- // }
- // }
- // }
- // if (this.zhen == 2){
- // for (let i = 0; i < this.teamFiids.length; i++) {
- // if(this.teams[this.teamFiids[i]].type == 4 || this.teams[this.teamFiids[i]].type == 5){
- // this.sk_base(this.teamFiids[i], 1); //boss和秘境怪优先出手一次
- // }
- // }
- // }
- // this.pk_zhen_buff(); //一帧前
- // // if(this.zhen == 150 && this.teams["1002"] != null){
- // // this.jiesuo_hide("1002")
- // // this.teams["1002"].isHide = 0
- // // }
- // this.pk_zhen_atk(); //一帧中
- // this.pk_zhen_over(); //一帧后
- // this.jueSuanOneAtk();
- // //输出buff
- // this.skbuff_outf();
- // this.jueSuanOneAtk();
- // //删除空白日志
- // if (this.outf.log[this.zhen].length == 0) {
- // delete this.outf.log[this.zhen];
- // }
- // //判断胜负
- // let mfcount: number = 0; //我方活着的人数
- // let fcount: number = 0; //我方活着的人数
- // for (let index = 0; index < this.teamFiids.length; index++) {
- // let fiid = this.teamFiids[index];
- // //这里用in 没关系
- // if (this.teams[fiid].type == 3) {
- // continue; //兽灵不计入胜负计算
- // }
- // if (this.teams[fiid].type == 4 && Number(fiid) % 100 == 0 && this.teams[fiid].eps.hp <= 0) {
- // fcount = 0; // 如果是打boss的 boss死了战斗结束 胜利
- // break;
- // }
- // if (Math.floor(Number(fiid) / 100) >= 10 && (this.teams[fiid].eps.hp > 0 || this.skbuff_get(fiid,"effect_i_63",2) > 0)) {// 还可以复活
- // mfcount += 1;
- // }
- // if (Math.floor(Number(fiid) / 100) < 10 && (this.teams[fiid].eps.hp > 0 || this.skbuff_get(fiid,"effect_i_63",2) > 0)) { // 还可以复活
- // fcount += 1;
- // }
- // }
- // if (mfcount < 1) {
- // return; //输了
- // }
- // if (fcount < 1) {
- // this.outf.win = 1; //赢了
- // return;
- // }
- // this.zhen++;
- // }
- // }
- // /**
- // * 出手(前)
- // */
- // private pk_zhen_buff() {
- // //定时执行
- // for (let i = 0; i < this.teamFiids.length; i++) {
- // if (gameMethod.isEmpty(this.teams[this.teamFiids[i]].isHide) == false) {
- // continue; //隐藏
- // }
- // this.timer_do(601, { do_iid: Number(this.teamFiids[i]) }); //每帧检测
- // this.timer_do(602, { do_iid: Number(this.teamFiids[i]) }); //每帧检测
- // }
- // for (let i = 0; i < this.teamFiids.length; i++) {
- // if (gameMethod.isEmpty(this.teams[this.teamFiids[i]].isHide) == false) {
- // continue; //隐藏
- // }
- // if (this.teams[this.teamFiids[i]].eps.hp <= 0) {
- // continue; //还没活
- // }
- // this.oneFiids[this.teamFiids[i]] = {}; //初始化各个iid
- // }
- // }
- // /**
- // * 出手(中)
- // */
- // private pk_zhen_atk() {
- // let iid: string;
- // for (let i = 0; i < this.teamFiids.length; i++) {
- // iid = this.teamFiids[i];
- // if (gameMethod.isEmpty(this.teams[iid].isHide) == false) {
- // continue; //隐藏
- // }
- // this.pk_zhen_atk_one(iid);
- // this.skbuff_sub_all(iid, "effect_i_75");
- // // 快剑印记去除
- // let eff_i_19 = this.skbuff_get(iid, "effect_i_19", 2);
- // if (eff_i_19 > 0 && this.uuids[iid].last2 + 7 * 30 <= this.zhen) {
- // // 拥有印记 并且已经7秒没有出手
- // this.skbuff_sub_all(iid, "effect_i_19");
- // this.skbuff_sub_all(iid, "effect_i_23");
- // }
- // // 复活buff
- // let eff_i_36 = this.skbuff_get(iid, "effect_i_36", 2);
- // if (eff_i_36 > 0 && this.skbuff_get(iid, "i_36_nZhen") <= this.zhen) {
- // // 复活
- // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
- // this.addOneAtk(iid, iid, "effect", ["hp", this.skbuff_get(iid, "i_36")]);
- // this.skbuff_sub_all(iid, "effect_i_36");
- // }
- // this.jueSuanOneAtk();
- // }
- // }
- // /**
- // * 出手(中) - 一个人出手
- // * @param iid 出手人
- // */
- // private pk_zhen_atk_one(iid: string) {
- // if (this.skbuff_get(iid, "hp") <= 0) {
- // return; //还没活
- // }
- // if (!this.checkHit(iid)) {
- // return; // 乙方都死了 兽灵不能攻击
- // }
- // let i_speed: number = this.skbuff_get(iid, "speed");
- // i_speed = i_speed > 50000 ? 50000 : i_speed;
- // let last = Math.ceil(30 / (i_speed / 10000));
- // if (this.uuids[iid].last + last > this.zhen) {
- // return; //不是当前帧
- // }
- // // this.uuids[iid].last += last; todo 这里不要打开 攻击频率会有问题
- // this.sk_base(iid, 1); //技能触发
- // //灵力满怒时释放
- // if (this.teams["100"] != null && this.teams["100"].eps.mp >= 10000) {
- // let result = this.sk_base("100", 3); //技能触发
- // if (result){ // 技能释放成功才扣怒气
- // this.jueSuanOneAtk()
- // this.add_mp("100", -10000, 2);
- // }
- // }
- // if (this.teams["1000"] != null && this.teams["1000"].eps.mp >= 10000) {
- // let result = this.sk_base("1000", 3); //技能触发
- // if (result){ // 技能释放成功才扣怒气
- // this.jueSuanOneAtk()
- // this.add_mp("1000", -10000, 2);
- // }
- // }
- // }
- // /*
- // * 主角弟子都死了 兽灵不能攻击
- // * */
- // private checkHit(iid: string) {
- // if (parseInt(iid) % 100 != 10) {
- // return true;
- // }
- // let count = 0;
- // for (let i = 0; i < this.teamFiids.length; i++) {
- // if (this.teamFiids[i] != iid && this.teamFiids[i].length == iid.length && !this.uuids[this.teamFiids[i]].dzhen) {
- // count++;
- // break;
- // }
- // }
- // if (!count) {
- // return false;
- // } else {
- // return true;
- // }
- // }
- // /**
- // * 触发一次伤害
- // * @param iid 攻击者
- // * @param fiid 被打者
- // */
- // private sk_action_type_1(iid: string, fiid: string, skid: string, acId: string): { [key: string]: number } {
- // if (gameMethod.isEmpty(this.teams[iid].isHide) == false) {
- // return {}; //隐藏
- // }
- // let cfgAc = Gamecfg.skillAction.getItem(acId);
- // if (cfgAc == null) {
- // return {};
- // }
- // if (this.oneHit[iid] == null || this.oneHit[iid][fiid] == null) {
- // return {};
- // }
- // let cfgSk = Gamecfg.skillBase.getItem(skid, "1");
- // if (cfgSk == null) {
- // return {}; //没有这个技能 或者 这个技能的触发时机不对
- // }
- // let jituiarr: (string | number)[] = []; //击退
- // if (cfgAc.args["s"] != null && this.seedRand.rand(1, 10000) <= cfgAc.args["p"] * 10000) {
- // jituiarr = ["jitui", cfgAc.args["s"]];
- // }
- // this.addOneAtk(iid, iid, "aType", Xys.ActionType.atk);
- // this.addOneAtk(iid, iid, "aSkid", skid);
- // this.uuids[fiid].fpk = iid; //记录最后一次打伤我的人
- // this.uuids[iid].ipk = fiid;
- // if (this.uuids[iid].ipks[this.zhen] == null) {
- // this.uuids[iid].ipks[this.zhen] = [];
- // }
- // this.uuids[iid].ipks[this.zhen].push(fiid);
- // this.uuids[iid].last2 = this.zhen;
- // let main_iid = iid.length > 3 ? "1000" : "100";
- // if (Number(iid) % 100 < 10 && this.uuids[main_iid] && this.uuids[main_iid].drain_sk > 0) {
- // let cfgMath = Gamecfg.mathInfo.getItem("battle_lingli");
- // if (cfgMath != null && cfgMath.pram.items != null) {
- // let llmin = cfgMath.pram.items[1][0];
- // let llMax = cfgMath.pram.items[1][1];
- // this.add_mp(main_iid, this.seedRand.rand(llmin, llMax), 2);
- // }
- // }
- // this.timer_do(106, { do_iid: Number(fiid) }); //被打前触发
- // this.timer_do(209, { do_iid: Number(iid) }); //攻击结算前触发
- // //各种伤害计算
- // let gzhit = this.oneHit[iid][fiid];
- // let hit: number = gzhit.pghit; //总伤害
- // if (cfgSk.skillType == 3) {
- // hit = gzhit.skhit;
- // }
- // if (cfgSk.drain > 0) {
- // // 术法伤害增加
- // let i_73 = this.skbuff_get(iid, "i_73");
- // let i_qhmifa = this.skbuff_get(iid, "qhmifa");
- // let f_rhmifa = this.skbuff_get(fiid, "rhmifa");
- // hit += Math.floor(hit * ((i_73 + i_qhmifa - f_rhmifa) / 10000));
- // }
- // let result = { do_iid: Number(fiid), hit: 0 };
- // // 攻击 =》
- // // 》 判定连击(需要判定有没有触发暴击) | 判定溅射(需要判定有没有触发暴击)
- // // 》没用连击 没用溅射 =》 判定暴击
- // // 》 如果没有暴击 才是 普通攻击
- // // | 吸血
- // // 》被打 格挡 | 反击(溅射(需要判定有没有触发暴击) 如果没有溅射才判定暴击 ) 没有暴击 就是普通攻击 + 吸血
- // // 反击被打的也要判定 格挡
- // // 结束了
- // // 是否连击
- // let islj: number = this.isLianji(iid, fiid);
- // let isNext: number = 0; //0默认 1停止 2已经触发暴击
- // if (islj) {
- // isNext = 1;
- // this.uuids[iid].cons[1] += 1; //记录攻击次数
- // this.uuids[fiid].fcons[1] += 1; //记录攻击次数
- // // 是否暴击
- // let isBj: number = this.isBaoji(iid, fiid);
- // if (isBj) {
- // isNext = 2;
- // } else {
- // let isGd = this.isGedang(iid, fiid); // 连击格挡
- // hit = gzhit.ljhit;
- // if (isGd) {
- // this.addOneAtk(iid, fiid, "effect", ["block", 1]);
- // hit -= gzhit.gdhit;
- // }
- // hit = this.hit_last(iid, fiid, hit);
- // this.addOneAtk(iid, fiid, "effect", ["lianji", -1 * hit].concat(jituiarr), skid);
- // result.hit += hit;
- // }
- // }
- // //是否溅射
- // let isJs = this.seedRand.rand(1, 10000) <= gzhit.jsRate;
- // if (isJs) {
- // isNext = 1;
- // let isBj: number = this.isBaoji(iid, fiid);
- // if (isBj) {
- // isNext = 2;
- // } else {
- // // 溅射伤害增加
- // let i_81 = this.skbuff_get(iid, "i_81");
- // if (i_81 != 0) {
- // hit = Math.floor(hit * (i_81 / 10000 + 1));
- // }
- // let isGd = this.isGedang(iid, fiid); // 连击格挡
- // if (isGd) {
- // this.addOneAtk(iid, fiid, "effect", ["block", 1]);
- // hit -= gzhit.gdhit;
- // }
- // hit = this.hit_last(iid, fiid, hit);
- // this.addOneAtk(iid, fiid, "effect", ["hp", -1 * hit], skid);
- // let jsxishu: number[] = [1, 0.75, 0.7, 0.58, 0.5];
- // let jsfiids = this.find_jianse_fiid(fiid, cfgAc.distance);
- // let allHit: number = 0;
- // let maxLen = Math.min(jsfiids.length, jsxishu.length);
- // for (let index = 0; index < maxLen; index++) {
- // if (jsfiids[index] == null) {
- // break;
- // }
- // if (i_81 != 0) {
- // hit = Math.floor(hit * (i_81 / 10000 + 1));
- // }
- // hit = Math.floor(gzhit.jshit * jsxishu[maxLen - 1]);
- // let isGd = this.isGedang(iid, jsfiids[index]); // 连击格挡
- // if (isGd) {
- // this.addOneAtk(iid, jsfiids[index], "effect", ["block", 1]);
- // hit -= gzhit.gdhit;
- // }
- // hit = this.hit_last(iid, jsfiids[index], hit);
- // this.addOneAtk(iid, jsfiids[index], "effect", ["jianshe", -1 * hit].concat(jituiarr));
- // this.sk_base(jsfiids[index], 2, { hit: hit }); //被攻击
- // allHit += hit;
- // }
- // this.timer_do(205, { do_iid: Number(iid), hit: allHit }); //溅射触发
- // }
- // }
- // //判定是否暴击
- // if (isNext == 0) {
- // let isBj: number = this.isBaoji(iid, fiid);
- // if (isBj) {
- // isNext = 2;
- // }
- // }
- // //暴击
- // if (isNext == 2) {
- // this.uuids[iid].cons[0] += 1; //记录攻击次数
- // this.uuids[fiid].fcons[0] += 1; //记录攻击次数
- // let isGd = this.isGedang(iid, fiid); // 连击格挡
- // if (isGd) {
- // this.addOneAtk(iid, fiid, "effect", ["block", 1]);
- // hit -= gzhit.gdhit;
- // }
- // hit = this.hit_last(iid, fiid, gzhit.bjhit);
- // this.addOneAtk(iid, fiid, "effect", ["baoji", -1 * hit].concat(jituiarr), skid);
- // this.timer_do(203, { do_iid: Number(iid), hit: hit, isBj: hit }); //暴击触发
- // result.hit += hit;
- // }
- // //普通攻击
- // if (isNext == 0) {
- // this.uuids[iid].cons[0] += 1; //记录攻击次数
- // this.uuids[fiid].fcons[0] += 1; //记录攻击次数
- // let isGd = this.isGedang(iid, fiid); // 连击格挡
- // if (isGd) {
- // this.addOneAtk(iid, fiid, "effect", ["block", 1]);
- // hit -= gzhit.gdhit;
- // }
- // hit = this.hit_last(iid, fiid, gzhit.pghit);
- // this.addOneAtk(iid, fiid, "effect", ["hp", -1 * hit].concat(jituiarr), skid);
- // //this.timer_do(203, { do_iid: Number(iid), hit: hit, isBj: hit }); //暴击触发
- // result.hit += hit;
- // }
- // //是否吸血
- // if (gzhit.xxhit > 0) {
- // this.addOneAtk(iid, iid, "effect", ["hp", gzhit.xxhit]);
- // }
- // if (cfgSk.skillType == 3) {
- // this.timer_do(207, { do_iid: Number(iid), hit: result.hit }); //技能触发
- // this.timer_do(102, { do_iid: Number(fiid), hit: result.hit }); //被打触发(技能)
- // } else {
- // this.timer_do(201, { do_iid: Number(iid), hit: result.hit }); //普通攻击触发
- // this.timer_do(103, { do_iid: Number(fiid), hit: result.hit }); //被打触发(普通)
- // }
- // if (cfgSk.drain > 0) {
- // this.timer_do(208, { do_iid: Number(iid), hit: result.hit }); //术法触发
- // }
- // // 触发连击buff
- // if (islj) {
- // this.timer_do(202, { do_iid: Number(iid), hit: result.hit }); //连击触发
- // this.timer_do(101, { do_iid: Number(fiid), hit: result.hit }); //连击触发 被打
- // this.sk_base(iid, 9, { hit: result.hit });
- // }
- // // 触发暴击buff
- // if (isNext == 2) {
- // this.sk_base(iid, 10, { hit: result.hit });
- // }
- // this.sk_base(fiid, 2, { hit: result.hit }); //被攻击
- // //反击
- // this.sk_action_type_1_fanji(fiid, iid, gzhit);
- // return result;
- // }
- // /**
- // * 触发一次反击
- // * @param iid 攻击者
- // * @param fiid 被打者
- // * @param hit
- // * @param cs
- // */
- // private sk_action_type_1_fanji(iid: string, fiid: string, gzhit: Gzhit) {
- // if (this.teams[iid].type == 3 || this.teams[fiid].type == 3) {
- // return;
- // }
- // if (this.jueFiidHp(fiid)<=0){ // 死了不能反击
- // return;
- // }
- // // 被打的是否被冰冻
- // let eff_i_3 = this.skbuff_get(iid, "effect_i_3", 2);
- // if (eff_i_3 > 0) {
- // return; //晕眩
- // }
- // let eff_i_5 = this.skbuff_get(iid, "effect_i_5", 2);
- // if (eff_i_5 > 0) {
- // return; //冰冻
- // }
- // let isNext: number = 0; //0停止 1继续 2暴击
- // //技能反击
- // let cbback = this.skbuff_get(iid, "canbeatback", 2);
- // if (cbback > 0) {
- // isNext = 1;
- // this.skbuff_sub(iid, "canbeatback");
- // }
- // let isEpfj: number = 0;
- // if (isNext == 0) {
- // //触发反击
- // let isfj: number = this.isFanji(iid, fiid);
- // if (isfj) {
- // isNext = 1;
- // isEpfj = 1;
- // }
- // }
- // if (isNext == 0) {
- // return;
- // }
- // //找出反击者的普通攻击
- // let pskid: string = "";
- // let ackid: number = 0;
- // let skids: string[] = Object.keys(this.teams[iid].sk);
- // for (let index = 0; index < skids.length; index++) {
- // let cfgSk = Gamecfg.skillBase.getItem(skids[index], "1");
- // if (cfgSk != null && cfgSk.skillType == 1) {
- // pskid = skids[index];
- // ackid = cfgSk.actions[0];
- // break;
- // }
- // }
- // if (pskid == "") {
- // return;
- // }
- // this.addOneAtk(iid, iid, "aType", Xys.ActionType.fanji);
- // this.addOneAtk(iid, iid, "aSkid", pskid);
- // this.uuids[iid].cons[2] += 1;
- // this.uuids[fiid].fcons[2] += 1;
- // //伤害
- // let hit = gzhit.fjhit;
- // let i_rhblock: number = this.skbuff_get(iid, "rhblock");
- // //是否溅射
- // let isJs = this.seedRand.rand(1, 10000) <= gzhit.fjsRate;
- // if (isJs) {
- // let isBj: number = this.isBaoji(iid, fiid);
- // if (isBj) {
- // isNext = 2;
- // } else {
- // // 溅射伤害增加
- // let i_81 = this.skbuff_get(iid, "i_81");
- // if (i_81 != 0) {
- // hit = Math.floor(hit * (i_81 / 10000 + 1));
- // }
- // let isGd = this.isGedang(iid, fiid); // 连击格挡
- // if (isGd) {
- // this.addOneAtk(iid, fiid, "effect", ["block", 1]);
- // //格挡伤害= MIN(技能伤害*(MAX(敌方格挡增强-我方格挡减弱,0.12)),技能伤害*0.9)
- // let f_qhblock: number = this.skbuff_get(fiid, "qhblock");
- // let fgd_hit: number = Math.min(gzhit.fjhit * Math.max(0.12, (f_qhblock - i_rhblock) / 10000), gzhit.fjhit * 0.9);
- // hit -= Math.floor(fgd_hit);
- // }
- // hit = this.hit_last(iid, fiid, hit);
- // this.addOneAtk(iid, fiid, "effect", ["fanji", -1 * hit], pskid);
- // let jsxishu: number[] = [1, 0.75, 0.7, 0.58, 0.5];
- // let distance = 0;
- // if (ackid != 0) {
- // let cfgAc = Gamecfg.skillAction.getItem(ackid.toString());
- // if (cfgAc != null) {
- // distance = cfgAc.distance;
- // }
- // }
- // let jsfiids = this.find_jianse_fiid(fiid, distance);
- // let allHit: number = 0;
- // let maxLen = Math.min(jsfiids.length, jsxishu.length);
- // for (let index = 0; index < maxLen; index++) {
- // if (jsfiids[index] == null) {
- // break;
- // }
- // if (i_81 != 0) {
- // hit = Math.floor(hit * (i_81 / 10000 + 1));
- // }
- // hit = Math.floor(gzhit.jshit * jsxishu[maxLen - 1]);
- // let isGd = this.isGedang(iid, jsfiids[index]); // 连击格挡
- // if (isGd) {
- // this.addOneAtk(iid, jsfiids[index], "effect", ["block", 1]);
- // let f_qhblock: number = this.skbuff_get(fiid, "qhblock");
- // let fgd_hit: number = Math.min(gzhit.fjhit * Math.max(0.12, (f_qhblock - i_rhblock) / 10000), gzhit.fjhit * 0.9);
- // hit -= Math.floor(fgd_hit);
- // }
- // hit = this.hit_last(iid, jsfiids[index], hit);
- // this.addOneAtk(iid, jsfiids[index], "effect", ["fanji", -1 * hit]);
- // this.sk_base(jsfiids[index], 2, { hit: hit }); //被攻击
- // allHit += hit;
- // }
- // this.timer_do(205, { do_iid: Number(iid), hit: allHit }); //溅射触发
- // }
- // }
- // //判定是否暴击
- // if (isNext == 1) {
- // let isBj: number = this.isBaoji(iid, fiid);
- // if (isBj) {
- // isNext = 2;
- // }
- // }
- // //暴击
- // if (isNext == 2) {
- // this.uuids[iid].cons[0] += 1; //记录攻击次数
- // this.uuids[fiid].fcons[0] += 1; //记录攻击次数
- // let isGd = this.isGedang(iid, fiid); // 连击格挡
- // if (isGd) {
- // this.addOneAtk(iid, fiid, "effect", ["block", 1]);
- // let f_qhblock: number = this.skbuff_get(fiid, "qhblock");
- // let fgd_hit: number = Math.min(gzhit.fjhit * Math.max(0.12, (f_qhblock - i_rhblock) / 10000), gzhit.fjhit * 0.9);
- // hit -= fgd_hit;
- // }
- // hit = this.hit_last(iid, fiid, gzhit.bjhit);
- // this.addOneAtk(iid, fiid, "effect", ["baoji", -1 * hit]);
- // this.timer_do(203, { do_iid: Number(iid), hit: hit, isBj: hit }); //暴击触发
- // }
- // //普通攻击
- // if (isNext == 1) {
- // let isGd = this.isGedang(iid, fiid); // 格挡
- // if (isGd) {
- // this.addOneAtk(iid, fiid, "effect", ["block", 1]);
- // let f_qhblock: number = this.skbuff_get(fiid, "qhblock");
- // let fgd_hit: number = Math.min(gzhit.fjhit * Math.max(0.12, (f_qhblock - i_rhblock) / 10000), gzhit.fjhit * 0.9);
- // hit -= fgd_hit;
- // }
- // hit = this.hit_last(iid, fiid, hit);
- // this.addOneAtk(iid, fiid, "effect", ["fanji", -1 * hit]);
- // this.timer_do(203, { do_iid: Number(iid), hit: hit, isBj: hit }); //暴击触发
- // }
- // //吸血率=max((我方吸血-敌方抗吸血),吸血保底参数)
- // //吸血值= 最终伤害值*max(我方吸血增强-敌方吸血减弱,1)*吸血率
- // let i_xixue: number = this.skbuff_get(iid, "xixue");
- // let f_hsxixue: number = this.skbuff_get(fiid, "hsxixue");
- // let bdxixue: number = 0; //保底吸血
- // let cfg = Gamecfg.userEp.getItem("xixue");
- // if (cfg != null) {
- // bdxixue = cfg.initEp;
- // }
- // let xxRate: number = Math.max(i_xixue - f_hsxixue, bdxixue);
- // let i_qhxixue: number = this.skbuff_get(iid, "qhxixue");
- // let f_rhxixue: number = this.skbuff_get(fiid, "rhxixue");
- // let xx_hit: number = Math.floor((gzhit.fjhit * Math.max((i_qhxixue - f_rhxixue) / 10000 + 1, 1) * xxRate) / 10000);
- // //是否吸血
- // if (xx_hit>0) {
- // this.addOneAtk(iid, iid, "effect", ["hp", xx_hit]);
- // }
- // this.timer_do(204, { do_iid: Number(iid), hit: hit }); //反击触发
- // if (isEpfj) {
- // // 反击获得buff
- // let skids: string[] = Object.keys(this.teams[iid].sk);
- // for (let index = 0; index < skids.length; index++) {
- // let cfgSk = Gamecfg.skillBase.getItem(skids[index], "1");
- // if (cfgSk && cfgSk.runStatus === 7) {
- // for (let index = 0; index < cfgSk.effect.length; index++) {
- // let effectId = cfgSk.effect[index];
- // this.sk_effect(fiid, skids[index], effectId.toString(), "", { hit: hit });
- // }
- // }
- // }
- // }
- // }
- // /**
- // * 出手(后)
- // */
- // private pk_zhen_over() {
- // //死亡触发
- // for (let index = 0; index < this.teamFiids.length; index++) {
- // let fiid = this.teamFiids[index];
- // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
- // continue; //隐藏
- // }
- // if (this.teams[fiid].eps.hp > 0) {
- // continue; //还活着
- // }
- // if (this.uuids[fiid].dzhen > 0) {
- // continue; //之前已经死了
- // }
- // this.uuids[fiid].dzhen = this.zhen; //那一帧死了
- // this.teams[fiid].eps.hp = 0;
- // this.timer_do(402, { do_iid: Number(fiid) }); //死亡触发
- // this.jiesuo_hide(fiid);
- // }
- // //清除过期buff
- // this.skbuff_clear();
- // }
- // /**
- // * 单次出手临时存储信息 - 记录
- // */
- // addOneAtk(iid: string, fiid: string, key: string, val: any, skid: string = "") {
- // if (!this.oneAtkiids.includes(iid)) {
- // this.oneAtkiids.push(iid);
- // }
- // //初始化
- // if (this.oneAtk[iid] == null) {
- // this.oneAtk[iid] = {};
- // }
- // if (this.uuids[iid].dzhen > 0 && this.uuids[iid].dzhen < this.zhen) {
- // return; //已经死了 ,不要在折腾了
- // }
- // if (this.uuids[fiid].dzhen > 0 && this.uuids[fiid].dzhen < this.zhen) {
- // return; //已经死了 ,不要在折腾了
- // }
- // if (this.oneAtk[iid][fiid] == null) {
- // this.oneAtk[iid][fiid] = {
- // aType: Xys.ActionType.default, //动作类型
- // aSkid: "", //使用的技能ID
- // effect: [],
- // buff: [],
- // };
- // }
- // //目标治疗效果降低/增加
- // if (val[0] == "hp" && val[1] > 0 && this.skbuff_get(fiid, "effect_i_62", 2) > 0) {
- // let f_i_62 = this.skbuff_get(fiid, "i_62");
- // val[1] += Math.floor((val[1] * f_i_62) / 10000);
- // val[1] = Math.max(0, val[1]);
- // }
- // //单次伤害不超过自身最大生命值的x%
- // if (this.xueku.includes(val[0]) && val[1] < 0) {
- // let f_i_71 = this.skbuff_get(fiid, "max_i_71");
- // if (f_i_71 > 0 && Math.abs(val[1]) > f_i_71 && this.skbuff_get(fiid, "max_i_71_nZhen") <= this.zhen) {
- // let max_i_71_cd = this.skbuff_get(fiid, "max_i_71_cd");
- // if (max_i_71_cd > 0) {
- // this.skbuff_update(fiid, { max_i_71_nZhen: this.zhen + max_i_71_cd * 30 });
- // }
- // val[1] = -f_i_71;
- // }
- // }
- // //统计
- // if (this.outf.tongji[fiid] == null) {
- // this.outf.tongji[fiid] = {
- // shuchu: 0, //输出
- // zhiliao: 0, //治疗
- // chengshang: 0, //承伤
- // };
- // }
- // if (this.outf.tongji[iid] == null) {
- // this.outf.tongji[iid] = {
- // shuchu: 0, //输出
- // zhiliao: 0, //治疗
- // chengshang: 0, //承伤
- // };
- // }
- // switch (key) {
- // case "aType": //动作类型
- // //已经是攻击类型, 就不要再改了
- // if (this.oneAtk[iid][fiid].aType != Xys.ActionType.atk) {
- // this.oneAtk[iid][fiid].aType = val;
- // }
- // break;
- // case "aSkid": //使用的技能ID
- // this.oneAtk[iid][fiid].aSkid = val;
- // break;
- // case "effect": //特效
- // this.oneAtk[iid][fiid].effect.push(val);
- // if (this.xueku.includes(val[0]) && val[1] < 0) {
- // //统计
- // this.outf.tongji[iid].shuchu += Math.abs(val[1]);
- // this.outf.tongji[fiid].chengshang += Math.abs(val[1]);
- // let main_iid = fiid.length > 3 ? "1000" : "100";
- // if (Number(fiid) % 100 < 10 && this.uuids[main_iid] && this.uuids[main_iid].drain_sk > 0) {
- // let cfgMath = Gamecfg.mathInfo.getItem("battle_lingli");
- // if (cfgMath != null && cfgMath.pram.items != null) {
- // let llmin = cfgMath.pram.items[0][0];
- // let llMax = cfgMath.pram.items[0][1];
- // this.add_mp(main_iid, this.seedRand.rand(llmin, llMax), 2);
- // }
- // }
- // }
- // if (this.xueku.includes(val[0]) && val[1] > 0) {
- // //统计
- // this.outf.tongji[fiid].zhiliao += Math.abs(val[1]);
- // //回血触发(治疗触发/吸血触发--这3个是一个意思)
- // this.timer_do(403, { do_iid: Number(fiid) });
- // }
- // break;
- // case "buff": //buff
- // this.oneAtk[iid][fiid].buff.push(val);
- // break;
- // }
- // }
- // /**
- // * 当前剩余血量
- // */
- // jueFiidHp(fiid: string) {
- // let lsf_hp: number = this.teams[fiid].eps.hp;
- // let iids = Object.keys(this.oneAtk);
- // for (let i = 0; i < iids.length; i++) {
- // if (this.oneAtk[iids[i]][fiid] == null) {
- // continue;
- // }
- // for (let k = 0; k < this.oneAtk[iids[i]][fiid].effect.length; k++) {
- // if (this.xueku.includes(this.oneAtk[iids[i]][fiid].effect[k][0])) {
- // lsf_hp += this.oneAtk[iids[i]][fiid].effect[k][1];
- // }
- // }
- // }
- // lsf_hp = Math.min(lsf_hp, this.skbuff_get(fiid, "hp_max"));
- // return lsf_hp;
- // }
- // /**
- // * 单次出手临时存储信息 - 结算
- // */
- // jueSuanOneAtk() {
- // if (gameMethod.isEmpty(this.oneAtk) == true) {
- // return;
- // }
- // // 结算前判定主角是否死亡 并且是否拥有复活buff 复活buff触发帧是否生效
- // let iids = ["100","1000"];
- // for (let i=0;i<iids.length;i++){
- // let iid = iids[i];
- // let hp = this.skbuff_get(iid, "hp");
- // if (hp <= 0 && this.skbuff_get(iid, "effect_i_63", 2) > 0) {
- // let i_63_cd = this.skbuff_get(iid, "i_63_cd")
- // if (i_63_cd > 0){ // 死亡后延迟x帧复活
- // //this.skbuff_update(iid, { "i_63_cd":-i_63_cd,"i_63_nZhen": this.zhen + i_63_cd });
- // }else if (this.skbuff_get(iid, "i_63_nZhen") <= this.zhen){
- // let addHp = this.skbuff_get(iid, "i_63_hp");
- // if (addHp > 0) {
- // this.skbuff_sub_all(iid,"effect_i_63")
- // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
- // this.addOneAtk(iid, iid, "effect", ["hp", addHp - hp]);
- // }
- // }
- // }
- // }
- // //攻打方
- // for (let i = 0; i < this.oneAtkiids.length; i++) {
- // let i_buff: [string, number][] = [];
- // let i_effect: [string, number][] = [];
- // let target: Xys.LogOneData[] = [];
- // let fiids = Object.keys(this.oneAtk[this.oneAtkiids[i]]);
- // for (let k = 0; k < fiids.length; k++) {
- // let chahp: number = 0;
- // //计算血量和伤害
- // for (let j = 0; j < this.oneAtk[this.oneAtkiids[i]][fiids[k]].effect.length; j++) {
- // let effect = this.oneAtk[this.oneAtkiids[i]][fiids[k]].effect[j];
- // if (this.xueku.includes(effect[0])) {
- // if (Number(fiids[k]) < 1000 && effect[1] < 0) {
- // this.outf.hurt += Math.abs(effect[1]); //计算伤害
- // }
- // if (effect[1] < 0) {
- // //扣血执行
- // this.timer_do(401, { do_iid: Number(fiids[k]), hit: Math.abs(effect[1]) });
- // this.timer_do(404, { do_iid: Number(fiids[k]), hit: Math.abs(effect[1]) });
- // this.timer_do(405, { do_iid: Number(this.oneAtkiids[i]), hit: Math.abs(effect[1]) }); //敌方扣血 我方加buff
- // }
- // if (this.teams[fiids[k]].eps.hp + chahp + effect[1] < 0) {
- // // 最后一下 如果对方被打死了 伤害不能超过对方血量
- // effect[1] = -(this.teams[fiids[k]].eps.hp + chahp);
- // }
- // if (effect[1] == 0 && this.teams[fiids[k]].eps.hp + chahp == 0) {
- // // 如果已经被打死了 删掉这个影响
- // this.oneAtk[this.oneAtkiids[i]][fiids[k]].effect.splice(j, 1);
- // j--;
- // }
- // chahp += effect[1];
- // }
- // }
- // this.teams[fiids[k]].eps.hp += chahp;
- // this.teams[fiids[k]].eps.hp = Math.min(this.skbuff_get(fiids[k], "hp_max"), this.teams[fiids[k]].eps.hp);
- // if (this.oneAtkiids[i] == fiids[k]) {
- // i_buff = this.oneAtk[this.oneAtkiids[i]][fiids[k]].buff;
- // i_effect = this.oneAtk[this.oneAtkiids[i]][fiids[k]].effect;
- // } else {
- // target.push({
- // fid: this.teams[fiids[k]].fid, //出手方Id
- // iid: fiids[k], //阵容下标
- // hp: this.teams[fiids[k]].eps.hp, //剩余血量
- // mp: this.teams[fiids[k]].eps.mp, //剩余怒气
- // buff: this.oneAtk[this.oneAtkiids[i]][fiids[k]].buff, //[ [生效帧开始,生效帧结束,buffKEY,触发的人]]
- // effect: this.oneAtk[this.oneAtkiids[i]][fiids[k]].effect, //触发效果 [ [属性key,数值]]
- // tongji:Math.abs(this.outf.tongji[fiids[k]]?.shuchu | 0),
- // zonji:0
- // });
- // }
- // this.oneAtk[this.oneAtkiids[i]][fiids[k]].effect = [];
- // }
- // this.teams[this.oneAtkiids[i]].eps.hp = Math.min(this.teams[this.oneAtkiids[i]].eps.hp, this.skbuff_get(this.oneAtkiids[i], "hp_max"));
- // // 把回血合并
- // let i_effect2:[string, number][] = []
- // let jisuan:{[key:string]:number} = {}
- // for (let item of i_effect){
- // if (this.xueku.includes(item[0]) && item[1] > 0){ //属于回血字段并且值大于0
- // if (jisuan[item[0]] == null){
- // jisuan[item[0]] = item[1]
- // }else {
- // jisuan[item[0]] += item[1]
- // }
- // }else{
- // i_effect2.push(item)
- // }
- // }
- // for (let key in jisuan){
- // i_effect2.push([key,jisuan[key]])
- // }
- // //初始化
- // let atker: Xys.LogOneData = {
- // fid: this.teams[this.oneAtkiids[i]].fid, //出手方Id
- // iid: this.oneAtkiids[i], //阵容下标
- // hp: this.teams[this.oneAtkiids[i]].eps.hp, //剩余血量
- // mp: this.teams[this.oneAtkiids[i]].eps.mp, //剩余怒气
- // buff: i_buff, //[ [生效帧开始,生效帧结束,buffKEY,触发的人]]
- // effect: i_effect2, //触发效果 [ [属性key,数值]]
- // tongji:Math.abs(this.outf.tongji[this.oneAtkiids[i]]?.shuchu | 0),
- // zonji:0
- // };
- // if (
- // this.oneAtk[this.oneAtkiids[i]][this.oneAtkiids[i]] != null &&
- // this.oneAtk[this.oneAtkiids[i]][this.oneAtkiids[i]].aType != Xys.ActionType.default
- // ) {
- // //添加日志
- // this.addOneLog({
- // aType: this.oneAtk[this.oneAtkiids[i]][this.oneAtkiids[i]].aType, //战斗动作类型
- // aSkid: this.oneAtk[this.oneAtkiids[i]][this.oneAtkiids[i]].aSkid, //使用的技能ID
- // fhp: 0,
- // atker: atker, //出手方
- // target: target, //目标
- // });
- // }
- // }
- // this.oneAtk = {};
- // this.oneAtkiids = [];
- // }
- // /**
- // * 战斗日志
- // */
- // addOneLog(log: Xys.fightLogOne) {
- // log.fhp = 0;
- // for (let index = 0; index < this.teamFiids.length; index++) {
- // let fiid = this.teamFiids[index];
- // //统计对方剩余总血量 in没关系
- // if (Number(fiid) >= 1000) {
- // continue; //自己人
- // }
- // if (this.teams[fiid].isHide != 0) {
- // continue; //隐藏不管
- // }
- // if (this.teams[fiid].type == 3) {
- // continue; //兽灵不管
- // }
- // if (this.teams[fiid].eps.hp < 1) {
- // continue; //死了不管
- // }
- // log.fhp += this.teams[fiid].eps.hp;
- // }
- // this.outf.log[this.zhen].push(log);
- // }
- // /**
- // * 战斗日志
- // */
- // over_back(): Xys.OverBack {
- // this.outf.hp = 0;
- // for (let index = 0; index < this.teamFiids.length; index++) {
- // let fiid = this.teamFiids[index];
- // if (fiid.length <= 3 && this.teams[fiid].eps.hp > 0 && this.teams[fiid].isHide == 0) {
- // this.outf.hp += this.teams[fiid].eps.hp;
- // }
- // }
- // this.outf.start.teams = this.teams;
- // return this.outf;
- // }
- // //***********************************************
- // /**
- // * 辅助函数 - 获取对手
- // * @param key 标识key
- // * @param iid 出手方
- // * @param ttype (1敌方全体,2前排敌方,3中排敌方,4后排敌方,5敌方随机,6自己,7已方全体,8已方随机)
- // * @param targetType 目标数量
- // */
- // private find_fiids(key: string, iid: string, ttype: number[], targetType: number, distance: number = 0) {
- // if (ttype.length <= 0) {
- // return; //沿用上一次的 可能没有上一次
- // }
- // if (this.oneFiids[iid] == null) {
- // this.oneFiids[iid] = {};
- // }
- // let fiids: string[] = [];
- // this.oneFiids[iid][key] = []; //重置 重新获取
- // //目标打击顺序
- // const mblist: { [mubiao: string]: { [yu: string]: number[] } } = {
- // "1": {
- // //1敌方全体 5敌方随机 7已方全体 8已方随机
- // "0": [1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17, 18, 0],
- // },
- // "2": {
- // //2前排敌方
- // "0": [2, 1, 3, 13, 14],
- // "2": [2, 1, 3, 13, 14],
- // "5": [2, 1, 3, 13, 14],
- // "8": [2, 1, 3, 13, 14],
- // "1": [3, 2, 14, 1, 13],
- // "4": [3, 2, 14, 1, 13],
- // "7": [3, 2, 14, 1, 13],
- // "3": [1, 13, 2, 3, 14],
- // "6": [1, 13, 2, 3, 14],
- // "9": [1, 13, 2, 3, 14],
- // "10": [3, 2, 14, 1, 13],
- // "11": [2, 1, 3, 13, 14],
- // "12": [1, 13, 2, 3, 14],
- // "13": [14, 3, 2, 1, 13],
- // "15": [14, 3, 2, 1, 13],
- // "17": [14, 3, 2, 1, 13],
- // "14": [13, 1, 2, 3, 14],
- // "16": [13, 1, 2, 3, 14],
- // "18": [13, 1, 2, 3, 14],
- // },
- // "3": {
- // //3中排敌方
- // "0": [5, 4, 6, 15, 16],
- // "2": [5, 4, 6, 15, 16],
- // "5": [5, 4, 6, 15, 16],
- // "8": [5, 4, 6, 15, 16],
- // "1": [6, 5, 16, 4, 15],
- // "4": [6, 5, 16, 4, 15],
- // "7": [6, 5, 16, 4, 15],
- // "3": [4, 15, 5, 6, 16],
- // "6": [4, 15, 5, 6, 16],
- // "9": [4, 15, 5, 6, 16],
- // "10": [6, 5, 16, 4, 15],
- // "11": [5, 4, 6, 15, 16],
- // "12": [4, 15, 5, 6, 16],
- // "13": [16, 6, 5, 4, 15],
- // "15": [16, 6, 5, 4, 15],
- // "17": [16, 6, 5, 4, 15],
- // "14": [15, 4, 5, 6, 16],
- // "16": [15, 4, 5, 6, 16],
- // "18": [15, 4, 5, 6, 16],
- // },
- // "4": {
- // //4后排敌方
- // "0": [8, 7, 9, 17, 18],
- // "2": [8, 7, 9, 17, 18],
- // "5": [8, 7, 9, 17, 18],
- // "8": [8, 7, 9, 17, 18],
- // "1": [9, 8, 18, 7, 17],
- // "4": [9, 8, 18, 7, 17],
- // "7": [9, 8, 18, 7, 17],
- // "3": [7, 8, 17, 9, 18],
- // "6": [7, 8, 17, 9, 18],
- // "9": [7, 8, 17, 9, 18],
- // "10": [9, 8, 18, 7, 17],
- // "11": [8, 7, 9, 17, 18],
- // "12": [7, 8, 17, 9, 18],
- // "13": [18, 9, 8, 7, 17],
- // "15": [18, 9, 8, 7, 17],
- // "17": [18, 9, 8, 7, 17],
- // "14": [17, 7, 8, 9, 18],
- // "16": [17, 7, 8, 9, 18],
- // "18": [17, 7, 8, 9, 18],
- // },
- // "5": {
- // //1敌方全体 5敌方随机 7已方全体 8已方随机
- // "0": [1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17, 18, 0],
- // },
- // "7": {
- // //1敌方全体 5敌方随机 7已方全体 8已方随机
- // "0": [1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17, 18, 0],
- // },
- // "8": {
- // //1敌方全体 5敌方随机 7已方全体 8已方随机
- // "0": [1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17, 18, 0],
- // },
- // "10": {
- // //1敌方全体 5敌方随机 7已方全体 8已方随机
- // "0": [1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17, 18, 0],
- // },
- // "11": {
- // //1敌方全体 5敌方随机 7已方全体 8已方随机
- // "0": [1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17, 18, 0],
- // },
- // "12": {
- // //1敌方全体 5敌方随机 7已方全体 8已方随机
- // "0": [1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17, 18, 0],
- // },
- // "13": {
- // //1敌方全体 5敌方随机 7已方全体 8已方随机
- // "0": [1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17, 18, 0],
- // },
- // "16": {
- // //1敌方全体 5敌方随机 7已方全体 8已方随机
- // "0": [1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17, 18, 0],
- // },
- // "17": {
- // //主角自己
- // "0": [0],
- // },
- // "18": {
- // //我方弟子
- // "0": [1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17, 18],
- // },
- // "20": {
- // //我方弟子
- // "0": [1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17, 18],
- // },
- // "22": {
- // //敌方全体异常
- // "0": [1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17, 18, 0],
- // },
- // "23": {
- // "0": [2, 5, 1, 3, 8, 13, 14, 4, 6, 15, 16, 7, 9, 17, 18, 0],
- // "2": [2, 5, 1, 3, 8, 13, 14, 4, 6, 15, 16, 7, 9, 17, 18, 0],
- // "5": [2, 5, 1, 3, 8, 13, 14, 4, 6, 15, 16, 7, 9, 17, 18, 0],
- // "8": [2, 5, 1, 3, 8, 13, 14, 4, 6, 15, 16, 7, 9, 17, 18, 0],
- // "11": [2, 5, 1, 3, 8, 13, 14, 4, 6, 15, 16, 7, 9, 17, 18, 0],
- // "1": [3, 6, 2, 14, 9, 1, 5, 16, 14, 4, 8, 18, 15, 7, 17, 0],
- // "4": [3, 6, 2, 14, 9, 1, 5, 16, 14, 4, 8, 18, 15, 7, 17, 0],
- // "7": [3, 6, 2, 14, 9, 1, 5, 16, 14, 4, 8, 18, 15, 7, 17, 0],
- // "10": [3, 6, 2, 14, 9, 1, 5, 16, 14, 4, 8, 18, 15, 7, 17, 0],
- // "3": [1, 4, 13, 2, 7, 3, 15, 5, 14, 6, 17, 8, 16, 9, 18, 0],
- // "6": [1, 4, 13, 2, 7, 3, 15, 5, 14, 6, 17, 8, 16, 9, 18, 0],
- // "9": [1, 4, 13, 2, 7, 3, 15, 5, 14, 6, 17, 8, 16, 9, 18, 0],
- // "12": [1, 4, 13, 2, 7, 3, 15, 5, 14, 6, 17, 8, 16, 9, 18, 0],
- // "13": [14, 16, 3, 18, 2, 6, 1, 5, 9, 13, 4, 8, 15, 7, 17, 0],
- // "15": [14, 16, 3, 18, 2, 6, 1, 5, 9, 13, 4, 8, 15, 7, 17, 0],
- // "17": [14, 16, 3, 18, 2, 6, 1, 5, 9, 13, 4, 8, 15, 7, 17, 0],
- // "14": [13, 15, 1, 17, 2, 4, 3, 5, 7, 14, 6, 8, 16, 9, 18, 0],
- // "16": [13, 15, 1, 17, 2, 4, 3, 5, 7, 14, 6, 8, 16, 9, 18, 0],
- // "18": [13, 15, 1, 17, 2, 4, 3, 5, 7, 14, 6, 8, 16, 9, 18, 0],
- // },
- // };
- // let yu = Math.floor(Number(iid) % 100).toString();
- // let iqz: number = 100; //我方前缀
- // let fqz: number = 1000; //对方前缀
- // if (Number(iid) >= 1000) {
- // fqz = 100;
- // iqz = 1000;
- // }
- // for (let i = 0; i < ttype.length; i++) {
- // if (fiids.length >= targetType) {
- // break; //已经找到了
- // }
- // let mubiao = ttype[i];
- // switch (mubiao) {
- // case 1: //1敌方全体
- // if (distance > 0) {
- // let fiid = (fqz + 5).toString();
- // fiids = this.find_jianse_fiid(fiid, distance);
- // if (this.teams[fiid] != null && this.uuids[fiid].dzhen == 0 && gameMethod.isEmpty(this.teams[fiid].isHide)) {
- // fiids.push((fqz + 5).toString());
- // }
- // } else {
- // for (let k = 0; k < mblist[mubiao.toString()]["0"].length; k++) {
- // let fiid = (fqz + mblist[mubiao.toString()]["0"][k]).toString();
- // let fHp = this.skbuff_get(fiid, "hp");
- // if (this.teams[fiid] == null || fHp <= 0) {
- // continue;
- // }
- // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
- // continue; //隐藏
- // }
- // fiids.push(fiid);
- // }
- // }
- // break;
- // case 2: //2前排敌方
- // case 3: //3中排敌方
- // case 4: //4后排敌方
- // let count = 0;
- // for (let k = 0; k < mblist[mubiao.toString()][yu].length; k++) {
- // let fiid = (fqz + mblist[mubiao.toString()][yu][k]).toString();
- // let fHp = this.skbuff_get(fiid, "hp");
- // if (this.teams[fiid] == null || fHp <= 0) {
- // continue;
- // }
- // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
- // continue; //隐藏
- // }
- // count += 1;
- // if (count > targetType) {
- // continue;
- // }
- // fiids.push(fiid);
- // }
- // break;
- // case 5: // 5敌方随机(不能随机同一个目标)
- // let cqlist5: string[] = [];
- // for (let k = 0; k < mblist[mubiao.toString()]["0"].length; k++) {
- // let fiid = (fqz + mblist[mubiao.toString()]["0"][k]).toString();
- // let fHp = this.skbuff_get(fiid, "hp");
- // if (this.teams[fiid] == null || fHp <= 0) {
- // continue;
- // }
- // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
- // continue; //隐藏
- // }
- // cqlist5.push(fiid);
- // }
- // fiids = this.seedRand.getRandArr(cqlist5, Math.min(cqlist5.length, targetType));
- // break;
- // case 6: //自己
- // fiids = [iid];
- // break;
- // case 7: //7已方全体
- // for (let k = 0; k < mblist[mubiao.toString()]["0"].length; k++) {
- // let fiid = (iqz + mblist[mubiao.toString()]["0"][k]).toString();
- // let fHp = this.skbuff_get(fiid, "hp");
- // if (this.teams[fiid] == null || fHp <= 0) {
- // continue;
- // }
- // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
- // continue; //隐藏
- // }
- // fiids.push(fiid);
- // }
- // break;
- // case 8: // 8已方随机(除自己外)(不可以随机同一个目标)
- // let cqlist8: string[] = [];
- // for (let k = 0; k < mblist[mubiao.toString()]["0"].length; k++) {
- // let fiid = (iqz + mblist[mubiao.toString()]["0"][k]).toString();
- // let fHp = this.skbuff_get(fiid, "hp");
- // if (this.teams[fiid] == null || fHp <= 0) {
- // continue;
- // }
- // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
- // continue; //隐藏
- // }
- // if (fiid == iid) {
- // //(除自己外)
- // continue;
- // }
- // cqlist8.push(fiid);
- // }
- // fiids = this.seedRand.getRandArr(cqlist8, Math.min(cqlist8.length, targetType));
- // break;
- // case 9: // 9上次攻击我的对象
- // if (!this.uuids[iid]) {
- // continue;
- // }
- // if (this.uuids[iid].fpk != "") {
- // fiids.push(this.uuids[iid].fpk);
- // }
- // break;
- // case 10: // 10敌方攻击力最高单位
- // let fMaxatk10: number = 0;
- // for (let k = 0; k < mblist[mubiao.toString()]["0"].length; k++) {
- // let fiid = (fqz + mblist[mubiao.toString()]["0"][k]).toString();
- // let fHp = this.skbuff_get(fiid, "hp");
- // if (this.teams[fiid] == null || fHp <= 0) {
- // continue;
- // }
- // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
- // continue; //隐藏
- // }
- // let fAtk = this.skbuff_get(fiid, "atk");
- // if (fAtk <= fMaxatk10) {
- // continue;
- // }
- // fMaxatk10 = fAtk;
- // fiids = [fiid];
- // }
- // break;
- // case 11: // 11敌方攻击力最低单位,
- // let fMinatk11: number = 999999999;
- // for (let k = 0; k < mblist[mubiao.toString()]["0"].length; k++) {
- // let fiid = (fqz + mblist[mubiao.toString()]["0"][k]).toString();
- // let fHp = this.skbuff_get(fiid, "hp");
- // if (this.teams[fiid] == null || fHp <= 0) {
- // continue;
- // }
- // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
- // continue; //隐藏
- // }
- // let fAtk = this.skbuff_get(fiid, "atk");
- // if (fAtk >= fMinatk11) {
- // continue;
- // }
- // fMinatk11 = fAtk;
- // fiids = [fiid];
- // }
- // break;
- // case 12: // 12敌方当前血量最低单位
- // let fMinhp12: number = 999999999;
- // for (let k = 0; k < mblist[mubiao.toString()]["0"].length; k++) {
- // let fiid = (fqz + mblist[mubiao.toString()]["0"][k]).toString();
- // let fHp = this.skbuff_get(fiid, "hp");
- // if (this.teams[fiid] == null || fHp <= 0) {
- // continue;
- // }
- // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
- // continue; //隐藏
- // }
- // let fAtk = this.skbuff_get(fiid, "hp");
- // if (fAtk >= fMinhp12) {
- // continue;
- // }
- // fMinhp12 = fAtk;
- // fiids = [fiid];
- // }
- // break;
- // case 13: // 13敌方当前血量最高单位,
- // let fMaxhp13: number = 0;
- // for (let k = 0; k < mblist[mubiao.toString()]["0"].length; k++) {
- // let fiid = (fqz + mblist[mubiao.toString()]["0"][k]).toString();
- // let fHp = this.skbuff_get(fiid, "hp");
- // if (this.teams[fiid] == null || fHp <= 0) {
- // continue;
- // }
- // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
- // continue; //隐藏
- // }
- // let fAtk = this.skbuff_get(fiid, "hp");
- // if (fAtk <= fMaxhp13) {
- // continue;
- // }
- // fMaxhp13 = fAtk;
- // fiids = [fiid];
- // }
- // break;
- // case 15: // 15 我打的最后一个
- // if (this.uuids[iid].ipk != "") {
- // fiids = [this.uuids[iid].ipk];
- // }
- // break;
- // case 16: //16生命值最低的已方单位)
- // let minHp: number = 0;
- // for (let k = 0; k < mblist[mubiao.toString()]["0"].length; k++) {
- // let fiid = (iqz + mblist[mubiao.toString()]["0"][k]).toString();
- // let fHp = this.skbuff_get(fiid, "hp");
- // if (this.teams[fiid] == null || fHp <= 0) {
- // continue;
- // }
- // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
- // continue; //隐藏
- // }
- // if (minHp == 0) {
- // fiids = [fiid];
- // minHp = fHp;
- // } else {
- // if (minHp > fHp) {
- // minHp = fHp;
- // fiids = [fiid];
- // }
- // }
- // }
- // break;
- // case 17: //17 我方主角
- // if (iqz.toString().length > 3) {
- // fiids = ["1000"];
- // } else {
- // fiids = ["100"];
- // }
- // break;
- // case 18: //18己方全体弟子
- // for (let k = 0; k < mblist[mubiao.toString()]["0"].length; k++) {
- // let fiid = (fqz + mblist[mubiao.toString()]["0"][k]).toString();
- // let fHp = this.skbuff_get(fiid, "hp");
- // if (this.teams[fiid] == null || fHp <= 0) {
- // continue;
- // }
- // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
- // continue; //隐藏
- // }
- // fiids.push(fiid);
- // }
- // break;
- // case 19: // 19 上次我攻击的对象
- // if (this.uuids[iid].ipks[this.zhen] != null) {
- // fiids = this.uuids[iid].ipks[this.zhen];
- // } else {
- // fiids = [];
- // }
- // break;
- // case 20: // 20 随机己方x个弟子
- // let cqlist20: string[] = [];
- // for (let k = 0; k < mblist[mubiao.toString()]["0"].length; k++) {
- // let fiid = (fqz + mblist[mubiao.toString()]["0"][k]).toString();
- // let fHp = this.skbuff_get(fiid, "hp");
- // if (this.teams[fiid] == null || fHp <= 0) {
- // continue;
- // }
- // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
- // continue; //隐藏
- // }
- // cqlist20.push(fiid);
- // }
- // fiids = this.seedRand.getRandArr(cqlist20, Math.min(cqlist20.length, targetType));
- // break;
- // case 21: // 21 敌方主角
- // if (iqz.toString().length > 3) {
- // fiids = ["100"];
- // } else {
- // fiids = ["1000"];
- // }
- // break;
- // case 22: // 22 敌方异常状态敌人
- // let cqlist22: string[] = [];
- // for (let k = 0; k < mblist[mubiao.toString()]["0"].length; k++) {
- // let fiid = (fqz + mblist[mubiao.toString()]["0"][k]).toString();
- // let fHp = this.skbuff_get(fiid, "hp");
- // if (this.teams[fiid] == null || fHp <= 0) {
- // continue;
- // }
- // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
- // continue; //隐藏
- // }
- // let buffs = ["effect_i_1", "effect_i_3", "effect_i_4", "effect_i_5", "effect_i_7"];
- // for (let index = 0; index < buffs.length; index++) {
- // let buff = buffs[index];
- // if (this.skbuff_get(fiid, buff, 2) > 0) {
- // cqlist22.push(fiid);
- // break;
- // }
- // }
- // }
- // fiids = this.seedRand.getRandArr(cqlist22, Math.min(cqlist22.length, targetType));
- // break;
- // case 23: // 23 攻击最近目标
- // let cqlist23: string[] = [];
- // for (let k = 0; k < mblist[mubiao.toString()][yu].length; k++) {
- // let fiid = (fqz + mblist[mubiao.toString()][yu][k]).toString();
- // let fHp = this.skbuff_get(fiid, "hp");
- // if (this.teams[fiid] == null || fHp <= 0) {
- // continue;
- // }
- // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
- // continue; //隐藏
- // }
- // cqlist23.push(fiid);
- // if (cqlist23.length == targetType) {
- // break;
- // }
- // }
- // fiids = cqlist23;
- // break;
- // }
- // for (let i = 0; i < fiids.length; i++) {
- // if (this.oneFiids[iid][key].length >= targetType) {
- // continue;
- // }
- // if (this.oneFiids[iid][key].includes(fiids[i])) {
- // continue;
- // }
- // this.oneFiids[iid][key].push(fiids[i]);
- // }
- // }
- // }
- // /**
- // * 辅助函数 - 获取对手
- // * @param key 标识key
- // * @param iid 出手方
- // * @param distance 范围大小(半径)
- // */
- // private find_jianse_fiid(fiid: string, distance: number): string[] {
- // if (gameMethod.isEmpty(distance) == true) {
- // return [];
- // }
- // let fiids: string[] = [];
- // //是不是范围触发
- // let fwlist: { [wxid: string]: { [fw: string]: number[] } } = {
- // 1: { 1: [2, 4, 5, 13, 15], 2: [3, 6, 7, 8, 9, 17], 3: [14, 16, 18, 0] },
- // 2: { 1: [1, 3, 4, 5, 6], 2: [7, 8, 9, 14, 16, 18, 13, 15, 17], 3: [0] },
- // 3: { 1: [2, 5, 6, 14, 16], 2: [1, 4, 7, 8, 9, 18], 3: [13, 15, 17, 0] },
- // 4: { 1: [1, 2, 5, 7, 8, 13, 15, 17], 2: [3, 6, 9, 0], 3: [14, 16, 18] },
- // 5: { 1: [1, 2, 3, 4, 6, 7, 8, 9], 2: [13, 15, 17, 14, 16, 18, 0] },
- // 6: { 1: [2, 3, 5, 8, 9, 14, 16, 18], 2: [1, 4, 7, 0], 3: [13, 15, 17] },
- // 7: { 1: [4, 5, 8, 0, 15, 17], 2: [1, 2, 3, 6, 9, 13], 3: [14, 16, 18] },
- // 8: { 1: [0, 4, 5, 6, 7, 9], 2: [1, 2, 3, 14, 16, 18, 13, 15, 17] },
- // 9: { 1: [0, 5, 6, 8, 16, 18], 2: [1, 2, 3, 4, 7, 14], 3: [13, 15, 17] },
- // 0: { 1: [7, 8, 9], 2: [4, 5, 6, 15, 16, 17, 18], 3: [1, 2, 3, 13, 14] },
- // };
- // let wxid = Number(fiid) % 100;
- // let qz: string = "10"; //前缀
- // if (fiid.length == 4) {
- // qz = "100";
- // }
- // for (let index = 1; index <= Math.floor(distance / 100); index++) {
- // if (fwlist[wxid] == null || fwlist[wxid][index] == null) {
- // continue;
- // }
- // for (let k = 0; k < fwlist[wxid][index].length; k++) {
- // if (this.teams[qz + fwlist[wxid][index][k]] == null) {
- // continue;
- // }
- // if (this.teams[qz + fwlist[wxid][index][k]].eps.hp <= 0) {
- // continue;
- // }
- // if (fiids.includes(qz + fwlist[wxid][index][k])) {
- // continue;
- // }
- // if (!gameMethod.isEmpty(this.teams[qz + fwlist[wxid][index][k]].isHide)) {
- // continue; // 隐藏
- // }
- // fiids.push(qz + fwlist[wxid][index][k]);
- // }
- // }
- // return fiids;
- // }
- // /**
- // * 结算各种伤害
- // * @param iid 攻击方
- // * @param fiid 被攻击方
- // * @param a 伤害系数
- // * @param skid 触发技能
- // */
- // private js_hits(iid: string, fiid: string, a: number, skid: string) {
- // //兽灵攻击
- // if (this.teams[iid].type == 3 || Number(iid) % 100 == 10) {
- // let mzid: number = 100;
- // let fzid: number = 1000;
- // if (iid.length > 3) {
- // mzid = 1000;
- // fzid = 100;
- // }
- // let i_z_atk = this.skbuff_get(mzid.toString(), "atk");
- // let i_z_qhshouling = this.skbuff_get(mzid.toString(), "qhshouling");
- // let f_z_rhshouling = this.skbuff_get(fzid.toString(), "rhshouling");
- // let slhit = ((i_z_atk * a) / 10000) * Math.max(1, 1 + (i_z_qhshouling - f_z_rhshouling) / 10000);
- // //输出伤害fjsRate
- // if (this.oneHit[iid] == null) {
- // this.oneHit[iid] = {};
- // }
- // this.oneHit[iid][fiid] = {
- // pghit: Math.floor(slhit), //普攻伤害
- // skhit: Math.floor(slhit), //技能伤害
- // bjhit: 0, //暴击伤害
- // gdhit: 0, //格挡伤害
- // fjhit: 0, //反击伤害
- // ljhit: 0, //连击伤害
- // jshit: 0, //溅射伤害(没有折损比例系数)
- // xxhit: 0, //吸血值
- // xxRate: 0, //吸血值
- // jsRate: 0, //吸血值
- // fjsRate: 0, //吸血值
- // };
- // return;
- // }
- // //伤害公式:我方攻击>敌方防御 如果这个条件成立,普攻伤害走下面公式
- // //普通伤害=max((我方攻击-敌方防御)*(1+我方伤害增强-敌方伤害减弱),我方攻击*0.15)*RANDBETWEEN(0.97,1.03)
- // //否则
- // //普通伤害=max(0,0.85*pow(我方攻击,0.8))
- // let i_atk: number = this.skbuff_get(iid, "atk");
- // let f_def: number = this.skbuff_get(fiid, "def");
- // let base_hit: number = 0; //普通伤害
- // if (i_atk > f_def) {
- // let i_zengshang: number = this.skbuff_get(iid, "zengshang");
- // let f_jianshang: number = this.skbuff_get(fiid, "jianshang");
- // base_hit = (Math.max(((i_atk - f_def) * (10000 + i_zengshang - f_jianshang)) / 10000, i_atk * 0.15) * this.seedRand.rand(97, 103)) / 100;
- // } else {
- // base_hit = Math.max(0, 0.85 * Math.pow(i_atk, 0.8));
- // }
- // let i_a = this.skbuff_get(iid, "a"); //效果加成
- // let i_75 = this.skbuff_get(iid, "i_75"); //效果加成
- // if (i_75 != 0) {
- // // 一次加成的效果 用完清空
- // this.skbuff_sub_all(iid, "effect_i_75");
- // }
- // // let f_a = this.skbuff_get(fiid,"i_30") //伤害加深
- // //对最终伤害有概率造成N倍伤害
- // let i_a_per = this.skbuff_get(iid, "a_per"); //效果加成
- // if (i_a_per != 0) {
- // // 一次加成的效果 用完清空
- // this.skbuff_sub_all(iid, "effect_i_67");
- // }
- // i_a_per = i_a_per ? i_a_per : 1;
- // let i_sk_a = this.skbuff_get(iid, "sk_a"); //技能伤害加成
- // //普功伤害
- // let pg_hit = (base_hit * (a + i_a + i_75) * i_a_per) / 10000;
- // //技能伤害=普通伤害 *(0+技能系数)
- // let sk_hit: number = (base_hit * (a + i_a + i_75 + i_sk_a) * i_a_per) / 10000;
- // //普通攻击 + 额外伤害
- // let cfgSk = Gamecfg.skillBase.getItem(skid, "1");
- // let zzhit = pg_hit; //最终伤害
- // if (cfgSk != null && cfgSk.skillType == 3) {
- // zzhit = sk_hit;
- // }
- // //暴击伤害= 技能伤害*max(我方强化暴伤-敌方忽视暴伤,1)
- // let i_baonue: number = this.skbuff_get(iid, "baonue");
- // let f_renai: number = this.skbuff_get(fiid, "renai");
- // let bj_hit: number = zzhit * Math.max(1, (i_baonue - f_renai) / 10000);
- // //格挡伤害= MIN(技能伤害*(MAX(敌方格挡增强-我方格挡减弱,0.12)),技能伤害*0.9)
- // let f_qhblock: number = this.skbuff_get(fiid, "qhblock");
- // let i_rhblock: number = this.skbuff_get(iid, "rhblock");
- // let gd_hit: number = Math.min(zzhit * Math.max(0.12, (f_qhblock - i_rhblock) / 10000), zzhit * 0.9);
- // //反击伤害= MIN(技能伤害*MAX(敌方反击增强-我方反击减弱,1),我方生命*0.85)
- // let f_qhfanji: number = this.skbuff_get(fiid, "qhfanji");
- // let i_rhfanji: number = this.skbuff_get(iid, "rhfanji");
- // let i_hp: number = this.skbuff_get(iid, "hp");
- // let fj_hit: number = Math.min(zzhit * Math.max(1, (f_qhfanji - i_rhfanji) / 10000), i_hp * 0.9);
- // //连击伤害 = 技能伤害*MAX(我方连击增强-敌方连击减弱,1)
- // let i_qhlianji: number = this.skbuff_get(iid, "qhlianji");
- // let f_rhlianji: number = this.skbuff_get(fiid, "rhlianji");
- // let lj_hit: number = zzhit * Math.max((i_qhlianji - f_rhlianji) / 10000 + 1, 1);
- // //溅射伤害= 最终伤害*折损比例系数*MAX(我方溅射增强-敌方溅射减弱,0.12)
- // //折损比例系数 这个这边不计算
- // let i_jianshe: number = this.skbuff_get(iid, "jianshe");
- // let f_hsjianshe: number = this.skbuff_get(fiid, "hsjianshe");
- // let bdjianshe: number = 0; //保底吸血
- // let cfgjs = Gamecfg.userEp.getItem("jianshe");
- // if (cfgjs != null) {
- // bdjianshe = cfgjs.initEp;
- // }
- // let jsRate: number = Math.max(i_jianshe - f_hsjianshe, bdjianshe);
- // let fjsRate: number = Math.max(f_hsjianshe - i_jianshe, bdjianshe);
- // let i_qhjianshe: number = this.skbuff_get(iid, "qhjianshe");
- // let f_rhjianshe: number = this.skbuff_get(fiid, "rhjianshe");
- // let js_hit: number = zzhit * Math.max((i_qhjianshe - f_rhjianshe) / 10000, 0.12);
- // //吸血率=max((我方吸血-敌方抗吸血),吸血保底参数)
- // //吸血值= 最终伤害值*max(我方吸血增强-敌方吸血减弱,1)*吸血率
- // let i_xixue: number = this.skbuff_get(iid, "xixue");
- // let f_hsxixue: number = this.skbuff_get(fiid, "hsxixue");
- // let bdxixue: number = 0; //保底吸血
- // let cfg = Gamecfg.userEp.getItem("xixue");
- // if (cfg != null) {
- // bdxixue = cfg.initEp;
- // }
- // let xxRate: number = Math.max(i_xixue - f_hsxixue, bdxixue);
- // let i_qhxixue: number = this.skbuff_get(iid, "qhxixue");
- // let f_rhxixue: number = this.skbuff_get(fiid, "rhxixue");
- // let xx_hit: number = (zzhit * Math.max((i_qhxixue - f_rhxixue) / 10000 + 1, 1) * xxRate) / 10000;
- // if (this.oneHit[iid] == null) {
- // this.oneHit[iid] = {};
- // }
- // if (cfgSk != null && cfgSk.skillType == 1) {
- // //指计算普攻
- // let pg_hit_per: number = 0;
- // //普攻施加buff
- // let i_19_a = this.skbuff_get(iid, "i_19_a");
- // let i_19_i = this.skbuff_get(iid, "i_19_i");
- // if (i_19_a > 0 && i_19_i > 0) {
- // let ef_i_19_i = this.skbuff_get(iid, "effect_i_" + i_19_i, 2);
- // pg_hit_per += i_19_a * ef_i_19_i;
- // }
- // let i_39_a = this.skbuff_get(iid, "i_39_a");
- // pg_hit_per += i_39_a;
- // pg_hit += (pg_hit_per / 10000) * pg_hit;
- // }
- // //输出伤害
- // this.oneHit[iid][fiid] = {
- // pghit: Math.floor(pg_hit), //普攻伤害
- // skhit: Math.floor(sk_hit), //技能伤害
- // bjhit: Math.floor(bj_hit), //暴击伤害
- // gdhit: Math.floor(gd_hit), //格挡伤害
- // fjhit: Math.floor(fj_hit), //反击伤害
- // ljhit: Math.floor(lj_hit), //连击伤害
- // jshit: Math.floor(js_hit), //溅射伤害(没有折损比例系数)
- // xxhit: Math.floor(xx_hit), //吸血值
- // xxRate: xxRate, //吸血概率
- // jsRate: jsRate, //溅射概率
- // fjsRate: fjsRate, //反击溅射概率
- // };
- // //伤害加深
- // if (this.skbuff_get(iid, "effect_i_53", 2) > 0) {
- // let hit53 = this.skbuff_get(iid, "i_53");
- // this.oneHit[iid][fiid] = {
- // pghit: hit53, //普攻伤害
- // skhit: hit53, //技能伤害
- // bjhit: hit53, //暴击伤害
- // gdhit: Math.floor(gd_hit), //格挡伤害
- // fjhit: Math.floor(fj_hit), //反击伤害
- // ljhit: hit53, //连击伤害
- // jshit: hit53, //溅射伤害(没有折损比例系数)
- // xxhit: Math.floor(xx_hit), //吸血值
- // xxRate: xxRate, //吸血概率
- // jsRate: jsRate, //溅射概率
- // fjsRate: fjsRate, //反击溅射概率
- // };
- // }
- // if (Number(iid) % 100 < 10 && Number(iid) % 100 > 0 && this.skbuff_get(iid, "effect_i_64", 2) > 0) {
- // // 是弟子 首次增伤
- // let i_64_a = this.skbuff_get(iid, "i_64_a");
- // let i_64_nZhen = this.skbuff_get(iid, "i_64_nZhen");
- // if (i_64_a > 0 && i_64_nZhen <= this.zhen) {
- // // 只加一次
- // this.skbuff_sub_all(iid, "effect_i_64");
- // this.oneHit[iid][fiid].skhit = Math.floor(this.oneHit[iid][fiid].skhit * (i_64_a / 10000 + 1));
- // this.oneHit[iid][fiid].pghit = Math.floor(this.oneHit[iid][fiid].pghit * (i_64_a / 10000 + 1));
- // }
- // }
- // }
- // private sk_base2(iid: string, runStatus: number, cs: { [key: string]: number } = {}) {
- // let type = Number(iid) % 100 == 0 ? 1 : Number(iid) % 100 > 0 && Number(iid) % 100 < 10 ? 2 : 3;
- // if (this.objects[iid.length] == null || this.objects[iid.length][type] == null) {
- // return;
- // }
- // let cf_sk: { [skillType: string]: [string, { [key: string]: number }, number][] } = {}; //当前要触发的技能库
- // let skids: string[] = Object.keys(this.objects[iid.length][type]);
- // for (let index = skids.length - 1; index >= 0; index--) {
- // let skid = skids[index];
- // let sklv = this.objects[iid.length][type][skid].sklv;
- // let sklvCd = 100;
- // let cfgSk = Gamecfg.skillBase.getItem(skid, sklv.toString());
- // if (cfgSk == null) {
- // continue; //没有这个技能 或者 这个技能的触发时机不对
- // }
- // if (cfgSk.runStatus != runStatus) {
- // continue; //没有这个技能 或者 这个技能的触发时机不对
- // }
- // if (cfgSk.runStatus === 4 && !cfgSk.cd && this.zhen != 1) {
- // // 没有cd的 runStatus=4的只在战斗开始时加一次
- // continue;
- // }
- // //受到攻击后触发
- // if (cfgSk.runStatus == 2) {
- // //被打次数
- // let bdcons = this.uuids[iid].fcons[0] + this.uuids[iid].fcons[1] + this.uuids[iid].fcons[2];
- // if (bdcons == 0) {
- // continue; //还没被打
- // }
- // if (gameMethod.isEmpty(cfgSk.hitNumber) == false && bdcons % cfgSk.hitNumber > 0) {
- // continue; //未累计到次数
- // }
- // }
- // let eff_i_3 = this.skbuff_get(iid, "effect_i_3", 2);
- // if (eff_i_3 > 0) {
- // continue; //晕眩
- // }
- // let eff_i_5 = this.skbuff_get(iid, "effect_i_5", 2);
- // if (eff_i_5 > 0) {
- // continue; //晕眩
- // }
- // let eff_i_6 = this.skbuff_get(iid, "effect_i_6", 2);
- // if (eff_i_6 > 0) {
- // continue; //击退
- // }
- // let eff_i_16 = this.skbuff_get(iid, "effect_i_16", 2);
- // if (eff_i_16 > 0) {
- // continue; //入定状态
- // }
- // //(1普攻,2 被动,3技能)
- // if (cfgSk.skillType != 1) {
- // let eff_i_1 = this.skbuff_get(iid, "effect_i_1", 2);
- // if (eff_i_1 > 0) {
- // //沉默
- // continue;
- // }
- // }
- // //初始化技能
- // if (this.uuids[iid].skbase[skid] == null) {
- // this.uuids[iid].skbase[skid] = {
- // last: 0, //最后一次出手帧
- // count: 0,
- // action: {},
- // effect: {},
- // };
- // }
- // //技能cd
- // let cs2:{[key:string]:number} = gameMethod.objCopy(cs)
- // cs2["cd"] = gameMethod.isEmpty(cfgSk.cd) ? 0 : cfgSk.cd * 30;
- // cs2["cd2"] = gameMethod.isEmpty(cfgSk.cd2) ? 0 : (parseInt(iid) % 100 == 10 ? (cfgSk.cd2 * 30 * sklvCd) / 100 : cfgSk.cd2 * 30);
- // if (this.uuids[iid].skbase[skid].last + cs["cd"] > this.zhen) {
- // continue; //冷却时间还没到
- // }
- // //次数判定
- // if (gameMethod.isEmpty(cfgSk.count) == false && this.uuids[iid].skbase[skid].count >= cfgSk.count) {
- // continue; //没有次数了
- // }
- // if (gameMethod.isEmpty(cfgSk.chance) == false && this.seedRand.rand(1, 10000) > cfgSk.chance * 10000) {
- // continue; //没有触发这个技能
- // }
- // if (cfgSk.skillType == 2) {
- // //被动
- // } else if (cfgSk.skillType == 3) {
- // //特殊技能
- // this.addOneAtk(iid, iid, "aType", Xys.ActionType.atk);
- // this.addOneAtk(iid, iid, "aSkid", skid);
- // }
- // //先找出触发的技能ID
- // if (cf_sk[cfgSk.skillType] == null) {
- // cf_sk[cfgSk.skillType] = [];
- // }
- // cf_sk[cfgSk.skillType].push([skid, cs2, sklv]);
- // }
- // return cf_sk;
- // }
- // private sk_baseObjRun4(iid: string) {
- // if (gameMethod.isEmpty(this.teams[iid].isHide) == false) {
- // return; //隐藏
- // }
- // let skids: string[] = Object.keys(this.teams[iid].sk);
- // let type = Number(iid) % 100 == 0 ? 1 : Number(iid) % 100 > 0 && Number(iid) % 100 < 10 ? 2 : 3;
- // for (let index = skids.length - 1; index >= 0; index--) {
- // let skid = skids[index];
- // let sklv = this.teams[iid].sk[skid][0];
- // let cfgSk = Gamecfg.skillBase.getItem(skid, sklv.toString());
- // if (cfgSk && cfgSk.object && type != cfgSk.object) {
- // // 非给自己加的技能 在战斗前初始化
- // if (this.objects[iid.length] == null) {
- // this.objects[iid.length] = {};
- // }
- // if (this.objects[iid.length][cfgSk.object] == null) {
- // this.objects[iid.length][cfgSk.object] = {};
- // }
- // if (this.objects[iid.length][cfgSk.object][cfgSk.id] == null) {
- // this.objects[iid.length][cfgSk.object][cfgSk.id] = {
- // cd: cfgSk.cd ? cfgSk.cd : 0,
- // sklv: sklv,
- // iids: {},
- // };
- // }
- // }
- // }
- // }
- // /**
- // * 辅助函数 - 技能触发
- // * @param iid 触发者
- // * @param runStatus 技能触发时机
- // * 1:攻击时造成伤害
- // * 2:受到攻击时
- // * 3:灵力满怒时释放
- // * 4:进入战斗后,还没攻击前
- // * 5:进入战斗后,x秒内
- // * 6:攻击时造成伤害,并且目标成功格挡(注意和1类型是不同的)
- // * 7.反击时
- // * 8.自身格挡时。和6类型不同,6类型是敌方格挡
- // *
- // */
- // private sk_base(iid: string, runStatus: number, cs: { [key: string]: number } = {}) {
- // if (gameMethod.isEmpty(this.teams[iid].isHide) == false) {
- // return false; //隐藏
- // }
- // let skids: string[] = Object.keys(this.teams[iid].sk);
- // let type = Number(iid) % 100 == 0 ? 1 : Number(iid) % 100 > 0 && Number(iid) % 100 < 10 ? 2 : 3;
- // let cf_sk: { [skillType: string]: [string, { [key: string]: number }, number][] } = {}; //当前要触发的技能库
- // for (let index = skids.length - 1; index >= 0; index--) {
- // let skid = skids[index];
- // let sklv = this.teams[iid].sk[skid][0];
- // let sklvCd = this.teams[iid].sk[skid][1];
- // let cfgSk = Gamecfg.skillBase.getItem(skid, sklv.toString());
- // if (cfgSk == null) {
- // continue; //没有这个技能 或者 这个技能的触发时机不对
- // }
- // if (cfgSk.object && type != cfgSk.object) {
- // // 不是加给自己的技能
- // continue;
- // } else if (cfgSk.runStatus != runStatus) {
- // continue; //没有这个技能 或者 这个技能的触发时机不对
- // }
- // //受到攻击后触发
- // if (cfgSk.runStatus == 2) {
- // //被打次数
- // let bdcons = this.uuids[iid].fcons[0] + this.uuids[iid].fcons[1] + this.uuids[iid].fcons[2];
- // if (bdcons == 0) {
- // continue; //还没被打
- // }
- // if (gameMethod.isEmpty(cfgSk.hitNumber) == false && bdcons % cfgSk.hitNumber > 0) {
- // continue; //未累计到次数
- // }
- // }
- // let eff_i_3 = this.skbuff_get(iid, "effect_i_3", 2);
- // if (eff_i_3 > 0) {
- // continue; //晕眩
- // }
- // let eff_i_5 = this.skbuff_get(iid, "effect_i_5", 2);
- // if (eff_i_5 > 0) {
- // continue; //晕眩
- // }
- // let eff_i_6 = this.skbuff_get(iid, "effect_i_6", 2);
- // if (eff_i_6 > 0) {
- // continue; //击退
- // }
- // let eff_i_16 = this.skbuff_get(iid, "effect_i_16", 2);
- // if (eff_i_16 > 0) {
- // continue; //入定状态
- // }
- // //(1普攻,2 被动,3技能)
- // if (cfgSk.skillType != 1) {
- // let eff_i_1 = this.skbuff_get(iid, "effect_i_1", 2);
- // if (eff_i_1 > 0) {
- // //沉默
- // continue;
- // }
- // }
- // //初始化技能
- // if (this.uuids[iid].skbase[skid] == null) {
- // this.uuids[iid].skbase[skid] = {
- // last: 0, //最后一次出手帧
- // count: 0,
- // action: {},
- // effect: {},
- // };
- // }
- // //技能cd
- // let cs2:{[key:string]:number} = gameMethod.objCopy(cs)
- // cs2["cd"] = gameMethod.isEmpty(cfgSk.cd) ? 0 : (parseInt(iid) % 100 == 10 ? (cfgSk.cd * 30 * sklvCd) / 100 : cfgSk.cd * 30);
- // cs2["cd2"] = gameMethod.isEmpty(cfgSk.cd2) ? 0 : (parseInt(iid) % 100 == 10 ? (cfgSk.cd2 * 30 * sklvCd) / 100 : cfgSk.cd2 * 30);
- // if (this.uuids[iid].skbase[skid].last + cs2["cd"] > this.zhen) {
- // continue; //冷却时间还没到
- // }
- // //次数判定
- // if (gameMethod.isEmpty(cfgSk.count) == false && this.uuids[iid].skbase[skid].count >= cfgSk.count) {
- // continue; //没有次数了
- // }
- // if (gameMethod.isEmpty(cfgSk.chance) == false && this.seedRand.rand(1, 10000) > cfgSk.chance * 10000) {
- // continue; //没有触发这个技能
- // }
- // if (cfgSk.skillType == 2) {
- // //被动
- // } else if (cfgSk.skillType == 3) {
- // //特殊技能
- // this.sk_base(iid, 5, cs2);
- // this.addOneAtk(iid, iid, "aType", Xys.ActionType.atk);
- // this.addOneAtk(iid, iid, "aSkid", skid);
- // }
- // //先找出触发的技能ID
- // if (cf_sk[cfgSk.skillType] == null) {
- // cf_sk[cfgSk.skillType] = [];
- // }
- // cf_sk[cfgSk.skillType].push([skid, cs2, sklv]);
- // }
- // // 获取共享技能
- // let cf_sk2 = this.sk_base2(iid, runStatus, cs);
- // if (cf_sk2 != null) {
- // let keys = Object.keys(cf_sk2);
- // for (let i = 0; i < keys.length; i++) {
- // let keys2 = Object.keys(cf_sk2[keys[i]]);
- // for (let k = 0; k < keys2.length; k++) {
- // if (cf_sk[keys[i]] == null) {
- // cf_sk[keys[i]] = [];
- // }
- // cf_sk[keys[i]].push(cf_sk2[keys[i]][k]);
- // }
- // }
- // }
- // //触发的技能列表
- // let cfids: [string, { [key: string]: number }, number][] = [];
- // if (cf_sk[3] != null) {
- // //只要触发高级技能 就不触发普通攻击技能
- // cfids = gameMethod.addArr(cfids, cf_sk[3]);
- // } else if (cf_sk[1] != null) {
- // cfids = gameMethod.addArr(cfids, cf_sk[1]);
- // }
- // if (cf_sk[2] != null) {
- // //被动技能
- // cfids = gameMethod.addArr(cfids, cf_sk[2]);
- // }
- // if (cfids.length <= 0) {
- // return false;
- // }
- // // 这里才是真正出手了的地方
- // if (runStatus != 4 && runStatus != 2 && runStatus != 7 && runStatus != 8) {
- // // 战斗前触发的特性/被动 不算
- // this.uuids[iid].last = this.zhen;
- // }
- // let values = Object.values(cfids);
- // for (let i = 0; i < values.length; i++) {
- // if (values[i][1]["do_iid"] == null) {
- // values[i][1]["do_iid"] = Number(iid);
- // }
- // let cs2 = values[i][1]
- // if (cs2["hit"] != null) {
- // values[i][1]["hit"] = cs2["hit"];
- // }
- // let skid = values[i][0];
- // let sklv = values[i][2];
- // let cfgSk = Gamecfg.skillBase.getItem(values[i][0], sklv.toString());
- // if (cfgSk == null) {
- // continue; //没有这个技能 或者 这个技能的触发时机不对
- // }
- // if (cfgSk.type == "3"){
- // // 术法触发
- // this.addOneAtk(iid, iid, "effect", ["shufa",skid]);
- // }
- // this.uuids[iid].skbase[skid].last = this.zhen + (cs2["cd2"]>0&&cs2["cd"]==0?cs2["cd2"]:0);
- // this.uuids[iid].skbase[skid].count += 1;
- // if (cfgSk.sequence == 2) {
- // //效果列表
- // if (gameMethod.isEmpty(cfgSk.effect) == false) {
- // let lastId = "";
- // for (let k = 0; k < cfgSk.effect.length; k++) {
- // this.sk_effect(iid, values[i][0], cfgSk.effect[k].toString(), lastId, values[i][1]);
- // lastId = "effect_id_" + cfgSk.effect[k];
- // }
- // }
- // //行为列表
- // if (gameMethod.isEmpty(cfgSk.actions) == false) {
- // let lastId = "";
- // for (let index = 0; index < cfgSk.actions.length; index++) {
- // let acId = cfgSk.actions[index];
- // this.sk_action(iid, values[i][0], acId.toString(), lastId);
- // lastId = "action_id_" + acId;
- // }
- // }
- // } else {
- // //行为列表
- // if (gameMethod.isEmpty(cfgSk.actions) == false) {
- // let lastId = "";
- // for (let index = 0; index < cfgSk.actions.length; index++) {
- // let acId = cfgSk.actions[index];
- // this.sk_action(iid, values[i][0], acId.toString(), lastId);
- // lastId = "action_id_" + acId;
- // }
- // }
- // //效果列表
- // if (gameMethod.isEmpty(cfgSk.effect) == false) {
- // let lastId = "";
- // for (let k = 0; k < cfgSk.effect.length; k++) {
- // this.sk_effect(iid, values[i][0], cfgSk.effect[k].toString(), lastId, values[i][1]);
- // lastId = "effect_id_" + cfgSk.effect[k];
- // }
- // }
- // }
- // }
- // return true;
- // }
- // /**
- // * 辅助函数 - 技能行为
- // * @param iid 触发者
- // * @param runStatus 技能触发时机
- // * 1:攻击时造成伤害
- // * 2:受到攻击时
- // * 3:灵力满怒时释放
- // * 4:进入战斗后,还没攻击前
- // */
- // private sk_action(iid: string, skid: string, acId: string, extend: string = "") {
- // if (gameMethod.isEmpty(this.teams[iid].isHide) == false) {
- // return; //隐藏
- // }
- // let cfgAc = Gamecfg.skillAction.getItem(acId);
- // if (cfgAc == null) {
- // return;
- // }
- // if (this.oneFiids[iid] == null) {
- // this.oneFiids[iid] = {};
- // }
- // let ac_ttype = "action_id_" + acId; //对手标识
- // //继承上一次的目标
- // if (extend != "") {
- // //这里可以先继承
- // this.oneFiids[iid][ac_ttype] = this.oneFiids[iid][extend];
- // }
- // let targetType: number = 0; //目标数量
- // //目标数量
- // if (gameMethod.isEmpty(cfgAc.targetType) == true) {
- // targetType = 10;
- // } else if (gameMethod.isEmpty(cfgAc.targetType[1]) == true) {
- // targetType = cfgAc.targetType[0];
- // } else {
- // targetType = this.seedRand.rand(cfgAc.targetType[0], cfgAc.targetType[1]);
- // }
- // this.find_fiids(ac_ttype, iid, cfgAc.ttype, targetType, cfgAc.distance); //选择对手
- // let cs: { [key: string]: number } = { do_iid: Number(iid) };
- // //造成伤害
- // if (cfgAc.args["a"] != null) {
- // this.timer_do(301, { do_iid: Number(iid) }); //攻击前触发
- // for (let i = 0; i < this.oneFiids[iid][ac_ttype].length; i++) {
- // this.js_hits(iid, this.oneFiids[iid][ac_ttype][i], cfgAc.args["a"] * 10000, skid); //计算伤害
- // let cs2 = this.sk_action_type_1(iid, this.oneFiids[iid][ac_ttype][i], skid, acId);
- // cs = Object.assign(cs, cs2);
- // cs[this.oneFiids[iid][ac_ttype][i]] = cs2["hit"];
- // }
- // }
- // //造成伤害 - 术法
- // if (cfgAc.args["atk"] != null) {
- // this.timer_do(301, { do_iid: Number(iid) }); //攻击前触发
- // for (let i = 0; i < this.oneFiids[iid][ac_ttype].length; i++) {
- // this.js_hits(iid, this.oneFiids[iid][ac_ttype][i], cfgAc.args["atk"], skid); //计算伤害
- // let cs2 = this.sk_action_type_1(iid, this.oneFiids[iid][ac_ttype][i], skid, acId);
- // cs = Object.assign(cs, cs2);
- // cs[this.oneFiids[iid][ac_ttype][i]] = cs2["hit"];
- // }
- // }
- // //触发effect
- // if (cfgAc.args["id"] != null) {
- // let p = 0; //buff触发概率
- // if (cfgAc.args["p"] != null) {
- // p = cfgAc.args["p"] * 10000; //buff触发概率
- // }
- // if (this.seedRand.rand(1, 10000) <= p) {
- // for (let i = 0; i < cfgAc.args.id.length; i++) {
- // cs["nextid"] = 1;
- // this.sk_effect(iid, skid, cfgAc.args.id[i].toString(), ac_ttype, cs);
- // }
- // }
- // }
- // //有概率给我方弟子挂一个反击buff
- // if (gameMethod.isEmpty(cfgAc.canbeatback) == false) {
- // let p = 0; //buff触发概率
- // if (cfgAc.args["p"] != null) {
- // p = cfgAc.args["p"] * 10000; //buff触发概率
- // }
- // for (let index = 0; index < this.teamFiids.length; index++) {
- // let fiid = this.teamFiids[index];
- // if (this.teams[fiid].type != 2) {
- // continue; //不是弟子
- // }
- // if (this.teams[fiid].eps.hp <= 0) {
- // continue; //
- // }
- // if (iid.length != fiid.length) {
- // continue; //不是同阵营的
- // }
- // if (this.seedRand.rand(1, 10000) <= p) {
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: "canbeatback", //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + 30 * 45, //结束帧
- // overlayType: 1, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: 1, //增加层数
- // eps: {}, //属性
- // });
- // }
- // }
- // }
- // }
- // /**
- // * 辅助函数 - 技能效果
- // * @param iid 触发者
- // * @param skid 技能ID
- // * @param effectId 效果ID
- // * @param extend 继承目标key
- // */
- // private sk_effect(iid: string, skid: string, effectId: string, extend: string = "", cs: { [key: string]: number } = {}) {
- // if (gameMethod.isEmpty(this.teams[iid].isHide) == false) {
- // return; //隐藏
- // }
- // let cfgBase = Gamecfg.skillBase.getItem(skid, "1");
- // let cfgEf = Gamecfg.skillEffect.getItem(effectId);
- // if (cfgEf == null || cfgBase == null) {
- // return;
- // }
- // //次数判定
- // if (
- // gameMethod.isEmpty(cfgEf.count) == false &&
- // this.uuids[iid].skbase[skid] &&
- // this.uuids[iid].skbase[skid].effect[effectId] &&
- // this.uuids[iid].skbase[skid].effect[effectId].count >= cfgEf.count
- // ) {
- // return; //没有次数了
- // }
- // if (this.oneFiids[iid] == null) {
- // this.oneFiids[iid] = {};
- // }
- // let ef_ttype = "effect_id_" + effectId;
- // //继承上一次的目标
- // if (extend != "") {
- // //这里可以先继承
- // this.oneFiids[iid][ef_ttype] = this.oneFiids[iid][extend];
- // }
- // //持续多少针
- // let maxzhen: number = gameMethod.isEmpty(cfgEf.args["t"]) == false ? cfgEf.args["t"] * 30 : 45 * 30;
- // //m增加层数
- // let e_m: number = gameMethod.isEmpty(cfgEf.args["m"]) == false ? cfgEf.args["m"] : 1;
- // //n表示层数上限
- // let e_n: number = gameMethod.isEmpty(cfgEf.args["n"]) == false ? cfgEf.args["n"] : 9999;
- // //1.叠加 2.不叠加替换,默认不填值就是不叠加
- // let overlayType: number = gameMethod.isEmpty(cfgEf.overlayType) ? 2 : cfgEf.overlayType;
- // //效果标识
- // let e_i: number = gameMethod.isEmpty(cfgEf.args["i"]) == false ? cfgEf.args["i"] : 0;
- // //效果标识
- // let interval: number = gameMethod.isEmpty(cfgEf.interval) == false ? cfgEf.interval * 30 : 0; //效果标识
- // if (this.uuids[iid].skbase[skid] == null) {
- // this.uuids[iid].skbase[skid] = {
- // last: 0, //最后一次出手帧
- // count: 0,
- // action: {},
- // effect: {},
- // };
- // }
- // if (this.uuids[iid].skbase[skid].effect[effectId] == null) {
- // this.uuids[iid].skbase[skid].effect[effectId] = {
- // effectZhen: 0, //触发帧
- // effectEndZhen: 0, //触发结束帧
- // nextcd: 0, //下一次出手时间
- // count: 0,
- // f: 0,
- // };
- // }
- // //效果cd
- // if (
- // this.uuids[iid].skbase[skid].effect[effectId].nextcd > this.zhen &&
- // (this.zhen != this.uuids[iid].skbase[skid].effect[effectId].effectZhen || (cfgEf.targetType.length == 1 && cfgEf.targetType[0] == 1)) &&
- // !(this.uuids[iid].skbase[skid].effect[effectId].effectEndZhen >= this.zhen && cs["isTimer"] == 1)
- // ) {
- // return;
- // }
- // //cs["isTimer"] = 0; // 定时器来的 不参与cd效果判定
- // let ef_buff = "effect_i_" + e_i; //效果i标识
- // if (gameMethod.isEmpty(cfgEf.ttype) == false && cs["isTimer"] != 1) {
- // let targetType: number = 0; //目标数量
- // //目标数量
- // if (gameMethod.isEmpty(cfgEf.targetType) == true) {
- // targetType = 10;
- // } else if (gameMethod.isEmpty(cfgEf.targetType[1]) == true) {
- // targetType = cfgEf.targetType[0];
- // } else {
- // targetType = this.seedRand.rand(cfgEf.targetType[1], cfgEf.targetType[0]);
- // }
- // this.find_fiids(ef_ttype, iid, cfgEf.ttype, targetType);
- // }
- // //buff效果
- // if (this.oneFiids[iid] && this.oneFiids[iid][ef_ttype]) {
- // for (let i = 0; i < this.oneFiids[iid][ef_ttype].length; i++) {
- // let eff_i_m = this.skbuff_get(this.oneFiids[iid][ef_ttype][i], ef_buff, 2);
- // if (eff_i_m >= e_n) {
- // continue; //超过层数
- // }
- // e_m = Math.min(e_m, e_n - eff_i_m);
- // }
- // }
- // //添加定时执行 - 之后在触发效果
- // if (gameMethod.isEmpty(cfgEf.triggerTime) == false && this.uuids[iid].timer[ef_ttype] == null) {
- // this.timer_add({
- // iid: iid, //触发者
- // fiids: this.oneFiids[iid][ef_ttype], //触发者
- // key: ef_ttype, //定时器标识
- // type: cfgEf.triggerTime ? cfgEf.triggerTime : [601], //执行触发点
- // func: "sk_effect", //执行的函数名
- // lzhen: interval, //轮询执行时间
- // ezhen: 45 * 30,
- // skid: skid, //技能ID
- // aeid: effectId, //效果ID|行为ID
- // cs: cs, //参数
- // overlayType: overlayType,
- // });
- // if (cfgEf.triggerTime[0] == 301) {
- // for (let i = 0; i < this.oneFiids[iid][ef_ttype].length; i++) {
- // this.timer_do(301, { do_iid: Number(this.oneFiids[iid][ef_ttype][i]) });
- // }
- // if (gameMethod.isEmpty(cfgEf.count) == false && this.zhen != 1) {
- // this.uuids[iid].skbase[skid].effect[effectId].count += 1;
- // if (this.uuids[iid].skbase[skid].effect[effectId].count >= cfgEf.count) {
- // if (gameMethod.isEmpty(cfgEf.cd) == false) {
- // this.uuids[iid].skbase[skid].effect[effectId].effectZhen = this.zhen;
- // this.uuids[iid].skbase[skid].effect[effectId].nextcd = this.zhen + cfgEf.cd * 30;
- // this.uuids[iid].skbase[skid].effect[effectId].count = 0;
- // this.uuids[iid].timer[ef_ttype][cs["timerId"].toString()].szhen = this.zhen + cfgEf.cd * 30;
- // } else {
- // }
- // }
- // }
- // if (gameMethod.isEmpty(cfgEf.cd) == false && this.zhen != 1) {
- // if (this.uuids[iid].skbase[skid].effect[effectId].count == 0) {
- // this.uuids[iid].skbase[skid].effect[effectId].effectZhen = this.zhen;
- // if (cfgEf.args["t"]) {
- // if (this.uuids[iid].skbase[skid].effect[effectId].effectEndZhen < this.zhen) {
- // this.uuids[iid].skbase[skid].effect[effectId].effectEndZhen = this.zhen + cfgEf.args["t"] * 30; // buff持续增加效果结束帧
- // this.uuids[iid].skbase[skid].effect[effectId].nextcd = this.zhen + cfgEf.cd * 30;
- // }
- // } else {
- // this.uuids[iid].skbase[skid].effect[effectId].nextcd = this.zhen + cfgEf.cd * 30;
- // }
- // }
- // }
- // }
- // return; //cd后再触发
- // }
- // //1.附加属性(万分比)
- // if (cfgEf.type == 1) {
- // for (let i = 0; i < this.oneFiids[iid][ef_ttype].length; i++) {
- // let fiid = this.oneFiids[iid][ef_ttype][i];
- // let cf508: number = 0;
- // let eff_1_ep: { [key: string]: number } = {};
- // let keys = Object.keys(cfgEf.args);
- // for (let k = 0; k < keys.length; k++) {
- // // 加属性 这边in没关系
- // if (this.teams[fiid].eps[keys[k]] == null) {
- // continue;
- // }
- // if (this.teams[fiid].eps[keys[k]] != null) {
- // eff_1_ep[keys[k]] = cfgEf.args[keys[k]];
- // if (cfgEf.args[keys[k]] < 0) {
- // cf508 = 1;
- // break;
- // }
- // }
- // if (cf508 != 0) {
- // break;
- // }
- // }
- // if (overlayType === 2 || this.skbuff_get(fiid, ef_buff + "_" + effectId, 2) + e_m <= e_n) {
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff + "_" + effectId, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: eff_1_ep, //属性
- // });
- // }
- // this.teams[fiid].eps.hp = this.skbuff_get(fiid, "hp");
- // // this.teams[fiid].eps.hp_max = this.skbuff_get(fiid, "hp_max");
- // if (cf508 == 1) {
- // this.timer_do(508, { do_iid: Number(fiid) });
- // }
- // }
- // //cd
- // if (this.oneFiids[iid][ef_ttype].length > 0) {
- // if (gameMethod.isEmpty(cfgEf.count) == false && this.zhen != 1) {
- // this.uuids[iid].skbase[skid].effect[effectId].count += 1;
- // if (this.uuids[iid].skbase[skid].effect[effectId].count >= cfgEf.count) {
- // if (gameMethod.isEmpty(cfgEf.cd) == false) {
- // this.uuids[iid].skbase[skid].effect[effectId].effectZhen = this.zhen;
- // this.uuids[iid].skbase[skid].effect[effectId].nextcd = this.zhen + cfgEf.cd * 30;
- // this.uuids[iid].skbase[skid].effect[effectId].count = 0;
- // this.uuids[iid].timer[ef_ttype][cs["timerId"].toString()].szhen = this.zhen + cfgEf.cd * 30;
- // } else {
- // }
- // }
- // }
- // if (gameMethod.isEmpty(cfgEf.cd) == false && this.zhen != 1) {
- // if (this.uuids[iid].skbase[skid].effect[effectId].count == 0) {
- // this.uuids[iid].skbase[skid].effect[effectId].effectZhen = this.zhen;
- // if (cfgEf.args["t"]) {
- // if (this.uuids[iid].skbase[skid].effect[effectId].effectEndZhen < this.zhen) {
- // this.uuids[iid].skbase[skid].effect[effectId].effectEndZhen = this.zhen + cfgEf.args["t"] * 30; // buff持续增加效果结束帧
- // this.uuids[iid].skbase[skid].effect[effectId].nextcd = this.zhen + cfgEf.cd * 30;
- // }
- // } else {
- // this.uuids[iid].skbase[skid].effect[effectId].nextcd = this.zhen + cfgEf.cd * 30;
- // }
- // }
- // }
- // }
- // }
- // //2.附加状态
- // if (cfgEf.type == 2) {
- // this.sk_effect_type_2(skid, effectId, iid, this.oneFiids[iid][ef_ttype], cs);
- // }
- // }
- // /**
- // * 触发效果
- // * @param effectId 效果ID
- // * @param iid 触发者
- // * @param fiids 触发对象
- // * @returns
- // */
- // private sk_effect_type_2(skid: string, effectId: string, iid: string, fiids: string[], cs: { [key: string]: number } = {}) {
- // let cfgBase = Gamecfg.skillBase.getItem(skid, "1");
- // let cfgEf = Gamecfg.skillEffect.getItem(effectId);
- // if (cfgEf == null || cfgEf.args["i"] == null || cfgBase == null) {
- // return;
- // }
- // //持续多少针
- // let maxzhen: number = cfgEf.args["t"] != null ? cfgEf.args["t"] * 30 : 45 * 30;
- // //a填小数:每秒持续收到最终伤害的百分比
- // let e_a: number = gameMethod.isEmpty(cfgEf.args["a"]) == false ? cfgEf.args["a"] * 10000 : 0;
- // //m增加层数
- // let e_m: number = gameMethod.isEmpty(cfgEf.args["m"]) == false ? cfgEf.args["m"] : 1;
- // //n表示层数上限
- // let e_n: number = gameMethod.isEmpty(cfgEf.args["n"]) == false ? cfgEf.args["n"] : 9999;
- // //id引发下一个effect_ID
- // let e_id: string = gameMethod.isEmpty(cfgEf.args["id"]) == false ? cfgEf.args["id"].toString() : "";
- // //1.叠加 2.不叠加替换,默认不填值就是不叠加
- // let overlayType: number = gameMethod.isEmpty(cfgEf.overlayType) ? 2 : cfgEf.overlayType;
- // //效果标识
- // let e_i: number = gameMethod.isEmpty(cfgEf.args["i"]) == false ? cfgEf.args["i"] : 0;
- // let ef_ttype = "effect_id_" + effectId; //效果ID标识
- // let ef_buff = "effect_i_" + e_i; //效果i标识
- // let lsOne: number = 0; //临时自己只操作一次的
- // let pass: boolean = true;
- // for (let i = 0; i < fiids.length; i++) {
- // let fiid = fiids[i];
- // let eff_i_m = this.skbuff_get(fiid, ef_buff, 2);
- // if (eff_i_m >= e_n) {
- // continue; //超过层数
- // }
- // e_m = Math.min(e_m, e_n - eff_i_m);
- // switch (cfgEf.args["i"]) {
- // case 1: //沉默 无法释放技能(可以放普攻),不可叠加,持续4秒
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: {}, //属性
- // });
- // this.timer_do(508, { do_iid: Number(fiid) });
- // break;
- // case 2: //2 回血 按最终伤害值百分比进行回血
- // if (cs["do_iid"] != Number(iid)) {
- // continue;
- // }
- // if (cs["hit"] == null) {
- // if (cfgEf.args["a"] != null) {
- // if (!this.oneHit[iid]) {
- // let hit_fiid = this.uuids[iid].ipk;
- // this.js_hits(iid, hit_fiid, cfgEf.args["a"] * 10000, skid); //计算伤害
- // let gzhit = this.oneHit[iid][hit_fiid];
- // cs["hit"] = gzhit.skhit;
- // } else {
- // let keys = Object.keys(this.oneHit[iid]);
- // for (let k = 0; k < keys.length; k++) {
- // cs["hit"] = this.oneHit[iid][keys[k]].ljhit;
- // }
- // }
- // }
- // if (cs["hit"] == null) {
- // continue;
- // }
- // }
- // if (cs["next_cx"] != null && cs["next_cx"] < this.zhen && cs["isTimer"] == 1) {
- // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
- // this.addOneAtk(iid, fiid, "effect", ["hp", Math.floor((cs["hit"] * e_a) / 10000)]);
- // } else {
- // if (cfgEf.args["if"] == 1) {
- // // 有if=1的直接回血一次
- // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
- // this.addOneAtk(iid, fiid, "effect", ["hp", Math.floor((cs["hit"] * e_a) / 10000)]);
- // } else {
- // // pass = false; // 加定时器回血 不加cd
- // cs["next_cx"] = this.zhen;
- // cs["do_iid"] = Number(fiid);
- // this.timer_add({
- // iid: iid, //触发者
- // fiids: [fiid], //触发对象
- // key: ef_ttype + "_" + e_i, //定时器标识
- // type: [601], //执行触发点
- // func: "sk_effect", //执行的函数名
- // lzhen: 30, //轮询执行时间
- // ezhen: this.zhen + maxzhen,
- // skid: skid, //技能ID
- // aeid: effectId, //效果ID|行为ID
- // cs: cs, //参数
- // overlayType: overlayType,
- // });
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: 1, //增加层数
- // eps: { e_a: e_a }, //属性
- // });
- // }
- // //delete cs["next_cx"]
- // }
- // break;
- // case 3: //晕眩 无法移动、攻击和释放技能,不可叠加,持续3秒
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: {}, //属性
- // });
- // this.timer_do(508, { do_iid: Number(fiid) });
- // break;
- // case 4: //火焰 每秒受到30%持续伤害,最高叠加10层,持续5秒
- // if (cfgEf.args["p"] && this.seedRand.rand(1, 10000) > cfgEf.args["p"] * 10000) {
- // continue;
- // }
- // if (cs["nextid"] == null || cs["i_59"] == null) {
- // let hit = cs[fiid] ? cs[fiid] : cs["hit"];
- // let csCpoy = gameMethod.objCopy(cs);
- // csCpoy["nextid"] = 1;
- // csCpoy["i_59"] = 0;
- // for (let index = 0; index < e_m; index++) {
- // this.timer_add({
- // iid: iid, //触发者
- // fiids: [fiid], //触发对象
- // key: ef_ttype, //定时器标识
- // type: [601], //执行触发点
- // func: "sk_effect", //执行的函数名
- // lzhen: 30, //轮询执行时间
- // ezhen: this.zhen + maxzhen,
- // skid: skid, //技能ID
- // aeid: effectId, //效果ID|行为ID
- // cs: csCpoy, //参数
- // overlayType: overlayType,
- // });
- // this.skbuff_add({
- // //添加buff 用于展示
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: 1, //增加层数
- // eps: {
- // i_59_hit: hit,
- // }, //属性
- // });
- // this.timer_do(505, { do_iid: Number(fiid) });
- // this.timer_do(508, { do_iid: Number(fiid) });
- // }
- // } else {
- // if (cs["do_iid"].toString() != iid) {
- // continue;
- // }
- // cs["i_59"] = this.skbuff_get(fiid, "i_59");
- // cs["hit"] = this.skbuff_get(fiid, "i_59_hit");
- // if (!cs["hit"]) {
- // if (cfgEf.args["a"] != null) {
- // this.js_hits(iid, fiid, 10000, skid); //计算伤害
- // let gzhit = this.oneHit[iid][fiid];
- // cs["hit"] = gzhit.skhit;
- // }
- // if (cs["hit"] == null) {
- // continue;
- // }
- // }
- // let hit = Math.floor(cs["hit"] * (e_a / 10000 + cs["i_59"]));
- // this.addOneAtk(fiid, fiid, "aType", Xys.ActionType.effect);
- // this.addOneAtk(fiid, fiid, "effect", ["hp", -1 * hit]);
- // }
- // break;
- // case 5: //冰冻 无法移动、不能普攻攻击和释放技能,无法叠加,持续4秒。作用期间无法被施加寒意
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: {}, //属性
- // });
- // this.timer_do(507, { do_iid: Number(fiid) });
- // this.timer_do(508, { do_iid: Number(fiid) });
- // break;
- // case 6: //击退 无法移动、不能普攻攻击、不能被攻击和释放技能,持续0.5秒
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: {}, //属性
- // });
- // this.timer_do(508, { do_iid: Number(fiid) });
- // if (lsOne == 0) {
- // lsOne = 1;
- // this.timer_do(206, { do_iid: Number(iid) });
- // }
- // break;
- // case 7: //寒意 攻击降低5%,持续10秒,叠加至5层时转化为冰冻
- // let eff_i_5 = this.skbuff_get(fiid, "effect_i_5", 2);
- // if (eff_i_5 == 0) {
- // let eff_i_ep: { [key: string]: number } = Object.assign(cfgEf.args);
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: eff_i_ep, //属性
- // });
- // this.timer_do(506, { do_iid: Number(iid) });
- // }
- // let eff_i_7 = this.skbuff_get(fiid, ef_buff, 2);
- // if (eff_i_7 >= 5) {
- // this.skbuff_sub_all(fiid, ef_buff);
- // cs["nextid"] = 1;
- // this.sk_effect(iid, skid, e_id, ef_ttype, cs);
- // }
- // break;
- // case 8: //真意 技能伤害增加3%,最高叠加10层,持续10秒
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: { sk_a: e_a }, //属性
- // });
- // this.timer_do(504, { do_iid: Number(iid) });
- // break;
- // case 9: //护体罡气 受到伤害时,优先抵消护体罡气(表现上需要加护盾特效)
- // let value9 = Math.floor((this.teams[fiid].eps["hp_max"] * cfgEf.args["hp_max"]) / 10000);
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: {
- // i_9: value9,
- // i_9_id: cfgEf.args["id"] ? cfgEf.args["id"] : 0,
- // i_9_skin: Number(skid),
- // }, //属性
- // });
- // this.timer_do(501, { do_iid: Number(iid) });
- // break;
- // case 10: //异常状态 包括:属性降低、流血、冰冻、击飞、沉默,眩晕
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: {}, //属性
- // });
- // this.timer_do(508, { do_iid: Number(fiid) });
- // break;
- // case 12: //异常免疫 免疫属性降低、流血、冰冻、击飞、沉默,眩晕
- // if (maxzhen > 0) {
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: {}, //属性
- // });
- // }
- // if (this.uuids[fiid] == null) {
- // continue;
- // }
- // if (gameMethod.isEmpty(this.uuids[fiid].skbuff) == true) {
- // continue;
- // }
- // // let keys2 = Object.keys(this.uuids[fiid].skbuff)
- // let keys2 = this.changeSkBuff(1, fiid, null, 1);
- // for (let k = 0; k < keys2.length; k++) {
- // let key = keys2[k];
- // if (gameMethod.isEmpty(this.uuids[fiid].skbuff[key])) {
- // continue;
- // }
- // if (["effect_i_10", "effect_i_1", "effect_i_3", "effect_i_4", "effect_i_5", "effect_i_6"].includes(key)) {
- // delete this.uuids[fiid].skbuff[key];
- // this.oneBuff[fiid] = 1;
- // continue;
- // }
- // //let copy10 = gameMethod.objCopy(this.uuids[fiid].skbuff[key]);
- // this.uuids[fiid].skbuff[key] = [];
- // let values = this.changeSkBuff(1, fiid, key, 2);
- // for (let j = 0; j < values.length; j++) {
- // let pass = false;
- // let keys3 = Object.keys(values[j].eps);
- // for (let l = 0; l < keys3.length; l++) {
- // if (this.teams[iid].eps[keys3[l]] == null) {
- // continue;
- // }
- // if (values[j].eps[keys3[l]] < 0) {
- // pass = true;
- // this.oneBuff[fiid] = 1;
- // break;
- // }
- // }
- // if (pass == false) {
- // this.uuids[fiid].skbuff[key].push(values[j]);
- // }
- // }
- // }
- // // 更新缓存
- // this.changeSkBuff(2, fiid, null, 1, this.uuids[fiid].skbuff);
- // break;
- // case 13: //最终伤害降低xx%
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: {
- // i_13: e_a,
- // i_13_cd: 0, // 持续性的 不加cd
- // i_13_nZhen: this.zhen,
- // }, //属性
- // });
- // break;
- // case 14: //当前生命首次低于x%, xx属性增加x%
- // let f_hp14 = this.skbuff_get(fiid, "hp");
- // let f_hp_max14 = this.skbuff_get(fiid, "hp_max");
- // if ((f_hp14 * 10000) / f_hp_max14 < Math.abs(cfgEf.args["hp"])) {
- // let eff_i_ep: { [key: string]: number } = {};
- // let keys = Object.keys(cfgEf.args);
- // for (let k = 0; k < keys.length; k++) {
- // if (keys[k] == "hp") {
- // continue;
- // }
- // if (this.teams[fiid].eps[keys[k]] == null) {
- // continue;
- // }
- // eff_i_ep[keys[k]] = cfgEf.args[keys[k]];
- // }
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: eff_i_ep, //属性
- // });
- // this.timer_sub(iid, ef_ttype);
- // }
- // break;
- // case 15: //触发暴击后,给自身加效果
- // cs["nextid"] = 1;
- // let id1 = cfgEf.args["id1"];
- // if (id1 > 0) {
- // this.sk_effect(iid, skid, id1, ef_ttype, cs);
- // }
- // this.sk_effect(iid, skid, e_id, ef_ttype, cs);
- // break;
- // case 16: //自身首次生命低于15%时进入入定状态,之后每秒恢复自身攻击200%的气血,期间自身无法行动。自身气血恢复至60%时解除入定状态,并对周围敌人造成200%技能伤害
- // if (cs["do_iid"].toString() != iid) {
- // continue;
- // }
- // let f_hp16 = this.skbuff_get(fiid, "hp");
- // let f_hp_max16 = this.skbuff_get(fiid, "hp_max");
- // if ((f_hp16 * 10000) / f_hp_max16 < Math.abs(cfgEf.args["hp"])) {
- // if (cs["nextid"] != 1) {
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: {}, //属性
- // });
- // cs["nextid"] = 1;
- // this.timer_add({
- // iid: iid, //触发者
- // fiids: fiids, //触发对象
- // key: ef_ttype, //定时器标识
- // type: [601], //执行触发点
- // func: "sk_effect", //执行的函数名
- // lzhen: 30, //轮询执行时间
- // ezhen: this.zhen + maxzhen,
- // skid: skid, //技能ID
- // aeid: effectId, //效果ID|行为ID
- // cs: cs, //参数
- // overlayType: overlayType,
- // });
- // }
- // }
- // if (cs["nextid"] == 1) {
- // let f_atk: number = this.skbuff_get(iid, "atk");
- // let addHp16: number = Math.floor((f_atk * cfgEf.args["atk_per"]) / 10000);
- // let addHpMax16: number = Math.floor((f_hp_max16 * Math.abs(cfgEf.args["hp2"])) / 10000);
- // addHp16 = Math.min(addHp16, addHpMax16 - f_hp16);
- // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
- // this.addOneAtk(iid, iid, "effect", ["hp", addHp16]);
- // f_hp16 = this.skbuff_get(fiid, "hp");
- // if ((f_hp16 * 10000) / f_hp_max16 >= Math.abs(cfgEf.args["hp2"])) {
- // this.skbuff_sub(fiid, ef_buff);
- // this.timer_sub(iid, ef_ttype);
- // cs["nextid"] = 1;
- // this.sk_effect(fiid, skid, cfgEf.args["id"], ef_ttype, cs);
- // }
- // }
- // break;
- // case 17: //记录自身处于某种状态buff,被攻击有概率给自身加效果
- // let eff_i_buff: number = 0;
- // if (cfgEf.args["buff"] != 10) {
- // // 10需要判断各种异常状态
- // eff_i_buff = this.skbuff_get(iid, "effect_i_" + cfgEf.args["buff"], 2);
- // } else {
- // let list: string[] = ["effect_i_1", "effect_i_3", "effect_i_6", "effect_i_4", "effect_i_5"];
- // for (let k = 0; k < list.length; k++) {
- // eff_i_buff += this.skbuff_get(fiid, list[k], 2);
- // }
- // }
- // if (eff_i_buff > 0) {
- // if (this.seedRand.rand(1, 10000) <= cfgEf.args["p"] * 10000) {
- // cs["nextid"] = 1;
- // this.sk_effect(iid, skid, cfgEf.args["id"], ef_ttype, cs);
- // }
- // } else {
- // pass = false; // 没触发 不要进入冷却时间
- // continue;
- // }
- // break;
- // case 18: //每3次攻击消耗一层真意,之后额外造成目标当前气血3%的伤害(最多造成自身攻击500%的伤害)
- // //备注:这里的攻击包括普攻和技能和连击,不包括反击,被动技能是不计算次数的
- // if (cs["do_iid"].toString() != iid) {
- // continue;
- // }
- // let bdcons18 = this.uuids[fiid].cons[0] + this.uuids[fiid].cons[1];
- // if (bdcons18 >= cfgEf.args["count"] && bdcons18 % cfgEf.args["count"] == 0) {
- // this.skbuff_sub(iid, "effect_i_" + cfgEf.args["buff"]);
- // cs["nextid"] = 1;
- // this.sk_effect(iid, skid, cfgEf.args["id"], ef_ttype, cs);
- // }
- // break;
- // case 19: //普攻施加快剑印记,持续7秒,最多叠加10层。目标每层快剑印记,使自身攻击附加30%额外伤害。若7秒内目标未受到自身伤害,则快剑印记全部消失
- // let cfgEf19 = Gamecfg.skillEffect.getItem(cfgEf.args["id"]);
- // if (cfgEf19 != null) {
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: 1, //增加层数
- // eps: {
- // //属性
- // i_19_a: cfgEf.args["a"] * 10000,
- // i_19_i: cfgEf19.args["i"],
- // },
- // });
- // let ceng19 = this.skbuff_get(fiid, "effect_i_" + cfgEf19.args["i"], 2);
- // let cfgEf19_m = Math.min(cfgEf19.args["m"], cfgEf19.args["n"] - ceng19);
- // if (cfgEf19_m > 0) {
- // cs["nextid"] = 1;
- // this.sk_effect(iid, skid, cfgEf.args["id"], ef_ttype, cs);
- // }
- // //let keys = Object.keys(this.uuids[fiid].skbuff["effect_i_" + cfgEf19.args["i"]]);
- // let keys = this.changeSkBuff(1, fiid, "effect_i_" + cfgEf19.args["i"], 1);
- // for (let k = 0; k < keys.length; k++) {
- // this.uuids[fiid].skbuff["effect_i_" + cfgEf19.args["i"]][Number(keys[k])].szhen = this.zhen;
- // this.uuids[fiid].skbuff["effect_i_" + cfgEf19.args["i"]][Number(keys[k])].ezhen = this.zhen + maxzhen;
- // }
- // this.changeSkBuff(2, fiid, "effect_i_" + cfgEf19.args["i"], 1, this.uuids[fiid].skbuff["effect_i_" + cfgEf19.args["i"]]);
- // }
- // break;
- // case 20: //每x秒清除自身异常状态
- // if (cs["do_iid"].toString() != iid) {
- // continue;
- // }
- // this.skbuff_sub(fiid, "effect_i_" + cfgEf.args["buff"]);
- // if (cfgEf.args["buff"] == 10) {
- // // let keys = Object.keys(this.uuids[fiid].skbuff)
- // let keys = this.changeSkBuff(1, fiid, null, 1);
- // for (let k = 0; k < keys.length; k++) {
- // let key = keys[k];
- // if (gameMethod.isEmpty(this.uuids[fiid].skbuff[key]) == true) {
- // continue;
- // }
- // if (["effect_i_1", "effect_i_3", "effect_i_4", "effect_i_5", "effect_i_6"].includes(key)) {
- // delete this.uuids[fiid].skbuff[key];
- // this.oneBuff[fiid] = 1;
- // continue;
- // }
- // if (!key.includes("effect_i_0")) {
- // continue;
- // }
- // //let copy10 = gameMethod.objCopy(this.uuids[fiid].skbuff[key]);
- // this.uuids[fiid].skbuff[key] = [];
- // //let values = Object.values(copy10);
- // let values = this.changeSkBuff(1, fiid, key, 2);
- // for (let j = 0; j < values.length; j++) {
- // let pass = false;
- // let keys3 = Object.keys(values[j].eps);
- // for (let l = 0; l < keys3.length; l++) {
- // if (this.teams[iid].eps[keys3[l]] == null) {
- // continue;
- // }
- // if (values[j].eps[keys3[l]] < 0) {
- // pass = true;
- // this.oneBuff[fiid] = 1;
- // break;
- // }
- // }
- // if (pass == false) {
- // this.uuids[fiid].skbuff[key].push(values[j]);
- // }
- // }
- // }
- // this.changeSkBuff(2, fiid, null, 1, this.uuids[fiid].skbuff);
- // }
- // break;
- // case 21: //自身持有护体罡气时,执向一个effectID的效果
- // //这边只管触发 外层有脚本在跑
- // cs["nextid"] = 1;
- // this.sk_effect(iid, skid, e_id, ef_ttype, cs);
- // let cfgEf21 = Gamecfg.skillEffect.getItem(e_id);
- // if (cfgEf21 != null) {
- // if (cfgEf21.type == 1) {
- // this.uuids[iid].podun.push("effect_i_0_" + e_id);
- // } else {
- // this.uuids[iid].podun.push("effect_i_" + cfgEf21.args["i"]);
- // }
- // }
- // break;
- // case 22: //血量低于X%时给自身添加buff
- // if (iid.length != fiid.length && this.oneHit[iid]) {
- // // 获取攻击对象
- // let hitiid: string = "";
- // let keys = Object.keys(this.oneHit[iid]);
- // for (let k = 0; k < keys.length; k++) {
- // hitiid = keys[k];
- // let hp_max22 = this.skbuff_get(hitiid, "hp_max");
- // let newHp22 = this.skbuff_get(hitiid, "hp");
- // if (this.uuids[iid].skbase[skid].effect[effectId].f == 0 && (newHp22 * 10000) / hp_max22 <= Math.abs(cfgEf.args["hp"])) {
- // let keys = Object.keys(cfgEf.args);
- // for (let i = 0; i < keys.length; i++) {
- // let key = keys[i];
- // if (!key.includes("id")) {
- // continue;
- // }
- // cs["nextid"] = 1;
- // this.sk_effect(iid, skid, cfgEf.args[key], ef_ttype, cs);
- // }
- // if (cfgEf.args["if"] == 1) {
- // this.uuids[iid].skbase[skid].effect[effectId].f = 1;
- // this.timer_sub(fiid, ef_ttype);
- // }
- // return;
- // }
- // }
- // } else {
- // let hp_max22 = this.skbuff_get(fiid, "hp_max");
- // let newHp22 = this.skbuff_get(fiid, "hp");
- // if (this.uuids[iid].skbase[skid].effect[effectId].f == 0 && (newHp22 * 10000) / hp_max22 <= Math.abs(cfgEf.args["hp"])) {
- // let keys = Object.keys(cfgEf.args);
- // for (let k = 0; k < keys.length; k++) {
- // if (!keys[k].includes("id")) {
- // continue;
- // }
- // cs["nextid"] = 1;
- // this.sk_effect(fiid, skid, cfgEf.args[keys[k]], ef_ttype, cs);
- // }
- // if (cfgEf.args["if"] == 1) {
- // this.uuids[iid].skbase[skid].effect[effectId].f = 1;
- // this.timer_sub(fiid, ef_ttype);
- // }
- // return;
- // } else {
- // pass = false;
- // }
- // }
- // break;
- // case 23: //记录快剑印记状态
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: {}, //属性
- // });
- // break;
- // case 24: //必定暴击
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: {}, //属性
- // });
- // break;
- // case 25: //灵力值获取
- // if (gameMethod.isEmpty(cfgEf.args["lingli"]) == false) {
- // this.add_mp(fiid, cfgEf.args["lingli"], 2);
- // }
- // if (gameMethod.isEmpty(cfgEf.args["lingli2"]) == false) {
- // this.add_mp(fiid, 10000 * cfgEf.args["lingli2"], 2);
- // }
- // break;
- // case 26: //每x次攻击,会使下一次攻击的目标增加buff(备注:攻击包括连击,不包括反击)
- // if (cs["do_iid"].toString() != iid) {
- // continue;
- // }
- // let bdcons26 = this.uuids[fiid].cons[0] + this.uuids[fiid].cons[1];
- // cs["limit"] = cs["limit"] == null ? cfgEf.args["count"] : cs["limit"];
- // let yu26 = 1;
- // if (cfgEf.args["if"] == 1) {
- // yu26 = 0;
- // }
- // if (bdcons26 >= cs["limit"] && bdcons26 % cfgEf.args["count"] == yu26) {
- // cs["limit"] += 1; //下一次才能在触发
- // let keys = Object.keys(cfgEf.args);
- // for (let k = 0; k < keys.length; k++) {
- // if (!keys[k].includes("id")) {
- // continue;
- // }
- // cs["nextid"] = 1;
- // this.sk_effect(fiid, skid, cfgEf.args[keys[k]], ef_ttype, cs);
- // this.uuids[iid].timer[ef_ttype][cs["timerId"].toString()].cs = cs;
- // }
- // } else {
- // continue;
- // }
- // break;
- // case 27: //记录目标某种状态,然后施加一个buff效果
- // if (!this.oneFiids[iid][ef_ttype]) {
- // continue;
- // }
- // if (this.oneFiids[iid][ef_ttype][0] === fiid) {
- // let eff_i_buff27 = 0;
- // if (cfgEf.args["if"] == 1) {
- // if (!this.oneHit[iid]) {
- // continue;
- // }
- // // 有配置的效果是加自身的 iid和fiid是一样的 要找攻击的目标
- // let keys = Object.keys(this.oneHit[iid]);
- // for (let k = 0; k < keys.length; k++) {
- // if (cfgEf.args["buff"] != 10) {
- // // 10需要判断各种异常状态
- // eff_i_buff27 = this.skbuff_get(keys[k], "effect_i_" + cfgEf.args["buff"], 2);
- // } else {
- // let list: string[] = ["effect_i_1", "effect_i_3", "effect_i_6", "effect_i_4", "effect_i_5"];
- // for (let j = 0; j < list.length; j++) {
- // eff_i_buff27 += this.skbuff_get(keys[k], list[j], 2);
- // }
- // }
- // }
- // } else {
- // if (cfgEf.args["buff"] != 10) {
- // // 10需要判断各种异常状态
- // eff_i_buff27 = this.skbuff_get(fiid, "effect_i_" + cfgEf.args["buff"], 2);
- // } else {
- // let list: string[] = ["effect_i_1", "effect_i_3", "effect_i_6", "effect_i_4", "effect_i_5"];
- // for (let j = 0; j < list.length; j++) {
- // eff_i_buff27 += this.skbuff_get(fiid, list[j], 2);
- // }
- // }
- // }
- // if (eff_i_buff27 > 0) {
- // cs["nextid"] = 1;
- // cs["i_59"] = 0; // todo 增伤用火焰增伤 可能有问题
- // this.sk_effect(iid, skid, cfgEf.args["id"], ef_ttype, cs);
- // if (cfgEf.args["id1"]) {
- // this.sk_effect(iid, skid, cfgEf.args["id1"], ef_ttype, cs);
- // }
- // } else {
- // pass = false; // 没有触发 不要加cd
- // }
- // } else {
- // pass = false; // 没有触发 不要加cd
- // }
- // break;
- // case 28: //对某种属性低于自己的敌人造成额外xx%伤害
- // let i_ep = this.skbuff_get(iid, cfgEf.args["ep"]);
- // let f_ep = this.skbuff_get(fiid, cfgEf.args["ep"]);
- // if (i_ep > f_ep) {
- // cs["nextid"] = 1;
- // this.sk_effect(iid, skid, cfgEf.args["id"], ef_ttype, cs);
- // }
- // break;
- // case 29: //自身或者敌方死亡后,获的某种状态
- // let f_ep29 = this.skbuff_get(fiid, "hp");
- // if (f_ep29 <= 0) {
- // cs["nextid"] = 1;
- // this.sk_effect(iid, skid, cfgEf.args["id"], ef_ttype, cs);
- // }
- // break;
- // case 30: //伤害加深
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: { a: cfgEf.args["a"] * 10000 }, //属性
- // });
- // break;
- // case 31: //按自身xx%攻击力进行治疗
- // // 是否有增强治疗效果 addOneAtk里面有处理了
- // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
- // let i_atk: number = this.skbuff_get(fiid, "atk");
- // let addHp31: number = Math.floor((i_atk * cfgEf.args["atk_per"]) / 10000);
- // this.addOneAtk(iid, fiid, "effect", ["hp", addHp31]);
- // break;
- // case 32: //技能每命中X个单位,给自身获取某种BUFF
- // if (cs["do_iid"].toString() != iid) {
- // continue;
- // }
- // let len = this.oneFiids[iid][ef_ttype].length;
- // if (this.oneFiids[iid][ef_ttype][len - 1] == fiid) {
- // // 最后一个攻击对象结算命中
- // let bdcons32 = this.oneFiids[iid][ef_ttype].length;
- // if (bdcons32 >= cfgEf.args["count"] && bdcons32 % cfgEf.args["count"] == 0) {
- // for (let i = 0; i < Math.floor(bdcons32 / cfgEf.args["count"]); i++) {
- // cs["nextid"] = 1;
- // this.sk_effect(iid, skid, cfgEf.args["id"], ef_ttype, cs);
- // }
- // }
- // } else {
- // continue;
- // }
- // break;
- // case 33: //触发暴击后,附加额外x%伤害
- // // 由于isBj是按skid来的 上一个技能的暴击 这里获取不到 所以需要遍历一下
- // if (cs["isBj"] == null && this.oneAtk[iid][fiid]) {
- // for (let k = 0; k < this.oneAtk[iid][fiid].effect.length; k++) {
- // if (this.oneAtk[iid][fiid].effect[k][0] === "baoji") {
- // cs["isBj"] = this.oneAtk[iid][fiid].effect[k][1];
- // break;
- // }
- // }
- // }
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: { i_33_a: cfgEf.args["a"] * 10000 }, //属性
- // });
- // if (cs["isBj"] != null) {
- // // 暴击并且拥有易伤状态
- // let a = this.skbuff_get(fiid, "i_33_a");
- // let subHp33: number = Math.floor(Math.abs(cs["isBj"] * (a / 10000)));
- // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
- // this.addOneAtk(iid, fiid, "effect", ["hp", -subHp33]);
- // this.skbuff_sub_all(fiid, ef_buff);
- // }
- // break;
- // case 34: //敌方生命低于x%,给自身指定某种状态(首次低于) 血量变化检测
- // if (cs["do_iid"].toString() != fiid) {
- // pass = false;
- // continue; //自己降低的不触发
- // }
- // let chaHp34: number = Math.abs(cfgEf.args["hp"]);
- // let f_hp34 = this.skbuff_get(fiid, "hp");
- // let f_hp_max34 = this.skbuff_get(fiid, "hp_max");
- // if ((f_hp34 * 10000) / f_hp_max34 < chaHp34) {
- // cs[fiid] = this.zhen;
- // let ef_ttype_1 = "effect_id_" + cfgEf.args["id"].toString();
- // if (this.oneFiids[iid] == null) {
- // this.oneFiids[iid] = {};
- // }
- // this.oneFiids[iid][ef_ttype_1] = [fiid];
- // cs["nextid"] = 1;
- // this.sk_effect(iid, skid, cfgEf.args["id"].toString(), "", cs);
- // } else {
- // pass = false;
- // continue;
- // }
- // break;
- // case 35: //攻击时,对血量低于30%的敌人施加一层寒意
- // if (cs["do_iid"].toString() != iid) {
- // continue;
- // }
- // let chaHp35: number = Math.abs(cfgEf.args["hp"]);
- // let f_hp35 = this.skbuff_get(fiid, "hp");
- // let f_hp_max35 = this.skbuff_get(fiid, "hp_max");
- // if ((f_hp35 * 10000) / f_hp_max35 < chaHp35) {
- // // 再下去 找不到加伤害的fiid了
- // if (cfgEf.args["id"]) {
- // let cfgEf2 = Gamecfg.skillEffect.getItem(cfgEf.args["id"]);
- // if (cfgEf2 && cfgEf2.args && cfgEf2.args["i"] == 53) {
- // let i_53_atk = this.skbuff_get(iid, "atk");
- // for (let k = 0; k < this.oneAtk[iid][fiid].effect.length; k++) {
- // if (this.oneAtk[iid][fiid].effect[k][0] === "hp" && this.oneAtk[iid][fiid].effect[k][1] < 0) {
- // this.oneAtk[iid][fiid].effect[k][1] = -Math.floor((i_53_atk * cfgEf2.args["atk"]) / 10000);
- // break;
- // }
- // }
- // } else {
- // cs["nextid"] = 1;
- // cs["fiid"] = Number(fiid); // 做个标识
- // this.sk_effect(iid, skid, cfgEf.args["id"].toString(), ef_ttype, cs);
- // }
- // }
- // }
- // break;
- // case 36: //自身第一次重伤(死亡)时,恢复一半气血
- // if (cs["do_iid"].toString() != iid) {
- // continue; //不是自己
- // }
- // let chaHp36: number = Math.abs(cfgEf.args["hp"]);
- // let f_hp_max36 = this.skbuff_get(fiid, "hp_max");
- // let subHp36: number = Math.floor(chaHp36 * f_hp_max36);
- // this.uuids[fiid].dzhen = 0;
- // this.uuids[fiid].skbuff = {};
- // this.timer_sub_by_fiid(fiid);
- // this.oneBuff[fiid] = 1;
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: 1350, //结束帧
- // overlayType: 2, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: 1, //增加层数
- // eps: {
- // i_36: subHp36,
- // i_36_nZhen: this.zhen + 30,
- // }, //属性
- // });
- // //this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
- // //this.addOneAtk(iid, fiid, "effect", ["hp", subHp36]);
- // break;
- // case 37: //己方任何一个单位护体罡气破碎时,然后指定一个BUFF效果,比如击退敌人
- // if (cs["do_iid"].toString().length != fiid.length) {
- // continue;
- // }
- // cs["nextid"] = 1;
- // this.sk_effect(fiid, skid, cfgEf.args["id"].toString(), ef_ttype, cs);
- // break;
- // case 38: //触发连击时,给自身增加效果
- // if (cs["do_iid"].toString() != iid) {
- // continue;
- // }
- // cs["nextid"] = 1;
- // this.sk_effect(iid, skid, cfgEf.args["id"].toString(), ef_ttype, cs);
- // break;
- // case 39: //己方单位施加击退时,使其获得50%气血值护体罡气,并提高其5%普攻伤害,持续至战斗结束,最多叠加20层,冷却12秒
- // if (cs["do_iid"].toString() != fiid) {
- // continue;
- // }
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: 1, //增加层数
- // eps: { i_39_a: cfgEf.args["a"] * 10000 }, //属性
- // });
- // //加护体罡气
- // let value39 = Math.floor((this.teams[fiid].eps["hp"] * cfgEf.args["hp"]) / 10000);
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: "effect_i_9", //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: 1, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: 1, //增加层数
- // eps: { i_9: value39 }, //属性
- // });
- // break;
- // case 40: //自身气血高于xx%时,有概率给自身增加效果
- // let f_hp40 = this.skbuff_get(fiid, "hp");
- // let f_hp_max40 = this.skbuff_get(fiid, "hp_max");
- // if ((f_hp40 * 10000) / f_hp_max40 > Math.abs(cfgEf.args["hp"])) {
- // if (this.seedRand.rand(1, 10000) <= cfgEf.args["p"] * 10000) {
- // cs["nextid"] = 1;
- // this.sk_effect(iid, skid, cfgEf.args["id"].toString(), ef_ttype, cs);
- // }
- // } else {
- // continue;
- // }
- // break;
- // case 41: //回血,取自身生命值上限x%进行回血,
- // if (cs["next_cx"] != null && cs["next_cx"] < this.zhen) {
- // let f_hp_max41 = this.skbuff_get(fiid, "hp_max");
- // let chaHp41: number = Math.abs(cfgEf.args["hp"]);
- // let addHp: number = Math.floor(f_hp_max41 * chaHp41);
- // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
- // this.addOneAtk(iid, fiid, "effect", ["hp", addHp]);
- // } else {
- // cs["next_cx"] = this.zhen;
- // this.timer_add({
- // iid: iid, //触发者
- // fiids: [fiid], //触发对象
- // key: ef_ttype + "_" + e_i, //定时器标识
- // type: [601], //执行触发点
- // func: "sk_effect", //执行的函数名
- // lzhen: 30, //轮询执行时间
- // ezhen: this.zhen + maxzhen,
- // skid: skid, //技能ID
- // aeid: effectId, //效果ID|行为ID
- // cs: cs, //参数
- // overlayType: overlayType,
- // });
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: 1, //增加层数
- // eps: {}, //属性
- // });
- // delete cs["next_cx"];
- // }
- // break;
- // case 42: //自身气血每降低xxxx%,造成伤害提升5%
- // let f_hp42: number = this.skbuff_get(fiid, "hp");
- // f_hp42 = Math.max(0, f_hp42);
- // let f_hp_max42 = this.skbuff_get(fiid, "hp_max");
- // let hpRate: number = Math.abs(cfgEf.args["hp"] * 100);
- // let newRate: number = Math.ceil((f_hp42 * 100) / f_hp_max42);
- // for (let index = 100 - hpRate; index >= newRate; index -= hpRate) {
- // if (cs[index.toString()] != null) {
- // continue;
- // }
- // cs[index.toString()] = 1;
- // this.timer_add({
- // iid: iid, //触发者
- // fiids: [fiid], //触发对象
- // key: ef_ttype, //定时器标识
- // type: [401], //执行触发点
- // func: "sk_effect", //执行的函数名
- // lzhen: 30, //轮询执行时间
- // ezhen: this.zhen + maxzhen,
- // skid: skid, //技能ID
- // aeid: effectId, //效果ID|行为ID
- // cs: cs, //参数
- // overlayType: overlayType,
- // });
- // cs["nextid"] = 1;
- // this.sk_effect(iid, skid, cfgEf.args["id"].toString(), ef_ttype, cs);
- // }
- // break;
- // case 43: //自身气血高于60%时,普通攻击有40%概率沉默目标
- // let chaHp43: number = Math.abs(cfgEf.args["hp"]);
- // let f_hp43 = this.skbuff_get(fiid, "hp");
- // let f_hp_max43 = this.skbuff_get(fiid, "hp_max");
- // if ((f_hp43 * 10000) / f_hp_max43 > chaHp43) {
- // if (this.seedRand.rand(1, 10000) <= cfgEf.args["p"] * 10000) {
- // cs["nextid"] = 1;
- // this.sk_effect(iid, skid, cfgEf.args["id"].toString(), ef_ttype, cs);
- // }
- // } else {
- // continue;
- // }
- // break;
- // case 44: //护盾消失时,直接造成自身周围全体目标120%技能伤害
- // cs["nextid"] = 1;
- // this.sk_effect(iid, skid, cfgEf.args["id"].toString(), ef_ttype, cs);
- // break;
- // case 45: //自身受到超过当前气血10%以上伤害时,获的某种效果
- // let f_hp46 = this.skbuff_get(fiid, "hp");
- // let f_hp46_old = this.teams[fiid].eps.hp;
- // let f_hp_max46 = this.skbuff_get(fiid, "hp_max");
- // if ((f_hp46 - f_hp46_old) / f_hp_max46 > cfgEf.args["hp"]) {
- // cs["nextid"] = 1;
- // this.sk_effect(iid, skid, cfgEf.args["id"].toString(), ef_ttype, cs);
- // } else {
- // continue;
- // }
- // break;
- // case 46: //牺牲自己xxx%当前气血,对目标造成xxx%伤害
- // let i_hp = this.skbuff_get(iid, "hp");
- // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
- // this.addOneAtk(iid, iid, "effect", ["hp", -1 * Math.floor(i_hp * cfgEf.args["hp"])]);
- // for (let k = 0; k < this.oneFiids[iid][ef_ttype].length; k++) {
- // this.js_hits(iid, this.oneFiids[iid][ef_ttype][k], cfgEf.args["a"] * 10000, skid); //计算伤害
- // let gzhit = this.oneHit[iid][this.oneFiids[iid][ef_ttype][k]];
- // this.addOneAtk(iid, this.oneFiids[iid][ef_ttype][k], "effect", ["hp", -1 * Math.floor(gzhit.skhit)]);
- // }
- // break;
- // case 47: //给BOSS挂了某种BUFF,BOSS就免疫这个效果。
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: cfgEf.args, //属性
- // });
- // break;
- // case 48: //BOSS抵抗真意/火焰的时间减少
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + 45 * 30, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: cfgEf.args, //属性
- // });
- // break;
- // case 51: //回血
- // if (cfgEf.args["if"] == 1) {
- // if (cs["nextid"] == null) {
- // cs["nextid"] = 1;
- // this.timer_add({
- // iid: iid, //触发者
- // fiids: fiids, //触发对象
- // key: ef_ttype, //定时器标识
- // type: cfgEf.triggerTime ? cfgEf.triggerTime : [601], //执行触发点
- // func: "sk_effect", //执行的函数名
- // lzhen: 30, //轮询执行时间
- // ezhen: this.zhen + maxzhen,
- // skid: skid, //技能ID
- // aeid: effectId, //效果ID|行为ID
- // cs: cs, //参数
- // overlayType: overlayType,
- // });
- // return;
- // } else {
- // this.timer_sub(iid, ef_ttype);
- // }
- // } else if (cfgEf.args["if"] == 2) {
- // if (cs["nextid"] == null) {
- // cs["nextid"] = 1;
- // this.timer_add({
- // iid: iid, //触发者
- // fiids: fiids, //触发对象
- // key: ef_ttype, //定时器标识
- // type: cfgEf.triggerTime ? cfgEf.triggerTime : [601], //执行触发点
- // func: "sk_effect", //执行的函数名
- // lzhen: cfgEf.interval * 30, //轮询执行时间
- // ezhen: this.zhen + maxzhen,
- // skid: skid, //技能ID
- // aeid: effectId, //效果ID|行为ID
- // cs: cs, //参数
- // overlayType: overlayType,
- // });
- // } else {
- // // 定时后加血
- // let i_51_atk = this.skbuff_get(iid, "atk");
- // let i_51_hp = Math.floor((cfgEf.args["atk_per"] * i_51_atk) / 10000);
- // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
- // this.addOneAtk(iid, fiid, "effect", ["hp", i_51_hp]);
- // }
- // return;
- // }
- // // cs["nextid"] = 1
- // if (cfgEf.args["id"] != null) {
- // this.sk_effect(iid, skid, cfgEf.args["id"], ef_ttype, cs);
- // }
- // let i_51_atk = this.skbuff_get(iid, "atk");
- // let i_51_hp = Math.floor((cfgEf.args["atk_per"] * i_51_atk) / 10000);
- // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
- // this.addOneAtk(iid, fiid, "effect", ["hp", i_51_hp]);
- // // 有附加id
- // break;
- // case 52: //强制对有寒意状态目标转化为冰冻,每层寒意冰冻x秒(转化完成后,需要清空目标寒意状态)
- // let hitiids = Object.keys(this.oneHit[iid]);
- // for (let k = 0; k < hitiids.length; k++) {
- // let hitiid = hitiids[k];
- // let f_eff_i_7 = this.skbuff_get(hitiid, "effect_i_7", 2);
- // if (f_eff_i_7 == 0) {
- // continue;
- // }
- // let maxZhen = Math.floor(this.zhen + f_eff_i_7 * cfgEf.args["t"] * 30);
- // this.skbuff_add({
- // fiid: hitiid, //添加对象
- // key: "effect_i_5", //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: maxZhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: {}, //属性
- // });
- // this.skbuff_sub_all(hitiid, "effect_i_7");
- // }
- // break;
- // case 53: //伤害加深(计算攻击力倍数) 这里的伤害相当于是直接用攻击力的倍数作为伤害值
- // // 本次攻击加成的 下一帧不能再加伤害要本次加!!!
- // if (!this.oneAtk[fiid]) {
- // return;
- // }
- // let i_53_atk = this.skbuff_get(iid, "atk");
- // let hitiids2 = Object.keys(this.oneHit[iid]);
- // for (let k = 0; k < hitiids2.length; k++) {
- // for (let j = 0; j < this.oneAtk[fiid][hitiids2[k]].effect.length; j++) {
- // if (this.oneAtk[fiid][hitiids2[k]].effect[j][0] === "hp" && this.oneAtk[fiid][hitiids2[k]].effect[j][1] < 0) {
- // this.oneAtk[fiid][hitiids2[k]].effect[j][1] = -Math.floor((i_53_atk * cfgEf.args["atk"]) / 10000);
- // break;
- // }
- // }
- // }
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + 1, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: {
- // i_53: Math.floor((i_53_atk * cfgEf.args["atk"]) / 10000),
- // },
- // });
- // break;
- // case 54: //直接对有真意状态的目标进行引爆,每层真意额外造成xx%伤害
- // let hits = Object.keys(this.oneHit[iid]);
- // let i_atk54 = this.skbuff_get(iid, "atk");
- // for (let k = 0; k < hits.length; k++) {
- // let eff_i_8_54 = this.skbuff_get(hits[k], "effect_i_8", 2);
- // let hit54 = Math.floor(i_atk54 * cfgEf.args["a"] * eff_i_8_54);
- // if (hit54 > 0) {
- // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
- // this.addOneAtk(iid, hits[k], "effect", ["hp", -1 * hit54]);
- // this.skbuff_sub_all(hits[k], "effect_i_8");
- // }
- // }
- // break;
- // case 56: //引爆我方所有真意,每层真意额外造成20%的伤害
- // let eff_i_4_56 = 0;
- // // 清除我方所有真意
- // for (let index = 0; index < this.teamFiids.length; index++) {
- // let uid = this.teamFiids[index];
- // if (iid.length != uid.length) {
- // continue;
- // }
- // let count = this.skbuff_get(uid, "effect_i_8", 2);
- // if (count > 0) {
- // eff_i_4_56 += count;
- // this.skbuff_sub_all(uid, "effect_i_8");
- // }
- // }
- // if (eff_i_4_56 > 0) {
- // let hits = Object.keys(this.oneHit[iid]);
- // let i_atk56 = this.skbuff_get(iid, "atk");
- // for (let k = 0; k < hits.length; k++) {
- // let hit56 = Math.floor(i_atk56 * cfgEf.args["a"] * eff_i_4_56);
- // if (hit56 > 0) {
- // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
- // this.addOneAtk(iid, hits[k], "effect", ["hp", -1 * hit56]);
- // }
- // }
- // } else {
- // continue;
- // }
- // break;
- // case 57: //清除我方所有火焰状态,每层火焰额外造成x%的伤害
- // let eff_i_4_57 = 0;
- // // 清除我方火焰
- // for (let index = 0; index < this.teamFiids.length; index++) {
- // let uid = this.teamFiids[index];
- // if (iid.length != uid.length) {
- // continue;
- // }
- // let count = this.skbuff_get(uid, "effect_i_4", 2);
- // if (count > 0) {
- // eff_i_4_57 += count;
- // this.skbuff_sub_all(uid, "effect_i_4");
- // }
- // }
- // if (eff_i_4_57 > 0) {
- // let hits = Object.keys(this.oneHit[iid]);
- // let i_atk57 = this.skbuff_get(iid, "atk");
- // for (let k = 0; k < hits.length; k++) {
- // let hit57 = Math.floor(i_atk57 * cfgEf.args["a"] * eff_i_4_57);
- // if (hit57 > 0) {
- // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
- // this.addOneAtk(iid, hits[k], "effect", ["hp", -1 * hit57]);
- // }
- // }
- // } else {
- // continue;
- // }
- // break;
- // case 58: //回血(按已损失生命的%去计算回血值)
- // if (cfgEf.args["if"] == 1) {
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: {
- // i_58: cfgEf.args["hp"],
- // i_58_cd: cfgEf.cd,
- // i_58_nZhen: this.zhen,
- // },
- // });
- // } else {
- // let fpk = this.uuids[iid]?.fpk;
- // let f_hp58 = this.skbuff_get(fiid, "hp");
- // let f_hp_max58 = this.skbuff_get(fiid, "hp_max");
- // let addHp58: number = Math.floor(((f_hp_max58 - f_hp58) * cfgEf.args["hp"]) / 10000);
- // if (fpk && cfgEf.triggerTime == null) {
- // this.addOneAtk(fpk, fpk, "aType", Xys.ActionType.effect);
- // this.addOneAtk(fpk, fiid, "effect", ["hp", addHp58]);
- // } else {
- // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
- // this.addOneAtk(iid, fiid, "effect", ["hp", addHp58]);
- // }
- // }
- // break;
- // case 59: //有概率将火焰每秒持续伤害增加xx%
- // if (this.seedRand.rand(1, 10000) <= cfgEf.args["p"] * 10000) {
- // let effect_i_4 = this.skbuff_get(fiid, "effect_i_4", 2);
- // if (effect_i_4 > 0) {
- // let i_59 = this.skbuff_get(fiid, "i_59");
- // //this.skbuff_update(fiid, { i_59: i_59 + cfgEf.args["a"] });
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: 1, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: {
- // i_59: cfgEf.args["a"],
- // },
- // });
- // } else {
- // pass = false;
- // }
- // } else {
- // pass = false;
- // }
- // break;
- // case 60: //移除对手等量的属性值
- // let eff_i_ep: { [key: string]: number } = {};
- // let keys60 = Object.keys(cfgEf.args);
- // for (let k = 0; k < keys60.length; k++) {
- // if (this.teams[fiid].eps[keys60[k]] == null) {
- // continue;
- // }
- // eff_i_ep[keys60[k]] = -1 * Math.abs(cfgEf.args[keys60[k]]);
- // }
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: eff_i_ep,
- // });
- // break;
- // case 61: //护体罡气的承伤减少/增加xxx%
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: {
- // i_61: cfgEf.args["hp_max"],
- // },
- // });
- // break;
- // case 62: //目标治疗效果降低/增加,持续X秒
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: {
- // i_62: cfgEf.args["hp"],
- // },
- // });
- // break;
- // case 63: //主角阵亡后,弟子会复活主角并恢复19.56%生命,每场战斗生效1次(秘法和法器的复活只能生效1个)
- // if (cs["do_iid"] % 100 != 0) {
- // continue;
- // }
- // let f_hp_max63 = this.skbuff_get(fiid, "hp_max");
- // let addHp62: number = Math.floor((f_hp_max63 * cfgEf.args["hp"]) / 10000);
- // this.skbuff_add({
- // fiid: cs["do_iid"].toString(), //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: {
- // i_63_hp: addHp62,
- // i_63_nZhen: this.zhen,
- // i_63_cd: 0,
- // },
- // });
- // break;
- // case 64: //弟子首次攻击伤害额外提升x%
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: {
- // i_64_a: cfgEf.args["a"] * 10000,
- // i_64_cd: cfgEf.cd ? cfgEf.cd : 0,
- // i_64_nZhen: this.zhen,
- // },
- // });
- // break;
- // case 65: //附加被攻击目标的当前生命值X%伤害,最高伤害不超过攻击力x%
- // let f_atk: number = this.skbuff_get(iid, "atk");
- // let keys65 = Object.keys(this.oneAtk[iid]);
- // for (let k = 0; k < keys65.length; k++) {
- // if (iid.length != keys65[k].length) {
- // let add_65: number = 0;
- // let f_hp = this.skbuff_get(keys65[k], "hp_max");
- // add_65 = (cfgEf.args["hp"] * f_hp) / 10000;
- // add_65 = Math.min(add_65, (cfgEf.args["max_atk"] * f_atk) / 10000);
- // add_65 = Math.max(0, Math.floor(add_65));
- // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
- // this.addOneAtk(iid, keys65[k], "effect", ["hp", -1 * add_65]);
- // }
- // }
- // break;
- // case 66: //随机一个弟子 偷取目标主角x%的攻击力,每层最高不超过x%自身攻击力 与 79配合使用
- // if (cfgEf.args["id"] != null) {
- // this.sk_effect(fiid, skid, cfgEf.args["id"].toString(), "", cs);
- // }
- // break;
- // case 79: //偷取目标x%的攻击力,每层最高不超过x%自身攻击力
- // let keys: { [key: string]: string } = { atk_per: "atk", def_per: "def", hp_max_per: "hp_max", hp_per: "hp" };
- // let eps_66: { [key: string]: number } = {};
- // let feps_66: { [key: string]: number } = {};
- // let keys79 = Object.keys(cfgEf.args);
- // for (let k = 0; k < keys79.length; k++) {
- // if (this.teams[iid].eps[keys79[k]] == null) {
- // continue;
- // }
- // let i_key = this.skbuff_get(iid, keys[keys79[k]] ? keys[keys79[k]] : keys79[k]);
- // let f_key = this.skbuff_get(fiid, keys[keys79[k]] ? keys[keys79[k]] : keys79[k]);
- // let f_val = Math.floor((f_key * cfgEf.args[keys79[k]]) / 10000);
- // let max_val = Math.floor((i_key * cfgEf.args["max_atk"]) / 10000);
- // let i_f_val = keys79[k] == "atk_per" ? Math.min(f_val, max_val) : f_val; // 这个值是攻击力
- // if (keys79[k] == "atk_per") {
- // // atk_per 算的是攻击力 直接加在atk上面
- // eps_66[keys[keys79[k]]] = i_f_val;
- // feps_66[keys[keys79[k]]] = -1 * f_val;
- // } else {
- // eps_66[keys79[k]] = i_f_val;
- // feps_66[keys79[k]] = -1 * f_val;
- // }
- // }
- // this.skbuff_add({
- // fiid: iid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: eps_66,
- // });
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: feps_66,
- // });
- // break;
- // case 67: //对最终伤害有概率造成N倍伤害
- // let a_per: number = 0;
- // if (this.seedRand.rand(1, 10000) <= cfgEf.args["p1"] * 10000) {
- // a_per = cfgEf.args["a1"];
- // } else if (this.seedRand.rand(1, 10000) <= cfgEf.args["p"] * 10000) {
- // a_per = cfgEf.args["a"];
- // }
- // if (a_per > 0) {
- // this.skbuff_add({
- // fiid: iid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: { a_per: a_per },
- // });
- // }
- // break;
- // case 68: //攻击时,消耗自身x%当前生命值,扣除敌方等额生命值,最高不超过自身x%攻击
- // let i_hp68 = this.skbuff_get(iid, "hp");
- // let i_atk68 = this.skbuff_get(iid, "atk");
- // let max = Math.floor((i_atk68 * cfgEf.args["atk_per"]) / 10000);
- // let subHp68 = Math.floor((i_hp68 * Math.abs(cfgEf.args["hp"])) / 10000);
- // subHp68 = Math.min(subHp68, max);
- // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
- // if (lsOne == 0) {
- // //只扣除一次
- // lsOne += 1;
- // this.addOneAtk(iid, iid, "effect", ["hp", -1 * subHp68]);
- // }
- // this.addOneAtk(iid, fiid, "effect", ["hp", -1 * subHp68]);
- // break;
- // case 69: //每次进行反击,获得51%强化兽灵,最大不超过自身攻击力30%,持续2秒,冷却10秒
- // let f_atk69 = this.skbuff_get(fiid, "atk");
- // let m_qhshouling = Math.floor((f_atk69 * cfgEf.args["atk_per"]) / 10000);
- // let qhshouling = Math.min(cfgEf.args["qhshouling"], m_qhshouling);
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: 1, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: {
- // qhshouling: qhshouling,
- // //max_add_hit: Math.floor((f_atk69 * cfgEf.args["atk"]) / 10000),
- // },
- // });
- // break;
- // case 70: //反弹xx%的伤害给敌方,最大不超过自身攻击力2倍
- // // 获取上次攻击自己的人
- // let hit_fiid = this.uuids[iid]?.fpk;
- // let hit70: number = cs["hit"] * cfgEf.args["a"];
- // let max70 = (this.skbuff_get(iid, "atk") * cfgEf.args["atk_per"]) / 10000;
- // hit70 = Math.floor(Math.min(hit70, max70));
- // //this.addOneAtk(hit_fiid,hit_fiid,"aType",Xys.ActionType.effect)
- // if (hit_fiid) {
- // this.addOneAtk(hit_fiid, hit_fiid, "effect", ["hp", -1 * hit70]);
- // }
- // break;
- // case 71: //单次伤害不超过自身最大生命值的x%
- // if (cs["do_iid"] != Number(fiid)) {
- // pass = false;
- // continue;
- // }
- // let f_hp_max71 = this.skbuff_get(iid, "hp_max");
- // let max_hit_71 = Math.floor((f_hp_max71 * cfgEf.args["hp_max"]) / 10000);
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: 1, //增加层数
- // eps: {
- // max_i_71: max_hit_71,
- // max_i_71_cd: cfgEf.cd ? cfgEf.cd : 0,
- // max_i_71_nZhen: this.zhen,
- // },
- // });
- // break;
- // case 72: //目标处于某种状态,然后延长此状态的时间
- // let f_i_buff = this.skbuff_get(fiid, "effect_i_" + cfgEf.args["buff"], 2);
- // if (f_i_buff > 0) {
- // //let keys72 = Object.keys(this.uuids[fiid].skbuff["effect_i_" + cfgEf.args["buff"]])
- // let keys72 = this.changeSkBuff(1, fiid, "effect_i_" + cfgEf.args["buff"], 1);
- // for (let k = 0; k < keys72.length; k++) {
- // this.uuids[fiid].skbuff["effect_i_" + cfgEf.args["buff"]][Number(keys72[k])].ezhen += 30 * cfgEf.args["t"];
- // }
- // this.changeSkBuff(2, fiid, "effect_i_" + cfgEf.args["buff"], 1, this.uuids[fiid].skbuff["effect_i_" + cfgEf.args["buff"]]);
- // } else {
- // continue;
- // }
- // break;
- // case 73: //每次释放术法,术法伤害增加7.5%,最高叠加到15%
- // let qhmifa73 = this.skbuff_get(fiid, "i_73");
- // qhmifa73 += cfgEf.args["qhmifa"];
- // qhmifa73 = Math.min(qhmifa73, cfgEf.args["max_qhmifa"]);
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: 2, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: 1, //增加层数
- // eps: { i_73: qhmifa73 },
- // });
- // break;
- // case 74: //给被溅射的目标增加一个BUFF效果
- // cs["nextid"] = 1;
- // this.sk_effect(iid, skid, cfgEf.args["id"].toString(), ef_ttype, cs);
- // break;
- // case 75: //技能系数增加,生效1次后清空
- // if (cfgEf.args["a"] == null) {
- // continue;
- // }
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: 2, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: 1, //增加层数
- // eps: { i_75: cfgEf.args["a"] * 10000 },
- // });
- // break;
- // case 76: //存在buff时,造成技能伤害
- // if (gameMethod.isEmpty(cfgEf.args["buff"]) == false) {
- // if (this.skbuff_get(iid, "effect_i_" + cfgEf.args["buff"], 2) <= 0) {
- // continue;
- // }
- // }
- // this.js_hits(iid, fiid, e_a, skid); //计算伤害
- // let gzhit = this.oneHit[iid][fiid];
- // let hit = gzhit.skhit;
- // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
- // this.addOneAtk(iid, fiid, "effect", ["hp", -1 * hit]);
- // if (cfgEf.args["p"] != null && this.seedRand.rand(1, 10000) <= cfgEf.args["p"] * 10000) {
- // cs["nextid"] = 1;
- // this.sk_effect(iid, skid, cfgEf.args["id"], ef_ttype, cs);
- // }
- // break;
- // case 77: // 造成伤害(额外伤害)
- // cs["hit"] = this.skbuff_get(iid, "atk");
- // if (cs["hit"] == null) {
- // continue;
- // }
- // let hit_77 = Math.floor((cs["hit"] * cfgEf.args["atk"]) / 10000);
- // let effect = [];
- // effect = ["hp", -1 * hit_77];
- // if (cfgEf.args["s"] != null) {
- // effect = ["hp", -1 * hit_77, "jitui", cfgEf.args["s"]];
- // }
- // this.addOneAtk(iid, fiid, "effect", effect);
- // break;
- // case 78: // 释放技能后 造成某种效果 id对应释放技能后效果
- // if (cfgEf.args["id"] != null) {
- // this.sk_effect(iid, skid, cfgEf.args["id"], ef_ttype, cs);
- // }
- // break;
- // case 80: // 给自身加buff,攻击目标带有某个buff时,必定暴击
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: 1, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: 1, //增加层数
- // eps: {
- // i_80_buff: cfgEf.args["buff"],
- // },
- // });
- // break;
- // case 81: // 溅射伤害增加/减少
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: {
- // i_81: e_a,
- // i_81_cd: 0, // 持续性的 不加cd
- // i_81_nZhen: this.zhen,
- // }, //属性
- // });
- // break;
- // case 82: //攻击带有护体罡气的承伤减少/增加xxx%
- // this.skbuff_add({
- // fiid: fiid, //添加对象
- // key: ef_buff, //属性key
- // minZhen: this.zhen, //开始帧
- // maxZhen: this.zhen + maxzhen, //结束帧
- // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
- // ceng: e_m, //增加层数
- // eps: {
- // i_82: cfgEf.args["hp_max"],
- // },
- // });
- // break;
- // }
- // }
- // if (!pass) {
- // return;
- // }
- // //cd
- // if (fiids.length > 0) {
- // if (gameMethod.isEmpty(cfgEf.count) == false && this.zhen != 1) {
- // this.uuids[iid].skbase[skid].effect[effectId].count += 1;
- // if (this.uuids[iid].skbase[skid].effect[effectId].count >= cfgEf.count) {
- // if (gameMethod.isEmpty(cfgEf.cd) == false) {
- // this.uuids[iid].skbase[skid].effect[effectId].effectZhen = this.zhen;
- // this.uuids[iid].skbase[skid].effect[effectId].nextcd = this.zhen + cfgEf.cd * 30;
- // this.uuids[iid].skbase[skid].effect[effectId].count = 0;
- // this.uuids[iid].timer[ef_ttype][cs["timerId"].toString()].szhen = this.zhen + cfgEf.cd * 30;
- // } else {
- // }
- // }
- // }
- // if (gameMethod.isEmpty(cfgEf.cd) == false && this.zhen != 1) {
- // if (this.uuids[iid].skbase[skid].effect[effectId].count == 0) {
- // this.uuids[iid].skbase[skid].effect[effectId].effectZhen = this.zhen; // 上次加状态的帧
- // if (cfgEf.args["t"]) {
- // if (this.uuids[iid].skbase[skid].effect[effectId].effectEndZhen < this.zhen) {
- // this.uuids[iid].skbase[skid].effect[effectId].effectEndZhen = this.zhen + cfgEf.args["t"] * 30; // buff持续增加效果结束帧
- // this.uuids[iid].skbase[skid].effect[effectId].nextcd = this.zhen + cfgEf.cd * 30;
- // }
- // } else {
- // this.uuids[iid].skbase[skid].effect[effectId].nextcd = this.zhen + cfgEf.cd * 30;
- // }
- // }
- // }
- // }
- // // 判定是否是弟子技能 触发弟子释放技能主角加血
- // if (cfgBase.type === "1" && cfgBase.skillType === 3) {
- // for (let index = 0; index < this.teamFiids.length; index++) {
- // let uid = this.teamFiids[index];
- // if (uid.length === iid.length) {
- // let i_58 = this.skbuff_get(uid, "effect_i_58", 2);
- // if (i_58 > 0) {
- // if (this.zhen >= this.skbuff_get(uid, "i_58_nZhen")) {
- // // 有cd的 加完一次要更新cd
- // let cd = this.skbuff_get(uid, "i_58_cd");
- // this.skbuff_update(uid, { i_58_nZhen: cd * 30 + this.zhen });
- // let addPer = this.skbuff_get(uid, "i_58"); // 恢复已损失生命的x%
- // let hp = this.skbuff_get(uid, "hp");
- // let hpMax = this.skbuff_get(uid, "hp_max");
- // let hit = Math.floor(((hpMax - hp) * addPer) / 10000);
- // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
- // this.addOneAtk(iid, uid, "effect", ["hp", hit]);
- // }
- // }
- // }
- // }
- // }
- // }
- // /**
- // * 辅助函数 - 获取值总和
- // * gType = 2 叠加的层数
- // */
- // private skbuff_get(iid: string, key: string, gType: number = 0): number {
- // let epVal: number = 0;
- // if (this.teams[iid] == null) {
- // return 0;
- // }
- // //层数
- // if (gType == 2) {
- // let ceng: number = 0;
- // if (key == "effect_i_10") {
- // if (this.uuids[iid].skbuff["effect_i_1"] != null) {
- // ceng += this.uuids[iid].skbuff["effect_i_1"].length;
- // }
- // if (this.uuids[iid].skbuff["effect_i_3"] != null) {
- // ceng += this.uuids[iid].skbuff["effect_i_3"].length;
- // }
- // if (this.uuids[iid].skbuff["effect_i_4"] != null) {
- // ceng += this.uuids[iid].skbuff["effect_i_4"].length;
- // }
- // if (this.uuids[iid].skbuff["effect_i_5"] != null) {
- // ceng += this.uuids[iid].skbuff["effect_i_5"].length;
- // }
- // if (this.uuids[iid].skbuff["effect_i_6"] != null) {
- // ceng += this.uuids[iid].skbuff["effect_i_6"].length;
- // }
- // //let keys = Object.keys(this.uuids[iid].skbuff)
- // let keys = this.changeSkBuff(1, iid, null, 1);
- // for (let k = 0; k < keys.length; k++) {
- // if (keys[k].includes("effect_i_0")) {
- // // let values = Object.values(this.uuids[iid].skbuff[keys[k]])
- // let values = this.changeSkBuff(1, iid, keys[k], 2);
- // for (let j = 0; j < values.length; j++) {
- // //计算属性 这里in没关系
- // let keys2 = Object.keys(values[j].eps);
- // for (let l = 0; l < keys2.length; l++) {
- // if (this.teams[iid].eps[keys2[l]] == null) {
- // continue;
- // }
- // if (values[j].eps[keys2[l]] < 0) {
- // ceng += 1;
- // break;
- // }
- // }
- // }
- // }
- // }
- // return ceng;
- // }
- // if (this.uuids[iid].skbuff[key] == null) {
- // return 0;
- // }
- // return this.uuids[iid].skbuff[key].length;
- // }
- // //属性
- // if (this.teams[iid].eps[key] != null) {
- // epVal = this.teams[iid].eps[key];
- // if (key == "hp") {
- // //剩余血量
- // epVal = this.jueFiidHp(iid);
- // }
- // }
- // // let values = Object.values(this.uuids[iid].skbuff);
- // let values = this.changeSkBuff(1, iid, null, 2);
- // for (let k = 0; k < values.length; k++) {
- // for (let j = 0; j < values[k].length; j++) {
- // //计算属性 这里in没关系
- // if (values[k][j].eps[key] == null) {
- // continue;
- // }
- // epVal += values[k][j].eps[key];
- // }
- // }
- // //攻击
- // if (key == "atk") {
- // let atk_per = this.skbuff_get(iid, "atk_per");
- // epVal += Math.floor((epVal * atk_per) / 10000);
- // }
- // //防御
- // if (key == "def") {
- // let def_per = this.skbuff_get(iid, "def_per");
- // epVal += Math.floor((epVal * def_per) / 10000);
- // }
- // //生命百分比
- // if (key == "hp_max") {
- // let hp_max_per = this.skbuff_get(iid, "hp_max_per");
- // epVal += Math.floor((epVal * hp_max_per) / 10000);
- // }
- // //生命百分比
- // if (key == "hp") {
- // let hp_per = this.skbuff_get(iid, "hp_per");
- // epVal += Math.floor((epVal * hp_per) / 10000);
- // }
- // return Math.floor(epVal);
- // }
- // /**
- // * 辅助函数 - 清除buff
- // */
- // private skbuff_clear() {
- // for (let index = 0; index < this.teamFiids.length; index++) {
- // let fiid = this.teamFiids[index];
- // if (this.teams[fiid].eps.hp <= 0) {
- // this.uuids[fiid].skbuff = {};
- // }
- // //let skbuffCopy = gameMethod.objCopy(this.uuids[fiid].skbuff);
- // this.uuids[fiid].skbuff = {};
- // // let keys = Object.keys(skbuffCopy)
- // let keys = this.changeSkBuff(1, fiid, null, 1);
- // for (let k = 0; k < keys.length; k++) {
- // //计算属性 这里in没关系
- // // let values = Object.values(skbuffCopy[keys[k]])
- // let values = this.changeSkBuff(1, fiid, keys[k], 2);
- // for (let j = 0; j < values.length; j++) {
- // if (this.zhen >= values[j].ezhen) {
- // this.oneBuff[fiid] = 1;
- // if (gameMethod.isEmpty(values[j].eps["i_9_id"]) == false) {
- // this.sk_effect(fiid, values[j].eps["i_9_skin"].toString(), values[j].eps["i_9_id"].toString(), "", {
- // do_iid: Number(fiid),
- // nextid: 1,
- // });
- // }
- // continue;
- // }
- // if (this.uuids[fiid].skbuff[keys[k]] == null) {
- // this.uuids[fiid].skbuff[keys[k]] = [];
- // }
- // this.uuids[fiid].skbuff[keys[k]].push(values[j]);
- // }
- // }
- // this.changeSkBuff(2, fiid, null, 1, this.uuids[fiid].skbuff);
- // if (this.skbuff_get(fiid, "effect_i_9", 2) <= 0) {
- // let values = Object.values(this.uuids[fiid].podun);
- // for (let k = 0; k < values.length; k++) {
- // this.skbuff_sub_all(fiid, values[k]);
- // }
- // }
- // if (this.skbuff_get(fiid, "effect_i_4", 2) <= 0) {
- // this.skbuff_sub_all(fiid, "effect_i_59");
- // }
- // }
- // }
- // /**
- // * 辅助函数 - 输出BUFF
- // */
- // private skbuff_outf() {
- // let keys = Object.keys(this.oneBuff);
- // for (let k = 0; k < keys.length; k++) {
- // this.addOneAtk(keys[k], keys[k], "aType", Xys.ActionType.buff);
- // // let keys2 = Object.keys(this.uuids[keys[k]].skbuff)
- // let keys2 = this.changeSkBuff(1, keys[k], null, 1);
- // for (let j = 0; j < keys2.length; j++) {
- // this.addOneAtk(keys[k], keys[k], "buff", [keys2[j], this.uuids[keys[k]].skbuff[keys2[j]].length]);
- // }
- // }
- // }
- // /**
- // * 辅助函数 - 添加属性值
- // */
- // private skbuff_add(cs: skbuff_add_cs) {
- // let eff_i_12 = this.skbuff_get(cs.fiid, "effect_i_12", 2);
- // if (eff_i_12 > 0) {
- // if (["effect_i_1", "effect_i_3", "effect_i_4", "effect_i_5", "effect_i_6"].includes(cs.key)) {
- // return;
- // }
- // if (cs.key.includes("effect_i_0")) {
- // let keys = Object.keys(cs.eps);
- // for (let k = 0; k < keys.length; k++) {
- // if (this.teams[cs.fiid].eps[keys[k]] == null) {
- // continue;
- // }
- // if (cs.eps[keys[k]] < 0) {
- // return;
- // }
- // }
- // }
- // }
- // if (cs.overlayType == 1) {
- // //1.叠加 2.不叠加替换,默认不填值就是不叠加
- // if (this.uuids[cs.fiid].skbuff[cs.key] == null) {
- // this.uuids[cs.fiid].skbuff[cs.key] = [];
- // }
- // for (let index = 0; index < cs.ceng; index++) {
- // this.uuids[cs.fiid].skbuff[cs.key].push({
- // szhen: cs.minZhen, //开始帧
- // ezhen: cs.maxZhen, //结束帧
- // eps: cs.eps, //属性值
- // });
- // }
- // } else {
- // this.uuids[cs.fiid].skbuff[cs.key] = [];
- // for (let index = 0; index < cs.ceng; index++) {
- // this.uuids[cs.fiid].skbuff[cs.key].push({
- // szhen: cs.minZhen, //开始帧
- // ezhen: cs.maxZhen, //结束帧
- // eps: cs.eps, //属性值
- // });
- // }
- // }
- // this.changeSkBuff(2, cs.fiid, cs.key, 1, this.uuids[cs.fiid].skbuff[cs.key]);
- // this.oneBuff[cs.fiid] = 1;
- // }
- // /**
- // * 辅助函数 - 修改属性值
- // */
- // private skbuff_update(iid: string, eps: { [p: string]: number }, type: number = 0) {
- // if (this.teams[iid] == null) {
- // return;
- // }
- // if (type === 1) {
- // this.teams[iid].eps = eps;
- // } else {
- // let keys = Object.keys(eps);
- // for (let k = 0; k < keys.length; k++) {
- // this.teams[iid].eps[keys[k]] = eps[keys[k]];
- // }
- // }
- // }
- // /**
- // * 辅助函数 - 删除属性值 (1个)
- // */
- // private skbuff_sub(fiid: string, key: string) {
- // if (this.uuids[fiid] == null) {
- // return;
- // }
- // if (gameMethod.isEmpty(this.uuids[fiid].skbuff[key]) == true) {
- // return;
- // }
- // this.uuids[fiid].skbuff[key].splice(0, 1);
- // this.changeSkBuff(2, fiid, key, 1, this.uuids[fiid].skbuff[key]);
- // this.oneBuff[fiid] = 1;
- // }
- // /**
- // * 辅助函数 - 删除属性值 (所有)
- // */
- // private skbuff_sub_all(fiid: string, key: string) {
- // if (this.uuids[fiid] == null) {
- // return;
- // }
- // if (gameMethod.isEmpty(this.uuids[fiid].skbuff[key]) == true) {
- // return;
- // }
- // //delete this.uuids[fiid].skbuff[key];
- // this.changeSkBuff(3, fiid, key);
- // if (key == "effect_i_4" && this.uuids[fiid].skbuff["effect_i_59"]) {
- // // 火焰清除时 对应的火焰增伤也清除
- // //delete this.uuids[fiid].skbuff["effect_i_59"]
- // this.changeSkBuff(3, fiid, "effect_i_59");
- // }
- // this.oneBuff[fiid] = 1;
- // }
- // /**
- // * 辅助函数 - 最终伤害增减
- // * @param iid 打人
- // * @param fiid 被打人
- // * @param hit 造成的伤害
- // */
- // private hit_last(iid: string, fiid: string, hit: number, isfj: number = 0): number {
- // if (hit <= 0) {
- // return 0;
- // }
- // let add_per: number = 0;
- // //最终伤害降低xx%
- // let i_13_nZhen = this.skbuff_get(fiid, "i_13_nZhen");
- // if (this.skbuff_get(fiid, "effect_i_13", 2) > 0 && this.zhen >= i_13_nZhen) {
- // add_per += this.skbuff_get(fiid, "i_13");
- // let cd = this.skbuff_get(fiid, "i_13_cd");
- // if (cd > 0) {
- // this.skbuff_update(fiid, { i_13_nZhen: cd * 30 + this.zhen });
- // }
- // }
- // hit += Math.floor((hit * add_per) / 10000);
- // // 计算个人战力差 系数
- // hit = Math.floor(this.powerDisparity(iid, fiid) * hit);
- // hit = Math.max(0, hit);
- // let f_i_9 = this.skbuff_get(fiid, "i_9");
- // if (f_i_9 > 0) {
- // //有护盾
- // let f_i_61 = this.skbuff_get(fiid, "i_61") / 10000;
- // let i_i_82 = this.skbuff_get(iid, "i_82") / 10000;
- // //let copy = gameMethod.objCopy(this.uuids[fiid].skbuff["effect_i_9"]);
- // this.uuids[fiid].skbuff["effect_i_9"] = [];
- // // let values = Object.values(copy)
- // let values = this.changeSkBuff(1, fiid, "effect_i_9", 2);
- // for (let k = 0; k < values.length; k++) {
- // let skbuff = values[k];
- // //计算属性 这里in没关系
- // let i_9_add = Math.floor(skbuff.eps["i_9"] * (f_i_61 - i_i_82));
- // if (hit >= skbuff.eps["i_9"] + i_9_add) {
- // hit -= skbuff.eps["i_9"] + i_9_add;
- // skbuff.eps["i_9"] = 0;
- // if (gameMethod.isEmpty(skbuff.eps["i_9_id"]) == false) {
- // this.sk_effect(fiid, skbuff.eps["i_9_skin"].toString(), skbuff.eps["i_9_id"].toString(), "", {
- // do_iid: Number(fiid),
- // nextid: 1,
- // });
- // }
- // this.timer_do(105, { do_iid: Number(fiid) }); //护体罡气破碎时触发
- // this.oneBuff[fiid] = 1;
- // } else {
- // skbuff.eps["i_9"] -= hit - i_9_add;
- // hit = 0;
- // this.uuids[fiid].skbuff["effect_i_9"].push(skbuff);
- // }
- // if (isfj === 1) {
- // this.addOneAtk(fiid, fiid, "effect", ["i_9", skbuff.eps["i_9"]]);
- // } else {
- // this.addOneAtk(iid, fiid, "effect", ["i_9", skbuff.eps["i_9"]]);
- // }
- // }
- // this.changeSkBuff(2, fiid, "effect_i_9", 1, this.uuids[fiid].skbuff["effect_i_9"]);
- // }
- // return Math.floor(hit);
- // }
- // // 个人战力差
- // private powerDisparity(iid: string, fiid: string, power?: number, fPower?: number): number {
- // let pct1 = 1;
- // let pct2 = 1;
- // let ilen = iid.length;
- // let flen = fiid.length;
- // if (this.damage[ilen] && this.damage[ilen][flen]) {
- // return this.damage[ilen][flen];
- // }
- // if (this.damage[ilen] == null) {
- // this.damage[ilen] = {};
- // }
- // if (this.damage[flen] == null) {
- // this.damage[flen] = {};
- // }
- // this.damage[ilen][flen] = pct1;
- // this.damage[flen][ilen] = pct2;
- // if (power != null && fPower != null) {
- // if (power == 0 || fPower == 0) {
- // return pct1;
- // }
- // // 战力差
- // let powerC = Math.abs(power - fPower);
- // // 战力比
- // let powerB = Math.min(power, fPower) / Math.max(power, fPower);
- // let index = 1;
- // while (index > 0) {
- // let damage = Gamecfg.userDamage.getItem(index.toString());
- // if (damage != null) {
- // if (
- // damage.zhanlirange[0] <= powerC &&
- // ((damage.zhanlirange.length == 2 && powerC <= damage.zhanlirange[1]) || damage.zhanlirange.length == 1) &&
- // damage.ratio[0] <= powerB &&
- // powerB <= damage.ratio[1]
- // ) {
- // if (power > fPower) {
- // pct1 += damage.xishua;
- // pct2 -= damage.xishub;
- // } else {
- // pct1 -= damage.xishub;
- // pct2 += damage.xishua;
- // }
- // index = -1;
- // } else {
- // index++;
- // }
- // } else {
- // index = -1;
- // }
- // }
- // this.damage[ilen][flen] = pct1;
- // this.damage[flen][ilen] = pct2;
- // }
- // return pct1;
- // }
- // /**
- // * 是否暴击
- // * @param iid
- // * @param fiid
- // * 暴击率=max((我方暴击-敌方抗暴击),暴击保底参数)
- // */
- // private isBaoji(iid: string, fiid: string): number {
- // if (this.teams[iid].type == 3) {
- // return 0;
- // }
- // let isBj: number = 0;
- // let ef_i_24 = this.skbuff_get(iid, "effect_i_24", 2);
- // if (ef_i_24 > 0) {
- // //必定暴击
- // this.skbuff_sub_all(iid, "effect_i_24");
- // isBj = 1;
- // return isBj;
- // }
- // let ef_i_80 = this.skbuff_get(iid, "effect_i_80", 2);
- // let ef_i_80_buff = this.skbuff_get(iid, "i_80_buff");
- // if (ef_i_80 > 0 && this.skbuff_get(fiid, "effect_i_" + ef_i_80_buff, 2) > 0) {
- // //必定暴击
- // this.skbuff_sub_all(iid, "effect_i_80");
- // isBj = 1;
- // return isBj;
- // }
- // let i_baoji: number = this.skbuff_get(iid, "baoji");
- // let f_hsbaoji: number = this.skbuff_get(fiid, "hsbaoji");
- // let bdbaoji: number = 0; //保底暴击
- // let cfg = Gamecfg.userEp.getItem("baoji");
- // if (cfg != null) {
- // bdbaoji = cfg.initEp;
- // }
- // if (this.seedRand.rand(1, 10000) <= Math.max(i_baoji - f_hsbaoji, bdbaoji)) {
- // isBj = 1;
- // }
- // return isBj;
- // }
- // /**
- // * 是否连击 只打一次
- // * @param iid
- // * @param fiid
- // */
- // private isLianji(iid: string, fiid: string): number {
- // if (this.jueFiidHp(iid) <= 0 || this.jueFiidHp(fiid) <= 0) {
- // return 0; //其中一个死了
- // }
- // if (this.teams[iid].type == 3) {
- // return 0;
- // }
- // let isLj: number = 0;
- // let i_lianji: number = this.skbuff_get(iid, "lianji");
- // let f_hslianji: number = this.skbuff_get(fiid, "hslianji");
- // let bdlianji: number = 0; //保底暴击
- // let cfg = Gamecfg.userEp.getItem("lianji");
- // if (cfg != null) {
- // bdlianji = cfg.initEp;
- // }
- // if (this.seedRand.rand(1, 10000) <= i_lianji - f_hslianji) {
- // isLj = 1;
- // }
- // return isLj;
- // }
- // /**
- // * 是否格挡
- // * 敌方格挡率=max((敌方格挡-我方抗格挡),格挡保底参数)
- // * @param iid
- // * @param fiid
- // * 1.敌人如果处于晕眩、冰冻中,则直接不触发格挡,跳过格挡率计算过程
- // * 2.如果敌人处于非晕眩、冰冻中,则按格挡率判断
- // */
- // private isGedang(iid: string, fiid: string): number {
- // if (this.teams[iid].type == 3) {
- // return 0;
- // }
- // let isGd: number = 0;
- // let f_i_3: number = this.skbuff_get(fiid, "effect_i_3", 2);
- // if (f_i_3 > 0) {
- // return isGd;
- // }
- // let f_i_5: number = this.skbuff_get(fiid, "effect_i_5", 2);
- // if (f_i_5 > 0) {
- // return isGd;
- // }
- // let f_block: number = this.skbuff_get(fiid, "block");
- // let i_hsblock: number = this.skbuff_get(iid, "hsblock");
- // let bdGedang: number = 0; //保底格挡
- // let cfg = Gamecfg.userEp.getItem("block");
- // if (cfg != null) {
- // bdGedang = cfg.initEp;
- // }
- // if (this.seedRand.rand(1, 10000) <= Math.max(f_block - i_hsblock, bdGedang)) {
- // isGd = 1;
- // }
- // return isGd;
- // }
- // /**
- // * 是否反击
- // * @param iid
- // * @param fiid
- // * 敌方反击率=max((敌方反击-我方抗反击),反击保底参数)
- // * 1.触犯反击时攻击不能被敌人格挡,必须百分百命中,(也就是说不会被敌人格挡)
- // * 2.触犯反击时攻击不会继续判断是否触发暴击(也就是不会触发暴击)
- // * 3.触发反击时不会触发眩晕、连击、溅射
- // * 4.反击后不能再触发反击
- // */
- // private isFanji(iid: string, fiid: string): number {
- // if (this.jueFiidHp(iid) <= 0 || this.jueFiidHp(fiid) <= 0) {
- // return 0; //其中一个死了
- // }
- // if (this.teams[iid].type == 3 || this.teams[fiid].type == 3) {
- // return 0;
- // }
- // let isfj: number = 0;
- // let i_fanji: number = this.skbuff_get(iid, "fanji");
- // let f_hsfanji: number = this.skbuff_get(fiid, "hsfanji");
- // let bdfanji: number = 0; //保底反击
- // let cfg = Gamecfg.userEp.getItem("fanji");
- // if (cfg != null) {
- // bdfanji = cfg.initEp;
- // }
- // if (this.seedRand.rand(1, 10000) <= Math.max(i_fanji - f_hsfanji, bdfanji)) {
- // isfj = 1;
- // }
- // return isfj;
- // }
- // /**
- // * 增减蓝条
- // * @param fiid
- // * @param num
- // * @returns
- // */
- // private add_mp(fiid: string, num: number, wz: 0 | 1 | 2) {
- // if (this.teams[fiid] == null) {
- // return;
- // }
- // if (Number(fiid) % 100 != 0) {
- // return;
- // }
- // if (this.mpfiids[fiid] == null) {
- // this.mpfiids[fiid] = [0, 0];
- // }
- // if (wz == 0 || wz == 1) {
- // if (this.mpfiids[fiid][wz] == 1) {
- // return;
- // }
- // this.mpfiids[fiid][wz] = 1;
- // }
- // this.teams[fiid].eps["mp"] = Math.max(this.teams[fiid].eps["mp"], 0);
- // this.teams[fiid].eps["mp"] += Math.floor(num);
- // this.teams[fiid].eps["mp"] = Math.min(this.teams[fiid].eps["mp"], 10000);
- // this.addOneAtk(fiid, fiid, "aType", Xys.ActionType.effect);
- // this.addOneAtk(fiid, fiid, "effect", ["mp", num]);
- // }
- // /**
- // * 添加轮询执行脚本
- // */
- // private timer_add(addTimer: timer_add_cs) {
- // if (this.uuids[addTimer.iid] == null) {
- // return; //兼容不存在的人
- // }
- // let cs = gameMethod.objCopy(addTimer.cs);
- // if (cs["timerId"] == null) {
- // cs["timerId"] = this.timerId;
- // }
- // if (addTimer.type[0] == 602) {
- // if (this.uuids[addTimer.iid].timer[addTimer.key] == null) {
- // this.uuids[addTimer.iid].timer[addTimer.key] = {};
- // }
- // if (addTimer.overlayType == 2) {
- // this.uuids[addTimer.iid].timer[addTimer.key] = {}; //换掉原来的
- // }
- // addTimer.key = addTimer.key + "_" + 602;
- // if (this.uuids[addTimer.iid].timer[addTimer.key] == null) {
- // this.uuids[addTimer.iid].timer[addTimer.key] = {};
- // }
- // if (addTimer.overlayType == 2) {
- // this.uuids[addTimer.iid].timer[addTimer.key] = {}; //换掉原来的
- // }
- // this.uuids[addTimer.iid].timer[addTimer.key][cs["timerId"].toString()] = {
- // fiids: addTimer.fiids, //执行触发点
- // type: addTimer.type, //执行触发点
- // func: addTimer.func, //执行的函数名
- // szhen: this.zhen, //触发的帧
- // lzhen: addTimer.lzhen, //轮询执行时间
- // ezhen: addTimer.ezhen, //结束时间
- // skid: addTimer.skid, //技能ID
- // aeid: addTimer.aeid, //效果ID|行为ID
- // cs: cs,
- // };
- // } else {
- // if (this.uuids[addTimer.iid].timer[addTimer.key] == null) {
- // this.uuids[addTimer.iid].timer[addTimer.key] = {};
- // }
- // if (addTimer.overlayType == 2) {
- // this.uuids[addTimer.iid].timer[addTimer.key] = {}; //换掉原来的
- // }
- // this.uuids[addTimer.iid].timer[addTimer.key][cs["timerId"].toString()] = {
- // fiids: addTimer.fiids, //执行触发点
- // type: addTimer.type, //执行触发点
- // func: addTimer.func, //执行的函数名
- // szhen: this.zhen, //触发的帧
- // lzhen: addTimer.lzhen, //轮询执行时间
- // ezhen: addTimer.ezhen, //结束时间
- // skid: addTimer.skid, //技能ID
- // aeid: addTimer.aeid, //效果ID|行为ID
- // cs: cs,
- // };
- // }
- // this.changeTimer(2, addTimer.iid, addTimer.key, 1, this.uuids[addTimer.iid].timer[addTimer.key]);
- // this.timerId += 1;
- // }
- // /**
- // * 删除轮询执行脚本
- // */
- // private timer_sub(fiid: string, key: string) {
- // if (this.uuids[fiid] == null) {
- // return;
- // }
- // this.changeTimer(3, fiid, key);
- // //delete this.uuids[fiid].timer[key];
- // }
- // /**
- // * 删除轮询执行脚本 - 删除某个人的(关于他的定时器)
- // */
- // private timer_sub_by_fiid(fiid: string) {
- // if (this.uuids[fiid] == null) {
- // return;
- // }
- // for (let index = 0; index < this.teamFiids.length; index++) {
- // let iid = this.teamFiids[index];
- // // let keys = Object.keys(this.uuids[iid].timer);
- // let keys = this.changeTimer(1, iid, null, 1);
- // for (let k = 0; k < keys.length; k++) {
- // // let keys2 = Object.keys(this.uuids[iid].timer[keys[k]])
- // let keys2 = this.changeTimer(1, iid, keys[k], 1);
- // for (let j = 0; j < keys2.length; j++) {
- // if (this.uuids[iid].timer[keys[k]][keys2[j]] && this.uuids[iid].timer[keys[k]][keys2[j]].fiids) {
- // let copyFiids: string[] = gameMethod.objCopy(this.uuids[iid].timer[keys[k]][keys2[j]].fiids);
- // this.uuids[iid].timer[keys[k]][keys2[j]].fiids = [];
- // let values = copyFiids;
- // for (let l = 0; l < values.length; l++) {
- // if (values[l] != fiid) {
- // this.uuids[iid].timer[keys[k]][keys2[j]].fiids.push(values[l]);
- // }
- // }
- // if (this.uuids[iid].timer[keys[k]][keys2[j]].fiids.length == 0) {
- // delete this.uuids[iid].timer[keys[k]][keys2[j]];
- // }
- // }
- // }
- // }
- // }
- // this.changeTimer(2, null, null, 1);
- // }
- // /**
- // * 执行轮询执行脚本
- // * @param fiid 执行人
- // * @param type 执行点
- // */
- // private timer_do(_type: number, cs: { [key: string]: number } = {}) {
- // for (let i = 0; i < this.teamFiids.length; i++) {
- // if (this.uuids[this.teamFiids[i]].dzhen > 0 && this.uuids[this.teamFiids[i]].dzhen < this.zhen) {
- // continue; //死了 不应该在触发了
- // }
- // // let keys: string[] = Object.keys(this.uuids[this.teamFiids[i]].timer);
- // let keys: string[] = this.changeTimer(1, this.teamFiids[i], null, 1);
- // for (let k = 0; k < keys.length; k++) {
- // // let timers = Object.values(this.uuids[this.teamFiids[i]].timer[keys[k]]);
- // let timers = this.changeTimer(1, this.teamFiids[i], keys[k], 2);
- // for (let j = 0; j < timers.length; j++) {
- // if (_type != 0 && !timers[j].type.includes(_type)) {
- // continue; //不是这个执行类型的
- // }
- // if (this.zhen < timers[j].szhen || this.zhen > timers[j].ezhen) {
- // continue; //未开始或者过期了
- // }
- // if (this.zhen < timers[j].lzhen || (this.zhen - timers[j].szhen) % timers[j].lzhen > 0) {
- // continue; //没有到当前帧触发
- // }
- // if (timers[j].func == "sk_effect") {
- // if (cs["do_iid"] != Number(this.teamFiids[i])) {
- // let pass: boolean = false;
- // if (pass == false && _type == 404 && cs["do_iid"].toString().length != this.teamFiids[i].length) {
- // pass = true;
- // }
- // if (pass == false && _type == 106 && timers[j].fiids.includes(cs["do_iid"].toString())) {
- // pass = true;
- // }
- // if (pass == false && _type == 206 && cs["do_iid"].toString().length == this.teamFiids[i].length) {
- // pass = true;
- // }
- // if (pass == false) {
- // continue;
- // }
- // }
- // if (this.oneFiids[this.teamFiids[i]] == null) {
- // this.oneFiids[this.teamFiids[i]] = {};
- // }
- // let timer_fiids: string[] = [];
- // let fiids = timers[j].fiids;
- // for (let l = 0; l < fiids.length; l++) {
- // if (this.uuids[fiids[l]]==null ){
- // console.log("fiids===:",fiids)
- // continue;
- // }
- // if (this.uuids[fiids[l]].dzhen > 0 && this.uuids[fiids[l]].dzhen < this.zhen) {
- // continue; //死了 不应该在触发了
- // }
- // timer_fiids.push(fiids[l]);
- // }
- // if (timer_fiids.length <= 0 && timers[j].fiids.length != 0) {
- // // 本身没有目标的定时器 不要跳过
- // continue;
- // }
- // if (_type == 602) {
- // keys[k] = keys[k].slice(0, keys[k].length - 4);
- // }
- // this.oneFiids[this.teamFiids[i]][keys[k]] = timer_fiids;
- // let csCopy = gameMethod.objCopy(timers[j].cs);
- // csCopy = Object.assign(csCopy, cs);
- // if (_type === 601 || _type === 602) {
- // csCopy["isTimer"] = 1;
- // }
- // this.sk_effect(this.teamFiids[i], timers[j].skid, timers[j].aeid, keys[k], csCopy);
- // }
- // }
- // }
- // }
- // }
- // /**
- // * 解锁隐藏
- // */
- // private jiesuo_hide(iid: string) {
- // let minLv: number = 999;
- // let minfiid: string = "";
- // let iidList: string[] = []
- // for (let index = 0; index < this.teamFiids.length; index++) {
- // let fiid = this.teamFiids[index];
- // if (fiid.length != iid.length) {
- // iidList.push(fiid);
- // continue;
- // }
- // if (this.teams[fiid].isHide == 0) {
- // continue;
- // }
- // if (this.teams[fiid].isHide < minLv) {
- // if (minfiid != "") {
- // this.teams[fiid].isHide = minLv;
- // }
- // minLv = this.teams[fiid].isHide;
- // minfiid = fiid;
- // }
- // }
- // if (minfiid != "") {
- // // 清空上一只boss的异常状态
- // for (let i=0;i<iidList.length;i++){
- // for (let k=0;k<this.bateBuff.length;k++){
- // this.skbuff_sub_all(iidList[i],this.bateBuff[k])
- // }
- // }
- // this.teams[minfiid].isHide = 0;
- // this.addOneAtk(minfiid, minfiid, "aType", Xys.ActionType.hide);
- // this.addOneAtk(minfiid, minfiid, "effect", ["isHide", 0]);
- // }
- // }
- // }
- cc._RF.pop();
- }
- if (nodeEnv) {
- __define(__module.exports, __require, __module);
- }
- else {
- __quick_compile_project__.registerModuleFunc(__filename, function () {
- __define(__module.exports, __require, __module);
- });
- }
- })();
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0cy9zY3JpcHQvY29tbW9uL2ZpZ2h0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdDQUFnQztBQUNoQyxtQ0FBbUM7QUFDbkMsdURBQXVEO0FBRXZELGlCQUFpQjtBQUNqQiw0QkFBNEI7QUFDNUIsMkJBQTJCO0FBQzNCLDJCQUEyQjtBQUMzQiw2QkFBNkI7QUFDN0IsNkJBQTZCO0FBQzdCLHVEQUF1RDtBQUN2RCwyQkFBMkI7QUFDM0IsMkNBQTJDO0FBQzNDLElBQUk7QUFFSixvQkFBb0I7QUFDcEIsNEJBQTRCO0FBQzVCLDRCQUE0QjtBQUM1Qiw0QkFBNEI7QUFDNUIsNEJBQTRCO0FBQzVCLDRCQUE0QjtBQUM1Qiw0QkFBNEI7QUFDNUIsc0NBQXNDO0FBQ3RDLDJCQUEyQjtBQUMzQiw2QkFBNkI7QUFDN0IsNkJBQTZCO0FBQzdCLGdDQUFnQztBQUNoQyxJQUFJO0FBRUosMkJBQTJCO0FBQzNCLHlCQUF5QjtBQUN6Qiw4QkFBOEI7QUFDOUIsMkJBQTJCO0FBQzNCLDhCQUE4QjtBQUM5QixnREFBZ0Q7QUFDaEQsOEJBQThCO0FBQzlCLDRCQUE0QjtBQUM1QiwyQkFBMkI7QUFDM0IsZ0NBQWdDO0FBQ2hDLDBDQUEwQztBQUMxQywyQ0FBMkM7QUFDM0MsSUFBSTtBQUVKLHVCQUF1QjtBQUN2Qiw2REFBNkQ7QUFDN0QsbUNBQW1DO0FBQ25DLDJCQUEyQjtBQUMzQixtQ0FBbUM7QUFDbkMsZUFBZTtBQUNmLDJCQUEyQjtBQUMzQiw0Q0FBNEM7QUFDNUMsc0NBQXNDO0FBQ3RDLHNDQUFzQztBQUN0QyxtRUFBbUU7QUFDbkUscUVBQXFFO0FBQ3JFLHFDQUFxQztBQUNyQyx3Q0FBd0M7QUFDeEMscUNBQXFDO0FBQ3JDLDREQUE0RDtBQUM1RCw4Q0FBOEM7QUFFOUMsd0JBQXdCO0FBQ3hCLG1DQUFtQztBQUNuQywyQ0FBMkM7QUFDM0MsMkNBQTJDO0FBQzNDLDREQUE0RDtBQUM1RCx1QkFBdUI7QUFDdkIsaUJBQWlC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aEIsWUFBWTtBQUNaLCtCQUErQjtBQUMvQixnQ0FBZ0M7QUFDaEMsa0RBQWtEO0FBQ2xELDREQUE0RDtBQUM1RCx1RUFBdUU7QUFDdkUsb0JBQW9CO0FBQ3BCLGdCQUFnQjtBQUNoQiw4Q0FBOEM7QUFDOUMsOEVBQThFO0FBQzlFLHlFQUF5RTtBQUN6RSxZQUFZO0FBQ1osUUFBUTtBQUNSLElBQUkiLCJmaWxlIjoiIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpbXBvcnQgKiBhcyBYeXMgZnJvbSBcIi4vWHlzXCI7XG4vLyBpbXBvcnQgR2FtZWNmZyBmcm9tIFwiLi9nYW1lQ2ZnXCI7XG4vLyBpbXBvcnQgeyBTZWVkUmFuZCwgZ2FtZU1ldGhvZCB9IGZyb20gXCIuL2dhbWVNZXRob2RcIjtcblxuLy8gLy/ovoXliqnlh73mlbAgLSDmt7vliqDlsZ7mgKflgLxcbi8vIGludGVyZmFjZSBza2J1ZmZfYWRkX2NzIHtcbi8vICAgICBmaWlkOiBzdHJpbmc7IC8v5re75Yqg5a+56LGhXG4vLyAgICAga2V5OiBzdHJpbmc7IC8v5bGe5oCna2V5XG4vLyAgICAgbWluWmhlbjogbnVtYmVyOyAvL+W8gOWni+W4p1xuLy8gICAgIG1heFpoZW46IG51bWJlcjsgLy/nu5PmnZ/luKdcbi8vICAgICBvdmVybGF5VHlwZTogbnVtYmVyOyAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICBjZW5nOiBudW1iZXI7IC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9OyAvL+WxnuaAp1xuLy8gfVxuXG4vLyBpbnRlcmZhY2UgR3poaXQge1xuLy8gICAgIHBnaGl0OiBudW1iZXI7IC8v5pmu5pS75Lyk5a6zXG4vLyAgICAgc2toaXQ6IG51bWJlcjsgLy/mioDog73kvKTlrrNcbi8vICAgICBiamhpdDogbnVtYmVyOyAvL+aatOWHu+S8pOWus1xuLy8gICAgIGdkaGl0OiBudW1iZXI7IC8v5qC85oyh5Lyk5a6zXG4vLyAgICAgZmpoaXQ6IG51bWJlcjsgLy/lj43lh7vkvKTlrrNcbi8vICAgICBsamhpdDogbnVtYmVyOyAvL+i/nuWHu+S8pOWus1xuLy8gICAgIGpzaGl0OiBudW1iZXI7IC8v5rqF5bCE5Lyk5a6zKOayoeacieaKmOaNn+avlOS+i+ezu+aVsClcbi8vICAgICB4eGhpdDogbnVtYmVyOyAvL+WQuOihgOWAvFxuLy8gICAgIHh4UmF0ZTogbnVtYmVyOyAvL+WQuOihgOamgueOh1xuLy8gICAgIGpzUmF0ZTogbnVtYmVyOyAvL+a6heWwhOamgueOh1xuLy8gICAgIGZqc1JhdGU6IG51bWJlcjsgLy/lj43lh7vmuoXlsITmpoLnjodcbi8vIH1cblxuLy8gaW50ZXJmYWNlIHRpbWVyX2FkZF9jcyB7XG4vLyAgICAgaWlkOiBzdHJpbmc7IC8v6Kem5Y+R6ICFXG4vLyAgICAgZmlpZHM6IHN0cmluZ1tdOyAvL+inpuWPkeWvueixoVxuLy8gICAgIGtleTogc3RyaW5nOyAvL+WumuaXtuWZqOagh+ivhlxuLy8gICAgIHR5cGU6IG51bWJlcltdOyAvL+aJp+ihjOinpuWPkeeCuVxuLy8gICAgIGZ1bmM6IFwic2tfZWZmZWN0XCIgfCBcInNrX2FjdGlvblwiOyAvL+aJp+ihjOeahOWHveaVsOWQjVxuLy8gICAgIGx6aGVuOiBudW1iZXI7IC8v6L2u6K+i5omn6KGM5pe26Ze0XG4vLyAgICAgZXpoZW46IG51bWJlcjsgLy/nu5PmnZ/ml7bpl7Rcbi8vICAgICBza2lkOiBzdHJpbmc7IC8v5oqA6IO9SURcbi8vICAgICBhZWlkOiBzdHJpbmc7IC8v5pWI5p6cSUR86KGM5Li6SURcbi8vICAgICBjczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfTsgLy/lj4LmlbBcbi8vICAgICBvdmVybGF5VHlwZTogbnVtYmVyOyAvLyAx77ya5Y+g5YqgIDLvvJrkuI3lj6DliqDmm7/mjaJcbi8vIH1cblxuLy8gZXhwb3J0IGNsYXNzIEZpZ2h0IHtcbi8vICAgICB0ZWFtczogeyBbaWlkOiBzdHJpbmddOiBYeXMuRmlnaHRUZWFtIH0gPSB7fTsgLy/miJjmlpfmiJDlkZjliJfooahcbi8vICAgICBzZWVkUmFuZDogU2VlZFJhbmQ7IC8v6ZqP5py656eN5a2Q5Ye95pWwXG4vLyAgICAgZnJvbTogc3RyaW5nOyAvL+aImOaWl+exu+Wei1xuLy8gICAgIHRpbWVySWQ6IG51bWJlciA9IDE7IC8v5a6a5pe26K6h5pWw5ZmoXG4vLyAgICAgdXVpZHM6IHtcbi8vICAgICAgICAgW2lpZDogc3RyaW5nXToge1xuLy8gICAgICAgICAgICAgZHJhaW5fc2s6IG51bWJlcjsgLy8g5piv5ZCm5bim5pyJ54G15Yqb5pyv5rOVXG4vLyAgICAgICAgICAgICBsYXN0OiBudW1iZXI7IC8v5pyA5ZCO5LiA5qyh5Ye65omL5binXG4vLyAgICAgICAgICAgICBsYXN0MjogbnVtYmVyOyAvL+ecn+ato+WHuuaJi+eahOW4p1xuLy8gICAgICAgICAgICAgY29uczogbnVtYmVyW107IC8v5pS75Ye75qyh5pWwIO+8iOaZrumAmivmioDog73vvIzooqvliqjkuI3nrpfvvIkgW+aUu+WHu+asoeaVsO+8jOi/nuWHu+asoeaVsO+8jOWPjeWHu+asoeaVsF1cbi8vICAgICAgICAgICAgIGZjb25zOiBudW1iZXJbXTsgLy/ooqvmlLvlh7vmrKHmlbAg77yI5pmu6YCaK+aKgOiDve+8jOiiq+WKqOS4jeeul++8iSBb5pS75Ye75qyh5pWw77yM6L+e5Ye75qyh5pWw77yM5Y+N5Ye75qyh5pWwXVxuLy8gICAgICAgICAgICAgZHpoZW46IG51bWJlcjsgLy/mrbvkuqHnmoTluKfmlbBcbi8vICAgICAgICAgICAgIGZwazogc3RyaW5nOyAvL+acgOWQjuS4gOasoeS8pOWus+aIkeeahOWvueixoVxuLy8gICAgICAgICAgICAgaXBrOiBzdHJpbmc7IC8v5oiR5omT55qE5pyA5ZCO5LiA5LiqXG4vLyAgICAgICAgICAgICBpcGtzOiB7IFt6aGVuOiBudW1iZXJdOiBzdHJpbmdbXSB9OyAvL+aIkeaJk+eahOacgOWQjuS4gOS4qlxuLy8gICAgICAgICAgICAgcG9kdW46IHN0cmluZ1tdOyAvL+ebvuayoeacieS6humcgOimgea4hemZpGJ1ZmZcblxuLy8gICAgICAgICAgICAgc2tidWZmOiB7XG4vLyAgICAgICAgICAgICAgICAgW2tleTogc3RyaW5nXToge1xuLy8gICAgICAgICAgICAgICAgICAgICBzemhlbjogbnVtYmVyOyAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICBlemhlbjogbnVtYmVyOyAvL+e7k+adn+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICBlcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH07IC8v5bGe5oCn5YC8XG4vLyAgICAgICAgICAgICAgICAgfVtdO1xuLy8gICAgICAgICAgICAgfTtcblxuLy8gICAgICAgICAgICAgc2tiYXNlOiB7XG4vLyAgICAgICAgICAgICAgICAgLy/mioDog73op6blj5Fcbi8vICAgICAgICAgICAgICAgICBbYmFzZV9pZDogc3RyaW5nXToge1xuLy8gICAgICAgICAgICAgICAgICAgICBsYXN0OiBudW1iZXI7IC8v5oqA6IO95pyA5ZCO5LiA5qyh5Ye65omL5binXG4vLyAgICAgICAgICAgICAgICAgICAgIGNvdW50OiBudW1iZXI7XG4vLyAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjoge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbl9pZDogc3RyaW5nXToge307XG4vLyAgICAgICAgICAgICAgICAgICAgIH07XG4vLyAgICAgICAgICAgICAgICAgICAgIGVmZmVjdDoge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgW2VmZmVjdF9pZDogc3RyaW5nXToge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdFpoZW46IG51bWJlcjsgLy/op6blj5HmlYjmnpznmoTluKfvvIjmnInml7blgJnlkIzml7bkuIDkuKrmlLvlh7sg5aW95Yeg5Liq5Lq66Kem5Y+R5pWI5p6c5YiG5byA6K6h566X55qEIOS8muWvvOiHtOesrOS4gOS4quS6uuacieinpuWPkSDlkI7pnaLnmoTmsqHmnInop6blj5HvvIlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RFbmRaaGVuOiBudW1iZXI7IC8v5pWI5p6c57uT5p2f5bin546H77yI5oyB57uteOenku+8jOWGt+WNtHjnp5LnlKjnmoTvvIlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0Y2Q6IG51bWJlcjsgLy/kuIvkuIDmrKHlhrfljbTlrozmiJDml7bpl7Rcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDogbnVtYmVyOyAvL+aJp+ihjOasoeaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGY6IG51bWJlcjsgLy/miafooYzmrKHmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4vLyAgICAgICAgICAgICAgICAgICAgIH07XG4vLyAgICAgICAgICAgICAgICAgfTtcbi8vICAgICAgICAgICAgIH07XG5cbi8vICAgICAgICAgICAgIC8v5a6a5pe25omn6KGMIFvmiafooYzop6blj5Hngrks5omn6KGM55qE5Ye95pWw5ZCNLOi9ruivouaJp+ihjOaXtumXtCzmioDog71JRCwg5pWI5p6cSUR86KGM5Li6SURdXG4vLyAgICAgICAgICAgICB0aW1lcjoge1xuLy8gICAgICAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IHtcbi8vICAgICAgICAgICAgICAgICAgICAgW3RpbWVySWQ6IHN0cmluZ106IHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWRzOiBzdHJpbmdbXTsgLy/op6blj5Hlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IG51bWJlcltdOyAvL+aJp+ihjOinpuWPkeeCuVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZnVuYzogXCJza19lZmZlY3RcIiB8IFwic2tfYWN0aW9uXCI7IC8v5omn6KGM55qE5Ye95pWw5ZCNXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBzemhlbjogbnVtYmVyOyAvL+inpuWPkeeahOW4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbHpoZW46IG51bWJlcjsgLy/ova7or6LmiafooYzml7bpl7Rcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGV6aGVuOiBudW1iZXI7IC8v57uT5p2f5pe26Ze05binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBza2lkOiBzdHJpbmc7IC8v5oqA6IO9SURcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGFlaWQ6IHN0cmluZzsgLy/mlYjmnpxJRHzooYzkuLpJRFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY3M6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH07IC8vXG4vLyAgICAgICAgICAgICAgICAgICAgIH07XG4vLyAgICAgICAgICAgICAgICAgfTtcbi8vICAgICAgICAgICAgIH07XG4vLyAgICAgICAgICAgICAvL+aJp+ihjOinpuWPkeeCuT0+XG4vLyAgICAgICAgICAgICAvLzE65q+P5bin5byA5aeL5omn6KGMIDLvvJrmiaPooYDmiafooYwgMzrmlLvlh7vlkI7op6blj5EgNOaUu+WHu+WJjeinpuWPkSA15oqk5L2T572h5rCU56C056KO5pe26Kem5Y+RXG4vLyAgICAgICAgICAgICAvLzYgOuW3seaWueWNleS9jeaWveWKoOWHu+mAgOaXtiA3IDrmma7pgJrmlLvlh7vop6blj5EgOOiHqui6q+WPl+WIsOi2hei/h+W9k+WJjeawlOihgDEwJeS7peS4iuS8pOWus+aXtlxuLy8gICAgICAgICAgICAgLy85OuaatOWHu+inpuWPkVxuLy8gICAgICAgICB9O1xuLy8gICAgIH0gPSB7fTsgLy/lrZjmlL7ouqvku71cbi8vICAgICBvYmplY3RzOiB7XG4vLyAgICAgICAgIFtsZW46IHN0cmluZ106IHtcbi8vICAgICAgICAgICAgIFt0eXBlOiBzdHJpbmddOiB7XG4vLyAgICAgICAgICAgICAgICAgLy8g5L2c55So5a+56LGhIDHkuLvop5IgMuW8n+WtkCAz5YW954G1XG4vLyAgICAgICAgICAgICAgICAgW3NraWQ6IHN0cmluZ106IHtcbi8vICAgICAgICAgICAgICAgICAgICAgLy/mioDog73op6blj5Fcbi8vICAgICAgICAgICAgICAgICAgICAgY2Q6IG51bWJlcjsgLy8g5oqA6IO96Kem5Y+RY2Rcbi8vICAgICAgICAgICAgICAgICAgICAgc2tsdjogbnVtYmVyOyAvLyDmioDog73nrYnnuqdcbi8vICAgICAgICAgICAgICAgICAgICAgaWlkczoge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgW2lpZDogc3RyaW5nXToge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IG51bWJlcjsgLy/mioDog73mnIDlkI7kuIDmrKHlh7rmiYvluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4vLyAgICAgICAgICAgICAgICAgICAgIH07XG4vLyAgICAgICAgICAgICAgICAgfTtcbi8vICAgICAgICAgICAgIH07XG4vLyAgICAgICAgIH07XG4vLyAgICAgfSA9IHt9OyAvL+WtmOaUvnVpZOexu+Wei+inpuWPkeaKgOiDvVxuLy8gICAgIHpoZW46IG51bWJlciA9IDA7IC8v5Yid5aeL5binXG5cbi8vICAgICAvL+WNleasoeWHuuaJi+S4tOaXtuiusOW9lVxuLy8gICAgIG9uZUF0azoge1xuLy8gICAgICAgICBbaWlkOiBzdHJpbmddOiB7XG4vLyAgICAgICAgICAgICBbZmlpZDogc3RyaW5nXToge1xuLy8gICAgICAgICAgICAgICAgIGFUeXBlOiBYeXMuQWN0aW9uVHlwZTsgLy/miJjmlpfliqjkvZznsbvlnotcbi8vICAgICAgICAgICAgICAgICBhU2tpZDogXCJcIjsgLy/kvb/nlKjnmoTmioDog71JRFxuLy8gICAgICAgICAgICAgICAgIGVmZmVjdDogW3N0cmluZywgbnVtYmVyXVtdOyAvL+inpuWPkeaViOaenCBbIFvlsZ7mgKdrZXks5bGC5pWwXV1cbi8vICAgICAgICAgICAgICAgICBidWZmOiBbc3RyaW5nLCBudW1iZXJdW107IC8v6Kem5Y+R5pWI5p6cIFsgW+WxnuaAp2tleSzmlbDlgLxdXVxuLy8gICAgICAgICAgICAgfTtcbi8vICAgICAgICAgfTtcbi8vICAgICB9ID0ge307XG4vLyAgICAgb25lQXRraWlkczogc3RyaW5nW10gPSBbXTsgLy/ml6Xlv5fpobrluo9cblxuLy8gICAgIC8v5Y2V5bin5Ye65omL5a+56LGhXG4vLyAgICAgb25lRmlpZHM6IHsgW2lpZDogc3RyaW5nXTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9IH0gPSB7fTtcbi8vICAgICBvbmVIaXQ6IHtcbi8vICAgICAgICAgW2lpZDogc3RyaW5nXToge1xuLy8gICAgICAgICAgICAgW2ZpaWQ6IHN0cmluZ106IEd6aGl0O1xuLy8gICAgICAgICB9O1xuLy8gICAgIH0gPSB7fTtcbi8vICAgICBvbmVCdWZmOiB7IFtpaWQ6IHN0cmluZ106IG51bWJlciB9ID0ge307IC8v5a2Y5YKo5b2T5YmN5binIOacieaUueWPmGJ1ZmbnmoTop5LoibJJRFxuLy8gICAgIG1wZmlpZHM6IHsgW2lpZDogc3RyaW5nXTogW251bWJlciwgbnVtYmVyXSB9ID0ge307IC8vIOWNleW4p01Q5oyH5Zue5aSN5LiA5qyhXG4vLyAgICAganNGaWlkczogeyBbaWlkOiBzdHJpbmddOiB7IFtmaWlkOiBzdHJpbmddOiBudW1iZXIgfSB9ID0ge307IC8v5rqF5bCEXG5cbi8vICAgICAvL+WtmOWCqOaJgOacieaImOWcuuaXpeW/l1xuLy8gICAgIG91dGY6IFh5cy5PdmVyQmFjayA9IHtcbi8vICAgICAgICAgd2luOiAwLCAvLzDlpLHotKUgMeiDnOWIqVxuLy8gICAgICAgICBzdGFydDoge1xuLy8gICAgICAgICAgICAgLy/liJ3lp4vpmLXlrrlcbi8vICAgICAgICAgICAgIGZyb206IFwiXCIsIC8v5oiY5paX57G75Z6LXG4vLyAgICAgICAgICAgICBzZWVkOiAwLCAvL+maj+acuuenjeWtkFxuLy8gICAgICAgICAgICAgdGVhbXM6IHt9LFxuLy8gICAgICAgICAgICAgcG93ZXI6IDAsXG4vLyAgICAgICAgICAgICBmUG93ZXI6IDAsXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICAgIGxvZzoge30sIC8v5oiY5paX5pel5b+X5YiX6KGoXG4vLyAgICAgICAgIGh1cnQ6IDAsXG4vLyAgICAgICAgIGhwOiAwLCAvL+aImOaWl+e7k+adnyDlr7nmiYvliankvZnooYDph49cbi8vICAgICAgICAgdG9uZ2ppOiB7fSxcbi8vICAgICAgICAgeGhpZDpcIlwiXG4vLyAgICAgfTtcblxuLy8gICAgIC8v6KGA6YeP5Y+Y5YyW55u45YWz5a2X5q61XG4vLyAgICAgeHVla3U6IHN0cmluZ1tdID0gW1wiaHBcIiwgXCJiYW9qaVwiLCBcImxpYW5qaVwiLCBcImZhbmppXCIsIFwiY2FuYmVhdGJhY2tcIl07XG4vLyAgICAgLy8g5YeP55uKYnVmZlxuLy8gICAgIGJhdGVCdWZmOiBzdHJpbmdbXSA9IFtcImVmZmVjdF9pXzFcIiwgXCJlZmZlY3RfaV8zXCIsIFwiZWZmZWN0X2lfNFwiLCBcImVmZmVjdF9pXzVcIiwgXCJlZmZlY3RfaV82XCIsIFwiZWZmZWN0X2lfN1wiXTtcbi8vICAgICB0ZWFtRmlpZHM6IHN0cmluZ1tdID0gW107XG5cbi8vICAgICBza0J1ZmY6IHtcbi8vICAgICAgICAgW2lpZDogc3RyaW5nXToge1xuLy8gICAgICAgICAgICAga2V5OiBhbnk7XG4vLyAgICAgICAgICAgICB2YWx1ZTogYW55O1xuLy8gICAgICAgICAgICAgYnVmZjoge1xuLy8gICAgICAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IHtcbi8vICAgICAgICAgICAgICAgICAgICAga2V5OiBhbnk7XG4vLyAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBhbnk7XG4vLyAgICAgICAgICAgICAgICAgfTtcbi8vICAgICAgICAgICAgIH07XG4vLyAgICAgICAgIH07XG4vLyAgICAgfSA9IHt9O1xuLy8gICAgIHNrVGltZXI6IHtcbi8vICAgICAgICAgW2lpZDogc3RyaW5nXToge1xuLy8gICAgICAgICAgICAga2V5OiBhbnk7XG4vLyAgICAgICAgICAgICB2YWx1ZTogYW55O1xuLy8gICAgICAgICAgICAgdGltZXI6IHtcbi8vICAgICAgICAgICAgICAgICBba2V5OiBzdHJpbmddOiB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGtleTogYW55O1xuLy8gICAgICAgICAgICAgICAgICAgICB2YWx1ZTogYW55O1xuLy8gICAgICAgICAgICAgICAgIH07XG4vLyAgICAgICAgICAgICB9O1xuLy8gICAgICAgICB9O1xuLy8gICAgIH0gPSB7fTtcbi8vICAgICBkYW1hZ2U6IHtcbi8vICAgICAgICAgW2lpZDogc3RyaW5nXToge1xuLy8gICAgICAgICAgICAgW2ZpaWQ6IHN0cmluZ106IG51bWJlcjtcbi8vICAgICAgICAgfTtcbi8vICAgICB9ID0ge307XG5cbi8vICAgICBjb25zdHJ1Y3RvcihmaWdodFN0YXJ0OiBYeXMuQWN0RmlnaHRTdGFydCkge1xuLy8gICAgICAgICB0aGlzLnBvd2VyRGlzcGFyaXR5KFwiMTAwMFwiLCBcIjEwMFwiLCBmaWdodFN0YXJ0LnBvd2VyLCBmaWdodFN0YXJ0LmZQb3dlcik7XG4vLyAgICAgICAgIHRoaXMub3V0Zi5zdGFydCA9IGdhbWVNZXRob2Qub2JqQ29weShmaWdodFN0YXJ0KTtcbi8vICAgICAgICAgdGhpcy50ZWFtcyA9IGdhbWVNZXRob2Qub2JqQ29weShmaWdodFN0YXJ0LnRlYW1zKTsgLy/miJjmlpfmiJDlkZjliJfooahcbi8vICAgICAgICAgdGhpcy5zZWVkUmFuZCA9IG5ldyBTZWVkUmFuZChmaWdodFN0YXJ0LnNlZWQpOyAvL+maj+acuuenjeWtkFxuLy8gICAgICAgICB0aGlzLmZyb20gPSBmaWdodFN0YXJ0LmZyb207IC8v5oiY5paX57G75Z6LXG4vLyAgICAgICAgIHRoaXMudGVhbUZpaWRzID0gT2JqZWN0LmtleXModGhpcy50ZWFtcyk7XG4vLyAgICAgICAgIHRoaXMud2FyX2luaXQoKTtcbi8vICAgICAgICAgdGhpcy53YXJfbG9vcCgpO1xuLy8gICAgIH1cbi8vICAgICAvKlxuLy8gICAgICAqIOaKgOiDvWJ1ZmZcbi8vICAgICAgKiB0aGlzLnV1aWRzW2NzLmZpaWRdLnNrYnVmZltjcy5rZXldXG4vLyAgICAgICogKi9cbi8vICAgICBwcml2YXRlIGNoYW5nZVNrQnVmZihzVHlwZTogbnVtYmVyLCBpaWQ/OiBzdHJpbmcgfCBudWxsLCBrZXk/OiBzdHJpbmcgfCBudWxsLCB0eXBlOiBudW1iZXIgPSAxLCBkYXRhPzogYW55KSB7XG4vLyAgICAgICAgIHN3aXRjaCAoc1R5cGUpIHtcbi8vICAgICAgICAgICAgIGNhc2UgMTogLy8g5p+l6K+iIHR5cGXvvJoxLmtleXMgMi52YWx1ZXNcbi8vICAgICAgICAgICAgICAgICBpZiAoaWlkKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFNrQnVmZih0eXBlLCBpaWQsIGtleSk7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgY2FzZSAyOiAvLyDmm7TmlrAv5paw5aKeIHR5cGXvvJoxLuabv+aNoiAyLuWPoOWKoFxuLy8gICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U2tCdWZmKGRhdGEsIGlpZCwga2V5LCB0eXBlKTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICBjYXNlIDM6IC8vIOWIoOmZpFxuLy8gICAgICAgICAgICAgICAgIGlmIChpaWQpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxTa0J1ZmYoaWlkLCBrZXkpO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgfVxuLy8gICAgIH1cbi8vICAgICBwcml2YXRlIHNldFNrQnVmZihkYXRhOiBhbnksIGlpZD86IHN0cmluZyB8IG51bGwsIGtleT86IHN0cmluZyB8IG51bGwsIHR5cGU6IG51bWJlciA9IDEpIHtcbi8vICAgICAgICAgaWYgKGlpZCAmJiBrZXkpIHtcbi8vICAgICAgICAgICAgIGlmICh0eXBlID09IDEpIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0uc2tidWZmW2tleV0gPSBkYXRhO1xuLy8gICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICBpZiAodGhpcy51dWlkc1tpaWRdLnNrYnVmZltrZXldID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLnNrYnVmZltrZXldID0gW107XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2J1ZmZba2V5XS5wdXNoKC4uLmRhdGEpO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgaWYgKHRoaXMuc2tCdWZmW2lpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIHRoaXMuc2tCdWZmW2lpZF0gPSB7IGtleTogW10sIHZhbHVlOiBbXSwgYnVmZjoge30gfTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGlmICh0aGlzLnNrQnVmZltpaWRdLmJ1ZmZba2V5XSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy5za0J1ZmZbaWlkXS5idWZmW2tleV0gPSB7IGtleTogW10sIHZhbHVlOiBbXSB9O1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgbGV0IGtleXMyID0gT2JqZWN0LmtleXModGhpcy51dWlkc1tpaWRdLnNrYnVmZik7XG4vLyAgICAgICAgICAgICBsZXQgdmFsdWVzMiA9IE9iamVjdC52YWx1ZXModGhpcy51dWlkc1tpaWRdLnNrYnVmZik7XG4vLyAgICAgICAgICAgICB0aGlzLnNrQnVmZltpaWRdLmtleSA9IGtleXMyO1xuLy8gICAgICAgICAgICAgdGhpcy5za0J1ZmZbaWlkXS52YWx1ZSA9IHZhbHVlczI7XG4vLyAgICAgICAgICAgICB0aGlzLnNrQnVmZltpaWRdLmJ1ZmZba2V5XS5rZXkgPSBPYmplY3Qua2V5cyh0aGlzLnV1aWRzW2lpZF0uc2tidWZmW2tleV0pO1xuLy8gICAgICAgICAgICAgdGhpcy5za0J1ZmZbaWlkXS5idWZmW2tleV0udmFsdWUgPSBPYmplY3QudmFsdWVzKHRoaXMudXVpZHNbaWlkXS5za2J1ZmZba2V5XSk7XG4vLyAgICAgICAgIH0gZWxzZSBpZiAoaWlkICYmICFrZXkpIHtcbi8vICAgICAgICAgICAgIGlmICh0eXBlID09IDEpIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0uc2tidWZmID0gZGF0YTtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnNrQnVmZltpaWRdID0geyBrZXk6IFtdLCB2YWx1ZTogW10sIGJ1ZmY6IHt9IH07XG4vLyAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2J1ZmYgPSBPYmplY3QuYXNzaWduKHRoaXMudXVpZHNbaWlkXS5za2J1ZmYsIGRhdGEpO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgaWYgKHRoaXMuc2tCdWZmW2lpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIHRoaXMuc2tCdWZmW2lpZF0gPSB7IGtleTogW10sIHZhbHVlOiBbXSwgYnVmZjoge30gfTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGxldCBrZXlzMiA9IE9iamVjdC5rZXlzKHRoaXMudXVpZHNbaWlkXS5za2J1ZmYpO1xuLy8gICAgICAgICAgICAgbGV0IHZhbHVlczIgPSBPYmplY3QudmFsdWVzKHRoaXMudXVpZHNbaWlkXS5za2J1ZmYpO1xuLy8gICAgICAgICAgICAgdGhpcy5za0J1ZmZbaWlkXS5rZXkgPSBrZXlzMjtcbi8vICAgICAgICAgICAgIHRoaXMuc2tCdWZmW2lpZF0udmFsdWUgPSB2YWx1ZXMyO1xuLy8gICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBrZXlzMi5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLnNrQnVmZltpaWRdLmJ1ZmZba2V5czJba11dID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za0J1ZmZbaWlkXS5idWZmW2tleXMyW2tdXSA9IHsga2V5OiBbXSwgdmFsdWU6IFtdIH07XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIHRoaXMuc2tCdWZmW2lpZF0uYnVmZltrZXlzMltrXV0ua2V5ID0gT2JqZWN0LmtleXModGhpcy51dWlkc1tpaWRdLnNrYnVmZltrZXlzMltrXV0pO1xuLy8gICAgICAgICAgICAgICAgIHRoaXMuc2tCdWZmW2lpZF0uYnVmZltrZXlzMltrXV0udmFsdWUgPSBPYmplY3QudmFsdWVzKHRoaXMudXVpZHNbaWlkXS5za2J1ZmZba2V5czJba11dKTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfSBlbHNlIGlmICghaWlkICYmICFrZXkgJiYgZGF0YSkge1xuLy8gICAgICAgICAgICAgbGV0IGtleXMgPSB0aGlzLnRlYW1GaWlkcztcbi8vICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuLy8gICAgICAgICAgICAgICAgIGxldCBrZXlzMiA9IE9iamVjdC5rZXlzKHRoaXMudXVpZHNba2V5c1tpXV0uc2tidWZmKTtcbi8vICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzMiA9IE9iamVjdC52YWx1ZXModGhpcy51dWlkc1trZXlzW2ldXS5za2J1ZmYpO1xuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLnNrQnVmZltrZXlzW2ldXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tCdWZmW2tleXNbaV1dID0geyBrZXk6IFtdLCB2YWx1ZTogW10sIGJ1ZmY6IHt9IH07XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIHRoaXMuc2tCdWZmW2tleXNbaV1dLmtleSA9IGtleXMyO1xuLy8gICAgICAgICAgICAgICAgIHRoaXMuc2tCdWZmW2tleXNbaV1dLnZhbHVlID0gdmFsdWVzMjtcbi8vICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGtleXMyLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNrQnVmZltrZXlzW2ldXS5idWZmW2tleXMyW2tdXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrQnVmZltrZXlzW2ldXS5idWZmW2tleXMyW2tdXSA9IHsga2V5OiBbXSwgdmFsdWU6IFtdIH07XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za0J1ZmZba2V5c1tpXV0uYnVmZltrZXlzMltrXV0ua2V5ID0gT2JqZWN0LmtleXModGhpcy51dWlkc1trZXlzW2ldXS5za2J1ZmZba2V5czJba11dKTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za0J1ZmZba2V5c1tpXV0uYnVmZltrZXlzMltrXV0udmFsdWUgPSBPYmplY3QudmFsdWVzKHRoaXMudXVpZHNba2V5c1tpXV0uc2tidWZmW2tleXMyW2tdXSk7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG4vLyAgICAgfVxuLy8gICAgIHByaXZhdGUgZGVsU2tCdWZmKGlpZDogc3RyaW5nLCBrZXk/OiBzdHJpbmcgfCBudWxsKSB7XG4vLyAgICAgICAgIGlmIChpaWQgJiYga2V5KSB7XG4vLyAgICAgICAgICAgICBkZWxldGUgdGhpcy51dWlkc1tpaWRdLnNrYnVmZltrZXldO1xuLy8gICAgICAgICAgICAgaWYgKHRoaXMuc2tCdWZmW2lpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIHRoaXMuc2tCdWZmW2lpZF0gPSB7IGtleTogW10sIHZhbHVlOiBbXSwgYnVmZjoge30gfTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNrQnVmZltpaWRdLmJ1ZmZba2V5XTtcbi8vICAgICAgICAgICAgIHRoaXMuc2tCdWZmW2lpZF0ua2V5ID0gT2JqZWN0LmtleXModGhpcy51dWlkc1tpaWRdLnNrYnVmZik7XG4vLyAgICAgICAgICAgICB0aGlzLnNrQnVmZltpaWRdLnZhbHVlID0gT2JqZWN0LnZhbHVlcyh0aGlzLnV1aWRzW2lpZF0uc2tidWZmKTtcbi8vICAgICAgICAgfSBlbHNlIGlmIChpaWQgJiYgIWtleSkge1xuLy8gICAgICAgICAgICAgaWYgKHRoaXMuc2tCdWZmW2lpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIHRoaXMuc2tCdWZmW2lpZF0gPSB7IGtleTogW10sIHZhbHVlOiBbXSwgYnVmZjoge30gfTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2J1ZmYgPSB7fTtcbi8vICAgICAgICAgICAgIHRoaXMuc2tCdWZmW2lpZF0uYnVmZiA9IHt9O1xuLy8gICAgICAgICAgICAgdGhpcy5za0J1ZmZbaWlkXS5rZXkgPSBbXTtcbi8vICAgICAgICAgICAgIHRoaXMuc2tCdWZmW2lpZF0udmFsdWUgPSBbXTtcbi8vICAgICAgICAgfVxuLy8gICAgIH1cbi8vICAgICBwcml2YXRlIGdldFNrQnVmZih0eXBlOiBudW1iZXIsIGlpZDogc3RyaW5nLCBrZXk/OiBzdHJpbmcgfCBudWxsKSB7XG4vLyAgICAgICAgIGlmICh0eXBlID09IDEpIHtcbi8vICAgICAgICAgICAgIGlmIChpaWQgJiYga2V5KSB7XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2tCdWZmW2lpZF0gJiYgdGhpcy5za0J1ZmZbaWlkXS5idWZmW2tleV0pIHtcbi8vICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2tCdWZmW2lpZF0uYnVmZltrZXldLmtleTtcbi8vICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfSBlbHNlIGlmIChpaWQpIHtcbi8vICAgICAgICAgICAgICAgICBpZiAodGhpcy5za0J1ZmZbaWlkXSkge1xuLy8gICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5za0J1ZmZbaWlkXS5rZXk7XG4vLyAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgIGlmIChpaWQgJiYga2V5KSB7XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2tCdWZmW2lpZF0gJiYgdGhpcy5za0J1ZmZbaWlkXS5idWZmW2tleV0pIHtcbi8vICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2tCdWZmW2lpZF0uYnVmZltrZXldLnZhbHVlO1xuLy8gICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9IGVsc2UgaWYgKGlpZCkge1xuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLnNrQnVmZltpaWRdKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNrQnVmZltpaWRdLnZhbHVlO1xuLy8gICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICB9XG4vLyAgICAgLypcbi8vICAgICAgKiDlrprml7blmah0aW1lclxuLy8gICAgICAqIHRoaXMudXVpZHNbaWlkXS50aW1lcltrZXldXG4vLyAgICAgICogKi9cbi8vICAgICBwcml2YXRlIGNoYW5nZVRpbWVyKHNUeXBlOiBudW1iZXIsIGlpZD86IHN0cmluZyB8IG51bGwsIGtleT86IHN0cmluZyB8IG51bGwsIHR5cGU6IG51bWJlciA9IDEsIGRhdGE/OiBhbnkpIHtcbi8vICAgICAgICAgc3dpdGNoIChzVHlwZSkge1xuLy8gICAgICAgICAgICAgY2FzZSAxOiAvLyDmn6Xor6IgdHlwZe+8mjEua2V5cyAyLnZhbHVlc1xuLy8gICAgICAgICAgICAgICAgIGlmIChpaWQpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGltZXIodHlwZSwgaWlkLCBrZXkpO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgIGNhc2UgMjogLy8g5pu05pawL+aWsOWiniB0eXBl77yaMS7mm7/mjaIgMi7lj6DliqBcbi8vICAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRpbWVyKGRhdGEsIGlpZCwga2V5LCB0eXBlKTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICBjYXNlIDM6IC8vIOWIoOmZpFxuLy8gICAgICAgICAgICAgICAgIGlmIChpaWQpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxUaW1lcihpaWQsIGtleSk7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICB9XG4vLyAgICAgfVxuLy8gICAgIHByaXZhdGUgc2V0VGltZXIoZGF0YTogYW55LCBpaWQ/OiBzdHJpbmcgfCBudWxsLCBrZXk/OiBzdHJpbmcgfCBudWxsLCB0eXBlOiBudW1iZXIgPSAxKSB7XG4vLyAgICAgICAgIGlmIChpaWQgJiYga2V5KSB7XG4vLyAgICAgICAgICAgICBpZiAodHlwZSA9PSAxKSB7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLnRpbWVyW2tleV0gPSBkYXRhO1xuLy8gICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICBpZiAodGhpcy51dWlkc1tpaWRdLnRpbWVyW2tleV0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0udGltZXJba2V5XSA9IHt9O1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0udGltZXJba2V5XSA9IE9iamVjdC5hc3NpZ24odGhpcy51dWlkc1tpaWRdLnRpbWVyW2tleV0sIGRhdGEpO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgaWYgKHRoaXMuc2tUaW1lcltpaWRdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnNrVGltZXJbaWlkXSA9IHsga2V5OiBbXSwgdmFsdWU6IFtdLCB0aW1lcjoge30gfTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGlmICh0aGlzLnNrVGltZXJbaWlkXS50aW1lcltrZXldID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnNrVGltZXJbaWlkXS50aW1lcltrZXldID0geyBrZXk6IFtdLCB2YWx1ZTogW10gfTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGxldCBrZXlzMiA9IE9iamVjdC5rZXlzKHRoaXMudXVpZHNbaWlkXS50aW1lcik7XG4vLyAgICAgICAgICAgICBsZXQgdmFsdWVzMiA9IE9iamVjdC52YWx1ZXModGhpcy51dWlkc1tpaWRdLnRpbWVyKTtcbi8vICAgICAgICAgICAgIHRoaXMuc2tUaW1lcltpaWRdLmtleSA9IGtleXMyO1xuLy8gICAgICAgICAgICAgdGhpcy5za1RpbWVyW2lpZF0udmFsdWUgPSB2YWx1ZXMyO1xuLy8gICAgICAgICAgICAgdGhpcy5za1RpbWVyW2lpZF0udGltZXJba2V5XS5rZXkgPSBPYmplY3Qua2V5cyh0aGlzLnV1aWRzW2lpZF0udGltZXJba2V5XSk7XG4vLyAgICAgICAgICAgICB0aGlzLnNrVGltZXJbaWlkXS50aW1lcltrZXldLnZhbHVlID0gT2JqZWN0LnZhbHVlcyh0aGlzLnV1aWRzW2lpZF0udGltZXJba2V5XSk7XG4vLyAgICAgICAgIH0gZWxzZSBpZiAoaWlkICYmICFrZXkpIHtcbi8vICAgICAgICAgICAgIGlmICh0eXBlID09IDEpIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0udGltZXIgPSBkYXRhO1xuLy8gICAgICAgICAgICAgICAgIHRoaXMuc2tUaW1lcltpaWRdID0geyBrZXk6IFtdLCB2YWx1ZTogW10sIHRpbWVyOiB7fSB9O1xuLy8gICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0udGltZXIgPSBPYmplY3QuYXNzaWduKHRoaXMudXVpZHNbaWlkXS50aW1lciwgZGF0YSk7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBpZiAodGhpcy5za1RpbWVyW2lpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIHRoaXMuc2tUaW1lcltpaWRdID0geyBrZXk6IFtdLCB2YWx1ZTogW10sIHRpbWVyOiB7fSB9O1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgbGV0IGtleXMyID0gT2JqZWN0LmtleXModGhpcy51dWlkc1tpaWRdLnRpbWVyKTtcbi8vICAgICAgICAgICAgIGxldCB2YWx1ZXMyID0gT2JqZWN0LnZhbHVlcyh0aGlzLnV1aWRzW2lpZF0udGltZXIpO1xuLy8gICAgICAgICAgICAgdGhpcy5za1RpbWVyW2lpZF0ua2V5ID0ga2V5czI7XG4vLyAgICAgICAgICAgICB0aGlzLnNrVGltZXJbaWlkXS52YWx1ZSA9IHZhbHVlczI7XG4vLyAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGtleXMyLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2tUaW1lcltpaWRdLnRpbWVyW2tleXMyW2tdXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tUaW1lcltpaWRdLnRpbWVyW2tleXMyW2tdXSA9IHsga2V5OiBbXSwgdmFsdWU6IFtdIH07XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIHRoaXMuc2tUaW1lcltpaWRdLnRpbWVyW2tleXMyW2tdXS5rZXkgPSBPYmplY3Qua2V5cyh0aGlzLnV1aWRzW2lpZF0udGltZXJba2V5czJba11dKTtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnNrVGltZXJbaWlkXS50aW1lcltrZXlzMltrXV0udmFsdWUgPSBPYmplY3QudmFsdWVzKHRoaXMudXVpZHNbaWlkXS50aW1lcltrZXlzMltrXV0pO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9IGVsc2UgaWYgKCFpaWQgJiYgIWtleSAmJiBkYXRhKSB7XG4vLyAgICAgICAgICAgICBsZXQga2V5cyA9IHRoaXMudGVhbUZpaWRzO1xuLy8gICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4vLyAgICAgICAgICAgICAgICAgbGV0IGtleXMyID0gT2JqZWN0LmtleXModGhpcy51dWlkc1trZXlzW2ldXS50aW1lcik7XG4vLyAgICAgICAgICAgICAgICAgbGV0IHZhbHVlczIgPSBPYmplY3QudmFsdWVzKHRoaXMudXVpZHNba2V5c1tpXV0udGltZXIpO1xuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLnNrVGltZXJba2V5c1tpXV0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrVGltZXJba2V5c1tpXV0gPSB7IGtleTogW10sIHZhbHVlOiBbXSwgdGltZXI6IHt9IH07XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIHRoaXMuc2tUaW1lcltrZXlzW2ldXS5rZXkgPSBrZXlzMjtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnNrVGltZXJba2V5c1tpXV0udmFsdWUgPSB2YWx1ZXMyO1xuLy8gICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwga2V5czIubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2tUaW1lcltrZXlzW2ldXS50aW1lcltrZXlzMltrXV0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za1RpbWVyW2tleXNbaV1dLnRpbWVyW2tleXMyW2tdXSA9IHsga2V5OiBbXSwgdmFsdWU6IFtdIH07XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za1RpbWVyW2tleXNbaV1dLnRpbWVyW2tleXMyW2tdXS5rZXkgPSBPYmplY3Qua2V5cyh0aGlzLnV1aWRzW2tleXNbaV1dLnRpbWVyW2tleXMyW2tdXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tUaW1lcltrZXlzW2ldXS50aW1lcltrZXlzMltrXV0udmFsdWUgPSBPYmplY3QudmFsdWVzKHRoaXMudXVpZHNba2V5c1tpXV0udGltZXJba2V5czJba11dKTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICB9XG4vLyAgICAgcHJpdmF0ZSBkZWxUaW1lcihpaWQ6IHN0cmluZywga2V5Pzogc3RyaW5nIHwgbnVsbCkge1xuLy8gICAgICAgICBpZiAoaWlkICYmIGtleSkge1xuLy8gICAgICAgICAgICAgZGVsZXRlIHRoaXMudXVpZHNbaWlkXS50aW1lcltrZXldO1xuLy8gICAgICAgICAgICAgaWYgKHRoaXMuc2tUaW1lcltpaWRdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnNrVGltZXJbaWlkXSA9IHsga2V5OiBbXSwgdmFsdWU6IFtdLCB0aW1lcjoge30gfTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGlmICh0aGlzLnNrVGltZXJbaWlkXSAmJiB0aGlzLnNrVGltZXJbaWlkXS50aW1lcltrZXldKSB7XG4vLyAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2tUaW1lcltpaWRdLnRpbWVyW2tleV07XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB0aGlzLnNrVGltZXJbaWlkXS5rZXkgPSBPYmplY3Qua2V5cyh0aGlzLnV1aWRzW2lpZF0udGltZXIpO1xuLy8gICAgICAgICAgICAgdGhpcy5za1RpbWVyW2lpZF0udmFsdWUgPSBPYmplY3QudmFsdWVzKHRoaXMudXVpZHNbaWlkXS50aW1lcik7XG4vLyAgICAgICAgIH0gZWxzZSBpZiAoaWlkICYmICFrZXkpIHtcbi8vICAgICAgICAgICAgIGlmICh0aGlzLnNrVGltZXJbaWlkXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy5za1RpbWVyW2lpZF0gPSB7IGtleTogW10sIHZhbHVlOiBbXSwgdGltZXI6IHt9IH07XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0udGltZXIgPSB7fTtcbi8vICAgICAgICAgICAgIHRoaXMuc2tUaW1lcltpaWRdLnRpbWVyID0ge307XG4vLyAgICAgICAgICAgICB0aGlzLnNrVGltZXJbaWlkXS5rZXkgPSBbXTtcbi8vICAgICAgICAgICAgIHRoaXMuc2tUaW1lcltpaWRdLnZhbHVlID0gW107XG4vLyAgICAgICAgIH1cbi8vICAgICB9XG4vLyAgICAgcHJpdmF0ZSBnZXRUaW1lcih0eXBlOiBudW1iZXIsIGlpZDogc3RyaW5nLCBrZXk/OiBzdHJpbmcgfCBudWxsKSB7XG4vLyAgICAgICAgIGlmICh0eXBlID09IDEpIHtcbi8vICAgICAgICAgICAgIGlmIChpaWQgJiYga2V5KSB7XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2tUaW1lcltpaWRdICYmIHRoaXMuc2tUaW1lcltpaWRdLnRpbWVyW2tleV0pIHtcbi8vICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2tUaW1lcltpaWRdLnRpbWVyW2tleV0ua2V5O1xuLy8gICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9IGVsc2UgaWYgKGlpZCkge1xuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLnNrVGltZXJbaWlkXSkge1xuLy8gICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5za1RpbWVyW2lpZF0ua2V5O1xuLy8gICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICBpZiAoaWlkICYmIGtleSkge1xuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLnNrVGltZXJbaWlkXSAmJiB0aGlzLnNrVGltZXJbaWlkXS50aW1lcltrZXldKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNrVGltZXJbaWlkXS50aW1lcltrZXldLnZhbHVlO1xuLy8gICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9IGVsc2UgaWYgKGlpZCkge1xuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLnNrVGltZXJbaWlkXSkge1xuLy8gICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5za1RpbWVyW2lpZF0udmFsdWU7XG4vLyAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfVxuLy8gICAgIH1cblxuLy8gICAgIC8qKlxuLy8gICAgICAqIOWIneWni+WMluaImOaWl1xuLy8gICAgICAqL1xuLy8gICAgIHByaXZhdGUgd2FyX2luaXQoKSB7XG4vLyAgICAgICAgIHRoaXMuemhlbiA9IDE7XG4vLyAgICAgICAgIGxldCBtaW5MYXN0OiBudW1iZXIgPSA5OTk5OTtcblxuLy8gICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy50ZWFtRmlpZHMubGVuZ3RoOyBpbmRleCsrKSB7XG4vLyAgICAgICAgICAgICBsZXQgZmlpZCA9IHRoaXMudGVhbUZpaWRzW2luZGV4XTtcbi8vICAgICAgICAgICAgIC8v5Yid5aeL5YyWIOi/memHjGlu5rKh5YWz57O7XG4vLyAgICAgICAgICAgICBsZXQgbGFzdCA9IE1hdGguY2VpbCgzMCAvICh0aGlzLnRlYW1zW2ZpaWRdLmVwcy5zcGVlZCAvIDEwMDAwKSk7XG4vLyAgICAgICAgICAgICBtaW5MYXN0ID0gTWF0aC5taW4obWluTGFzdCwgbGFzdCk7XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICBtaW5MYXN0ID0gLTEgKiAobWluTGFzdCAtIDUpOyAvLyDmnIDlv6vnmoTpgqPkuKrkurrku47nrKzkupTluKflvIDlp4vmiZNcbi8vICAgICAgICAgLy/liJ3lp4vljJblrZjlgqhcbi8vICAgICAgICAgbGV0IGRyYWluX3NrOiBudW1iZXIgPSAwO1xuLy8gICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy50ZWFtRmlpZHMubGVuZ3RoOyBpbmRleCsrKSB7XG4vLyAgICAgICAgICAgICBsZXQgZmlpZCA9IHRoaXMudGVhbUZpaWRzW2luZGV4XTtcbi8vICAgICAgICAgICAgIGlmIChkcmFpbl9zayA9PSAwICYmIFtcIjEwMFwiLCBcIjEwMDBcIl0uaW5jbHVkZXMoZmlpZCkpIHtcbi8vICAgICAgICAgICAgICAgICBkcmFpbl9zayA9IDE7ICAgLy8g55u05o6l6YO95Y+v5Lul5YqgXG4vLyAgICAgICAgICAgICAgICAgLypsZXQgc2tpZHM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXModGhpcy50ZWFtc1tmaWlkXS5zayk7XG4vLyAgICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNraWRzLmxlbmd0aDsgaW5kZXgrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgc2tfYmFzZSA9IEdhbWVjZmcuc2tpbGxCYXNlLmdldEl0ZW0oc2tpZHNbaW5kZXhdLCBcIjFcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChza19iYXNlICYmIHNrX2Jhc2UuZHJhaW4gPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBkcmFpbl9zayA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH0qL1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgLy/liJ3lp4vljJYg6L+Z6YeMaW7msqHlhbPns7tcbi8vICAgICAgICAgICAgIHRoaXMudXVpZHNbZmlpZF0gPSB7XG4vLyAgICAgICAgICAgICAgICAgZHJhaW5fc2s6IGRyYWluX3NrLFxuLy8gICAgICAgICAgICAgICAgIGxhc3Q6IG1pbkxhc3QsXG4vLyAgICAgICAgICAgICAgICAgbGFzdDI6IDAsXG4vLyAgICAgICAgICAgICAgICAgY29uczogWzAsIDAsIDBdLFxuLy8gICAgICAgICAgICAgICAgIGZjb25zOiBbMCwgMCwgMF0sXG4vLyAgICAgICAgICAgICAgICAgcG9kdW46IFtdLFxuLy8gICAgICAgICAgICAgICAgIHNrYnVmZjoge30sXG4vLyAgICAgICAgICAgICAgICAgc2tiYXNlOiB7fSxcbi8vICAgICAgICAgICAgICAgICBmcGs6IFwiXCIsXG4vLyAgICAgICAgICAgICAgICAgaXBrOiBcIlwiLCAvL+aIkeaJk+eahOacgOWQjuS4gOS4qlxuLy8gICAgICAgICAgICAgICAgIGlwa3M6IHt9LCAvL+aIkeaJk+eahOacgOWQjuS4gOS4qlxuLy8gICAgICAgICAgICAgICAgIGR6aGVuOiAwLFxuLy8gICAgICAgICAgICAgICAgIHRpbWVyOiB7fSxcbi8vICAgICAgICAgICAgIH07XG4vLyAgICAgICAgIH1cbi8vICAgICB9XG5cbi8vICAgICAvKipcbi8vICAgICAgKiDlvIDlp4vmiJjmlpdcbi8vICAgICAgKi9cbi8vICAgICBwcml2YXRlIHdhcl9sb29wKCkge1xuLy8gICAgICAgICB0aGlzLm91dGYud2luID0gMDtcbi8vICAgICAgICAgd2hpbGUgKHRoaXMuemhlbiA8IDEzNTApIHtcbi8vICAgICAgICAgICAgIHRoaXMub3V0Zi5sb2dbdGhpcy56aGVuXSA9IFtdO1xuLy8gICAgICAgICAgICAgdGhpcy5vbmVBdGtpaWRzID0gW107XG4vLyAgICAgICAgICAgICB0aGlzLm9uZUF0ayA9IHt9O1xuLy8gICAgICAgICAgICAgdGhpcy5tcGZpaWRzID0ge307XG4vLyAgICAgICAgICAgICB0aGlzLm9uZUZpaWRzID0ge307IC8v5LiK5LiA5bin55qE5a+55omL5riF56m6XG4vLyAgICAgICAgICAgICB0aGlzLm9uZUhpdCA9IHt9OyAvL+S4iuS4gOW4p+eahOS8pOWus+a4heepulxuLy8gICAgICAgICAgICAgdGhpcy5vbmVCdWZmID0ge307IC8v5riF6Zmk5LiK5LiA5bin55qE5Y+Y5YqoYnVmZueahGZpaWRcbi8vICAgICAgICAgICAgIHRoaXMuanNGaWlkcyA9IHt9O1xuLy8gICAgICAgICAgICAgaWYgKHRoaXMuemhlbiA9PSAxKSB7XG4vLyAgICAgICAgICAgICAgICAgLy/op6blj5Hov5vlhaXmiJjmlpfmioDog71cbi8vICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudGVhbUZpaWRzLmxlbmd0aDsgaSsrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfYmFzZU9ialJ1bjQodGhpcy50ZWFtRmlpZHNbaV0pOyAvL+aKgOiDvei9rOaNolxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudGVhbUZpaWRzLmxlbmd0aDsgaSsrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfYmFzZSh0aGlzLnRlYW1GaWlkc1tpXSwgNCk7IC8v5oqA6IO96Kem5Y+RXG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIC8v54G15Yqb5ruh5oCS5pe26YeK5pS+XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbXCIxMDBcIl0gIT0gbnVsbCAmJiB0aGlzLnRlYW1zW1wiMTAwXCJdLmVwcy5tcCA+PSAxMDAwMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5za19iYXNlKFwiMTAwXCIsIDMpOyAvL+aKgOiDveinpuWPkVxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KXsgICAgLy8g5oqA6IO96YeK5pS+5oiQ5Yqf5omN5omj5oCS5rCUXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZF9tcChcIjEwMFwiLCAtMTAwMDAsIDIpO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlYW1zW1wiMTAwMFwiXSAhPSBudWxsICYmIHRoaXMudGVhbXNbXCIxMDAwXCJdLmVwcy5tcCA+PSAxMDAwMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5za19iYXNlKFwiMTAwMFwiLCAzKTsgLy/mioDog73op6blj5Fcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCl7ICAgIC8vIOaKgOiDvemHiuaUvuaIkOWKn+aJjeaJo+aAkuawlFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRfbXAoXCIxMDAwXCIsIC0xMDAwMCwgMik7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBpZiAodGhpcy56aGVuID09IDIpe1xuLy8gICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50ZWFtRmlpZHMubGVuZ3RoOyBpKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy50ZWFtc1t0aGlzLnRlYW1GaWlkc1tpXV0udHlwZSA9PSA0IHx8IHRoaXMudGVhbXNbdGhpcy50ZWFtRmlpZHNbaV1dLnR5cGUgPT0gNSl7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2Jhc2UodGhpcy50ZWFtRmlpZHNbaV0sIDEpOyAvL2Jvc3Plkoznp5jlooPmgKrkvJjlhYjlh7rmiYvkuIDmrKFcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIHRoaXMucGtfemhlbl9idWZmKCk7IC8v5LiA5bin5YmNXG5cbi8vICAgICAgICAgICAgIC8vIGlmKHRoaXMuemhlbiA9PSAxNTAgJiYgdGhpcy50ZWFtc1tcIjEwMDJcIl0gIT0gbnVsbCl7XG4vLyAgICAgICAgICAgICAvLyAgICAgdGhpcy5qaWVzdW9faGlkZShcIjEwMDJcIilcbi8vICAgICAgICAgICAgIC8vICAgICB0aGlzLnRlYW1zW1wiMTAwMlwiXS5pc0hpZGUgPSAwXG4vLyAgICAgICAgICAgICAvLyB9XG4vLyAgICAgICAgICAgICB0aGlzLnBrX3poZW5fYXRrKCk7IC8v5LiA5bin5LitXG5cbi8vICAgICAgICAgICAgIHRoaXMucGtfemhlbl9vdmVyKCk7IC8v5LiA5bin5ZCOXG4vLyAgICAgICAgICAgICB0aGlzLmp1ZVN1YW5PbmVBdGsoKTtcblxuLy8gICAgICAgICAgICAgLy/ovpPlh7pidWZmXG4vLyAgICAgICAgICAgICB0aGlzLnNrYnVmZl9vdXRmKCk7XG4vLyAgICAgICAgICAgICB0aGlzLmp1ZVN1YW5PbmVBdGsoKTtcblxuLy8gICAgICAgICAgICAgLy/liKDpmaTnqbrnmb3ml6Xlv5dcbi8vICAgICAgICAgICAgIGlmICh0aGlzLm91dGYubG9nW3RoaXMuemhlbl0ubGVuZ3RoID09IDApIHtcbi8vICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5vdXRmLmxvZ1t0aGlzLnpoZW5dO1xuLy8gICAgICAgICAgICAgfVxuXG4vLyAgICAgICAgICAgICAvL+WIpOaWreiDnOi0n1xuLy8gICAgICAgICAgICAgbGV0IG1mY291bnQ6IG51bWJlciA9IDA7IC8v5oiR5pa55rS7552A55qE5Lq65pWwXG4vLyAgICAgICAgICAgICBsZXQgZmNvdW50OiBudW1iZXIgPSAwOyAvL+aIkeaWuea0u+edgOeahOS6uuaVsFxuLy8gICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMudGVhbUZpaWRzLmxlbmd0aDsgaW5kZXgrKykge1xuLy8gICAgICAgICAgICAgICAgIGxldCBmaWlkID0gdGhpcy50ZWFtRmlpZHNbaW5kZXhdO1xuLy8gICAgICAgICAgICAgICAgIC8v6L+Z6YeM55SoaW4g5rKh5YWz57O7XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbZmlpZF0udHlwZSA9PSAzKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+WFveeBteS4jeiuoeWFpeiDnOi0n+iuoeeul1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXS50eXBlID09IDQgJiYgTnVtYmVyKGZpaWQpICUgMTAwID09IDAgJiYgdGhpcy50ZWFtc1tmaWlkXS5lcHMuaHAgPD0gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICBmY291bnQgPSAwOyAvLyDlpoLmnpzmmK/miZNib3Nz55qEIGJvc3PmrbvkuobmiJjmlpfnu5PmnZ8g6IOc5YipXG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBpZiAoTWF0aC5mbG9vcihOdW1iZXIoZmlpZCkgLyAxMDApID49IDEwICYmICh0aGlzLnRlYW1zW2ZpaWRdLmVwcy5ocCA+IDAgfHwgdGhpcy5za2J1ZmZfZ2V0KGZpaWQsXCJlZmZlY3RfaV82M1wiLDIpID4gMCkpIHsvLyDov5jlj6/ku6XlpI3mtLtcbi8vICAgICAgICAgICAgICAgICAgICAgbWZjb3VudCArPSAxO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBpZiAoTWF0aC5mbG9vcihOdW1iZXIoZmlpZCkgLyAxMDApIDwgMTAgJiYgKHRoaXMudGVhbXNbZmlpZF0uZXBzLmhwID4gMCB8fCB0aGlzLnNrYnVmZl9nZXQoZmlpZCxcImVmZmVjdF9pXzYzXCIsMikgPiAwKSkgeyAgLy8g6L+Y5Y+v5Lul5aSN5rS7XG4vLyAgICAgICAgICAgICAgICAgICAgIGZjb3VudCArPSAxO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGlmIChtZmNvdW50IDwgMSkge1xuLy8gICAgICAgICAgICAgICAgIHJldHVybjsgLy/ovpPkuoZcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGlmIChmY291bnQgPCAxKSB7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy5vdXRmLndpbiA9IDE7IC8v6LWi5LqGXG4vLyAgICAgICAgICAgICAgICAgcmV0dXJuO1xuLy8gICAgICAgICAgICAgfVxuXG4vLyAgICAgICAgICAgICB0aGlzLnpoZW4rKztcbi8vICAgICAgICAgfVxuLy8gICAgIH1cblxuLy8gICAgIC8qKlxuLy8gICAgICAqIOWHuuaJiyjliY0pXG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSBwa196aGVuX2J1ZmYoKSB7XG4vLyAgICAgICAgIC8v5a6a5pe25omn6KGMXG4vLyAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50ZWFtRmlpZHMubGVuZ3RoOyBpKyspIHtcbi8vICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkodGhpcy50ZWFtc1t0aGlzLnRlYW1GaWlkc1tpXV0uaXNIaWRlKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgdGhpcy50aW1lcl9kbyg2MDEsIHsgZG9faWlkOiBOdW1iZXIodGhpcy50ZWFtRmlpZHNbaV0pIH0pOyAvL+avj+W4p+ajgOa1i1xuLy8gICAgICAgICAgICAgdGhpcy50aW1lcl9kbyg2MDIsIHsgZG9faWlkOiBOdW1iZXIodGhpcy50ZWFtRmlpZHNbaV0pIH0pOyAvL+avj+W4p+ajgOa1i1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50ZWFtRmlpZHMubGVuZ3RoOyBpKyspIHtcbi8vICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkodGhpcy50ZWFtc1t0aGlzLnRlYW1GaWlkc1tpXV0uaXNIaWRlKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbdGhpcy50ZWFtRmlpZHNbaV1dLmVwcy5ocCA8PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgY29udGludWU7IC8v6L+Y5rKh5rS7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB0aGlzLm9uZUZpaWRzW3RoaXMudGVhbUZpaWRzW2ldXSA9IHt9OyAvL+WIneWni+WMluWQhOS4qmlpZFxuLy8gICAgICAgICB9XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog5Ye65omLKOS4rSlcbi8vICAgICAgKi9cbi8vICAgICBwcml2YXRlIHBrX3poZW5fYXRrKCkge1xuLy8gICAgICAgICBsZXQgaWlkOiBzdHJpbmc7XG4vLyAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50ZWFtRmlpZHMubGVuZ3RoOyBpKyspIHtcbi8vICAgICAgICAgICAgIGlpZCA9IHRoaXMudGVhbUZpaWRzW2ldO1xuLy8gICAgICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eSh0aGlzLnRlYW1zW2lpZF0uaXNIaWRlKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgdGhpcy5wa196aGVuX2F0a19vbmUoaWlkKTtcbi8vICAgICAgICAgICAgIHRoaXMuc2tidWZmX3N1Yl9hbGwoaWlkLCBcImVmZmVjdF9pXzc1XCIpO1xuLy8gICAgICAgICAgICAgLy8g5b+r5YmR5Y2w6K6w5Y676ZmkXG4vLyAgICAgICAgICAgICBsZXQgZWZmX2lfMTkgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImVmZmVjdF9pXzE5XCIsIDIpO1xuLy8gICAgICAgICAgICAgaWYgKGVmZl9pXzE5ID4gMCAmJiB0aGlzLnV1aWRzW2lpZF0ubGFzdDIgKyA3ICogMzAgPD0gdGhpcy56aGVuKSB7XG4vLyAgICAgICAgICAgICAgICAgLy8g5oul5pyJ5Y2w6K6wIOW5tuS4lOW3sue7jzfnp5LmsqHmnInlh7rmiYtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9zdWJfYWxsKGlpZCwgXCJlZmZlY3RfaV8xOVwiKTtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9zdWJfYWxsKGlpZCwgXCJlZmZlY3RfaV8yM1wiKTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIC8vIOWkjea0u2J1ZmZcbi8vICAgICAgICAgICAgIGxldCBlZmZfaV8zNiA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiZWZmZWN0X2lfMzZcIiwgMik7XG4vLyAgICAgICAgICAgICBpZiAoZWZmX2lfMzYgPiAwICYmIHRoaXMuc2tidWZmX2dldChpaWQsIFwiaV8zNl9uWmhlblwiKSA8PSB0aGlzLnpoZW4pIHtcbi8vICAgICAgICAgICAgICAgICAvLyDlpI3mtLtcbi8vICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGlpZCwgXCJhVHlwZVwiLCBYeXMuQWN0aW9uVHlwZS5lZmZlY3QpO1xuLy8gICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgaWlkLCBcImVmZmVjdFwiLCBbXCJocFwiLCB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImlfMzZcIildKTtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9zdWJfYWxsKGlpZCwgXCJlZmZlY3RfaV8zNlwiKTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIHRoaXMuanVlU3Vhbk9uZUF0aygpO1xuLy8gICAgICAgICB9XG4vLyAgICAgfVxuLy8gICAgIC8qKlxuLy8gICAgICAqIOWHuuaJiyjkuK0pIC0g5LiA5Liq5Lq65Ye65omLXG4vLyAgICAgICogQHBhcmFtIGlpZCDlh7rmiYvkurpcbi8vICAgICAgKi9cbi8vICAgICBwcml2YXRlIHBrX3poZW5fYXRrX29uZShpaWQ6IHN0cmluZykge1xuLy8gICAgICAgICBpZiAodGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJocFwiKSA8PSAwKSB7XG4vLyAgICAgICAgICAgICByZXR1cm47IC8v6L+Y5rKh5rS7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgaWYgKCF0aGlzLmNoZWNrSGl0KGlpZCkpIHtcbi8vICAgICAgICAgICAgIHJldHVybjsgLy8g5LmZ5pa56YO95q275LqGIOWFveeBteS4jeiDveaUu+WHu1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGxldCBpX3NwZWVkOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcInNwZWVkXCIpO1xuLy8gICAgICAgICBpX3NwZWVkID0gaV9zcGVlZCA+IDUwMDAwID8gNTAwMDAgOiBpX3NwZWVkO1xuLy8gICAgICAgICBsZXQgbGFzdCA9IE1hdGguY2VpbCgzMCAvIChpX3NwZWVkIC8gMTAwMDApKTtcbi8vICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5sYXN0ICsgbGFzdCA+IHRoaXMuemhlbikge1xuLy8gICAgICAgICAgICAgcmV0dXJuOyAvL+S4jeaYr+W9k+WJjeW4p1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIC8vIHRoaXMudXVpZHNbaWlkXS5sYXN0ICs9IGxhc3Q7IHRvZG8g6L+Z6YeM5LiN6KaB5omT5byAIOaUu+WHu+mikeeOh+S8muaciemXrumimFxuLy8gICAgICAgICB0aGlzLnNrX2Jhc2UoaWlkLCAxKTsgLy/mioDog73op6blj5FcblxuLy8gICAgICAgICAvL+eBteWKm+a7oeaAkuaXtumHiuaUvlxuLy8gICAgICAgICBpZiAodGhpcy50ZWFtc1tcIjEwMFwiXSAhPSBudWxsICYmIHRoaXMudGVhbXNbXCIxMDBcIl0uZXBzLm1wID49IDEwMDAwKSB7XG4vLyAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5za19iYXNlKFwiMTAwXCIsIDMpOyAvL+aKgOiDveinpuWPkVxuLy8gICAgICAgICAgICAgaWYgKHJlc3VsdCl7ICAgIC8vIOaKgOiDvemHiuaUvuaIkOWKn+aJjeaJo+aAkuawlFxuLy8gICAgICAgICAgICAgICAgIHRoaXMuanVlU3Vhbk9uZUF0aygpXG4vLyAgICAgICAgICAgICAgICAgdGhpcy5hZGRfbXAoXCIxMDBcIiwgLTEwMDAwLCAyKTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfVxuLy8gICAgICAgICBpZiAodGhpcy50ZWFtc1tcIjEwMDBcIl0gIT0gbnVsbCAmJiB0aGlzLnRlYW1zW1wiMTAwMFwiXS5lcHMubXAgPj0gMTAwMDApIHtcbi8vICAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnNrX2Jhc2UoXCIxMDAwXCIsIDMpOyAvL+aKgOiDveinpuWPkVxuLy8gICAgICAgICAgICAgaWYgKHJlc3VsdCl7ICAgIC8vIOaKgOiDvemHiuaUvuaIkOWKn+aJjeaJo+aAkuawlFxuLy8gICAgICAgICAgICAgICAgIHRoaXMuanVlU3Vhbk9uZUF0aygpXG4vLyAgICAgICAgICAgICAgICAgdGhpcy5hZGRfbXAoXCIxMDAwXCIsIC0xMDAwMCwgMik7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICB9XG5cbi8vICAgICAvKlxuLy8gICAgICAqIOS4u+inkuW8n+WtkOmDveatu+S6hiDlhb3ngbXkuI3og73mlLvlh7tcbi8vICAgICAgKiAqL1xuLy8gICAgIHByaXZhdGUgY2hlY2tIaXQoaWlkOiBzdHJpbmcpIHtcbi8vICAgICAgICAgaWYgKHBhcnNlSW50KGlpZCkgJSAxMDAgIT0gMTApIHtcbi8vICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGxldCBjb3VudCA9IDA7XG4vLyAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50ZWFtRmlpZHMubGVuZ3RoOyBpKyspIHtcbi8vICAgICAgICAgICAgIGlmICh0aGlzLnRlYW1GaWlkc1tpXSAhPSBpaWQgJiYgdGhpcy50ZWFtRmlpZHNbaV0ubGVuZ3RoID09IGlpZC5sZW5ndGggJiYgIXRoaXMudXVpZHNbdGhpcy50ZWFtRmlpZHNbaV1dLmR6aGVuKSB7XG4vLyAgICAgICAgICAgICAgICAgY291bnQrKztcbi8vICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfVxuLy8gICAgICAgICBpZiAoIWNvdW50KSB7XG4vLyAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4vLyAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbi8vICAgICAgICAgfVxuLy8gICAgIH1cbi8vICAgICAvKipcbi8vICAgICAgKiDop6blj5HkuIDmrKHkvKTlrrNcbi8vICAgICAgKiBAcGFyYW0gaWlkIOaUu+WHu+iAhVxuLy8gICAgICAqIEBwYXJhbSBmaWlkIOiiq+aJk+iAhVxuLy8gICAgICAqL1xuLy8gICAgIHByaXZhdGUgc2tfYWN0aW9uX3R5cGVfMShpaWQ6IHN0cmluZywgZmlpZDogc3RyaW5nLCBza2lkOiBzdHJpbmcsIGFjSWQ6IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuLy8gICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMudGVhbXNbaWlkXS5pc0hpZGUpID09IGZhbHNlKSB7XG4vLyAgICAgICAgICAgICByZXR1cm4ge307IC8v6ZqQ6JePXG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgbGV0IGNmZ0FjID0gR2FtZWNmZy5za2lsbEFjdGlvbi5nZXRJdGVtKGFjSWQpO1xuLy8gICAgICAgICBpZiAoY2ZnQWMgPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgcmV0dXJuIHt9O1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmICh0aGlzLm9uZUhpdFtpaWRdID09IG51bGwgfHwgdGhpcy5vbmVIaXRbaWlkXVtmaWlkXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICByZXR1cm4ge307XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgbGV0IGNmZ1NrID0gR2FtZWNmZy5za2lsbEJhc2UuZ2V0SXRlbShza2lkLCBcIjFcIik7XG4vLyAgICAgICAgIGlmIChjZmdTayA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICByZXR1cm4ge307IC8v5rKh5pyJ6L+Z5Liq5oqA6IO9ICDmiJbogIUg6L+Z5Liq5oqA6IO955qE6Kem5Y+R5pe25py65LiN5a+5XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICBsZXQgaml0dWlhcnI6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXTsgLy/lh7vpgIBcbi8vICAgICAgICAgaWYgKGNmZ0FjLmFyZ3NbXCJzXCJdICE9IG51bGwgJiYgdGhpcy5zZWVkUmFuZC5yYW5kKDEsIDEwMDAwKSA8PSBjZmdBYy5hcmdzW1wicFwiXSAqIDEwMDAwKSB7XG4vLyAgICAgICAgICAgICBqaXR1aWFyciA9IFtcImppdHVpXCIsIGNmZ0FjLmFyZ3NbXCJzXCJdXTtcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgaWlkLCBcImFUeXBlXCIsIFh5cy5BY3Rpb25UeXBlLmF0ayk7XG4vLyAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgaWlkLCBcImFTa2lkXCIsIHNraWQpO1xuXG4vLyAgICAgICAgIHRoaXMudXVpZHNbZmlpZF0uZnBrID0gaWlkOyAvL+iusOW9leacgOWQjuS4gOasoeaJk+S8pOaIkeeahOS6ulxuLy8gICAgICAgICB0aGlzLnV1aWRzW2lpZF0uaXBrID0gZmlpZDtcbi8vICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5pcGtzW3RoaXMuemhlbl0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLmlwa3NbdGhpcy56aGVuXSA9IFtdO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5pcGtzW3RoaXMuemhlbl0ucHVzaChmaWlkKTtcbi8vICAgICAgICAgdGhpcy51dWlkc1tpaWRdLmxhc3QyID0gdGhpcy56aGVuO1xuXG4vLyAgICAgICAgIGxldCBtYWluX2lpZCA9IGlpZC5sZW5ndGggPiAzID8gXCIxMDAwXCIgOiBcIjEwMFwiO1xuLy8gICAgICAgICBpZiAoTnVtYmVyKGlpZCkgJSAxMDAgPCAxMCAmJiB0aGlzLnV1aWRzW21haW5faWlkXSAmJiB0aGlzLnV1aWRzW21haW5faWlkXS5kcmFpbl9zayA+IDApIHtcbi8vICAgICAgICAgICAgIGxldCBjZmdNYXRoID0gR2FtZWNmZy5tYXRoSW5mby5nZXRJdGVtKFwiYmF0dGxlX2xpbmdsaVwiKTtcbi8vICAgICAgICAgICAgIGlmIChjZmdNYXRoICE9IG51bGwgJiYgY2ZnTWF0aC5wcmFtLml0ZW1zICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICBsZXQgbGxtaW4gPSBjZmdNYXRoLnByYW0uaXRlbXNbMV1bMF07XG4vLyAgICAgICAgICAgICAgICAgbGV0IGxsTWF4ID0gY2ZnTWF0aC5wcmFtLml0ZW1zWzFdWzFdO1xuLy8gICAgICAgICAgICAgICAgIHRoaXMuYWRkX21wKG1haW5faWlkLCB0aGlzLnNlZWRSYW5kLnJhbmQobGxtaW4sIGxsTWF4KSwgMik7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICB0aGlzLnRpbWVyX2RvKDEwNiwgeyBkb19paWQ6IE51bWJlcihmaWlkKSB9KTsgLy/ooqvmiZPliY3op6blj5Fcbi8vICAgICAgICAgdGhpcy50aW1lcl9kbygyMDksIHsgZG9faWlkOiBOdW1iZXIoaWlkKSB9KTsgLy/mlLvlh7vnu5PnrpfliY3op6blj5Fcbi8vICAgICAgICAgLy/lkITnp43kvKTlrrPorqHnrpdcbi8vICAgICAgICAgbGV0IGd6aGl0ID0gdGhpcy5vbmVIaXRbaWlkXVtmaWlkXTtcblxuLy8gICAgICAgICBsZXQgaGl0OiBudW1iZXIgPSBnemhpdC5wZ2hpdDsgLy/mgLvkvKTlrrNcbi8vICAgICAgICAgaWYgKGNmZ1NrLnNraWxsVHlwZSA9PSAzKSB7XG4vLyAgICAgICAgICAgICBoaXQgPSBnemhpdC5za2hpdDtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBpZiAoY2ZnU2suZHJhaW4gPiAwKSB7XG4vLyAgICAgICAgICAgICAvLyDmnK/ms5XkvKTlrrPlop7liqBcbi8vICAgICAgICAgICAgIGxldCBpXzczID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJpXzczXCIpO1xuLy8gICAgICAgICAgICAgbGV0IGlfcWhtaWZhID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJxaG1pZmFcIik7XG4vLyAgICAgICAgICAgICBsZXQgZl9yaG1pZmEgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJyaG1pZmFcIik7XG4vLyAgICAgICAgICAgICBoaXQgKz0gTWF0aC5mbG9vcihoaXQgKiAoKGlfNzMgKyBpX3FobWlmYSAtIGZfcmhtaWZhKSAvIDEwMDAwKSk7XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICBsZXQgcmVzdWx0ID0geyBkb19paWQ6IE51bWJlcihmaWlkKSwgaGl0OiAwIH07XG4vLyAgICAgICAgIC8vIOaUu+WHuyAgPeOAi1xuLy8gICAgICAgICAvLyDjgIsg5Yik5a6a6L+e5Ye777yI6ZyA6KaB5Yik5a6a5pyJ5rKh5pyJ6Kem5Y+R5pq05Ye777yJICB8ICAg5Yik5a6a5rqF5bCE77yI6ZyA6KaB5Yik5a6a5pyJ5rKh5pyJ6Kem5Y+R5pq05Ye777yJXG4vLyAgICAgICAgIC8vIOOAi+ayoeeUqOi/nuWHuyDmsqHnlKjmuoXlsIQgICAgPeOAiyDliKTlrprmmrTlh7tcbi8vICAgICAgICAgLy8g44CLIOWmguaenOayoeacieaatOWHuyAg5omN5pivIOaZrumAmuaUu+WHu1xuLy8gICAgICAgICAvLyB8IOWQuOihgFxuXG4vLyAgICAgICAgIC8vIOOAi+iiq+aJkyAgICDmoLzmjKEgIHwgIOWPjeWHu++8iOa6heWwhO+8iOmcgOimgeWIpOWumuacieayoeacieinpuWPkeaatOWHu++8iSAgIOWmguaenOayoeaciea6heWwhOaJjeWIpOWumuaatOWHuyAg77yJICDmsqHmnInmmrTlh7sg5bCx5piv5pmu6YCa5pS75Ye7ICArIOWQuOihgFxuXG4vLyAgICAgICAgIC8vIOWPjeWHu+iiq+aJk+eahOS5n+imgeWIpOWumiDmoLzmjKFcbi8vICAgICAgICAgLy8g57uT5p2f5LqGXG5cbi8vICAgICAgICAgLy8g5piv5ZCm6L+e5Ye7XG4vLyAgICAgICAgIGxldCBpc2xqOiBudW1iZXIgPSB0aGlzLmlzTGlhbmppKGlpZCwgZmlpZCk7XG4vLyAgICAgICAgIGxldCBpc05leHQ6IG51bWJlciA9IDA7IC8vMOm7mOiupCAx5YGc5q2iICAy5bey57uP6Kem5Y+R5pq05Ye7XG4vLyAgICAgICAgIGlmIChpc2xqKSB7XG4vLyAgICAgICAgICAgICBpc05leHQgPSAxO1xuLy8gICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLmNvbnNbMV0gKz0gMTsgLy/orrDlvZXmlLvlh7vmrKHmlbBcbi8vICAgICAgICAgICAgIHRoaXMudXVpZHNbZmlpZF0uZmNvbnNbMV0gKz0gMTsgLy/orrDlvZXmlLvlh7vmrKHmlbBcbi8vICAgICAgICAgICAgIC8vIOaYr+WQpuaatOWHu1xuLy8gICAgICAgICAgICAgbGV0IGlzQmo6IG51bWJlciA9IHRoaXMuaXNCYW9qaShpaWQsIGZpaWQpO1xuLy8gICAgICAgICAgICAgaWYgKGlzQmopIHtcbi8vICAgICAgICAgICAgICAgICBpc05leHQgPSAyO1xuLy8gICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICBsZXQgaXNHZCA9IHRoaXMuaXNHZWRhbmcoaWlkLCBmaWlkKTsgLy8g6L+e5Ye75qC85oyhXG4vLyAgICAgICAgICAgICAgICAgaGl0ID0gZ3poaXQubGpoaXQ7XG4vLyAgICAgICAgICAgICAgICAgaWYgKGlzR2QpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBmaWlkLCBcImVmZmVjdFwiLCBbXCJibG9ja1wiLCAxXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGhpdCAtPSBnemhpdC5nZGhpdDtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgaGl0ID0gdGhpcy5oaXRfbGFzdChpaWQsIGZpaWQsIGhpdCk7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBmaWlkLCBcImVmZmVjdFwiLCBbXCJsaWFuamlcIiwgLTEgKiBoaXRdLmNvbmNhdChqaXR1aWFyciksIHNraWQpO1xuLy8gICAgICAgICAgICAgICAgIHJlc3VsdC5oaXQgKz0gaGl0O1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG5cbi8vICAgICAgICAgLy/mmK/lkKbmuoXlsIRcbi8vICAgICAgICAgbGV0IGlzSnMgPSB0aGlzLnNlZWRSYW5kLnJhbmQoMSwgMTAwMDApIDw9IGd6aGl0LmpzUmF0ZTtcbi8vICAgICAgICAgaWYgKGlzSnMpIHtcbi8vICAgICAgICAgICAgIGlzTmV4dCA9IDE7XG4vLyAgICAgICAgICAgICBsZXQgaXNCajogbnVtYmVyID0gdGhpcy5pc0Jhb2ppKGlpZCwgZmlpZCk7XG4vLyAgICAgICAgICAgICBpZiAoaXNCaikge1xuLy8gICAgICAgICAgICAgICAgIGlzTmV4dCA9IDI7XG4vLyAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgIC8vIOa6heWwhOS8pOWus+WinuWKoFxuLy8gICAgICAgICAgICAgICAgIGxldCBpXzgxID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJpXzgxXCIpO1xuLy8gICAgICAgICAgICAgICAgIGlmIChpXzgxICE9IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgaGl0ID0gTWF0aC5mbG9vcihoaXQgKiAoaV84MSAvIDEwMDAwICsgMSkpO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBsZXQgaXNHZCA9IHRoaXMuaXNHZWRhbmcoaWlkLCBmaWlkKTsgLy8g6L+e5Ye75qC85oyhXG4vLyAgICAgICAgICAgICAgICAgaWYgKGlzR2QpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBmaWlkLCBcImVmZmVjdFwiLCBbXCJibG9ja1wiLCAxXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGhpdCAtPSBnemhpdC5nZGhpdDtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgaGl0ID0gdGhpcy5oaXRfbGFzdChpaWQsIGZpaWQsIGhpdCk7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBmaWlkLCBcImVmZmVjdFwiLCBbXCJocFwiLCAtMSAqIGhpdF0sIHNraWQpO1xuXG4vLyAgICAgICAgICAgICAgICAgbGV0IGpzeGlzaHU6IG51bWJlcltdID0gWzEsIDAuNzUsIDAuNywgMC41OCwgMC41XTtcbi8vICAgICAgICAgICAgICAgICBsZXQganNmaWlkcyA9IHRoaXMuZmluZF9qaWFuc2VfZmlpZChmaWlkLCBjZmdBYy5kaXN0YW5jZSk7XG5cbi8vICAgICAgICAgICAgICAgICBsZXQgYWxsSGl0OiBudW1iZXIgPSAwO1xuLy8gICAgICAgICAgICAgICAgIGxldCBtYXhMZW4gPSBNYXRoLm1pbihqc2ZpaWRzLmxlbmd0aCwganN4aXNodS5sZW5ndGgpO1xuLy8gICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBtYXhMZW47IGluZGV4KyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGpzZmlpZHNbaW5kZXhdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChpXzgxICE9IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGhpdCA9IE1hdGguZmxvb3IoaGl0ICogKGlfODEgLyAxMDAwMCArIDEpKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBoaXQgPSBNYXRoLmZsb29yKGd6aGl0LmpzaGl0ICoganN4aXNodVttYXhMZW4gLSAxXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBpc0dkID0gdGhpcy5pc0dlZGFuZyhpaWQsIGpzZmlpZHNbaW5kZXhdKTsgLy8g6L+e5Ye75qC85oyhXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChpc0dkKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGpzZmlpZHNbaW5kZXhdLCBcImVmZmVjdFwiLCBbXCJibG9ja1wiLCAxXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBoaXQgLT0gZ3poaXQuZ2RoaXQ7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgaGl0ID0gdGhpcy5oaXRfbGFzdChpaWQsIGpzZmlpZHNbaW5kZXhdLCBoaXQpO1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGpzZmlpZHNbaW5kZXhdLCBcImVmZmVjdFwiLCBbXCJqaWFuc2hlXCIsIC0xICogaGl0XS5jb25jYXQoaml0dWlhcnIpKTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za19iYXNlKGpzZmlpZHNbaW5kZXhdLCAyLCB7IGhpdDogaGl0IH0pOyAvL+iiq+aUu+WHu1xuLy8gICAgICAgICAgICAgICAgICAgICBhbGxIaXQgKz0gaGl0O1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyX2RvKDIwNSwgeyBkb19paWQ6IE51bWJlcihpaWQpLCBoaXQ6IGFsbEhpdCB9KTsgLy/muoXlsITop6blj5Fcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIC8v5Yik5a6a5piv5ZCm5pq05Ye7XG4vLyAgICAgICAgIGlmIChpc05leHQgPT0gMCkge1xuLy8gICAgICAgICAgICAgbGV0IGlzQmo6IG51bWJlciA9IHRoaXMuaXNCYW9qaShpaWQsIGZpaWQpO1xuLy8gICAgICAgICAgICAgaWYgKGlzQmopIHtcbi8vICAgICAgICAgICAgICAgICBpc05leHQgPSAyO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG5cbi8vICAgICAgICAgLy/mmrTlh7tcbi8vICAgICAgICAgaWYgKGlzTmV4dCA9PSAyKSB7XG4vLyAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0uY29uc1swXSArPSAxOyAvL+iusOW9leaUu+WHu+asoeaVsFxuLy8gICAgICAgICAgICAgdGhpcy51dWlkc1tmaWlkXS5mY29uc1swXSArPSAxOyAvL+iusOW9leaUu+WHu+asoeaVsFxuXG4vLyAgICAgICAgICAgICBsZXQgaXNHZCA9IHRoaXMuaXNHZWRhbmcoaWlkLCBmaWlkKTsgLy8g6L+e5Ye75qC85oyhXG4vLyAgICAgICAgICAgICBpZiAoaXNHZCkge1xuLy8gICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgZmlpZCwgXCJlZmZlY3RcIiwgW1wiYmxvY2tcIiwgMV0pO1xuLy8gICAgICAgICAgICAgICAgIGhpdCAtPSBnemhpdC5nZGhpdDtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGhpdCA9IHRoaXMuaGl0X2xhc3QoaWlkLCBmaWlkLCBnemhpdC5iamhpdCk7XG4vLyAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGZpaWQsIFwiZWZmZWN0XCIsIFtcImJhb2ppXCIsIC0xICogaGl0XS5jb25jYXQoaml0dWlhcnIpLCBza2lkKTtcbi8vICAgICAgICAgICAgIHRoaXMudGltZXJfZG8oMjAzLCB7IGRvX2lpZDogTnVtYmVyKGlpZCksIGhpdDogaGl0LCBpc0JqOiBoaXQgfSk7IC8v5pq05Ye76Kem5Y+RXG4vLyAgICAgICAgICAgICByZXN1bHQuaGl0ICs9IGhpdDtcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIC8v5pmu6YCa5pS75Ye7XG4vLyAgICAgICAgIGlmIChpc05leHQgPT0gMCkge1xuLy8gICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLmNvbnNbMF0gKz0gMTsgLy/orrDlvZXmlLvlh7vmrKHmlbBcbi8vICAgICAgICAgICAgIHRoaXMudXVpZHNbZmlpZF0uZmNvbnNbMF0gKz0gMTsgLy/orrDlvZXmlLvlh7vmrKHmlbBcbi8vICAgICAgICAgICAgIGxldCBpc0dkID0gdGhpcy5pc0dlZGFuZyhpaWQsIGZpaWQpOyAvLyDov57lh7vmoLzmjKFcbi8vICAgICAgICAgICAgIGlmIChpc0dkKSB7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBmaWlkLCBcImVmZmVjdFwiLCBbXCJibG9ja1wiLCAxXSk7XG4vLyAgICAgICAgICAgICAgICAgaGl0IC09IGd6aGl0LmdkaGl0O1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgaGl0ID0gdGhpcy5oaXRfbGFzdChpaWQsIGZpaWQsIGd6aGl0LnBnaGl0KTtcbi8vICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgZmlpZCwgXCJlZmZlY3RcIiwgW1wiaHBcIiwgLTEgKiBoaXRdLmNvbmNhdChqaXR1aWFyciksIHNraWQpO1xuLy8gICAgICAgICAgICAgLy90aGlzLnRpbWVyX2RvKDIwMywgeyBkb19paWQ6IE51bWJlcihpaWQpLCBoaXQ6IGhpdCwgaXNCajogaGl0IH0pOyAvL+aatOWHu+inpuWPkVxuLy8gICAgICAgICAgICAgcmVzdWx0LmhpdCArPSBoaXQ7XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICAvL+aYr+WQpuWQuOihgFxuLy8gICAgICAgICBpZiAoZ3poaXQueHhoaXQgPiAwKSB7XG4vLyAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGlpZCwgXCJlZmZlY3RcIiwgW1wiaHBcIiwgZ3poaXQueHhoaXRdKTtcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIGlmIChjZmdTay5za2lsbFR5cGUgPT0gMykge1xuLy8gICAgICAgICAgICAgdGhpcy50aW1lcl9kbygyMDcsIHsgZG9faWlkOiBOdW1iZXIoaWlkKSwgaGl0OiByZXN1bHQuaGl0IH0pOyAvL+aKgOiDveinpuWPkVxuLy8gICAgICAgICAgICAgdGhpcy50aW1lcl9kbygxMDIsIHsgZG9faWlkOiBOdW1iZXIoZmlpZCksIGhpdDogcmVzdWx0LmhpdCB9KTsgLy/ooqvmiZPop6blj5Eo5oqA6IO9KVxuLy8gICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgdGhpcy50aW1lcl9kbygyMDEsIHsgZG9faWlkOiBOdW1iZXIoaWlkKSwgaGl0OiByZXN1bHQuaGl0IH0pOyAvL+aZrumAmuaUu+WHu+inpuWPkVxuLy8gICAgICAgICAgICAgdGhpcy50aW1lcl9kbygxMDMsIHsgZG9faWlkOiBOdW1iZXIoZmlpZCksIGhpdDogcmVzdWx0LmhpdCB9KTsgLy/ooqvmiZPop6blj5Eo5pmu6YCaKVxuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmIChjZmdTay5kcmFpbiA+IDApIHtcbi8vICAgICAgICAgICAgIHRoaXMudGltZXJfZG8oMjA4LCB7IGRvX2lpZDogTnVtYmVyKGlpZCksIGhpdDogcmVzdWx0LmhpdCB9KTsgLy/mnK/ms5Xop6blj5Fcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIC8vIOinpuWPkei/nuWHu2J1ZmZcbi8vICAgICAgICAgaWYgKGlzbGopIHtcbi8vICAgICAgICAgICAgIHRoaXMudGltZXJfZG8oMjAyLCB7IGRvX2lpZDogTnVtYmVyKGlpZCksIGhpdDogcmVzdWx0LmhpdCB9KTsgLy/ov57lh7vop6blj5Fcbi8vICAgICAgICAgICAgIHRoaXMudGltZXJfZG8oMTAxLCB7IGRvX2lpZDogTnVtYmVyKGZpaWQpLCBoaXQ6IHJlc3VsdC5oaXQgfSk7IC8v6L+e5Ye76Kem5Y+RIOiiq+aJk1xuLy8gICAgICAgICAgICAgdGhpcy5za19iYXNlKGlpZCwgOSwgeyBoaXQ6IHJlc3VsdC5oaXQgfSk7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgLy8g6Kem5Y+R5pq05Ye7YnVmZlxuLy8gICAgICAgICBpZiAoaXNOZXh0ID09IDIpIHtcbi8vICAgICAgICAgICAgIHRoaXMuc2tfYmFzZShpaWQsIDEwLCB7IGhpdDogcmVzdWx0LmhpdCB9KTtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICB0aGlzLnNrX2Jhc2UoZmlpZCwgMiwgeyBoaXQ6IHJlc3VsdC5oaXQgfSk7IC8v6KKr5pS75Ye7XG5cbi8vICAgICAgICAgLy/lj43lh7tcbi8vICAgICAgICAgdGhpcy5za19hY3Rpb25fdHlwZV8xX2ZhbmppKGZpaWQsIGlpZCwgZ3poaXQpO1xuXG4vLyAgICAgICAgIHJldHVybiByZXN1bHQ7XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog6Kem5Y+R5LiA5qyh5Y+N5Ye7XG4vLyAgICAgICogQHBhcmFtIGlpZCDmlLvlh7vogIVcbi8vICAgICAgKiBAcGFyYW0gZmlpZCDooqvmiZPogIVcbi8vICAgICAgKiBAcGFyYW0gaGl0XG4vLyAgICAgICogQHBhcmFtIGNzXG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSBza19hY3Rpb25fdHlwZV8xX2ZhbmppKGlpZDogc3RyaW5nLCBmaWlkOiBzdHJpbmcsIGd6aGl0OiBHemhpdCkge1xuLy8gICAgICAgICBpZiAodGhpcy50ZWFtc1tpaWRdLnR5cGUgPT0gMyB8fCB0aGlzLnRlYW1zW2ZpaWRdLnR5cGUgPT0gMykge1xuLy8gICAgICAgICAgICAgcmV0dXJuO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmICh0aGlzLmp1ZUZpaWRIcChmaWlkKTw9MCl7ICAgLy8g5q275LqG5LiN6IO95Y+N5Ye7XG4vLyAgICAgICAgICAgICByZXR1cm47XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgLy8g6KKr5omT55qE5piv5ZCm6KKr5Yaw5Ya7XG4vLyAgICAgICAgIGxldCBlZmZfaV8zID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJlZmZlY3RfaV8zXCIsIDIpO1xuLy8gICAgICAgICBpZiAoZWZmX2lfMyA+IDApIHtcbi8vICAgICAgICAgICAgIHJldHVybjsgLy/mmZXnnKlcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBsZXQgZWZmX2lfNSA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiZWZmZWN0X2lfNVwiLCAyKTtcbi8vICAgICAgICAgaWYgKGVmZl9pXzUgPiAwKSB7XG4vLyAgICAgICAgICAgICByZXR1cm47IC8v5Yaw5Ya7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgbGV0IGlzTmV4dDogbnVtYmVyID0gMDsgLy8w5YGc5q2iICAx57un57utIDLmmrTlh7tcbi8vICAgICAgICAgLy/mioDog73lj43lh7tcbi8vICAgICAgICAgbGV0IGNiYmFjayA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiY2FuYmVhdGJhY2tcIiwgMik7XG4vLyAgICAgICAgIGlmIChjYmJhY2sgPiAwKSB7XG4vLyAgICAgICAgICAgICBpc05leHQgPSAxO1xuLy8gICAgICAgICAgICAgdGhpcy5za2J1ZmZfc3ViKGlpZCwgXCJjYW5iZWF0YmFja1wiKTtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBsZXQgaXNFcGZqOiBudW1iZXIgPSAwO1xuLy8gICAgICAgICBpZiAoaXNOZXh0ID09IDApIHtcbi8vICAgICAgICAgICAgIC8v6Kem5Y+R5Y+N5Ye7XG4vLyAgICAgICAgICAgICBsZXQgaXNmajogbnVtYmVyID0gdGhpcy5pc0ZhbmppKGlpZCwgZmlpZCk7XG4vLyAgICAgICAgICAgICBpZiAoaXNmaikge1xuLy8gICAgICAgICAgICAgICAgIGlzTmV4dCA9IDE7XG4vLyAgICAgICAgICAgICAgICAgaXNFcGZqID0gMTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfVxuLy8gICAgICAgICBpZiAoaXNOZXh0ID09IDApIHtcbi8vICAgICAgICAgICAgIHJldHVybjtcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIC8v5om+5Ye65Y+N5Ye76ICF55qE5pmu6YCa5pS75Ye7XG4vLyAgICAgICAgIGxldCBwc2tpZDogc3RyaW5nID0gXCJcIjtcbi8vICAgICAgICAgbGV0IGFja2lkOiBudW1iZXIgPSAwO1xuLy8gICAgICAgICBsZXQgc2tpZHM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXModGhpcy50ZWFtc1tpaWRdLnNrKTtcbi8vICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNraWRzLmxlbmd0aDsgaW5kZXgrKykge1xuLy8gICAgICAgICAgICAgbGV0IGNmZ1NrID0gR2FtZWNmZy5za2lsbEJhc2UuZ2V0SXRlbShza2lkc1tpbmRleF0sIFwiMVwiKTtcbi8vICAgICAgICAgICAgIGlmIChjZmdTayAhPSBudWxsICYmIGNmZ1NrLnNraWxsVHlwZSA9PSAxKSB7XG4vLyAgICAgICAgICAgICAgICAgcHNraWQgPSBza2lkc1tpbmRleF07XG4vLyAgICAgICAgICAgICAgICAgYWNraWQgPSBjZmdTay5hY3Rpb25zWzBdO1xuLy8gICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmIChwc2tpZCA9PSBcIlwiKSB7XG4vLyAgICAgICAgICAgICByZXR1cm47XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGlpZCwgXCJhVHlwZVwiLCBYeXMuQWN0aW9uVHlwZS5mYW5qaSk7XG4vLyAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgaWlkLCBcImFTa2lkXCIsIHBza2lkKTtcblxuLy8gICAgICAgICB0aGlzLnV1aWRzW2lpZF0uY29uc1syXSArPSAxO1xuLy8gICAgICAgICB0aGlzLnV1aWRzW2ZpaWRdLmZjb25zWzJdICs9IDE7XG5cbi8vICAgICAgICAgLy/kvKTlrrNcbi8vICAgICAgICAgbGV0IGhpdCA9IGd6aGl0LmZqaGl0O1xuLy8gICAgICAgICBsZXQgaV9yaGJsb2NrOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcInJoYmxvY2tcIik7XG5cbi8vICAgICAgICAgLy/mmK/lkKbmuoXlsIRcbi8vICAgICAgICAgbGV0IGlzSnMgPSB0aGlzLnNlZWRSYW5kLnJhbmQoMSwgMTAwMDApIDw9IGd6aGl0LmZqc1JhdGU7XG4vLyAgICAgICAgIGlmIChpc0pzKSB7XG4vLyAgICAgICAgICAgICBsZXQgaXNCajogbnVtYmVyID0gdGhpcy5pc0Jhb2ppKGlpZCwgZmlpZCk7XG4vLyAgICAgICAgICAgICBpZiAoaXNCaikge1xuLy8gICAgICAgICAgICAgICAgIGlzTmV4dCA9IDI7XG4vLyAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgIC8vIOa6heWwhOS8pOWus+WinuWKoFxuLy8gICAgICAgICAgICAgICAgIGxldCBpXzgxID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJpXzgxXCIpO1xuLy8gICAgICAgICAgICAgICAgIGlmIChpXzgxICE9IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgaGl0ID0gTWF0aC5mbG9vcihoaXQgKiAoaV84MSAvIDEwMDAwICsgMSkpO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBsZXQgaXNHZCA9IHRoaXMuaXNHZWRhbmcoaWlkLCBmaWlkKTsgLy8g6L+e5Ye75qC85oyhXG4vLyAgICAgICAgICAgICAgICAgaWYgKGlzR2QpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBmaWlkLCBcImVmZmVjdFwiLCBbXCJibG9ja1wiLCAxXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIC8v5qC85oyh5Lyk5a6zPVx0TUlOKOaKgOiDveS8pOWusyooTUFYKOaVjOaWueagvOaMoeWinuW8ui3miJHmlrnmoLzmjKHlh4/lvLEsMC4xMikpLOaKgOiDveS8pOWusyowLjkpXG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBmX3FoYmxvY2s6IG51bWJlciA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcInFoYmxvY2tcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBmZ2RfaGl0OiBudW1iZXIgPSBNYXRoLm1pbihnemhpdC5mamhpdCAqIE1hdGgubWF4KDAuMTIsIChmX3FoYmxvY2sgLSBpX3JoYmxvY2spIC8gMTAwMDApLCBnemhpdC5mamhpdCAqIDAuOSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGhpdCAtPSBNYXRoLmZsb29yKGZnZF9oaXQpO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBoaXQgPSB0aGlzLmhpdF9sYXN0KGlpZCwgZmlpZCwgaGl0KTtcbi8vICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGZpaWQsIFwiZWZmZWN0XCIsIFtcImZhbmppXCIsIC0xICogaGl0XSwgcHNraWQpO1xuXG4vLyAgICAgICAgICAgICAgICAgbGV0IGpzeGlzaHU6IG51bWJlcltdID0gWzEsIDAuNzUsIDAuNywgMC41OCwgMC41XTtcblxuLy8gICAgICAgICAgICAgICAgIGxldCBkaXN0YW5jZSA9IDA7XG4vLyAgICAgICAgICAgICAgICAgaWYgKGFja2lkICE9IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGNmZ0FjID0gR2FtZWNmZy5za2lsbEFjdGlvbi5nZXRJdGVtKGFja2lkLnRvU3RyaW5nKCkpO1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoY2ZnQWMgIT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBjZmdBYy5kaXN0YW5jZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBsZXQganNmaWlkcyA9IHRoaXMuZmluZF9qaWFuc2VfZmlpZChmaWlkLCBkaXN0YW5jZSk7XG4vLyAgICAgICAgICAgICAgICAgbGV0IGFsbEhpdDogbnVtYmVyID0gMDtcbi8vICAgICAgICAgICAgICAgICBsZXQgbWF4TGVuID0gTWF0aC5taW4oanNmaWlkcy5sZW5ndGgsIGpzeGlzaHUubGVuZ3RoKTtcbi8vICAgICAgICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbWF4TGVuOyBpbmRleCsrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChqc2ZpaWRzW2luZGV4XSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoaV84MSAhPSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBoaXQgPSBNYXRoLmZsb29yKGhpdCAqIChpXzgxIC8gMTAwMDAgKyAxKSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgaGl0ID0gTWF0aC5mbG9vcihnemhpdC5qc2hpdCAqIGpzeGlzaHVbbWF4TGVuIC0gMV0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgaXNHZCA9IHRoaXMuaXNHZWRhbmcoaWlkLCBqc2ZpaWRzW2luZGV4XSk7IC8vIOi/nuWHu+agvOaMoVxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBqc2ZpaWRzW2luZGV4XSwgXCJlZmZlY3RcIiwgW1wiYmxvY2tcIiwgMV0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZfcWhibG9jazogbnVtYmVyID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwicWhibG9ja1wiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmZ2RfaGl0OiBudW1iZXIgPSBNYXRoLm1pbihnemhpdC5mamhpdCAqIE1hdGgubWF4KDAuMTIsIChmX3FoYmxvY2sgLSBpX3JoYmxvY2spIC8gMTAwMDApLCBnemhpdC5mamhpdCAqIDAuOSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBoaXQgLT0gTWF0aC5mbG9vcihmZ2RfaGl0KTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBoaXQgPSB0aGlzLmhpdF9sYXN0KGlpZCwganNmaWlkc1tpbmRleF0sIGhpdCk7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwganNmaWlkc1tpbmRleF0sIFwiZWZmZWN0XCIsIFtcImZhbmppXCIsIC0xICogaGl0XSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfYmFzZShqc2ZpaWRzW2luZGV4XSwgMiwgeyBoaXQ6IGhpdCB9KTsgLy/ooqvmlLvlh7tcbi8vICAgICAgICAgICAgICAgICAgICAgYWxsSGl0ICs9IGhpdDtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgdGhpcy50aW1lcl9kbygyMDUsIHsgZG9faWlkOiBOdW1iZXIoaWlkKSwgaGl0OiBhbGxIaXQgfSk7IC8v5rqF5bCE6Kem5Y+RXG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICAvL+WIpOWumuaYr+WQpuaatOWHu1xuLy8gICAgICAgICBpZiAoaXNOZXh0ID09IDEpIHtcbi8vICAgICAgICAgICAgIGxldCBpc0JqOiBudW1iZXIgPSB0aGlzLmlzQmFvamkoaWlkLCBmaWlkKTtcbi8vICAgICAgICAgICAgIGlmIChpc0JqKSB7XG4vLyAgICAgICAgICAgICAgICAgaXNOZXh0ID0gMjtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIC8v5pq05Ye7XG4vLyAgICAgICAgIGlmIChpc05leHQgPT0gMikge1xuLy8gICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLmNvbnNbMF0gKz0gMTsgLy/orrDlvZXmlLvlh7vmrKHmlbBcbi8vICAgICAgICAgICAgIHRoaXMudXVpZHNbZmlpZF0uZmNvbnNbMF0gKz0gMTsgLy/orrDlvZXmlLvlh7vmrKHmlbBcblxuLy8gICAgICAgICAgICAgbGV0IGlzR2QgPSB0aGlzLmlzR2VkYW5nKGlpZCwgZmlpZCk7IC8vIOi/nuWHu+agvOaMoVxuLy8gICAgICAgICAgICAgaWYgKGlzR2QpIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGZpaWQsIFwiZWZmZWN0XCIsIFtcImJsb2NrXCIsIDFdKTtcbi8vICAgICAgICAgICAgICAgICBsZXQgZl9xaGJsb2NrOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJxaGJsb2NrXCIpO1xuLy8gICAgICAgICAgICAgICAgIGxldCBmZ2RfaGl0OiBudW1iZXIgPSBNYXRoLm1pbihnemhpdC5mamhpdCAqIE1hdGgubWF4KDAuMTIsIChmX3FoYmxvY2sgLSBpX3JoYmxvY2spIC8gMTAwMDApLCBnemhpdC5mamhpdCAqIDAuOSk7XG4vLyAgICAgICAgICAgICAgICAgaGl0IC09IGZnZF9oaXQ7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBoaXQgPSB0aGlzLmhpdF9sYXN0KGlpZCwgZmlpZCwgZ3poaXQuYmpoaXQpO1xuLy8gICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBmaWlkLCBcImVmZmVjdFwiLCBbXCJiYW9qaVwiLCAtMSAqIGhpdF0pO1xuLy8gICAgICAgICAgICAgdGhpcy50aW1lcl9kbygyMDMsIHsgZG9faWlkOiBOdW1iZXIoaWlkKSwgaGl0OiBoaXQsIGlzQmo6IGhpdCB9KTsgLy/mmrTlh7vop6blj5Fcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIC8v5pmu6YCa5pS75Ye7XG4vLyAgICAgICAgIGlmIChpc05leHQgPT0gMSkge1xuLy8gICAgICAgICAgICAgbGV0IGlzR2QgPSB0aGlzLmlzR2VkYW5nKGlpZCwgZmlpZCk7IC8vIOagvOaMoVxuLy8gICAgICAgICAgICAgaWYgKGlzR2QpIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGZpaWQsIFwiZWZmZWN0XCIsIFtcImJsb2NrXCIsIDFdKTtcbi8vICAgICAgICAgICAgICAgICBsZXQgZl9xaGJsb2NrOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJxaGJsb2NrXCIpO1xuLy8gICAgICAgICAgICAgICAgIGxldCBmZ2RfaGl0OiBudW1iZXIgPSBNYXRoLm1pbihnemhpdC5mamhpdCAqIE1hdGgubWF4KDAuMTIsIChmX3FoYmxvY2sgLSBpX3JoYmxvY2spIC8gMTAwMDApLCBnemhpdC5mamhpdCAqIDAuOSk7XG4vLyAgICAgICAgICAgICAgICAgaGl0IC09IGZnZF9oaXQ7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBoaXQgPSB0aGlzLmhpdF9sYXN0KGlpZCwgZmlpZCwgaGl0KTtcbi8vICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgZmlpZCwgXCJlZmZlY3RcIiwgW1wiZmFuamlcIiwgLTEgKiBoaXRdKTtcbi8vICAgICAgICAgICAgIHRoaXMudGltZXJfZG8oMjAzLCB7IGRvX2lpZDogTnVtYmVyKGlpZCksIGhpdDogaGl0LCBpc0JqOiBoaXQgfSk7IC8v5pq05Ye76Kem5Y+RXG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICAvL+WQuOihgOeOhz1tYXjvvIgo5oiR5pa55ZC46KGALeaVjOaWueaKl+WQuOihgO+8ie+8jOWQuOihgOS/neW6leWPguaVsClcbi8vICAgICAgICAgLy/lkLjooYDlgLw9XHTmnIDnu4jkvKTlrrPlgLwqbWF4KOaIkeaWueWQuOihgOWinuW8ui3mlYzmlrnlkLjooYDlh4/lvLEsMSkq5ZC46KGA546HXG4vLyAgICAgICAgIGxldCBpX3hpeHVlOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcInhpeHVlXCIpO1xuLy8gICAgICAgICBsZXQgZl9oc3hpeHVlOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJoc3hpeHVlXCIpO1xuLy8gICAgICAgICBsZXQgYmR4aXh1ZTogbnVtYmVyID0gMDsgLy/kv53lupXlkLjooYBcbi8vICAgICAgICAgbGV0IGNmZyA9IEdhbWVjZmcudXNlckVwLmdldEl0ZW0oXCJ4aXh1ZVwiKTtcbi8vICAgICAgICAgaWYgKGNmZyAhPSBudWxsKSB7XG4vLyAgICAgICAgICAgICBiZHhpeHVlID0gY2ZnLmluaXRFcDtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBsZXQgeHhSYXRlOiBudW1iZXIgPSBNYXRoLm1heChpX3hpeHVlIC0gZl9oc3hpeHVlLCBiZHhpeHVlKTtcbi8vICAgICAgICAgbGV0IGlfcWh4aXh1ZTogbnVtYmVyID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJxaHhpeHVlXCIpO1xuLy8gICAgICAgICBsZXQgZl9yaHhpeHVlOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJyaHhpeHVlXCIpO1xuLy8gICAgICAgICBsZXQgeHhfaGl0OiBudW1iZXIgPSBNYXRoLmZsb29yKChnemhpdC5mamhpdCAqIE1hdGgubWF4KChpX3FoeGl4dWUgLSBmX3JoeGl4dWUpIC8gMTAwMDAgKyAxLCAxKSAqIHh4UmF0ZSkgLyAxMDAwMCk7XG5cbi8vICAgICAgICAgLy/mmK/lkKblkLjooYBcbi8vICAgICAgICAgaWYgKHh4X2hpdD4wKSB7XG4vLyAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGlpZCwgXCJlZmZlY3RcIiwgW1wiaHBcIiwgeHhfaGl0XSk7XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICB0aGlzLnRpbWVyX2RvKDIwNCwgeyBkb19paWQ6IE51bWJlcihpaWQpLCBoaXQ6IGhpdCB9KTsgLy/lj43lh7vop6blj5FcblxuLy8gICAgICAgICBpZiAoaXNFcGZqKSB7XG4vLyAgICAgICAgICAgICAvLyDlj43lh7vojrflvpdidWZmXG4vLyAgICAgICAgICAgICBsZXQgc2tpZHM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXModGhpcy50ZWFtc1tpaWRdLnNrKTtcbi8vICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBza2lkcy5sZW5ndGg7IGluZGV4KyspIHtcbi8vICAgICAgICAgICAgICAgICBsZXQgY2ZnU2sgPSBHYW1lY2ZnLnNraWxsQmFzZS5nZXRJdGVtKHNraWRzW2luZGV4XSwgXCIxXCIpO1xuLy8gICAgICAgICAgICAgICAgIGlmIChjZmdTayAmJiBjZmdTay5ydW5TdGF0dXMgPT09IDcpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNmZ1NrLmVmZmVjdC5sZW5ndGg7IGluZGV4KyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlZmZlY3RJZCA9IGNmZ1NrLmVmZmVjdFtpbmRleF07XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChmaWlkLCBza2lkc1tpbmRleF0sIGVmZmVjdElkLnRvU3RyaW5nKCksIFwiXCIsIHsgaGl0OiBoaXQgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICB9XG4vLyAgICAgLyoqXG4vLyAgICAgICog5Ye65omLKOWQjilcbi8vICAgICAgKi9cbi8vICAgICBwcml2YXRlIHBrX3poZW5fb3ZlcigpIHtcbi8vICAgICAgICAgLy/mrbvkuqHop6blj5Fcbi8vICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMudGVhbUZpaWRzLmxlbmd0aDsgaW5kZXgrKykge1xuLy8gICAgICAgICAgICAgbGV0IGZpaWQgPSB0aGlzLnRlYW1GaWlkc1tpbmRleF07XG4vLyAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMudGVhbXNbZmlpZF0uaXNIaWRlKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbZmlpZF0uZXBzLmhwID4gMCkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+i/mOa0u+edgFxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbZmlpZF0uZHpoZW4gPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5LmL5YmN5bey57uP5q275LqGXG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB0aGlzLnV1aWRzW2ZpaWRdLmR6aGVuID0gdGhpcy56aGVuOyAvL+mCo+S4gOW4p+atu+S6hlxuLy8gICAgICAgICAgICAgdGhpcy50ZWFtc1tmaWlkXS5lcHMuaHAgPSAwO1xuLy8gICAgICAgICAgICAgdGhpcy50aW1lcl9kbyg0MDIsIHsgZG9faWlkOiBOdW1iZXIoZmlpZCkgfSk7IC8v5q275Lqh6Kem5Y+RXG5cbi8vICAgICAgICAgICAgIHRoaXMuamllc3VvX2hpZGUoZmlpZCk7XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICAvL+a4hemZpOi/h+acn2J1ZmZcbi8vICAgICAgICAgdGhpcy5za2J1ZmZfY2xlYXIoKTtcbi8vICAgICB9XG5cbi8vICAgICAvKipcbi8vICAgICAgKiDljZXmrKHlh7rmiYvkuLTml7blrZjlgqjkv6Hmga8gLSDorrDlvZVcbi8vICAgICAgKi9cbi8vICAgICBhZGRPbmVBdGsoaWlkOiBzdHJpbmcsIGZpaWQ6IHN0cmluZywga2V5OiBzdHJpbmcsIHZhbDogYW55LCBza2lkOiBzdHJpbmcgPSBcIlwiKSB7XG4vLyAgICAgICAgIGlmICghdGhpcy5vbmVBdGtpaWRzLmluY2x1ZGVzKGlpZCkpIHtcbi8vICAgICAgICAgICAgIHRoaXMub25lQXRraWlkcy5wdXNoKGlpZCk7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgLy/liJ3lp4vljJZcbi8vICAgICAgICAgaWYgKHRoaXMub25lQXRrW2lpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgdGhpcy5vbmVBdGtbaWlkXSA9IHt9O1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmICh0aGlzLnV1aWRzW2lpZF0uZHpoZW4gPiAwICYmIHRoaXMudXVpZHNbaWlkXS5kemhlbiA8IHRoaXMuemhlbikge1xuLy8gICAgICAgICAgICAgcmV0dXJuOyAvL+W3sue7j+atu+S6hiAs5LiN6KaB5Zyo5oqY6IW+5LqGXG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgaWYgKHRoaXMudXVpZHNbZmlpZF0uZHpoZW4gPiAwICYmIHRoaXMudXVpZHNbZmlpZF0uZHpoZW4gPCB0aGlzLnpoZW4pIHtcbi8vICAgICAgICAgICAgIHJldHVybjsgLy/lt7Lnu4/mrbvkuoYgLOS4jeimgeWcqOaKmOiFvuS6hlxuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmICh0aGlzLm9uZUF0a1tpaWRdW2ZpaWRdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgIHRoaXMub25lQXRrW2lpZF1bZmlpZF0gPSB7XG4vLyAgICAgICAgICAgICAgICAgYVR5cGU6IFh5cy5BY3Rpb25UeXBlLmRlZmF1bHQsIC8v5Yqo5L2c57G75Z6LXG4vLyAgICAgICAgICAgICAgICAgYVNraWQ6IFwiXCIsIC8v5L2/55So55qE5oqA6IO9SURcbi8vICAgICAgICAgICAgICAgICBlZmZlY3Q6IFtdLFxuLy8gICAgICAgICAgICAgICAgIGJ1ZmY6IFtdLFxuLy8gICAgICAgICAgICAgfTtcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIC8v55uu5qCH5rK755aX5pWI5p6c6ZmN5L2OL+WinuWKoFxuLy8gICAgICAgICBpZiAodmFsWzBdID09IFwiaHBcIiAmJiB2YWxbMV0gPiAwICYmIHRoaXMuc2tidWZmX2dldChmaWlkLCBcImVmZmVjdF9pXzYyXCIsIDIpID4gMCkge1xuLy8gICAgICAgICAgICAgbGV0IGZfaV82MiA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImlfNjJcIik7XG4vLyAgICAgICAgICAgICB2YWxbMV0gKz0gTWF0aC5mbG9vcigodmFsWzFdICogZl9pXzYyKSAvIDEwMDAwKTtcbi8vICAgICAgICAgICAgIHZhbFsxXSA9IE1hdGgubWF4KDAsIHZhbFsxXSk7XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICAvL+WNleasoeS8pOWus+S4jei2hei/h+iHqui6q+acgOWkp+eUn+WRveWAvOeahHglXG4vLyAgICAgICAgIGlmICh0aGlzLnh1ZWt1LmluY2x1ZGVzKHZhbFswXSkgJiYgdmFsWzFdIDwgMCkge1xuLy8gICAgICAgICAgICAgbGV0IGZfaV83MSA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcIm1heF9pXzcxXCIpO1xuLy8gICAgICAgICAgICAgaWYgKGZfaV83MSA+IDAgJiYgTWF0aC5hYnModmFsWzFdKSA+IGZfaV83MSAmJiB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJtYXhfaV83MV9uWmhlblwiKSA8PSB0aGlzLnpoZW4pIHtcbi8vICAgICAgICAgICAgICAgICBsZXQgbWF4X2lfNzFfY2QgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJtYXhfaV83MV9jZFwiKTtcbi8vICAgICAgICAgICAgICAgICBpZiAobWF4X2lfNzFfY2QgPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX3VwZGF0ZShmaWlkLCB7IG1heF9pXzcxX25aaGVuOiB0aGlzLnpoZW4gKyBtYXhfaV83MV9jZCAqIDMwIH0pO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICB2YWxbMV0gPSAtZl9pXzcxO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG5cbi8vICAgICAgICAgLy/nu5/orqFcbi8vICAgICAgICAgaWYgKHRoaXMub3V0Zi50b25namlbZmlpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgdGhpcy5vdXRmLnRvbmdqaVtmaWlkXSA9IHtcbi8vICAgICAgICAgICAgICAgICBzaHVjaHU6IDAsIC8v6L6T5Ye6XG4vLyAgICAgICAgICAgICAgICAgemhpbGlhbzogMCwgLy/msrvnlpdcbi8vICAgICAgICAgICAgICAgICBjaGVuZ3NoYW5nOiAwLCAvL+aJv+S8pFxuLy8gICAgICAgICAgICAgfTtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBpZiAodGhpcy5vdXRmLnRvbmdqaVtpaWRdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgIHRoaXMub3V0Zi50b25namlbaWlkXSA9IHtcbi8vICAgICAgICAgICAgICAgICBzaHVjaHU6IDAsIC8v6L6T5Ye6XG4vLyAgICAgICAgICAgICAgICAgemhpbGlhbzogMCwgLy/msrvnlpdcbi8vICAgICAgICAgICAgICAgICBjaGVuZ3NoYW5nOiAwLCAvL+aJv+S8pFxuLy8gICAgICAgICAgICAgfTtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBzd2l0Y2ggKGtleSkge1xuLy8gICAgICAgICAgICAgY2FzZSBcImFUeXBlXCI6IC8v5Yqo5L2c57G75Z6LXG4vLyAgICAgICAgICAgICAgICAgLy/lt7Lnu4/mmK/mlLvlh7vnsbvlnovvvIwg5bCx5LiN6KaB5YaN5pS55LqGXG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25lQXRrW2lpZF1bZmlpZF0uYVR5cGUgIT0gWHlzLkFjdGlvblR5cGUuYXRrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMub25lQXRrW2lpZF1bZmlpZF0uYVR5cGUgPSB2YWw7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgY2FzZSBcImFTa2lkXCI6IC8v5L2/55So55qE5oqA6IO9SURcbi8vICAgICAgICAgICAgICAgICB0aGlzLm9uZUF0a1tpaWRdW2ZpaWRdLmFTa2lkID0gdmFsO1xuLy8gICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgY2FzZSBcImVmZmVjdFwiOiAvL+eJueaViFxuLy8gICAgICAgICAgICAgICAgIHRoaXMub25lQXRrW2lpZF1bZmlpZF0uZWZmZWN0LnB1c2godmFsKTtcbi8vICAgICAgICAgICAgICAgICBpZiAodGhpcy54dWVrdS5pbmNsdWRlcyh2YWxbMF0pICYmIHZhbFsxXSA8IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgLy/nu5/orqFcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5vdXRmLnRvbmdqaVtpaWRdLnNodWNodSArPSBNYXRoLmFicyh2YWxbMV0pO1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLm91dGYudG9uZ2ppW2ZpaWRdLmNoZW5nc2hhbmcgKz0gTWF0aC5hYnModmFsWzFdKTtcblxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgbWFpbl9paWQgPSBmaWlkLmxlbmd0aCA+IDMgPyBcIjEwMDBcIiA6IFwiMTAwXCI7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChOdW1iZXIoZmlpZCkgJSAxMDAgPCAxMCAmJiB0aGlzLnV1aWRzW21haW5faWlkXSAmJiB0aGlzLnV1aWRzW21haW5faWlkXS5kcmFpbl9zayA+IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjZmdNYXRoID0gR2FtZWNmZy5tYXRoSW5mby5nZXRJdGVtKFwiYmF0dGxlX2xpbmdsaVwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZmdNYXRoICE9IG51bGwgJiYgY2ZnTWF0aC5wcmFtLml0ZW1zICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGxtaW4gPSBjZmdNYXRoLnByYW0uaXRlbXNbMF1bMF07XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxsTWF4ID0gY2ZnTWF0aC5wcmFtLml0ZW1zWzBdWzFdO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkX21wKG1haW5faWlkLCB0aGlzLnNlZWRSYW5kLnJhbmQobGxtaW4sIGxsTWF4KSwgMik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMueHVla3UuaW5jbHVkZXModmFsWzBdKSAmJiB2YWxbMV0gPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIC8v57uf6K6hXG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMub3V0Zi50b25namlbZmlpZF0uemhpbGlhbyArPSBNYXRoLmFicyh2YWxbMV0pO1xuXG4vLyAgICAgICAgICAgICAgICAgICAgIC8v5Zue6KGA6Kem5Y+R77yI5rK755aX6Kem5Y+RL+WQuOihgOinpuWPkS0t6L+ZM+S4quaYr+S4gOS4quaEj+aAne+8iVxuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyX2RvKDQwMywgeyBkb19paWQ6IE51bWJlcihmaWlkKSB9KTtcbi8vICAgICAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgIGNhc2UgXCJidWZmXCI6IC8vYnVmZlxuLy8gICAgICAgICAgICAgICAgIHRoaXMub25lQXRrW2lpZF1bZmlpZF0uYnVmZi5wdXNoKHZhbCk7XG4vLyAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgIH1cbi8vICAgICB9XG5cbi8vICAgICAvKipcbi8vICAgICAgKiDlvZPliY3liankvZnooYDph49cbi8vICAgICAgKi9cbi8vICAgICBqdWVGaWlkSHAoZmlpZDogc3RyaW5nKSB7XG4vLyAgICAgICAgIGxldCBsc2ZfaHA6IG51bWJlciA9IHRoaXMudGVhbXNbZmlpZF0uZXBzLmhwO1xuLy8gICAgICAgICBsZXQgaWlkcyA9IE9iamVjdC5rZXlzKHRoaXMub25lQXRrKTtcbi8vICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpaWRzLmxlbmd0aDsgaSsrKSB7XG4vLyAgICAgICAgICAgICBpZiAodGhpcy5vbmVBdGtbaWlkc1tpXV1bZmlpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCB0aGlzLm9uZUF0a1tpaWRzW2ldXVtmaWlkXS5lZmZlY3QubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICBpZiAodGhpcy54dWVrdS5pbmNsdWRlcyh0aGlzLm9uZUF0a1tpaWRzW2ldXVtmaWlkXS5lZmZlY3Rba11bMF0pKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGxzZl9ocCArPSB0aGlzLm9uZUF0a1tpaWRzW2ldXVtmaWlkXS5lZmZlY3Rba11bMV07XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGxzZl9ocCA9IE1hdGgubWluKGxzZl9ocCwgdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBfbWF4XCIpKTtcbi8vICAgICAgICAgcmV0dXJuIGxzZl9ocDtcbi8vICAgICB9XG5cbi8vICAgICAvKipcbi8vICAgICAgKiDljZXmrKHlh7rmiYvkuLTml7blrZjlgqjkv6Hmga8gLSDnu5Pnrpdcbi8vICAgICAgKi9cbi8vICAgICBqdWVTdWFuT25lQXRrKCkge1xuLy8gICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMub25lQXRrKSA9PSB0cnVlKSB7XG4vLyAgICAgICAgICAgICByZXR1cm47XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgLy8g57uT566X5YmN5Yik5a6a5Li76KeS5piv5ZCm5q275LqhIOW5tuS4lOaYr+WQpuaLpeacieWkjea0u2J1ZmYg5aSN5rS7YnVmZuinpuWPkeW4p+aYr+WQpueUn+aViFxuLy8gICAgICAgICBsZXQgaWlkcyA9IFtcIjEwMFwiLFwiMTAwMFwiXTtcbi8vICAgICAgICAgZm9yIChsZXQgaT0wO2k8aWlkcy5sZW5ndGg7aSsrKXtcbi8vICAgICAgICAgICAgIGxldCBpaWQgPSBpaWRzW2ldO1xuLy8gICAgICAgICAgICAgbGV0IGhwID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJocFwiKTtcbi8vICAgICAgICAgICAgIGlmIChocCA8PSAwICYmIHRoaXMuc2tidWZmX2dldChpaWQsIFwiZWZmZWN0X2lfNjNcIiwgMikgPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgbGV0IGlfNjNfY2QgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImlfNjNfY2RcIilcbi8vICAgICAgICAgICAgICAgICBpZiAoaV82M19jZCA+IDApeyAgIC8vIOatu+S6oeWQjuW7tui/n3jluKflpI3mtLtcbi8vICAgICAgICAgICAgICAgICAgICAgLy90aGlzLnNrYnVmZl91cGRhdGUoaWlkLCB7IFwiaV82M19jZFwiOi1pXzYzX2NkLFwiaV82M19uWmhlblwiOiB0aGlzLnpoZW4gKyBpXzYzX2NkIH0pO1xuLy8gICAgICAgICAgICAgICAgIH1lbHNlIGlmICh0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImlfNjNfblpoZW5cIikgPD0gdGhpcy56aGVuKXtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGFkZEhwID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJpXzYzX2hwXCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoYWRkSHAgPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9zdWJfYWxsKGlpZCxcImVmZmVjdF9pXzYzXCIpXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGlpZCwgXCJhVHlwZVwiLCBYeXMuQWN0aW9uVHlwZS5lZmZlY3QpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiZWZmZWN0XCIsIFtcImhwXCIsIGFkZEhwIC0gaHBdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfVxuLy8gICAgICAgICAvL+aUu+aJk+aWuVxuLy8gICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub25lQXRraWlkcy5sZW5ndGg7IGkrKykge1xuLy8gICAgICAgICAgICAgbGV0IGlfYnVmZjogW3N0cmluZywgbnVtYmVyXVtdID0gW107XG4vLyAgICAgICAgICAgICBsZXQgaV9lZmZlY3Q6IFtzdHJpbmcsIG51bWJlcl1bXSA9IFtdO1xuLy8gICAgICAgICAgICAgbGV0IHRhcmdldDogWHlzLkxvZ09uZURhdGFbXSA9IFtdO1xuLy8gICAgICAgICAgICAgbGV0IGZpaWRzID0gT2JqZWN0LmtleXModGhpcy5vbmVBdGtbdGhpcy5vbmVBdGtpaWRzW2ldXSk7XG4vLyAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGZpaWRzLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgbGV0IGNoYWhwOiBudW1iZXIgPSAwO1xuLy8gICAgICAgICAgICAgICAgIC8v6K6h566X6KGA6YeP5ZKM5Lyk5a6zXG4vLyAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLm9uZUF0a1t0aGlzLm9uZUF0a2lpZHNbaV1dW2ZpaWRzW2tdXS5lZmZlY3QubGVuZ3RoOyBqKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGVmZmVjdCA9IHRoaXMub25lQXRrW3RoaXMub25lQXRraWlkc1tpXV1bZmlpZHNba11dLmVmZmVjdFtqXTtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMueHVla3UuaW5jbHVkZXMoZWZmZWN0WzBdKSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE51bWJlcihmaWlkc1trXSkgPCAxMDAwICYmIGVmZmVjdFsxXSA8IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm91dGYuaHVydCArPSBNYXRoLmFicyhlZmZlY3RbMV0pOyAvL+iuoeeul+S8pOWus1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVmZmVjdFsxXSA8IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+aJo+ihgOaJp+ihjFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJfZG8oNDAxLCB7IGRvX2lpZDogTnVtYmVyKGZpaWRzW2tdKSwgaGl0OiBNYXRoLmFicyhlZmZlY3RbMV0pIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJfZG8oNDA0LCB7IGRvX2lpZDogTnVtYmVyKGZpaWRzW2tdKSwgaGl0OiBNYXRoLmFicyhlZmZlY3RbMV0pIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJfZG8oNDA1LCB7IGRvX2lpZDogTnVtYmVyKHRoaXMub25lQXRraWlkc1tpXSksIGhpdDogTWF0aC5hYnMoZWZmZWN0WzFdKSB9KTsgLy/mlYzmlrnmiaPooYAg5oiR5pa55YqgYnVmZlxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbZmlpZHNba11dLmVwcy5ocCArIGNoYWhwICsgZWZmZWN0WzFdIDwgMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOacgOWQjuS4gOS4iyDlpoLmnpzlr7nmlrnooqvmiZPmrbvkuoYg5Lyk5a6z5LiN6IO96LaF6L+H5a+55pa56KGA6YePXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0WzFdID0gLSh0aGlzLnRlYW1zW2ZpaWRzW2tdXS5lcHMuaHAgKyBjaGFocCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWZmZWN0WzFdID09IDAgJiYgdGhpcy50ZWFtc1tmaWlkc1trXV0uZXBzLmhwICsgY2hhaHAgPT0gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWmguaenOW3sue7j+iiq+aJk+atu+S6hiDliKDmjonov5nkuKrlvbHlk41cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uZUF0a1t0aGlzLm9uZUF0a2lpZHNbaV1dW2ZpaWRzW2tdXS5lZmZlY3Quc3BsaWNlKGosIDEpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGotLTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNoYWhwICs9IGVmZmVjdFsxXTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICB0aGlzLnRlYW1zW2ZpaWRzW2tdXS5lcHMuaHAgKz0gY2hhaHA7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy50ZWFtc1tmaWlkc1trXV0uZXBzLmhwID0gTWF0aC5taW4odGhpcy5za2J1ZmZfZ2V0KGZpaWRzW2tdLCBcImhwX21heFwiKSwgdGhpcy50ZWFtc1tmaWlkc1trXV0uZXBzLmhwKTtcblxuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uZUF0a2lpZHNbaV0gPT0gZmlpZHNba10pIHtcbi8vICAgICAgICAgICAgICAgICAgICAgaV9idWZmID0gdGhpcy5vbmVBdGtbdGhpcy5vbmVBdGtpaWRzW2ldXVtmaWlkc1trXV0uYnVmZjtcbi8vICAgICAgICAgICAgICAgICAgICAgaV9lZmZlY3QgPSB0aGlzLm9uZUF0a1t0aGlzLm9uZUF0a2lpZHNbaV1dW2ZpaWRzW2tdXS5lZmZlY3Q7XG4vLyAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlkOiB0aGlzLnRlYW1zW2ZpaWRzW2tdXS5maWQsIC8v5Ye65omL5pa5SWRcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlpZDogZmlpZHNba10sIC8v6Zi15a655LiL5qCHXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBocDogdGhpcy50ZWFtc1tmaWlkc1trXV0uZXBzLmhwLCAvL+WJqeS9meihgOmHj1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbXA6IHRoaXMudGVhbXNbZmlpZHNba11dLmVwcy5tcCwgLy/liankvZnmgJLmsJRcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmY6IHRoaXMub25lQXRrW3RoaXMub25lQXRraWlkc1tpXV1bZmlpZHNba11dLmJ1ZmYsIC8vWyBb55Sf5pWI5bin5byA5aeL77yM55Sf5pWI5bin57uT5p2fLGJ1ZmZLRVks6Kem5Y+R55qE5Lq6XV1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdDogdGhpcy5vbmVBdGtbdGhpcy5vbmVBdGtpaWRzW2ldXVtmaWlkc1trXV0uZWZmZWN0LCAvL+inpuWPkeaViOaenCBbIFvlsZ7mgKdrZXks5pWw5YC8XV1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRvbmdqaTpNYXRoLmFicyh0aGlzLm91dGYudG9uZ2ppW2ZpaWRzW2tdXT8uc2h1Y2h1IHwgMCksXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB6b25qaTowXG4vLyAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICB0aGlzLm9uZUF0a1t0aGlzLm9uZUF0a2lpZHNbaV1dW2ZpaWRzW2tdXS5lZmZlY3QgPSBbXTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIHRoaXMudGVhbXNbdGhpcy5vbmVBdGtpaWRzW2ldXS5lcHMuaHAgPSBNYXRoLm1pbih0aGlzLnRlYW1zW3RoaXMub25lQXRraWlkc1tpXV0uZXBzLmhwLCB0aGlzLnNrYnVmZl9nZXQodGhpcy5vbmVBdGtpaWRzW2ldLCBcImhwX21heFwiKSk7XG4vLyAgICAgICAgICAgICAvLyDmiorlm57ooYDlkIjlubZcbi8vICAgICAgICAgICAgIGxldCBpX2VmZmVjdDI6W3N0cmluZywgbnVtYmVyXVtdID0gW11cbi8vICAgICAgICAgICAgIGxldCBqaXN1YW46e1trZXk6c3RyaW5nXTpudW1iZXJ9ID0ge31cbi8vICAgICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgaV9lZmZlY3Qpe1xuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLnh1ZWt1LmluY2x1ZGVzKGl0ZW1bMF0pICYmIGl0ZW1bMV0gPiAwKXsgICAvL+WxnuS6juWbnuihgOWtl+auteW5tuS4lOWAvOWkp+S6jjBcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGppc3VhbltpdGVtWzBdXSA9PSBudWxsKXtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGppc3VhbltpdGVtWzBdXSA9IGl0ZW1bMV1cbi8vICAgICAgICAgICAgICAgICAgICAgfWVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgamlzdWFuW2l0ZW1bMF1dICs9IGl0ZW1bMV1cbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH1lbHNle1xuLy8gICAgICAgICAgICAgICAgICAgICBpX2VmZmVjdDIucHVzaChpdGVtKVxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBqaXN1YW4pe1xuLy8gICAgICAgICAgICAgICAgIGlfZWZmZWN0Mi5wdXNoKFtrZXksamlzdWFuW2tleV1dKVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgLy/liJ3lp4vljJZcbi8vICAgICAgICAgICAgIGxldCBhdGtlcjogWHlzLkxvZ09uZURhdGEgPSB7XG4vLyAgICAgICAgICAgICAgICAgZmlkOiB0aGlzLnRlYW1zW3RoaXMub25lQXRraWlkc1tpXV0uZmlkLCAvL+WHuuaJi+aWuUlkXG4vLyAgICAgICAgICAgICAgICAgaWlkOiB0aGlzLm9uZUF0a2lpZHNbaV0sIC8v6Zi15a655LiL5qCHXG4vLyAgICAgICAgICAgICAgICAgaHA6IHRoaXMudGVhbXNbdGhpcy5vbmVBdGtpaWRzW2ldXS5lcHMuaHAsIC8v5Ymp5L2Z6KGA6YePXG4vLyAgICAgICAgICAgICAgICAgbXA6IHRoaXMudGVhbXNbdGhpcy5vbmVBdGtpaWRzW2ldXS5lcHMubXAsIC8v5Ymp5L2Z5oCS5rCUXG4vLyAgICAgICAgICAgICAgICAgYnVmZjogaV9idWZmLCAvL1sgW+eUn+aViOW4p+W8gOWni++8jOeUn+aViOW4p+e7k+adnyxidWZmS0VZLOinpuWPkeeahOS6ul1dXG4vLyAgICAgICAgICAgICAgICAgZWZmZWN0OiBpX2VmZmVjdDIsIC8v6Kem5Y+R5pWI5p6cIFsgW+WxnuaAp2tleSzmlbDlgLxdXVxuLy8gICAgICAgICAgICAgICAgIHRvbmdqaTpNYXRoLmFicyh0aGlzLm91dGYudG9uZ2ppW3RoaXMub25lQXRraWlkc1tpXV0/LnNodWNodSB8IDApLFxuLy8gICAgICAgICAgICAgICAgIHpvbmppOjBcbi8vICAgICAgICAgICAgIH07XG4vLyAgICAgICAgICAgICBpZiAoXG4vLyAgICAgICAgICAgICAgICAgdGhpcy5vbmVBdGtbdGhpcy5vbmVBdGtpaWRzW2ldXVt0aGlzLm9uZUF0a2lpZHNbaV1dICE9IG51bGwgJiZcbi8vICAgICAgICAgICAgICAgICB0aGlzLm9uZUF0a1t0aGlzLm9uZUF0a2lpZHNbaV1dW3RoaXMub25lQXRraWlkc1tpXV0uYVR5cGUgIT0gWHlzLkFjdGlvblR5cGUuZGVmYXVsdFxuLy8gICAgICAgICAgICAgKSB7XG4vLyAgICAgICAgICAgICAgICAgLy/mt7vliqDml6Xlv5dcbi8vICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUxvZyh7XG4vLyAgICAgICAgICAgICAgICAgICAgIGFUeXBlOiB0aGlzLm9uZUF0a1t0aGlzLm9uZUF0a2lpZHNbaV1dW3RoaXMub25lQXRraWlkc1tpXV0uYVR5cGUsIC8v5oiY5paX5Yqo5L2c57G75Z6LXG4vLyAgICAgICAgICAgICAgICAgICAgIGFTa2lkOiB0aGlzLm9uZUF0a1t0aGlzLm9uZUF0a2lpZHNbaV1dW3RoaXMub25lQXRraWlkc1tpXV0uYVNraWQsIC8v5L2/55So55qE5oqA6IO9SURcbi8vICAgICAgICAgICAgICAgICAgICAgZmhwOiAwLFxuLy8gICAgICAgICAgICAgICAgICAgICBhdGtlcjogYXRrZXIsIC8v5Ye65omL5pa5XG4vLyAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0LCAvL+ebruagh1xuLy8gICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHRoaXMub25lQXRrID0ge307XG4vLyAgICAgICAgIHRoaXMub25lQXRraWlkcyA9IFtdO1xuLy8gICAgIH1cblxuLy8gICAgIC8qKlxuLy8gICAgICAqIOaImOaWl+aXpeW/l1xuLy8gICAgICAqL1xuLy8gICAgIGFkZE9uZUxvZyhsb2c6IFh5cy5maWdodExvZ09uZSkge1xuLy8gICAgICAgICBsb2cuZmhwID0gMDtcbi8vICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMudGVhbUZpaWRzLmxlbmd0aDsgaW5kZXgrKykge1xuLy8gICAgICAgICAgICAgbGV0IGZpaWQgPSB0aGlzLnRlYW1GaWlkc1tpbmRleF07XG4vLyAgICAgICAgICAgICAvL+e7n+iuoeWvueaWueWJqeS9meaAu+ihgOmHjyBpbuayoeWFs+ezu1xuLy8gICAgICAgICAgICAgaWYgKE51bWJlcihmaWlkKSA+PSAxMDAwKSB7XG4vLyAgICAgICAgICAgICAgICAgY29udGludWU7IC8v6Ieq5bex5Lq6XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXS5pc0hpZGUgIT0gMCkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj+S4jeeuoVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbZmlpZF0udHlwZSA9PSAzKSB7XG4vLyAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5YW954G15LiN566hXG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXS5lcHMuaHAgPCAxKSB7XG4vLyAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5q275LqG5LiN566hXG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBsb2cuZmhwICs9IHRoaXMudGVhbXNbZmlpZF0uZXBzLmhwO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHRoaXMub3V0Zi5sb2dbdGhpcy56aGVuXS5wdXNoKGxvZyk7XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog5oiY5paX5pel5b+XXG4vLyAgICAgICovXG4vLyAgICAgb3Zlcl9iYWNrKCk6IFh5cy5PdmVyQmFjayB7XG4vLyAgICAgICAgIHRoaXMub3V0Zi5ocCA9IDA7XG4vLyAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnRlYW1GaWlkcy5sZW5ndGg7IGluZGV4KyspIHtcbi8vICAgICAgICAgICAgIGxldCBmaWlkID0gdGhpcy50ZWFtRmlpZHNbaW5kZXhdO1xuLy8gICAgICAgICAgICAgaWYgKGZpaWQubGVuZ3RoIDw9IDMgJiYgdGhpcy50ZWFtc1tmaWlkXS5lcHMuaHAgPiAwICYmIHRoaXMudGVhbXNbZmlpZF0uaXNIaWRlID09IDApIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLm91dGYuaHAgKz0gdGhpcy50ZWFtc1tmaWlkXS5lcHMuaHA7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgdGhpcy5vdXRmLnN0YXJ0LnRlYW1zID0gdGhpcy50ZWFtcztcbi8vICAgICAgICAgcmV0dXJuIHRoaXMub3V0Zjtcbi8vICAgICB9XG5cbi8vICAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbi8vICAgICAvKipcbi8vICAgICAgKiDovoXliqnlh73mlbAgLSDojrflj5blr7nmiYtcbi8vICAgICAgKiBAcGFyYW0ga2V5IOagh+ivhmtleVxuLy8gICAgICAqIEBwYXJhbSBpaWQg5Ye65omL5pa5XG4vLyAgICAgICogQHBhcmFtIHR0eXBlICDvvIgx5pWM5pa55YWo5L2T77yMMuWJjeaOkuaVjOaWue+8jDPkuK3mjpLmlYzmlrnvvIw05ZCO5o6S5pWM5pa577yMNeaVjOaWuemaj+acuu+8jDboh6rlt7HvvIw35bey5pa55YWo5L2T77yMOOW3suaWuemaj+acuu+8iVxuLy8gICAgICAqIEBwYXJhbSB0YXJnZXRUeXBlIOebruagh+aVsOmHj1xuLy8gICAgICAqL1xuLy8gICAgIHByaXZhdGUgZmluZF9maWlkcyhrZXk6IHN0cmluZywgaWlkOiBzdHJpbmcsIHR0eXBlOiBudW1iZXJbXSwgdGFyZ2V0VHlwZTogbnVtYmVyLCBkaXN0YW5jZTogbnVtYmVyID0gMCkge1xuLy8gICAgICAgICBpZiAodHR5cGUubGVuZ3RoIDw9IDApIHtcbi8vICAgICAgICAgICAgIHJldHVybjsgLy/msr/nlKjkuIrkuIDmrKHnmoQg5Y+v6IO95rKh5pyJ5LiK5LiA5qyhXG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgaWYgKHRoaXMub25lRmlpZHNbaWlkXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICB0aGlzLm9uZUZpaWRzW2lpZF0gPSB7fTtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBsZXQgZmlpZHM6IHN0cmluZ1tdID0gW107XG4vLyAgICAgICAgIHRoaXMub25lRmlpZHNbaWlkXVtrZXldID0gW107IC8v6YeN572uIOmHjeaWsOiOt+WPllxuXG4vLyAgICAgICAgIC8v55uu5qCH5omT5Ye76aG65bqPXG4vLyAgICAgICAgIGNvbnN0IG1ibGlzdDogeyBbbXViaWFvOiBzdHJpbmddOiB7IFt5dTogc3RyaW5nXTogbnVtYmVyW10gfSB9ID0ge1xuLy8gICAgICAgICAgICAgXCIxXCI6IHtcbi8vICAgICAgICAgICAgICAgICAvLzHmlYzmlrnlhajkvZMgICA15pWM5pa56ZqP5py6IDflt7LmlrnlhajkvZMgOOW3suaWuemaj+aculxuLy8gICAgICAgICAgICAgICAgIFwiMFwiOiBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMF0sXG4vLyAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgXCIyXCI6IHtcbi8vICAgICAgICAgICAgICAgICAvLzLliY3mjpLmlYzmlrlcbi8vICAgICAgICAgICAgICAgICBcIjBcIjogWzIsIDEsIDMsIDEzLCAxNF0sXG4vLyAgICAgICAgICAgICAgICAgXCIyXCI6IFsyLCAxLCAzLCAxMywgMTRdLFxuLy8gICAgICAgICAgICAgICAgIFwiNVwiOiBbMiwgMSwgMywgMTMsIDE0XSxcbi8vICAgICAgICAgICAgICAgICBcIjhcIjogWzIsIDEsIDMsIDEzLCAxNF0sXG4vLyAgICAgICAgICAgICAgICAgXCIxXCI6IFszLCAyLCAxNCwgMSwgMTNdLFxuLy8gICAgICAgICAgICAgICAgIFwiNFwiOiBbMywgMiwgMTQsIDEsIDEzXSxcbi8vICAgICAgICAgICAgICAgICBcIjdcIjogWzMsIDIsIDE0LCAxLCAxM10sXG4vLyAgICAgICAgICAgICAgICAgXCIzXCI6IFsxLCAxMywgMiwgMywgMTRdLFxuLy8gICAgICAgICAgICAgICAgIFwiNlwiOiBbMSwgMTMsIDIsIDMsIDE0XSxcbi8vICAgICAgICAgICAgICAgICBcIjlcIjogWzEsIDEzLCAyLCAzLCAxNF0sXG4vLyAgICAgICAgICAgICAgICAgXCIxMFwiOiBbMywgMiwgMTQsIDEsIDEzXSxcbi8vICAgICAgICAgICAgICAgICBcIjExXCI6IFsyLCAxLCAzLCAxMywgMTRdLFxuLy8gICAgICAgICAgICAgICAgIFwiMTJcIjogWzEsIDEzLCAyLCAzLCAxNF0sXG4vLyAgICAgICAgICAgICAgICAgXCIxM1wiOiBbMTQsIDMsIDIsIDEsIDEzXSxcbi8vICAgICAgICAgICAgICAgICBcIjE1XCI6IFsxNCwgMywgMiwgMSwgMTNdLFxuLy8gICAgICAgICAgICAgICAgIFwiMTdcIjogWzE0LCAzLCAyLCAxLCAxM10sXG4vLyAgICAgICAgICAgICAgICAgXCIxNFwiOiBbMTMsIDEsIDIsIDMsIDE0XSxcbi8vICAgICAgICAgICAgICAgICBcIjE2XCI6IFsxMywgMSwgMiwgMywgMTRdLFxuLy8gICAgICAgICAgICAgICAgIFwiMThcIjogWzEzLCAxLCAyLCAzLCAxNF0sXG4vLyAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgXCIzXCI6IHtcbi8vICAgICAgICAgICAgICAgICAvLzPkuK3mjpLmlYzmlrlcbi8vICAgICAgICAgICAgICAgICBcIjBcIjogWzUsIDQsIDYsIDE1LCAxNl0sXG4vLyAgICAgICAgICAgICAgICAgXCIyXCI6IFs1LCA0LCA2LCAxNSwgMTZdLFxuLy8gICAgICAgICAgICAgICAgIFwiNVwiOiBbNSwgNCwgNiwgMTUsIDE2XSxcbi8vICAgICAgICAgICAgICAgICBcIjhcIjogWzUsIDQsIDYsIDE1LCAxNl0sXG4vLyAgICAgICAgICAgICAgICAgXCIxXCI6IFs2LCA1LCAxNiwgNCwgMTVdLFxuLy8gICAgICAgICAgICAgICAgIFwiNFwiOiBbNiwgNSwgMTYsIDQsIDE1XSxcbi8vICAgICAgICAgICAgICAgICBcIjdcIjogWzYsIDUsIDE2LCA0LCAxNV0sXG4vLyAgICAgICAgICAgICAgICAgXCIzXCI6IFs0LCAxNSwgNSwgNiwgMTZdLFxuLy8gICAgICAgICAgICAgICAgIFwiNlwiOiBbNCwgMTUsIDUsIDYsIDE2XSxcbi8vICAgICAgICAgICAgICAgICBcIjlcIjogWzQsIDE1LCA1LCA2LCAxNl0sXG4vLyAgICAgICAgICAgICAgICAgXCIxMFwiOiBbNiwgNSwgMTYsIDQsIDE1XSxcbi8vICAgICAgICAgICAgICAgICBcIjExXCI6IFs1LCA0LCA2LCAxNSwgMTZdLFxuLy8gICAgICAgICAgICAgICAgIFwiMTJcIjogWzQsIDE1LCA1LCA2LCAxNl0sXG4vLyAgICAgICAgICAgICAgICAgXCIxM1wiOiBbMTYsIDYsIDUsIDQsIDE1XSxcbi8vICAgICAgICAgICAgICAgICBcIjE1XCI6IFsxNiwgNiwgNSwgNCwgMTVdLFxuLy8gICAgICAgICAgICAgICAgIFwiMTdcIjogWzE2LCA2LCA1LCA0LCAxNV0sXG4vLyAgICAgICAgICAgICAgICAgXCIxNFwiOiBbMTUsIDQsIDUsIDYsIDE2XSxcbi8vICAgICAgICAgICAgICAgICBcIjE2XCI6IFsxNSwgNCwgNSwgNiwgMTZdLFxuLy8gICAgICAgICAgICAgICAgIFwiMThcIjogWzE1LCA0LCA1LCA2LCAxNl0sXG4vLyAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgXCI0XCI6IHtcbi8vICAgICAgICAgICAgICAgICAvLzTlkI7mjpLmlYzmlrlcbi8vICAgICAgICAgICAgICAgICBcIjBcIjogWzgsIDcsIDksIDE3LCAxOF0sXG4vLyAgICAgICAgICAgICAgICAgXCIyXCI6IFs4LCA3LCA5LCAxNywgMThdLFxuLy8gICAgICAgICAgICAgICAgIFwiNVwiOiBbOCwgNywgOSwgMTcsIDE4XSxcbi8vICAgICAgICAgICAgICAgICBcIjhcIjogWzgsIDcsIDksIDE3LCAxOF0sXG4vLyAgICAgICAgICAgICAgICAgXCIxXCI6IFs5LCA4LCAxOCwgNywgMTddLFxuLy8gICAgICAgICAgICAgICAgIFwiNFwiOiBbOSwgOCwgMTgsIDcsIDE3XSxcbi8vICAgICAgICAgICAgICAgICBcIjdcIjogWzksIDgsIDE4LCA3LCAxN10sXG4vLyAgICAgICAgICAgICAgICAgXCIzXCI6IFs3LCA4LCAxNywgOSwgMThdLFxuLy8gICAgICAgICAgICAgICAgIFwiNlwiOiBbNywgOCwgMTcsIDksIDE4XSxcbi8vICAgICAgICAgICAgICAgICBcIjlcIjogWzcsIDgsIDE3LCA5LCAxOF0sXG4vLyAgICAgICAgICAgICAgICAgXCIxMFwiOiBbOSwgOCwgMTgsIDcsIDE3XSxcbi8vICAgICAgICAgICAgICAgICBcIjExXCI6IFs4LCA3LCA5LCAxNywgMThdLFxuLy8gICAgICAgICAgICAgICAgIFwiMTJcIjogWzcsIDgsIDE3LCA5LCAxOF0sXG4vLyAgICAgICAgICAgICAgICAgXCIxM1wiOiBbMTgsIDksIDgsIDcsIDE3XSxcbi8vICAgICAgICAgICAgICAgICBcIjE1XCI6IFsxOCwgOSwgOCwgNywgMTddLFxuLy8gICAgICAgICAgICAgICAgIFwiMTdcIjogWzE4LCA5LCA4LCA3LCAxN10sXG4vLyAgICAgICAgICAgICAgICAgXCIxNFwiOiBbMTcsIDcsIDgsIDksIDE4XSxcbi8vICAgICAgICAgICAgICAgICBcIjE2XCI6IFsxNywgNywgOCwgOSwgMThdLFxuLy8gICAgICAgICAgICAgICAgIFwiMThcIjogWzE3LCA3LCA4LCA5LCAxOF0sXG4vLyAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgXCI1XCI6IHtcbi8vICAgICAgICAgICAgICAgICAvLzHmlYzmlrnlhajkvZMgICA15pWM5pa56ZqP5py6IDflt7LmlrnlhajkvZMgOOW3suaWuemaj+aculxuLy8gICAgICAgICAgICAgICAgIFwiMFwiOiBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMF0sXG4vLyAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgXCI3XCI6IHtcbi8vICAgICAgICAgICAgICAgICAvLzHmlYzmlrnlhajkvZMgICA15pWM5pa56ZqP5py6IDflt7LmlrnlhajkvZMgOOW3suaWuemaj+aculxuLy8gICAgICAgICAgICAgICAgIFwiMFwiOiBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMF0sXG4vLyAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgXCI4XCI6IHtcbi8vICAgICAgICAgICAgICAgICAvLzHmlYzmlrnlhajkvZMgICA15pWM5pa56ZqP5py6IDflt7LmlrnlhajkvZMgOOW3suaWuemaj+aculxuLy8gICAgICAgICAgICAgICAgIFwiMFwiOiBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMF0sXG4vLyAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgXCIxMFwiOiB7XG4vLyAgICAgICAgICAgICAgICAgLy8x5pWM5pa55YWo5L2TICAgNeaVjOaWuemaj+acuiA35bey5pa55YWo5L2TIDjlt7Lmlrnpmo/mnLpcbi8vICAgICAgICAgICAgICAgICBcIjBcIjogWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDBdLFxuLy8gICAgICAgICAgICAgfSxcbi8vICAgICAgICAgICAgIFwiMTFcIjoge1xuLy8gICAgICAgICAgICAgICAgIC8vMeaVjOaWueWFqOS9kyAgIDXmlYzmlrnpmo/mnLogN+W3suaWueWFqOS9kyA45bey5pa56ZqP5py6XG4vLyAgICAgICAgICAgICAgICAgXCIwXCI6IFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAwXSxcbi8vICAgICAgICAgICAgIH0sXG4vLyAgICAgICAgICAgICBcIjEyXCI6IHtcbi8vICAgICAgICAgICAgICAgICAvLzHmlYzmlrnlhajkvZMgICA15pWM5pa56ZqP5py6IDflt7LmlrnlhajkvZMgOOW3suaWuemaj+aculxuLy8gICAgICAgICAgICAgICAgIFwiMFwiOiBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMF0sXG4vLyAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgXCIxM1wiOiB7XG4vLyAgICAgICAgICAgICAgICAgLy8x5pWM5pa55YWo5L2TICAgNeaVjOaWuemaj+acuiA35bey5pa55YWo5L2TIDjlt7Lmlrnpmo/mnLpcbi8vICAgICAgICAgICAgICAgICBcIjBcIjogWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDBdLFxuLy8gICAgICAgICAgICAgfSxcbi8vICAgICAgICAgICAgIFwiMTZcIjoge1xuLy8gICAgICAgICAgICAgICAgIC8vMeaVjOaWueWFqOS9kyAgIDXmlYzmlrnpmo/mnLogN+W3suaWueWFqOS9kyA45bey5pa56ZqP5py6XG4vLyAgICAgICAgICAgICAgICAgXCIwXCI6IFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAwXSxcbi8vICAgICAgICAgICAgIH0sXG4vLyAgICAgICAgICAgICBcIjE3XCI6IHtcbi8vICAgICAgICAgICAgICAgICAvL+S4u+inkuiHquW3sVxuLy8gICAgICAgICAgICAgICAgIFwiMFwiOiBbMF0sXG4vLyAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgXCIxOFwiOiB7XG4vLyAgICAgICAgICAgICAgICAgLy/miJHmlrnlvJ/lrZBcbi8vICAgICAgICAgICAgICAgICBcIjBcIjogWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEzLCAxNCwgMTUsIDE2LCAxNywgMThdLFxuLy8gICAgICAgICAgICAgfSxcbi8vICAgICAgICAgICAgIFwiMjBcIjoge1xuLy8gICAgICAgICAgICAgICAgIC8v5oiR5pa55byf5a2QXG4vLyAgICAgICAgICAgICAgICAgXCIwXCI6IFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4XSxcbi8vICAgICAgICAgICAgIH0sXG4vLyAgICAgICAgICAgICBcIjIyXCI6IHtcbi8vICAgICAgICAgICAgICAgICAvL+aVjOaWueWFqOS9k+W8guW4uFxuLy8gICAgICAgICAgICAgICAgIFwiMFwiOiBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMF0sXG4vLyAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgXCIyM1wiOiB7XG4vLyAgICAgICAgICAgICAgICAgXCIwXCI6IFsyLCA1LCAxLCAzLCA4LCAxMywgMTQsIDQsIDYsIDE1LCAxNiwgNywgOSwgMTcsIDE4LCAwXSxcbi8vICAgICAgICAgICAgICAgICBcIjJcIjogWzIsIDUsIDEsIDMsIDgsIDEzLCAxNCwgNCwgNiwgMTUsIDE2LCA3LCA5LCAxNywgMTgsIDBdLFxuLy8gICAgICAgICAgICAgICAgIFwiNVwiOiBbMiwgNSwgMSwgMywgOCwgMTMsIDE0LCA0LCA2LCAxNSwgMTYsIDcsIDksIDE3LCAxOCwgMF0sXG4vLyAgICAgICAgICAgICAgICAgXCI4XCI6IFsyLCA1LCAxLCAzLCA4LCAxMywgMTQsIDQsIDYsIDE1LCAxNiwgNywgOSwgMTcsIDE4LCAwXSxcbi8vICAgICAgICAgICAgICAgICBcIjExXCI6IFsyLCA1LCAxLCAzLCA4LCAxMywgMTQsIDQsIDYsIDE1LCAxNiwgNywgOSwgMTcsIDE4LCAwXSxcbi8vICAgICAgICAgICAgICAgICBcIjFcIjogWzMsIDYsIDIsIDE0LCA5LCAxLCA1LCAxNiwgMTQsIDQsIDgsIDE4LCAxNSwgNywgMTcsIDBdLFxuLy8gICAgICAgICAgICAgICAgIFwiNFwiOiBbMywgNiwgMiwgMTQsIDksIDEsIDUsIDE2LCAxNCwgNCwgOCwgMTgsIDE1LCA3LCAxNywgMF0sXG4vLyAgICAgICAgICAgICAgICAgXCI3XCI6IFszLCA2LCAyLCAxNCwgOSwgMSwgNSwgMTYsIDE0LCA0LCA4LCAxOCwgMTUsIDcsIDE3LCAwXSxcbi8vICAgICAgICAgICAgICAgICBcIjEwXCI6IFszLCA2LCAyLCAxNCwgOSwgMSwgNSwgMTYsIDE0LCA0LCA4LCAxOCwgMTUsIDcsIDE3LCAwXSxcbi8vICAgICAgICAgICAgICAgICBcIjNcIjogWzEsIDQsIDEzLCAyLCA3LCAzLCAxNSwgNSwgMTQsIDYsIDE3LCA4LCAxNiwgOSwgMTgsIDBdLFxuLy8gICAgICAgICAgICAgICAgIFwiNlwiOiBbMSwgNCwgMTMsIDIsIDcsIDMsIDE1LCA1LCAxNCwgNiwgMTcsIDgsIDE2LCA5LCAxOCwgMF0sXG4vLyAgICAgICAgICAgICAgICAgXCI5XCI6IFsxLCA0LCAxMywgMiwgNywgMywgMTUsIDUsIDE0LCA2LCAxNywgOCwgMTYsIDksIDE4LCAwXSxcbi8vICAgICAgICAgICAgICAgICBcIjEyXCI6IFsxLCA0LCAxMywgMiwgNywgMywgMTUsIDUsIDE0LCA2LCAxNywgOCwgMTYsIDksIDE4LCAwXSxcbi8vICAgICAgICAgICAgICAgICBcIjEzXCI6IFsxNCwgMTYsIDMsIDE4LCAyLCA2LCAxLCA1LCA5LCAxMywgNCwgOCwgMTUsIDcsIDE3LCAwXSxcbi8vICAgICAgICAgICAgICAgICBcIjE1XCI6IFsxNCwgMTYsIDMsIDE4LCAyLCA2LCAxLCA1LCA5LCAxMywgNCwgOCwgMTUsIDcsIDE3LCAwXSxcbi8vICAgICAgICAgICAgICAgICBcIjE3XCI6IFsxNCwgMTYsIDMsIDE4LCAyLCA2LCAxLCA1LCA5LCAxMywgNCwgOCwgMTUsIDcsIDE3LCAwXSxcbi8vICAgICAgICAgICAgICAgICBcIjE0XCI6IFsxMywgMTUsIDEsIDE3LCAyLCA0LCAzLCA1LCA3LCAxNCwgNiwgOCwgMTYsIDksIDE4LCAwXSxcbi8vICAgICAgICAgICAgICAgICBcIjE2XCI6IFsxMywgMTUsIDEsIDE3LCAyLCA0LCAzLCA1LCA3LCAxNCwgNiwgOCwgMTYsIDksIDE4LCAwXSxcbi8vICAgICAgICAgICAgICAgICBcIjE4XCI6IFsxMywgMTUsIDEsIDE3LCAyLCA0LCAzLCA1LCA3LCAxNCwgNiwgOCwgMTYsIDksIDE4LCAwXSxcbi8vICAgICAgICAgICAgIH0sXG4vLyAgICAgICAgIH07XG4vLyAgICAgICAgIGxldCB5dSA9IE1hdGguZmxvb3IoTnVtYmVyKGlpZCkgJSAxMDApLnRvU3RyaW5nKCk7XG4vLyAgICAgICAgIGxldCBpcXo6IG51bWJlciA9IDEwMDsgLy/miJHmlrnliY3nvIBcbi8vICAgICAgICAgbGV0IGZxejogbnVtYmVyID0gMTAwMDsgLy/lr7nmlrnliY3nvIBcbi8vICAgICAgICAgaWYgKE51bWJlcihpaWQpID49IDEwMDApIHtcbi8vICAgICAgICAgICAgIGZxeiA9IDEwMDtcbi8vICAgICAgICAgICAgIGlxeiA9IDEwMDA7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0dHlwZS5sZW5ndGg7IGkrKykge1xuLy8gICAgICAgICAgICAgaWYgKGZpaWRzLmxlbmd0aCA+PSB0YXJnZXRUeXBlKSB7XG4vLyAgICAgICAgICAgICAgICAgYnJlYWs7IC8v5bey57uP5om+5Yiw5LqGXG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBsZXQgbXViaWFvID0gdHR5cGVbaV07XG4vLyAgICAgICAgICAgICBzd2l0Y2ggKG11Ymlhbykge1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMTogLy8x5pWM5pa55YWo5L2TXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChkaXN0YW5jZSA+IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaWlkID0gKGZxeiArIDUpLnRvU3RyaW5nKCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkcyA9IHRoaXMuZmluZF9qaWFuc2VfZmlpZChmaWlkLCBkaXN0YW5jZSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXSAhPSBudWxsICYmIHRoaXMudXVpZHNbZmlpZF0uZHpoZW4gPT0gMCAmJiBnYW1lTWV0aG9kLmlzRW1wdHkodGhpcy50ZWFtc1tmaWlkXS5pc0hpZGUpKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlpZHMucHVzaCgoZnF6ICsgNSkudG9TdHJpbmcoKSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1ibGlzdFttdWJpYW8udG9TdHJpbmcoKV1bXCIwXCJdLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpaWQgPSAoZnF6ICsgbWJsaXN0W211Ymlhby50b1N0cmluZygpXVtcIjBcIl1ba10pLnRvU3RyaW5nKCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZIcCA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImhwXCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlYW1zW2ZpaWRdID09IG51bGwgfHwgZkhwIDw9IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkodGhpcy50ZWFtc1tmaWlkXS5pc0hpZGUpID09IGZhbHNlKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkcy5wdXNoKGZpaWQpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMjogLy8y5YmN5o6S5pWM5pa5XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAzOiAvLzPkuK3mjpLmlYzmlrlcbi8vICAgICAgICAgICAgICAgICBjYXNlIDQ6IC8vNOWQjuaOkuaVjOaWuVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgY291bnQgPSAwO1xuLy8gICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1ibGlzdFttdWJpYW8udG9TdHJpbmcoKV1beXVdLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlpZCA9IChmcXogKyBtYmxpc3RbbXViaWFvLnRvU3RyaW5nKCldW3l1XVtrXSkudG9TdHJpbmcoKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmSHAgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlYW1zW2ZpaWRdID09IG51bGwgfHwgZkhwIDw9IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkodGhpcy50ZWFtc1tmaWlkXS5pc0hpZGUpID09IGZhbHNlKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8v6ZqQ6JePXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gdGFyZ2V0VHlwZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZHMucHVzaChmaWlkKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDU6IC8vIDXmlYzmlrnpmo/mnLoo5LiN6IO96ZqP5py65ZCM5LiA5Liq55uu5qCHKVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgY3FsaXN0NTogc3RyaW5nW10gPSBbXTtcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtYmxpc3RbbXViaWFvLnRvU3RyaW5nKCldW1wiMFwiXS5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpaWQgPSAoZnF6ICsgbWJsaXN0W211Ymlhby50b1N0cmluZygpXVtcIjBcIl1ba10pLnRvU3RyaW5nKCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZkhwID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXSA9PSBudWxsIHx8IGZIcCA8PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMudGVhbXNbZmlpZF0uaXNIaWRlKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY3FsaXN0NS5wdXNoKGZpaWQpO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGZpaWRzID0gdGhpcy5zZWVkUmFuZC5nZXRSYW5kQXJyKGNxbGlzdDUsIE1hdGgubWluKGNxbGlzdDUubGVuZ3RoLCB0YXJnZXRUeXBlKSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNjogLy/oh6rlt7Fcbi8vICAgICAgICAgICAgICAgICAgICAgZmlpZHMgPSBbaWlkXTtcbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA3OiAvLzflt7LmlrnlhajkvZNcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtYmxpc3RbbXViaWFvLnRvU3RyaW5nKCldW1wiMFwiXS5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpaWQgPSAoaXF6ICsgbWJsaXN0W211Ymlhby50b1N0cmluZygpXVtcIjBcIl1ba10pLnRvU3RyaW5nKCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZkhwID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXSA9PSBudWxsIHx8IGZIcCA8PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMudGVhbXNbZmlpZF0uaXNIaWRlKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZHMucHVzaChmaWlkKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDg6IC8vIDjlt7Lmlrnpmo/mnLoo6Zmk6Ieq5bex5aSWKSjkuI3lj6/ku6Xpmo/mnLrlkIzkuIDkuKrnm67moIcpXG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBjcWxpc3Q4OiBzdHJpbmdbXSA9IFtdO1xuLy8gICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1ibGlzdFttdWJpYW8udG9TdHJpbmcoKV1bXCIwXCJdLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlpZCA9IChpcXogKyBtYmxpc3RbbXViaWFvLnRvU3RyaW5nKCldW1wiMFwiXVtrXSkudG9TdHJpbmcoKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmSHAgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlYW1zW2ZpaWRdID09IG51bGwgfHwgZkhwIDw9IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkodGhpcy50ZWFtc1tmaWlkXS5pc0hpZGUpID09IGZhbHNlKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8v6ZqQ6JePXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlpZCA9PSBpaWQpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyjpmaToh6rlt7HlpJYpXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNxbGlzdDgucHVzaChmaWlkKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBmaWlkcyA9IHRoaXMuc2VlZFJhbmQuZ2V0UmFuZEFycihjcWxpc3Q4LCBNYXRoLm1pbihjcWxpc3Q4Lmxlbmd0aCwgdGFyZ2V0VHlwZSkpO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDk6IC8vIDnkuIrmrKHmlLvlh7vmiJHnmoTlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnV1aWRzW2lpZF0pIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnV1aWRzW2lpZF0uZnBrICE9IFwiXCIpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWRzLnB1c2godGhpcy51dWlkc1tpaWRdLmZwayk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cblxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDEwOiAvLyAxMOaVjOaWueaUu+WHu+WKm+acgOmrmOWNleS9jVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZk1heGF0azEwOiBudW1iZXIgPSAwO1xuLy8gICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1ibGlzdFttdWJpYW8udG9TdHJpbmcoKV1bXCIwXCJdLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlpZCA9IChmcXogKyBtYmxpc3RbbXViaWFvLnRvU3RyaW5nKCldW1wiMFwiXVtrXSkudG9TdHJpbmcoKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmSHAgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlYW1zW2ZpaWRdID09IG51bGwgfHwgZkhwIDw9IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkodGhpcy50ZWFtc1tmaWlkXS5pc0hpZGUpID09IGZhbHNlKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8v6ZqQ6JePXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZkF0ayA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImF0a1wiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmQXRrIDw9IGZNYXhhdGsxMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZk1heGF0azEwID0gZkF0aztcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWRzID0gW2ZpaWRdO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMTE6IC8vIDEx5pWM5pa55pS75Ye75Yqb5pyA5L2O5Y2V5L2N77yMXG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBmTWluYXRrMTE6IG51bWJlciA9IDk5OTk5OTk5OTtcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtYmxpc3RbbXViaWFvLnRvU3RyaW5nKCldW1wiMFwiXS5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpaWQgPSAoZnF6ICsgbWJsaXN0W211Ymlhby50b1N0cmluZygpXVtcIjBcIl1ba10pLnRvU3RyaW5nKCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZkhwID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXSA9PSBudWxsIHx8IGZIcCA8PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMudGVhbXNbZmlpZF0uaXNIaWRlKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZBdGsgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJhdGtcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZkF0ayA+PSBmTWluYXRrMTEpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZNaW5hdGsxMSA9IGZBdGs7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkcyA9IFtmaWlkXTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDEyOiAvLyAxMuaVjOaWueW9k+WJjeihgOmHj+acgOS9juWNleS9jVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZk1pbmhwMTI6IG51bWJlciA9IDk5OTk5OTk5OTtcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtYmxpc3RbbXViaWFvLnRvU3RyaW5nKCldW1wiMFwiXS5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpaWQgPSAoZnF6ICsgbWJsaXN0W211Ymlhby50b1N0cmluZygpXVtcIjBcIl1ba10pLnRvU3RyaW5nKCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZkhwID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXSA9PSBudWxsIHx8IGZIcCA8PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMudGVhbXNbZmlpZF0uaXNIaWRlKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZBdGsgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmQXRrID49IGZNaW5ocDEyKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmTWluaHAxMiA9IGZBdGs7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkcyA9IFtmaWlkXTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDEzOiAvLyAxM+aVjOaWueW9k+WJjeihgOmHj+acgOmrmOWNleS9je+8jFxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZk1heGhwMTM6IG51bWJlciA9IDA7XG4vLyAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbWJsaXN0W211Ymlhby50b1N0cmluZygpXVtcIjBcIl0ubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaWlkID0gKGZxeiArIG1ibGlzdFttdWJpYW8udG9TdHJpbmcoKV1bXCIwXCJdW2tdKS50b1N0cmluZygpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZIcCA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImhwXCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbZmlpZF0gPT0gbnVsbCB8fCBmSHAgPD0gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eSh0aGlzLnRlYW1zW2ZpaWRdLmlzSGlkZSkgPT0gZmFsc2UpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy/pmpDol49cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmQXRrID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZkF0ayA8PSBmTWF4aHAxMykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZk1heGhwMTMgPSBmQXRrO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZHMgPSBbZmlpZF07XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAxNTogLy8gMTUg5oiR5omT55qE5pyA5ZCO5LiA5LiqXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnV1aWRzW2lpZF0uaXBrICE9IFwiXCIpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWRzID0gW3RoaXMudXVpZHNbaWlkXS5pcGtdO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMTY6IC8vMTbnlJ/lkb3lgLzmnIDkvY7nmoTlt7LmlrnljZXkvY0pXG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBtaW5IcDogbnVtYmVyID0gMDtcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtYmxpc3RbbXViaWFvLnRvU3RyaW5nKCldW1wiMFwiXS5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpaWQgPSAoaXF6ICsgbWJsaXN0W211Ymlhby50b1N0cmluZygpXVtcIjBcIl1ba10pLnRvU3RyaW5nKCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZkhwID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXSA9PSBudWxsIHx8IGZIcCA8PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMudGVhbXNbZmlpZF0uaXNIaWRlKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pbkhwID09IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkcyA9IFtmaWlkXTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5IcCA9IGZIcDtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pbkhwID4gZkhwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkhwID0gZkhwO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkcyA9IFtmaWlkXTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAxNzogLy8xNyDmiJHmlrnkuLvop5Jcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGlxei50b1N0cmluZygpLmxlbmd0aCA+IDMpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWRzID0gW1wiMTAwMFwiXTtcbi8vICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWRzID0gW1wiMTAwXCJdO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMTg6IC8vMTjlt7HmlrnlhajkvZPlvJ/lrZBcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtYmxpc3RbbXViaWFvLnRvU3RyaW5nKCldW1wiMFwiXS5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpaWQgPSAoZnF6ICsgbWJsaXN0W211Ymlhby50b1N0cmluZygpXVtcIjBcIl1ba10pLnRvU3RyaW5nKCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZkhwID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXSA9PSBudWxsIHx8IGZIcCA8PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMudGVhbXNbZmlpZF0uaXNIaWRlKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZHMucHVzaChmaWlkKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDE5OiAvLyAxOSDkuIrmrKHmiJHmlLvlh7vnmoTlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5pcGtzW3RoaXMuemhlbl0gIT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZHMgPSB0aGlzLnV1aWRzW2lpZF0uaXBrc1t0aGlzLnpoZW5dO1xuLy8gICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZHMgPSBbXTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDIwOiAvLyAyMCDpmo/mnLrlt7Hmlrl45Liq5byf5a2QXG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBjcWxpc3QyMDogc3RyaW5nW10gPSBbXTtcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtYmxpc3RbbXViaWFvLnRvU3RyaW5nKCldW1wiMFwiXS5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpaWQgPSAoZnF6ICsgbWJsaXN0W211Ymlhby50b1N0cmluZygpXVtcIjBcIl1ba10pLnRvU3RyaW5nKCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZkhwID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXSA9PSBudWxsIHx8IGZIcCA8PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMudGVhbXNbZmlpZF0uaXNIaWRlKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY3FsaXN0MjAucHVzaChmaWlkKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBmaWlkcyA9IHRoaXMuc2VlZFJhbmQuZ2V0UmFuZEFycihjcWxpc3QyMCwgTWF0aC5taW4oY3FsaXN0MjAubGVuZ3RoLCB0YXJnZXRUeXBlKSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMjE6IC8vIDIxIOaVjOaWueS4u+inklxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoaXF6LnRvU3RyaW5nKCkubGVuZ3RoID4gMykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZHMgPSBbXCIxMDBcIl07XG4vLyAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkcyA9IFtcIjEwMDBcIl07XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAyMjogLy8gMjIg5pWM5pa55byC5bi454q25oCB5pWM5Lq6XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBjcWxpc3QyMjogc3RyaW5nW10gPSBbXTtcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtYmxpc3RbbXViaWFvLnRvU3RyaW5nKCldW1wiMFwiXS5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpaWQgPSAoZnF6ICsgbWJsaXN0W211Ymlhby50b1N0cmluZygpXVtcIjBcIl1ba10pLnRvU3RyaW5nKCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZkhwID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXSA9PSBudWxsIHx8IGZIcCA8PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMudGVhbXNbZmlpZF0uaXNIaWRlKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYnVmZnMgPSBbXCJlZmZlY3RfaV8xXCIsIFwiZWZmZWN0X2lfM1wiLCBcImVmZmVjdF9pXzRcIiwgXCJlZmZlY3RfaV81XCIsIFwiZWZmZWN0X2lfN1wiXTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBidWZmcy5sZW5ndGg7IGluZGV4KyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYnVmZiA9IGJ1ZmZzW2luZGV4XTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5za2J1ZmZfZ2V0KGZpaWQsIGJ1ZmYsIDIpID4gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcWxpc3QyMi5wdXNoKGZpaWQpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgZmlpZHMgPSB0aGlzLnNlZWRSYW5kLmdldFJhbmRBcnIoY3FsaXN0MjIsIE1hdGgubWluKGNxbGlzdDIyLmxlbmd0aCwgdGFyZ2V0VHlwZSkpO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDIzOiAvLyAyMyDmlLvlh7vmnIDov5Hnm67moIdcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGNxbGlzdDIzOiBzdHJpbmdbXSA9IFtdO1xuLy8gICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1ibGlzdFttdWJpYW8udG9TdHJpbmcoKV1beXVdLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlpZCA9IChmcXogKyBtYmxpc3RbbXViaWFvLnRvU3RyaW5nKCldW3l1XVtrXSkudG9TdHJpbmcoKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmSHAgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlYW1zW2ZpaWRdID09IG51bGwgfHwgZkhwIDw9IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkodGhpcy50ZWFtc1tmaWlkXS5pc0hpZGUpID09IGZhbHNlKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8v6ZqQ6JePXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNxbGlzdDIzLnB1c2goZmlpZCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3FsaXN0MjMubGVuZ3RoID09IHRhcmdldFR5cGUpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBmaWlkcyA9IGNxbGlzdDIzO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgIH1cblxuLy8gICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWlkcy5sZW5ndGg7IGkrKykge1xuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uZUZpaWRzW2lpZF1ba2V5XS5sZW5ndGggPj0gdGFyZ2V0VHlwZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25lRmlpZHNbaWlkXVtrZXldLmluY2x1ZGVzKGZpaWRzW2ldKSkge1xuLy8gICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgdGhpcy5vbmVGaWlkc1tpaWRdW2tleV0ucHVzaChmaWlkc1tpXSk7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICB9XG5cbi8vICAgICAvKipcbi8vICAgICAgKiDovoXliqnlh73mlbAgLSDojrflj5blr7nmiYtcbi8vICAgICAgKiBAcGFyYW0ga2V5IOagh+ivhmtleVxuLy8gICAgICAqIEBwYXJhbSBpaWQg5Ye65omL5pa5XG4vLyAgICAgICogQHBhcmFtIGRpc3RhbmNlIOiMg+WbtOWkp+WwjyjljYrlvoQpXG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSBmaW5kX2ppYW5zZV9maWlkKGZpaWQ6IHN0cmluZywgZGlzdGFuY2U6IG51bWJlcik6IHN0cmluZ1tdIHtcbi8vICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eShkaXN0YW5jZSkgPT0gdHJ1ZSkge1xuLy8gICAgICAgICAgICAgcmV0dXJuIFtdO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGxldCBmaWlkczogc3RyaW5nW10gPSBbXTtcblxuLy8gICAgICAgICAvL+aYr+S4jeaYr+iMg+WbtOinpuWPkVxuLy8gICAgICAgICBsZXQgZndsaXN0OiB7IFt3eGlkOiBzdHJpbmddOiB7IFtmdzogc3RyaW5nXTogbnVtYmVyW10gfSB9ID0ge1xuLy8gICAgICAgICAgICAgMTogeyAxOiBbMiwgNCwgNSwgMTMsIDE1XSwgMjogWzMsIDYsIDcsIDgsIDksIDE3XSwgMzogWzE0LCAxNiwgMTgsIDBdIH0sXG4vLyAgICAgICAgICAgICAyOiB7IDE6IFsxLCAzLCA0LCA1LCA2XSwgMjogWzcsIDgsIDksIDE0LCAxNiwgMTgsIDEzLCAxNSwgMTddLCAzOiBbMF0gfSxcbi8vICAgICAgICAgICAgIDM6IHsgMTogWzIsIDUsIDYsIDE0LCAxNl0sIDI6IFsxLCA0LCA3LCA4LCA5LCAxOF0sIDM6IFsxMywgMTUsIDE3LCAwXSB9LFxuLy8gICAgICAgICAgICAgNDogeyAxOiBbMSwgMiwgNSwgNywgOCwgMTMsIDE1LCAxN10sIDI6IFszLCA2LCA5LCAwXSwgMzogWzE0LCAxNiwgMThdIH0sXG4vLyAgICAgICAgICAgICA1OiB7IDE6IFsxLCAyLCAzLCA0LCA2LCA3LCA4LCA5XSwgMjogWzEzLCAxNSwgMTcsIDE0LCAxNiwgMTgsIDBdIH0sXG4vLyAgICAgICAgICAgICA2OiB7IDE6IFsyLCAzLCA1LCA4LCA5LCAxNCwgMTYsIDE4XSwgMjogWzEsIDQsIDcsIDBdLCAzOiBbMTMsIDE1LCAxN10gfSxcbi8vICAgICAgICAgICAgIDc6IHsgMTogWzQsIDUsIDgsIDAsIDE1LCAxN10sIDI6IFsxLCAyLCAzLCA2LCA5LCAxM10sIDM6IFsxNCwgMTYsIDE4XSB9LFxuLy8gICAgICAgICAgICAgODogeyAxOiBbMCwgNCwgNSwgNiwgNywgOV0sIDI6IFsxLCAyLCAzLCAxNCwgMTYsIDE4LCAxMywgMTUsIDE3XSB9LFxuLy8gICAgICAgICAgICAgOTogeyAxOiBbMCwgNSwgNiwgOCwgMTYsIDE4XSwgMjogWzEsIDIsIDMsIDQsIDcsIDE0XSwgMzogWzEzLCAxNSwgMTddIH0sXG4vLyAgICAgICAgICAgICAwOiB7IDE6IFs3LCA4LCA5XSwgMjogWzQsIDUsIDYsIDE1LCAxNiwgMTcsIDE4XSwgMzogWzEsIDIsIDMsIDEzLCAxNF0gfSxcbi8vICAgICAgICAgfTtcblxuLy8gICAgICAgICBsZXQgd3hpZCA9IE51bWJlcihmaWlkKSAlIDEwMDtcbi8vICAgICAgICAgbGV0IHF6OiBzdHJpbmcgPSBcIjEwXCI7IC8v5YmN57yAXG4vLyAgICAgICAgIGlmIChmaWlkLmxlbmd0aCA9PSA0KSB7XG4vLyAgICAgICAgICAgICBxeiA9IFwiMTAwXCI7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8PSBNYXRoLmZsb29yKGRpc3RhbmNlIC8gMTAwKTsgaW5kZXgrKykge1xuLy8gICAgICAgICAgICAgaWYgKGZ3bGlzdFt3eGlkXSA9PSBudWxsIHx8IGZ3bGlzdFt3eGlkXVtpbmRleF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBmd2xpc3Rbd3hpZF1baW5kZXhdLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbcXogKyBmd2xpc3Rbd3hpZF1baW5kZXhdW2tdXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1txeiArIGZ3bGlzdFt3eGlkXVtpbmRleF1ba11dLmVwcy5ocCA8PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBpZiAoZmlpZHMuaW5jbHVkZXMocXogKyBmd2xpc3Rbd3hpZF1baW5kZXhdW2tdKSkge1xuLy8gICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgaWYgKCFnYW1lTWV0aG9kLmlzRW1wdHkodGhpcy50ZWFtc1txeiArIGZ3bGlzdFt3eGlkXVtpbmRleF1ba11dLmlzSGlkZSkpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIOmakOiXj1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBmaWlkcy5wdXNoKHF6ICsgZndsaXN0W3d4aWRdW2luZGV4XVtrXSk7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgcmV0dXJuIGZpaWRzO1xuLy8gICAgIH1cblxuLy8gICAgIC8qKlxuLy8gICAgICAqIOe7k+eul+WQhOenjeS8pOWus1xuLy8gICAgICAqIEBwYXJhbSBpaWQg5pS75Ye75pa5XG4vLyAgICAgICogQHBhcmFtIGZpaWQg6KKr5pS75Ye75pa5XG4vLyAgICAgICogQHBhcmFtIGEg5Lyk5a6z57O75pWwXG4vLyAgICAgICogQHBhcmFtIHNraWQg6Kem5Y+R5oqA6IO9XG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSBqc19oaXRzKGlpZDogc3RyaW5nLCBmaWlkOiBzdHJpbmcsIGE6IG51bWJlciwgc2tpZDogc3RyaW5nKSB7XG4vLyAgICAgICAgIC8v5YW954G15pS75Ye7XG4vLyAgICAgICAgIGlmICh0aGlzLnRlYW1zW2lpZF0udHlwZSA9PSAzIHx8IE51bWJlcihpaWQpICUgMTAwID09IDEwKSB7XG4vLyAgICAgICAgICAgICBsZXQgbXppZDogbnVtYmVyID0gMTAwO1xuLy8gICAgICAgICAgICAgbGV0IGZ6aWQ6IG51bWJlciA9IDEwMDA7XG4vLyAgICAgICAgICAgICBpZiAoaWlkLmxlbmd0aCA+IDMpIHtcbi8vICAgICAgICAgICAgICAgICBtemlkID0gMTAwMDtcbi8vICAgICAgICAgICAgICAgICBmemlkID0gMTAwO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgbGV0IGlfel9hdGsgPSB0aGlzLnNrYnVmZl9nZXQobXppZC50b1N0cmluZygpLCBcImF0a1wiKTtcbi8vICAgICAgICAgICAgIGxldCBpX3pfcWhzaG91bGluZyA9IHRoaXMuc2tidWZmX2dldChtemlkLnRvU3RyaW5nKCksIFwicWhzaG91bGluZ1wiKTtcbi8vICAgICAgICAgICAgIGxldCBmX3pfcmhzaG91bGluZyA9IHRoaXMuc2tidWZmX2dldChmemlkLnRvU3RyaW5nKCksIFwicmhzaG91bGluZ1wiKTtcbi8vICAgICAgICAgICAgIGxldCBzbGhpdCA9ICgoaV96X2F0ayAqIGEpIC8gMTAwMDApICogTWF0aC5tYXgoMSwgMSArIChpX3pfcWhzaG91bGluZyAtIGZfel9yaHNob3VsaW5nKSAvIDEwMDAwKTtcbi8vICAgICAgICAgICAgIC8v6L6T5Ye65Lyk5a6zZmpzUmF0ZVxuLy8gICAgICAgICAgICAgaWYgKHRoaXMub25lSGl0W2lpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIHRoaXMub25lSGl0W2lpZF0gPSB7fTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIHRoaXMub25lSGl0W2lpZF1bZmlpZF0gPSB7XG4vLyAgICAgICAgICAgICAgICAgcGdoaXQ6IE1hdGguZmxvb3Ioc2xoaXQpLCAvL+aZruaUu+S8pOWus1xuLy8gICAgICAgICAgICAgICAgIHNraGl0OiBNYXRoLmZsb29yKHNsaGl0KSwgLy/mioDog73kvKTlrrNcbi8vICAgICAgICAgICAgICAgICBiamhpdDogMCwgLy/mmrTlh7vkvKTlrrNcbi8vICAgICAgICAgICAgICAgICBnZGhpdDogMCwgLy/moLzmjKHkvKTlrrNcbi8vICAgICAgICAgICAgICAgICBmamhpdDogMCwgLy/lj43lh7vkvKTlrrNcbi8vICAgICAgICAgICAgICAgICBsamhpdDogMCwgLy/ov57lh7vkvKTlrrNcbi8vICAgICAgICAgICAgICAgICBqc2hpdDogMCwgLy/muoXlsITkvKTlrrMo5rKh5pyJ5oqY5o2f5q+U5L6L57O75pWwKVxuLy8gICAgICAgICAgICAgICAgIHh4aGl0OiAwLCAvL+WQuOihgOWAvFxuLy8gICAgICAgICAgICAgICAgIHh4UmF0ZTogMCwgLy/lkLjooYDlgLxcbi8vICAgICAgICAgICAgICAgICBqc1JhdGU6IDAsIC8v5ZC46KGA5YC8XG4vLyAgICAgICAgICAgICAgICAgZmpzUmF0ZTogMCwgLy/lkLjooYDlgLxcbi8vICAgICAgICAgICAgIH07XG4vLyAgICAgICAgICAgICByZXR1cm47XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICAvL+S8pOWus+WFrOW8j++8muaIkeaWueaUu+WHuz7mlYzmlrnpmLLlvqEg5aaC5p6c6L+Z5Liq5p2h5Lu25oiQ56uL77yM5pmu5pS75Lyk5a6z6LWw5LiL6Z2i5YWs5byPXG4vLyAgICAgICAgIC8v5pmu6YCa5Lyk5a6zPW1heCgo5oiR5pa55pS75Ye7LeaVjOaWuemYsuW+oSkqKDEr5oiR5pa55Lyk5a6z5aKe5by6LeaVjOaWueS8pOWus+WHj+W8sSks5oiR5pa55pS75Ye7KjAuMTUpKlJBTkRCRVRXRUVOKDAuOTcsMS4wMylcbi8vICAgICAgICAgLy/lkKbliJlcbi8vICAgICAgICAgLy/mma7pgJrkvKTlrrM9bWF4KDAsMC44NSpwb3co5oiR5pa55pS75Ye777yMMC44KSlcbi8vICAgICAgICAgbGV0IGlfYXRrOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImF0a1wiKTtcbi8vICAgICAgICAgbGV0IGZfZGVmOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJkZWZcIik7XG4vLyAgICAgICAgIGxldCBiYXNlX2hpdDogbnVtYmVyID0gMDsgLy/mma7pgJrkvKTlrrNcbi8vICAgICAgICAgaWYgKGlfYXRrID4gZl9kZWYpIHtcbi8vICAgICAgICAgICAgIGxldCBpX3plbmdzaGFuZzogbnVtYmVyID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJ6ZW5nc2hhbmdcIik7XG4vLyAgICAgICAgICAgICBsZXQgZl9qaWFuc2hhbmc6IG51bWJlciA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImppYW5zaGFuZ1wiKTtcbi8vICAgICAgICAgICAgIGJhc2VfaGl0ID0gKE1hdGgubWF4KCgoaV9hdGsgLSBmX2RlZikgKiAoMTAwMDAgKyBpX3plbmdzaGFuZyAtIGZfamlhbnNoYW5nKSkgLyAxMDAwMCwgaV9hdGsgKiAwLjE1KSAqIHRoaXMuc2VlZFJhbmQucmFuZCg5NywgMTAzKSkgLyAxMDA7XG4vLyAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICBiYXNlX2hpdCA9IE1hdGgubWF4KDAsIDAuODUgKiBNYXRoLnBvdyhpX2F0aywgMC44KSk7XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICBsZXQgaV9hID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJhXCIpOyAvL+aViOaenOWKoOaIkFxuLy8gICAgICAgICBsZXQgaV83NSA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiaV83NVwiKTsgLy/mlYjmnpzliqDmiJBcbi8vICAgICAgICAgaWYgKGlfNzUgIT0gMCkge1xuLy8gICAgICAgICAgICAgLy8g5LiA5qyh5Yqg5oiQ55qE5pWI5p6cIOeUqOWujOa4heepulxuLy8gICAgICAgICAgICAgdGhpcy5za2J1ZmZfc3ViX2FsbChpaWQsIFwiZWZmZWN0X2lfNzVcIik7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgLy8gbGV0IGZfYSA9IHRoaXMuc2tidWZmX2dldChmaWlkLFwiaV8zMFwiKSAgLy/kvKTlrrPliqDmt7Fcbi8vICAgICAgICAgLy/lr7nmnIDnu4jkvKTlrrPmnInmpoLnjofpgKDmiJBO5YCN5Lyk5a6zXG4vLyAgICAgICAgIGxldCBpX2FfcGVyID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJhX3BlclwiKTsgLy/mlYjmnpzliqDmiJBcbi8vICAgICAgICAgaWYgKGlfYV9wZXIgIT0gMCkge1xuLy8gICAgICAgICAgICAgLy8g5LiA5qyh5Yqg5oiQ55qE5pWI5p6cIOeUqOWujOa4heepulxuLy8gICAgICAgICAgICAgdGhpcy5za2J1ZmZfc3ViX2FsbChpaWQsIFwiZWZmZWN0X2lfNjdcIik7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgaV9hX3BlciA9IGlfYV9wZXIgPyBpX2FfcGVyIDogMTtcbi8vICAgICAgICAgbGV0IGlfc2tfYSA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwic2tfYVwiKTsgLy/mioDog73kvKTlrrPliqDmiJBcbi8vICAgICAgICAgLy/mma7lip/kvKTlrrNcbi8vICAgICAgICAgbGV0IHBnX2hpdCA9IChiYXNlX2hpdCAqIChhICsgaV9hICsgaV83NSkgKiBpX2FfcGVyKSAvIDEwMDAwO1xuLy8gICAgICAgICAvL+aKgOiDveS8pOWusz3mma7pgJrkvKTlrrMgKu+8iDAr5oqA6IO957O75pWw77yJXG4vLyAgICAgICAgIGxldCBza19oaXQ6IG51bWJlciA9IChiYXNlX2hpdCAqIChhICsgaV9hICsgaV83NSArIGlfc2tfYSkgKiBpX2FfcGVyKSAvIDEwMDAwO1xuXG4vLyAgICAgICAgIC8v5pmu6YCa5pS75Ye7ICsg6aKd5aSW5Lyk5a6zXG4vLyAgICAgICAgIGxldCBjZmdTayA9IEdhbWVjZmcuc2tpbGxCYXNlLmdldEl0ZW0oc2tpZCwgXCIxXCIpO1xuLy8gICAgICAgICBsZXQgenpoaXQgPSBwZ19oaXQ7IC8v5pyA57uI5Lyk5a6zXG4vLyAgICAgICAgIGlmIChjZmdTayAhPSBudWxsICYmIGNmZ1NrLnNraWxsVHlwZSA9PSAzKSB7XG4vLyAgICAgICAgICAgICB6emhpdCA9IHNrX2hpdDtcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIC8v5pq05Ye75Lyk5a6zPVx05oqA6IO95Lyk5a6zKm1heCjmiJHmlrnlvLrljJbmmrTkvKQt5pWM5pa55b+96KeG5pq05LykLDEpXG4vLyAgICAgICAgIGxldCBpX2Jhb251ZTogbnVtYmVyID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJiYW9udWVcIik7XG4vLyAgICAgICAgIGxldCBmX3JlbmFpOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJyZW5haVwiKTtcbi8vICAgICAgICAgbGV0IGJqX2hpdDogbnVtYmVyID0genpoaXQgKiBNYXRoLm1heCgxLCAoaV9iYW9udWUgLSBmX3JlbmFpKSAvIDEwMDAwKTtcblxuLy8gICAgICAgICAvL+agvOaMoeS8pOWusz1cdE1JTijmioDog73kvKTlrrMqKE1BWCjmlYzmlrnmoLzmjKHlop7lvLot5oiR5pa55qC85oyh5YeP5byxLDAuMTIpKSzmioDog73kvKTlrrMqMC45KVxuLy8gICAgICAgICBsZXQgZl9xaGJsb2NrOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJxaGJsb2NrXCIpO1xuLy8gICAgICAgICBsZXQgaV9yaGJsb2NrOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcInJoYmxvY2tcIik7XG4vLyAgICAgICAgIGxldCBnZF9oaXQ6IG51bWJlciA9IE1hdGgubWluKHp6aGl0ICogTWF0aC5tYXgoMC4xMiwgKGZfcWhibG9jayAtIGlfcmhibG9jaykgLyAxMDAwMCksIHp6aGl0ICogMC45KTtcblxuLy8gICAgICAgICAvL+WPjeWHu+S8pOWusz1cdE1JTijmioDog73kvKTlrrMqTUFYKOaVjOaWueWPjeWHu+WinuW8ui3miJHmlrnlj43lh7vlh4/lvLEsMSks5oiR5pa555Sf5ZG9KjAuODUpXG4vLyAgICAgICAgIGxldCBmX3FoZmFuamk6IG51bWJlciA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcInFoZmFuamlcIik7XG4vLyAgICAgICAgIGxldCBpX3JoZmFuamk6IG51bWJlciA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwicmhmYW5qaVwiKTtcbi8vICAgICAgICAgbGV0IGlfaHA6IG51bWJlciA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgIGxldCBmal9oaXQ6IG51bWJlciA9IE1hdGgubWluKHp6aGl0ICogTWF0aC5tYXgoMSwgKGZfcWhmYW5qaSAtIGlfcmhmYW5qaSkgLyAxMDAwMCksIGlfaHAgKiAwLjkpO1xuXG4vLyAgICAgICAgIC8v6L+e5Ye75Lyk5a6zID0g5oqA6IO95Lyk5a6zKk1BWCjmiJHmlrnov57lh7vlop7lvLot5pWM5pa56L+e5Ye75YeP5byxLDEpXG4vLyAgICAgICAgIGxldCBpX3FobGlhbmppOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcInFobGlhbmppXCIpO1xuLy8gICAgICAgICBsZXQgZl9yaGxpYW5qaTogbnVtYmVyID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwicmhsaWFuamlcIik7XG4vLyAgICAgICAgIGxldCBsal9oaXQ6IG51bWJlciA9IHp6aGl0ICogTWF0aC5tYXgoKGlfcWhsaWFuamkgLSBmX3JobGlhbmppKSAvIDEwMDAwICsgMSwgMSk7XG5cbi8vICAgICAgICAgLy/muoXlsITkvKTlrrM9XHTmnIDnu4jkvKTlrrMq5oqY5o2f5q+U5L6L57O75pWwKk1BWCjmiJHmlrnmuoXlsITlop7lvLot5pWM5pa55rqF5bCE5YeP5byxLDAuMTIpXG4vLyAgICAgICAgIC8v5oqY5o2f5q+U5L6L57O75pWwICDov5nkuKrov5novrnkuI3orqHnrpdcbi8vICAgICAgICAgbGV0IGlfamlhbnNoZTogbnVtYmVyID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJqaWFuc2hlXCIpO1xuLy8gICAgICAgICBsZXQgZl9oc2ppYW5zaGU6IG51bWJlciA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImhzamlhbnNoZVwiKTtcbi8vICAgICAgICAgbGV0IGJkamlhbnNoZTogbnVtYmVyID0gMDsgLy/kv53lupXlkLjooYBcbi8vICAgICAgICAgbGV0IGNmZ2pzID0gR2FtZWNmZy51c2VyRXAuZ2V0SXRlbShcImppYW5zaGVcIik7XG4vLyAgICAgICAgIGlmIChjZmdqcyAhPSBudWxsKSB7XG4vLyAgICAgICAgICAgICBiZGppYW5zaGUgPSBjZmdqcy5pbml0RXA7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgbGV0IGpzUmF0ZTogbnVtYmVyID0gTWF0aC5tYXgoaV9qaWFuc2hlIC0gZl9oc2ppYW5zaGUsIGJkamlhbnNoZSk7XG4vLyAgICAgICAgIGxldCBmanNSYXRlOiBudW1iZXIgPSBNYXRoLm1heChmX2hzamlhbnNoZSAtIGlfamlhbnNoZSwgYmRqaWFuc2hlKTtcbi8vICAgICAgICAgbGV0IGlfcWhqaWFuc2hlOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcInFoamlhbnNoZVwiKTtcbi8vICAgICAgICAgbGV0IGZfcmhqaWFuc2hlOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJyaGppYW5zaGVcIik7XG4vLyAgICAgICAgIGxldCBqc19oaXQ6IG51bWJlciA9IHp6aGl0ICogTWF0aC5tYXgoKGlfcWhqaWFuc2hlIC0gZl9yaGppYW5zaGUpIC8gMTAwMDAsIDAuMTIpO1xuXG4vLyAgICAgICAgIC8v5ZC46KGA546HPW1heO+8iCjmiJHmlrnlkLjooYAt5pWM5pa55oqX5ZC46KGA77yJ77yM5ZC46KGA5L+d5bqV5Y+C5pWwKVxuLy8gICAgICAgICAvL+WQuOihgOWAvD1cdOacgOe7iOS8pOWus+WAvCptYXgo5oiR5pa55ZC46KGA5aKe5by6LeaVjOaWueWQuOihgOWHj+W8sSwxKSrlkLjooYDnjodcbi8vICAgICAgICAgbGV0IGlfeGl4dWU6IG51bWJlciA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwieGl4dWVcIik7XG4vLyAgICAgICAgIGxldCBmX2hzeGl4dWU6IG51bWJlciA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImhzeGl4dWVcIik7XG4vLyAgICAgICAgIGxldCBiZHhpeHVlOiBudW1iZXIgPSAwOyAvL+S/neW6leWQuOihgFxuLy8gICAgICAgICBsZXQgY2ZnID0gR2FtZWNmZy51c2VyRXAuZ2V0SXRlbShcInhpeHVlXCIpO1xuLy8gICAgICAgICBpZiAoY2ZnICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgIGJkeGl4dWUgPSBjZmcuaW5pdEVwO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGxldCB4eFJhdGU6IG51bWJlciA9IE1hdGgubWF4KGlfeGl4dWUgLSBmX2hzeGl4dWUsIGJkeGl4dWUpO1xuLy8gICAgICAgICBsZXQgaV9xaHhpeHVlOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcInFoeGl4dWVcIik7XG4vLyAgICAgICAgIGxldCBmX3JoeGl4dWU6IG51bWJlciA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcInJoeGl4dWVcIik7XG4vLyAgICAgICAgIGxldCB4eF9oaXQ6IG51bWJlciA9ICh6emhpdCAqIE1hdGgubWF4KChpX3FoeGl4dWUgLSBmX3JoeGl4dWUpIC8gMTAwMDAgKyAxLCAxKSAqIHh4UmF0ZSkgLyAxMDAwMDtcblxuLy8gICAgICAgICBpZiAodGhpcy5vbmVIaXRbaWlkXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICB0aGlzLm9uZUhpdFtpaWRdID0ge307XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICBpZiAoY2ZnU2sgIT0gbnVsbCAmJiBjZmdTay5za2lsbFR5cGUgPT0gMSkge1xuLy8gICAgICAgICAgICAgLy/mjIforqHnrpfmma7mlLtcbi8vICAgICAgICAgICAgIGxldCBwZ19oaXRfcGVyOiBudW1iZXIgPSAwO1xuLy8gICAgICAgICAgICAgLy/mma7mlLvmlr3liqBidWZmXG4vLyAgICAgICAgICAgICBsZXQgaV8xOV9hID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJpXzE5X2FcIik7XG4vLyAgICAgICAgICAgICBsZXQgaV8xOV9pID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJpXzE5X2lcIik7XG4vLyAgICAgICAgICAgICBpZiAoaV8xOV9hID4gMCAmJiBpXzE5X2kgPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgbGV0IGVmX2lfMTlfaSA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiZWZmZWN0X2lfXCIgKyBpXzE5X2ksIDIpO1xuLy8gICAgICAgICAgICAgICAgIHBnX2hpdF9wZXIgKz0gaV8xOV9hICogZWZfaV8xOV9pO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgbGV0IGlfMzlfYSA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiaV8zOV9hXCIpO1xuLy8gICAgICAgICAgICAgcGdfaGl0X3BlciArPSBpXzM5X2E7XG4vLyAgICAgICAgICAgICBwZ19oaXQgKz0gKHBnX2hpdF9wZXIgLyAxMDAwMCkgKiBwZ19oaXQ7XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICAvL+i+k+WHuuS8pOWus1xuLy8gICAgICAgICB0aGlzLm9uZUhpdFtpaWRdW2ZpaWRdID0ge1xuLy8gICAgICAgICAgICAgcGdoaXQ6IE1hdGguZmxvb3IocGdfaGl0KSwgLy/mma7mlLvkvKTlrrNcbi8vICAgICAgICAgICAgIHNraGl0OiBNYXRoLmZsb29yKHNrX2hpdCksIC8v5oqA6IO95Lyk5a6zXG4vLyAgICAgICAgICAgICBiamhpdDogTWF0aC5mbG9vcihial9oaXQpLCAvL+aatOWHu+S8pOWus1xuLy8gICAgICAgICAgICAgZ2RoaXQ6IE1hdGguZmxvb3IoZ2RfaGl0KSwgLy/moLzmjKHkvKTlrrNcbi8vICAgICAgICAgICAgIGZqaGl0OiBNYXRoLmZsb29yKGZqX2hpdCksIC8v5Y+N5Ye75Lyk5a6zXG4vLyAgICAgICAgICAgICBsamhpdDogTWF0aC5mbG9vcihsal9oaXQpLCAvL+i/nuWHu+S8pOWus1xuLy8gICAgICAgICAgICAganNoaXQ6IE1hdGguZmxvb3IoanNfaGl0KSwgLy/muoXlsITkvKTlrrMo5rKh5pyJ5oqY5o2f5q+U5L6L57O75pWwKVxuLy8gICAgICAgICAgICAgeHhoaXQ6IE1hdGguZmxvb3IoeHhfaGl0KSwgLy/lkLjooYDlgLxcbi8vICAgICAgICAgICAgIHh4UmF0ZTogeHhSYXRlLCAvL+WQuOihgOamgueOh1xuLy8gICAgICAgICAgICAganNSYXRlOiBqc1JhdGUsIC8v5rqF5bCE5qaC546HXG4vLyAgICAgICAgICAgICBmanNSYXRlOiBmanNSYXRlLCAvL+WPjeWHu+a6heWwhOamgueOh1xuLy8gICAgICAgICB9O1xuXG4vLyAgICAgICAgIC8v5Lyk5a6z5Yqg5rexXG4vLyAgICAgICAgIGlmICh0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImVmZmVjdF9pXzUzXCIsIDIpID4gMCkge1xuLy8gICAgICAgICAgICAgbGV0IGhpdDUzID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJpXzUzXCIpO1xuLy8gICAgICAgICAgICAgdGhpcy5vbmVIaXRbaWlkXVtmaWlkXSA9IHtcbi8vICAgICAgICAgICAgICAgICBwZ2hpdDogaGl0NTMsIC8v5pmu5pS75Lyk5a6zXG4vLyAgICAgICAgICAgICAgICAgc2toaXQ6IGhpdDUzLCAvL+aKgOiDveS8pOWus1xuLy8gICAgICAgICAgICAgICAgIGJqaGl0OiBoaXQ1MywgLy/mmrTlh7vkvKTlrrNcbi8vICAgICAgICAgICAgICAgICBnZGhpdDogTWF0aC5mbG9vcihnZF9oaXQpLCAvL+agvOaMoeS8pOWus1xuLy8gICAgICAgICAgICAgICAgIGZqaGl0OiBNYXRoLmZsb29yKGZqX2hpdCksIC8v5Y+N5Ye75Lyk5a6zXG4vLyAgICAgICAgICAgICAgICAgbGpoaXQ6IGhpdDUzLCAvL+i/nuWHu+S8pOWus1xuLy8gICAgICAgICAgICAgICAgIGpzaGl0OiBoaXQ1MywgLy/muoXlsITkvKTlrrMo5rKh5pyJ5oqY5o2f5q+U5L6L57O75pWwKVxuLy8gICAgICAgICAgICAgICAgIHh4aGl0OiBNYXRoLmZsb29yKHh4X2hpdCksIC8v5ZC46KGA5YC8XG4vLyAgICAgICAgICAgICAgICAgeHhSYXRlOiB4eFJhdGUsIC8v5ZC46KGA5qaC546HXG4vLyAgICAgICAgICAgICAgICAganNSYXRlOiBqc1JhdGUsIC8v5rqF5bCE5qaC546HXG4vLyAgICAgICAgICAgICAgICAgZmpzUmF0ZTogZmpzUmF0ZSwgLy/lj43lh7vmuoXlsITmpoLnjodcbi8vICAgICAgICAgICAgIH07XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICBpZiAoTnVtYmVyKGlpZCkgJSAxMDAgPCAxMCAmJiBOdW1iZXIoaWlkKSAlIDEwMCA+IDAgJiYgdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJlZmZlY3RfaV82NFwiLCAyKSA+IDApIHtcbi8vICAgICAgICAgICAgIC8vIOaYr+W8n+WtkCDpppbmrKHlop7kvKRcbi8vICAgICAgICAgICAgIGxldCBpXzY0X2EgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImlfNjRfYVwiKTtcbi8vICAgICAgICAgICAgIGxldCBpXzY0X25aaGVuID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJpXzY0X25aaGVuXCIpO1xuLy8gICAgICAgICAgICAgaWYgKGlfNjRfYSA+IDAgJiYgaV82NF9uWmhlbiA8PSB0aGlzLnpoZW4pIHtcbi8vICAgICAgICAgICAgICAgICAvLyDlj6rliqDkuIDmrKFcbi8vICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9zdWJfYWxsKGlpZCwgXCJlZmZlY3RfaV82NFwiKTtcbi8vICAgICAgICAgICAgICAgICB0aGlzLm9uZUhpdFtpaWRdW2ZpaWRdLnNraGl0ID0gTWF0aC5mbG9vcih0aGlzLm9uZUhpdFtpaWRdW2ZpaWRdLnNraGl0ICogKGlfNjRfYSAvIDEwMDAwICsgMSkpO1xuLy8gICAgICAgICAgICAgICAgIHRoaXMub25lSGl0W2lpZF1bZmlpZF0ucGdoaXQgPSBNYXRoLmZsb29yKHRoaXMub25lSGl0W2lpZF1bZmlpZF0ucGdoaXQgKiAoaV82NF9hIC8gMTAwMDAgKyAxKSk7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICB9XG5cbi8vICAgICBwcml2YXRlIHNrX2Jhc2UyKGlpZDogc3RyaW5nLCBydW5TdGF0dXM6IG51bWJlciwgY3M6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fSkge1xuLy8gICAgICAgICBsZXQgdHlwZSA9IE51bWJlcihpaWQpICUgMTAwID09IDAgPyAxIDogTnVtYmVyKGlpZCkgJSAxMDAgPiAwICYmIE51bWJlcihpaWQpICUgMTAwIDwgMTAgPyAyIDogMztcbi8vICAgICAgICAgaWYgKHRoaXMub2JqZWN0c1tpaWQubGVuZ3RoXSA9PSBudWxsIHx8IHRoaXMub2JqZWN0c1tpaWQubGVuZ3RoXVt0eXBlXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICByZXR1cm47XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgbGV0IGNmX3NrOiB7IFtza2lsbFR5cGU6IHN0cmluZ106IFtzdHJpbmcsIHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0sIG51bWJlcl1bXSB9ID0ge307IC8v5b2T5YmN6KaB6Kem5Y+R55qE5oqA6IO95bqTXG4vLyAgICAgICAgIGxldCBza2lkczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyh0aGlzLm9iamVjdHNbaWlkLmxlbmd0aF1bdHlwZV0pO1xuLy8gICAgICAgICBmb3IgKGxldCBpbmRleCA9IHNraWRzLmxlbmd0aCAtIDE7IGluZGV4ID49IDA7IGluZGV4LS0pIHtcbi8vICAgICAgICAgICAgIGxldCBza2lkID0gc2tpZHNbaW5kZXhdO1xuLy8gICAgICAgICAgICAgbGV0IHNrbHYgPSB0aGlzLm9iamVjdHNbaWlkLmxlbmd0aF1bdHlwZV1bc2tpZF0uc2tsdjtcbi8vICAgICAgICAgICAgIGxldCBza2x2Q2QgPSAxMDA7XG4vLyAgICAgICAgICAgICBsZXQgY2ZnU2sgPSBHYW1lY2ZnLnNraWxsQmFzZS5nZXRJdGVtKHNraWQsIHNrbHYudG9TdHJpbmcoKSk7XG4vLyAgICAgICAgICAgICBpZiAoY2ZnU2sgPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+ayoeaciei/meS4quaKgOiDvSAg5oiW6ICFIOi/meS4quaKgOiDveeahOinpuWPkeaXtuacuuS4jeWvuVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgaWYgKGNmZ1NrLnJ1blN0YXR1cyAhPSBydW5TdGF0dXMpIHtcbi8vICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy/msqHmnInov5nkuKrmioDog70gIOaIluiAhSDov5nkuKrmioDog73nmoTop6blj5Hml7bmnLrkuI3lr7lcbi8vICAgICAgICAgICAgIH1cblxuLy8gICAgICAgICAgICAgaWYgKGNmZ1NrLnJ1blN0YXR1cyA9PT0gNCAmJiAhY2ZnU2suY2QgJiYgdGhpcy56aGVuICE9IDEpIHtcbi8vICAgICAgICAgICAgICAgICAvLyDmsqHmnIljZOeahCBydW5TdGF0dXM9NOeahOWPquWcqOaImOaWl+W8gOWni+aXtuWKoOS4gOasoVxuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgfVxuXG4vLyAgICAgICAgICAgICAvL+WPl+WIsOaUu+WHu+WQjuinpuWPkVxuLy8gICAgICAgICAgICAgaWYgKGNmZ1NrLnJ1blN0YXR1cyA9PSAyKSB7XG4vLyAgICAgICAgICAgICAgICAgLy/ooqvmiZPmrKHmlbBcbi8vICAgICAgICAgICAgICAgICBsZXQgYmRjb25zID0gdGhpcy51dWlkc1tpaWRdLmZjb25zWzBdICsgdGhpcy51dWlkc1tpaWRdLmZjb25zWzFdICsgdGhpcy51dWlkc1tpaWRdLmZjb25zWzJdO1xuLy8gICAgICAgICAgICAgICAgIGlmIChiZGNvbnMgPT0gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy/ov5jmsqHooqvmiZNcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eShjZmdTay5oaXROdW1iZXIpID09IGZhbHNlICYmIGJkY29ucyAlIGNmZ1NrLmhpdE51bWJlciA+IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5pyq57Sv6K6h5Yiw5qyh5pWwXG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuXG4vLyAgICAgICAgICAgICBsZXQgZWZmX2lfMyA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiZWZmZWN0X2lfM1wiLCAyKTtcbi8vICAgICAgICAgICAgIGlmIChlZmZfaV8zID4gMCkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+aZleecqVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgbGV0IGVmZl9pXzUgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImVmZmVjdF9pXzVcIiwgMik7XG4vLyAgICAgICAgICAgICBpZiAoZWZmX2lfNSA+IDApIHtcbi8vICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy/mmZXnnKlcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGxldCBlZmZfaV82ID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJlZmZlY3RfaV82XCIsIDIpO1xuLy8gICAgICAgICAgICAgaWYgKGVmZl9pXzYgPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5Ye76YCAXG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBsZXQgZWZmX2lfMTYgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImVmZmVjdF9pXzE2XCIsIDIpO1xuLy8gICAgICAgICAgICAgaWYgKGVmZl9pXzE2ID4gMCkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+WFpeWumueKtuaAgVxuLy8gICAgICAgICAgICAgfVxuXG4vLyAgICAgICAgICAgICAvLygx5pmu5pS777yMMiDooqvliqjvvIwz5oqA6IO977yJXG4vLyAgICAgICAgICAgICBpZiAoY2ZnU2suc2tpbGxUeXBlICE9IDEpIHtcbi8vICAgICAgICAgICAgICAgICBsZXQgZWZmX2lfMSA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiZWZmZWN0X2lfMVwiLCAyKTtcbi8vICAgICAgICAgICAgICAgICBpZiAoZWZmX2lfMSA+IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgLy/msonpu5hcbi8vICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuXG4vLyAgICAgICAgICAgICAvL+WIneWni+WMluaKgOiDvVxuLy8gICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0gPSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGxhc3Q6IDAsIC8v5pyA5ZCO5LiA5qyh5Ye65omL5binXG4vLyAgICAgICAgICAgICAgICAgICAgIGNvdW50OiAwLFxuLy8gICAgICAgICAgICAgICAgICAgICBhY3Rpb246IHt9LFxuLy8gICAgICAgICAgICAgICAgICAgICBlZmZlY3Q6IHt9LFxuLy8gICAgICAgICAgICAgICAgIH07XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAvL+aKgOiDvWNkXG4vLyAgICAgICAgICAgICBsZXQgY3MyOntba2V5OnN0cmluZ106bnVtYmVyfSA9IGdhbWVNZXRob2Qub2JqQ29weShjcylcbi8vICAgICAgICAgICAgIGNzMltcImNkXCJdID0gZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ1NrLmNkKSA/IDAgOiBjZmdTay5jZCAqIDMwO1xuLy8gICAgICAgICAgICAgY3MyW1wiY2QyXCJdID0gZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ1NrLmNkMikgPyAwIDogKHBhcnNlSW50KGlpZCkgJSAxMDAgPT0gMTAgPyAoY2ZnU2suY2QyICogMzAgKiBza2x2Q2QpIC8gMTAwIDogY2ZnU2suY2QyICogMzApO1xuLy8gICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0ubGFzdCArIGNzW1wiY2RcIl0gPiB0aGlzLnpoZW4pIHtcbi8vICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy/lhrfljbTml7bpl7Tov5jmsqHliLBcbi8vICAgICAgICAgICAgIH1cblxuLy8gICAgICAgICAgICAgLy/mrKHmlbDliKTlrppcbi8vICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnU2suY291bnQpID09IGZhbHNlICYmIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uY291bnQgPj0gY2ZnU2suY291bnQpIHtcbi8vICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy/msqHmnInmrKHmlbDkuoZcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnU2suY2hhbmNlKSA9PSBmYWxzZSAmJiB0aGlzLnNlZWRSYW5kLnJhbmQoMSwgMTAwMDApID4gY2ZnU2suY2hhbmNlICogMTAwMDApIHtcbi8vICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy/msqHmnInop6blj5Hov5nkuKrmioDog71cbi8vICAgICAgICAgICAgIH1cblxuLy8gICAgICAgICAgICAgaWYgKGNmZ1NrLnNraWxsVHlwZSA9PSAyKSB7XG4vLyAgICAgICAgICAgICAgICAgLy/ooqvliqhcbi8vICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ZnU2suc2tpbGxUeXBlID09IDMpIHtcbi8vICAgICAgICAgICAgICAgICAvL+eJueauiuaKgOiDvVxuLy8gICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgaWlkLCBcImFUeXBlXCIsIFh5cy5BY3Rpb25UeXBlLmF0ayk7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiYVNraWRcIiwgc2tpZCk7XG4vLyAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgIC8v5YWI5om+5Ye66Kem5Y+R55qE5oqA6IO9SURcbi8vICAgICAgICAgICAgIGlmIChjZl9za1tjZmdTay5za2lsbFR5cGVdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICBjZl9za1tjZmdTay5za2lsbFR5cGVdID0gW107XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBjZl9za1tjZmdTay5za2lsbFR5cGVdLnB1c2goW3NraWQsIGNzMiwgc2tsdl0pO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHJldHVybiBjZl9zaztcbi8vICAgICB9XG4vLyAgICAgcHJpdmF0ZSBza19iYXNlT2JqUnVuNChpaWQ6IHN0cmluZykge1xuLy8gICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMudGVhbXNbaWlkXS5pc0hpZGUpID09IGZhbHNlKSB7XG4vLyAgICAgICAgICAgICByZXR1cm47IC8v6ZqQ6JePXG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgbGV0IHNraWRzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHRoaXMudGVhbXNbaWlkXS5zayk7XG4vLyAgICAgICAgIGxldCB0eXBlID0gTnVtYmVyKGlpZCkgJSAxMDAgPT0gMCA/IDEgOiBOdW1iZXIoaWlkKSAlIDEwMCA+IDAgJiYgTnVtYmVyKGlpZCkgJSAxMDAgPCAxMCA/IDIgOiAzO1xuLy8gICAgICAgICBmb3IgKGxldCBpbmRleCA9IHNraWRzLmxlbmd0aCAtIDE7IGluZGV4ID49IDA7IGluZGV4LS0pIHtcbi8vICAgICAgICAgICAgIGxldCBza2lkID0gc2tpZHNbaW5kZXhdO1xuLy8gICAgICAgICAgICAgbGV0IHNrbHYgPSB0aGlzLnRlYW1zW2lpZF0uc2tbc2tpZF1bMF07XG4vLyAgICAgICAgICAgICBsZXQgY2ZnU2sgPSBHYW1lY2ZnLnNraWxsQmFzZS5nZXRJdGVtKHNraWQsIHNrbHYudG9TdHJpbmcoKSk7XG4vLyAgICAgICAgICAgICBpZiAoY2ZnU2sgJiYgY2ZnU2sub2JqZWN0ICYmIHR5cGUgIT0gY2ZnU2sub2JqZWN0KSB7XG4vLyAgICAgICAgICAgICAgICAgLy8g6Z2e57uZ6Ieq5bex5Yqg55qE5oqA6IO9IOWcqOaImOaWl+WJjeWIneWni+WMllxuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLm9iamVjdHNbaWlkLmxlbmd0aF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLm9iamVjdHNbaWlkLmxlbmd0aF0gPSB7fTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMub2JqZWN0c1tpaWQubGVuZ3RoXVtjZmdTay5vYmplY3RdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5vYmplY3RzW2lpZC5sZW5ndGhdW2NmZ1NrLm9iamVjdF0gPSB7fTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMub2JqZWN0c1tpaWQubGVuZ3RoXVtjZmdTay5vYmplY3RdW2NmZ1NrLmlkXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMub2JqZWN0c1tpaWQubGVuZ3RoXVtjZmdTay5vYmplY3RdW2NmZ1NrLmlkXSA9IHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNkOiBjZmdTay5jZCA/IGNmZ1NrLmNkIDogMCxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHNrbHY6IHNrbHYsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpaWRzOiB7fSxcbi8vICAgICAgICAgICAgICAgICAgICAgfTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICB9XG4vLyAgICAgLyoqXG4vLyAgICAgICog6L6F5Yqp5Ye95pWwIC0g5oqA6IO96Kem5Y+RXG4vLyAgICAgICogQHBhcmFtIGlpZCDop6blj5HogIVcbi8vICAgICAgKiBAcGFyYW0gcnVuU3RhdHVzICDmioDog73op6blj5Hml7bmnLpcbi8vICAgICAgKiAx77ya5pS75Ye75pe26YCg5oiQ5Lyk5a6zXG4vLyAgICAgICogMu+8muWPl+WIsOaUu+WHu+aXtlxuLy8gICAgICAqIDPvvJrngbXlipvmu6HmgJLml7bph4rmlL5cbi8vICAgICAgKiA077ya6L+b5YWl5oiY5paX5ZCO77yM6L+Y5rKh5pS75Ye75YmNXG4vLyAgICAgICogNe+8mui/m+WFpeaImOaWl+WQjix456eS5YaFXG4vLyAgICAgICogNjrmlLvlh7vml7bpgKDmiJDkvKTlrrPvvIzlubbkuJTnm67moIfmiJDlip/moLzmjKHvvIjms6jmhI/lkowx57G75Z6L5piv5LiN5ZCM55qE77yJXG4vLyAgICAgICogNy7lj43lh7vml7Zcbi8vICAgICAgKiA4LuiHqui6q+agvOaMoeaXtuOAguWSjDbnsbvlnovkuI3lkIzvvIw257G75Z6L5piv5pWM5pa55qC85oyhXG4vLyAgICAgICpcbi8vICAgICAgKi9cbi8vICAgICBwcml2YXRlIHNrX2Jhc2UoaWlkOiBzdHJpbmcsIHJ1blN0YXR1czogbnVtYmVyLCBjczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9KSB7XG4vLyAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkodGhpcy50ZWFtc1tpaWRdLmlzSGlkZSkgPT0gZmFsc2UpIHtcbi8vICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy/pmpDol49cbi8vICAgICAgICAgfVxuLy8gICAgICAgICBsZXQgc2tpZHM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXModGhpcy50ZWFtc1tpaWRdLnNrKTtcbi8vICAgICAgICAgbGV0IHR5cGUgPSBOdW1iZXIoaWlkKSAlIDEwMCA9PSAwID8gMSA6IE51bWJlcihpaWQpICUgMTAwID4gMCAmJiBOdW1iZXIoaWlkKSAlIDEwMCA8IDEwID8gMiA6IDM7XG4vLyAgICAgICAgIGxldCBjZl9zazogeyBbc2tpbGxUeXBlOiBzdHJpbmddOiBbc3RyaW5nLCB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9LCBudW1iZXJdW10gfSA9IHt9OyAvL+W9k+WJjeimgeinpuWPkeeahOaKgOiDveW6k1xuLy8gICAgICAgICBmb3IgKGxldCBpbmRleCA9IHNraWRzLmxlbmd0aCAtIDE7IGluZGV4ID49IDA7IGluZGV4LS0pIHtcbi8vICAgICAgICAgICAgIGxldCBza2lkID0gc2tpZHNbaW5kZXhdO1xuLy8gICAgICAgICAgICAgbGV0IHNrbHYgPSB0aGlzLnRlYW1zW2lpZF0uc2tbc2tpZF1bMF07XG4vLyAgICAgICAgICAgICBsZXQgc2tsdkNkID0gdGhpcy50ZWFtc1tpaWRdLnNrW3NraWRdWzFdO1xuLy8gICAgICAgICAgICAgbGV0IGNmZ1NrID0gR2FtZWNmZy5za2lsbEJhc2UuZ2V0SXRlbShza2lkLCBza2x2LnRvU3RyaW5nKCkpO1xuLy8gICAgICAgICAgICAgaWYgKGNmZ1NrID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy/msqHmnInov5nkuKrmioDog70gIOaIluiAhSDov5nkuKrmioDog73nmoTop6blj5Hml7bmnLrkuI3lr7lcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGlmIChjZmdTay5vYmplY3QgJiYgdHlwZSAhPSBjZmdTay5vYmplY3QpIHtcbi8vICAgICAgICAgICAgICAgICAvLyDkuI3mmK/liqDnu5noh6rlt7HnmoTmioDog71cbi8vICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ZnU2sucnVuU3RhdHVzICE9IHJ1blN0YXR1cykge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+ayoeaciei/meS4quaKgOiDvSAg5oiW6ICFIOi/meS4quaKgOiDveeahOinpuWPkeaXtuacuuS4jeWvuVxuLy8gICAgICAgICAgICAgfVxuXG4vLyAgICAgICAgICAgICAvL+WPl+WIsOaUu+WHu+WQjuinpuWPkVxuLy8gICAgICAgICAgICAgaWYgKGNmZ1NrLnJ1blN0YXR1cyA9PSAyKSB7XG4vLyAgICAgICAgICAgICAgICAgLy/ooqvmiZPmrKHmlbBcbi8vICAgICAgICAgICAgICAgICBsZXQgYmRjb25zID0gdGhpcy51dWlkc1tpaWRdLmZjb25zWzBdICsgdGhpcy51dWlkc1tpaWRdLmZjb25zWzFdICsgdGhpcy51dWlkc1tpaWRdLmZjb25zWzJdO1xuLy8gICAgICAgICAgICAgICAgIGlmIChiZGNvbnMgPT0gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy/ov5jmsqHooqvmiZNcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eShjZmdTay5oaXROdW1iZXIpID09IGZhbHNlICYmIGJkY29ucyAlIGNmZ1NrLmhpdE51bWJlciA+IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5pyq57Sv6K6h5Yiw5qyh5pWwXG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuXG4vLyAgICAgICAgICAgICBsZXQgZWZmX2lfMyA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiZWZmZWN0X2lfM1wiLCAyKTtcbi8vICAgICAgICAgICAgIGlmIChlZmZfaV8zID4gMCkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+aZleecqVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgbGV0IGVmZl9pXzUgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImVmZmVjdF9pXzVcIiwgMik7XG4vLyAgICAgICAgICAgICBpZiAoZWZmX2lfNSA+IDApIHtcbi8vICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy/mmZXnnKlcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGxldCBlZmZfaV82ID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJlZmZlY3RfaV82XCIsIDIpO1xuLy8gICAgICAgICAgICAgaWYgKGVmZl9pXzYgPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5Ye76YCAXG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBsZXQgZWZmX2lfMTYgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImVmZmVjdF9pXzE2XCIsIDIpO1xuLy8gICAgICAgICAgICAgaWYgKGVmZl9pXzE2ID4gMCkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+WFpeWumueKtuaAgVxuLy8gICAgICAgICAgICAgfVxuXG4vLyAgICAgICAgICAgICAvLygx5pmu5pS777yMMiDooqvliqjvvIwz5oqA6IO977yJXG4vLyAgICAgICAgICAgICBpZiAoY2ZnU2suc2tpbGxUeXBlICE9IDEpIHtcbi8vICAgICAgICAgICAgICAgICBsZXQgZWZmX2lfMSA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiZWZmZWN0X2lfMVwiLCAyKTtcbi8vICAgICAgICAgICAgICAgICBpZiAoZWZmX2lfMSA+IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgLy/msonpu5hcbi8vICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuXG4vLyAgICAgICAgICAgICAvL+WIneWni+WMluaKgOiDvVxuLy8gICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0gPSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGxhc3Q6IDAsIC8v5pyA5ZCO5LiA5qyh5Ye65omL5binXG4vLyAgICAgICAgICAgICAgICAgICAgIGNvdW50OiAwLFxuLy8gICAgICAgICAgICAgICAgICAgICBhY3Rpb246IHt9LFxuLy8gICAgICAgICAgICAgICAgICAgICBlZmZlY3Q6IHt9LFxuLy8gICAgICAgICAgICAgICAgIH07XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAvL+aKgOiDvWNkXG4vLyAgICAgICAgICAgICBsZXQgY3MyOntba2V5OnN0cmluZ106bnVtYmVyfSA9IGdhbWVNZXRob2Qub2JqQ29weShjcylcbi8vICAgICAgICAgICAgIGNzMltcImNkXCJdID0gZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ1NrLmNkKSA/IDAgOiAocGFyc2VJbnQoaWlkKSAlIDEwMCA9PSAxMCA/IChjZmdTay5jZCAqIDMwICogc2tsdkNkKSAvIDEwMCA6IGNmZ1NrLmNkICogMzApO1xuLy8gICAgICAgICAgICAgY3MyW1wiY2QyXCJdID0gZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ1NrLmNkMikgPyAwIDogKHBhcnNlSW50KGlpZCkgJSAxMDAgPT0gMTAgPyAoY2ZnU2suY2QyICogMzAgKiBza2x2Q2QpIC8gMTAwIDogY2ZnU2suY2QyICogMzApO1xuLy8gICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0ubGFzdCArIGNzMltcImNkXCJdID4gdGhpcy56aGVuKSB7XG4vLyAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5Ya35Y205pe26Ze06L+Y5rKh5YiwXG4vLyAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgIC8v5qyh5pWw5Yik5a6aXG4vLyAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ1NrLmNvdW50KSA9PSBmYWxzZSAmJiB0aGlzLnV1aWRzW2lpZF0uc2tiYXNlW3NraWRdLmNvdW50ID49IGNmZ1NrLmNvdW50KSB7XG4vLyAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5rKh5pyJ5qyh5pWw5LqGXG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ1NrLmNoYW5jZSkgPT0gZmFsc2UgJiYgdGhpcy5zZWVkUmFuZC5yYW5kKDEsIDEwMDAwKSA+IGNmZ1NrLmNoYW5jZSAqIDEwMDAwKSB7XG4vLyAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5rKh5pyJ6Kem5Y+R6L+Z5Liq5oqA6IO9XG4vLyAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgIGlmIChjZmdTay5za2lsbFR5cGUgPT0gMikge1xuLy8gICAgICAgICAgICAgICAgIC8v6KKr5YqoXG4vLyAgICAgICAgICAgICB9IGVsc2UgaWYgKGNmZ1NrLnNraWxsVHlwZSA9PSAzKSB7XG4vLyAgICAgICAgICAgICAgICAgLy/nibnmrormioDog71cbi8vICAgICAgICAgICAgICAgICB0aGlzLnNrX2Jhc2UoaWlkLCA1LCBjczIpO1xuLy8gICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgaWlkLCBcImFUeXBlXCIsIFh5cy5BY3Rpb25UeXBlLmF0ayk7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiYVNraWRcIiwgc2tpZCk7XG4vLyAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgIC8v5YWI5om+5Ye66Kem5Y+R55qE5oqA6IO9SURcbi8vICAgICAgICAgICAgIGlmIChjZl9za1tjZmdTay5za2lsbFR5cGVdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICBjZl9za1tjZmdTay5za2lsbFR5cGVdID0gW107XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBjZl9za1tjZmdTay5za2lsbFR5cGVdLnB1c2goW3NraWQsIGNzMiwgc2tsdl0pO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIC8vIOiOt+WPluWFseS6q+aKgOiDvVxuLy8gICAgICAgICBsZXQgY2Zfc2syID0gdGhpcy5za19iYXNlMihpaWQsIHJ1blN0YXR1cywgY3MpO1xuLy8gICAgICAgICBpZiAoY2Zfc2syICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMoY2Zfc2syKTtcbi8vICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuLy8gICAgICAgICAgICAgICAgIGxldCBrZXlzMiA9IE9iamVjdC5rZXlzKGNmX3NrMltrZXlzW2ldXSk7XG4vLyAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBrZXlzMi5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoY2Zfc2tba2V5c1tpXV0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY2Zfc2tba2V5c1tpXV0gPSBbXTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBjZl9za1trZXlzW2ldXS5wdXNoKGNmX3NrMltrZXlzW2ldXVtrXSk7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG4vLyAgICAgICAgIC8v6Kem5Y+R55qE5oqA6IO95YiX6KGoXG4vLyAgICAgICAgIGxldCBjZmlkczogW3N0cmluZywgeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSwgbnVtYmVyXVtdID0gW107XG4vLyAgICAgICAgIGlmIChjZl9za1szXSAhPSBudWxsKSB7XG4vLyAgICAgICAgICAgICAvL+WPquimgeinpuWPkemrmOe6p+aKgOiDvSAg5bCx5LiN6Kem5Y+R5pmu6YCa5pS75Ye75oqA6IO9XG4vLyAgICAgICAgICAgICBjZmlkcyA9IGdhbWVNZXRob2QuYWRkQXJyKGNmaWRzLCBjZl9za1szXSk7XG4vLyAgICAgICAgIH0gZWxzZSBpZiAoY2Zfc2tbMV0gIT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgY2ZpZHMgPSBnYW1lTWV0aG9kLmFkZEFycihjZmlkcywgY2Zfc2tbMV0pO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmIChjZl9za1syXSAhPSBudWxsKSB7XG4vLyAgICAgICAgICAgICAvL+iiq+WKqOaKgOiDvVxuLy8gICAgICAgICAgICAgY2ZpZHMgPSBnYW1lTWV0aG9kLmFkZEFycihjZmlkcywgY2Zfc2tbMl0pO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmIChjZmlkcy5sZW5ndGggPD0gMCkge1xuLy8gICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIC8vIOi/memHjOaJjeaYr+ecn+ato+WHuuaJi+S6hueahOWcsOaWuVxuLy8gICAgICAgICBpZiAocnVuU3RhdHVzICE9IDQgJiYgcnVuU3RhdHVzICE9IDIgJiYgcnVuU3RhdHVzICE9IDcgJiYgcnVuU3RhdHVzICE9IDgpIHtcbi8vICAgICAgICAgICAgIC8vIOaImOaWl+WJjeinpuWPkeeahOeJueaApy/ooqvliqgg5LiN566XXG4vLyAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0ubGFzdCA9IHRoaXMuemhlbjtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBsZXQgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhjZmlkcyk7XG4vLyAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4vLyAgICAgICAgICAgICBpZiAodmFsdWVzW2ldWzFdW1wiZG9faWlkXCJdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICB2YWx1ZXNbaV1bMV1bXCJkb19paWRcIl0gPSBOdW1iZXIoaWlkKTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGxldCBjczIgPSB2YWx1ZXNbaV1bMV1cbi8vICAgICAgICAgICAgIGlmIChjczJbXCJoaXRcIl0gIT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIHZhbHVlc1tpXVsxXVtcImhpdFwiXSA9IGNzMltcImhpdFwiXTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGxldCBza2lkID0gdmFsdWVzW2ldWzBdO1xuLy8gICAgICAgICAgICAgbGV0IHNrbHYgPSB2YWx1ZXNbaV1bMl07XG4vLyAgICAgICAgICAgICBsZXQgY2ZnU2sgPSBHYW1lY2ZnLnNraWxsQmFzZS5nZXRJdGVtKHZhbHVlc1tpXVswXSwgc2tsdi50b1N0cmluZygpKTtcbi8vICAgICAgICAgICAgIGlmIChjZmdTayA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5rKh5pyJ6L+Z5Liq5oqA6IO9ICDmiJbogIUg6L+Z5Liq5oqA6IO955qE6Kem5Y+R5pe25py65LiN5a+5XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBpZiAoY2ZnU2sudHlwZSA9PSBcIjNcIil7XG4vLyAgICAgICAgICAgICAgICAgLy8g5pyv5rOV6Kem5Y+RXG4vLyAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiZWZmZWN0XCIsIFtcInNodWZhXCIsc2tpZF0pO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLnNrYmFzZVtza2lkXS5sYXN0ID0gdGhpcy56aGVuICsgKGNzMltcImNkMlwiXT4wJiZjczJbXCJjZFwiXT09MD9jczJbXCJjZDJcIl06MCk7XG4vLyAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0uc2tiYXNlW3NraWRdLmNvdW50ICs9IDE7XG4vLyAgICAgICAgICAgICBpZiAoY2ZnU2suc2VxdWVuY2UgPT0gMikge1xuLy8gICAgICAgICAgICAgICAgIC8v5pWI5p6c5YiX6KGoXG4vLyAgICAgICAgICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eShjZmdTay5lZmZlY3QpID09IGZhbHNlKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBsYXN0SWQgPSBcIlwiO1xuLy8gICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGNmZ1NrLmVmZmVjdC5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za19lZmZlY3QoaWlkLCB2YWx1ZXNbaV1bMF0sIGNmZ1NrLmVmZmVjdFtrXS50b1N0cmluZygpLCBsYXN0SWQsIHZhbHVlc1tpXVsxXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0SWQgPSBcImVmZmVjdF9pZF9cIiArIGNmZ1NrLmVmZmVjdFtrXTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAvL+ihjOS4uuWIl+ihqFxuLy8gICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnU2suYWN0aW9ucykgPT0gZmFsc2UpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3RJZCA9IFwiXCI7XG4vLyAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjZmdTay5hY3Rpb25zLmxlbmd0aDsgaW5kZXgrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFjSWQgPSBjZmdTay5hY3Rpb25zW2luZGV4XTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfYWN0aW9uKGlpZCwgdmFsdWVzW2ldWzBdLCBhY0lkLnRvU3RyaW5nKCksIGxhc3RJZCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0SWQgPSBcImFjdGlvbl9pZF9cIiArIGFjSWQ7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgIC8v6KGM5Li65YiX6KGoXG4vLyAgICAgICAgICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eShjZmdTay5hY3Rpb25zKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdElkID0gXCJcIjtcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNmZ1NrLmFjdGlvbnMubGVuZ3RoOyBpbmRleCsrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWNJZCA9IGNmZ1NrLmFjdGlvbnNbaW5kZXhdO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za19hY3Rpb24oaWlkLCB2YWx1ZXNbaV1bMF0sIGFjSWQudG9TdHJpbmcoKSwgbGFzdElkKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RJZCA9IFwiYWN0aW9uX2lkX1wiICsgYWNJZDtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAvL+aViOaenOWIl+ihqFxuLy8gICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnU2suZWZmZWN0KSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdElkID0gXCJcIjtcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjZmdTay5lZmZlY3QubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfZWZmZWN0KGlpZCwgdmFsdWVzW2ldWzBdLCBjZmdTay5lZmZlY3Rba10udG9TdHJpbmcoKSwgbGFzdElkLCB2YWx1ZXNbaV1bMV0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGFzdElkID0gXCJlZmZlY3RfaWRfXCIgKyBjZmdTay5lZmZlY3Rba107XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgcmV0dXJuIHRydWU7XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog6L6F5Yqp5Ye95pWwIC0g5oqA6IO96KGM5Li6XG4vLyAgICAgICogQHBhcmFtIGlpZCDop6blj5HogIVcbi8vICAgICAgKiBAcGFyYW0gcnVuU3RhdHVzICDmioDog73op6blj5Hml7bmnLpcbi8vICAgICAgKiAx77ya5pS75Ye75pe26YCg5oiQ5Lyk5a6zXG4vLyAgICAgICogMu+8muWPl+WIsOaUu+WHu+aXtlxuLy8gICAgICAqIDPvvJrngbXlipvmu6HmgJLml7bph4rmlL5cbi8vICAgICAgKiA077ya6L+b5YWl5oiY5paX5ZCO77yM6L+Y5rKh5pS75Ye75YmNXG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSBza19hY3Rpb24oaWlkOiBzdHJpbmcsIHNraWQ6IHN0cmluZywgYWNJZDogc3RyaW5nLCBleHRlbmQ6IHN0cmluZyA9IFwiXCIpIHtcbi8vICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eSh0aGlzLnRlYW1zW2lpZF0uaXNIaWRlKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgcmV0dXJuOyAvL+makOiXj1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGxldCBjZmdBYyA9IEdhbWVjZmcuc2tpbGxBY3Rpb24uZ2V0SXRlbShhY0lkKTtcbi8vICAgICAgICAgaWYgKGNmZ0FjID09IG51bGwpIHtcbi8vICAgICAgICAgICAgIHJldHVybjtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBpZiAodGhpcy5vbmVGaWlkc1tpaWRdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgIHRoaXMub25lRmlpZHNbaWlkXSA9IHt9O1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGxldCBhY190dHlwZSA9IFwiYWN0aW9uX2lkX1wiICsgYWNJZDsgLy/lr7nmiYvmoIfor4Zcbi8vICAgICAgICAgLy/nu6fmib/kuIrkuIDmrKHnmoTnm67moIdcbi8vICAgICAgICAgaWYgKGV4dGVuZCAhPSBcIlwiKSB7XG4vLyAgICAgICAgICAgICAvL+i/memHjOWPr+S7peWFiOe7p+aJv1xuLy8gICAgICAgICAgICAgdGhpcy5vbmVGaWlkc1tpaWRdW2FjX3R0eXBlXSA9IHRoaXMub25lRmlpZHNbaWlkXVtleHRlbmRdO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGxldCB0YXJnZXRUeXBlOiBudW1iZXIgPSAwOyAvL+ebruagh+aVsOmHj1xuLy8gICAgICAgICAvL+ebruagh+aVsOmHj1xuLy8gICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ0FjLnRhcmdldFR5cGUpID09IHRydWUpIHtcbi8vICAgICAgICAgICAgIHRhcmdldFR5cGUgPSAxMDtcbi8vICAgICAgICAgfSBlbHNlIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnQWMudGFyZ2V0VHlwZVsxXSkgPT0gdHJ1ZSkge1xuLy8gICAgICAgICAgICAgdGFyZ2V0VHlwZSA9IGNmZ0FjLnRhcmdldFR5cGVbMF07XG4vLyAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICB0YXJnZXRUeXBlID0gdGhpcy5zZWVkUmFuZC5yYW5kKGNmZ0FjLnRhcmdldFR5cGVbMF0sIGNmZ0FjLnRhcmdldFR5cGVbMV0pO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHRoaXMuZmluZF9maWlkcyhhY190dHlwZSwgaWlkLCBjZmdBYy50dHlwZSwgdGFyZ2V0VHlwZSwgY2ZnQWMuZGlzdGFuY2UpOyAvL+mAieaLqeWvueaJi1xuXG4vLyAgICAgICAgIGxldCBjczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHsgZG9faWlkOiBOdW1iZXIoaWlkKSB9O1xuLy8gICAgICAgICAvL+mAoOaIkOS8pOWus1xuLy8gICAgICAgICBpZiAoY2ZnQWMuYXJnc1tcImFcIl0gIT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgdGhpcy50aW1lcl9kbygzMDEsIHsgZG9faWlkOiBOdW1iZXIoaWlkKSB9KTsgLy/mlLvlh7vliY3op6blj5Fcbi8vICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vbmVGaWlkc1tpaWRdW2FjX3R0eXBlXS5sZW5ndGg7IGkrKykge1xuLy8gICAgICAgICAgICAgICAgIHRoaXMuanNfaGl0cyhpaWQsIHRoaXMub25lRmlpZHNbaWlkXVthY190dHlwZV1baV0sIGNmZ0FjLmFyZ3NbXCJhXCJdICogMTAwMDAsIHNraWQpOyAvL+iuoeeul+S8pOWus1xuLy8gICAgICAgICAgICAgICAgIGxldCBjczIgPSB0aGlzLnNrX2FjdGlvbl90eXBlXzEoaWlkLCB0aGlzLm9uZUZpaWRzW2lpZF1bYWNfdHR5cGVdW2ldLCBza2lkLCBhY0lkKTtcbi8vICAgICAgICAgICAgICAgICBjcyA9IE9iamVjdC5hc3NpZ24oY3MsIGNzMik7XG4vLyAgICAgICAgICAgICAgICAgY3NbdGhpcy5vbmVGaWlkc1tpaWRdW2FjX3R0eXBlXVtpXV0gPSBjczJbXCJoaXRcIl07XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgLy/pgKDmiJDkvKTlrrMgIC0g5pyv5rOVXG4vLyAgICAgICAgIGlmIChjZmdBYy5hcmdzW1wiYXRrXCJdICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgIHRoaXMudGltZXJfZG8oMzAxLCB7IGRvX2lpZDogTnVtYmVyKGlpZCkgfSk7IC8v5pS75Ye75YmN6Kem5Y+RXG4vLyAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub25lRmlpZHNbaWlkXVthY190dHlwZV0ubGVuZ3RoOyBpKyspIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLmpzX2hpdHMoaWlkLCB0aGlzLm9uZUZpaWRzW2lpZF1bYWNfdHR5cGVdW2ldLCBjZmdBYy5hcmdzW1wiYXRrXCJdLCBza2lkKTsgLy/orqHnrpfkvKTlrrNcbi8vICAgICAgICAgICAgICAgICBsZXQgY3MyID0gdGhpcy5za19hY3Rpb25fdHlwZV8xKGlpZCwgdGhpcy5vbmVGaWlkc1tpaWRdW2FjX3R0eXBlXVtpXSwgc2tpZCwgYWNJZCk7XG4vLyAgICAgICAgICAgICAgICAgY3MgPSBPYmplY3QuYXNzaWduKGNzLCBjczIpO1xuLy8gICAgICAgICAgICAgICAgIGNzW3RoaXMub25lRmlpZHNbaWlkXVthY190dHlwZV1baV1dID0gY3MyW1wiaGl0XCJdO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG5cbi8vICAgICAgICAgLy/op6blj5FlZmZlY3Rcbi8vICAgICAgICAgaWYgKGNmZ0FjLmFyZ3NbXCJpZFwiXSAhPSBudWxsKSB7XG4vLyAgICAgICAgICAgICBsZXQgcCA9IDA7IC8vYnVmZuinpuWPkeamgueOh1xuLy8gICAgICAgICAgICAgaWYgKGNmZ0FjLmFyZ3NbXCJwXCJdICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICBwID0gY2ZnQWMuYXJnc1tcInBcIl0gKiAxMDAwMDsgLy9idWZm6Kem5Y+R5qaC546HXG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBpZiAodGhpcy5zZWVkUmFuZC5yYW5kKDEsIDEwMDAwKSA8PSBwKSB7XG4vLyAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjZmdBYy5hcmdzLmlkLmxlbmd0aDsgaSsrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGNzW1wibmV4dGlkXCJdID0gMTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za19lZmZlY3QoaWlkLCBza2lkLCBjZmdBYy5hcmdzLmlkW2ldLnRvU3RyaW5nKCksIGFjX3R0eXBlLCBjcyk7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG5cbi8vICAgICAgICAgLy/mnInmpoLnjofnu5nmiJHmlrnlvJ/lrZDmjILkuIDkuKrlj43lh7tidWZmXG4vLyAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnQWMuY2FuYmVhdGJhY2spID09IGZhbHNlKSB7XG4vLyAgICAgICAgICAgICBsZXQgcCA9IDA7IC8vYnVmZuinpuWPkeamgueOh1xuLy8gICAgICAgICAgICAgaWYgKGNmZ0FjLmFyZ3NbXCJwXCJdICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICBwID0gY2ZnQWMuYXJnc1tcInBcIl0gKiAxMDAwMDsgLy9idWZm6Kem5Y+R5qaC546HXG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy50ZWFtRmlpZHMubGVuZ3RoOyBpbmRleCsrKSB7XG4vLyAgICAgICAgICAgICAgICAgbGV0IGZpaWQgPSB0aGlzLnRlYW1GaWlkc1tpbmRleF07XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbZmlpZF0udHlwZSAhPSAyKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+S4jeaYr+W8n+WtkFxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXS5lcHMuaHAgPD0gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy9cbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgaWYgKGlpZC5sZW5ndGggIT0gZmlpZC5sZW5ndGgpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5LiN5piv5ZCM6Zi16JCl55qEXG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlZWRSYW5kLnJhbmQoMSwgMTAwMDApIDw9IHApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWQ6IGZpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiY2FuYmVhdGJhY2tcIiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1heFpoZW46IHRoaXMuemhlbiArIDMwICogNDUsIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogMSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiAxLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7fSwgLy/lsZ7mgKdcbi8vICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog6L6F5Yqp5Ye95pWwIC0g5oqA6IO95pWI5p6cXG4vLyAgICAgICogQHBhcmFtIGlpZCDop6blj5HogIVcbi8vICAgICAgKiBAcGFyYW0gc2tpZCDmioDog71JRFxuLy8gICAgICAqIEBwYXJhbSBlZmZlY3RJZCDmlYjmnpxJRFxuLy8gICAgICAqIEBwYXJhbSBleHRlbmQg57un5om/55uu5qCHa2V5XG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSBza19lZmZlY3QoaWlkOiBzdHJpbmcsIHNraWQ6IHN0cmluZywgZWZmZWN0SWQ6IHN0cmluZywgZXh0ZW5kOiBzdHJpbmcgPSBcIlwiLCBjczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9KSB7XG4vLyAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkodGhpcy50ZWFtc1tpaWRdLmlzSGlkZSkgPT0gZmFsc2UpIHtcbi8vICAgICAgICAgICAgIHJldHVybjsgLy/pmpDol49cbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIGxldCBjZmdCYXNlID0gR2FtZWNmZy5za2lsbEJhc2UuZ2V0SXRlbShza2lkLCBcIjFcIik7XG4vLyAgICAgICAgIGxldCBjZmdFZiA9IEdhbWVjZmcuc2tpbGxFZmZlY3QuZ2V0SXRlbShlZmZlY3RJZCk7XG4vLyAgICAgICAgIGlmIChjZmdFZiA9PSBudWxsIHx8IGNmZ0Jhc2UgPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgcmV0dXJuO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIC8v5qyh5pWw5Yik5a6aXG4vLyAgICAgICAgIGlmIChcbi8vICAgICAgICAgICAgIGdhbWVNZXRob2QuaXNFbXB0eShjZmdFZi5jb3VudCkgPT0gZmFsc2UgJiZcbi8vICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0gJiZcbi8vICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXSAmJlxuLy8gICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLnNrYmFzZVtza2lkXS5lZmZlY3RbZWZmZWN0SWRdLmNvdW50ID49IGNmZ0VmLmNvdW50XG4vLyAgICAgICAgICkge1xuLy8gICAgICAgICAgICAgcmV0dXJuOyAvL+ayoeacieasoeaVsOS6hlxuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmICh0aGlzLm9uZUZpaWRzW2lpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgdGhpcy5vbmVGaWlkc1tpaWRdID0ge307XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgbGV0IGVmX3R0eXBlID0gXCJlZmZlY3RfaWRfXCIgKyBlZmZlY3RJZDtcbi8vICAgICAgICAgLy/nu6fmib/kuIrkuIDmrKHnmoTnm67moIdcbi8vICAgICAgICAgaWYgKGV4dGVuZCAhPSBcIlwiKSB7XG4vLyAgICAgICAgICAgICAvL+i/memHjOWPr+S7peWFiOe7p+aJv1xuLy8gICAgICAgICAgICAgdGhpcy5vbmVGaWlkc1tpaWRdW2VmX3R0eXBlXSA9IHRoaXMub25lRmlpZHNbaWlkXVtleHRlbmRdO1xuLy8gICAgICAgICB9XG5cbi8vICAgICAgICAgLy/mjIHnu63lpJrlsJHpkohcbi8vICAgICAgICAgbGV0IG1heHpoZW46IG51bWJlciA9IGdhbWVNZXRob2QuaXNFbXB0eShjZmdFZi5hcmdzW1widFwiXSkgPT0gZmFsc2UgPyBjZmdFZi5hcmdzW1widFwiXSAqIDMwIDogNDUgKiAzMDtcbi8vICAgICAgICAgLy9t5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgIGxldCBlX206IG51bWJlciA9IGdhbWVNZXRob2QuaXNFbXB0eShjZmdFZi5hcmdzW1wibVwiXSkgPT0gZmFsc2UgPyBjZmdFZi5hcmdzW1wibVwiXSA6IDE7XG4vLyAgICAgICAgIC8vbuihqOekuuWxguaVsOS4iumZkFxuLy8gICAgICAgICBsZXQgZV9uOiBudW1iZXIgPSBnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnRWYuYXJnc1tcIm5cIl0pID09IGZhbHNlID8gY2ZnRWYuYXJnc1tcIm5cIl0gOiA5OTk5O1xuLy8gICAgICAgICAvLzEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICBsZXQgb3ZlcmxheVR5cGU6IG51bWJlciA9IGdhbWVNZXRob2QuaXNFbXB0eShjZmdFZi5vdmVybGF5VHlwZSkgPyAyIDogY2ZnRWYub3ZlcmxheVR5cGU7XG4vLyAgICAgICAgIC8v5pWI5p6c5qCH6K+GXG4vLyAgICAgICAgIGxldCBlX2k6IG51bWJlciA9IGdhbWVNZXRob2QuaXNFbXB0eShjZmdFZi5hcmdzW1wiaVwiXSkgPT0gZmFsc2UgPyBjZmdFZi5hcmdzW1wiaVwiXSA6IDA7XG4vLyAgICAgICAgIC8v5pWI5p6c5qCH6K+GXG4vLyAgICAgICAgIGxldCBpbnRlcnZhbDogbnVtYmVyID0gZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ0VmLmludGVydmFsKSA9PSBmYWxzZSA/IGNmZ0VmLmludGVydmFsICogMzAgOiAwOyAvL+aViOaenOagh+ivhlxuXG4vLyAgICAgICAgIGlmICh0aGlzLnV1aWRzW2lpZF0uc2tiYXNlW3NraWRdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0gPSB7XG4vLyAgICAgICAgICAgICAgICAgbGFzdDogMCwgLy/mnIDlkI7kuIDmrKHlh7rmiYvluKdcbi8vICAgICAgICAgICAgICAgICBjb3VudDogMCxcbi8vICAgICAgICAgICAgICAgICBhY3Rpb246IHt9LFxuLy8gICAgICAgICAgICAgICAgIGVmZmVjdDoge30sXG4vLyAgICAgICAgICAgICB9O1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmICh0aGlzLnV1aWRzW2lpZF0uc2tiYXNlW3NraWRdLmVmZmVjdFtlZmZlY3RJZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLnNrYmFzZVtza2lkXS5lZmZlY3RbZWZmZWN0SWRdID0ge1xuLy8gICAgICAgICAgICAgICAgIGVmZmVjdFpoZW46IDAsIC8v6Kem5Y+R5binXG4vLyAgICAgICAgICAgICAgICAgZWZmZWN0RW5kWmhlbjogMCwgLy/op6blj5Hnu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICBuZXh0Y2Q6IDAsIC8v5LiL5LiA5qyh5Ye65omL5pe26Ze0XG4vLyAgICAgICAgICAgICAgICAgY291bnQ6IDAsXG4vLyAgICAgICAgICAgICAgICAgZjogMCxcbi8vICAgICAgICAgICAgIH07XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgLy/mlYjmnpxjZFxuLy8gICAgICAgICBpZiAoXG4vLyAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0uc2tiYXNlW3NraWRdLmVmZmVjdFtlZmZlY3RJZF0ubmV4dGNkID4gdGhpcy56aGVuICYmXG4vLyAgICAgICAgICAgICAodGhpcy56aGVuICE9IHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5lZmZlY3RaaGVuIHx8IChjZmdFZi50YXJnZXRUeXBlLmxlbmd0aCA9PSAxICYmIGNmZ0VmLnRhcmdldFR5cGVbMF0gPT0gMSkpICYmXG4vLyAgICAgICAgICAgICAhKHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5lZmZlY3RFbmRaaGVuID49IHRoaXMuemhlbiAmJiBjc1tcImlzVGltZXJcIl0gPT0gMSlcbi8vICAgICAgICAgKSB7XG4vLyAgICAgICAgICAgICByZXR1cm47XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICAvL2NzW1wiaXNUaW1lclwiXSA9IDA7ICAvLyDlrprml7blmajmnaXnmoQg5LiN5Y+C5LiOY2TmlYjmnpzliKTlrppcblxuLy8gICAgICAgICBsZXQgZWZfYnVmZiA9IFwiZWZmZWN0X2lfXCIgKyBlX2k7IC8v5pWI5p6caeagh+ivhlxuLy8gICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ0VmLnR0eXBlKSA9PSBmYWxzZSAmJiBjc1tcImlzVGltZXJcIl0gIT0gMSkge1xuLy8gICAgICAgICAgICAgbGV0IHRhcmdldFR5cGU6IG51bWJlciA9IDA7IC8v55uu5qCH5pWw6YePXG4vLyAgICAgICAgICAgICAvL+ebruagh+aVsOmHj1xuLy8gICAgICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eShjZmdFZi50YXJnZXRUeXBlKSA9PSB0cnVlKSB7XG4vLyAgICAgICAgICAgICAgICAgdGFyZ2V0VHlwZSA9IDEwO1xuLy8gICAgICAgICAgICAgfSBlbHNlIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnRWYudGFyZ2V0VHlwZVsxXSkgPT0gdHJ1ZSkge1xuLy8gICAgICAgICAgICAgICAgIHRhcmdldFR5cGUgPSBjZmdFZi50YXJnZXRUeXBlWzBdO1xuLy8gICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICB0YXJnZXRUeXBlID0gdGhpcy5zZWVkUmFuZC5yYW5kKGNmZ0VmLnRhcmdldFR5cGVbMV0sIGNmZ0VmLnRhcmdldFR5cGVbMF0pO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgdGhpcy5maW5kX2ZpaWRzKGVmX3R0eXBlLCBpaWQsIGNmZ0VmLnR0eXBlLCB0YXJnZXRUeXBlKTtcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIC8vYnVmZuaViOaenFxuLy8gICAgICAgICBpZiAodGhpcy5vbmVGaWlkc1tpaWRdICYmIHRoaXMub25lRmlpZHNbaWlkXVtlZl90dHlwZV0pIHtcbi8vICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vbmVGaWlkc1tpaWRdW2VmX3R0eXBlXS5sZW5ndGg7IGkrKykge1xuLy8gICAgICAgICAgICAgICAgIGxldCBlZmZfaV9tID0gdGhpcy5za2J1ZmZfZ2V0KHRoaXMub25lRmlpZHNbaWlkXVtlZl90dHlwZV1baV0sIGVmX2J1ZmYsIDIpO1xuLy8gICAgICAgICAgICAgICAgIGlmIChlZmZfaV9tID49IGVfbikge1xuLy8gICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy/otoXov4flsYLmlbBcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgZV9tID0gTWF0aC5taW4oZV9tLCBlX24gLSBlZmZfaV9tKTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIC8v5re75Yqg5a6a5pe25omn6KGMIC0g5LmL5ZCO5Zyo6Kem5Y+R5pWI5p6cXG4vLyAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnRWYudHJpZ2dlclRpbWUpID09IGZhbHNlICYmIHRoaXMudXVpZHNbaWlkXS50aW1lcltlZl90dHlwZV0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgdGhpcy50aW1lcl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgIGlpZDogaWlkLCAvL+inpuWPkeiAhVxuLy8gICAgICAgICAgICAgICAgIGZpaWRzOiB0aGlzLm9uZUZpaWRzW2lpZF1bZWZfdHR5cGVdLCAvL+inpuWPkeiAhVxuLy8gICAgICAgICAgICAgICAgIGtleTogZWZfdHR5cGUsIC8v5a6a5pe25Zmo5qCH6K+GXG4vLyAgICAgICAgICAgICAgICAgdHlwZTogY2ZnRWYudHJpZ2dlclRpbWUgPyBjZmdFZi50cmlnZ2VyVGltZSA6IFs2MDFdLCAvL+aJp+ihjOinpuWPkeeCuVxuLy8gICAgICAgICAgICAgICAgIGZ1bmM6IFwic2tfZWZmZWN0XCIsIC8v5omn6KGM55qE5Ye95pWw5ZCNXG4vLyAgICAgICAgICAgICAgICAgbHpoZW46IGludGVydmFsLCAvL+i9ruivouaJp+ihjOaXtumXtFxuLy8gICAgICAgICAgICAgICAgIGV6aGVuOiA0NSAqIDMwLFxuLy8gICAgICAgICAgICAgICAgIHNraWQ6IHNraWQsIC8v5oqA6IO9SURcbi8vICAgICAgICAgICAgICAgICBhZWlkOiBlZmZlY3RJZCwgLy/mlYjmnpxJRHzooYzkuLpJRFxuLy8gICAgICAgICAgICAgICAgIGNzOiBjcywgLy/lj4LmlbBcbi8vICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsXG4vLyAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgIGlmIChjZmdFZi50cmlnZ2VyVGltZVswXSA9PSAzMDEpIHtcbi8vICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub25lRmlpZHNbaWlkXVtlZl90dHlwZV0ubGVuZ3RoOyBpKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcl9kbygzMDEsIHsgZG9faWlkOiBOdW1iZXIodGhpcy5vbmVGaWlkc1tpaWRdW2VmX3R0eXBlXVtpXSkgfSk7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnRWYuY291bnQpID09IGZhbHNlICYmIHRoaXMuemhlbiAhPSAxKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5jb3VudCArPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy51dWlkc1tpaWRdLnNrYmFzZVtza2lkXS5lZmZlY3RbZWZmZWN0SWRdLmNvdW50ID49IGNmZ0VmLmNvdW50KSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ0VmLmNkKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5lZmZlY3RaaGVuID0gdGhpcy56aGVuO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5uZXh0Y2QgPSB0aGlzLnpoZW4gKyBjZmdFZi5jZCAqIDMwO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5jb3VudCA9IDA7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLnRpbWVyW2VmX3R0eXBlXVtjc1tcInRpbWVySWRcIl0udG9TdHJpbmcoKV0uc3poZW4gPSB0aGlzLnpoZW4gKyBjZmdFZi5jZCAqIDMwO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ0VmLmNkKSA9PSBmYWxzZSAmJiB0aGlzLnpoZW4gIT0gMSkge1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy51dWlkc1tpaWRdLnNrYmFzZVtza2lkXS5lZmZlY3RbZWZmZWN0SWRdLmNvdW50ID09IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5lZmZlY3RaaGVuID0gdGhpcy56aGVuO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmLmFyZ3NbXCJ0XCJdKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5lZmZlY3RFbmRaaGVuIDwgdGhpcy56aGVuKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5lZmZlY3RFbmRaaGVuID0gdGhpcy56aGVuICsgY2ZnRWYuYXJnc1tcInRcIl0gKiAzMDsgLy8gYnVmZuaMgee7reWinuWKoOaViOaenOe7k+adn+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0uc2tiYXNlW3NraWRdLmVmZmVjdFtlZmZlY3RJZF0ubmV4dGNkID0gdGhpcy56aGVuICsgY2ZnRWYuY2QgKiAzMDtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5uZXh0Y2QgPSB0aGlzLnpoZW4gKyBjZmdFZi5jZCAqIDMwO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgcmV0dXJuOyAvL2Nk5ZCO5YaN6Kem5Y+RXG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICAvLzEu6ZmE5Yqg5bGe5oCn77yI5LiH5YiG5q+U77yJXG4vLyAgICAgICAgIGlmIChjZmdFZi50eXBlID09IDEpIHtcbi8vICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vbmVGaWlkc1tpaWRdW2VmX3R0eXBlXS5sZW5ndGg7IGkrKykge1xuLy8gICAgICAgICAgICAgICAgIGxldCBmaWlkID0gdGhpcy5vbmVGaWlkc1tpaWRdW2VmX3R0eXBlXVtpXTtcbi8vICAgICAgICAgICAgICAgICBsZXQgY2Y1MDg6IG51bWJlciA9IDA7XG4vLyAgICAgICAgICAgICAgICAgbGV0IGVmZl8xX2VwOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4vLyAgICAgICAgICAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhjZmdFZi5hcmdzKTtcbi8vICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGtleXMubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgLy8g5Yqg5bGe5oCnIOi/mei+uWlu5rKh5YWz57O7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlYW1zW2ZpaWRdLmVwc1trZXlzW2tdXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXS5lcHNba2V5c1trXV0gIT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZWZmXzFfZXBba2V5c1trXV0gPSBjZmdFZi5hcmdzW2tleXNba11dO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmLmFyZ3Nba2V5c1trXV0gPCAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Y1MDggPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChjZjUwOCAhPSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBpZiAob3ZlcmxheVR5cGUgPT09IDIgfHwgdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIGVmX2J1ZmYgKyBcIl9cIiArIGVmZmVjdElkLCAyKSArIGVfbSA8PSBlX24pIHtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWQ6IGZpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX2J1ZmYgKyBcIl9cIiArIGVmZmVjdElkLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiBlX20sIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IGVmZl8xX2VwLCAvL+WxnuaAp1xuLy8gICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgdGhpcy50ZWFtc1tmaWlkXS5lcHMuaHAgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocFwiKTtcbi8vICAgICAgICAgICAgICAgICAvLyB0aGlzLnRlYW1zW2ZpaWRdLmVwcy5ocF9tYXggPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocF9tYXhcIik7XG4vLyAgICAgICAgICAgICAgICAgaWYgKGNmNTA4ID09IDEpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcl9kbyg1MDgsIHsgZG9faWlkOiBOdW1iZXIoZmlpZCkgfSk7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgLy9jZFxuLy8gICAgICAgICAgICAgaWYgKHRoaXMub25lRmlpZHNbaWlkXVtlZl90dHlwZV0ubGVuZ3RoID4gMCkge1xuLy8gICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnRWYuY291bnQpID09IGZhbHNlICYmIHRoaXMuemhlbiAhPSAxKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5jb3VudCArPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy51dWlkc1tpaWRdLnNrYmFzZVtza2lkXS5lZmZlY3RbZWZmZWN0SWRdLmNvdW50ID49IGNmZ0VmLmNvdW50KSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ0VmLmNkKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5lZmZlY3RaaGVuID0gdGhpcy56aGVuO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5uZXh0Y2QgPSB0aGlzLnpoZW4gKyBjZmdFZi5jZCAqIDMwO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5jb3VudCA9IDA7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLnRpbWVyW2VmX3R0eXBlXVtjc1tcInRpbWVySWRcIl0udG9TdHJpbmcoKV0uc3poZW4gPSB0aGlzLnpoZW4gKyBjZmdFZi5jZCAqIDMwO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ0VmLmNkKSA9PSBmYWxzZSAmJiB0aGlzLnpoZW4gIT0gMSkge1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy51dWlkc1tpaWRdLnNrYmFzZVtza2lkXS5lZmZlY3RbZWZmZWN0SWRdLmNvdW50ID09IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5lZmZlY3RaaGVuID0gdGhpcy56aGVuO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmLmFyZ3NbXCJ0XCJdKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5lZmZlY3RFbmRaaGVuIDwgdGhpcy56aGVuKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5lZmZlY3RFbmRaaGVuID0gdGhpcy56aGVuICsgY2ZnRWYuYXJnc1tcInRcIl0gKiAzMDsgLy8gYnVmZuaMgee7reWinuWKoOaViOaenOe7k+adn+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0uc2tiYXNlW3NraWRdLmVmZmVjdFtlZmZlY3RJZF0ubmV4dGNkID0gdGhpcy56aGVuICsgY2ZnRWYuY2QgKiAzMDtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5uZXh0Y2QgPSB0aGlzLnpoZW4gKyBjZmdFZi5jZCAqIDMwO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG5cbi8vICAgICAgICAgLy8yLumZhOWKoOeKtuaAgVxuLy8gICAgICAgICBpZiAoY2ZnRWYudHlwZSA9PSAyKSB7XG4vLyAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdF90eXBlXzIoc2tpZCwgZWZmZWN0SWQsIGlpZCwgdGhpcy5vbmVGaWlkc1tpaWRdW2VmX3R0eXBlXSwgY3MpO1xuLy8gICAgICAgICB9XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog6Kem5Y+R5pWI5p6cXG4vLyAgICAgICogQHBhcmFtIGVmZmVjdElkIOaViOaenElEXG4vLyAgICAgICogQHBhcmFtIGlpZCDop6blj5HogIVcbi8vICAgICAgKiBAcGFyYW0gZmlpZHMg6Kem5Y+R5a+56LGhXG4vLyAgICAgICogQHJldHVybnNcbi8vICAgICAgKi9cbi8vICAgICBwcml2YXRlIHNrX2VmZmVjdF90eXBlXzIoc2tpZDogc3RyaW5nLCBlZmZlY3RJZDogc3RyaW5nLCBpaWQ6IHN0cmluZywgZmlpZHM6IHN0cmluZ1tdLCBjczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9KSB7XG4vLyAgICAgICAgIGxldCBjZmdCYXNlID0gR2FtZWNmZy5za2lsbEJhc2UuZ2V0SXRlbShza2lkLCBcIjFcIik7XG4vLyAgICAgICAgIGxldCBjZmdFZiA9IEdhbWVjZmcuc2tpbGxFZmZlY3QuZ2V0SXRlbShlZmZlY3RJZCk7XG4vLyAgICAgICAgIGlmIChjZmdFZiA9PSBudWxsIHx8IGNmZ0VmLmFyZ3NbXCJpXCJdID09IG51bGwgfHwgY2ZnQmFzZSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICByZXR1cm47XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgLy/mjIHnu63lpJrlsJHpkohcbi8vICAgICAgICAgbGV0IG1heHpoZW46IG51bWJlciA9IGNmZ0VmLmFyZ3NbXCJ0XCJdICE9IG51bGwgPyBjZmdFZi5hcmdzW1widFwiXSAqIDMwIDogNDUgKiAzMDtcbi8vICAgICAgICAgLy9h5aGr5bCP5pWw77ya5q+P56eS5oyB57ut5pS25Yiw5pyA57uI5Lyk5a6z55qE55m+5YiG5q+UXG4vLyAgICAgICAgIGxldCBlX2E6IG51bWJlciA9IGdhbWVNZXRob2QuaXNFbXB0eShjZmdFZi5hcmdzW1wiYVwiXSkgPT0gZmFsc2UgPyBjZmdFZi5hcmdzW1wiYVwiXSAqIDEwMDAwIDogMDtcbi8vICAgICAgICAgLy9t5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgIGxldCBlX206IG51bWJlciA9IGdhbWVNZXRob2QuaXNFbXB0eShjZmdFZi5hcmdzW1wibVwiXSkgPT0gZmFsc2UgPyBjZmdFZi5hcmdzW1wibVwiXSA6IDE7XG4vLyAgICAgICAgIC8vbuihqOekuuWxguaVsOS4iumZkFxuLy8gICAgICAgICBsZXQgZV9uOiBudW1iZXIgPSBnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnRWYuYXJnc1tcIm5cIl0pID09IGZhbHNlID8gY2ZnRWYuYXJnc1tcIm5cIl0gOiA5OTk5O1xuLy8gICAgICAgICAvL2lk5byV5Y+R5LiL5LiA5LiqZWZmZWN0X0lEXG4vLyAgICAgICAgIGxldCBlX2lkOiBzdHJpbmcgPSBnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnRWYuYXJnc1tcImlkXCJdKSA9PSBmYWxzZSA/IGNmZ0VmLmFyZ3NbXCJpZFwiXS50b1N0cmluZygpIDogXCJcIjtcbi8vICAgICAgICAgLy8xLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgbGV0IG92ZXJsYXlUeXBlOiBudW1iZXIgPSBnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnRWYub3ZlcmxheVR5cGUpID8gMiA6IGNmZ0VmLm92ZXJsYXlUeXBlO1xuLy8gICAgICAgICAvL+aViOaenOagh+ivhlxuLy8gICAgICAgICBsZXQgZV9pOiBudW1iZXIgPSBnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnRWYuYXJnc1tcImlcIl0pID09IGZhbHNlID8gY2ZnRWYuYXJnc1tcImlcIl0gOiAwO1xuXG4vLyAgICAgICAgIGxldCBlZl90dHlwZSA9IFwiZWZmZWN0X2lkX1wiICsgZWZmZWN0SWQ7IC8v5pWI5p6cSUTmoIfor4Zcbi8vICAgICAgICAgbGV0IGVmX2J1ZmYgPSBcImVmZmVjdF9pX1wiICsgZV9pOyAvL+aViOaenGnmoIfor4Zcbi8vICAgICAgICAgbGV0IGxzT25lOiBudW1iZXIgPSAwOyAvL+S4tOaXtuiHquW3seWPquaTjeS9nOS4gOasoeeahFxuLy8gICAgICAgICBsZXQgcGFzczogYm9vbGVhbiA9IHRydWU7XG4vLyAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlpZHMubGVuZ3RoOyBpKyspIHtcbi8vICAgICAgICAgICAgIGxldCBmaWlkID0gZmlpZHNbaV07XG4vLyAgICAgICAgICAgICBsZXQgZWZmX2lfbSA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBlZl9idWZmLCAyKTtcbi8vICAgICAgICAgICAgIGlmIChlZmZfaV9tID49IGVfbikge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+i2hei/h+WxguaVsFxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgZV9tID0gTWF0aC5taW4oZV9tLCBlX24gLSBlZmZfaV9tKTtcbi8vICAgICAgICAgICAgIHN3aXRjaCAoY2ZnRWYuYXJnc1tcImlcIl0pIHtcbi8vICAgICAgICAgICAgICAgICBjYXNlIDE6IC8v5rKJ6buYXHTml6Dms5Xph4rmlL7mioDog70o5Y+v5Lul5pS+5pmu5pS7Ke+8jOS4jeWPr+WPoOWKoO+8jOaMgee7rTTnp5Jcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWQ6IGZpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX2J1ZmYsIC8v5bGe5oCna2V5XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtYXhaaGVuOiB0aGlzLnpoZW4gKyBtYXh6aGVuLCAvL+e7k+adn+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVR5cGU6IG92ZXJsYXlUeXBlLCAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IGVfbSwgLy/lop7liqDlsYLmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGVwczoge30sIC8v5bGe5oCnXG4vLyAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyX2RvKDUwOCwgeyBkb19paWQ6IE51bWJlcihmaWlkKSB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAyOiAvLzJcdOWbnuihgCDmjInmnIDnu4jkvKTlrrPlgLznmb7liIbmr5Tov5vooYzlm57ooYBcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNzW1wiZG9faWlkXCJdICE9IE51bWJlcihpaWQpKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoY3NbXCJoaXRcIl0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmLmFyZ3NbXCJhXCJdICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub25lSGl0W2lpZF0pIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhpdF9maWlkID0gdGhpcy51dWlkc1tpaWRdLmlwaztcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qc19oaXRzKGlpZCwgaGl0X2ZpaWQsIGNmZ0VmLmFyZ3NbXCJhXCJdICogMTAwMDAsIHNraWQpOyAvL+iuoeeul+S8pOWus1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ3poaXQgPSB0aGlzLm9uZUhpdFtpaWRdW2hpdF9maWlkXTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJoaXRcIl0gPSBnemhpdC5za2hpdDtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMub25lSGl0W2lpZF0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGtleXMubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzW1wiaGl0XCJdID0gdGhpcy5vbmVIaXRbaWlkXVtrZXlzW2tdXS5samhpdDtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjc1tcImhpdFwiXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cblxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoY3NbXCJuZXh0X2N4XCJdICE9IG51bGwgJiYgY3NbXCJuZXh0X2N4XCJdIDwgdGhpcy56aGVuICYmIGNzW1wiaXNUaW1lclwiXSA9PSAxKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGlpZCwgXCJhVHlwZVwiLCBYeXMuQWN0aW9uVHlwZS5lZmZlY3QpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBmaWlkLCBcImVmZmVjdFwiLCBbXCJocFwiLCBNYXRoLmZsb29yKChjc1tcImhpdFwiXSAqIGVfYSkgLyAxMDAwMCldKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZmdFZi5hcmdzW1wiaWZcIl0gPT0gMSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOaciWlmPTHnmoTnm7TmjqXlm57ooYDkuIDmrKFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGlpZCwgXCJhVHlwZVwiLCBYeXMuQWN0aW9uVHlwZS5lZmZlY3QpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgZmlpZCwgXCJlZmZlY3RcIiwgW1wiaHBcIiwgTWF0aC5mbG9vcigoY3NbXCJoaXRcIl0gKiBlX2EpIC8gMTAwMDApXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MgPSBmYWxzZTsgICAvLyDliqDlrprml7blmajlm57ooYAg5LiN5YqgY2Rcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc1tcIm5leHRfY3hcIl0gPSB0aGlzLnpoZW47XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJkb19paWRcIl0gPSBOdW1iZXIoZmlpZCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaWQ6IGlpZCwgLy/op6blj5HogIVcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlpZHM6IFtmaWlkXSwgLy/op6blj5Hlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl90dHlwZSArIFwiX1wiICsgZV9pLCAvL+WumuaXtuWZqOagh+ivhlxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBbNjAxXSwgLy/miafooYzop6blj5Hngrlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYzogXCJza19lZmZlY3RcIiwgLy/miafooYznmoTlh73mlbDlkI1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpoZW46IDMwLCAvL+i9ruivouaJp+ihjOaXtumXtFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlemhlbjogdGhpcy56aGVuICsgbWF4emhlbixcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpZDogc2tpZCwgLy/mioDog71JRFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZWlkOiBlZmZlY3RJZCwgLy/mlYjmnpxJRHzooYzkuLpJRFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjczogY3MsIC8v5Y+C5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX2J1ZmYsIC8v5bGe5oCna2V5XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVR5cGU6IG92ZXJsYXlUeXBlLCAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VuZzogMSwgLy/lop7liqDlsYLmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7IGVfYTogZV9hIH0sIC8v5bGe5oCnXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAvL2RlbGV0ZSBjc1tcIm5leHRfY3hcIl1cbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDM6IC8v5pmV55ypXHTml6Dms5Xnp7vliqjjgIHmlLvlh7vlkozph4rmlL7mioDog73vvIzkuI3lj6/lj6DliqDvvIzmjIHnu60z56eSXG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiBlX20sIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IHt9LCAvL+WxnuaAp1xuLy8gICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcl9kbyg1MDgsIHsgZG9faWlkOiBOdW1iZXIoZmlpZCkgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNDogLy/ngavnhLBcdOavj+enkuWPl+WIsDMwJeaMgee7reS8pOWus++8jOacgOmrmOWPoOWKoDEw5bGC77yM5oyB57utNeenklxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoY2ZnRWYuYXJnc1tcInBcIl0gJiYgdGhpcy5zZWVkUmFuZC5yYW5kKDEsIDEwMDAwKSA+IGNmZ0VmLmFyZ3NbXCJwXCJdICogMTAwMDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNzW1wibmV4dGlkXCJdID09IG51bGwgfHwgY3NbXCJpXzU5XCJdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoaXQgPSBjc1tmaWlkXSA/IGNzW2ZpaWRdIDogY3NbXCJoaXRcIl07XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY3NDcG95ID0gZ2FtZU1ldGhvZC5vYmpDb3B5KGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNzQ3BveVtcIm5leHRpZFwiXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjc0Nwb3lbXCJpXzU5XCJdID0gMDtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBlX207IGluZGV4KyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpZDogaWlkLCAvL+inpuWPkeiAhVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkczogW2ZpaWRdLCAvL+inpuWPkeWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX3R0eXBlLCAvL+WumuaXtuWZqOagh+ivhlxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBbNjAxXSwgLy/miafooYzop6blj5Hngrlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYzogXCJza19lZmZlY3RcIiwgLy/miafooYznmoTlh73mlbDlkI1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpoZW46IDMwLCAvL+i9ruivouaJp+ihjOaXtumXtFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlemhlbjogdGhpcy56aGVuICsgbWF4emhlbixcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpZDogc2tpZCwgLy/mioDog71JRFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZWlkOiBlZmZlY3RJZCwgLy/mlYjmnpxJRHzooYzkuLpJRFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjczogY3NDcG95LCAvL+WPguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/mt7vliqBidWZmIOeUqOS6juWxleekulxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX2J1ZmYsIC8v5bGe5oCna2V5XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVR5cGU6IG92ZXJsYXlUeXBlLCAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VuZzogMSwgLy/lop7liqDlsYLmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpXzU5X2hpdDogaGl0LFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAvL+WxnuaAp1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJfZG8oNTA1LCB7IGRvX2lpZDogTnVtYmVyKGZpaWQpIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJfZG8oNTA4LCB7IGRvX2lpZDogTnVtYmVyKGZpaWQpIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNzW1wiZG9faWlkXCJdLnRvU3RyaW5nKCkgIT0gaWlkKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjc1tcImlfNTlcIl0gPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJpXzU5XCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJoaXRcIl0gPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJpXzU5X2hpdFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3NbXCJoaXRcIl0pIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ZnRWYuYXJnc1tcImFcIl0gIT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmpzX2hpdHMoaWlkLCBmaWlkLCAxMDAwMCwgc2tpZCk7IC8v6K6h566X5Lyk5a6zXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBnemhpdCA9IHRoaXMub25lSGl0W2lpZF1bZmlpZF07XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzW1wiaGl0XCJdID0gZ3poaXQuc2toaXQ7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjc1tcImhpdFwiXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoaXQgPSBNYXRoLmZsb29yKGNzW1wiaGl0XCJdICogKGVfYSAvIDEwMDAwICsgY3NbXCJpXzU5XCJdKSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhmaWlkLCBmaWlkLCBcImFUeXBlXCIsIFh5cy5BY3Rpb25UeXBlLmVmZmVjdCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhmaWlkLCBmaWlkLCBcImVmZmVjdFwiLCBbXCJocFwiLCAtMSAqIGhpdF0pO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNTogLy/lhrDlhrtcdOaXoOazleenu+WKqOOAgeS4jeiDveaZruaUu+aUu+WHu+WSjOmHiuaUvuaKgOiDve+8jOaXoOazleWPoOWKoO+8jOaMgee7rTTnp5LjgILkvZznlKjmnJ/pl7Tml6Dms5Xooqvmlr3liqDlr5LmhI9cbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWQ6IGZpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX2J1ZmYsIC8v5bGe5oCna2V5XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtYXhaaGVuOiB0aGlzLnpoZW4gKyBtYXh6aGVuLCAvL+e7k+adn+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVR5cGU6IG92ZXJsYXlUeXBlLCAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IGVfbSwgLy/lop7liqDlsYLmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGVwczoge30sIC8v5bGe5oCnXG4vLyAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyX2RvKDUwNywgeyBkb19paWQ6IE51bWJlcihmaWlkKSB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcl9kbyg1MDgsIHsgZG9faWlkOiBOdW1iZXIoZmlpZCkgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNjogLy/lh7vpgIBcdOaXoOazleenu+WKqOOAgeS4jeiDveaZruaUu+aUu+WHu+OAgeS4jeiDveiiq+aUu+WHu+WSjOmHiuaUvuaKgOiDve+8jOaMgee7rTAuNeenklxuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZDogZmlpZCwgLy/mt7vliqDlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZWZfYnVmZiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1heFpoZW46IHRoaXMuemhlbiArIG1heHpoZW4sIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY2VuZzogZV9tLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7fSwgLy/lsZ7mgKdcbi8vICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJfZG8oNTA4LCB7IGRvX2lpZDogTnVtYmVyKGZpaWQpIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAobHNPbmUgPT0gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbHNPbmUgPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcl9kbygyMDYsIHsgZG9faWlkOiBOdW1iZXIoaWlkKSB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDc6IC8v5a+S5oSPXHTmlLvlh7vpmY3kvY41Je+8jOaMgee7rTEw56eS77yM5Y+g5Yqg6IezNeWxguaXtui9rOWMluS4uuWGsOWGu1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZWZmX2lfNSA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImVmZmVjdF9pXzVcIiwgMik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChlZmZfaV81ID09IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlZmZfaV9lcDogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IE9iamVjdC5hc3NpZ24oY2ZnRWYuYXJncyk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWQ6IGZpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhaaGVuOiB0aGlzLnpoZW4gKyBtYXh6aGVuLCAvL+e7k+adn+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VuZzogZV9tLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwczogZWZmX2lfZXAsIC8v5bGe5oCnXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJfZG8oNTA2LCB7IGRvX2lpZDogTnVtYmVyKGlpZCkgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGVmZl9pXzcgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgZWZfYnVmZiwgMik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChlZmZfaV83ID49IDUpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX3N1Yl9hbGwoZmlpZCwgZWZfYnVmZik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjc1tcIm5leHRpZFwiXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChpaWQsIHNraWQsIGVfaWQsIGVmX3R0eXBlLCBjcyk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA4OiAvL+ecn+aEj1x05oqA6IO95Lyk5a6z5aKe5YqgMyXvvIzmnIDpq5jlj6DliqAxMOWxgu+8jOaMgee7rTEw56eSXG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiBlX20sIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IHsgc2tfYTogZV9hIH0sIC8v5bGe5oCnXG4vLyAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyX2RvKDUwNCwgeyBkb19paWQ6IE51bWJlcihpaWQpIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDk6IC8v5oqk5L2T572h5rCUXHTlj5fliLDkvKTlrrPml7bvvIzkvJjlhYjmirXmtojmiqTkvZPnvaHmsJTvvIjooajnjrDkuIrpnIDopoHliqDmiqTnm77nibnmlYjvvIlcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlOSA9IE1hdGguZmxvb3IoKHRoaXMudGVhbXNbZmlpZF0uZXBzW1wiaHBfbWF4XCJdICogY2ZnRWYuYXJnc1tcImhwX21heFwiXSkgLyAxMDAwMCk7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiBlX20sIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpXzk6IHZhbHVlOSxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpXzlfaWQ6IGNmZ0VmLmFyZ3NbXCJpZFwiXSA/IGNmZ0VmLmFyZ3NbXCJpZFwiXSA6IDAsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaV85X3NraW46IE51bWJlcihza2lkKSxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH0sIC8v5bGe5oCnXG4vLyAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyX2RvKDUwMSwgeyBkb19paWQ6IE51bWJlcihpaWQpIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDEwOiAvL+W8guW4uOeKtuaAgVx05YyF5ous77ya5bGe5oCn6ZmN5L2O44CB5rWB6KGA44CB5Yaw5Ya744CB5Ye76aOe44CB5rKJ6buY77yM55yp5pmVXG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiBlX20sIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IHt9LCAvL+WxnuaAp1xuLy8gICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcl9kbyg1MDgsIHsgZG9faWlkOiBOdW1iZXIoZmlpZCkgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMTI6IC8v5byC5bi45YWN55arXHTlhY3nlqvlsZ7mgKfpmY3kvY7jgIHmtYHooYDjgIHlhrDlhrvjgIHlh7vpo57jgIHmsonpu5jvvIznnKnmmZVcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKG1heHpoZW4gPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWQ6IGZpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhaaGVuOiB0aGlzLnpoZW4gKyBtYXh6aGVuLCAvL+e7k+adn+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VuZzogZV9tLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwczoge30sIC8v5bGe5oCnXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnV1aWRzW2ZpaWRdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkodGhpcy51dWlkc1tmaWlkXS5za2J1ZmYpID09IHRydWUpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIC8vIGxldCBrZXlzMiA9IE9iamVjdC5rZXlzKHRoaXMudXVpZHNbZmlpZF0uc2tidWZmKVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQga2V5czIgPSB0aGlzLmNoYW5nZVNrQnVmZigxLCBmaWlkLCBudWxsLCAxKTtcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBrZXlzMi5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGtleSA9IGtleXMyW2tdO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eSh0aGlzLnV1aWRzW2ZpaWRdLnNrYnVmZltrZXldKSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFtcImVmZmVjdF9pXzEwXCIsIFwiZWZmZWN0X2lfMVwiLCBcImVmZmVjdF9pXzNcIiwgXCJlZmZlY3RfaV80XCIsIFwiZWZmZWN0X2lfNVwiLCBcImVmZmVjdF9pXzZcIl0uaW5jbHVkZXMoa2V5KSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnV1aWRzW2ZpaWRdLnNrYnVmZltrZXldO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25lQnVmZltmaWlkXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAvL2xldCBjb3B5MTAgPSBnYW1lTWV0aG9kLm9iakNvcHkodGhpcy51dWlkc1tmaWlkXS5za2J1ZmZba2V5XSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2ZpaWRdLnNrYnVmZltrZXldID0gW107XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzID0gdGhpcy5jaGFuZ2VTa0J1ZmYoMSwgZmlpZCwga2V5LCAyKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdmFsdWVzLmxlbmd0aDsgaisrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhc3MgPSBmYWxzZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5czMgPSBPYmplY3Qua2V5cyh2YWx1ZXNbal0uZXBzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBsID0gMDsgbCA8IGtleXMzLmxlbmd0aDsgbCsrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlYW1zW2lpZF0uZXBzW2tleXMzW2xdXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzW2pdLmVwc1trZXlzM1tsXV0gPCAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gdHJ1ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25lQnVmZltmaWlkXSA9IDE7XG5cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzID09IGZhbHNlKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbZmlpZF0uc2tidWZmW2tleV0ucHVzaCh2YWx1ZXNbal0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAvLyDmm7TmlrDnvJPlrZhcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VTa0J1ZmYoMiwgZmlpZCwgbnVsbCwgMSwgdGhpcy51dWlkc1tmaWlkXS5za2J1ZmYpO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDEzOiAvL+acgOe7iOS8pOWus+mZjeS9jnh4JVxuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZDogZmlpZCwgLy/mt7vliqDlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZWZfYnVmZiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1heFpoZW46IHRoaXMuemhlbiArIG1heHpoZW4sIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY2VuZzogZV9tLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaV8xMzogZV9hLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfMTNfY2Q6IDAsIC8vIOaMgee7reaAp+eahCDkuI3liqBjZFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfMTNfblpoZW46IHRoaXMuemhlbixcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH0sIC8v5bGe5oCnXG4vLyAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDE0OiAvL+W9k+WJjeeUn+WRvemmluasoeS9juS6jnglLCB4eOWxnuaAp+WinuWKoHglXG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBmX2hwMTQgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGZfaHBfbWF4MTQgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocF9tYXhcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmICgoZl9ocDE0ICogMTAwMDApIC8gZl9ocF9tYXgxNCA8IE1hdGguYWJzKGNmZ0VmLmFyZ3NbXCJocFwiXSkpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlZmZfaV9lcDogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhjZmdFZi5hcmdzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwga2V5cy5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXlzW2tdID09IFwiaHBcIikge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbZmlpZF0uZXBzW2tleXNba11dID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZl9pX2VwW2tleXNba11dID0gY2ZnRWYuYXJnc1trZXlzW2tdXTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlpZDogZmlpZCwgLy/mt7vliqDlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX2J1ZmYsIC8v5bGe5oCna2V5XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFpoZW46IHRoaXMuemhlbiArIG1heHpoZW4sIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVR5cGU6IG92ZXJsYXlUeXBlLCAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiBlX20sIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiBlZmZfaV9lcCwgLy/lsZ7mgKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcl9zdWIoaWlkLCBlZl90dHlwZSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAxNTogLy/op6blj5HmmrTlh7vlkI7vvIznu5noh6rouqvliqDmlYjmnpxcbi8vICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgaWQxID0gY2ZnRWYuYXJnc1tcImlkMVwiXTtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGlkMSA+IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfZWZmZWN0KGlpZCwgc2tpZCwgaWQxLCBlZl90dHlwZSwgY3MpO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfZWZmZWN0KGlpZCwgc2tpZCwgZV9pZCwgZWZfdHR5cGUsIGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAxNjogLy/oh6rouqvpppbmrKHnlJ/lkb3kvY7kuo4xNSXml7bov5vlhaXlhaXlrprnirbmgIHvvIzkuYvlkI7mr4/np5LmgaLlpI3oh6rouqvmlLvlh7syMDAl55qE5rCU6KGA77yM5pyf6Ze06Ieq6Lqr5peg5rOV6KGM5Yqo44CC6Ieq6Lqr5rCU6KGA5oGi5aSN6IezNjAl5pe26Kej6Zmk5YWl5a6a54q25oCB77yM5bm25a+55ZGo5Zu05pWM5Lq66YCg5oiQMjAwJeaKgOiDveS8pOWus1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoY3NbXCJkb19paWRcIl0udG9TdHJpbmcoKSAhPSBpaWQpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBmX2hwMTYgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGZfaHBfbWF4MTYgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocF9tYXhcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmICgoZl9ocDE2ICogMTAwMDApIC8gZl9ocF9tYXgxNiA8IE1hdGguYWJzKGNmZ0VmLmFyZ3NbXCJocFwiXSkpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjc1tcIm5leHRpZFwiXSAhPSAxKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlpZDogZmlpZCwgLy/mt7vliqDlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFpoZW46IHRoaXMuemhlbiArIG1heHpoZW4sIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IGVfbSwgLy/lop7liqDlsYLmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7fSwgLy/lsZ7mgKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc1tcIm5leHRpZFwiXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaWQ6IGlpZCwgLy/op6blj5HogIVcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlpZHM6IGZpaWRzLCAvL+inpuWPkeWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX3R0eXBlLCAvL+WumuaXtuWZqOagh+ivhlxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBbNjAxXSwgLy/miafooYzop6blj5Hngrlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYzogXCJza19lZmZlY3RcIiwgLy/miafooYznmoTlh73mlbDlkI1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpoZW46IDMwLCAvL+i9ruivouaJp+ihjOaXtumXtFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlemhlbjogdGhpcy56aGVuICsgbWF4emhlbixcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpZDogc2tpZCwgLy/mioDog71JRFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZWlkOiBlZmZlY3RJZCwgLy/mlYjmnpxJRHzooYzkuLpJRFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjczogY3MsIC8v5Y+C5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoY3NbXCJuZXh0aWRcIl0gPT0gMSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZfYXRrOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImF0a1wiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZGRIcDE2OiBudW1iZXIgPSBNYXRoLmZsb29yKChmX2F0ayAqIGNmZ0VmLmFyZ3NbXCJhdGtfcGVyXCJdKSAvIDEwMDAwKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZGRIcE1heDE2OiBudW1iZXIgPSBNYXRoLmZsb29yKChmX2hwX21heDE2ICogTWF0aC5hYnMoY2ZnRWYuYXJnc1tcImhwMlwiXSkpIC8gMTAwMDApO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgYWRkSHAxNiA9IE1hdGgubWluKGFkZEhwMTYsIGFkZEhwTWF4MTYgLSBmX2hwMTYpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiYVR5cGVcIiwgWHlzLkFjdGlvblR5cGUuZWZmZWN0KTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgaWlkLCBcImVmZmVjdFwiLCBbXCJocFwiLCBhZGRIcDE2XSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmX2hwMTYgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZl9ocDE2ICogMTAwMDApIC8gZl9ocF9tYXgxNiA+PSBNYXRoLmFicyhjZmdFZi5hcmdzW1wiaHAyXCJdKSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX3N1YihmaWlkLCBlZl9idWZmKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyX3N1YihpaWQsIGVmX3R0eXBlKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc1tcIm5leHRpZFwiXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za19lZmZlY3QoZmlpZCwgc2tpZCwgY2ZnRWYuYXJnc1tcImlkXCJdLCBlZl90dHlwZSwgY3MpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAxNzogLy/orrDlvZXoh6rouqvlpITkuo7mn5Dnp43nirbmgIFidWZm77yM6KKr5pS75Ye75pyJ5qaC546H57uZ6Ieq6Lqr5Yqg5pWI5p6cXG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBlZmZfaV9idWZmOiBudW1iZXIgPSAwO1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoY2ZnRWYuYXJnc1tcImJ1ZmZcIl0gIT0gMTApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEw6ZyA6KaB5Yik5pat5ZCE56eN5byC5bi454q25oCBXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlZmZfaV9idWZmID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJlZmZlY3RfaV9cIiArIGNmZ0VmLmFyZ3NbXCJidWZmXCJdLCAyKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaXN0OiBzdHJpbmdbXSA9IFtcImVmZmVjdF9pXzFcIiwgXCJlZmZlY3RfaV8zXCIsIFwiZWZmZWN0X2lfNlwiLCBcImVmZmVjdF9pXzRcIiwgXCJlZmZlY3RfaV81XCJdO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBsaXN0Lmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmX2lfYnVmZiArPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgbGlzdFtrXSwgMik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGVmZl9pX2J1ZmYgPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWVkUmFuZC5yYW5kKDEsIDEwMDAwKSA8PSBjZmdFZi5hcmdzW1wicFwiXSAqIDEwMDAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfZWZmZWN0KGlpZCwgc2tpZCwgY2ZnRWYuYXJnc1tcImlkXCJdLCBlZl90dHlwZSwgY3MpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IGZhbHNlOyAvLyDmsqHop6blj5Eg5LiN6KaB6L+b5YWl5Ya35Y205pe26Ze0XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDE4OiAvL+avjzPmrKHmlLvlh7vmtojogJfkuIDlsYLnnJ/mhI/vvIzkuYvlkI7pop3lpJbpgKDmiJDnm67moIflvZPliY3msJTooYAzJeeahOS8pOWus++8iOacgOWkmumAoOaIkOiHqui6q+aUu+WHuzUwMCXnmoTkvKTlrrPvvIlcbi8vICAgICAgICAgICAgICAgICAgICAgLy/lpIfms6jvvJrov5nph4znmoTmlLvlh7vljIXmi6zmma7mlLvlkozmioDog73lkozov57lh7vvvIzkuI3ljIXmi6zlj43lh7vvvIzooqvliqjmioDog73mmK/kuI3orqHnrpfmrKHmlbDnmoRcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNzW1wiZG9faWlkXCJdLnRvU3RyaW5nKCkgIT0gaWlkKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgYmRjb25zMTggPSB0aGlzLnV1aWRzW2ZpaWRdLmNvbnNbMF0gKyB0aGlzLnV1aWRzW2ZpaWRdLmNvbnNbMV07XG5cbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGJkY29uczE4ID49IGNmZ0VmLmFyZ3NbXCJjb3VudFwiXSAmJiBiZGNvbnMxOCAlIGNmZ0VmLmFyZ3NbXCJjb3VudFwiXSA9PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9zdWIoaWlkLCBcImVmZmVjdF9pX1wiICsgY2ZnRWYuYXJnc1tcImJ1ZmZcIl0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChpaWQsIHNraWQsIGNmZ0VmLmFyZ3NbXCJpZFwiXSwgZWZfdHR5cGUsIGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDE5OiAvL+aZruaUu+aWveWKoOW/q+WJkeWNsOiusO+8jOaMgee7rTfnp5LvvIzmnIDlpJrlj6DliqAxMOWxguOAguebruagh+avj+WxguW/q+WJkeWNsOiusO+8jOS9v+iHqui6q+aUu+WHu+mZhOWKoDMwJemineWkluS8pOWus+OAguiLpTfnp5LlhoXnm67moIfmnKrlj5fliLDoh6rouqvkvKTlrrPvvIzliJnlv6vliZHljbDorrDlhajpg6jmtojlpLFcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGNmZ0VmMTkgPSBHYW1lY2ZnLnNraWxsRWZmZWN0LmdldEl0ZW0oY2ZnRWYuYXJnc1tcImlkXCJdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmMTkgIT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZWZfYnVmZiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IDEsIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v5bGe5oCnXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfMTlfYTogY2ZnRWYuYXJnc1tcImFcIl0gKiAxMDAwMCxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaV8xOV9pOiBjZmdFZjE5LmFyZ3NbXCJpXCJdLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjZW5nMTkgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJlZmZlY3RfaV9cIiArIGNmZ0VmMTkuYXJnc1tcImlcIl0sIDIpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNmZ0VmMTlfbSA9IE1hdGgubWluKGNmZ0VmMTkuYXJnc1tcIm1cIl0sIGNmZ0VmMTkuYXJnc1tcIm5cIl0gLSBjZW5nMTkpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmMTlfbSA+IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc1tcIm5leHRpZFwiXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za19lZmZlY3QoaWlkLCBza2lkLCBjZmdFZi5hcmdzW1wiaWRcIl0sIGVmX3R0eXBlLCBjcyk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAvL2xldCBrZXlzID0gT2JqZWN0LmtleXModGhpcy51dWlkc1tmaWlkXS5za2J1ZmZbXCJlZmZlY3RfaV9cIiArIGNmZ0VmMTkuYXJnc1tcImlcIl1dKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBrZXlzID0gdGhpcy5jaGFuZ2VTa0J1ZmYoMSwgZmlpZCwgXCJlZmZlY3RfaV9cIiArIGNmZ0VmMTkuYXJnc1tcImlcIl0sIDEpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBrZXlzLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tmaWlkXS5za2J1ZmZbXCJlZmZlY3RfaV9cIiArIGNmZ0VmMTkuYXJnc1tcImlcIl1dW051bWJlcihrZXlzW2tdKV0uc3poZW4gPSB0aGlzLnpoZW47XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tmaWlkXS5za2J1ZmZbXCJlZmZlY3RfaV9cIiArIGNmZ0VmMTkuYXJnc1tcImlcIl1dW051bWJlcihrZXlzW2tdKV0uZXpoZW4gPSB0aGlzLnpoZW4gKyBtYXh6aGVuO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VTa0J1ZmYoMiwgZmlpZCwgXCJlZmZlY3RfaV9cIiArIGNmZ0VmMTkuYXJnc1tcImlcIl0sIDEsIHRoaXMudXVpZHNbZmlpZF0uc2tidWZmW1wiZWZmZWN0X2lfXCIgKyBjZmdFZjE5LmFyZ3NbXCJpXCJdXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAyMDogLy/mr49456eS5riF6Zmk6Ieq6Lqr5byC5bi454q25oCBXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChjc1tcImRvX2lpZFwiXS50b1N0cmluZygpICE9IGlpZCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfc3ViKGZpaWQsIFwiZWZmZWN0X2lfXCIgKyBjZmdFZi5hcmdzW1wiYnVmZlwiXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChjZmdFZi5hcmdzW1wiYnVmZlwiXSA9PSAxMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnV1aWRzW2ZpaWRdLnNrYnVmZilcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBrZXlzID0gdGhpcy5jaGFuZ2VTa0J1ZmYoMSwgZmlpZCwgbnVsbCwgMSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGtleXMubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5ID0ga2V5c1trXTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMudXVpZHNbZmlpZF0uc2tidWZmW2tleV0pID09IHRydWUpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChbXCJlZmZlY3RfaV8xXCIsIFwiZWZmZWN0X2lfM1wiLCBcImVmZmVjdF9pXzRcIiwgXCJlZmZlY3RfaV81XCIsIFwiZWZmZWN0X2lfNlwiXS5pbmNsdWRlcyhrZXkpKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnV1aWRzW2ZpaWRdLnNrYnVmZltrZXldO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uZUJ1ZmZbZmlpZF0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoXCJlZmZlY3RfaV8wXCIpKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2xldCBjb3B5MTAgPSBnYW1lTWV0aG9kLm9iakNvcHkodGhpcy51dWlkc1tmaWlkXS5za2J1ZmZba2V5XSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tmaWlkXS5za2J1ZmZba2V5XSA9IFtdO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbGV0IHZhbHVlcyA9IE9iamVjdC52YWx1ZXMoY29weTEwKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzID0gdGhpcy5jaGFuZ2VTa0J1ZmYoMSwgZmlpZCwga2V5LCAyKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHZhbHVlcy5sZW5ndGg7IGorKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFzcyA9IGZhbHNlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5czMgPSBPYmplY3Qua2V5cyh2YWx1ZXNbal0uZXBzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgPCBrZXlzMy5sZW5ndGg7IGwrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbaWlkXS5lcHNba2V5czNbbF1dID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXNbal0uZXBzW2tleXMzW2xdXSA8IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gdHJ1ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uZUJ1ZmZbZmlpZF0gPSAxO1xuXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3MgPT0gZmFsc2UpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbZmlpZF0uc2tidWZmW2tleV0ucHVzaCh2YWx1ZXNbal0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VTa0J1ZmYoMiwgZmlpZCwgbnVsbCwgMSwgdGhpcy51dWlkc1tmaWlkXS5za2J1ZmYpO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMjE6IC8v6Ieq6Lqr5oyB5pyJ5oqk5L2T572h5rCU5pe277yM5omn5ZCR5LiA5LiqZWZmZWN0SUTnmoTmlYjmnpxcbi8vICAgICAgICAgICAgICAgICAgICAgLy/ov5novrnlj6rnrqHop6blj5EgIOWkluWxguacieiEmuacrOWcqOi3kVxuLy8gICAgICAgICAgICAgICAgICAgICBjc1tcIm5leHRpZFwiXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfZWZmZWN0KGlpZCwgc2tpZCwgZV9pZCwgZWZfdHR5cGUsIGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGNmZ0VmMjEgPSBHYW1lY2ZnLnNraWxsRWZmZWN0LmdldEl0ZW0oZV9pZCk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChjZmdFZjIxICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZmdFZjIxLnR5cGUgPT0gMSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5wb2R1bi5wdXNoKFwiZWZmZWN0X2lfMF9cIiArIGVfaWQpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0ucG9kdW4ucHVzaChcImVmZmVjdF9pX1wiICsgY2ZnRWYyMS5hcmdzW1wiaVwiXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cblxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDIyOiAvL+ihgOmHj+S9juS6jlgl5pe257uZ6Ieq6Lqr5re75YqgYnVmZlxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoaWlkLmxlbmd0aCAhPSBmaWlkLmxlbmd0aCAmJiB0aGlzLm9uZUhpdFtpaWRdKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAvLyDojrflj5bmlLvlh7vlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoaXRpaWQ6IHN0cmluZyA9IFwiXCI7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMub25lSGl0W2lpZF0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBrZXlzLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGl0aWlkID0ga2V5c1trXTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHBfbWF4MjIgPSB0aGlzLnNrYnVmZl9nZXQoaGl0aWlkLCBcImhwX21heFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3SHAyMiA9IHRoaXMuc2tidWZmX2dldChoaXRpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5mID09IDAgJiYgKG5ld0hwMjIgKiAxMDAwMCkgLyBocF9tYXgyMiA8PSBNYXRoLmFicyhjZmdFZi5hcmdzW1wiaHBcIl0pKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMoY2ZnRWYuYXJncyk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGtleSA9IGtleXNbaV07XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWtleS5pbmNsdWRlcyhcImlkXCIpKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc1tcIm5leHRpZFwiXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChpaWQsIHNraWQsIGNmZ0VmLmFyZ3Nba2V5XSwgZWZfdHR5cGUsIGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ZnRWYuYXJnc1tcImlmXCJdID09IDEpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5mID0gMTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJfc3ViKGZpaWQsIGVmX3R0eXBlKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhwX21heDIyID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBfbWF4XCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0hwMjIgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnV1aWRzW2lpZF0uc2tiYXNlW3NraWRdLmVmZmVjdFtlZmZlY3RJZF0uZiA9PSAwICYmIChuZXdIcDIyICogMTAwMDApIC8gaHBfbWF4MjIgPD0gTWF0aC5hYnMoY2ZnRWYuYXJnc1tcImhwXCJdKSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMoY2ZnRWYuYXJncyk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBrZXlzLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgha2V5c1trXS5pbmNsdWRlcyhcImlkXCIpKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc1tcIm5leHRpZFwiXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfZWZmZWN0KGZpaWQsIHNraWQsIGNmZ0VmLmFyZ3Nba2V5c1trXV0sIGVmX3R0eXBlLCBjcyk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZmdFZi5hcmdzW1wiaWZcIl0gPT0gMSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0uc2tiYXNlW3NraWRdLmVmZmVjdFtlZmZlY3RJZF0uZiA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJfc3ViKGZpaWQsIGVmX3R0eXBlKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gZmFsc2U7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAyMzogLy/orrDlvZXlv6vliZHljbDorrDnirbmgIFcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWQ6IGZpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX2J1ZmYsIC8v5bGe5oCna2V5XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtYXhaaGVuOiB0aGlzLnpoZW4gKyBtYXh6aGVuLCAvL+e7k+adn+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVR5cGU6IG92ZXJsYXlUeXBlLCAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IGVfbSwgLy/lop7liqDlsYLmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGVwczoge30sIC8v5bGe5oCnXG4vLyAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDI0OiAvL+W/heWumuaatOWHu1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZDogZmlpZCwgLy/mt7vliqDlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZWZfYnVmZiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1heFpoZW46IHRoaXMuemhlbiArIG1heHpoZW4sIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY2VuZzogZV9tLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7fSwgLy/lsZ7mgKdcbi8vICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMjU6IC8v54G15Yqb5YC86I635Y+WXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnRWYuYXJnc1tcImxpbmdsaVwiXSkgPT0gZmFsc2UpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkX21wKGZpaWQsIGNmZ0VmLmFyZ3NbXCJsaW5nbGlcIl0sIDIpO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnRWYuYXJnc1tcImxpbmdsaTJcIl0pID09IGZhbHNlKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZF9tcChmaWlkLCAxMDAwMCAqIGNmZ0VmLmFyZ3NbXCJsaW5nbGkyXCJdLCAyKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDI2OiAvL+avj3jmrKHmlLvlh7vvvIzkvJrkvb/kuIvkuIDmrKHmlLvlh7vnmoTnm67moIflop7liqBidWZmKOWkh+azqO+8muaUu+WHu+WMheaLrOi/nuWHu++8jOS4jeWMheaLrOWPjeWHuylcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNzW1wiZG9faWlkXCJdLnRvU3RyaW5nKCkgIT0gaWlkKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgYmRjb25zMjYgPSB0aGlzLnV1aWRzW2ZpaWRdLmNvbnNbMF0gKyB0aGlzLnV1aWRzW2ZpaWRdLmNvbnNbMV07XG4vLyAgICAgICAgICAgICAgICAgICAgIGNzW1wibGltaXRcIl0gPSBjc1tcImxpbWl0XCJdID09IG51bGwgPyBjZmdFZi5hcmdzW1wiY291bnRcIl0gOiBjc1tcImxpbWl0XCJdO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgeXUyNiA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChjZmdFZi5hcmdzW1wiaWZcIl0gPT0gMSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgeXUyNiA9IDA7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGJkY29uczI2ID49IGNzW1wibGltaXRcIl0gJiYgYmRjb25zMjYgJSBjZmdFZi5hcmdzW1wiY291bnRcIl0gPT0geXUyNikge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJsaW1pdFwiXSArPSAxOyAvL+S4i+S4gOasoeaJjeiDveWcqOinpuWPkVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhjZmdFZi5hcmdzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwga2V5cy5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgha2V5c1trXS5pbmNsdWRlcyhcImlkXCIpKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc1tcIm5leHRpZFwiXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za19lZmZlY3QoZmlpZCwgc2tpZCwgY2ZnRWYuYXJnc1trZXlzW2tdXSwgZWZfdHR5cGUsIGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0udGltZXJbZWZfdHR5cGVdW2NzW1widGltZXJJZFwiXS50b1N0cmluZygpXS5jcyA9IGNzO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAyNzogLy/orrDlvZXnm67moIfmn5Dnp43nirbmgIHvvIznhLblkI7mlr3liqDkuIDkuKpidWZm5pWI5p6cXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vbmVGaWlkc1tpaWRdW2VmX3R0eXBlXSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25lRmlpZHNbaWlkXVtlZl90dHlwZV1bMF0gPT09IGZpaWQpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlZmZfaV9idWZmMjcgPSAwO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmLmFyZ3NbXCJpZlwiXSA9PSAxKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9uZUhpdFtpaWRdKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmnInphY3nva7nmoTmlYjmnpzmmK/liqDoh6rouqvnmoQgaWlk5ZKMZmlpZOaYr+S4gOagt+eahCDopoHmib7mlLvlh7vnmoTnm67moIdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMub25lSGl0W2lpZF0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwga2V5cy5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ZnRWYuYXJnc1tcImJ1ZmZcIl0gIT0gMTApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEw6ZyA6KaB5Yik5pat5ZCE56eN5byC5bi454q25oCBXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZfaV9idWZmMjcgPSB0aGlzLnNrYnVmZl9nZXQoa2V5c1trXSwgXCJlZmZlY3RfaV9cIiArIGNmZ0VmLmFyZ3NbXCJidWZmXCJdLCAyKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaXN0OiBzdHJpbmdbXSA9IFtcImVmZmVjdF9pXzFcIiwgXCJlZmZlY3RfaV8zXCIsIFwiZWZmZWN0X2lfNlwiLCBcImVmZmVjdF9pXzRcIiwgXCJlZmZlY3RfaV81XCJdO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsaXN0Lmxlbmd0aDsgaisrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmX2lfYnVmZjI3ICs9IHRoaXMuc2tidWZmX2dldChrZXlzW2tdLCBsaXN0W2pdLCAyKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmLmFyZ3NbXCJidWZmXCJdICE9IDEwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEw6ZyA6KaB5Yik5pat5ZCE56eN5byC5bi454q25oCBXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZl9pX2J1ZmYyNyA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImVmZmVjdF9pX1wiICsgY2ZnRWYuYXJnc1tcImJ1ZmZcIl0sIDIpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaXN0OiBzdHJpbmdbXSA9IFtcImVmZmVjdF9pXzFcIiwgXCJlZmZlY3RfaV8zXCIsIFwiZWZmZWN0X2lfNlwiLCBcImVmZmVjdF9pXzRcIiwgXCJlZmZlY3RfaV81XCJdO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxpc3QubGVuZ3RoOyBqKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZl9pX2J1ZmYyNyArPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgbGlzdFtqXSwgMik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlZmZfaV9idWZmMjcgPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzW1wiaV81OVwiXSA9IDA7IC8vIHRvZG8g5aKe5Lyk55So54Gr54Sw5aKe5LykIOWPr+iDveaciemXrumimFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfZWZmZWN0KGlpZCwgc2tpZCwgY2ZnRWYuYXJnc1tcImlkXCJdLCBlZl90dHlwZSwgY3MpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZmdFZi5hcmdzW1wiaWQxXCJdKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfZWZmZWN0KGlpZCwgc2tpZCwgY2ZnRWYuYXJnc1tcImlkMVwiXSwgZWZfdHR5cGUsIGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTsgLy8g5rKh5pyJ6Kem5Y+RIOS4jeimgeWKoGNkXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gZmFsc2U7IC8vIOayoeacieinpuWPkSDkuI3opoHliqBjZFxuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMjg6IC8v5a+55p+Q56eN5bGe5oCn5L2O5LqO6Ieq5bex55qE5pWM5Lq66YCg5oiQ6aKd5aSWeHgl5Lyk5a6zXG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBpX2VwID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgY2ZnRWYuYXJnc1tcImVwXCJdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGZfZXAgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgY2ZnRWYuYXJnc1tcImVwXCJdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGlfZXAgPiBmX2VwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjc1tcIm5leHRpZFwiXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChpaWQsIHNraWQsIGNmZ0VmLmFyZ3NbXCJpZFwiXSwgZWZfdHR5cGUsIGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDI5OiAvL+iHqui6q+aIluiAheaVjOaWueatu+S6oeWQju+8jOiOt+eahOafkOenjeeKtuaAgVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZl9lcDI5ID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChmX2VwMjkgPD0gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za19lZmZlY3QoaWlkLCBza2lkLCBjZmdFZi5hcmdzW1wiaWRcIl0sIGVmX3R0eXBlLCBjcyk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cblxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDMwOiAvL+S8pOWus+WKoOa3sVxuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZDogZmlpZCwgLy/mt7vliqDlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZWZfYnVmZiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1heFpoZW46IHRoaXMuemhlbiArIG1heHpoZW4sIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY2VuZzogZV9tLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7IGE6IGNmZ0VmLmFyZ3NbXCJhXCJdICogMTAwMDAgfSwgLy/lsZ7mgKdcbi8vICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMzE6IC8v5oyJ6Ieq6LqreHgl5pS75Ye75Yqb6L+b6KGM5rK755aXXG4vLyAgICAgICAgICAgICAgICAgICAgIC8vIOaYr+WQpuacieWinuW8uuayu+eWl+aViOaenCBhZGRPbmVBdGvph4zpnaLmnInlpITnkIbkuoZcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiYVR5cGVcIiwgWHlzLkFjdGlvblR5cGUuZWZmZWN0KTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGlfYXRrOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJhdGtcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBhZGRIcDMxOiBudW1iZXIgPSBNYXRoLmZsb29yKChpX2F0ayAqIGNmZ0VmLmFyZ3NbXCJhdGtfcGVyXCJdKSAvIDEwMDAwKTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBmaWlkLCBcImVmZmVjdFwiLCBbXCJocFwiLCBhZGRIcDMxXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMzI6IC8v5oqA6IO95q+P5ZG95LitWOS4quWNleS9je+8jOe7meiHqui6q+iOt+WPluafkOenjUJVRkZcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNzW1wiZG9faWlkXCJdLnRvU3RyaW5nKCkgIT0gaWlkKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5vbmVGaWlkc1tpaWRdW2VmX3R0eXBlXS5sZW5ndGg7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uZUZpaWRzW2lpZF1bZWZfdHR5cGVdW2xlbiAtIDFdID09IGZpaWQpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOacgOWQjuS4gOS4quaUu+WHu+Wvueixoee7k+eul+WRveS4rVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJkY29uczMyID0gdGhpcy5vbmVGaWlkc1tpaWRdW2VmX3R0eXBlXS5sZW5ndGg7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmRjb25zMzIgPj0gY2ZnRWYuYXJnc1tcImNvdW50XCJdICYmIGJkY29uczMyICUgY2ZnRWYuYXJnc1tcImNvdW50XCJdID09IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGguZmxvb3IoYmRjb25zMzIgLyBjZmdFZi5hcmdzW1wiY291bnRcIl0pOyBpKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChpaWQsIHNraWQsIGNmZ0VmLmFyZ3NbXCJpZFwiXSwgZWZfdHR5cGUsIGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDMzOiAvL+inpuWPkeaatOWHu+WQju+8jOmZhOWKoOmineWklngl5Lyk5a6zXG4vLyAgICAgICAgICAgICAgICAgICAgIC8vIOeUseS6jmlzQmrmmK/mjIlza2lk5p2l55qEIOS4iuS4gOS4quaKgOiDveeahOaatOWHuyDov5nph4zojrflj5bkuI3liLAg5omA5Lul6ZyA6KaB6YGN5Y6G5LiA5LiLXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChjc1tcImlzQmpcIl0gPT0gbnVsbCAmJiB0aGlzLm9uZUF0a1tpaWRdW2ZpaWRdKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHRoaXMub25lQXRrW2lpZF1bZmlpZF0uZWZmZWN0Lmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25lQXRrW2lpZF1bZmlpZF0uZWZmZWN0W2tdWzBdID09PSBcImJhb2ppXCIpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJpc0JqXCJdID0gdGhpcy5vbmVBdGtbaWlkXVtmaWlkXS5lZmZlY3Rba11bMV07XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZDogZmlpZCwgLy/mt7vliqDlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZWZfYnVmZiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1heFpoZW46IHRoaXMuemhlbiArIG1heHpoZW4sIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY2VuZzogZV9tLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7IGlfMzNfYTogY2ZnRWYuYXJnc1tcImFcIl0gKiAxMDAwMCB9LCAvL+WxnuaAp1xuLy8gICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNzW1wiaXNCalwiXSAhPSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmmrTlh7vlubbkuJTmi6XmnInmmJPkvKTnirbmgIFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaV8zM19hXCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1YkhwMzM6IG51bWJlciA9IE1hdGguZmxvb3IoTWF0aC5hYnMoY3NbXCJpc0JqXCJdICogKGEgLyAxMDAwMCkpKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgaWlkLCBcImFUeXBlXCIsIFh5cy5BY3Rpb25UeXBlLmVmZmVjdCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGZpaWQsIFwiZWZmZWN0XCIsIFtcImhwXCIsIC1zdWJIcDMzXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9zdWJfYWxsKGZpaWQsIGVmX2J1ZmYpO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMzQ6IC8v5pWM5pa555Sf5ZG95L2O5LqOeCXvvIznu5noh6rouqvmjIflrprmn5Dnp43nirbmgIHvvIjpppbmrKHkvY7kuo7vvIkg6KGA6YeP5Y+Y5YyW5qOA5rWLXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChjc1tcImRvX2lpZFwiXS50b1N0cmluZygpICE9IGZpaWQpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+iHquW3semZjeS9jueahOS4jeinpuWPkVxuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBjaGFIcDM0OiBudW1iZXIgPSBNYXRoLmFicyhjZmdFZi5hcmdzW1wiaHBcIl0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZl9ocDM0ID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBmX2hwX21heDM0ID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBfbWF4XCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoKGZfaHAzNCAqIDEwMDAwKSAvIGZfaHBfbWF4MzQgPCBjaGFIcDM0KSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjc1tmaWlkXSA9IHRoaXMuemhlbjtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlZl90dHlwZV8xID0gXCJlZmZlY3RfaWRfXCIgKyBjZmdFZi5hcmdzW1wiaWRcIl0udG9TdHJpbmcoKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uZUZpaWRzW2lpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25lRmlpZHNbaWlkXSA9IHt9O1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbmVGaWlkc1tpaWRdW2VmX3R0eXBlXzFdID0gW2ZpaWRdO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za19lZmZlY3QoaWlkLCBza2lkLCBjZmdFZi5hcmdzW1wiaWRcIl0udG9TdHJpbmcoKSwgXCJcIiwgY3MpO1xuLy8gICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IGZhbHNlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAzNTogLy/mlLvlh7vml7bvvIzlr7nooYDph4/kvY7kuo4zMCXnmoTmlYzkurrmlr3liqDkuIDlsYLlr5LmhI9cbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNzW1wiZG9faWlkXCJdLnRvU3RyaW5nKCkgIT0gaWlkKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgY2hhSHAzNTogbnVtYmVyID0gTWF0aC5hYnMoY2ZnRWYuYXJnc1tcImhwXCJdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGZfaHAzNSA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImhwXCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZl9ocF9tYXgzNSA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImhwX21heFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKChmX2hwMzUgKiAxMDAwMCkgLyBmX2hwX21heDM1IDwgY2hhSHAzNSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgLy8g5YaN5LiL5Y67IOaJvuS4jeWIsOWKoOS8pOWus+eahGZpaWTkuoZcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZmdFZi5hcmdzW1wiaWRcIl0pIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2ZnRWYyID0gR2FtZWNmZy5za2lsbEVmZmVjdC5nZXRJdGVtKGNmZ0VmLmFyZ3NbXCJpZFwiXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmMiAmJiBjZmdFZjIuYXJncyAmJiBjZmdFZjIuYXJnc1tcImlcIl0gPT0gNTMpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlfNTNfYXRrID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJhdGtcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgdGhpcy5vbmVBdGtbaWlkXVtmaWlkXS5lZmZlY3QubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uZUF0a1tpaWRdW2ZpaWRdLmVmZmVjdFtrXVswXSA9PT0gXCJocFwiICYmIHRoaXMub25lQXRrW2lpZF1bZmlpZF0uZWZmZWN0W2tdWzFdIDwgMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25lQXRrW2lpZF1bZmlpZF0uZWZmZWN0W2tdWzFdID0gLU1hdGguZmxvb3IoKGlfNTNfYXRrICogY2ZnRWYyLmFyZ3NbXCJhdGtcIl0pIC8gMTAwMDApO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc1tcImZpaWRcIl0gPSBOdW1iZXIoZmlpZCk7IC8vIOWBmuS4quagh+ivhlxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChpaWQsIHNraWQsIGNmZ0VmLmFyZ3NbXCJpZFwiXS50b1N0cmluZygpLCBlZl90dHlwZSwgY3MpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDM2OiAvL+iHqui6q+esrOS4gOasoemHjeS8pCjmrbvkuqEp5pe277yM5oGi5aSN5LiA5Y2K5rCU6KGAXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChjc1tcImRvX2lpZFwiXS50b1N0cmluZygpICE9IGlpZCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5LiN5piv6Ieq5bexXG4vLyAgICAgICAgICAgICAgICAgICAgIH1cblxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgY2hhSHAzNjogbnVtYmVyID0gTWF0aC5hYnMoY2ZnRWYuYXJnc1tcImhwXCJdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGZfaHBfbWF4MzYgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocF9tYXhcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBzdWJIcDM2OiBudW1iZXIgPSBNYXRoLmZsb29yKGNoYUhwMzYgKiBmX2hwX21heDM2KTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tmaWlkXS5kemhlbiA9IDA7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbZmlpZF0uc2tidWZmID0ge307XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJfc3ViX2J5X2ZpaWQoZmlpZCk7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMub25lQnVmZltmaWlkXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogMTM1MCwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiAyLCAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IDEsIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpXzM2OiBzdWJIcDM2LFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfMzZfblpoZW46IHRoaXMuemhlbiArIDMwLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfSwgLy/lsZ7mgKdcbi8vICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIC8vdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiYVR5cGVcIiwgWHlzLkFjdGlvblR5cGUuZWZmZWN0KTtcbi8vICAgICAgICAgICAgICAgICAgICAgLy90aGlzLmFkZE9uZUF0ayhpaWQsIGZpaWQsIFwiZWZmZWN0XCIsIFtcImhwXCIsIHN1YkhwMzZdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAzNzogLy/lt7Hmlrnku7vkvZXkuIDkuKrljZXkvY3miqTkvZPnvaHmsJTnoLTnoo7ml7bvvIznhLblkI7mjIflrprkuIDkuKpCVUZG5pWI5p6c77yM5q+U5aaC5Ye76YCA5pWM5Lq6XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChjc1tcImRvX2lpZFwiXS50b1N0cmluZygpLmxlbmd0aCAhPSBmaWlkLmxlbmd0aCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChmaWlkLCBza2lkLCBjZmdFZi5hcmdzW1wiaWRcIl0udG9TdHJpbmcoKSwgZWZfdHR5cGUsIGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAzODogLy/op6blj5Hov57lh7vml7bvvIznu5noh6rouqvlop7liqDmlYjmnpxcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNzW1wiZG9faWlkXCJdLnRvU3RyaW5nKCkgIT0gaWlkKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBjc1tcIm5leHRpZFwiXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfZWZmZWN0KGlpZCwgc2tpZCwgY2ZnRWYuYXJnc1tcImlkXCJdLnRvU3RyaW5nKCksIGVmX3R0eXBlLCBjcyk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMzk6IC8v5bex5pa55Y2V5L2N5pa95Yqg5Ye76YCA5pe277yM5L2/5YW26I635b6XNTAl5rCU6KGA5YC85oqk5L2T572h5rCU77yM5bm25o+Q6auY5YW2NSXmma7mlLvkvKTlrrPvvIzmjIHnu63oh7PmiJjmlpfnu5PmnZ/vvIzmnIDlpJrlj6DliqAyMOWxgu+8jOWGt+WNtDEy56eSXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChjc1tcImRvX2lpZFwiXS50b1N0cmluZygpICE9IGZpaWQpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiAxLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7IGlfMzlfYTogY2ZnRWYuYXJnc1tcImFcIl0gKiAxMDAwMCB9LCAvL+WxnuaAp1xuLy8gICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgLy/liqDmiqTkvZPnvaHmsJRcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlMzkgPSBNYXRoLmZsb29yKCh0aGlzLnRlYW1zW2ZpaWRdLmVwc1tcImhwXCJdICogY2ZnRWYuYXJnc1tcImhwXCJdKSAvIDEwMDAwKTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWQ6IGZpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiZWZmZWN0X2lfOVwiLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiAxLCAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IDEsIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IHsgaV85OiB2YWx1ZTM5IH0sIC8v5bGe5oCnXG4vLyAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDQwOiAvL+iHqui6q+awlOihgOmrmOS6jnh4JeaXtizmnInmpoLnjofnu5noh6rouqvlop7liqDmlYjmnpxcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGZfaHA0MCA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImhwXCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZl9ocF9tYXg0MCA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImhwX21heFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKChmX2hwNDAgKiAxMDAwMCkgLyBmX2hwX21heDQwID4gTWF0aC5hYnMoY2ZnRWYuYXJnc1tcImhwXCJdKSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VlZFJhbmQucmFuZCgxLCAxMDAwMCkgPD0gY2ZnRWYuYXJnc1tcInBcIl0gKiAxMDAwMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzW1wibmV4dGlkXCJdID0gMTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChpaWQsIHNraWQsIGNmZ0VmLmFyZ3NbXCJpZFwiXS50b1N0cmluZygpLCBlZl90dHlwZSwgY3MpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA0MTogLy/lm57ooYDvvIzlj5boh6rouqvnlJ/lkb3lgLzkuIrpmZB4Jei/m+ihjOWbnuihgO+8jFxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoY3NbXCJuZXh0X2N4XCJdICE9IG51bGwgJiYgY3NbXCJuZXh0X2N4XCJdIDwgdGhpcy56aGVuKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZl9ocF9tYXg0MSA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImhwX21heFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGFIcDQxOiBudW1iZXIgPSBNYXRoLmFicyhjZmdFZi5hcmdzW1wiaHBcIl0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkZEhwOiBudW1iZXIgPSBNYXRoLmZsb29yKGZfaHBfbWF4NDEgKiBjaGFIcDQxKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgaWlkLCBcImFUeXBlXCIsIFh5cy5BY3Rpb25UeXBlLmVmZmVjdCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGZpaWQsIFwiZWZmZWN0XCIsIFtcImhwXCIsIGFkZEhwXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjc1tcIm5leHRfY3hcIl0gPSB0aGlzLnpoZW47XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWlkOiBpaWQsIC8v6Kem5Y+R6ICFXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlpZHM6IFtmaWlkXSwgLy/op6blj5Hlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX3R0eXBlICsgXCJfXCIgKyBlX2ksIC8v5a6a5pe25Zmo5qCH6K+GXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogWzYwMV0sIC8v5omn6KGM6Kem5Y+R54K5XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYzogXCJza19lZmZlY3RcIiwgLy/miafooYznmoTlh73mlbDlkI1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsemhlbjogMzAsIC8v6L2u6K+i5omn6KGM5pe26Ze0XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXpoZW46IHRoaXMuemhlbiArIG1heHpoZW4sXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpZDogc2tpZCwgLy/mioDog71JRFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlaWQ6IGVmZmVjdElkLCAvL+aViOaenElEfOihjOS4uklEXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3M6IGNzLCAvL+WPguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZWZfYnVmZiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IDEsIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7fSwgLy/lsZ7mgKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNzW1wibmV4dF9jeFwiXTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDQyOiAvL+iHqui6q+awlOihgOavj+mZjeS9jnh4eHgl77yM6YCg5oiQ5Lyk5a6z5o+Q5Y2HNSVcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGZfaHA0MjogbnVtYmVyID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGZfaHA0MiA9IE1hdGgubWF4KDAsIGZfaHA0Mik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBmX2hwX21heDQyID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBfbWF4XCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgaHBSYXRlOiBudW1iZXIgPSBNYXRoLmFicyhjZmdFZi5hcmdzW1wiaHBcIl0gKiAxMDApO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgbmV3UmF0ZTogbnVtYmVyID0gTWF0aC5jZWlsKChmX2hwNDIgKiAxMDApIC8gZl9ocF9tYXg0Mik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMTAwIC0gaHBSYXRlOyBpbmRleCA+PSBuZXdSYXRlOyBpbmRleCAtPSBocFJhdGUpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjc1tpbmRleC50b1N0cmluZygpXSAhPSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjc1tpbmRleC50b1N0cmluZygpXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWlkOiBpaWQsIC8v6Kem5Y+R6ICFXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlpZHM6IFtmaWlkXSwgLy/op6blj5Hlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX3R0eXBlLCAvL+WumuaXtuWZqOagh+ivhlxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFs0MDFdLCAvL+aJp+ihjOinpuWPkeeCuVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmM6IFwic2tfZWZmZWN0XCIsIC8v5omn6KGM55qE5Ye95pWw5ZCNXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpoZW46IDMwLCAvL+i9ruivouaJp+ihjOaXtumXtFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV6aGVuOiB0aGlzLnpoZW4gKyBtYXh6aGVuLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraWQ6IHNraWQsIC8v5oqA6IO9SURcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZWlkOiBlZmZlY3RJZCwgLy/mlYjmnpxJRHzooYzkuLpJRFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzOiBjcywgLy/lj4LmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za19lZmZlY3QoaWlkLCBza2lkLCBjZmdFZi5hcmdzW1wiaWRcIl0udG9TdHJpbmcoKSwgZWZfdHR5cGUsIGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuXG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNDM6IC8v6Ieq6Lqr5rCU6KGA6auY5LqONjAl5pe2LOaZrumAmuaUu+WHu+aciTQwJeamgueOh+ayiem7mOebruagh1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgY2hhSHA0MzogbnVtYmVyID0gTWF0aC5hYnMoY2ZnRWYuYXJnc1tcImhwXCJdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGZfaHA0MyA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImhwXCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZl9ocF9tYXg0MyA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImhwX21heFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKChmX2hwNDMgKiAxMDAwMCkgLyBmX2hwX21heDQzID4gY2hhSHA0Mykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VlZFJhbmQucmFuZCgxLCAxMDAwMCkgPD0gY2ZnRWYuYXJnc1tcInBcIl0gKiAxMDAwMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzW1wibmV4dGlkXCJdID0gMTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChpaWQsIHNraWQsIGNmZ0VmLmFyZ3NbXCJpZFwiXS50b1N0cmluZygpLCBlZl90dHlwZSwgY3MpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA0NDogLy/miqTnm77mtojlpLHml7bvvIznm7TmjqXpgKDmiJDoh6rouqvlkajlm7TlhajkvZPnm67moIcxMjAl5oqA6IO95Lyk5a6zXG4vLyAgICAgICAgICAgICAgICAgICAgIGNzW1wibmV4dGlkXCJdID0gMTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za19lZmZlY3QoaWlkLCBza2lkLCBjZmdFZi5hcmdzW1wiaWRcIl0udG9TdHJpbmcoKSwgZWZfdHR5cGUsIGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA0NTogLy/oh6rouqvlj5fliLDotoXov4flvZPliY3msJTooYAxMCXku6XkuIrkvKTlrrPml7bvvIzojrfnmoTmn5Dnp43mlYjmnpxcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGZfaHA0NiA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImhwXCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZl9ocDQ2X29sZCA9IHRoaXMudGVhbXNbZmlpZF0uZXBzLmhwO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZl9ocF9tYXg0NiA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImhwX21heFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKChmX2hwNDYgLSBmX2hwNDZfb2xkKSAvIGZfaHBfbWF4NDYgPiBjZmdFZi5hcmdzW1wiaHBcIl0pIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNzW1wibmV4dGlkXCJdID0gMTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfZWZmZWN0KGlpZCwgc2tpZCwgY2ZnRWYuYXJnc1tcImlkXCJdLnRvU3RyaW5nKCksIGVmX3R0eXBlLCBjcyk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDQ2OiAvL+eJuueJsuiHquW3sXh4eCXlvZPliY3msJTooYDvvIzlr7nnm67moIfpgKDmiJB4eHgl5Lyk5a6zXG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBpX2hwID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJocFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiYVR5cGVcIiwgWHlzLkFjdGlvblR5cGUuZWZmZWN0KTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiZWZmZWN0XCIsIFtcImhwXCIsIC0xICogTWF0aC5mbG9vcihpX2hwICogY2ZnRWYuYXJnc1tcImhwXCJdKV0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHRoaXMub25lRmlpZHNbaWlkXVtlZl90dHlwZV0ubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanNfaGl0cyhpaWQsIHRoaXMub25lRmlpZHNbaWlkXVtlZl90dHlwZV1ba10sIGNmZ0VmLmFyZ3NbXCJhXCJdICogMTAwMDAsIHNraWQpOyAvL+iuoeeul+S8pOWus1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGd6aGl0ID0gdGhpcy5vbmVIaXRbaWlkXVt0aGlzLm9uZUZpaWRzW2lpZF1bZWZfdHR5cGVdW2tdXTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgdGhpcy5vbmVGaWlkc1tpaWRdW2VmX3R0eXBlXVtrXSwgXCJlZmZlY3RcIiwgW1wiaHBcIiwgLTEgKiBNYXRoLmZsb29yKGd6aGl0LnNraGl0KV0pO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNDc6IC8v57uZQk9TU+aMguS6huafkOenjUJVRkbvvIxCT1NT5bCx5YWN55ar6L+Z5Liq5pWI5p6c44CCXG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiBlX20sIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IGNmZ0VmLmFyZ3MsIC8v5bGe5oCnXG4vLyAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDQ4OiAvL0JPU1PmirXmipfnnJ/mhI8v54Gr54Sw55qE5pe26Ze05YeP5bCRXG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgNDUgKiAzMCwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiBlX20sIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IGNmZ0VmLmFyZ3MsIC8v5bGe5oCnXG4vLyAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDUxOiAvL+WbnuihgFxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoY2ZnRWYuYXJnc1tcImlmXCJdID09IDEpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjc1tcIm5leHRpZFwiXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWlkOiBpaWQsIC8v6Kem5Y+R6ICFXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWRzOiBmaWlkcywgLy/op6blj5Hlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl90dHlwZSwgLy/lrprml7blmajmoIfor4Zcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogY2ZnRWYudHJpZ2dlclRpbWUgPyBjZmdFZi50cmlnZ2VyVGltZSA6IFs2MDFdLCAvL+aJp+ihjOinpuWPkeeCuVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jOiBcInNrX2VmZmVjdFwiLCAvL+aJp+ihjOeahOWHveaVsOWQjVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsemhlbjogMzAsIC8v6L2u6K+i5omn6KGM5pe26Ze0XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV6aGVuOiB0aGlzLnpoZW4gKyBtYXh6aGVuLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lkOiBza2lkLCAvL+aKgOiDvUlEXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlaWQ6IGVmZmVjdElkLCAvL+aViOaenElEfOihjOS4uklEXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzOiBjcywgLy/lj4LmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVR5cGU6IG92ZXJsYXlUeXBlLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcl9zdWIoaWlkLCBlZl90dHlwZSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ZnRWYuYXJnc1tcImlmXCJdID09IDIpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjc1tcIm5leHRpZFwiXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWlkOiBpaWQsIC8v6Kem5Y+R6ICFXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWRzOiBmaWlkcywgLy/op6blj5Hlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl90dHlwZSwgLy/lrprml7blmajmoIfor4Zcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogY2ZnRWYudHJpZ2dlclRpbWUgPyBjZmdFZi50cmlnZ2VyVGltZSA6IFs2MDFdLCAvL+aJp+ihjOinpuWPkeeCuVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jOiBcInNrX2VmZmVjdFwiLCAvL+aJp+ihjOeahOWHveaVsOWQjVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsemhlbjogY2ZnRWYuaW50ZXJ2YWwgKiAzMCwgLy/ova7or6LmiafooYzml7bpl7Rcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXpoZW46IHRoaXMuemhlbiArIG1heHpoZW4sXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraWQ6IHNraWQsIC8v5oqA6IO9SURcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWVpZDogZWZmZWN0SWQsIC8v5pWI5p6cSUR86KGM5Li6SURcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3M6IGNzLCAvL+WPguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWumuaXtuWQjuWKoOihgFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpXzUxX2F0ayA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiYXRrXCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpXzUxX2hwID0gTWF0aC5mbG9vcigoY2ZnRWYuYXJnc1tcImF0a19wZXJcIl0gKiBpXzUxX2F0aykgLyAxMDAwMCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiYVR5cGVcIiwgWHlzLkFjdGlvblR5cGUuZWZmZWN0KTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGZpaWQsIFwiZWZmZWN0XCIsIFtcImhwXCIsIGlfNTFfaHBdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAvLyBjc1tcIm5leHRpZFwiXSA9IDFcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmLmFyZ3NbXCJpZFwiXSAhPSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChpaWQsIHNraWQsIGNmZ0VmLmFyZ3NbXCJpZFwiXSwgZWZfdHR5cGUsIGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgaV81MV9hdGsgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImF0a1wiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGlfNTFfaHAgPSBNYXRoLmZsb29yKChjZmdFZi5hcmdzW1wiYXRrX3BlclwiXSAqIGlfNTFfYXRrKSAvIDEwMDAwKTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiYVR5cGVcIiwgWHlzLkFjdGlvblR5cGUuZWZmZWN0KTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBmaWlkLCBcImVmZmVjdFwiLCBbXCJocFwiLCBpXzUxX2hwXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIC8vIOaciemZhOWKoGlkXG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNTI6IC8v5by65Yi25a+55pyJ5a+S5oSP54q25oCB55uu5qCH6L2s5YyW5Li65Yaw5Ya777yM5q+P5bGC5a+S5oSP5Yaw5Ya7eOenku+8iOi9rOWMluWujOaIkOWQju+8jOmcgOimgea4heepuuebruagh+WvkuaEj+eKtuaAge+8iVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgaGl0aWlkcyA9IE9iamVjdC5rZXlzKHRoaXMub25lSGl0W2lpZF0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGhpdGlpZHMubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoaXRpaWQgPSBoaXRpaWRzW2tdO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZfZWZmX2lfNyA9IHRoaXMuc2tidWZmX2dldChoaXRpaWQsIFwiZWZmZWN0X2lfN1wiLCAyKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmX2VmZl9pXzcgPT0gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1heFpoZW4gPSBNYXRoLmZsb29yKHRoaXMuemhlbiArIGZfZWZmX2lfNyAqIGNmZ0VmLmFyZ3NbXCJ0XCJdICogMzApO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBoaXRpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcImVmZmVjdF9pXzVcIiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogbWF4WmhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IGVfbSwgLy/lop7liqDlsYLmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IHt9LCAvL+WxnuaAp1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9zdWJfYWxsKGhpdGlpZCwgXCJlZmZlY3RfaV83XCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNTM6IC8v5Lyk5a6z5Yqg5rex77yI6K6h566X5pS75Ye75Yqb5YCN5pWw77yJIOi/memHjOeahOS8pOWus+ebuOW9k+S6juaYr+ebtOaOpeeUqOaUu+WHu+WKm+eahOWAjeaVsOS9nOS4uuS8pOWus+WAvFxuLy8gICAgICAgICAgICAgICAgICAgICAvLyDmnKzmrKHmlLvlh7vliqDmiJDnmoQg5LiL5LiA5bin5LiN6IO95YaN5Yqg5Lyk5a6z6KaB5pys5qyh5Yqg77yB77yB77yBXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vbmVBdGtbZmlpZF0pIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgaV81M19hdGsgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImF0a1wiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGhpdGlpZHMyID0gT2JqZWN0LmtleXModGhpcy5vbmVIaXRbaWlkXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgaGl0aWlkczIubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5vbmVBdGtbZmlpZF1baGl0aWlkczJba11dLmVmZmVjdC5sZW5ndGg7IGorKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uZUF0a1tmaWlkXVtoaXRpaWRzMltrXV0uZWZmZWN0W2pdWzBdID09PSBcImhwXCIgJiYgdGhpcy5vbmVBdGtbZmlpZF1baGl0aWlkczJba11dLmVmZmVjdFtqXVsxXSA8IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbmVBdGtbZmlpZF1baGl0aWlkczJba11dLmVmZmVjdFtqXVsxXSA9IC1NYXRoLmZsb29yKChpXzUzX2F0ayAqIGNmZ0VmLmFyZ3NbXCJhdGtcIl0pIC8gMTAwMDApO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWQ6IGZpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX2J1ZmYsIC8v5bGe5oCna2V5XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtYXhaaGVuOiB0aGlzLnpoZW4gKyAxLCAvL+e7k+adn+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVR5cGU6IG92ZXJsYXlUeXBlLCAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IGVfbSwgLy/lop7liqDlsYLmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGVwczoge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfNTM6IE1hdGguZmxvb3IoKGlfNTNfYXRrICogY2ZnRWYuYXJnc1tcImF0a1wiXSkgLyAxMDAwMCksXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA1NDogLy/nm7TmjqXlr7nmnInnnJ/mhI/nirbmgIHnmoTnm67moIfov5vooYzlvJXniIbvvIzmr4/lsYLnnJ/mhI/pop3lpJbpgKDmiJB4eCXkvKTlrrNcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGhpdHMgPSBPYmplY3Qua2V5cyh0aGlzLm9uZUhpdFtpaWRdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGlfYXRrNTQgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImF0a1wiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBoaXRzLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZWZmX2lfOF81NCA9IHRoaXMuc2tidWZmX2dldChoaXRzW2tdLCBcImVmZmVjdF9pXzhcIiwgMik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGl0NTQgPSBNYXRoLmZsb29yKGlfYXRrNTQgKiBjZmdFZi5hcmdzW1wiYVwiXSAqIGVmZl9pXzhfNTQpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhpdDU0ID4gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgaWlkLCBcImFUeXBlXCIsIFh5cy5BY3Rpb25UeXBlLmVmZmVjdCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBoaXRzW2tdLCBcImVmZmVjdFwiLCBbXCJocFwiLCAtMSAqIGhpdDU0XSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfc3ViX2FsbChoaXRzW2tdLCBcImVmZmVjdF9pXzhcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA1NjogLy/lvJXniIbmiJHmlrnmiYDmnInnnJ/mhI/vvIzmr4/lsYLnnJ/mhI/pop3lpJbpgKDmiJAyMCXnmoTkvKTlrrNcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGVmZl9pXzRfNTYgPSAwO1xuLy8gICAgICAgICAgICAgICAgICAgICAvLyDmuIXpmaTmiJHmlrnmiYDmnInnnJ/mhI9cbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMudGVhbUZpaWRzLmxlbmd0aDsgaW5kZXgrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVpZCA9IHRoaXMudGVhbUZpaWRzW2luZGV4XTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpaWQubGVuZ3RoICE9IHVpZC5sZW5ndGgpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb3VudCA9IHRoaXMuc2tidWZmX2dldCh1aWQsIFwiZWZmZWN0X2lfOFwiLCAyKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZfaV80XzU2ICs9IGNvdW50O1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX3N1Yl9hbGwodWlkLCBcImVmZmVjdF9pXzhcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGVmZl9pXzRfNTYgPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGl0cyA9IE9iamVjdC5rZXlzKHRoaXMub25lSGl0W2lpZF0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlfYXRrNTYgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImF0a1wiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgaGl0cy5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoaXQ1NiA9IE1hdGguZmxvb3IoaV9hdGs1NiAqIGNmZ0VmLmFyZ3NbXCJhXCJdICogZWZmX2lfNF81Nik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhpdDU2ID4gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGlpZCwgXCJhVHlwZVwiLCBYeXMuQWN0aW9uVHlwZS5lZmZlY3QpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGhpdHNba10sIFwiZWZmZWN0XCIsIFtcImhwXCIsIC0xICogaGl0NTZdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDU3OiAvL+a4hemZpOaIkeaWueaJgOacieeBq+eEsOeKtuaAge+8jOavj+WxgueBq+eEsOmineWklumAoOaIkHgl55qE5Lyk5a6zXG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBlZmZfaV80XzU3ID0gMDtcbi8vICAgICAgICAgICAgICAgICAgICAgLy8g5riF6Zmk5oiR5pa554Gr54SwXG4vLyAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnRlYW1GaWlkcy5sZW5ndGg7IGluZGV4KyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1aWQgPSB0aGlzLnRlYW1GaWlkc1tpbmRleF07XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWlkLmxlbmd0aCAhPSB1aWQubGVuZ3RoKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY291bnQgPSB0aGlzLnNrYnVmZl9nZXQodWlkLCBcImVmZmVjdF9pXzRcIiwgMik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmX2lfNF81NyArPSBjb3VudDtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9zdWJfYWxsKHVpZCwgXCJlZmZlY3RfaV80XCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChlZmZfaV80XzU3ID4gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhpdHMgPSBPYmplY3Qua2V5cyh0aGlzLm9uZUhpdFtpaWRdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpX2F0azU3ID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJhdGtcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGhpdHMubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGl0NTcgPSBNYXRoLmZsb29yKGlfYXRrNTcgKiBjZmdFZi5hcmdzW1wiYVwiXSAqIGVmZl9pXzRfNTcpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoaXQ1NyA+IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiYVR5cGVcIiwgWHlzLkFjdGlvblR5cGUuZWZmZWN0KTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBoaXRzW2tdLCBcImVmZmVjdFwiLCBbXCJocFwiLCAtMSAqIGhpdDU3XSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA1ODogLy/lm57ooYDvvIjmjInlt7LmjZ/lpLHnlJ/lkb3nmoQl5Y676K6h566X5Zue6KGA5YC877yJXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChjZmdFZi5hcmdzW1wiaWZcIl0gPT0gMSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZWZfYnVmZiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IGVfbSwgLy/lop7liqDlsYLmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaV81ODogY2ZnRWYuYXJnc1tcImhwXCJdLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpXzU4X2NkOiBjZmdFZi5jZCxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaV81OF9uWmhlbjogdGhpcy56aGVuLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmcGsgPSB0aGlzLnV1aWRzW2lpZF0/LmZwaztcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmX2hwNTggPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmX2hwX21heDU4ID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBfbWF4XCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkZEhwNTg6IG51bWJlciA9IE1hdGguZmxvb3IoKChmX2hwX21heDU4IC0gZl9ocDU4KSAqIGNmZ0VmLmFyZ3NbXCJocFwiXSkgLyAxMDAwMCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnBrICYmIGNmZ0VmLnRyaWdnZXJUaW1lID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhmcGssIGZwaywgXCJhVHlwZVwiLCBYeXMuQWN0aW9uVHlwZS5lZmZlY3QpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGZwaywgZmlpZCwgXCJlZmZlY3RcIiwgW1wiaHBcIiwgYWRkSHA1OF0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGlpZCwgXCJhVHlwZVwiLCBYeXMuQWN0aW9uVHlwZS5lZmZlY3QpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgZmlpZCwgXCJlZmZlY3RcIiwgW1wiaHBcIiwgYWRkSHA1OF0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNTk6IC8v5pyJ5qaC546H5bCG54Gr54Sw5q+P56eS5oyB57ut5Lyk5a6z5aKe5YqgeHglXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlZWRSYW5kLnJhbmQoMSwgMTAwMDApIDw9IGNmZ0VmLmFyZ3NbXCJwXCJdICogMTAwMDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlZmZlY3RfaV80ID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiZWZmZWN0X2lfNFwiLCAyKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlZmZlY3RfaV80ID4gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpXzU5ID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaV81OVwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMuc2tidWZmX3VwZGF0ZShmaWlkLCB7IGlfNTk6IGlfNTkgKyBjZmdFZi5hcmdzW1wiYVwiXSB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX2J1ZmYsIC8v5bGe5oCna2V5XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVR5cGU6IDEsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiBlX20sIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwczoge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaV81OTogY2ZnRWYuYXJnc1tcImFcIl0sXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDYwOiAvL+enu+mZpOWvueaJi+etiemHj+eahOWxnuaAp+WAvFxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZWZmX2lfZXA6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGtleXM2MCA9IE9iamVjdC5rZXlzKGNmZ0VmLmFyZ3MpO1xuLy8gICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGtleXM2MC5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbZmlpZF0uZXBzW2tleXM2MFtrXV0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZWZmX2lfZXBba2V5czYwW2tdXSA9IC0xICogTWF0aC5hYnMoY2ZnRWYuYXJnc1trZXlzNjBba11dKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZDogZmlpZCwgLy/mt7vliqDlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZWZfYnVmZiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1heFpoZW46IHRoaXMuemhlbiArIG1heHpoZW4sIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY2VuZzogZV9tLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiBlZmZfaV9lcCxcbi8vICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNjE6IC8v5oqk5L2T572h5rCU55qE5om/5Lyk5YeP5bCRL+WinuWKoHh4eCVcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWQ6IGZpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX2J1ZmYsIC8v5bGe5oCna2V5XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtYXhaaGVuOiB0aGlzLnpoZW4gKyBtYXh6aGVuLCAvL+e7k+adn+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVR5cGU6IG92ZXJsYXlUeXBlLCAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IGVfbSwgLy/lop7liqDlsYLmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGVwczoge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfNjE6IGNmZ0VmLmFyZ3NbXCJocF9tYXhcIl0sXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA2MjogLy/nm67moIfmsrvnlpfmlYjmnpzpmY3kvY4v5aKe5Yqg77yM5oyB57utWOenklxuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZDogZmlpZCwgLy/mt7vliqDlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZWZfYnVmZiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1heFpoZW46IHRoaXMuemhlbiArIG1heHpoZW4sIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY2VuZzogZV9tLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaV82MjogY2ZnRWYuYXJnc1tcImhwXCJdLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfSxcbi8vICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNjM6IC8v5Li76KeS6Zi15Lqh5ZCO77yM5byf5a2Q5Lya5aSN5rS75Li76KeS5bm25oGi5aSNMTkuNTYl55Sf5ZG977yM5q+P5Zy65oiY5paX55Sf5pWIMeasoe+8iOenmOazleWSjOazleWZqOeahOWkjea0u+WPquiDveeUn+aViDHkuKrvvIlcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNzW1wiZG9faWlkXCJdICUgMTAwICE9IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBmX2hwX21heDYzID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBfbWF4XCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgYWRkSHA2MjogbnVtYmVyID0gTWF0aC5mbG9vcigoZl9ocF9tYXg2MyAqIGNmZ0VmLmFyZ3NbXCJocFwiXSkgLyAxMDAwMCk7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBjc1tcImRvX2lpZFwiXS50b1N0cmluZygpLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiBlX20sIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpXzYzX2hwOiBhZGRIcDYyLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfNjNfblpoZW46IHRoaXMuemhlbixcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpXzYzX2NkOiAwLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfSxcbi8vICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNjQ6IC8v5byf5a2Q6aaW5qyh5pS75Ye75Lyk5a6z6aKd5aSW5o+Q5Y2HeCVcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWQ6IGZpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX2J1ZmYsIC8v5bGe5oCna2V5XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtYXhaaGVuOiB0aGlzLnpoZW4gKyBtYXh6aGVuLCAvL+e7k+adn+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVR5cGU6IG92ZXJsYXlUeXBlLCAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IGVfbSwgLy/lop7liqDlsYLmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGVwczoge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfNjRfYTogY2ZnRWYuYXJnc1tcImFcIl0gKiAxMDAwMCxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpXzY0X2NkOiBjZmdFZi5jZCA/IGNmZ0VmLmNkIDogMCxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpXzY0X25aaGVuOiB0aGlzLnpoZW4sXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA2NTogLy/pmYTliqDooqvmlLvlh7vnm67moIfnmoTlvZPliY3nlJ/lkb3lgLxYJeS8pOWusyzmnIDpq5jkvKTlrrPkuI3otoXov4fmlLvlh7vlipt4JVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZl9hdGs6IG51bWJlciA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiYXRrXCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQga2V5czY1ID0gT2JqZWN0LmtleXModGhpcy5vbmVBdGtbaWlkXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwga2V5czY1Lmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWlkLmxlbmd0aCAhPSBrZXlzNjVba10ubGVuZ3RoKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkZF82NTogbnVtYmVyID0gMDtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZl9ocCA9IHRoaXMuc2tidWZmX2dldChrZXlzNjVba10sIFwiaHBfbWF4XCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF82NSA9IChjZmdFZi5hcmdzW1wiaHBcIl0gKiBmX2hwKSAvIDEwMDAwO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF82NSA9IE1hdGgubWluKGFkZF82NSwgKGNmZ0VmLmFyZ3NbXCJtYXhfYXRrXCJdICogZl9hdGspIC8gMTAwMDApO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF82NSA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IoYWRkXzY1KSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiYVR5cGVcIiwgWHlzLkFjdGlvblR5cGUuZWZmZWN0KTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGtleXM2NVtrXSwgXCJlZmZlY3RcIiwgW1wiaHBcIiwgLTEgKiBhZGRfNjVdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDY2OiAvL+maj+acuuS4gOS4quW8n+WtkCDlgbflj5bnm67moIfkuLvop5J4JeeahOaUu+WHu+WKm++8jOavj+WxguacgOmrmOS4jei2hei/h3gl6Ieq6Lqr5pS75Ye75YqbIOS4jiA3OemFjeWQiOS9v+eUqFxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoY2ZnRWYuYXJnc1tcImlkXCJdICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfZWZmZWN0KGZpaWQsIHNraWQsIGNmZ0VmLmFyZ3NbXCJpZFwiXS50b1N0cmluZygpLCBcIlwiLCBjcyk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA3OTogLy/lgbflj5bnm67moId4JeeahOaUu+WHu+WKm++8jOavj+WxguacgOmrmOS4jei2hei/h3gl6Ieq6Lqr5pS75Ye75YqbXG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBrZXlzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0geyBhdGtfcGVyOiBcImF0a1wiLCBkZWZfcGVyOiBcImRlZlwiLCBocF9tYXhfcGVyOiBcImhwX21heFwiLCBocF9wZXI6IFwiaHBcIiB9O1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZXBzXzY2OiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBmZXBzXzY2OiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBrZXlzNzkgPSBPYmplY3Qua2V5cyhjZmdFZi5hcmdzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBrZXlzNzkubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlYW1zW2lpZF0uZXBzW2tleXM3OVtrXV0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlfa2V5ID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwga2V5c1trZXlzNzlba11dID8ga2V5c1trZXlzNzlba11dIDoga2V5czc5W2tdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmX2tleSA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBrZXlzW2tleXM3OVtrXV0gPyBrZXlzW2tleXM3OVtrXV0gOiBrZXlzNzlba10pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZfdmFsID0gTWF0aC5mbG9vcigoZl9rZXkgKiBjZmdFZi5hcmdzW2tleXM3OVtrXV0pIC8gMTAwMDApO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1heF92YWwgPSBNYXRoLmZsb29yKChpX2tleSAqIGNmZ0VmLmFyZ3NbXCJtYXhfYXRrXCJdKSAvIDEwMDAwKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpX2ZfdmFsID0ga2V5czc5W2tdID09IFwiYXRrX3BlclwiID8gTWF0aC5taW4oZl92YWwsIG1heF92YWwpIDogZl92YWw7IC8vIOi/meS4quWAvOaYr+aUu+WHu+WKm1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleXM3OVtrXSA9PSBcImF0a19wZXJcIikge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0a19wZXIg566X55qE5piv5pS75Ye75YqbIOebtOaOpeWKoOWcqGF0a+S4iumdolxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwc182NltrZXlzW2tleXM3OVtrXV1dID0gaV9mX3ZhbDtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZXBzXzY2W2tleXNba2V5czc5W2tdXV0gPSAtMSAqIGZfdmFsO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcHNfNjZba2V5czc5W2tdXSA9IGlfZl92YWw7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVwc182NltrZXlzNzlba11dID0gLTEgKiBmX3ZhbDtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZDogaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiBlX20sIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IGVwc182Nixcbi8vICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiBlX20sIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IGZlcHNfNjYsXG4vLyAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDY3OiAvL+WvueacgOe7iOS8pOWus+acieamgueOh+mAoOaIkE7lgI3kvKTlrrNcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGFfcGVyOiBudW1iZXIgPSAwO1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWVkUmFuZC5yYW5kKDEsIDEwMDAwKSA8PSBjZmdFZi5hcmdzW1wicDFcIl0gKiAxMDAwMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgYV9wZXIgPSBjZmdFZi5hcmdzW1wiYTFcIl07XG4vLyAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWVkUmFuZC5yYW5kKDEsIDEwMDAwKSA8PSBjZmdFZi5hcmdzW1wicFwiXSAqIDEwMDAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBhX3BlciA9IGNmZ0VmLmFyZ3NbXCJhXCJdO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChhX3BlciA+IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlpZDogaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZWZfYnVmZiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IGVfbSwgLy/lop7liqDlsYLmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IHsgYV9wZXI6IGFfcGVyIH0sXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDY4OiAvL+aUu+WHu+aXtu+8jOa2iOiAl+iHqui6q3gl5b2T5YmN55Sf5ZG95YC877yM5omj6Zmk5pWM5pa5562J6aKd55Sf5ZG95YC877yM5pyA6auY5LiN6LaF6L+H6Ieq6LqreCXmlLvlh7tcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGlfaHA2OCA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBpX2F0azY4ID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJhdGtcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBtYXggPSBNYXRoLmZsb29yKChpX2F0azY4ICogY2ZnRWYuYXJnc1tcImF0a19wZXJcIl0pIC8gMTAwMDApO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgc3ViSHA2OCA9IE1hdGguZmxvb3IoKGlfaHA2OCAqIE1hdGguYWJzKGNmZ0VmLmFyZ3NbXCJocFwiXSkpIC8gMTAwMDApO1xuLy8gICAgICAgICAgICAgICAgICAgICBzdWJIcDY4ID0gTWF0aC5taW4oc3ViSHA2OCwgbWF4KTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiYVR5cGVcIiwgWHlzLkFjdGlvblR5cGUuZWZmZWN0KTtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGxzT25lID09IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIC8v5Y+q5omj6Zmk5LiA5qyhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsc09uZSArPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiZWZmZWN0XCIsIFtcImhwXCIsIC0xICogc3ViSHA2OF0pO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgZmlpZCwgXCJlZmZlY3RcIiwgW1wiaHBcIiwgLTEgKiBzdWJIcDY4XSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNjk6IC8v5q+P5qyh6L+b6KGM5Y+N5Ye777yM6I635b6XNTEl5by65YyW5YW954G177yM5pyA5aSn5LiN6LaF6L+H6Ieq6Lqr5pS75Ye75YqbMzAl77yM5oyB57utMuenku+8jOWGt+WNtDEw56eSXG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBmX2F0azY5ID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiYXRrXCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgbV9xaHNob3VsaW5nID0gTWF0aC5mbG9vcigoZl9hdGs2OSAqIGNmZ0VmLmFyZ3NbXCJhdGtfcGVyXCJdKSAvIDEwMDAwKTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IHFoc2hvdWxpbmcgPSBNYXRoLm1pbihjZmdFZi5hcmdzW1wicWhzaG91bGluZ1wiXSwgbV9xaHNob3VsaW5nKTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWQ6IGZpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX2J1ZmYsIC8v5bGe5oCna2V5XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtYXhaaGVuOiB0aGlzLnpoZW4gKyBtYXh6aGVuLCAvL+e7k+adn+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVR5cGU6IDEsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY2VuZzogZV9tLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWhzaG91bGluZzogcWhzaG91bGluZyxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21heF9hZGRfaGl0OiBNYXRoLmZsb29yKChmX2F0azY5ICogY2ZnRWYuYXJnc1tcImF0a1wiXSkgLyAxMDAwMCksXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA3MDogLy/lj43lvLl4eCXnmoTkvKTlrrPnu5nmlYzmlrks5pyA5aSn5LiN6LaF6L+H6Ieq6Lqr5pS75Ye75YqbMuWAjVxuLy8gICAgICAgICAgICAgICAgICAgICAvLyDojrflj5bkuIrmrKHmlLvlh7voh6rlt7HnmoTkurpcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGhpdF9maWlkID0gdGhpcy51dWlkc1tpaWRdPy5mcGs7XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBoaXQ3MDogbnVtYmVyID0gY3NbXCJoaXRcIl0gKiBjZmdFZi5hcmdzW1wiYVwiXTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IG1heDcwID0gKHRoaXMuc2tidWZmX2dldChpaWQsIFwiYXRrXCIpICogY2ZnRWYuYXJnc1tcImF0a19wZXJcIl0pIC8gMTAwMDA7XG4vLyAgICAgICAgICAgICAgICAgICAgIGhpdDcwID0gTWF0aC5mbG9vcihNYXRoLm1pbihoaXQ3MCwgbWF4NzApKTtcbi8vICAgICAgICAgICAgICAgICAgICAgLy90aGlzLmFkZE9uZUF0ayhoaXRfZmlpZCxoaXRfZmlpZCxcImFUeXBlXCIsWHlzLkFjdGlvblR5cGUuZWZmZWN0KVxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoaGl0X2ZpaWQpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGhpdF9maWlkLCBoaXRfZmlpZCwgXCJlZmZlY3RcIiwgW1wiaHBcIiwgLTEgKiBoaXQ3MF0pO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNzE6IC8v5Y2V5qyh5Lyk5a6z5LiN6LaF6L+H6Ieq6Lqr5pyA5aSn55Sf5ZG95YC855qEeCVcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNzW1wiZG9faWlkXCJdICE9IE51bWJlcihmaWlkKSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IGZhbHNlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGZfaHBfbWF4NzEgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImhwX21heFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IG1heF9oaXRfNzEgPSBNYXRoLmZsb29yKChmX2hwX21heDcxICogY2ZnRWYuYXJnc1tcImhwX21heFwiXSkgLyAxMDAwMCk7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiAxLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2lfNzE6IG1heF9oaXRfNzEsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2lfNzFfY2Q6IGNmZ0VmLmNkID8gY2ZnRWYuY2QgOiAwLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9pXzcxX25aaGVuOiB0aGlzLnpoZW4sXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA3MjogLy/nm67moIflpITkuo7mn5Dnp43nirbmgIHvvIznhLblkI7lu7bplb/mraTnirbmgIHnmoTml7bpl7Rcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGZfaV9idWZmID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiZWZmZWN0X2lfXCIgKyBjZmdFZi5hcmdzW1wiYnVmZlwiXSwgMik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChmX2lfYnVmZiA+IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIC8vbGV0IGtleXM3MiA9IE9iamVjdC5rZXlzKHRoaXMudXVpZHNbZmlpZF0uc2tidWZmW1wiZWZmZWN0X2lfXCIgKyBjZmdFZi5hcmdzW1wiYnVmZlwiXV0pXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5czcyID0gdGhpcy5jaGFuZ2VTa0J1ZmYoMSwgZmlpZCwgXCJlZmZlY3RfaV9cIiArIGNmZ0VmLmFyZ3NbXCJidWZmXCJdLCAxKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwga2V5czcyLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tmaWlkXS5za2J1ZmZbXCJlZmZlY3RfaV9cIiArIGNmZ0VmLmFyZ3NbXCJidWZmXCJdXVtOdW1iZXIoa2V5czcyW2tdKV0uZXpoZW4gKz0gMzAgKiBjZmdFZi5hcmdzW1widFwiXTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlU2tCdWZmKDIsIGZpaWQsIFwiZWZmZWN0X2lfXCIgKyBjZmdFZi5hcmdzW1wiYnVmZlwiXSwgMSwgdGhpcy51dWlkc1tmaWlkXS5za2J1ZmZbXCJlZmZlY3RfaV9cIiArIGNmZ0VmLmFyZ3NbXCJidWZmXCJdXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDczOiAvL+avj+asoemHiuaUvuacr+azle+8jOacr+azleS8pOWus+WinuWKoDcuNSXvvIzmnIDpq5jlj6DliqDliLAxNSVcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IHFobWlmYTczID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaV83M1wiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgcWhtaWZhNzMgKz0gY2ZnRWYuYXJnc1tcInFobWlmYVwiXTtcbi8vICAgICAgICAgICAgICAgICAgICAgcWhtaWZhNzMgPSBNYXRoLm1pbihxaG1pZmE3MywgY2ZnRWYuYXJnc1tcIm1heF9xaG1pZmFcIl0pO1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZDogZmlpZCwgLy/mt7vliqDlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZWZfYnVmZiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1heFpoZW46IHRoaXMuemhlbiArIG1heHpoZW4sIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogMiwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiAxLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7IGlfNzM6IHFobWlmYTczIH0sXG4vLyAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDc0OiAvL+e7meiiq+a6heWwhOeahOebruagh+WinuWKoOS4gOS4qkJVRkbmlYjmnpxcbi8vICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChpaWQsIHNraWQsIGNmZ0VmLmFyZ3NbXCJpZFwiXS50b1N0cmluZygpLCBlZl90dHlwZSwgY3MpO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDc1OiAvL+aKgOiDveezu+aVsOWinuWKoO+8jOeUn+aViDHmrKHlkI7muIXnqbpcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmLmFyZ3NbXCJhXCJdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiAyLCAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IDEsIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IHsgaV83NTogY2ZnRWYuYXJnc1tcImFcIl0gKiAxMDAwMCB9LFxuLy8gICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA3NjogLy/lrZjlnKhidWZm5pe277yM6YCg5oiQ5oqA6IO95Lyk5a6zXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnRWYuYXJnc1tcImJ1ZmZcIl0pID09IGZhbHNlKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJlZmZlY3RfaV9cIiArIGNmZ0VmLmFyZ3NbXCJidWZmXCJdLCAyKSA8PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5qc19oaXRzKGlpZCwgZmlpZCwgZV9hLCBza2lkKTsgLy/orqHnrpfkvKTlrrNcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGd6aGl0ID0gdGhpcy5vbmVIaXRbaWlkXVtmaWlkXTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGhpdCA9IGd6aGl0LnNraGl0O1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGlpZCwgXCJhVHlwZVwiLCBYeXMuQWN0aW9uVHlwZS5lZmZlY3QpO1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGZpaWQsIFwiZWZmZWN0XCIsIFtcImhwXCIsIC0xICogaGl0XSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChjZmdFZi5hcmdzW1wicFwiXSAhPSBudWxsICYmIHRoaXMuc2VlZFJhbmQucmFuZCgxLCAxMDAwMCkgPD0gY2ZnRWYuYXJnc1tcInBcIl0gKiAxMDAwMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za19lZmZlY3QoaWlkLCBza2lkLCBjZmdFZi5hcmdzW1wiaWRcIl0sIGVmX3R0eXBlLCBjcyk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA3NzogLy8g6YCg5oiQ5Lyk5a6z77yI6aKd5aSW5Lyk5a6z77yJXG4vLyAgICAgICAgICAgICAgICAgICAgIGNzW1wiaGl0XCJdID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJhdGtcIik7XG5cbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNzW1wiaGl0XCJdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBoaXRfNzcgPSBNYXRoLmZsb29yKChjc1tcImhpdFwiXSAqIGNmZ0VmLmFyZ3NbXCJhdGtcIl0pIC8gMTAwMDApO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZWZmZWN0ID0gW107XG4vLyAgICAgICAgICAgICAgICAgICAgIGVmZmVjdCA9IFtcImhwXCIsIC0xICogaGl0Xzc3XTtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmLmFyZ3NbXCJzXCJdICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdCA9IFtcImhwXCIsIC0xICogaGl0Xzc3LCBcImppdHVpXCIsIGNmZ0VmLmFyZ3NbXCJzXCJdXTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGZpaWQsIFwiZWZmZWN0XCIsIGVmZmVjdCk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNzg6IC8vIOmHiuaUvuaKgOiDveWQjiDpgKDmiJDmn5Dnp43mlYjmnpwgaWTlr7nlupTph4rmlL7mioDog73lkI7mlYjmnpxcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmLmFyZ3NbXCJpZFwiXSAhPSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChpaWQsIHNraWQsIGNmZ0VmLmFyZ3NbXCJpZFwiXSwgZWZfdHR5cGUsIGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDgwOiAvLyDnu5noh6rouqvliqBidWZm77yM5pS75Ye755uu5qCH5bim5pyJ5p+Q5LiqYnVmZuaXtu+8jOW/heWumuaatOWHu1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZDogZmlpZCwgLy/mt7vliqDlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZWZfYnVmZiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1heFpoZW46IHRoaXMuemhlbiArIG1heHpoZW4sIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogMSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiAxLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaV84MF9idWZmOiBjZmdFZi5hcmdzW1wiYnVmZlwiXSxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4vLyAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDgxOiAvLyDmuoXlsITkvKTlrrPlop7liqAv5YeP5bCRXG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiBlX20sIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpXzgxOiBlX2EsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaV84MV9jZDogMCwgLy8g5oyB57ut5oCn55qEIOS4jeWKoGNkXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaV84MV9uWmhlbjogdGhpcy56aGVuLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfSwgLy/lsZ7mgKdcbi8vICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgODI6IC8v5pS75Ye75bim5pyJ5oqk5L2T572h5rCU55qE5om/5Lyk5YeP5bCRL+WinuWKoHh4eCVcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWQ6IGZpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX2J1ZmYsIC8v5bGe5oCna2V5XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtYXhaaGVuOiB0aGlzLnpoZW4gKyBtYXh6aGVuLCAvL+e7k+adn+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVR5cGU6IG92ZXJsYXlUeXBlLCAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IGVfbSwgLy/lop7liqDlsYLmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGVwczoge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfODI6IGNmZ0VmLmFyZ3NbXCJocF9tYXhcIl0sXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICBpZiAoIXBhc3MpIHtcbi8vICAgICAgICAgICAgIHJldHVybjtcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIC8vY2Rcbi8vICAgICAgICAgaWYgKGZpaWRzLmxlbmd0aCA+IDApIHtcbi8vICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnRWYuY291bnQpID09IGZhbHNlICYmIHRoaXMuemhlbiAhPSAxKSB7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLnNrYmFzZVtza2lkXS5lZmZlY3RbZWZmZWN0SWRdLmNvdW50ICs9IDE7XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5jb3VudCA+PSBjZmdFZi5jb3VudCkge1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ0VmLmNkKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLnNrYmFzZVtza2lkXS5lZmZlY3RbZWZmZWN0SWRdLmVmZmVjdFpoZW4gPSB0aGlzLnpoZW47XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0uc2tiYXNlW3NraWRdLmVmZmVjdFtlZmZlY3RJZF0ubmV4dGNkID0gdGhpcy56aGVuICsgY2ZnRWYuY2QgKiAzMDtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5jb3VudCA9IDA7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0udGltZXJbZWZfdHR5cGVdW2NzW1widGltZXJJZFwiXS50b1N0cmluZygpXS5zemhlbiA9IHRoaXMuemhlbiArIGNmZ0VmLmNkICogMzA7XG4vLyAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ0VmLmNkKSA9PSBmYWxzZSAmJiB0aGlzLnpoZW4gIT0gMSkge1xuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLnV1aWRzW2lpZF0uc2tiYXNlW3NraWRdLmVmZmVjdFtlZmZlY3RJZF0uY291bnQgPT0gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0uc2tiYXNlW3NraWRdLmVmZmVjdFtlZmZlY3RJZF0uZWZmZWN0WmhlbiA9IHRoaXMuemhlbjsgLy8g5LiK5qyh5Yqg54q25oCB55qE5binXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChjZmdFZi5hcmdzW1widFwiXSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5lZmZlY3RFbmRaaGVuIDwgdGhpcy56aGVuKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLnNrYmFzZVtza2lkXS5lZmZlY3RbZWZmZWN0SWRdLmVmZmVjdEVuZFpoZW4gPSB0aGlzLnpoZW4gKyBjZmdFZi5hcmdzW1widFwiXSAqIDMwOyAvLyBidWZm5oyB57ut5aKe5Yqg5pWI5p6c57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLnNrYmFzZVtza2lkXS5lZmZlY3RbZWZmZWN0SWRdLm5leHRjZCA9IHRoaXMuemhlbiArIGNmZ0VmLmNkICogMzA7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0uc2tiYXNlW3NraWRdLmVmZmVjdFtlZmZlY3RJZF0ubmV4dGNkID0gdGhpcy56aGVuICsgY2ZnRWYuY2QgKiAzMDtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfVxuLy8gICAgICAgICAvLyDliKTlrprmmK/lkKbmmK/lvJ/lrZDmioDog70g6Kem5Y+R5byf5a2Q6YeK5pS+5oqA6IO95Li76KeS5Yqg6KGAXG4vLyAgICAgICAgIGlmIChjZmdCYXNlLnR5cGUgPT09IFwiMVwiICYmIGNmZ0Jhc2Uuc2tpbGxUeXBlID09PSAzKSB7XG4vLyAgICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy50ZWFtRmlpZHMubGVuZ3RoOyBpbmRleCsrKSB7XG4vLyAgICAgICAgICAgICAgICAgbGV0IHVpZCA9IHRoaXMudGVhbUZpaWRzW2luZGV4XTtcbi8vICAgICAgICAgICAgICAgICBpZiAodWlkLmxlbmd0aCA9PT0gaWlkLmxlbmd0aCkge1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgaV81OCA9IHRoaXMuc2tidWZmX2dldCh1aWQsIFwiZWZmZWN0X2lfNThcIiwgMik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChpXzU4ID4gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuemhlbiA+PSB0aGlzLnNrYnVmZl9nZXQodWlkLCBcImlfNThfblpoZW5cIikpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmnIljZOeahCDliqDlrozkuIDmrKHopoHmm7TmlrBjZFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjZCA9IHRoaXMuc2tidWZmX2dldCh1aWQsIFwiaV81OF9jZFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl91cGRhdGUodWlkLCB7IGlfNThfblpoZW46IGNkICogMzAgKyB0aGlzLnpoZW4gfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkZFBlciA9IHRoaXMuc2tidWZmX2dldCh1aWQsIFwiaV81OFwiKTsgLy8g5oGi5aSN5bey5o2f5aSx55Sf5ZG955qEeCVcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHAgPSB0aGlzLnNrYnVmZl9nZXQodWlkLCBcImhwXCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBocE1heCA9IHRoaXMuc2tidWZmX2dldCh1aWQsIFwiaHBfbWF4XCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoaXQgPSBNYXRoLmZsb29yKCgoaHBNYXggLSBocCkgKiBhZGRQZXIpIC8gMTAwMDApO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgaWlkLCBcImFUeXBlXCIsIFh5cy5BY3Rpb25UeXBlLmVmZmVjdCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCB1aWQsIFwiZWZmZWN0XCIsIFtcImhwXCIsIGhpdF0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog6L6F5Yqp5Ye95pWwIC0g6I635Y+W5YC85oC75ZKMXG4vLyAgICAgICogZ1R5cGUgPSAyIOWPoOWKoOeahOWxguaVsFxuLy8gICAgICAqL1xuLy8gICAgIHByaXZhdGUgc2tidWZmX2dldChpaWQ6IHN0cmluZywga2V5OiBzdHJpbmcsIGdUeXBlOiBudW1iZXIgPSAwKTogbnVtYmVyIHtcbi8vICAgICAgICAgbGV0IGVwVmFsOiBudW1iZXIgPSAwO1xuLy8gICAgICAgICBpZiAodGhpcy50ZWFtc1tpaWRdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgIHJldHVybiAwO1xuLy8gICAgICAgICB9XG5cbi8vICAgICAgICAgLy/lsYLmlbBcbi8vICAgICAgICAgaWYgKGdUeXBlID09IDIpIHtcbi8vICAgICAgICAgICAgIGxldCBjZW5nOiBudW1iZXIgPSAwO1xuLy8gICAgICAgICAgICAgaWYgKGtleSA9PSBcImVmZmVjdF9pXzEwXCIpIHtcbi8vICAgICAgICAgICAgICAgICBpZiAodGhpcy51dWlkc1tpaWRdLnNrYnVmZltcImVmZmVjdF9pXzFcIl0gIT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICBjZW5nICs9IHRoaXMudXVpZHNbaWlkXS5za2J1ZmZbXCJlZmZlY3RfaV8xXCJdLmxlbmd0aDtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5za2J1ZmZbXCJlZmZlY3RfaV8zXCJdICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgY2VuZyArPSB0aGlzLnV1aWRzW2lpZF0uc2tidWZmW1wiZWZmZWN0X2lfM1wiXS5sZW5ndGg7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLnV1aWRzW2lpZF0uc2tidWZmW1wiZWZmZWN0X2lfNFwiXSAhPSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGNlbmcgKz0gdGhpcy51dWlkc1tpaWRdLnNrYnVmZltcImVmZmVjdF9pXzRcIl0ubGVuZ3RoO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBpZiAodGhpcy51dWlkc1tpaWRdLnNrYnVmZltcImVmZmVjdF9pXzVcIl0gIT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICBjZW5nICs9IHRoaXMudXVpZHNbaWlkXS5za2J1ZmZbXCJlZmZlY3RfaV81XCJdLmxlbmd0aDtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5za2J1ZmZbXCJlZmZlY3RfaV82XCJdICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgY2VuZyArPSB0aGlzLnV1aWRzW2lpZF0uc2tidWZmW1wiZWZmZWN0X2lfNlwiXS5sZW5ndGg7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIC8vbGV0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnV1aWRzW2lpZF0uc2tidWZmKVxuLy8gICAgICAgICAgICAgICAgIGxldCBrZXlzID0gdGhpcy5jaGFuZ2VTa0J1ZmYoMSwgaWlkLCBudWxsLCAxKTtcbi8vICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGtleXMubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGtleXNba10uaW5jbHVkZXMoXCJlZmZlY3RfaV8wXCIpKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsZXQgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyh0aGlzLnV1aWRzW2lpZF0uc2tidWZmW2tleXNba11dKVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlcyA9IHRoaXMuY2hhbmdlU2tCdWZmKDEsIGlpZCwga2V5c1trXSwgMik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHZhbHVlcy5sZW5ndGg7IGorKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v6K6h566X5bGe5oCnIOi/memHjGlu5rKh5YWz57O7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGtleXMyID0gT2JqZWN0LmtleXModmFsdWVzW2pdLmVwcyk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgPCBrZXlzMi5sZW5ndGg7IGwrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tpaWRdLmVwc1trZXlzMltsXV0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlc1tqXS5lcHNba2V5czJbbF1dIDwgMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VuZyArPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgcmV0dXJuIGNlbmc7XG4vLyAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgIGlmICh0aGlzLnV1aWRzW2lpZF0uc2tidWZmW2tleV0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIHJldHVybiAwO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgcmV0dXJuIHRoaXMudXVpZHNbaWlkXS5za2J1ZmZba2V5XS5sZW5ndGg7XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICAvL+WxnuaAp1xuLy8gICAgICAgICBpZiAodGhpcy50ZWFtc1tpaWRdLmVwc1trZXldICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgIGVwVmFsID0gdGhpcy50ZWFtc1tpaWRdLmVwc1trZXldO1xuLy8gICAgICAgICAgICAgaWYgKGtleSA9PSBcImhwXCIpIHtcbi8vICAgICAgICAgICAgICAgICAvL+WJqeS9meihgOmHj1xuLy8gICAgICAgICAgICAgICAgIGVwVmFsID0gdGhpcy5qdWVGaWlkSHAoaWlkKTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfVxuLy8gICAgICAgICAvLyBsZXQgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyh0aGlzLnV1aWRzW2lpZF0uc2tidWZmKTtcbi8vICAgICAgICAgbGV0IHZhbHVlcyA9IHRoaXMuY2hhbmdlU2tCdWZmKDEsIGlpZCwgbnVsbCwgMik7XG4vLyAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgdmFsdWVzLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHZhbHVlc1trXS5sZW5ndGg7IGorKykge1xuLy8gICAgICAgICAgICAgICAgIC8v6K6h566X5bGe5oCnIOi/memHjGlu5rKh5YWz57O7XG4vLyAgICAgICAgICAgICAgICAgaWYgKHZhbHVlc1trXVtqXS5lcHNba2V5XSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBlcFZhbCArPSB2YWx1ZXNba11bal0uZXBzW2tleV07XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICAvL+aUu+WHu1xuLy8gICAgICAgICBpZiAoa2V5ID09IFwiYXRrXCIpIHtcbi8vICAgICAgICAgICAgIGxldCBhdGtfcGVyID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJhdGtfcGVyXCIpO1xuLy8gICAgICAgICAgICAgZXBWYWwgKz0gTWF0aC5mbG9vcigoZXBWYWwgKiBhdGtfcGVyKSAvIDEwMDAwKTtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICAvL+mYsuW+oVxuLy8gICAgICAgICBpZiAoa2V5ID09IFwiZGVmXCIpIHtcbi8vICAgICAgICAgICAgIGxldCBkZWZfcGVyID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJkZWZfcGVyXCIpO1xuLy8gICAgICAgICAgICAgZXBWYWwgKz0gTWF0aC5mbG9vcigoZXBWYWwgKiBkZWZfcGVyKSAvIDEwMDAwKTtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICAvL+eUn+WRveeZvuWIhuavlFxuLy8gICAgICAgICBpZiAoa2V5ID09IFwiaHBfbWF4XCIpIHtcbi8vICAgICAgICAgICAgIGxldCBocF9tYXhfcGVyID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJocF9tYXhfcGVyXCIpO1xuLy8gICAgICAgICAgICAgZXBWYWwgKz0gTWF0aC5mbG9vcigoZXBWYWwgKiBocF9tYXhfcGVyKSAvIDEwMDAwKTtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICAvL+eUn+WRveeZvuWIhuavlFxuLy8gICAgICAgICBpZiAoa2V5ID09IFwiaHBcIikge1xuLy8gICAgICAgICAgICAgbGV0IGhwX3BlciA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiaHBfcGVyXCIpO1xuLy8gICAgICAgICAgICAgZXBWYWwgKz0gTWF0aC5mbG9vcigoZXBWYWwgKiBocF9wZXIpIC8gMTAwMDApO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKGVwVmFsKTtcbi8vICAgICB9XG5cbi8vICAgICAvKipcbi8vICAgICAgKiDovoXliqnlh73mlbAgLSDmuIXpmaRidWZmXG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSBza2J1ZmZfY2xlYXIoKSB7XG4vLyAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnRlYW1GaWlkcy5sZW5ndGg7IGluZGV4KyspIHtcbi8vICAgICAgICAgICAgIGxldCBmaWlkID0gdGhpcy50ZWFtRmlpZHNbaW5kZXhdO1xuLy8gICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbZmlpZF0uZXBzLmhwIDw9IDApIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2ZpaWRdLnNrYnVmZiA9IHt9O1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgLy9sZXQgc2tidWZmQ29weSA9IGdhbWVNZXRob2Qub2JqQ29weSh0aGlzLnV1aWRzW2ZpaWRdLnNrYnVmZik7XG4vLyAgICAgICAgICAgICB0aGlzLnV1aWRzW2ZpaWRdLnNrYnVmZiA9IHt9O1xuLy8gICAgICAgICAgICAgLy8gbGV0IGtleXMgPSBPYmplY3Qua2V5cyhza2J1ZmZDb3B5KVxuLy8gICAgICAgICAgICAgbGV0IGtleXMgPSB0aGlzLmNoYW5nZVNrQnVmZigxLCBmaWlkLCBudWxsLCAxKTtcbi8vICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwga2V5cy5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgIC8v6K6h566X5bGe5oCnIOi/memHjGlu5rKh5YWz57O7XG4vLyAgICAgICAgICAgICAgICAgLy8gbGV0IHZhbHVlcyA9IE9iamVjdC52YWx1ZXMoc2tidWZmQ29weVtrZXlzW2tdXSlcbi8vICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzID0gdGhpcy5jaGFuZ2VTa0J1ZmYoMSwgZmlpZCwga2V5c1trXSwgMik7XG4vLyAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuemhlbiA+PSB2YWx1ZXNbal0uZXpoZW4pIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25lQnVmZltmaWlkXSA9IDE7XG5cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkodmFsdWVzW2pdLmVwc1tcImlfOV9pZFwiXSkgPT0gZmFsc2UpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChmaWlkLCB2YWx1ZXNbal0uZXBzW1wiaV85X3NraW5cIl0udG9TdHJpbmcoKSwgdmFsdWVzW2pdLmVwc1tcImlfOV9pZFwiXS50b1N0cmluZygpLCBcIlwiLCB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2lpZDogTnVtYmVyKGZpaWQpLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0aWQ6IDEsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy51dWlkc1tmaWlkXS5za2J1ZmZba2V5c1trXV0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tmaWlkXS5za2J1ZmZba2V5c1trXV0gPSBbXTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2ZpaWRdLnNrYnVmZltrZXlzW2tdXS5wdXNoKHZhbHVlc1tqXSk7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgdGhpcy5jaGFuZ2VTa0J1ZmYoMiwgZmlpZCwgbnVsbCwgMSwgdGhpcy51dWlkc1tmaWlkXS5za2J1ZmYpO1xuLy8gICAgICAgICAgICAgaWYgKHRoaXMuc2tidWZmX2dldChmaWlkLCBcImVmZmVjdF9pXzlcIiwgMikgPD0gMCkge1xuLy8gICAgICAgICAgICAgICAgIGxldCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKHRoaXMudXVpZHNbZmlpZF0ucG9kdW4pO1xuLy8gICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgdmFsdWVzLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX3N1Yl9hbGwoZmlpZCwgdmFsdWVzW2tdKTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBpZiAodGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiZWZmZWN0X2lfNFwiLCAyKSA8PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfc3ViX2FsbChmaWlkLCBcImVmZmVjdF9pXzU5XCIpO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog6L6F5Yqp5Ye95pWwIC0g6L6T5Ye6QlVGRlxuLy8gICAgICAqL1xuLy8gICAgIHByaXZhdGUgc2tidWZmX291dGYoKSB7XG4vLyAgICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXModGhpcy5vbmVCdWZmKTtcbi8vICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBrZXlzLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhrZXlzW2tdLCBrZXlzW2tdLCBcImFUeXBlXCIsIFh5cy5BY3Rpb25UeXBlLmJ1ZmYpO1xuLy8gICAgICAgICAgICAgLy8gbGV0IGtleXMyID0gT2JqZWN0LmtleXModGhpcy51dWlkc1trZXlzW2tdXS5za2J1ZmYpXG4vLyAgICAgICAgICAgICBsZXQga2V5czIgPSB0aGlzLmNoYW5nZVNrQnVmZigxLCBrZXlzW2tdLCBudWxsLCAxKTtcbi8vICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwga2V5czIubGVuZ3RoOyBqKyspIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhrZXlzW2tdLCBrZXlzW2tdLCBcImJ1ZmZcIiwgW2tleXMyW2pdLCB0aGlzLnV1aWRzW2tleXNba11dLnNrYnVmZltrZXlzMltqXV0ubGVuZ3RoXSk7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICB9XG5cbi8vICAgICAvKipcbi8vICAgICAgKiDovoXliqnlh73mlbAgLSDmt7vliqDlsZ7mgKflgLxcbi8vICAgICAgKi9cbi8vICAgICBwcml2YXRlIHNrYnVmZl9hZGQoY3M6IHNrYnVmZl9hZGRfY3MpIHtcbi8vICAgICAgICAgbGV0IGVmZl9pXzEyID0gdGhpcy5za2J1ZmZfZ2V0KGNzLmZpaWQsIFwiZWZmZWN0X2lfMTJcIiwgMik7XG4vLyAgICAgICAgIGlmIChlZmZfaV8xMiA+IDApIHtcbi8vICAgICAgICAgICAgIGlmIChbXCJlZmZlY3RfaV8xXCIsIFwiZWZmZWN0X2lfM1wiLCBcImVmZmVjdF9pXzRcIiwgXCJlZmZlY3RfaV81XCIsIFwiZWZmZWN0X2lfNlwiXS5pbmNsdWRlcyhjcy5rZXkpKSB7XG4vLyAgICAgICAgICAgICAgICAgcmV0dXJuO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgaWYgKGNzLmtleS5pbmNsdWRlcyhcImVmZmVjdF9pXzBcIikpIHtcbi8vICAgICAgICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKGNzLmVwcyk7XG4vLyAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBrZXlzLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlYW1zW2NzLmZpaWRdLmVwc1trZXlzW2tdXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoY3MuZXBzW2tleXNba11dIDwgMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG5cbi8vICAgICAgICAgaWYgKGNzLm92ZXJsYXlUeXBlID09IDEpIHtcbi8vICAgICAgICAgICAgIC8vMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICBpZiAodGhpcy51dWlkc1tjcy5maWlkXS5za2J1ZmZbY3Mua2V5XSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tjcy5maWlkXS5za2J1ZmZbY3Mua2V5XSA9IFtdO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNzLmNlbmc7IGluZGV4KyspIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2NzLmZpaWRdLnNrYnVmZltjcy5rZXldLnB1c2goe1xuLy8gICAgICAgICAgICAgICAgICAgICBzemhlbjogY3MubWluWmhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgZXpoZW46IGNzLm1heFpoZW4sIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgIGVwczogY3MuZXBzLCAvL+WxnuaAp+WAvFxuLy8gICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgdGhpcy51dWlkc1tjcy5maWlkXS5za2J1ZmZbY3Mua2V5XSA9IFtdO1xuLy8gICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNzLmNlbmc7IGluZGV4KyspIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2NzLmZpaWRdLnNrYnVmZltjcy5rZXldLnB1c2goe1xuLy8gICAgICAgICAgICAgICAgICAgICBzemhlbjogY3MubWluWmhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgZXpoZW46IGNzLm1heFpoZW4sIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgIGVwczogY3MuZXBzLCAvL+WxnuaAp+WAvFxuLy8gICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHRoaXMuY2hhbmdlU2tCdWZmKDIsIGNzLmZpaWQsIGNzLmtleSwgMSwgdGhpcy51dWlkc1tjcy5maWlkXS5za2J1ZmZbY3Mua2V5XSk7XG4vLyAgICAgICAgIHRoaXMub25lQnVmZltjcy5maWlkXSA9IDE7XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog6L6F5Yqp5Ye95pWwIC0g5L+u5pS55bGe5oCn5YC8XG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSBza2J1ZmZfdXBkYXRlKGlpZDogc3RyaW5nLCBlcHM6IHsgW3A6IHN0cmluZ106IG51bWJlciB9LCB0eXBlOiBudW1iZXIgPSAwKSB7XG4vLyAgICAgICAgIGlmICh0aGlzLnRlYW1zW2lpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgcmV0dXJuO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmICh0eXBlID09PSAxKSB7XG4vLyAgICAgICAgICAgICB0aGlzLnRlYW1zW2lpZF0uZXBzID0gZXBzO1xuLy8gICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhlcHMpO1xuLy8gICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBrZXlzLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy50ZWFtc1tpaWRdLmVwc1trZXlzW2tdXSA9IGVwc1trZXlzW2tdXTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfVxuLy8gICAgIH1cblxuLy8gICAgIC8qKlxuLy8gICAgICAqIOi+heWKqeWHveaVsCAtIOWIoOmZpOWxnuaAp+WAvCAoMeS4qilcbi8vICAgICAgKi9cbi8vICAgICBwcml2YXRlIHNrYnVmZl9zdWIoZmlpZDogc3RyaW5nLCBrZXk6IHN0cmluZykge1xuLy8gICAgICAgICBpZiAodGhpcy51dWlkc1tmaWlkXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICByZXR1cm47XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eSh0aGlzLnV1aWRzW2ZpaWRdLnNrYnVmZltrZXldKSA9PSB0cnVlKSB7XG4vLyAgICAgICAgICAgICByZXR1cm47XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgdGhpcy51dWlkc1tmaWlkXS5za2J1ZmZba2V5XS5zcGxpY2UoMCwgMSk7XG4vLyAgICAgICAgIHRoaXMuY2hhbmdlU2tCdWZmKDIsIGZpaWQsIGtleSwgMSwgdGhpcy51dWlkc1tmaWlkXS5za2J1ZmZba2V5XSk7XG4vLyAgICAgICAgIHRoaXMub25lQnVmZltmaWlkXSA9IDE7XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog6L6F5Yqp5Ye95pWwIC0g5Yig6Zmk5bGe5oCn5YC8ICjmiYDmnIkpXG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSBza2J1ZmZfc3ViX2FsbChmaWlkOiBzdHJpbmcsIGtleTogc3RyaW5nKSB7XG4vLyAgICAgICAgIGlmICh0aGlzLnV1aWRzW2ZpaWRdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgIHJldHVybjtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMudXVpZHNbZmlpZF0uc2tidWZmW2tleV0pID09IHRydWUpIHtcbi8vICAgICAgICAgICAgIHJldHVybjtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICAvL2RlbGV0ZSB0aGlzLnV1aWRzW2ZpaWRdLnNrYnVmZltrZXldO1xuLy8gICAgICAgICB0aGlzLmNoYW5nZVNrQnVmZigzLCBmaWlkLCBrZXkpO1xuLy8gICAgICAgICBpZiAoa2V5ID09IFwiZWZmZWN0X2lfNFwiICYmIHRoaXMudXVpZHNbZmlpZF0uc2tidWZmW1wiZWZmZWN0X2lfNTlcIl0pIHtcbi8vICAgICAgICAgICAgIC8vIOeBq+eEsOa4hemZpOaXtiDlr7nlupTnmoTngavnhLDlop7kvKTkuZ/muIXpmaRcbi8vICAgICAgICAgICAgIC8vZGVsZXRlIHRoaXMudXVpZHNbZmlpZF0uc2tidWZmW1wiZWZmZWN0X2lfNTlcIl1cbi8vICAgICAgICAgICAgIHRoaXMuY2hhbmdlU2tCdWZmKDMsIGZpaWQsIFwiZWZmZWN0X2lfNTlcIik7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgdGhpcy5vbmVCdWZmW2ZpaWRdID0gMTtcbi8vICAgICB9XG5cbi8vICAgICAvKipcbi8vICAgICAgKiDovoXliqnlh73mlbAgLSDmnIDnu4jkvKTlrrPlop7lh49cbi8vICAgICAgKiBAcGFyYW0gaWlkIOaJk+S6ulxuLy8gICAgICAqIEBwYXJhbSBmaWlkIOiiq+aJk+S6ulxuLy8gICAgICAqIEBwYXJhbSBoaXQg6YCg5oiQ55qE5Lyk5a6zXG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSBoaXRfbGFzdChpaWQ6IHN0cmluZywgZmlpZDogc3RyaW5nLCBoaXQ6IG51bWJlciwgaXNmajogbnVtYmVyID0gMCk6IG51bWJlciB7XG4vLyAgICAgICAgIGlmIChoaXQgPD0gMCkge1xuLy8gICAgICAgICAgICAgcmV0dXJuIDA7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgbGV0IGFkZF9wZXI6IG51bWJlciA9IDA7XG4vLyAgICAgICAgIC8v5pyA57uI5Lyk5a6z6ZmN5L2OeHglXG4vLyAgICAgICAgIGxldCBpXzEzX25aaGVuID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaV8xM19uWmhlblwiKTtcbi8vICAgICAgICAgaWYgKHRoaXMuc2tidWZmX2dldChmaWlkLCBcImVmZmVjdF9pXzEzXCIsIDIpID4gMCAmJiB0aGlzLnpoZW4gPj0gaV8xM19uWmhlbikge1xuLy8gICAgICAgICAgICAgYWRkX3BlciArPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJpXzEzXCIpO1xuLy8gICAgICAgICAgICAgbGV0IGNkID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaV8xM19jZFwiKTtcbi8vICAgICAgICAgICAgIGlmIChjZCA+IDApIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl91cGRhdGUoZmlpZCwgeyBpXzEzX25aaGVuOiBjZCAqIDMwICsgdGhpcy56aGVuIH0pO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGhpdCArPSBNYXRoLmZsb29yKChoaXQgKiBhZGRfcGVyKSAvIDEwMDAwKTtcbi8vICAgICAgICAgLy8g6K6h566X5Liq5Lq65oiY5Yqb5beuIOezu+aVsFxuLy8gICAgICAgICBoaXQgPSBNYXRoLmZsb29yKHRoaXMucG93ZXJEaXNwYXJpdHkoaWlkLCBmaWlkKSAqIGhpdCk7XG4vLyAgICAgICAgIGhpdCA9IE1hdGgubWF4KDAsIGhpdCk7XG4vLyAgICAgICAgIGxldCBmX2lfOSA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImlfOVwiKTtcbi8vICAgICAgICAgaWYgKGZfaV85ID4gMCkge1xuLy8gICAgICAgICAgICAgLy/mnInmiqTnm75cbi8vICAgICAgICAgICAgIGxldCBmX2lfNjEgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJpXzYxXCIpIC8gMTAwMDA7XG4vLyAgICAgICAgICAgICBsZXQgaV9pXzgyID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJpXzgyXCIpIC8gMTAwMDA7XG4vLyAgICAgICAgICAgICAvL2xldCBjb3B5ID0gZ2FtZU1ldGhvZC5vYmpDb3B5KHRoaXMudXVpZHNbZmlpZF0uc2tidWZmW1wiZWZmZWN0X2lfOVwiXSk7XG4vLyAgICAgICAgICAgICB0aGlzLnV1aWRzW2ZpaWRdLnNrYnVmZltcImVmZmVjdF9pXzlcIl0gPSBbXTtcbi8vICAgICAgICAgICAgIC8vIGxldCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKGNvcHkpXG4vLyAgICAgICAgICAgICBsZXQgdmFsdWVzID0gdGhpcy5jaGFuZ2VTa0J1ZmYoMSwgZmlpZCwgXCJlZmZlY3RfaV85XCIsIDIpO1xuLy8gICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCB2YWx1ZXMubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICBsZXQgc2tidWZmID0gdmFsdWVzW2tdO1xuLy8gICAgICAgICAgICAgICAgIC8v6K6h566X5bGe5oCnIOi/memHjGlu5rKh5YWz57O7XG4vLyAgICAgICAgICAgICAgICAgbGV0IGlfOV9hZGQgPSBNYXRoLmZsb29yKHNrYnVmZi5lcHNbXCJpXzlcIl0gKiAoZl9pXzYxIC0gaV9pXzgyKSk7XG4vLyAgICAgICAgICAgICAgICAgaWYgKGhpdCA+PSBza2J1ZmYuZXBzW1wiaV85XCJdICsgaV85X2FkZCkge1xuLy8gICAgICAgICAgICAgICAgICAgICBoaXQgLT0gc2tidWZmLmVwc1tcImlfOVwiXSArIGlfOV9hZGQ7XG4vLyAgICAgICAgICAgICAgICAgICAgIHNrYnVmZi5lcHNbXCJpXzlcIl0gPSAwO1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHNrYnVmZi5lcHNbXCJpXzlfaWRcIl0pID09IGZhbHNlKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChmaWlkLCBza2J1ZmYuZXBzW1wiaV85X3NraW5cIl0udG9TdHJpbmcoKSwgc2tidWZmLmVwc1tcImlfOV9pZFwiXS50b1N0cmluZygpLCBcIlwiLCB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9faWlkOiBOdW1iZXIoZmlpZCksXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dGlkOiAxLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcl9kbygxMDUsIHsgZG9faWlkOiBOdW1iZXIoZmlpZCkgfSk7IC8v5oqk5L2T572h5rCU56C056KO5pe26Kem5Y+RXG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMub25lQnVmZltmaWlkXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgc2tidWZmLmVwc1tcImlfOVwiXSAtPSBoaXQgLSBpXzlfYWRkO1xuLy8gICAgICAgICAgICAgICAgICAgICBoaXQgPSAwO1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2ZpaWRdLnNrYnVmZltcImVmZmVjdF9pXzlcIl0ucHVzaChza2J1ZmYpO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBpZiAoaXNmaiA9PT0gMSkge1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhmaWlkLCBmaWlkLCBcImVmZmVjdFwiLCBbXCJpXzlcIiwgc2tidWZmLmVwc1tcImlfOVwiXV0pO1xuLy8gICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgZmlpZCwgXCJlZmZlY3RcIiwgW1wiaV85XCIsIHNrYnVmZi5lcHNbXCJpXzlcIl1dKTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB0aGlzLmNoYW5nZVNrQnVmZigyLCBmaWlkLCBcImVmZmVjdF9pXzlcIiwgMSwgdGhpcy51dWlkc1tmaWlkXS5za2J1ZmZbXCJlZmZlY3RfaV85XCJdKTtcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKGhpdCk7XG4vLyAgICAgfVxuLy8gICAgIC8vIOS4quS6uuaImOWKm+W3rlxuLy8gICAgIHByaXZhdGUgcG93ZXJEaXNwYXJpdHkoaWlkOiBzdHJpbmcsIGZpaWQ6IHN0cmluZywgcG93ZXI/OiBudW1iZXIsIGZQb3dlcj86IG51bWJlcik6IG51bWJlciB7XG4vLyAgICAgICAgIGxldCBwY3QxID0gMTtcbi8vICAgICAgICAgbGV0IHBjdDIgPSAxO1xuLy8gICAgICAgICBsZXQgaWxlbiA9IGlpZC5sZW5ndGg7XG4vLyAgICAgICAgIGxldCBmbGVuID0gZmlpZC5sZW5ndGg7XG4vLyAgICAgICAgIGlmICh0aGlzLmRhbWFnZVtpbGVuXSAmJiB0aGlzLmRhbWFnZVtpbGVuXVtmbGVuXSkge1xuLy8gICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGFtYWdlW2lsZW5dW2ZsZW5dO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmICh0aGlzLmRhbWFnZVtpbGVuXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICB0aGlzLmRhbWFnZVtpbGVuXSA9IHt9O1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmICh0aGlzLmRhbWFnZVtmbGVuXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICB0aGlzLmRhbWFnZVtmbGVuXSA9IHt9O1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHRoaXMuZGFtYWdlW2lsZW5dW2ZsZW5dID0gcGN0MTtcbi8vICAgICAgICAgdGhpcy5kYW1hZ2VbZmxlbl1baWxlbl0gPSBwY3QyO1xuLy8gICAgICAgICBpZiAocG93ZXIgIT0gbnVsbCAmJiBmUG93ZXIgIT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgaWYgKHBvd2VyID09IDAgfHwgZlBvd2VyID09IDApIHtcbi8vICAgICAgICAgICAgICAgICByZXR1cm4gcGN0MTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIC8vIOaImOWKm+W3rlxuLy8gICAgICAgICAgICAgbGV0IHBvd2VyQyA9IE1hdGguYWJzKHBvd2VyIC0gZlBvd2VyKTtcbi8vICAgICAgICAgICAgIC8vIOaImOWKm+avlFxuLy8gICAgICAgICAgICAgbGV0IHBvd2VyQiA9IE1hdGgubWluKHBvd2VyLCBmUG93ZXIpIC8gTWF0aC5tYXgocG93ZXIsIGZQb3dlcik7XG4vLyAgICAgICAgICAgICBsZXQgaW5kZXggPSAxO1xuLy8gICAgICAgICAgICAgd2hpbGUgKGluZGV4ID4gMCkge1xuLy8gICAgICAgICAgICAgICAgIGxldCBkYW1hZ2UgPSBHYW1lY2ZnLnVzZXJEYW1hZ2UuZ2V0SXRlbShpbmRleC50b1N0cmluZygpKTtcbi8vICAgICAgICAgICAgICAgICBpZiAoZGFtYWdlICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZGFtYWdlLnpoYW5saXJhbmdlWzBdIDw9IHBvd2VyQyAmJlxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgKChkYW1hZ2UuemhhbmxpcmFuZ2UubGVuZ3RoID09IDIgJiYgcG93ZXJDIDw9IGRhbWFnZS56aGFubGlyYW5nZVsxXSkgfHwgZGFtYWdlLnpoYW5saXJhbmdlLmxlbmd0aCA9PSAxKSAmJlxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZGFtYWdlLnJhdGlvWzBdIDw9IHBvd2VyQiAmJlxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgcG93ZXJCIDw9IGRhbWFnZS5yYXRpb1sxXVxuLy8gICAgICAgICAgICAgICAgICAgICApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3dlciA+IGZQb3dlcikge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjdDEgKz0gZGFtYWdlLnhpc2h1YTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY3QyIC09IGRhbWFnZS54aXNodWI7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjdDEgLT0gZGFtYWdlLnhpc2h1Yjtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY3QyICs9IGRhbWFnZS54aXNodWE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IC0xO1xuLy8gICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgrKztcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gLTE7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgdGhpcy5kYW1hZ2VbaWxlbl1bZmxlbl0gPSBwY3QxO1xuLy8gICAgICAgICAgICAgdGhpcy5kYW1hZ2VbZmxlbl1baWxlbl0gPSBwY3QyO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHJldHVybiBwY3QxO1xuLy8gICAgIH1cbi8vICAgICAvKipcbi8vICAgICAgKiDmmK/lkKbmmrTlh7tcbi8vICAgICAgKiBAcGFyYW0gaWlkXG4vLyAgICAgICogQHBhcmFtIGZpaWRcbi8vICAgICAgKiDmmrTlh7vnjoc9bWF477yIKOaIkeaWueaatOWHuy3mlYzmlrnmipfmmrTlh7vvvInvvIzmmrTlh7vkv53lupXlj4LmlbApXG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSBpc0Jhb2ppKGlpZDogc3RyaW5nLCBmaWlkOiBzdHJpbmcpOiBudW1iZXIge1xuLy8gICAgICAgICBpZiAodGhpcy50ZWFtc1tpaWRdLnR5cGUgPT0gMykge1xuLy8gICAgICAgICAgICAgcmV0dXJuIDA7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgbGV0IGlzQmo6IG51bWJlciA9IDA7XG4vLyAgICAgICAgIGxldCBlZl9pXzI0ID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJlZmZlY3RfaV8yNFwiLCAyKTtcbi8vICAgICAgICAgaWYgKGVmX2lfMjQgPiAwKSB7XG4vLyAgICAgICAgICAgICAvL+W/heWumuaatOWHu1xuLy8gICAgICAgICAgICAgdGhpcy5za2J1ZmZfc3ViX2FsbChpaWQsIFwiZWZmZWN0X2lfMjRcIik7XG4vLyAgICAgICAgICAgICBpc0JqID0gMTtcbi8vICAgICAgICAgICAgIHJldHVybiBpc0JqO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGxldCBlZl9pXzgwID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJlZmZlY3RfaV84MFwiLCAyKTtcbi8vICAgICAgICAgbGV0IGVmX2lfODBfYnVmZiA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiaV84MF9idWZmXCIpO1xuLy8gICAgICAgICBpZiAoZWZfaV84MCA+IDAgJiYgdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiZWZmZWN0X2lfXCIgKyBlZl9pXzgwX2J1ZmYsIDIpID4gMCkge1xuLy8gICAgICAgICAgICAgLy/lv4XlrprmmrTlh7tcbi8vICAgICAgICAgICAgIHRoaXMuc2tidWZmX3N1Yl9hbGwoaWlkLCBcImVmZmVjdF9pXzgwXCIpO1xuLy8gICAgICAgICAgICAgaXNCaiA9IDE7XG4vLyAgICAgICAgICAgICByZXR1cm4gaXNCajtcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIGxldCBpX2Jhb2ppOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImJhb2ppXCIpO1xuLy8gICAgICAgICBsZXQgZl9oc2Jhb2ppOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJoc2Jhb2ppXCIpO1xuLy8gICAgICAgICBsZXQgYmRiYW9qaTogbnVtYmVyID0gMDsgLy/kv53lupXmmrTlh7tcbi8vICAgICAgICAgbGV0IGNmZyA9IEdhbWVjZmcudXNlckVwLmdldEl0ZW0oXCJiYW9qaVwiKTtcbi8vICAgICAgICAgaWYgKGNmZyAhPSBudWxsKSB7XG4vLyAgICAgICAgICAgICBiZGJhb2ppID0gY2ZnLmluaXRFcDtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBpZiAodGhpcy5zZWVkUmFuZC5yYW5kKDEsIDEwMDAwKSA8PSBNYXRoLm1heChpX2Jhb2ppIC0gZl9oc2Jhb2ppLCBiZGJhb2ppKSkge1xuLy8gICAgICAgICAgICAgaXNCaiA9IDE7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgcmV0dXJuIGlzQmo7XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog5piv5ZCm6L+e5Ye7IOWPquaJk+S4gOasoVxuLy8gICAgICAqIEBwYXJhbSBpaWRcbi8vICAgICAgKiBAcGFyYW0gZmlpZFxuLy8gICAgICAqL1xuLy8gICAgIHByaXZhdGUgaXNMaWFuamkoaWlkOiBzdHJpbmcsIGZpaWQ6IHN0cmluZyk6IG51bWJlciB7XG4vLyAgICAgICAgIGlmICh0aGlzLmp1ZUZpaWRIcChpaWQpIDw9IDAgfHwgdGhpcy5qdWVGaWlkSHAoZmlpZCkgPD0gMCkge1xuLy8gICAgICAgICAgICAgcmV0dXJuIDA7IC8v5YW25Lit5LiA5Liq5q275LqGXG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgaWYgKHRoaXMudGVhbXNbaWlkXS50eXBlID09IDMpIHtcbi8vICAgICAgICAgICAgIHJldHVybiAwO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGxldCBpc0xqOiBudW1iZXIgPSAwO1xuLy8gICAgICAgICBsZXQgaV9saWFuamk6IG51bWJlciA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwibGlhbmppXCIpO1xuLy8gICAgICAgICBsZXQgZl9oc2xpYW5qaTogbnVtYmVyID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHNsaWFuamlcIik7XG4vLyAgICAgICAgIGxldCBiZGxpYW5qaTogbnVtYmVyID0gMDsgLy/kv53lupXmmrTlh7tcbi8vICAgICAgICAgbGV0IGNmZyA9IEdhbWVjZmcudXNlckVwLmdldEl0ZW0oXCJsaWFuamlcIik7XG4vLyAgICAgICAgIGlmIChjZmcgIT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgYmRsaWFuamkgPSBjZmcuaW5pdEVwO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmICh0aGlzLnNlZWRSYW5kLnJhbmQoMSwgMTAwMDApIDw9IGlfbGlhbmppIC0gZl9oc2xpYW5qaSkge1xuLy8gICAgICAgICAgICAgaXNMaiA9IDE7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgcmV0dXJuIGlzTGo7XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog5piv5ZCm5qC85oyhXG4vLyAgICAgICog5pWM5pa55qC85oyh546HPW1heO+8iCjmlYzmlrnmoLzmjKEt5oiR5pa55oqX5qC85oyh77yJ77yM5qC85oyh5L+d5bqV5Y+C5pWwKVxuLy8gICAgICAqIEBwYXJhbSBpaWRcbi8vICAgICAgKiBAcGFyYW0gZmlpZFxuLy8gICAgICAqICAxLuaVjOS6uuWmguaenOWkhOS6juaZleecqeOAgeWGsOWGu+S4re+8jOWImeebtOaOpeS4jeinpuWPkeagvOaMoe+8jOi3s+i/h+agvOaMoeeOh+iuoeeul+i/h+eoi1xuLy8gICAgICAqICAyLuWmguaenOaVjOS6uuWkhOS6jumdnuaZleecqeOAgeWGsOWGu+S4re+8jOWImeaMieagvOaMoeeOh+WIpOaWrVxuLy8gICAgICAqL1xuLy8gICAgIHByaXZhdGUgaXNHZWRhbmcoaWlkOiBzdHJpbmcsIGZpaWQ6IHN0cmluZyk6IG51bWJlciB7XG4vLyAgICAgICAgIGlmICh0aGlzLnRlYW1zW2lpZF0udHlwZSA9PSAzKSB7XG4vLyAgICAgICAgICAgICByZXR1cm4gMDtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBsZXQgaXNHZDogbnVtYmVyID0gMDtcbi8vICAgICAgICAgbGV0IGZfaV8zOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJlZmZlY3RfaV8zXCIsIDIpO1xuLy8gICAgICAgICBpZiAoZl9pXzMgPiAwKSB7XG4vLyAgICAgICAgICAgICByZXR1cm4gaXNHZDtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBsZXQgZl9pXzU6IG51bWJlciA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImVmZmVjdF9pXzVcIiwgMik7XG4vLyAgICAgICAgIGlmIChmX2lfNSA+IDApIHtcbi8vICAgICAgICAgICAgIHJldHVybiBpc0dkO1xuLy8gICAgICAgICB9XG5cbi8vICAgICAgICAgbGV0IGZfYmxvY2s6IG51bWJlciA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImJsb2NrXCIpO1xuLy8gICAgICAgICBsZXQgaV9oc2Jsb2NrOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImhzYmxvY2tcIik7XG5cbi8vICAgICAgICAgbGV0IGJkR2VkYW5nOiBudW1iZXIgPSAwOyAvL+S/neW6leagvOaMoVxuLy8gICAgICAgICBsZXQgY2ZnID0gR2FtZWNmZy51c2VyRXAuZ2V0SXRlbShcImJsb2NrXCIpO1xuLy8gICAgICAgICBpZiAoY2ZnICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgIGJkR2VkYW5nID0gY2ZnLmluaXRFcDtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBpZiAodGhpcy5zZWVkUmFuZC5yYW5kKDEsIDEwMDAwKSA8PSBNYXRoLm1heChmX2Jsb2NrIC0gaV9oc2Jsb2NrLCBiZEdlZGFuZykpIHtcbi8vICAgICAgICAgICAgIGlzR2QgPSAxO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHJldHVybiBpc0dkO1xuLy8gICAgIH1cblxuLy8gICAgIC8qKlxuLy8gICAgICAqIOaYr+WQpuWPjeWHu1xuLy8gICAgICAqIEBwYXJhbSBpaWRcbi8vICAgICAgKiBAcGFyYW0gZmlpZFxuLy8gICAgICAqIOaVjOaWueWPjeWHu+eOhz1tYXjvvIgo5pWM5pa55Y+N5Ye7LeaIkeaWueaKl+WPjeWHu++8ie+8jOWPjeWHu+S/neW6leWPguaVsClcbi8vICAgICAgKiAgMS7op6bniq/lj43lh7vml7bmlLvlh7vkuI3og73ooqvmlYzkurrmoLzmjKHvvIzlv4Xpobvnmb7liIbnmb7lkb3kuK3vvIzvvIjkuZ/lsLHmmK/or7TkuI3kvJrooqvmlYzkurrmoLzmjKHvvIlcbi8vICAgICAgKiAgMi7op6bniq/lj43lh7vml7bmlLvlh7vkuI3kvJrnu6fnu63liKTmlq3mmK/lkKbop6blj5HmmrTlh7vvvIjkuZ/lsLHmmK/kuI3kvJrop6blj5HmmrTlh7vvvIlcbi8vICAgICAgKiAgMy7op6blj5Hlj43lh7vml7bkuI3kvJrop6blj5HnnKnmmZXjgIHov57lh7vjgIHmuoXlsIRcbi8vICAgICAgKiAgNC7lj43lh7vlkI7kuI3og73lho3op6blj5Hlj43lh7tcbi8vICAgICAgKi9cbi8vICAgICBwcml2YXRlIGlzRmFuamkoaWlkOiBzdHJpbmcsIGZpaWQ6IHN0cmluZyk6IG51bWJlciB7XG4vLyAgICAgICAgIGlmICh0aGlzLmp1ZUZpaWRIcChpaWQpIDw9IDAgfHwgdGhpcy5qdWVGaWlkSHAoZmlpZCkgPD0gMCkge1xuLy8gICAgICAgICAgICAgcmV0dXJuIDA7IC8v5YW25Lit5LiA5Liq5q275LqGXG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgaWYgKHRoaXMudGVhbXNbaWlkXS50eXBlID09IDMgfHwgdGhpcy50ZWFtc1tmaWlkXS50eXBlID09IDMpIHtcbi8vICAgICAgICAgICAgIHJldHVybiAwO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGxldCBpc2ZqOiBudW1iZXIgPSAwO1xuLy8gICAgICAgICBsZXQgaV9mYW5qaTogbnVtYmVyID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJmYW5qaVwiKTtcbi8vICAgICAgICAgbGV0IGZfaHNmYW5qaTogbnVtYmVyID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHNmYW5qaVwiKTtcbi8vICAgICAgICAgbGV0IGJkZmFuamk6IG51bWJlciA9IDA7IC8v5L+d5bqV5Y+N5Ye7XG4vLyAgICAgICAgIGxldCBjZmcgPSBHYW1lY2ZnLnVzZXJFcC5nZXRJdGVtKFwiZmFuamlcIik7XG4vLyAgICAgICAgIGlmIChjZmcgIT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgYmRmYW5qaSA9IGNmZy5pbml0RXA7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgaWYgKHRoaXMuc2VlZFJhbmQucmFuZCgxLCAxMDAwMCkgPD0gTWF0aC5tYXgoaV9mYW5qaSAtIGZfaHNmYW5qaSwgYmRmYW5qaSkpIHtcbi8vICAgICAgICAgICAgIGlzZmogPSAxO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHJldHVybiBpc2ZqO1xuLy8gICAgIH1cblxuLy8gICAgIC8qKlxuLy8gICAgICAqIOWinuWHj+iTneadoVxuLy8gICAgICAqIEBwYXJhbSBmaWlkXG4vLyAgICAgICogQHBhcmFtIG51bVxuLy8gICAgICAqIEByZXR1cm5zXG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSBhZGRfbXAoZmlpZDogc3RyaW5nLCBudW06IG51bWJlciwgd3o6IDAgfCAxIHwgMikge1xuLy8gICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICByZXR1cm47XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgaWYgKE51bWJlcihmaWlkKSAlIDEwMCAhPSAwKSB7XG4vLyAgICAgICAgICAgICByZXR1cm47XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgaWYgKHRoaXMubXBmaWlkc1tmaWlkXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICB0aGlzLm1wZmlpZHNbZmlpZF0gPSBbMCwgMF07XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgaWYgKHd6ID09IDAgfHwgd3ogPT0gMSkge1xuLy8gICAgICAgICAgICAgaWYgKHRoaXMubXBmaWlkc1tmaWlkXVt3el0gPT0gMSkge1xuLy8gICAgICAgICAgICAgICAgIHJldHVybjtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIHRoaXMubXBmaWlkc1tmaWlkXVt3el0gPSAxO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHRoaXMudGVhbXNbZmlpZF0uZXBzW1wibXBcIl0gPSBNYXRoLm1heCh0aGlzLnRlYW1zW2ZpaWRdLmVwc1tcIm1wXCJdLCAwKTtcbi8vICAgICAgICAgdGhpcy50ZWFtc1tmaWlkXS5lcHNbXCJtcFwiXSArPSBNYXRoLmZsb29yKG51bSk7XG4vLyAgICAgICAgIHRoaXMudGVhbXNbZmlpZF0uZXBzW1wibXBcIl0gPSBNYXRoLm1pbih0aGlzLnRlYW1zW2ZpaWRdLmVwc1tcIm1wXCJdLCAxMDAwMCk7XG4vLyAgICAgICAgIHRoaXMuYWRkT25lQXRrKGZpaWQsIGZpaWQsIFwiYVR5cGVcIiwgWHlzLkFjdGlvblR5cGUuZWZmZWN0KTtcbi8vICAgICAgICAgdGhpcy5hZGRPbmVBdGsoZmlpZCwgZmlpZCwgXCJlZmZlY3RcIiwgW1wibXBcIiwgbnVtXSk7XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog5re75Yqg6L2u6K+i5omn6KGM6ISa5pysXG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSB0aW1lcl9hZGQoYWRkVGltZXI6IHRpbWVyX2FkZF9jcykge1xuLy8gICAgICAgICBpZiAodGhpcy51dWlkc1thZGRUaW1lci5paWRdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgIHJldHVybjsgLy/lhbzlrrnkuI3lrZjlnKjnmoTkurpcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIGxldCBjcyA9IGdhbWVNZXRob2Qub2JqQ29weShhZGRUaW1lci5jcyk7XG4vLyAgICAgICAgIGlmIChjc1tcInRpbWVySWRcIl0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgY3NbXCJ0aW1lcklkXCJdID0gdGhpcy50aW1lcklkO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmIChhZGRUaW1lci50eXBlWzBdID09IDYwMikge1xuLy8gICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbYWRkVGltZXIuaWlkXS50aW1lclthZGRUaW1lci5rZXldID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2FkZFRpbWVyLmlpZF0udGltZXJbYWRkVGltZXIua2V5XSA9IHt9O1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgaWYgKGFkZFRpbWVyLm92ZXJsYXlUeXBlID09IDIpIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2FkZFRpbWVyLmlpZF0udGltZXJbYWRkVGltZXIua2V5XSA9IHt9OyAvL+aNouaOieWOn+adpeeahFxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgYWRkVGltZXIua2V5ID0gYWRkVGltZXIua2V5ICsgXCJfXCIgKyA2MDI7XG4vLyAgICAgICAgICAgICBpZiAodGhpcy51dWlkc1thZGRUaW1lci5paWRdLnRpbWVyW2FkZFRpbWVyLmtleV0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbYWRkVGltZXIuaWlkXS50aW1lclthZGRUaW1lci5rZXldID0ge307XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBpZiAoYWRkVGltZXIub3ZlcmxheVR5cGUgPT0gMikge1xuLy8gICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbYWRkVGltZXIuaWlkXS50aW1lclthZGRUaW1lci5rZXldID0ge307IC8v5o2i5o6J5Y6f5p2l55qEXG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB0aGlzLnV1aWRzW2FkZFRpbWVyLmlpZF0udGltZXJbYWRkVGltZXIua2V5XVtjc1tcInRpbWVySWRcIl0udG9TdHJpbmcoKV0gPSB7XG4vLyAgICAgICAgICAgICAgICAgZmlpZHM6IGFkZFRpbWVyLmZpaWRzLCAvL+aJp+ihjOinpuWPkeeCuVxuLy8gICAgICAgICAgICAgICAgIHR5cGU6IGFkZFRpbWVyLnR5cGUsIC8v5omn6KGM6Kem5Y+R54K5XG4vLyAgICAgICAgICAgICAgICAgZnVuYzogYWRkVGltZXIuZnVuYywgLy/miafooYznmoTlh73mlbDlkI1cbi8vICAgICAgICAgICAgICAgICBzemhlbjogdGhpcy56aGVuLCAvL+inpuWPkeeahOW4p1xuLy8gICAgICAgICAgICAgICAgIGx6aGVuOiBhZGRUaW1lci5semhlbiwgLy/ova7or6LmiafooYzml7bpl7Rcbi8vICAgICAgICAgICAgICAgICBlemhlbjogYWRkVGltZXIuZXpoZW4sIC8v57uT5p2f5pe26Ze0XG4vLyAgICAgICAgICAgICAgICAgc2tpZDogYWRkVGltZXIuc2tpZCwgLy/mioDog71JRFxuLy8gICAgICAgICAgICAgICAgIGFlaWQ6IGFkZFRpbWVyLmFlaWQsIC8v5pWI5p6cSUR86KGM5Li6SURcbi8vICAgICAgICAgICAgICAgICBjczogY3MsXG4vLyAgICAgICAgICAgICB9O1xuLy8gICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbYWRkVGltZXIuaWlkXS50aW1lclthZGRUaW1lci5rZXldID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2FkZFRpbWVyLmlpZF0udGltZXJbYWRkVGltZXIua2V5XSA9IHt9O1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgaWYgKGFkZFRpbWVyLm92ZXJsYXlUeXBlID09IDIpIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2FkZFRpbWVyLmlpZF0udGltZXJbYWRkVGltZXIua2V5XSA9IHt9OyAvL+aNouaOieWOn+adpeeahFxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgdGhpcy51dWlkc1thZGRUaW1lci5paWRdLnRpbWVyW2FkZFRpbWVyLmtleV1bY3NbXCJ0aW1lcklkXCJdLnRvU3RyaW5nKCldID0ge1xuLy8gICAgICAgICAgICAgICAgIGZpaWRzOiBhZGRUaW1lci5maWlkcywgLy/miafooYzop6blj5Hngrlcbi8vICAgICAgICAgICAgICAgICB0eXBlOiBhZGRUaW1lci50eXBlLCAvL+aJp+ihjOinpuWPkeeCuVxuLy8gICAgICAgICAgICAgICAgIGZ1bmM6IGFkZFRpbWVyLmZ1bmMsIC8v5omn6KGM55qE5Ye95pWw5ZCNXG4vLyAgICAgICAgICAgICAgICAgc3poZW46IHRoaXMuemhlbiwgLy/op6blj5HnmoTluKdcbi8vICAgICAgICAgICAgICAgICBsemhlbjogYWRkVGltZXIubHpoZW4sIC8v6L2u6K+i5omn6KGM5pe26Ze0XG4vLyAgICAgICAgICAgICAgICAgZXpoZW46IGFkZFRpbWVyLmV6aGVuLCAvL+e7k+adn+aXtumXtFxuLy8gICAgICAgICAgICAgICAgIHNraWQ6IGFkZFRpbWVyLnNraWQsIC8v5oqA6IO9SURcbi8vICAgICAgICAgICAgICAgICBhZWlkOiBhZGRUaW1lci5hZWlkLCAvL+aViOaenElEfOihjOS4uklEXG4vLyAgICAgICAgICAgICAgICAgY3M6IGNzLFxuLy8gICAgICAgICAgICAgfTtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICB0aGlzLmNoYW5nZVRpbWVyKDIsIGFkZFRpbWVyLmlpZCwgYWRkVGltZXIua2V5LCAxLCB0aGlzLnV1aWRzW2FkZFRpbWVyLmlpZF0udGltZXJbYWRkVGltZXIua2V5XSk7XG4vLyAgICAgICAgIHRoaXMudGltZXJJZCArPSAxO1xuLy8gICAgIH1cblxuLy8gICAgIC8qKlxuLy8gICAgICAqIOWIoOmZpOi9ruivouaJp+ihjOiEmuacrFxuLy8gICAgICAqL1xuLy8gICAgIHByaXZhdGUgdGltZXJfc3ViKGZpaWQ6IHN0cmluZywga2V5OiBzdHJpbmcpIHtcbi8vICAgICAgICAgaWYgKHRoaXMudXVpZHNbZmlpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgcmV0dXJuO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHRoaXMuY2hhbmdlVGltZXIoMywgZmlpZCwga2V5KTtcbi8vICAgICAgICAgLy9kZWxldGUgdGhpcy51dWlkc1tmaWlkXS50aW1lcltrZXldO1xuLy8gICAgIH1cblxuLy8gICAgIC8qKlxuLy8gICAgICAqIOWIoOmZpOi9ruivouaJp+ihjOiEmuacrCAtIOWIoOmZpOafkOS4quS6uueahO+8iOWFs+S6juS7lueahOWumuaXtuWZqO+8iVxuLy8gICAgICAqL1xuLy8gICAgIHByaXZhdGUgdGltZXJfc3ViX2J5X2ZpaWQoZmlpZDogc3RyaW5nKSB7XG4vLyAgICAgICAgIGlmICh0aGlzLnV1aWRzW2ZpaWRdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgIHJldHVybjtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy50ZWFtRmlpZHMubGVuZ3RoOyBpbmRleCsrKSB7XG4vLyAgICAgICAgICAgICBsZXQgaWlkID0gdGhpcy50ZWFtRmlpZHNbaW5kZXhdO1xuLy8gICAgICAgICAgICAgLy8gbGV0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnV1aWRzW2lpZF0udGltZXIpO1xuLy8gICAgICAgICAgICAgbGV0IGtleXMgPSB0aGlzLmNoYW5nZVRpbWVyKDEsIGlpZCwgbnVsbCwgMSk7XG4vLyAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGtleXMubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAvLyBsZXQga2V5czIgPSBPYmplY3Qua2V5cyh0aGlzLnV1aWRzW2lpZF0udGltZXJba2V5c1trXV0pXG4vLyAgICAgICAgICAgICAgICAgbGV0IGtleXMyID0gdGhpcy5jaGFuZ2VUaW1lcigxLCBpaWQsIGtleXNba10sIDEpO1xuLy8gICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwga2V5czIubGVuZ3RoOyBqKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS50aW1lcltrZXlzW2tdXVtrZXlzMltqXV0gJiYgdGhpcy51dWlkc1tpaWRdLnRpbWVyW2tleXNba11dW2tleXMyW2pdXS5maWlkcykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvcHlGaWlkczogc3RyaW5nW10gPSBnYW1lTWV0aG9kLm9iakNvcHkodGhpcy51dWlkc1tpaWRdLnRpbWVyW2tleXNba11dW2tleXMyW2pdXS5maWlkcyk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0udGltZXJba2V5c1trXV1ba2V5czJbal1dLmZpaWRzID0gW107XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzID0gY29weUZpaWRzO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgPCB2YWx1ZXMubGVuZ3RoOyBsKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzW2xdICE9IGZpaWQpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLnRpbWVyW2tleXNba11dW2tleXMyW2pdXS5maWlkcy5wdXNoKHZhbHVlc1tsXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS50aW1lcltrZXlzW2tdXVtrZXlzMltqXV0uZmlpZHMubGVuZ3RoID09IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy51dWlkc1tpaWRdLnRpbWVyW2tleXNba11dW2tleXMyW2pdXTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfVxuLy8gICAgICAgICB0aGlzLmNoYW5nZVRpbWVyKDIsIG51bGwsIG51bGwsIDEpO1xuLy8gICAgIH1cblxuLy8gICAgIC8qKlxuLy8gICAgICAqIOaJp+ihjOi9ruivouaJp+ihjOiEmuacrFxuLy8gICAgICAqIEBwYXJhbSBmaWlkIOaJp+ihjOS6ulxuLy8gICAgICAqIEBwYXJhbSB0eXBlIOaJp+ihjOeCuVxuLy8gICAgICAqL1xuLy8gICAgIHByaXZhdGUgdGltZXJfZG8oX3R5cGU6IG51bWJlciwgY3M6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fSkge1xuLy8gICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudGVhbUZpaWRzLmxlbmd0aDsgaSsrKSB7XG4vLyAgICAgICAgICAgICBpZiAodGhpcy51dWlkc1t0aGlzLnRlYW1GaWlkc1tpXV0uZHpoZW4gPiAwICYmIHRoaXMudXVpZHNbdGhpcy50ZWFtRmlpZHNbaV1dLmR6aGVuIDwgdGhpcy56aGVuKSB7XG4vLyAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5q275LqGIOS4jeW6lOivpeWcqOinpuWPkeS6hlxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgLy8gbGV0IGtleXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXModGhpcy51dWlkc1t0aGlzLnRlYW1GaWlkc1tpXV0udGltZXIpO1xuLy8gICAgICAgICAgICAgbGV0IGtleXM6IHN0cmluZ1tdID0gdGhpcy5jaGFuZ2VUaW1lcigxLCB0aGlzLnRlYW1GaWlkc1tpXSwgbnVsbCwgMSk7XG4vLyAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGtleXMubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAvLyBsZXQgdGltZXJzID0gT2JqZWN0LnZhbHVlcyh0aGlzLnV1aWRzW3RoaXMudGVhbUZpaWRzW2ldXS50aW1lcltrZXlzW2tdXSk7XG4vLyAgICAgICAgICAgICAgICAgbGV0IHRpbWVycyA9IHRoaXMuY2hhbmdlVGltZXIoMSwgdGhpcy50ZWFtRmlpZHNbaV0sIGtleXNba10sIDIpO1xuLy8gICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGltZXJzLmxlbmd0aDsgaisrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChfdHlwZSAhPSAwICYmICF0aW1lcnNbal0udHlwZS5pbmNsdWRlcyhfdHlwZSkpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+S4jeaYr+i/meS4quaJp+ihjOexu+Wei+eahFxuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnpoZW4gPCB0aW1lcnNbal0uc3poZW4gfHwgdGhpcy56aGVuID4gdGltZXJzW2pdLmV6aGVuKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy/mnKrlvIDlp4vmiJbogIXov4fmnJ/kuoZcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy56aGVuIDwgdGltZXJzW2pdLmx6aGVuIHx8ICh0aGlzLnpoZW4gLSB0aW1lcnNbal0uc3poZW4pICUgdGltZXJzW2pdLmx6aGVuID4gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5rKh5pyJ5Yiw5b2T5YmN5bin6Kem5Y+RXG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVyc1tqXS5mdW5jID09IFwic2tfZWZmZWN0XCIpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjc1tcImRvX2lpZFwiXSAhPSBOdW1iZXIodGhpcy50ZWFtRmlpZHNbaV0pKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhc3M6IGJvb2xlYW4gPSBmYWxzZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzcyA9PSBmYWxzZSAmJiBfdHlwZSA9PSA0MDQgJiYgY3NbXCJkb19paWRcIl0udG9TdHJpbmcoKS5sZW5ndGggIT0gdGhpcy50ZWFtRmlpZHNbaV0ubGVuZ3RoKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSB0cnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzcyA9PSBmYWxzZSAmJiBfdHlwZSA9PSAxMDYgJiYgdGltZXJzW2pdLmZpaWRzLmluY2x1ZGVzKGNzW1wiZG9faWlkXCJdLnRvU3RyaW5nKCkpKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSB0cnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzcyA9PSBmYWxzZSAmJiBfdHlwZSA9PSAyMDYgJiYgY3NbXCJkb19paWRcIl0udG9TdHJpbmcoKS5sZW5ndGggPT0gdGhpcy50ZWFtRmlpZHNbaV0ubGVuZ3RoKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSB0cnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzcyA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vbmVGaWlkc1t0aGlzLnRlYW1GaWlkc1tpXV0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25lRmlpZHNbdGhpcy50ZWFtRmlpZHNbaV1dID0ge307XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aW1lcl9maWlkczogc3RyaW5nW10gPSBbXTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaWlkcyA9IHRpbWVyc1tqXS5maWlkcztcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGwgPSAwOyBsIDwgZmlpZHMubGVuZ3RoOyBsKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy51dWlkc1tmaWlkc1tsXV09PW51bGwgKXtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJmaWlkcz09PTpcIixmaWlkcylcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnV1aWRzW2ZpaWRzW2xdXS5kemhlbiA+IDAgJiYgdGhpcy51dWlkc1tmaWlkc1tsXV0uZHpoZW4gPCB0aGlzLnpoZW4pIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5q275LqGIOS4jeW6lOivpeWcqOinpuWPkeS6hlxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVyX2ZpaWRzLnB1c2goZmlpZHNbbF0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVyX2ZpaWRzLmxlbmd0aCA8PSAwICYmIHRpbWVyc1tqXS5maWlkcy5sZW5ndGggIT0gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOacrOi6q+ayoeacieebruagh+eahOWumuaXtuWZqCDkuI3opoHot7Pov4dcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdHlwZSA9PSA2MDIpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzW2tdID0ga2V5c1trXS5zbGljZSgwLCBrZXlzW2tdLmxlbmd0aCAtIDQpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbmVGaWlkc1t0aGlzLnRlYW1GaWlkc1tpXV1ba2V5c1trXV0gPSB0aW1lcl9maWlkcztcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjc0NvcHkgPSBnYW1lTWV0aG9kLm9iakNvcHkodGltZXJzW2pdLmNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNzQ29weSA9IE9iamVjdC5hc3NpZ24oY3NDb3B5LCBjcyk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3R5cGUgPT09IDYwMSB8fCBfdHlwZSA9PT0gNjAyKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NDb3B5W1wiaXNUaW1lclwiXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdCh0aGlzLnRlYW1GaWlkc1tpXSwgdGltZXJzW2pdLnNraWQsIHRpbWVyc1tqXS5hZWlkLCBrZXlzW2tdLCBjc0NvcHkpO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog6Kej6ZSB6ZqQ6JePXG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSBqaWVzdW9faGlkZShpaWQ6IHN0cmluZykge1xuLy8gICAgICAgICBsZXQgbWluTHY6IG51bWJlciA9IDk5OTtcbi8vICAgICAgICAgbGV0IG1pbmZpaWQ6IHN0cmluZyA9IFwiXCI7XG4vLyAgICAgICAgIGxldCBpaWRMaXN0OiBzdHJpbmdbXSA9IFtdXG4vLyAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnRlYW1GaWlkcy5sZW5ndGg7IGluZGV4KyspIHtcbi8vICAgICAgICAgICAgIGxldCBmaWlkID0gdGhpcy50ZWFtRmlpZHNbaW5kZXhdO1xuLy8gICAgICAgICAgICAgaWYgKGZpaWQubGVuZ3RoICE9IGlpZC5sZW5ndGgpIHtcbi8vICAgICAgICAgICAgICAgICBpaWRMaXN0LnB1c2goZmlpZCk7XG4vLyAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXS5pc0hpZGUgPT0gMCkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbZmlpZF0uaXNIaWRlIDwgbWluTHYpIHtcbi8vICAgICAgICAgICAgICAgICBpZiAobWluZmlpZCAhPSBcIlwiKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMudGVhbXNbZmlpZF0uaXNIaWRlID0gbWluTHY7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIG1pbkx2ID0gdGhpcy50ZWFtc1tmaWlkXS5pc0hpZGU7XG4vLyAgICAgICAgICAgICAgICAgbWluZmlpZCA9IGZpaWQ7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgaWYgKG1pbmZpaWQgIT0gXCJcIikge1xuLy8gICAgICAgICAgICAgLy8g5riF56m65LiK5LiA5Y+qYm9zc+eahOW8guW4uOeKtuaAgVxuLy8gICAgICAgICAgICAgZm9yIChsZXQgaT0wO2k8aWlkTGlzdC5sZW5ndGg7aSsrKXtcbi8vICAgICAgICAgICAgICAgICBmb3IgKGxldCBrPTA7azx0aGlzLmJhdGVCdWZmLmxlbmd0aDtrKyspe1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9zdWJfYWxsKGlpZExpc3RbaV0sdGhpcy5iYXRlQnVmZltrXSlcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB0aGlzLnRlYW1zW21pbmZpaWRdLmlzSGlkZSA9IDA7XG4vLyAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhtaW5maWlkLCBtaW5maWlkLCBcImFUeXBlXCIsIFh5cy5BY3Rpb25UeXBlLmhpZGUpO1xuLy8gICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsobWluZmlpZCwgbWluZmlpZCwgXCJlZmZlY3RcIiwgW1wiaXNIaWRlXCIsIDBdKTtcbi8vICAgICAgICAgfVxuLy8gICAgIH1cbi8vIH1cbiJdfQ==
|