laya.debugtool.js 333 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816
  1. (function(window,document,Laya){
  2. var __un=Laya.un,__uns=Laya.uns,__static=Laya.static,__class=Laya.class,__getset=Laya.getset,__newvec=Laya.__newvec;
  3. var Browser=laya.utils.Browser,CacheStyle=laya.display.css.CacheStyle,Context=laya.resource.Context;
  4. var Event=laya.events.Event,EventDispatcher=laya.events.EventDispatcher,GrahamScan=laya.maths.GrahamScan;
  5. var Graphics=laya.display.Graphics,HTMLCanvas=laya.resource.HTMLCanvas,Handler=laya.utils.Handler,HitArea=laya.utils.HitArea;
  6. var Input=laya.display.Input,Loader=laya.net.Loader,LoaderManager=laya.net.LoaderManager,LocalStorage=laya.net.LocalStorage;
  7. var MathUtil=laya.maths.MathUtil,Matrix=laya.maths.Matrix,Node=laya.display.Node,Point=laya.maths.Point,Pool=laya.utils.Pool;
  8. var Rectangle=laya.maths.Rectangle,Render=laya.renders.Render,RenderSprite=laya.renders.RenderSprite,Resource=laya.resource.Resource;
  9. var Sprite=laya.display.Sprite,Stage=laya.display.Stage,Stat=laya.utils.Stat,Text=laya.display.Text,Texture=laya.resource.Texture;
  10. var Timer=laya.utils.Timer,Utils=laya.utils.Utils;
  11. /**
  12. *
  13. *@author ww
  14. *@version 1.0
  15. *
  16. *@created 2015-11-9 下午3:26:01
  17. */
  18. //class laya.debug.tools.LayoutTools
  19. var LayoutTools=(function(){
  20. function LayoutTools(){}
  21. __class(LayoutTools,'laya.debug.tools.LayoutTools');
  22. LayoutTools.layoutToXCount=function(items,xCount,dx,dY,sx,sy){
  23. (xCount===void 0)&& (xCount=1);
  24. (dx===void 0)&& (dx=0);
  25. (dY===void 0)&& (dY=0);
  26. (sx===void 0)&& (sx=0);
  27. (sy===void 0)&& (sy=0);
  28. var tX=NaN,tY=NaN;
  29. var tItem;
  30. var i=0,len=0;
  31. var tCount=0;
  32. var maxHeight=0;
  33. tCount=0;
  34. maxHeight=0;
  35. tX=sx;
  36. tY=sy;
  37. len=items.length;
  38. for (i=0;i < len;i++){
  39. tItem=items[i];
  40. tItem.x=tX;
  41. tItem.y=tY;
  42. if (tItem.height > maxHeight){
  43. maxHeight=tItem.height;
  44. }
  45. tCount++;
  46. if (tCount >=xCount){
  47. tCount=tCount % xCount;
  48. tItem.y+=maxHeight+dY;
  49. maxHeight=0;
  50. }else{
  51. tX+=tItem.width+dx;
  52. }
  53. }
  54. }
  55. LayoutTools.layoutToWidth=function(items,width,dX,dY,sx,sy){
  56. var tX=NaN,tY=NaN;
  57. var tItem;
  58. var i=0,len=0;
  59. tX=sx;
  60. tY=sy;
  61. len=items.length;
  62. for(i=0;i<len;i++){
  63. tItem=items[i];
  64. if(tX+tItem.width+dX>width){
  65. tX=sx;
  66. tY+=dY+tItem.height;
  67. }else{
  68. }
  69. tItem.x=tX;
  70. tItem.y=tY;
  71. tX+=dX+tItem.width;
  72. }
  73. }
  74. return LayoutTools;
  75. })()
  76. /**
  77. *...
  78. *@author ww
  79. */
  80. //class laya.debug.tools.MouseEventAnalyser
  81. var MouseEventAnalyser=(function(){
  82. function MouseEventAnalyser(){}
  83. __class(MouseEventAnalyser,'laya.debug.tools.MouseEventAnalyser');
  84. MouseEventAnalyser.analyseNode=function(node){
  85. DebugTool.showDisBound(node,true);
  86. var _node;
  87. _node=node;
  88. ObjectTools.clearObj(MouseEventAnalyser.infoO);
  89. ObjectTools.clearObj(MouseEventAnalyser.nodeO);
  90. ObjectTools.clearObj(MouseEventAnalyser.hitO);
  91. var nodeList;
  92. nodeList=[];
  93. while (node){
  94. IDTools.idObj(node);
  95. MouseEventAnalyser.nodeO[IDTools.getObjID(node)]=node;
  96. nodeList.push(node);
  97. node=node.parent;
  98. }
  99. MouseEventAnalyser.check(Laya.stage,Laya.stage.mouseX,Laya.stage.mouseY,null);
  100. var canStr;
  101. if (MouseEventAnalyser.hitO[IDTools.getObjID(_node)]){
  102. console.log("can hit");
  103. canStr="can hit";
  104. }
  105. else{
  106. console.log("can't hit");
  107. canStr="can't hit";
  108. };
  109. var i=0,len=0;
  110. nodeList=nodeList.reverse();
  111. len=nodeList.length;
  112. var rstTxts;
  113. rstTxts=["[分析对象]:"+ClassTool.getNodeClassAndName(_node)+":"+canStr];
  114. for (i=0;i < len;i++){
  115. node=nodeList[i];
  116. if (MouseEventAnalyser.hitO[IDTools.getObjID(node)]){
  117. console.log("can hit:",ClassTool.getNodeClassAndName(node));
  118. console.log("原因:",MouseEventAnalyser.infoO[IDTools.getObjID(node)]);
  119. rstTxts.push("can hit:"+" "+ClassTool.getNodeClassAndName(node));
  120. rstTxts.push("原因:"+" "+MouseEventAnalyser.infoO[IDTools.getObjID(node)]);
  121. }
  122. else{
  123. console.log("can't hit:"+ClassTool.getNodeClassAndName(node));
  124. console.log("原因:",MouseEventAnalyser.infoO[IDTools.getObjID(node)] ? MouseEventAnalyser.infoO[IDTools.getObjID(node)] :"鼠标事件在父级已停止派发");
  125. rstTxts.push("can't hit:"+" "+ClassTool.getNodeClassAndName(node));
  126. rstTxts.push("原因:"+" "+(MouseEventAnalyser.infoO[IDTools.getObjID(node)] ? MouseEventAnalyser.infoO[IDTools.getObjID(node)] :"鼠标事件在父级已停止派发"));
  127. }
  128. };
  129. var rstStr;
  130. rstStr=rstTxts.join("\n");
  131. }
  132. MouseEventAnalyser.check=function(sp,mouseX,mouseY,callBack){
  133. IDTools.idObj(sp);
  134. var isInAnlyseChain=false;
  135. isInAnlyseChain=MouseEventAnalyser.nodeO[IDTools.getObjID(sp)];
  136. MouseEventAnalyser._point.setTo(mouseX,mouseY);
  137. sp.fromParentPoint(MouseEventAnalyser._point);
  138. mouseX=MouseEventAnalyser._point.x;
  139. mouseY=MouseEventAnalyser._point.y;
  140. var scrollRect=sp.scrollRect;
  141. if (scrollRect){
  142. MouseEventAnalyser._rect.setTo(scrollRect.x,scrollRect.y,scrollRect.width,scrollRect.height);
  143. var isHit=MouseEventAnalyser._rect.contains(mouseX,mouseY);
  144. if (!isHit){
  145. if (isInAnlyseChain){
  146. MouseEventAnalyser.infoO[IDTools.getObjID(sp)]="scrollRect没有包含鼠标"+MouseEventAnalyser._rect.toString()+":"+mouseX+","+mouseY;
  147. }
  148. return false;
  149. }
  150. };
  151. var i=0,len=0;
  152. var cList;
  153. cList=sp._children;
  154. len=cList.length;
  155. var child;
  156. var childInChain;
  157. childInChain=null;
  158. for (i=0;i < len;i++){
  159. child=cList[i];
  160. IDTools.idObj(child);
  161. if (MouseEventAnalyser.nodeO[IDTools.getObjID(child)]){
  162. childInChain=child;
  163. break ;
  164. }
  165. };
  166. var coverByOthers=false;
  167. coverByOthers=childInChain ? true :false;
  168. var flag=false;
  169. if (sp.hitTestPrior && !sp.mouseThrough && !MouseEventAnalyser.hitTest(sp,mouseX,mouseY)){
  170. MouseEventAnalyser.infoO[IDTools.getObjID(sp)]="hitTestPrior=true,宽高区域不包含鼠标:"+":"+mouseX+","+mouseY+" size:"+sp.width+","+sp.height;
  171. return false;
  172. }
  173. for (i=sp._children.length-1;i >-1;i--){
  174. child=sp._children[i];
  175. if (child==childInChain){
  176. if (!childInChain.mouseEnabled){
  177. MouseEventAnalyser.infoO[IDTools.getObjID(childInChain)]="mouseEnabled=false";
  178. }
  179. if (!childInChain.visible){
  180. MouseEventAnalyser.infoO[IDTools.getObjID(childInChain)]="visible=false";
  181. }
  182. coverByOthers=false;
  183. }
  184. if (child.mouseEnabled && child.visible){
  185. flag=MouseEventAnalyser.check(child,mouseX ,mouseY,callBack);
  186. if (flag){
  187. MouseEventAnalyser.hitO[IDTools.getObjID(sp)]=true;
  188. MouseEventAnalyser.infoO[IDTools.getObjID(sp)]="子对象被击中";
  189. if (child==childInChain){
  190. MouseEventAnalyser.infoO[IDTools.getObjID(sp)]="子对象被击中,"+"击中对象在分析链中";
  191. }
  192. else{
  193. MouseEventAnalyser.infoO[IDTools.getObjID(sp)]="子对象被击中,"+"击中对象不在分析链中";
  194. if (coverByOthers){
  195. MouseEventAnalyser.infoO[IDTools.getObjID(childInChain)]="被兄弟节点挡住,兄弟节点信息:"+ClassTool.getNodeClassAndName(child)+","+child.getBounds().toString();
  196. DebugTool.showDisBound(child,false,"#ffff00");
  197. }
  198. }
  199. return true;
  200. }
  201. else{
  202. if (child==childInChain){
  203. coverByOthers=false;
  204. }
  205. }
  206. }
  207. };
  208. var mHitRect=new Rectangle();
  209. var graphicHit=false;
  210. graphicHit=sp.getGraphicBounds().contains(mouseX,mouseY);
  211. if (sp.width > 0 && sp.height > 0){
  212. var hitRect=MouseEventAnalyser._rect;
  213. if (!sp.mouseThrough){
  214. if (sp.hitArea)
  215. hitRect=sp.hitArea;
  216. else
  217. hitRect.setTo(0,0,sp.width,sp.height);
  218. mHitRect.copyFrom(hitRect);
  219. isHit=hitRect.contains(mouseX,mouseY);
  220. }
  221. else{
  222. isHit=graphicHit;
  223. mHitRect.copyFrom(sp.getGraphicBounds());
  224. }
  225. if (isHit){
  226. MouseEventAnalyser.hitO[IDTools.getObjID(sp)]=true;
  227. }
  228. }else{
  229. }
  230. if (!isHit){
  231. if (graphicHit){
  232. MouseEventAnalyser.infoO[IDTools.getObjID(sp)]="子对象未包含鼠标,实际绘图区域包含鼠标,设置的宽高区域不包含鼠标:"+":"+mouseX+","+mouseY+" hitRec:"+mHitRect.toString()+" graphicBounds:"+sp.getGraphicBounds().toString()+",设置mouseThrough=true或将宽高设置到实际绘图区域可解决问题";
  233. }else{
  234. MouseEventAnalyser.infoO[IDTools.getObjID(sp)]="子对象未包含鼠标,实际绘图区域不包含鼠标,设置的宽高区域不包含鼠标:"+":"+mouseX+","+mouseY+" hitRec:"+mHitRect.toString()+" graphicBounds:"+sp.getGraphicBounds().toString();
  235. }
  236. }
  237. else{
  238. MouseEventAnalyser.infoO[IDTools.getObjID(sp)]="自身区域被击中";
  239. }
  240. return isHit;
  241. }
  242. MouseEventAnalyser.hitTest=function(sp,mouseX,mouseY){
  243. var isHit=false;
  244. if ((sp.hitArea instanceof laya.utils.HitArea )){
  245. return sp.hitArea.isHit(mouseX,mouseY);
  246. }
  247. if (sp.width > 0 && sp.height > 0 || sp.mouseThrough || sp.hitArea){
  248. var hitRect=MouseEventAnalyser._rect;
  249. if (!sp.mouseThrough){
  250. if (sp.hitArea)hitRect=sp.hitArea;
  251. else hitRect.setTo(0,0,sp.width,sp.height);
  252. isHit=hitRect.contains(mouseX,mouseY);
  253. }else {
  254. isHit=sp.getGraphicBounds().contains(mouseX,mouseY);
  255. }
  256. }
  257. return isHit;
  258. }
  259. MouseEventAnalyser.infoO={};
  260. MouseEventAnalyser.nodeO={};
  261. MouseEventAnalyser.hitO={};
  262. __static(MouseEventAnalyser,
  263. ['_matrix',function(){return this._matrix=new Matrix();},'_point',function(){return this._point=new Point();},'_rect',function(){return this._rect=new Rectangle();}
  264. ]);
  265. return MouseEventAnalyser;
  266. })()
  267. /**
  268. *XML转Object类
  269. *@author ww
  270. *
  271. */
  272. //class laya.debug.tools.XML2ObjectNodejs
  273. var XML2ObjectNodejs=(function(){
  274. function XML2ObjectNodejs(){}
  275. __class(XML2ObjectNodejs,'laya.debug.tools.XML2ObjectNodejs');
  276. __getset(1,XML2ObjectNodejs,'arrays',function(){
  277. if(!XML2ObjectNodejs._arrays){
  278. XML2ObjectNodejs._arrays=[];
  279. }
  280. return XML2ObjectNodejs._arrays;
  281. },function(a){
  282. XML2ObjectNodejs._arrays=a;
  283. });
  284. XML2ObjectNodejs.parse=function(node,isFirst){
  285. (isFirst===void 0)&& (isFirst=true);
  286. var obj={};
  287. if(isFirst)
  288. obj.Name=node.localName;
  289. var numOfChilds=node[XML2ObjectNodejs.ChildrenSign]?node[XML2ObjectNodejs.ChildrenSign].length:0;
  290. var childs=[];
  291. var children={};
  292. obj.c=children;
  293. obj.cList=childs;
  294. for(var i=0;i<numOfChilds;i++){
  295. var childNode=node[XML2ObjectNodejs.ChildrenSign][i];
  296. var childNodeName=childNode.localName;
  297. var value;
  298. var numOfAttributes=0
  299. if (!childNodeName)continue ;
  300. value=XML2ObjectNodejs.parse(childNode,true);
  301. childs.push(value);
  302. if(children[childNodeName]){
  303. if(XML2ObjectNodejs.getTypeof(children[childNodeName])=="array"){
  304. children[childNodeName].push(value);
  305. }else {
  306. children[childNodeName]=[children[childNodeName],value];
  307. }
  308. }else if(XML2ObjectNodejs.isArray(childNodeName)){
  309. children[childNodeName]=[value];
  310. }else {
  311. children[childNodeName]=value;
  312. }
  313. }
  314. numOfAttributes=0;
  315. if(node.attributes){
  316. numOfAttributes=node.attributes.length;
  317. var prop={};
  318. obj.p=prop;
  319. for(i=0;i<numOfAttributes;i++){
  320. prop[node.attributes[i].name.toString()]=String(node.attributes[i].nodeValue);
  321. }
  322. }
  323. if(numOfChilds==0){
  324. if(numOfAttributes==0){
  325. }else {}
  326. }
  327. return obj;
  328. }
  329. XML2ObjectNodejs.getArr=function(v){
  330. if(!v)return [];
  331. if(XML2ObjectNodejs.getTypeof(v)=="array")return v;
  332. return [v];
  333. }
  334. XML2ObjectNodejs.isArray=function(nodeName){
  335. var numOfArrays=XML2ObjectNodejs._arrays ? XML2ObjectNodejs._arrays.length :0;
  336. for(var i=0;i<numOfArrays;i++){
  337. if(nodeName==XML2ObjectNodejs._arrays[i]){
  338. return true;
  339. }
  340. }
  341. return false;
  342. }
  343. XML2ObjectNodejs.getTypeof=function(o){
  344. if(typeof(o)=="object"){
  345. if(o.length==null){
  346. return "object";
  347. }else if(typeof(o.length)=="number"){
  348. return "array";
  349. }else {
  350. return "object";
  351. }
  352. }else {
  353. return typeof(o);
  354. }
  355. }
  356. XML2ObjectNodejs._arrays=null;
  357. XML2ObjectNodejs.ChildrenSign="childNodes";
  358. return XML2ObjectNodejs;
  359. })()
  360. /**
  361. *...
  362. *@author ww
  363. */
  364. //class laya.debug.DebugPanel
  365. var DebugPanel=(function(){
  366. function DebugPanel(){
  367. this.tShowObj=null;
  368. this.preValueO={};
  369. this.div=null;
  370. this.debug_view=null;
  371. this.height=300;
  372. this.width=600;
  373. this.clickedHandler=null;
  374. this.dragArea=10;
  375. this.fromMe=false;
  376. this._treeDataList=null;
  377. this._init();
  378. }
  379. __class(DebugPanel,'laya.debug.DebugPanel');
  380. var __proto=DebugPanel.prototype;
  381. __proto.removeNoDisplayKeys=function(arr){
  382. var i=0;
  383. for (i=arr.length-1;i >=0;i--){
  384. if (DebugPanel.noDisplayKeys[arr[i]]){
  385. arr.splice(i,1);
  386. }
  387. }
  388. }
  389. __proto.updateShowKeys=function(){
  390. DebugPanel.tObjKeys.length=0;
  391. if (!this.tShowObj)
  392. return;
  393. DebugPanel.tObjKeys=ClassTool.getObjectDisplayAbleKeys(this.tShowObj,DebugPanel.tObjKeys);
  394. if (this.tShowObj==Laya.stage){
  395. this.removeNoDisplayKeys(DebugPanel.tObjKeys);
  396. }
  397. DebugPanel.tObjKeys.sort(MathUtil.sortSmallFirst);
  398. }
  399. __proto._init=function(){
  400. var _$this=this;
  401. this.div=Browser.document.createElement('div');
  402. Browser.document.body.appendChild(this.div);
  403. this.clickedHandler=new Handler(this,this.onClickSelected);
  404. this.debug_view=Browser.window.layaair_debug_view;
  405. this.debug_view.initLayaAirDebugView(this.div);
  406. this.debug_view.tree.attachEvent("onSelect",function(id){
  407. var dataO;
  408. dataO=_$this.getDataByID(id,_$this._treeDataList[0]);
  409. if (dataO.target){
  410. DebugTool.showDisBound(dataO.target);
  411. _$this.showTargetInfo(dataO.target);
  412. }
  413. });
  414. this.debug_view.setValueChangeHandler(function(data,new_value){
  415. _$this.onValueChange(data,new_value);
  416. });
  417. this.debug_view.onRefresh(function(){
  418. DebugPanel.I.setRoot(Laya.stage);
  419. });
  420. this.debug_view.onInspectElement(function(){
  421. ClickSelectTool.I.beginClickSelect(_$this.clickedHandler);
  422. });
  423. this.debug_view.onLogInfo(function(){
  424. console.log(_$this.tShowObj);
  425. });
  426. this.debug_view.onPrintEnabledNodeChain(function(){
  427. DebugTool.traceDisMouseEnable(_$this.tShowObj);
  428. });
  429. this.debug_view.onPrintSizeChain(function(){
  430. DebugTool.traceDisSizeChain(_$this.tShowObj);
  431. });
  432. this.debug_view.onToggleVisibility(function(selectd){
  433. if (_$this.tShowObj){
  434. _$this.tShowObj.visible=_$this.debug_view.getVisibility();
  435. }
  436. });
  437. this.debug_view.onToggleDebugBorder(function(selectd){
  438. if (!_$this.tShowObj)
  439. return;
  440. SpriteRenderHook.showDisplayBorder(_$this.tShowObj,_$this.debug_view.getShowDebugBorder());
  441. });
  442. this.debug_view.onToggleShowCurrentCache(function(selectd){
  443. CacheAnalyser.showRecacheSprite=_$this.debug_view.getShowCurrentCache();
  444. });
  445. this.debug_view.onToggleShowAllCache(function(selectd){
  446. CacheAnalyser.showCacheSprite=_$this.debug_view.getShowAllCache();
  447. });
  448. this.debug_view.onToggleShowAtlas(function(selectd){
  449. console.log("toggle show atlas:",_$this.debug_view.getShowAtlas());
  450. if (_$this.debug_view.getShowAtlas()){
  451. AtlasTools.getInstance().start();
  452. }
  453. else {
  454. AtlasTools.getInstance().end();
  455. }
  456. });
  457. JSTools.showToBody(this.div,0,0);
  458. this.initNewDivs();
  459. this.initDragWork();
  460. this.initTreeWidthDrag();
  461. Laya.stage.on(/*laya.events.Event.RESIZE*/"resize",this,this.adptPos);
  462. this.adptPos();
  463. }
  464. __proto.initNewDivs=function(){
  465. var _$this=this;
  466. var parentNode;
  467. parentNode=Browser.document.getElementById("show_current_cache_control").parentNode;
  468. var switchNode;
  469. switchNode=Browser.createElement("input");
  470. switchNode.type="checkbox";
  471. parentNode.appendChild(switchNode);
  472. parentNode.append("右侧");
  473. function onSwitchChange (e){
  474. if (e.target.checked){
  475. DebugPanel.sideType="right";
  476. }else{
  477. DebugPanel.sideType="bottom";
  478. }
  479. _$this.adptPos();
  480. }
  481. switchNode.addEventListener("change",onSwitchChange);
  482. }
  483. __proto.initTreeWidthDrag=function(){
  484. var _$this=this;
  485. var leftDiv;
  486. var rightDiv;
  487. leftDiv=Browser.document.getElementById("tree_container");
  488. var parentNode;
  489. parentNode=leftDiv.parentNode;
  490. rightDiv=parentNode.children[1];
  491. var isMouseDown=false;
  492. var preX=NaN;
  493. var preY=NaN;
  494. function onDivMouseMove (e){
  495. var abs=NaN;
  496. abs=Math.abs(DebugPanel.getOffset(e,"X")-leftDiv.clientWidth);
  497. if (abs < _$this.dragArea){
  498. _$this.div.style.cursor="e-resize";
  499. }else{
  500. _$this.div.style.cursor="auto";
  501. }
  502. }
  503. function onDivMouseDown (e){
  504. var abs=NaN;
  505. abs=Math.abs(DebugPanel.getOffset(e,"X")-leftDiv.clientWidth);
  506. if (abs < _$this.dragArea){
  507. _$this.div.style.cursor="e-resize";
  508. isMouseDown=true;
  509. }else{
  510. isMouseDown=false;
  511. return;
  512. }
  513. e.stopPropagation();
  514. }
  515. function onBodyMouseMove (e){
  516. if (!isMouseDown)
  517. return;
  518. leftDiv.style.width=DebugPanel.getOffset(e,"X")+"px";
  519. e.stopPropagation();
  520. }
  521. function onDivMouseUp (e){
  522. if (!isMouseDown)
  523. return;
  524. isMouseDown=false;
  525. e.stopPropagation();
  526. }
  527. parentNode.addEventListener("mousedown",onDivMouseDown,true)
  528. parentNode.addEventListener("mousemove",onDivMouseMove,true)
  529. Browser.document.body.addEventListener("mousemove",onBodyMouseMove)
  530. Browser.document.body.addEventListener("mouseup",onDivMouseUp)
  531. }
  532. __proto.initDragWork=function(){
  533. var _$this=this;
  534. var isMouseDown=false;
  535. var preX=NaN;
  536. var preY=NaN;
  537. function onDivMouseMove (e){
  538. if (DebugPanel.sideType=="bottom"){
  539. if (DebugPanel.getOffset(e,"Y")< _$this.dragArea){
  540. _$this.div.style.cursor="n-resize";
  541. }
  542. else {
  543. _$this.div.style.cursor="auto";
  544. }
  545. }
  546. else {
  547. if (DebugPanel.getOffset(e,"X")< _$this.dragArea){
  548. _$this.div.style.cursor="e-resize";
  549. }
  550. else {
  551. _$this.div.style.cursor="auto";
  552. }
  553. }
  554. }
  555. function onDivMouseDown (e){
  556. if (DebugPanel.sideType=="bottom"){
  557. if (DebugPanel.getOffset(e,"Y")> _$this.dragArea)
  558. return;
  559. }else{
  560. if (DebugPanel.getOffset(e,"X")> _$this.dragArea)
  561. return;
  562. }
  563. isMouseDown=true;
  564. preX=e.pageX;
  565. preY=e.pageY;
  566. e.stopPropagation();
  567. }
  568. function onBodyMouseMove (e){
  569. if (!isMouseDown)
  570. return;
  571. var curX=NaN;
  572. var curY=NaN;
  573. var dX=NaN;
  574. var dY=NaN;
  575. curX=e.pageX;
  576. curY=e.pageY;
  577. dX=curX-preX;
  578. dY=curY-preY;
  579. if (DebugPanel.sideType=="bottom"){
  580. _$this.height-=dY;
  581. }else{
  582. _$this.width-=dX;
  583. }
  584. _$this.adptPos();
  585. preX=curX;
  586. preY=curY;
  587. e.stopPropagation();
  588. }
  589. function onDivMouseUp (e){
  590. if (!isMouseDown)
  591. return;
  592. isMouseDown=false;
  593. e.stopPropagation();
  594. }
  595. this.div.addEventListener("mousedown",onDivMouseDown,true)
  596. this.div.addEventListener("mousemove",onDivMouseMove,true)
  597. Browser.document.body.addEventListener("mousemove",onBodyMouseMove)
  598. Browser.document.body.addEventListener("mouseup",onDivMouseUp)
  599. }
  600. __proto.onClickSelected=function(target){
  601. var dataO;
  602. if (!this._treeDataList)
  603. return;
  604. this.debug_view.tree.selectItem(IDTools.getObjID(target));
  605. this.debug_view.bounceUpInspectButton();
  606. }
  607. __proto.updateLoop=function(){
  608. if (this.tShowObj){
  609. this.showTargetInfo(this.tShowObj);
  610. }
  611. }
  612. __proto.onSelectItem=function(obj){
  613. var tTarget;
  614. tTarget=obj.target;
  615. this.showTargetInfo(tTarget);
  616. }
  617. __proto.onValueChange=function(obj,newValue){
  618. if (obj["type"]=="number"){
  619. newValue=DebugPanel.mParseFloat(newValue);
  620. }
  621. if (obj["type"]=="boolean"){
  622. newValue=newValue.toString()=="true";
  623. }
  624. if (this.tShowObj){
  625. var key;
  626. key=obj["key"];
  627. this.preValueO[key]=this.tShowObj[key]=newValue;
  628. }
  629. }
  630. __proto.showTargetInfo=function(tTarget){
  631. if (!tTarget)
  632. return;
  633. this.debug_view.setVisibility(tTarget.visible);
  634. this.debug_view.setShowDebugBorder(SpriteRenderHook.isDisplayShowBorder(tTarget));
  635. var i=0,len=0;
  636. len=DebugPanel.tObjKeys.length;
  637. var key;
  638. if (this.tShowObj==tTarget){
  639. for (i=0;i < len;i++){
  640. key=DebugPanel.tObjKeys[i];
  641. if (this.preValueO[key] !=tTarget[key]){
  642. this.debug_view.changeValueByLabel(key,tTarget[key]);
  643. }
  644. }
  645. }
  646. else {
  647. this.tShowObj=tTarget;
  648. this.updateShowKeys();
  649. var dataList;
  650. dataList=DebugPanel.getObjectData(tTarget);
  651. this.debug_view.setContents(dataList);
  652. }
  653. for (i=0;i < len;i++){
  654. key=DebugPanel.tObjKeys[i];
  655. this.preValueO[key]=tTarget[key];
  656. }
  657. }
  658. __proto.adptPos=function(){
  659. if (this.fromMe)
  660. return;
  661. this.fromMe=true;
  662. if (DebugPanel.sideType=="bottom"){
  663. JSTools.setPos(this.div,0,Browser.clientHeight-this.height);
  664. this.debug_view.resize(Browser.clientWidth,this.height);
  665. if (!DebugPanel.overlay){
  666. Laya.stage.setScreenSize(Browser.clientWidth *Browser.pixelRatio,(Browser.clientHeight-this.height)*Browser.pixelRatio);
  667. }
  668. }
  669. else {
  670. JSTools.setPos(this.div,Browser.clientWidth-this.width,0);
  671. this.debug_view.resize(this.width,Browser.clientHeight);
  672. if (!DebugPanel.overlay){
  673. Laya.stage.setScreenSize((Browser.clientWidth-this.width)*Browser.pixelRatio,Browser.clientHeight *Browser.pixelRatio);
  674. }
  675. }
  676. this.fromMe=false;
  677. }
  678. __proto.setRoot=function(sprite){
  679. var mtreeo;
  680. mtreeo=DebugPanel.getSpriteTreeArr(sprite);
  681. this._treeDataList=[mtreeo];
  682. var wraped;
  683. wraped={};
  684. wraped.id=0;
  685. wraped.item=[mtreeo];
  686. this.debug_view.setTree(wraped);
  687. Laya.timer.loop(500,this,this.updateLoop);
  688. }
  689. __proto.getDataByID=function(targetID,nodeO){
  690. if (!nodeO)
  691. return null;
  692. if (targetID==nodeO.id)
  693. return nodeO;
  694. var childs;
  695. childs=nodeO["item"];
  696. if (!childs)
  697. return null;
  698. var i=0,len=0;
  699. len=childs.length;
  700. var tRst;
  701. for (i=0;i < len;i++){
  702. tRst=this.getDataByID(targetID,childs[i]);
  703. if (tRst)
  704. return tRst;
  705. }
  706. return null;
  707. }
  708. __proto.getDataByTarget=function(target,nodeO){
  709. if (!nodeO)
  710. return null;
  711. if (target==nodeO.target)
  712. return nodeO;
  713. var childs;
  714. childs=nodeO["item"];
  715. if (!childs)
  716. return null;
  717. var i=0,len=0;
  718. len=childs.length;
  719. var tRst;
  720. for (i=0;i < len;i++){
  721. tRst=this.getDataByTarget(target,childs[i]);
  722. if (tRst)
  723. return tRst;
  724. }
  725. return null;
  726. }
  727. DebugPanel.enable=function(underGame,bgColor){
  728. (underGame===void 0)&& (underGame=true);
  729. (bgColor===void 0)&& (bgColor="#ffffff");
  730. if (!DebugPanel._enable && !DebugPanel.I){
  731. DebugPanel._enable=true;
  732. DebugPanel.overlay=!underGame;
  733. DivScripts.init();
  734. DebugTool.initBasicFunctions();
  735. RenderSpriteHook.init();
  736. SpriteRenderHook.init();
  737. DebugPanel.I=new DebugPanel();
  738. DebugPanel.I.setRoot(Laya.stage);
  739. CacheAnalyser.showRecacheSprite=false;
  740. if (bgColor){
  741. DebugPanel.I.div.style.background=bgColor;
  742. }
  743. }
  744. }
  745. DebugPanel.getSpriteTreeArr=function(sprite){
  746. var rst;
  747. rst={};
  748. rst["text"]=""+ClassTool.getNodeClassAndName(sprite);
  749. rst.target=sprite;
  750. IDTools.idObj(sprite);
  751. rst.id=IDTools.getObjID(sprite);
  752. var childs;
  753. childs=sprite._children;
  754. var i=0,len=0;
  755. len=childs.length;
  756. var tchild;
  757. var childsList;
  758. childsList=[];
  759. rst["item"]=childsList;
  760. for (i=0;i < len;i++){
  761. childsList.push(DebugPanel.getSpriteTreeArr(childs[i]));
  762. }
  763. return rst;
  764. }
  765. DebugPanel.getObjectData=function(data){
  766. var dataList;
  767. var tData;
  768. var key;
  769. var tValue;
  770. var tType;
  771. dataList=[];
  772. var keys;
  773. keys=DebugPanel.tObjKeys;
  774. var i=0,len=0;
  775. len=keys.length;
  776. for (i=0;i < len;i++){
  777. key=keys[i];
  778. tValue=data[key];
  779. tType=typeof(tValue);
  780. if (key.charAt(0)=="_")
  781. continue ;
  782. if (DebugPanel.displayTypes[tType]){
  783. tData={};
  784. tData["key"]=key;
  785. tData["value"]=tValue;
  786. tData["type"]=tType;
  787. dataList.push(tData);
  788. }
  789. }
  790. return dataList;
  791. }
  792. DebugPanel.getOffset=function(e,sign){
  793. var target;
  794. target=e.target;
  795. var cTarget;
  796. cTarget=e.currentTarget;
  797. var kSign;
  798. if (sign=="X"){
  799. kSign="offsetLeft";
  800. }else{
  801. kSign="offsetTop";
  802. };
  803. var value=NaN;
  804. value=e["offset"+sign];
  805. while (target&&target !=cTarget){
  806. value+=target[kSign];
  807. target=target.offsetParent;
  808. }
  809. return value;
  810. }
  811. DebugPanel.mParseFloat=function(v){
  812. var rst=NaN;
  813. rst=parseFloat(v);
  814. if (isNaN(rst))
  815. return 0;
  816. return rst;
  817. }
  818. DebugPanel.I=null;
  819. DebugPanel.overlay=false;
  820. DebugPanel._enable=false;
  821. DebugPanel.ChildrenSign="item";
  822. DebugPanel.LabelSign="text";
  823. DebugPanel.tObjKeys=[];
  824. DebugPanel.Bottom="bottom";
  825. DebugPanel.Right="right";
  826. DebugPanel.sideType="bottom";
  827. __static(DebugPanel,
  828. ['displayTypes',function(){return this.displayTypes={"boolean":true,"number":true,"string":true};},'displayKeys',function(){return this.displayKeys=[["x","number"],["y","number"],["width","number"],["width","number"],["width","number"],["width","number"],["width","number"],["width","number"],["width","number"],["width","number"],["width","number"],];},'noDisplayKeys',function(){return this.noDisplayKeys={"desginWidth":true,"desginHeight":true};}
  829. ]);
  830. return DebugPanel;
  831. })()
  832. /**
  833. *<p> <code>Byte</code> 类提供用于优化读取、写入以及处理二进制数据的方法和属性。</p>
  834. *<p> <code>Byte</code> 类适用于需要在字节层访问数据的高级开发人员。</p>
  835. */
  836. //class laya.debug.tools.ByteEx
  837. var ByteEx=(function(){
  838. function ByteEx(data){
  839. /**@private 是否为小端数据。*/
  840. this._xd_=true;
  841. /**@private */
  842. this._allocated_=8;
  843. /**@private 原始数据。*/
  844. //this._d_=null;
  845. /**@private DataView*/
  846. //this._u8d_=null;
  847. /**@private */
  848. this._pos_=0;
  849. /**@private */
  850. this._length=0;
  851. if (data){
  852. this._u8d_=new Uint8Array(data);
  853. this._d_=new DataView(this._u8d_.buffer);
  854. this._length=this._d_.byteLength;
  855. }else {
  856. this._resizeBuffer(this._allocated_);
  857. }
  858. }
  859. __class(ByteEx,'laya.debug.tools.ByteEx');
  860. var __proto=ByteEx.prototype;
  861. /**@private */
  862. __proto._resizeBuffer=function(len){
  863. try {
  864. var newByteView=new Uint8Array(len);
  865. if (this._u8d_ !=null){
  866. if (this._u8d_.length <=len)newByteView.set(this._u8d_);
  867. else newByteView.set(this._u8d_.subarray(0,len));
  868. }
  869. this._u8d_=newByteView;
  870. this._d_=new DataView(newByteView.buffer);
  871. }catch (err){
  872. throw "Invalid typed array length:"+len;
  873. }
  874. }
  875. /**
  876. *@private
  877. *<p>常用于解析固定格式的字节流。</p>
  878. *<p>先从字节流的当前字节偏移位置处读取一个 <code>Uint16</code> 值,然后以此值为长度,读取此长度的字符串。</p>
  879. *@return 读取的字符串。
  880. */
  881. __proto.getString=function(){
  882. return this.readString();
  883. }
  884. /**
  885. *<p>常用于解析固定格式的字节流。</p>
  886. *<p>先从字节流的当前字节偏移位置处读取一个 <code>Uint16</code> 值,然后以此值为长度,读取此长度的字符串。</p>
  887. *@return 读取的字符串。
  888. */
  889. __proto.readString=function(){
  890. return this._rUTF(this.getUint16());
  891. }
  892. /**
  893. *@private
  894. *<p>从字节流中 <code>start</code> 参数指定的位置开始,读取 <code>len</code> 参数指定的字节数的数据,用于创建一个 <code>Float32Array</code> 对象并返回此对象。</p>
  895. *<p><b>注意:</b>返回的 Float32Array 对象,在 JavaScript 环境下,是原生的 HTML5 Float32Array 对象,对此对象的读取操作都是基于运行此程序的当前主机字节序,此顺序可能与实际数据的字节序不同,如果使用此对象进行读取,需要用户知晓实际数据的字节序和当前主机字节序,如果相同,可正常读取,否则需要用户对实际数据(Float32Array.buffer)包装一层 DataView ,使用 DataView 对象可按照指定的字节序进行读取。</p>
  896. *@param start 开始位置。
  897. *@param len 需要读取的字节长度。如果要读取的长度超过可读取范围,则只返回可读范围内的值。
  898. *@return 读取的 Float32Array 对象。
  899. */
  900. __proto.getFloat32Array=function(start,len){
  901. return this.readFloat32Array(start,len);
  902. }
  903. /**
  904. *从字节流中 <code>start</code> 参数指定的位置开始,读取 <code>len</code> 参数指定的字节数的数据,用于创建一个 <code>Float32Array</code> 对象并返回此对象。
  905. *@param start 开始位置。
  906. *@param len 需要读取的字节长度。如果要读取的长度超过可读取范围,则只返回可读范围内的值。
  907. *@return 读取的 Float32Array 对象。
  908. */
  909. __proto.readFloat32Array=function(start,len){
  910. var end=start+len;
  911. end=(end > this._length)? this._length :end;
  912. var v=new Float32Array(this._d_.buffer.slice(start,end));
  913. this._pos_=end;
  914. return v;
  915. }
  916. /**
  917. *@private
  918. *从字节流中 <code>start</code> 参数指定的位置开始,读取 <code>len</code> 参数指定的字节数的数据,用于创建一个 <code>Uint8Array</code> 对象并返回此对象。
  919. *@param start 开始位置。
  920. *@param len 需要读取的字节长度。如果要读取的长度超过可读取范围,则只返回可读范围内的值。
  921. *@return 读取的 Uint8Array 对象。
  922. */
  923. __proto.getUint8Array=function(start,len){
  924. return this.readUint8Array(start,len);
  925. }
  926. /**
  927. *从字节流中 <code>start</code> 参数指定的位置开始,读取 <code>len</code> 参数指定的字节数的数据,用于创建一个 <code>Uint8Array</code> 对象并返回此对象。
  928. *@param start 开始位置。
  929. *@param len 需要读取的字节长度。如果要读取的长度超过可读取范围,则只返回可读范围内的值。
  930. *@return 读取的 Uint8Array 对象。
  931. */
  932. __proto.readUint8Array=function(start,len){
  933. var end=start+len;
  934. end=(end > this._length)? this._length :end;
  935. var v=new Uint8Array(this._d_.buffer.slice(start,end));
  936. this._pos_=end;
  937. return v;
  938. }
  939. /**
  940. *@private
  941. *<p>从字节流中 <code>start</code> 参数指定的位置开始,读取 <code>len</code> 参数指定的字节数的数据,用于创建一个 <code>Int16Array</code> 对象并返回此对象。</p>
  942. *<p><b>注意:</b>返回的 Int16Array 对象,在 JavaScript 环境下,是原生的 HTML5 Int16Array 对象,对此对象的读取操作都是基于运行此程序的当前主机字节序,此顺序可能与实际数据的字节序不同,如果使用此对象进行读取,需要用户知晓实际数据的字节序和当前主机字节序,如果相同,可正常读取,否则需要用户对实际数据(Int16Array.buffer)包装一层 DataView ,使用 DataView 对象可按照指定的字节序进行读取。</p>
  943. *@param start 开始读取的字节偏移量位置。
  944. *@param len 需要读取的字节长度。如果要读取的长度超过可读取范围,则只返回可读范围内的值。
  945. *@return 读取的 Int16Array 对象。
  946. */
  947. __proto.getInt16Array=function(start,len){
  948. return this.readInt16Array(start,len);
  949. }
  950. /**
  951. *从字节流中 <code>start</code> 参数指定的位置开始,读取 <code>len</code> 参数指定的字节数的数据,用于创建一个 <code>Int16Array</code> 对象并返回此对象。
  952. *@param start 开始读取的字节偏移量位置。
  953. *@param len 需要读取的字节长度。如果要读取的长度超过可读取范围,则只返回可读范围内的值。
  954. *@return 读取的 Uint8Array 对象。
  955. */
  956. __proto.readInt16Array=function(start,len){
  957. var end=start+len;
  958. end=(end > this._length)? this._length :end;
  959. var v=new Int16Array(this._d_.buffer.slice(start,end));
  960. this._pos_=end;
  961. return v;
  962. }
  963. /**
  964. *@private
  965. *从字节流的当前字节偏移位置处读取一个 IEEE 754 单精度(32 位)浮点数。
  966. *@return 单精度(32 位)浮点数。
  967. */
  968. __proto.getFloat32=function(){
  969. return this.readFloat32();
  970. }
  971. /**
  972. *从字节流的当前字节偏移位置处读取一个 IEEE 754 单精度(32 位)浮点数。
  973. *@return 单精度(32 位)浮点数。
  974. */
  975. __proto.readFloat32=function(){
  976. if (this._pos_+4 > this._length)throw "getFloat32 error - Out of bounds";
  977. var v=this._d_.getFloat32(this._pos_,this._xd_);
  978. this._pos_+=4;
  979. return v;
  980. }
  981. /**
  982. *@private
  983. *从字节流的当前字节偏移量位置处读取一个 IEEE 754 双精度(64 位)浮点数。
  984. *@return 双精度(64 位)浮点数。
  985. */
  986. __proto.getFloat64=function(){
  987. return this.readFloat64();
  988. }
  989. /**
  990. *从字节流的当前字节偏移量位置处读取一个 IEEE 754 双精度(64 位)浮点数。
  991. *@return 双精度(64 位)浮点数。
  992. */
  993. __proto.readFloat64=function(){
  994. if (this._pos_+8 > this._length)throw "getFloat64 error - Out of bounds";
  995. var v=this._d_.getFloat64(this._pos_,this._xd_);
  996. this._pos_+=8;
  997. return v;
  998. }
  999. /**
  1000. *在字节流的当前字节偏移量位置处写入一个 IEEE 754 单精度(32 位)浮点数。
  1001. *@param value 单精度(32 位)浮点数。
  1002. */
  1003. __proto.writeFloat32=function(value){
  1004. this._ensureWrite(this._pos_+4);
  1005. this._d_.setFloat32(this._pos_,value,this._xd_);
  1006. this._pos_+=4;
  1007. }
  1008. /**
  1009. *在字节流的当前字节偏移量位置处写入一个 IEEE 754 双精度(64 位)浮点数。
  1010. *@param value 双精度(64 位)浮点数。
  1011. */
  1012. __proto.writeFloat64=function(value){
  1013. this._ensureWrite(this._pos_+8);
  1014. this._d_.setFloat64(this._pos_,value,this._xd_);
  1015. this._pos_+=8;
  1016. }
  1017. /**
  1018. *@private
  1019. *从字节流的当前字节偏移量位置处读取一个 Int32 值。
  1020. *@return Int32 值。
  1021. */
  1022. __proto.getInt32=function(){
  1023. return this.readInt32();
  1024. }
  1025. /**
  1026. *从字节流的当前字节偏移量位置处读取一个 Int32 值。
  1027. *@return Int32 值。
  1028. */
  1029. __proto.readInt32=function(){
  1030. if (this._pos_+4 > this._length)throw "getInt32 error - Out of bounds";
  1031. var float=this._d_.getInt32(this._pos_,this._xd_);
  1032. this._pos_+=4;
  1033. return float;
  1034. }
  1035. /**
  1036. *@private
  1037. *从字节流的当前字节偏移量位置处读取一个 Uint32 值。
  1038. *@return Uint32 值。
  1039. */
  1040. __proto.getUint32=function(){
  1041. return this.readUint32();
  1042. }
  1043. /**
  1044. *从字节流的当前字节偏移量位置处读取一个 Uint32 值。
  1045. *@return Uint32 值。
  1046. */
  1047. __proto.readUint32=function(){
  1048. if (this._pos_+4 > this._length)throw "getUint32 error - Out of bounds";
  1049. var v=this._d_.getUint32(this._pos_,this._xd_);
  1050. this._pos_+=4;
  1051. return v;
  1052. }
  1053. /**
  1054. *在字节流的当前字节偏移量位置处写入指定的 Int32 值。
  1055. *@param value 需要写入的 Int32 值。
  1056. */
  1057. __proto.writeInt32=function(value){
  1058. this._ensureWrite(this._pos_+4);
  1059. this._d_.setInt32(this._pos_,value,this._xd_);
  1060. this._pos_+=4;
  1061. }
  1062. /**
  1063. *在字节流的当前字节偏移量位置处写入 Uint32 值。
  1064. *@param value 需要写入的 Uint32 值。
  1065. */
  1066. __proto.writeUint32=function(value){
  1067. this._ensureWrite(this._pos_+4);
  1068. this._d_.setUint32(this._pos_,value,this._xd_);
  1069. this._pos_+=4;
  1070. }
  1071. /**
  1072. *@private
  1073. *从字节流的当前字节偏移量位置处读取一个 Int16 值。
  1074. *@return Int16 值。
  1075. */
  1076. __proto.getInt16=function(){
  1077. return this.readInt16();
  1078. }
  1079. /**
  1080. *从字节流的当前字节偏移量位置处读取一个 Int16 值。
  1081. *@return Int16 值。
  1082. */
  1083. __proto.readInt16=function(){
  1084. if (this._pos_+2 > this._length)throw "getInt16 error - Out of bounds";
  1085. var us=this._d_.getInt16(this._pos_,this._xd_);
  1086. this._pos_+=2;
  1087. return us;
  1088. }
  1089. /**
  1090. *@private
  1091. *从字节流的当前字节偏移量位置处读取一个 Uint16 值。
  1092. *@return Uint16 值。
  1093. */
  1094. __proto.getUint16=function(){
  1095. return this.readUint16();
  1096. }
  1097. /**
  1098. *从字节流的当前字节偏移量位置处读取一个 Uint16 值。
  1099. *@return Uint16 值。
  1100. */
  1101. __proto.readUint16=function(){
  1102. if (this._pos_+2 > this._length)throw "getUint16 error - Out of bounds";
  1103. var us=this._d_.getUint16(this._pos_,this._xd_);
  1104. this._pos_+=2;
  1105. return us;
  1106. }
  1107. /**
  1108. *在字节流的当前字节偏移量位置处写入指定的 Uint16 值。
  1109. *@param value 需要写入的Uint16 值。
  1110. */
  1111. __proto.writeUint16=function(value){
  1112. this._ensureWrite(this._pos_+2);
  1113. this._d_.setUint16(this._pos_,value,this._xd_);
  1114. this._pos_+=2;
  1115. }
  1116. /**
  1117. *在字节流的当前字节偏移量位置处写入指定的 Int16 值。
  1118. *@param value 需要写入的 Int16 值。
  1119. */
  1120. __proto.writeInt16=function(value){
  1121. this._ensureWrite(this._pos_+2);
  1122. this._d_.setInt16(this._pos_,value,this._xd_);
  1123. this._pos_+=2;
  1124. }
  1125. /**
  1126. *@private
  1127. *从字节流的当前字节偏移量位置处读取一个 Uint8 值。
  1128. *@return Uint8 值。
  1129. */
  1130. __proto.getUint8=function(){
  1131. return this.readUint8();
  1132. }
  1133. /**
  1134. *从字节流的当前字节偏移量位置处读取一个 Uint8 值。
  1135. *@return Uint8 值。
  1136. */
  1137. __proto.readUint8=function(){
  1138. if (this._pos_+1 > this._length)throw "getUint8 error - Out of bounds";
  1139. return this._d_.getUint8(this._pos_++);
  1140. }
  1141. /**
  1142. *在字节流的当前字节偏移量位置处写入指定的 Uint8 值。
  1143. *@param value 需要写入的 Uint8 值。
  1144. */
  1145. __proto.writeUint8=function(value){
  1146. this._ensureWrite(this._pos_+1);
  1147. this._d_.setUint8(this._pos_,value);
  1148. this._pos_++;
  1149. }
  1150. /**
  1151. *@private
  1152. *从字节流的指定字节偏移量位置处读取一个 Uint8 值。
  1153. *@param pos 字节读取位置。
  1154. *@return Uint8 值。
  1155. */
  1156. __proto._getUInt8=function(pos){
  1157. return this._readUInt8(pos);
  1158. }
  1159. /**
  1160. *@private
  1161. *从字节流的指定字节偏移量位置处读取一个 Uint8 值。
  1162. *@param pos 字节读取位置。
  1163. *@return Uint8 值。
  1164. */
  1165. __proto._readUInt8=function(pos){
  1166. return this._d_.getUint8(pos);
  1167. }
  1168. /**
  1169. *@private
  1170. *从字节流的指定字节偏移量位置处读取一个 Uint16 值。
  1171. *@param pos 字节读取位置。
  1172. *@return Uint16 值。
  1173. */
  1174. __proto._getUint16=function(pos){
  1175. return this._readUint16(pos);
  1176. }
  1177. /**
  1178. *@private
  1179. *从字节流的指定字节偏移量位置处读取一个 Uint16 值。
  1180. *@param pos 字节读取位置。
  1181. *@return Uint16 值。
  1182. */
  1183. __proto._readUint16=function(pos){
  1184. return this._d_.getUint16(pos,this._xd_);
  1185. }
  1186. /**
  1187. *@private
  1188. *使用 getFloat32()读取6个值,用于创建并返回一个 Matrix 对象。
  1189. *@return Matrix 对象。
  1190. */
  1191. __proto._getMatrix=function(){
  1192. return this._readMatrix();
  1193. }
  1194. /**
  1195. *@private
  1196. *使用 getFloat32()读取6个值,用于创建并返回一个 Matrix 对象。
  1197. *@return Matrix 对象。
  1198. */
  1199. __proto._readMatrix=function(){
  1200. var rst=new Matrix(this.getFloat32(),this.getFloat32(),this.getFloat32(),this.getFloat32(),this.getFloat32(),this.getFloat32());
  1201. return rst;
  1202. }
  1203. /**
  1204. *@private
  1205. *读取指定长度的 UTF 型字符串。
  1206. *@param len 需要读取的长度。
  1207. *@return 读取的字符串。
  1208. */
  1209. __proto._rUTF=function(len){
  1210. var v="",max=this._pos_+len,c=0,c2=0,c3=0,f=String.fromCharCode;
  1211. var u=this._u8d_,i=0;
  1212. while (this._pos_ < max){
  1213. c=u[this._pos_++];
  1214. if (c < 0x80){
  1215. if (c !=0)v+=f(c);
  1216. }else if (c < 0xE0){
  1217. v+=f(((c & 0x3F)<< 6)| (u[this._pos_++] & 0x7F));
  1218. }else if (c < 0xF0){
  1219. c2=u[this._pos_++];
  1220. v+=f(((c & 0x1F)<< 12)| ((c2 & 0x7F)<< 6)| (u[this._pos_++] & 0x7F));
  1221. }else {
  1222. c2=u[this._pos_++];
  1223. c3=u[this._pos_++];
  1224. v+=f(((c & 0x0F)<< 18)| ((c2 & 0x7F)<< 12)| ((c3 << 6)& 0x7F)| (u[this._pos_++] & 0x7F));
  1225. }
  1226. i++;
  1227. }
  1228. return v;
  1229. }
  1230. /**
  1231. *@private
  1232. *读取 <code>len</code> 参数指定的长度的字符串。
  1233. *@param len 要读取的字符串的长度。
  1234. *@return 指定长度的字符串。
  1235. */
  1236. __proto.getCustomString=function(len){
  1237. return this.readCustomString(len);
  1238. }
  1239. /**
  1240. *@private
  1241. *读取 <code>len</code> 参数指定的长度的字符串。
  1242. *@param len 要读取的字符串的长度。
  1243. *@return 指定长度的字符串。
  1244. */
  1245. __proto.readCustomString=function(len){
  1246. var v="",ulen=0,c=0,c2=0,f=String.fromCharCode;
  1247. var u=this._u8d_,i=0;
  1248. while (len > 0){
  1249. c=u[this._pos_];
  1250. if (c < 0x80){
  1251. v+=f(c);
  1252. this._pos_++;
  1253. len--;
  1254. }else {
  1255. ulen=c-0x80;
  1256. this._pos_++;
  1257. len-=ulen;
  1258. while (ulen > 0){
  1259. c=u[this._pos_++];
  1260. c2=u[this._pos_++];
  1261. v+=f((c2 << 8)| c);
  1262. ulen--;
  1263. }
  1264. }
  1265. }
  1266. return v;
  1267. }
  1268. /**
  1269. *清除字节数组的内容,并将 length 和 pos 属性重置为 0。调用此方法将释放 Byte 实例占用的内存。
  1270. */
  1271. __proto.clear=function(){
  1272. this._pos_=0;
  1273. this.length=0;
  1274. }
  1275. /**
  1276. *@private
  1277. *获取此对象的 ArrayBuffer 引用。
  1278. *@return
  1279. */
  1280. __proto.__getBuffer=function(){
  1281. return this._d_.buffer;
  1282. }
  1283. /**
  1284. *<p>将 UTF-8 字符串写入字节流。类似于 writeUTF()方法,但 writeUTFBytes()不使用 16 位长度的字为字符串添加前缀。</p>
  1285. *<p>对应的读取方法为: getUTFBytes 。</p>
  1286. *@param value 要写入的字符串。
  1287. */
  1288. __proto.writeUTFBytes=function(value){
  1289. value=value+"";
  1290. for (var i=0,sz=value.length;i < sz;i++){
  1291. var c=value.charCodeAt(i);
  1292. if (c <=0x7F){
  1293. this.writeByte(c);
  1294. }else if (c <=0x7FF){
  1295. this._ensureWrite(this._pos_+2);
  1296. this._u8d_.set([0xC0 | (c >> 6),0x80 | (c & 0x3F)],this._pos_);
  1297. this._pos_+=2;
  1298. }else if (c <=0xFFFF){
  1299. this._ensureWrite(this._pos_+3);
  1300. this._u8d_.set([0xE0 | (c >> 12),0x80 | ((c >> 6)& 0x3F),0x80 | (c & 0x3F)],this._pos_);
  1301. this._pos_+=3;
  1302. }else {
  1303. this._ensureWrite(this._pos_+4);
  1304. this._u8d_.set([0xF0 | (c >> 18),0x80 | ((c >> 12)& 0x3F),0x80 | ((c >> 6)& 0x3F),0x80 | (c & 0x3F)],this._pos_);
  1305. this._pos_+=4;
  1306. }
  1307. }
  1308. }
  1309. /**
  1310. *<p>将 UTF-8 字符串写入字节流。先写入以字节表示的 UTF-8 字符串长度(作为 16 位整数),然后写入表示字符串字符的字节。</p>
  1311. *<p>对应的读取方法为: getUTFString 。</p>
  1312. *@param value 要写入的字符串值。
  1313. */
  1314. __proto.writeUTFString=function(value){
  1315. var tPos=this.pos;
  1316. this.writeUint16(1);
  1317. this.writeUTFBytes(value);
  1318. var dPos=this.pos-tPos-2;
  1319. this._d_.setUint16(tPos,dPos,this._xd_);
  1320. }
  1321. /**
  1322. *@private
  1323. *读取 UTF-8 字符串。
  1324. *@return 读取的字符串。
  1325. */
  1326. __proto.readUTFString=function(){
  1327. return this.readUTFBytes(this.getUint16());
  1328. }
  1329. /**
  1330. *<p>从字节流中读取一个 UTF-8 字符串。假定字符串的前缀是一个无符号的短整型(以此字节表示要读取的长度)。</p>
  1331. *<p>对应的写入方法为: writeUTFString 。</p>
  1332. *@return 读取的字符串。
  1333. */
  1334. __proto.getUTFString=function(){
  1335. return this.readUTFString();
  1336. }
  1337. /**
  1338. *@private
  1339. *读字符串,必须是 writeUTFBytes 方法写入的字符串。
  1340. *@param len 要读的buffer长度,默认将读取缓冲区全部数据。
  1341. *@return 读取的字符串。
  1342. */
  1343. __proto.readUTFBytes=function(len){
  1344. (len===void 0)&& (len=-1);
  1345. if (len===0)return "";
  1346. var lastBytes=this.bytesAvailable;
  1347. if (len > lastBytes)throw "readUTFBytes error - Out of bounds";
  1348. len=len > 0 ? len :lastBytes;
  1349. return this._rUTF(len);
  1350. }
  1351. /**
  1352. *<p>从字节流中读取一个由 length 参数指定的长度的 UTF-8 字节序列,并返回一个字符串。</p>
  1353. *<p>一般读取的是由 writeUTFBytes 方法写入的字符串。</p>
  1354. *@param len 要读的buffer长度,默认将读取缓冲区全部数据。
  1355. *@return 读取的字符串。
  1356. */
  1357. __proto.getUTFBytes=function(len){
  1358. (len===void 0)&& (len=-1);
  1359. return this.readUTFBytes(len);
  1360. }
  1361. /**
  1362. *<p>在字节流中写入一个字节。</p>
  1363. *<p>使用参数的低 8 位。忽略高 24 位。</p>
  1364. *@param value
  1365. */
  1366. __proto.writeByte=function(value){
  1367. this._ensureWrite(this._pos_+1);
  1368. this._d_.setInt8(this._pos_,value);
  1369. this._pos_+=1;
  1370. }
  1371. /**
  1372. *<p>从字节流中读取带符号的字节。</p>
  1373. *<p>返回值的范围是从-128 到 127。</p>
  1374. *@return 介于-128 和 127 之间的整数。
  1375. */
  1376. __proto.readByte=function(){
  1377. if (this._pos_+1 > this._length)throw "readByte error - Out of bounds";
  1378. return this._d_.getInt8(this._pos_++);
  1379. }
  1380. /**
  1381. *@private
  1382. *从字节流中读取带符号的字节。
  1383. */
  1384. __proto.getByte=function(){
  1385. return this.readByte();
  1386. }
  1387. /**
  1388. *@private
  1389. *<p>保证该字节流的可用长度不小于 <code>lengthToEnsure</code> 参数指定的值。</p>
  1390. *@param lengthToEnsure 指定的长度。
  1391. */
  1392. __proto._ensureWrite=function(lengthToEnsure){
  1393. if (this._length < lengthToEnsure)this._length=lengthToEnsure;
  1394. if (this._allocated_ < lengthToEnsure)this.length=lengthToEnsure;
  1395. }
  1396. /**
  1397. *<p>将指定 arraybuffer 对象中的以 offset 为起始偏移量, length 为长度的字节序列写入字节流。</p>
  1398. *<p>如果省略 length 参数,则使用默认长度 0,该方法将从 offset 开始写入整个缓冲区;如果还省略了 offset 参数,则写入整个缓冲区。</p>
  1399. *<p>如果 offset 或 length 小于0,本函数将抛出异常。</p>
  1400. *@param arraybuffer 需要写入的 Arraybuffer 对象。
  1401. *@param offset Arraybuffer 对象的索引的偏移量(以字节为单位)
  1402. *@param length 从 Arraybuffer 对象写入到 Byte 对象的长度(以字节为单位)
  1403. */
  1404. __proto.writeArrayBuffer=function(arraybuffer,offset,length){
  1405. (offset===void 0)&& (offset=0);
  1406. (length===void 0)&& (length=0);
  1407. if (offset < 0 || length < 0)throw "writeArrayBuffer error - Out of bounds";
  1408. if (length==0)length=arraybuffer.byteLength-offset;
  1409. this._ensureWrite(this._pos_+length);
  1410. var uint8array=new Uint8Array(arraybuffer);
  1411. this._u8d_.set(uint8array.subarray(offset,offset+length),this._pos_);
  1412. this._pos_+=length;
  1413. }
  1414. /**
  1415. *获取此对象的 ArrayBuffer 数据,数据只包含有效数据部分。
  1416. */
  1417. __getset(0,__proto,'buffer',function(){
  1418. var rstBuffer=this._d_.buffer;
  1419. if (rstBuffer.byteLength===this._length)return rstBuffer;
  1420. return rstBuffer.slice(0,this._length);
  1421. });
  1422. /**
  1423. *<p> <code>Byte</code> 实例的字节序。取值为:<code>BIG_ENDIAN</code> 或 <code>BIG_ENDIAN</code> 。</p>
  1424. *<p>主机字节序,是 CPU 存放数据的两种不同顺序,包括小端字节序和大端字节序。通过 <code>getSystemEndian</code> 可以获取当前系统的字节序。</p>
  1425. *<p> <code>BIG_ENDIAN</code> :大端字节序,地址低位存储值的高位,地址高位存储值的低位。有时也称之为网络字节序。<br/>
  1426. *<code>LITTLE_ENDIAN</code> :小端字节序,地址低位存储值的低位,地址高位存储值的高位。</p>
  1427. */
  1428. __getset(0,__proto,'endian',function(){
  1429. return this._xd_ ? "littleEndian" :"bigEndian";
  1430. },function(value){
  1431. this._xd_=(value==="littleEndian");
  1432. });
  1433. /**
  1434. *<p> <code>Byte</code> 对象的长度(以字节为单位)。</p>
  1435. *<p>如果将长度设置为大于当前长度的值,则用零填充字节数组的右侧;如果将长度设置为小于当前长度的值,将会截断该字节数组。</p>
  1436. *<p>如果要设置的长度大于当前已分配的内存空间的字节长度,则重新分配内存空间,大小为以下两者较大者:要设置的长度、当前已分配的长度的2倍,并将原有数据拷贝到新的内存空间中;如果要设置的长度小于当前已分配的内存空间的字节长度,也会重新分配内存空间,大小为要设置的长度,并将原有数据从头截断为要设置的长度存入新的内存空间中。</p>
  1437. */
  1438. __getset(0,__proto,'length',function(){
  1439. return this._length;
  1440. },function(value){
  1441. if (this._allocated_ < value)this._resizeBuffer(this._allocated_=Math.floor(Math.max(value,this._allocated_ *2)));
  1442. else if (this._allocated_ > value)this._resizeBuffer(this._allocated_=value);
  1443. this._length=value;
  1444. });
  1445. /**
  1446. *移动或返回 Byte 对象的读写指针的当前位置(以字节为单位)。下一次调用读取方法时将在此位置开始读取,或者下一次调用写入方法时将在此位置开始写入。
  1447. */
  1448. __getset(0,__proto,'pos',function(){
  1449. return this._pos_;
  1450. },function(value){
  1451. this._pos_=value;
  1452. });
  1453. /**
  1454. *可从字节流的当前位置到末尾读取的数据的字节数。
  1455. */
  1456. __getset(0,__proto,'bytesAvailable',function(){
  1457. return this._length-this._pos_;
  1458. });
  1459. ByteEx.getSystemEndian=function(){
  1460. if (!ByteEx._sysEndian){
  1461. var buffer=new ArrayBuffer(2);
  1462. new DataView(buffer).setInt16(0,256,true);
  1463. ByteEx._sysEndian=(new Int16Array(buffer))[0]===256 ? /*CLASS CONST:laya.debug.tools.ByteEx.LITTLE_ENDIAN*/"littleEndian" :/*CLASS CONST:laya.debug.tools.ByteEx.BIG_ENDIAN*/"bigEndian";
  1464. }
  1465. return ByteEx._sysEndian;
  1466. }
  1467. ByteEx.BIG_ENDIAN="bigEndian";
  1468. ByteEx.LITTLE_ENDIAN="littleEndian";
  1469. ByteEx._sysEndian=null;
  1470. return ByteEx;
  1471. })()
  1472. /**
  1473. *...
  1474. *@author ww
  1475. */
  1476. //class laya.debug.tools.Base64ImageTool
  1477. var Base64ImageTool=(function(){
  1478. function Base64ImageTool(){}
  1479. __class(Base64ImageTool,'laya.debug.tools.Base64ImageTool');
  1480. Base64ImageTool.getCanvasPic=function(img){
  1481. img=img.bitmap;
  1482. var canvas=Browser.createElement("canvas");
  1483. var ctx=canvas.getContext('2d');
  1484. canvas.height=img.height;
  1485. canvas.width=img.width;
  1486. ctx.drawImage(img.bitmap,0,0);
  1487. return canvas;
  1488. }
  1489. Base64ImageTool.getBase64Pic=function(img){
  1490. return Base64ImageTool.getCanvasPic(img).toDataURL("image/png");
  1491. }
  1492. Base64ImageTool.getPreloads=function(base64Data){
  1493. var rst;
  1494. rst=[];
  1495. var key;
  1496. for (key in base64Data){
  1497. rst.push({url:base64Data[key],type:/*laya.net.Loader.IMAGE*/"image" });
  1498. }
  1499. return rst;
  1500. }
  1501. return Base64ImageTool;
  1502. })()
  1503. /**
  1504. *...
  1505. *@author ww
  1506. */
  1507. //class laya.debug.tools.TouchDebugTools
  1508. var TouchDebugTools=(function(){
  1509. function TouchDebugTools(){}
  1510. __class(TouchDebugTools,'laya.debug.tools.TouchDebugTools');
  1511. TouchDebugTools.getTouchIDs=function(events){
  1512. var rst;
  1513. rst=[];
  1514. var i=0,len=0;
  1515. len=events.length;
  1516. for (i=0;i < len;i++){
  1517. rst.push(events[i].identifier||0);
  1518. }
  1519. return rst;
  1520. }
  1521. TouchDebugTools.traceTouchIDs=function(msg,events){
  1522. DebugTxt.dTrace(msg+":"+TouchDebugTools.getTouchIDs(events).join(","));
  1523. }
  1524. return TouchDebugTools;
  1525. })()
  1526. /**
  1527. *
  1528. *@author ww
  1529. *@version 1.0
  1530. *
  1531. *@created 2015-12-30 下午5:12:53
  1532. */
  1533. //class laya.debug.tools.ValueChanger
  1534. var ValueChanger=(function(){
  1535. function ValueChanger(){
  1536. this.target=null;
  1537. this.key=null;
  1538. this._tValue=NaN;
  1539. this.preValue=0;
  1540. }
  1541. __class(ValueChanger,'laya.debug.tools.ValueChanger');
  1542. var __proto=ValueChanger.prototype;
  1543. __proto.record=function(){
  1544. this.preValue=this.value;
  1545. }
  1546. __proto.showValueByAdd=function(addValue){
  1547. this.value=this.preValue+addValue;
  1548. }
  1549. __proto.showValueByScale=function(scale){
  1550. this.value=this.preValue *scale;
  1551. }
  1552. __proto.recover=function(){
  1553. this.value=this.preValue;
  1554. }
  1555. __proto.dispose=function(){
  1556. this.target=null;
  1557. }
  1558. __getset(0,__proto,'value',function(){
  1559. if(this.target){
  1560. this._tValue=this.target[this.key];
  1561. }
  1562. return this._tValue;
  1563. },function(nValue){
  1564. this._tValue=nValue;
  1565. if(this.target){
  1566. this.target[this.key]=nValue;
  1567. }
  1568. });
  1569. __getset(0,__proto,'dValue',function(){
  1570. return this.value-this.preValue;
  1571. });
  1572. __getset(0,__proto,'scaleValue',function(){
  1573. return this.value/this.preValue;
  1574. });
  1575. ValueChanger.create=function(target,key){
  1576. var rst;
  1577. rst=new ValueChanger();
  1578. rst.target=target;
  1579. rst.key=key;
  1580. return rst;
  1581. }
  1582. return ValueChanger;
  1583. })()
  1584. /**
  1585. *...
  1586. *@author ww
  1587. */
  1588. //class laya.debug.tools.TimeTool
  1589. var TimeTool=(function(){
  1590. function TimeTool(){}
  1591. __class(TimeTool,'laya.debug.tools.TimeTool');
  1592. TimeTool.getTime=function(sign,update){
  1593. (update===void 0)&& (update=true);
  1594. if (!TimeTool.timeDic[sign]){
  1595. TimeTool.timeDic[sign]=0;
  1596. };
  1597. var tTime=NaN;
  1598. tTime=Browser.now();
  1599. var rst=NaN;
  1600. rst=tTime-TimeTool.timeDic[sign];
  1601. TimeTool.timeDic[sign]=tTime;
  1602. return rst;
  1603. }
  1604. TimeTool.runAllCallLater=function(){
  1605. if(TimeTool._deep>0)debugger;
  1606. TimeTool._deep++;
  1607. var timer;
  1608. timer=Laya.timer;
  1609. var laters=timer["_laters"];
  1610. for (var i=0,n=laters.length-1;i <=n;i++){
  1611. var handler=laters[i];
  1612. if(handler){
  1613. handler.method!==null && handler.run(false);
  1614. timer["_recoverHandler"](handler);
  1615. }else{
  1616. debugger;
  1617. }
  1618. i===n && (n=laters.length-1);
  1619. }
  1620. laters.length=0;
  1621. TimeTool._deep--;
  1622. }
  1623. TimeTool.timeDic={};
  1624. TimeTool._deep=0;
  1625. return TimeTool;
  1626. })()
  1627. /**
  1628. *
  1629. *@author ww
  1630. *@version 1.0
  1631. *
  1632. *@created 2015-12-24 下午4:20:25
  1633. */
  1634. //class laya.debug.tools.DisEditor
  1635. var DisEditor=(function(){
  1636. function DisEditor(){
  1637. this.tar=null;
  1638. this.rec=new Sprite();
  1639. this.rootContainer=new Sprite();
  1640. }
  1641. __class(DisEditor,'laya.debug.tools.DisEditor');
  1642. var __proto=DisEditor.prototype;
  1643. __proto.setTarget=function(target){
  1644. this.tar=target;
  1645. var g;
  1646. g=this.rec.graphics;
  1647. g.clear();
  1648. var bounds;
  1649. bounds=this.tar.getSelfBounds();
  1650. g.drawRect(bounds.x,bounds.y,bounds.width,bounds.height,null,"#00ff00");
  1651. this.createSameDisChain();
  1652. Laya.stage.addChild(this.rootContainer);
  1653. }
  1654. __proto.createSameDisChain=function(){
  1655. var tParent;
  1656. var cpParent;
  1657. var preTar;
  1658. preTar=this.rec;
  1659. tParent=this.tar;
  1660. while(tParent&&tParent!=Laya.stage){
  1661. cpParent=new Sprite();
  1662. cpParent.addChild(preTar);
  1663. cpParent.x=tParent.x;
  1664. cpParent.y=tParent.y;
  1665. cpParent.scaleX=tParent.scaleX;
  1666. cpParent.scaleY=tParent.scaleY;
  1667. cpParent.rotation=tParent.rotation;
  1668. cpParent.scrollRect=tParent.scrollRect;
  1669. preTar=cpParent;
  1670. tParent=tParent.parent;
  1671. }
  1672. this.rootContainer.removeChildren();
  1673. this.rootContainer.addChild(preTar);
  1674. }
  1675. return DisEditor;
  1676. })()
  1677. /**
  1678. *...
  1679. *@author ww
  1680. */
  1681. //class laya.debug.tools.GetSetProfile
  1682. var GetSetProfile=(function(){
  1683. function GetSetProfile(){}
  1684. __class(GetSetProfile,'laya.debug.tools.GetSetProfile');
  1685. GetSetProfile.removeNoDisplayKeys=function(arr){
  1686. var i=0;
  1687. for (i=arr.length-1;i >=0;i--){
  1688. if (GetSetProfile.noDisplayKeys[arr[i]]){
  1689. arr.splice(i,1);
  1690. }
  1691. }
  1692. }
  1693. GetSetProfile.getClassCount=function(className){
  1694. return GetSetProfile.countDic[className];
  1695. }
  1696. GetSetProfile.addClassCount=function(className){
  1697. if (!GetSetProfile.countDic[className]){
  1698. GetSetProfile.countDic[className]=1;
  1699. }
  1700. else {
  1701. GetSetProfile.countDic[className]=GetSetProfile.countDic[className]+1;
  1702. }
  1703. }
  1704. GetSetProfile.init=function(){
  1705. if (GetSetProfile._inited)
  1706. return;
  1707. GetSetProfile._inited=true;
  1708. var createFun=function (sp){
  1709. GetSetProfile.classCreated(sp);
  1710. }
  1711. FunHook.hook(Node,"call",null,createFun);
  1712. GetSetProfile.handlerO={};
  1713. GetSetProfile.handlerO["get"]=function (target,key,receiver){
  1714. console.log("get",target,key,receiver);
  1715. return /*__JS__ */Reflect.get(target,key,receiver);
  1716. };
  1717. GetSetProfile.handlerO["set"]=function (target,key,value,receiver){
  1718. console.log("set",target,key,value,receiver);
  1719. return /*__JS__ */Reflect.set(target,key,value,receiver);
  1720. }
  1721. }
  1722. GetSetProfile.classCreated=function(obj,oClas){
  1723. if (GetSetProfile.fromMe)
  1724. return;
  1725. var className;
  1726. className=ClassTool.getClassName(obj);
  1727. GetSetProfile.addClassCount(className);
  1728. GetSetProfile.addClassCount("ALL");
  1729. IDTools.idObj(obj);
  1730. var classDes;
  1731. classDes=GetSetProfile.hookClassDic[className];
  1732. if (!classDes){
  1733. GetSetProfile.profileClass(obj["constructor"]);
  1734. classDes=GetSetProfile.hookClassDic[className];
  1735. if (!classDes)
  1736. return;
  1737. }
  1738. GetSetProfile.hookObj2(obj,classDes);
  1739. }
  1740. GetSetProfile.hookObj=function(obj,keys){
  1741. var handler=GetSetProfile.handlerO;
  1742. /*__JS__ */new Proxy(obj,handler);
  1743. }
  1744. GetSetProfile.hookObj2=function(obj,keys){
  1745. var i=0,len=0;
  1746. len=keys.length;
  1747. for (i=0;i < len;i++){
  1748. GetSetProfile.hookVar(obj,keys[i]);
  1749. }
  1750. }
  1751. GetSetProfile.profileClass=function(clz){
  1752. var className;
  1753. className=ClassTool.getClassName(clz);
  1754. GetSetProfile.fromMe=true;
  1755. var tO=new clz();
  1756. GetSetProfile.fromMe=false;
  1757. var keys;
  1758. keys=ClassTool.getObjectDisplayAbleKeys(tO);
  1759. keys=ObjectTools.getNoSameArr(keys);
  1760. var i=0,len=0;
  1761. len=keys.length;
  1762. var tV;
  1763. var key;
  1764. for (i=len-1;i >=0;i--){
  1765. key=keys[i];
  1766. tV=tO[key];
  1767. if ((typeof tV=='function')){
  1768. keys.splice(i,1);
  1769. }
  1770. }
  1771. len=keys.length;
  1772. GetSetProfile.removeNoDisplayKeys(keys);
  1773. GetSetProfile.hookClassDic[className]=keys;
  1774. }
  1775. GetSetProfile.hookPrototype=function(tO,key){
  1776. console.log("hook:",key);
  1777. try {
  1778. GetSetProfile.hookVar(tO,key);
  1779. }
  1780. catch (e){
  1781. console.log("fail",key);
  1782. }
  1783. }
  1784. GetSetProfile.reportCall=function(obj,name,type){
  1785. IDTools.idObj(obj);
  1786. var objID=0;
  1787. objID=IDTools.getObjID(obj);
  1788. var className;
  1789. className=ClassTool.getClassName(obj);
  1790. GetSetProfile.recordInfo(className,name,type,objID);
  1791. GetSetProfile.recordInfo("ALL",name,type,objID);
  1792. }
  1793. GetSetProfile.recordInfo=function(className,name,type,objID){
  1794. var propCallsDic;
  1795. if (!GetSetProfile.infoDic[className]){
  1796. GetSetProfile.infoDic[className]={};
  1797. }
  1798. propCallsDic=GetSetProfile.infoDic[className];
  1799. var propCalls;
  1800. if (!propCallsDic[name]){
  1801. propCallsDic[name]={};
  1802. }
  1803. propCalls=propCallsDic[name];
  1804. var propCallO;
  1805. if (!propCalls[type]){
  1806. propCalls[type]={};
  1807. }
  1808. propCallO=propCalls[type];
  1809. if (!propCallO[objID]){
  1810. propCallO[objID]=1;
  1811. if (!propCallO["objCount"]){
  1812. propCallO["objCount"]=1;
  1813. }
  1814. else {
  1815. propCallO["objCount"]=propCallO["objCount"]+1;
  1816. }
  1817. }
  1818. else {
  1819. propCallO[objID]=propCallO[objID]+1;
  1820. }
  1821. if (!propCallO["count"]){
  1822. propCallO["count"]=1;
  1823. }
  1824. else {
  1825. propCallO["count"]=propCallO["count"]+1;
  1826. }
  1827. }
  1828. GetSetProfile.showInfo=function(){
  1829. var rstO;
  1830. rstO={};
  1831. var rstO1;
  1832. rstO1={};
  1833. var arr;
  1834. arr=[];
  1835. var arr1;
  1836. arr1=[];
  1837. var className;
  1838. var keyName;
  1839. var type;
  1840. for (className in GetSetProfile.infoDic){
  1841. var tClassO;
  1842. var tClassO1;
  1843. tClassO=GetSetProfile.infoDic[className];
  1844. rstO[className]=tClassO1={};
  1845. for (keyName in tClassO){
  1846. var tKeyO;
  1847. var tKeyO1;
  1848. tKeyO=tClassO[keyName];
  1849. tClassO1[keyName]=tKeyO1={};
  1850. for(type in tKeyO){
  1851. var tDataO;
  1852. var tDataO1;
  1853. tDataO=tKeyO[type];
  1854. tDataO["rate"]=tDataO["objCount"] / GetSetProfile.getClassCount(className);
  1855. tKeyO1[type]=tDataO["rate"];
  1856. var tSKey;
  1857. tSKey=className+"_"+keyName+"_"+type;
  1858. rstO1[tSKey]=tDataO["rate"];
  1859. if (className=="ALL"){
  1860. if (type=="get"){
  1861. arr.push([tSKey,tDataO["rate"],tDataO["count"]]);
  1862. }else{
  1863. arr1.push([tSKey,tDataO["rate"],tDataO["count"]]);
  1864. }
  1865. }
  1866. }
  1867. }
  1868. }
  1869. console.log(GetSetProfile.infoDic);
  1870. console.log(GetSetProfile.countDic);
  1871. console.log(rstO);
  1872. console.log(rstO1);
  1873. console.log("nodeCount:",GetSetProfile.getClassCount("ALL"));
  1874. console.log("sort by rate");
  1875. GetSetProfile.showStaticInfo(arr,arr1,"1");
  1876. console.log("sort by count");
  1877. GetSetProfile.showStaticInfo(arr,arr1,"2");
  1878. }
  1879. GetSetProfile.showStaticInfo=function(arr,arr1,sortKey){
  1880. console.log("get:");
  1881. GetSetProfile.showStaticArray(arr,sortKey);
  1882. console.log("set:");
  1883. GetSetProfile.showStaticArray(arr1,sortKey);
  1884. }
  1885. GetSetProfile.showStaticArray=function(arr,sortKey){
  1886. (sortKey===void 0)&& (sortKey="1");
  1887. arr.sort(MathUtil.sortByKey(sortKey,true,true));
  1888. var i=0,len=0;
  1889. len=arr.length;
  1890. var tArr;
  1891. for (i=0;i < len;i++){
  1892. tArr=arr[i];
  1893. console.log(tArr[0],Math.floor(tArr[1]*100),tArr[2]);
  1894. }
  1895. }
  1896. GetSetProfile.hookVar=function(obj,name,setHook,getHook){
  1897. if (!setHook)
  1898. setHook=[];
  1899. if (!getHook)
  1900. getHook=[];
  1901. var preO=obj;
  1902. var preValue;
  1903. var newKey="___@"+newKey;
  1904. var des;
  1905. des=ClassTool.getOwnPropertyDescriptor(obj,name);
  1906. var ndes={};
  1907. var mSet=function (value){
  1908. preValue=value;
  1909. };
  1910. var mGet=function (){
  1911. return preValue;
  1912. };
  1913. var mSet1=function (value){
  1914. var _t=/*__JS__ */this;
  1915. GetSetProfile.reportCall(_t,name,"set");
  1916. };
  1917. var mGet1=function (){
  1918. var _t=/*__JS__ */this;
  1919. GetSetProfile.reportCall(_t,name,"get");
  1920. return preValue;
  1921. }
  1922. getHook.push(mGet1);
  1923. setHook.push(mSet1);
  1924. while (!des && obj["__proto__"]){
  1925. obj=obj["__proto__"];
  1926. des=ClassTool.getOwnPropertyDescriptor(obj,name);
  1927. }
  1928. if (des){
  1929. ndes.set=des.set ? des.set :mSet;
  1930. ndes.get=des.get ? des.get :mGet;
  1931. if (!des.get){
  1932. preValue=preO[name];
  1933. }
  1934. ndes.enumerable=des.enumerable;
  1935. setHook.push(ndes.set);
  1936. getHook.push(ndes.get);
  1937. FunHook.hookFuns(ndes,"set",setHook);
  1938. FunHook.hookFuns(ndes,"get",getHook,getHook.length-1);
  1939. ClassTool.defineProperty(preO,name,ndes);
  1940. }
  1941. if (!des){
  1942. ndes.set=mSet;
  1943. ndes.get=mGet;
  1944. preValue=preO[name];
  1945. setHook.push(ndes.set);
  1946. getHook.push(ndes.get);
  1947. FunHook.hookFuns(ndes,"set",setHook);
  1948. FunHook.hookFuns(ndes,"get",getHook,getHook.length-1);
  1949. ClassTool.defineProperty(preO,name,ndes);
  1950. }
  1951. }
  1952. GetSetProfile._inited=false;
  1953. GetSetProfile.handlerO=null;
  1954. GetSetProfile.ALL="ALL";
  1955. GetSetProfile.countDic={};
  1956. GetSetProfile.fromMe=false;
  1957. GetSetProfile.hookClassDic={};
  1958. GetSetProfile.infoDic={};
  1959. __static(GetSetProfile,
  1960. ['noDisplayKeys',function(){return this.noDisplayKeys={"conchModel":true};}
  1961. ]);
  1962. return GetSetProfile;
  1963. })()
  1964. /**
  1965. *本类用于监控对象 set get 函数的调用
  1966. *@author ww
  1967. *@version 1.0
  1968. *
  1969. *@created 2015-10-23 下午2:52:48
  1970. */
  1971. //class laya.debug.tools.hook.VarHook
  1972. var VarHook=(function(){
  1973. function VarHook(){}
  1974. __class(VarHook,'laya.debug.tools.hook.VarHook');
  1975. VarHook.hookVar=function(obj,name,setHook,getHook){
  1976. if(!setHook)setHook=[];
  1977. if(!getHook)getHook=[];
  1978. var preO=obj;
  1979. var preValue=obj[name];
  1980. var des;
  1981. des=ClassTool.getOwnPropertyDescriptor(obj,name);
  1982. var ndes={};
  1983. var mSet=function (value){
  1984. console.log("var hook set "+name+":",value);
  1985. preValue=value;
  1986. };
  1987. var mGet=function (){
  1988. console.log("var hook get"+name+":",preValue);
  1989. return preValue;
  1990. }
  1991. if(des){
  1992. ndes.set=mSet;
  1993. ndes.get=mGet;
  1994. ndes.enumerable=des.enumerable;
  1995. setHook.push(ndes.set);
  1996. getHook.push(ndes.get);
  1997. FunHook.hookFuns(ndes,"set",setHook);
  1998. FunHook.hookFuns(ndes,"get",getHook,getHook.length-1);
  1999. ClassTool.defineProperty(obj,name,ndes);
  2000. return;
  2001. }
  2002. while(!des&&obj["__proto__"]){
  2003. obj=obj["__proto__"];
  2004. des=ClassTool.getOwnPropertyDescriptor(obj,name);
  2005. }
  2006. if (des){
  2007. ndes.set=des.set?des.set:mSet;
  2008. ndes.get=des.get?des.get:mGet;
  2009. ndes.enumerable=des.enumerable;
  2010. setHook.push(ndes.set);
  2011. getHook.push(ndes.get);
  2012. FunHook.hookFuns(ndes,"set",setHook);
  2013. FunHook.hookFuns(ndes,"get",getHook,getHook.length-1);
  2014. ClassTool.defineProperty(preO,name,ndes);
  2015. }
  2016. if(!des){
  2017. console.log("get des fail add directly");
  2018. ndes.set=mSet;
  2019. ndes.get=mGet;
  2020. setHook.push(ndes.set);
  2021. getHook.push(ndes.get);
  2022. FunHook.hookFuns(ndes,"set",setHook);
  2023. FunHook.hookFuns(ndes,"get",getHook,getHook.length-1);
  2024. ClassTool.defineProperty(obj,name,ndes);
  2025. }
  2026. }
  2027. VarHook.getLocFun=function(msg,level){
  2028. (msg===void 0)&& (msg="");
  2029. (level===void 0)&& (level=0);
  2030. level+=1;
  2031. var rst;
  2032. rst=function (){
  2033. FunHook.traceLoc(level,msg);
  2034. }
  2035. return rst;
  2036. }
  2037. return VarHook;
  2038. })()
  2039. /**
  2040. *本类用于监控对象值变化
  2041. *@author ww
  2042. *@version 1.0
  2043. *
  2044. *@created 2015-10-23 下午4:18:27
  2045. */
  2046. //class laya.debug.tools.Watcher
  2047. var Watcher=(function(){
  2048. function Watcher(){}
  2049. __class(Watcher,'laya.debug.tools.Watcher');
  2050. Watcher.watch=function(obj,name,funs){
  2051. VarHook.hookVar(obj,name,funs);
  2052. }
  2053. Watcher.traceChange=function(obj,name,sign){
  2054. (sign===void 0)&& (sign="var changed:");
  2055. VarHook.hookVar(obj,name,[Watcher.getTraceValueFun(name),VarHook.getLocFun(sign)]);
  2056. }
  2057. Watcher.debugChange=function(obj,name){
  2058. VarHook.hookVar(obj,name,[VarHook.getLocFun("debug loc"),FunHook.debugHere]);
  2059. }
  2060. Watcher.differChange=function(obj,name,sign,msg){
  2061. (msg===void 0)&& (msg="");
  2062. VarHook.hookVar(obj,name,[Watcher.getDifferFun(obj,name,sign,msg)]);
  2063. }
  2064. Watcher.getDifferFun=function(obj,name,sign,msg){
  2065. (msg===void 0)&& (msg="");
  2066. var rst;
  2067. rst=function (){
  2068. DifferTool.differ(sign,obj[name],msg);
  2069. }
  2070. return rst;
  2071. }
  2072. Watcher.traceValue=function(value){
  2073. console.log("value:",value);
  2074. }
  2075. Watcher.getTraceValueFun=function(name){
  2076. var rst;
  2077. rst=function (value){
  2078. console.log("set "+name+" :",value);
  2079. }
  2080. return rst;
  2081. }
  2082. return Watcher;
  2083. })()
  2084. /**
  2085. *
  2086. *@author ww
  2087. *@version 1.0
  2088. *
  2089. *@created 2015-10-23 下午2:24:04
  2090. */
  2091. //class laya.debug.tools.ClassTool
  2092. var ClassTool=(function(){
  2093. function ClassTool(){}
  2094. __class(ClassTool,'laya.debug.tools.ClassTool');
  2095. ClassTool.defineProperty=function(obj,name,des){
  2096. /*__JS__ */Object.defineProperty(obj,name,des);;
  2097. }
  2098. ClassTool.getOwnPropertyDescriptor=function(obj,name){
  2099. var rst;
  2100. /*__JS__ */rst=Object.getOwnPropertyDescriptor(obj,name);;
  2101. return rst;
  2102. }
  2103. ClassTool.getOwnPropertyDescriptors=function(obj){
  2104. var rst;
  2105. /*__JS__ */rst=Object.getOwnPropertyDescriptors(obj);;
  2106. return rst;
  2107. }
  2108. ClassTool.getOwnPropertyNames=function(obj){
  2109. var rst;
  2110. /*__JS__ */rst=Object.getOwnPropertyNames(obj);;
  2111. return rst;
  2112. }
  2113. ClassTool.getObjectGetSetKeys=function(obj,rst){
  2114. if (!rst)rst=[];
  2115. var keys;
  2116. keys=laya.debug.tools.ClassTool.getOwnPropertyNames(obj);
  2117. var key;
  2118. for (key in keys){
  2119. key=keys[key];
  2120. if (key.indexOf("_$get_")>=0){
  2121. key=key.replace("_$get_","");
  2122. rst.push(key);
  2123. }
  2124. }
  2125. if (obj["__proto__"]){
  2126. ClassTool.getObjectGetSetKeys(obj["__proto__"],rst);
  2127. }
  2128. return rst;
  2129. }
  2130. ClassTool.getObjectDisplayAbleKeys=function(obj,rst){
  2131. if (!rst)rst=[];
  2132. var key;
  2133. var tValue;
  2134. var tType;
  2135. for (key in obj){
  2136. tValue=obj[key];
  2137. tType=typeof(tValue);
  2138. if (key.charAt(0)=="_")continue ;
  2139. rst.push(key);
  2140. }
  2141. ClassTool.getObjectGetSetKeys(obj,rst);
  2142. rst=ObjectTools.getNoSameArr(rst);
  2143. return rst;
  2144. }
  2145. ClassTool.getClassName=function(tar){
  2146. if ((typeof tar=='function'))return tar.name;
  2147. return tar["constructor"].name;
  2148. }
  2149. ClassTool.getNodeClassAndName=function(tar){
  2150. if (!tar)return "null";
  2151. var rst;
  2152. if (tar.name){
  2153. rst=ClassTool.getClassName(tar)+"("+tar.name+")";
  2154. }else{
  2155. rst=ClassTool.getClassName(tar);
  2156. }
  2157. return rst;
  2158. }
  2159. ClassTool.getClassNameByClz=function(clz){
  2160. return clz["name"];
  2161. }
  2162. ClassTool.getClassByName=function(className){
  2163. var rst;
  2164. rst=Laya._runScript(className);
  2165. return rst;
  2166. }
  2167. ClassTool.createObjByName=function(className){
  2168. var clz;
  2169. clz=ClassTool.getClassByName(className);
  2170. return new clz();
  2171. }
  2172. __static(ClassTool,
  2173. ['displayTypes',function(){return this.displayTypes={"boolean":true,"number":true,"string":true };}
  2174. ]);
  2175. return ClassTool;
  2176. })()
  2177. /**
  2178. *
  2179. *@author ww
  2180. *@version 1.0
  2181. *
  2182. *@created 2015-10-29 上午9:45:33
  2183. */
  2184. //class laya.debug.tools.IDTools
  2185. var IDTools=(function(){
  2186. function IDTools(){
  2187. this.tID=1;
  2188. }
  2189. __class(IDTools,'laya.debug.tools.IDTools');
  2190. var __proto=IDTools.prototype;
  2191. __proto.getID=function(){
  2192. return this.tID++;
  2193. }
  2194. IDTools.getAID=function(){
  2195. return IDTools._ID.getID();
  2196. }
  2197. IDTools.idObjE=function(obj,sign){
  2198. (sign===void 0)&& (sign="default");
  2199. if (obj["_M_id_"])return obj;
  2200. if(!sign){
  2201. sign="default";
  2202. }
  2203. if(!IDTools._idDic[sign]){
  2204. IDTools._idDic[sign]=new IDTools();
  2205. }
  2206. obj["_M_id_"]=IDTools._idDic[sign].getAID();
  2207. return obj;
  2208. }
  2209. IDTools.setObjID=function(obj,id){
  2210. obj["_M_id_"]=id;
  2211. return obj;
  2212. }
  2213. IDTools.idObj=function(obj){
  2214. if (obj["_M_id_"])return obj;
  2215. obj["_M_id_"]=IDTools.getAID();
  2216. return obj;
  2217. }
  2218. IDTools.getObjID=function(obj){
  2219. if(!obj)return-1;
  2220. return obj["_M_id_"];
  2221. }
  2222. IDTools.idSign="_M_id_";
  2223. __static(IDTools,
  2224. ['_ID',function(){return this._ID=new IDTools();},'_idDic',function(){return this._idDic={"default":new IDTools()};}
  2225. ]);
  2226. return IDTools;
  2227. })()
  2228. /**
  2229. *...
  2230. *@author ww
  2231. */
  2232. //class laya.debug.tools.enginehook.SpriteRenderHook
  2233. var SpriteRenderHook=(function(){
  2234. function SpriteRenderHook(){
  2235. /**@private */
  2236. this._repaint=1;
  2237. this._renderType=1;
  2238. this._x=0;
  2239. this._y=0;
  2240. }
  2241. __class(SpriteRenderHook,'laya.debug.tools.enginehook.SpriteRenderHook');
  2242. var __proto=SpriteRenderHook.prototype;
  2243. /**
  2244. *更新、呈现显示对象。
  2245. *@param context 渲染的上下文引用。
  2246. *@param x X轴坐标。
  2247. *@param y Y轴坐标。
  2248. */
  2249. __proto.render=function(context,x,y){
  2250. if ((this)==Laya.stage){
  2251. CacheAnalyser.renderLoopBegin();
  2252. };
  2253. var preTime=0;
  2254. preTime=Browser.now();
  2255. // Stat.spriteCount++;
  2256. if (this["ShowBorderSign"]){
  2257. DebugTool.showDisBoundToSprite(this,DebugInfoLayer.I.cacheViewLayer,DebugConsts.SPRITE_REC_COLOR,DebugConsts.SPRITE_REC_LINEWIDTH);
  2258. }
  2259. RenderSprite.renders[this._renderType]._fun(this,context,x+this._x,y+this._y);
  2260. this._repaint=0;
  2261. RenderAnalyser.I.render(this,Browser.now()-preTime);
  2262. }
  2263. SpriteRenderHook.init=function(){
  2264. if (SpriteRenderHook.I)return;
  2265. SpriteRenderHook.I=new SpriteRenderHook();
  2266. SpriteRenderHook.setRenderHook();
  2267. }
  2268. SpriteRenderHook.setRenderHook=function(){
  2269. Sprite["prototype"]["render"]=SpriteRenderHook.I.render;
  2270. }
  2271. SpriteRenderHook.showDisplayBorder=function(sprite,ifShowBorder){
  2272. (ifShowBorder===void 0)&& (ifShowBorder=true);
  2273. sprite["ShowBorderSign"]=ifShowBorder;
  2274. }
  2275. SpriteRenderHook.isDisplayShowBorder=function(sprite){
  2276. return sprite["ShowBorderSign"];
  2277. }
  2278. SpriteRenderHook.I=null;
  2279. SpriteRenderHook.ShowBorderSign="ShowBorderSign";
  2280. return SpriteRenderHook;
  2281. })()
  2282. /**
  2283. *
  2284. *@author ww
  2285. *@version 1.0
  2286. *
  2287. *@created 2016-1-14 下午4:32:47
  2288. */
  2289. //class laya.debug.tools.DisController
  2290. var DisController=(function(){
  2291. function DisController(){
  2292. this.arrowAxis=null;
  2293. this._target=null;
  2294. this.recInfo=null;
  2295. DisController.init();
  2296. this.arrowAxis=new Axis();
  2297. this.arrowAxis.mouseEnabled=true;
  2298. }
  2299. __class(DisController,'laya.debug.tools.DisController');
  2300. var __proto=DisController.prototype;
  2301. __proto.switchType=function(){
  2302. this.arrowAxis.switchType();
  2303. }
  2304. __proto.updateMe=function(){
  2305. if(!this._target)return;
  2306. this.recInfo=RecInfo.getGlobalRecInfo(this._target,0,0,1,0,0,1);
  2307. console.log("rotation:",this.recInfo.rotation);
  2308. console.log("pos:",this.recInfo.x,this.recInfo.y);
  2309. console.log("scale:",this.recInfo.width,this.recInfo.height);
  2310. this.arrowAxis.x=this.recInfo.x;
  2311. this.arrowAxis.y=this.recInfo.y;
  2312. this.arrowAxis.rotation=this.recInfo.rotation;
  2313. this.arrowAxis.yAxis.rotation=this.recInfo.rotationV-this.recInfo.rotation;
  2314. }
  2315. __getset(0,__proto,'target',function(){
  2316. return this._target;
  2317. },function(target){
  2318. this._target=target;
  2319. if(target){
  2320. DisController._container.addChild(this.arrowAxis);
  2321. Laya.timer.loop(100,this,this.updateMe);
  2322. }else{
  2323. this.arrowAxis.removeSelf();
  2324. Laya.timer.clear(this,this.updateMe);
  2325. }
  2326. this.arrowAxis.target=target;
  2327. this.updateMe();
  2328. });
  2329. __getset(0,__proto,'type',function(){
  2330. return this.arrowAxis.type;
  2331. },function(lenType){
  2332. this.arrowAxis.type=lenType;
  2333. });
  2334. DisController.init=function(){
  2335. if (DisController._container){
  2336. DisControlTool.setTop(DisController._container);
  2337. return;
  2338. };
  2339. DisController._container=new Sprite();
  2340. DisController._container.mouseEnabled=true;
  2341. Laya.stage.addChild(DisController._container);
  2342. }
  2343. DisController._container=null;
  2344. __static(DisController,
  2345. ['I',function(){return this.I=new DisController();}
  2346. ]);
  2347. return DisController;
  2348. })()
  2349. /**
  2350. *...
  2351. *@author ww
  2352. */
  2353. //class laya.debug.tools.enginehook.FunctionTimeHook
  2354. var FunctionTimeHook=(function(){
  2355. function FunctionTimeHook(){}
  2356. __class(FunctionTimeHook,'laya.debug.tools.enginehook.FunctionTimeHook');
  2357. FunctionTimeHook.hookFun=function(obj,funName){
  2358. if (!obj)return;
  2359. if (obj.timeHooked)return;
  2360. var myKey;
  2361. FunctionTimeHook.HookID++;
  2362. myKey=ClassTool.getNodeClassAndName(obj)+"."+funName+"():"+FunctionTimeHook.HookID;
  2363. var timePreFun=function (__args){
  2364. var args=arguments;
  2365. FunctionTimeHook.funBegin(myKey);
  2366. };
  2367. var timeEndFun=function (__args){
  2368. var args=arguments;
  2369. FunctionTimeHook.funEnd(myKey);
  2370. }
  2371. obj.timeHooked=true;
  2372. FunHook.hook(obj,funName,timePreFun,timeEndFun);
  2373. }
  2374. FunctionTimeHook.funBegin=function(funKey){
  2375. FunctionTimeHook.funPre[funKey]=Browser.now();
  2376. }
  2377. FunctionTimeHook.funEnd=function(funKey){
  2378. if (!FunctionTimeHook.funPre[funKey])FunctionTimeHook.funPre[funKey]=0;
  2379. FunctionTimeHook.counter.add(funKey,Browser.now()-FunctionTimeHook.funPre[funKey]);
  2380. }
  2381. FunctionTimeHook.fresh=function(){
  2382. FunctionTimeHook.funEnd("TotalSign");
  2383. FunctionTimeHook.counter.record();
  2384. FunctionTimeHook.funBegin("TotalSign");
  2385. }
  2386. FunctionTimeHook.HookID=1;
  2387. FunctionTimeHook.funPre={};
  2388. FunctionTimeHook.TotalSign="TotalSign";
  2389. __static(FunctionTimeHook,
  2390. ['counter',function(){return this.counter=new CountTool();}
  2391. ]);
  2392. return FunctionTimeHook;
  2393. })()
  2394. /**
  2395. *一些字符串操作函数
  2396. *@author ww
  2397. *
  2398. */
  2399. //class laya.debug.tools.StringTool
  2400. var StringTool=(function(){
  2401. function StringTool(){}
  2402. __class(StringTool,'laya.debug.tools.StringTool');
  2403. StringTool.toUpCase=function(str){
  2404. return str.toUpperCase();
  2405. }
  2406. StringTool.toLowCase=function(str){
  2407. return str.toLowerCase();
  2408. }
  2409. StringTool.toUpHead=function(str){
  2410. var rst;
  2411. if(str.length<=1)return str.toUpperCase();
  2412. rst=str.charAt(0).toUpperCase()+str.substr(1);
  2413. return rst;
  2414. }
  2415. StringTool.toLowHead=function(str){
  2416. var rst;
  2417. if(str.length<=1)return str.toLowerCase();
  2418. rst=str.charAt(0).toLowerCase()+str.substr(1);
  2419. return rst;
  2420. }
  2421. StringTool.packageToFolderPath=function(packageName){
  2422. var rst;
  2423. rst=packageName.replace(".","/");
  2424. return rst;
  2425. }
  2426. StringTool.insert=function(str,iStr,index){
  2427. return str.substring(0,index)+iStr+str.substr(index);
  2428. }
  2429. StringTool.insertAfter=function(str,iStr,tarStr,isLast){
  2430. (isLast===void 0)&& (isLast=false);
  2431. var i=0;
  2432. if(isLast){
  2433. i=str.lastIndexOf(tarStr);
  2434. }else{
  2435. i=str.indexOf(tarStr);
  2436. }
  2437. if(i>=0){
  2438. return StringTool.insert(str,iStr,i+tarStr.length);
  2439. }
  2440. return str;
  2441. }
  2442. StringTool.insertBefore=function(str,iStr,tarStr,isLast){
  2443. (isLast===void 0)&& (isLast=false);
  2444. var i=0;
  2445. if(isLast){
  2446. i=str.lastIndexOf(tarStr);
  2447. }else{
  2448. i=str.indexOf(tarStr);
  2449. }
  2450. if(i>=0){
  2451. return StringTool.insert(str,iStr,i);
  2452. }
  2453. return str;
  2454. }
  2455. StringTool.insertParamToFun=function(funStr,params){
  2456. var oldParam;
  2457. oldParam=StringTool.getParamArr(funStr);
  2458. var inserStr;
  2459. inserStr=params.join(",");
  2460. if(oldParam.length>0){
  2461. inserStr=","+inserStr;
  2462. }
  2463. return StringTool.insertBefore(funStr,inserStr,")",true);
  2464. }
  2465. StringTool.trim=function(str,vList){
  2466. if(!vList){
  2467. vList=[" ","\r","\n","\t",String.fromCharCode(65279)];
  2468. };
  2469. var rst;
  2470. var i=0;
  2471. var len=0;
  2472. rst=str;
  2473. len=vList.length;
  2474. for(i=0;i<len;i++){
  2475. rst=StringTool.getReplace(rst,vList[i],"");
  2476. }
  2477. return rst;
  2478. }
  2479. StringTool.isEmpty=function(str){
  2480. if(str.length<1)return true;
  2481. return StringTool.emptyStrDic.hasOwnProperty(str);
  2482. }
  2483. StringTool.trimLeft=function(str){
  2484. var i=0;
  2485. i=0;
  2486. var len=0;
  2487. len=str.length;
  2488. while(StringTool.isEmpty(str.charAt(i))&&i<len){
  2489. i++;
  2490. }
  2491. if(i<len){
  2492. return str.substr(i);
  2493. }
  2494. return "";
  2495. }
  2496. StringTool.trimRight=function(str){
  2497. var i=0;
  2498. i=str.length-1;
  2499. while(StringTool.isEmpty(str.charAt(i))&&i>=0){
  2500. i--;
  2501. };
  2502. var rst;
  2503. rst=str.substring(0,i)
  2504. if(i>=0){
  2505. return str.substring(0,i+1);
  2506. }
  2507. return "";
  2508. }
  2509. StringTool.trimSide=function(str){
  2510. var rst;
  2511. rst=StringTool.trimLeft(str);
  2512. rst=StringTool.trimRight(rst);
  2513. return rst;
  2514. }
  2515. StringTool.isOkFileName=function(fileName){
  2516. if(laya.debug.tools.StringTool.trimSide(fileName)=="")return false;
  2517. var i=0,len=0;
  2518. len=fileName.length;
  2519. for(i=0;i<len;i++){
  2520. if(StringTool.specialChars[fileName.charAt(i)])return false;
  2521. }
  2522. return true;
  2523. }
  2524. StringTool.trimButEmpty=function(str){
  2525. return StringTool.trim(str,["\r","\n","\t"]);
  2526. }
  2527. StringTool.removeEmptyStr=function(strArr){
  2528. var i=0;
  2529. i=strArr.length-1;
  2530. var str;
  2531. for(i=i;i>=0;i--){
  2532. str=strArr[i];
  2533. str=laya.debug.tools.StringTool.trimSide(str);
  2534. if(StringTool.isEmpty(str)){
  2535. strArr.splice(i,1);
  2536. }else{
  2537. strArr[i]=str;
  2538. }
  2539. }
  2540. return strArr;
  2541. }
  2542. StringTool.ifNoAddToTail=function(str,sign){
  2543. if(str.indexOf(sign)>=0){
  2544. return str;
  2545. }
  2546. return str+sign;
  2547. }
  2548. StringTool.trimEmptyLine=function(str){
  2549. var i=0;
  2550. var len=0;
  2551. var tLines;
  2552. var tLine;
  2553. tLines=str.split("\n");
  2554. for(i=tLines.length-1;i>=0;i--){
  2555. tLine=tLines[i];
  2556. if(StringTool.isEmptyLine(tLine)){
  2557. tLines.splice(i,1);
  2558. }
  2559. }
  2560. return tLines.join("\n");
  2561. }
  2562. StringTool.isEmptyLine=function(str){
  2563. str=laya.debug.tools.StringTool.trim(str);
  2564. if(str=="")return true;
  2565. return false;
  2566. }
  2567. StringTool.removeCommentLine=function(lines){
  2568. var rst;
  2569. rst=[];
  2570. var i=0;
  2571. var tLine;
  2572. var adptLine;
  2573. i=0;
  2574. var len=0;
  2575. var index=0;
  2576. len=lines.length;
  2577. while(i<len){
  2578. adptLine=tLine=lines[i];
  2579. index=tLine.indexOf("/**");
  2580. if(index>=0){
  2581. adptLine=tLine.substring(0,index-1);
  2582. StringTool.addIfNotEmpty(rst,adptLine);
  2583. while(i<len){
  2584. tLine=lines[i];
  2585. index=tLine.indexOf("*/");
  2586. if(index>=0){
  2587. adptLine=tLine.substring(index+2);
  2588. StringTool.addIfNotEmpty(rst,adptLine);
  2589. break ;
  2590. }
  2591. i++;
  2592. }
  2593. }else if(tLine.indexOf("//")>=0){
  2594. if(laya.debug.tools.StringTool.trim(tLine).indexOf("//")==0){
  2595. }else{
  2596. StringTool.addIfNotEmpty(rst,adptLine);
  2597. }
  2598. }else{
  2599. StringTool.addIfNotEmpty(rst,adptLine);
  2600. }
  2601. i++;
  2602. }
  2603. return rst;
  2604. }
  2605. StringTool.addIfNotEmpty=function(arr,str){
  2606. if(!str)return;
  2607. var tStr;
  2608. tStr=StringTool.trim(str);
  2609. if(tStr!=""){
  2610. arr.push(str);
  2611. }
  2612. }
  2613. StringTool.trimExt=function(str,vars){
  2614. var rst;
  2615. rst=StringTool.trim(str);
  2616. var i=0;
  2617. var len=0;
  2618. len=vars.length;
  2619. for(i=0;i<len;i++){
  2620. rst=StringTool.getReplace(rst,vars[i],"");
  2621. }
  2622. return rst;
  2623. }
  2624. StringTool.getBetween=function(str,left,right,ifMax){
  2625. (ifMax===void 0)&& (ifMax=false);
  2626. if(!str)return "";
  2627. if(!left)return "";
  2628. if(!right)return "";
  2629. var lId=0;
  2630. var rId=0;
  2631. lId=str.indexOf(left);
  2632. if(lId<0)return"";
  2633. if(ifMax){
  2634. rId=str.lastIndexOf(right);
  2635. if(rId<lId)return "";
  2636. }else{
  2637. rId=str.indexOf(right,lId+1);
  2638. }
  2639. if(rId<0)return "";
  2640. return str.substring(lId+left.length,rId);
  2641. }
  2642. StringTool.getSplitLine=function(line,split){
  2643. (split===void 0)&& (split=" ");
  2644. return line.split(split);
  2645. }
  2646. StringTool.getLeft=function(str,sign){
  2647. var i=0;
  2648. i=str.indexOf(sign);
  2649. return str.substr(0,i);
  2650. }
  2651. StringTool.getRight=function(str,sign){
  2652. var i=0;
  2653. i=str.indexOf(sign);
  2654. return str.substr(i+1);
  2655. }
  2656. StringTool.delelteItem=function(arr){
  2657. while (arr.length>0){
  2658. if(arr[0]==""){
  2659. arr.shift();
  2660. }else{
  2661. break ;
  2662. }
  2663. }
  2664. }
  2665. StringTool.getWords=function(line){
  2666. var rst=StringTool.getSplitLine(line);
  2667. StringTool.delelteItem(rst);
  2668. return rst;
  2669. }
  2670. StringTool.getLinesI=function(startLine,endLine,lines){
  2671. var i=0;
  2672. var rst=[];
  2673. for(i=startLine;i<=endLine;i++){
  2674. rst.push(lines[i]);
  2675. }
  2676. return rst;
  2677. }
  2678. StringTool.structfy=function(str,inWidth,removeEmpty){
  2679. (inWidth===void 0)&& (inWidth=4);
  2680. (removeEmpty===void 0)&& (removeEmpty=true);
  2681. if(removeEmpty){
  2682. str=laya.debug.tools.StringTool.trimEmptyLine(str);
  2683. };
  2684. var lines;
  2685. var tIn=0;
  2686. tIn=0;
  2687. var tInStr;
  2688. tInStr=StringTool.getEmptyStr(0);
  2689. lines=str.split("\n");
  2690. var i=0;
  2691. var len=0;
  2692. var tLineStr;
  2693. len=lines.length;
  2694. for(i=0;i<len;i++){
  2695. tLineStr=lines[i];
  2696. tLineStr=laya.debug.tools.StringTool.trimLeft(tLineStr);
  2697. tLineStr=laya.debug.tools.StringTool.trimRight(tLineStr);
  2698. tIn+=StringTool.getPariCount(tLineStr);
  2699. if(tLineStr.indexOf("}")>=0){
  2700. tInStr=StringTool.getEmptyStr(tIn*inWidth);
  2701. }
  2702. tLineStr=tInStr+tLineStr;
  2703. lines[i]=tLineStr;
  2704. tInStr=StringTool.getEmptyStr(tIn*inWidth);
  2705. }
  2706. return lines.join("\n");
  2707. }
  2708. StringTool.getEmptyStr=function(width){
  2709. if(!StringTool.emptyDic.hasOwnProperty(width)){
  2710. var i=0;
  2711. var len=0;
  2712. len=width;
  2713. var rst;
  2714. rst="";
  2715. for(i=0;i<len;i++){
  2716. rst+=" ";
  2717. }
  2718. StringTool.emptyDic[width]=rst;
  2719. }
  2720. return StringTool.emptyDic[width];
  2721. }
  2722. StringTool.getPariCount=function(str,inChar,outChar){
  2723. (inChar===void 0)&& (inChar="{");
  2724. (outChar===void 0)&& (outChar="}");
  2725. var varDic;
  2726. varDic={};
  2727. varDic[inChar]=1;
  2728. varDic[outChar]=-1;
  2729. var i=0;
  2730. var len=0;
  2731. var tChar;
  2732. len=str.length;
  2733. var rst=0;
  2734. rst=0;
  2735. for(i=0;i<len;i++){
  2736. tChar=str.charAt(i);
  2737. if(varDic.hasOwnProperty(tChar)){
  2738. rst+=varDic[tChar];
  2739. }
  2740. }
  2741. return rst;
  2742. }
  2743. StringTool.readInt=function(str,startI){
  2744. (startI===void 0)&& (startI=0);
  2745. var rst=NaN;
  2746. rst=0;
  2747. var tNum=0;
  2748. var tC;
  2749. var i=0;
  2750. var isBegin=false;
  2751. isBegin=false;
  2752. var len=0;
  2753. len=str.length;
  2754. for(i=startI;i<len;i++){
  2755. tC=str.charAt(i);
  2756. if(Number(tC)>0||tC=="0"){
  2757. rst=10*rst+Number(tC);
  2758. if(rst>0)isBegin=true;
  2759. }else{
  2760. if(isBegin)return rst;
  2761. }
  2762. }
  2763. return rst;
  2764. }
  2765. StringTool.getReplace=function(str,oStr,nStr){
  2766. if(!str)return "";
  2767. var rst;
  2768. rst=str.replace(new RegExp(oStr,"g"),nStr);
  2769. return rst;
  2770. }
  2771. StringTool.getWordCount=function(str,findWord){
  2772. var rg=new RegExp(findWord,"g")
  2773. return str.match(rg).length;
  2774. }
  2775. StringTool.getResolvePath=function(path,basePath){
  2776. if(StringTool.isAbsPath(path)){
  2777. return path;
  2778. };
  2779. var tSign;
  2780. tSign="\\";
  2781. if(basePath.indexOf("/")>=0){
  2782. tSign="/";
  2783. }
  2784. if(basePath.charAt(basePath.length-1)==tSign){
  2785. basePath=basePath.substr(0,basePath.length-1);
  2786. };
  2787. var parentSign;
  2788. parentSign=".."+tSign;
  2789. var tISign;
  2790. tISign="."+tSign;
  2791. var pCount=0;
  2792. pCount=StringTool.getWordCount(path,parentSign);
  2793. path=laya.debug.tools.StringTool.getReplace(path,parentSign,"");
  2794. path=laya.debug.tools.StringTool.getReplace(path,tISign,"");
  2795. var i=0;
  2796. var len=0;
  2797. len=pCount;
  2798. var iPos=0;
  2799. for(i=0;i<len;i++){
  2800. basePath=StringTool.removeLastSign(path,tSign);
  2801. }
  2802. return basePath+tSign+path;
  2803. }
  2804. StringTool.isAbsPath=function(path){
  2805. if(path.indexOf(":")>=0)return true;
  2806. return false;
  2807. }
  2808. StringTool.removeLastSign=function(str,sign){
  2809. var iPos=0;
  2810. iPos=str.lastIndexOf(sign);
  2811. str=str.substring(0,iPos);
  2812. return str;
  2813. }
  2814. StringTool.getParamArr=function(str){
  2815. var paramStr;
  2816. paramStr=laya.debug.tools.StringTool.getBetween(str,"(",")",true);
  2817. if(StringTool.trim(paramStr).length<1)return [];
  2818. return paramStr.split(",");
  2819. }
  2820. StringTool.copyStr=function(str){
  2821. return str.substring();
  2822. }
  2823. StringTool.ArrayToString=function(arr){
  2824. var rst;
  2825. rst="[{items}]".replace(new RegExp("\\{items\\}","g"),StringTool.getArrayItems(arr));
  2826. return rst;
  2827. }
  2828. StringTool.getArrayItems=function(arr){
  2829. var rst;
  2830. if(arr.length<1)return "";
  2831. rst=StringTool.parseItem(arr[0]);
  2832. var i=0;
  2833. var len=0;
  2834. len=arr.length;
  2835. for(i=1;i<len;i++){
  2836. rst+=","+StringTool.parseItem(arr[i]);
  2837. }
  2838. return rst;
  2839. }
  2840. StringTool.parseItem=function(item){
  2841. var rst;
  2842. rst="\""+item+"\"";
  2843. return "";
  2844. }
  2845. StringTool.initAlphaSign=function(){
  2846. if (StringTool.alphaSigns)return;
  2847. StringTool.alphaSigns={};
  2848. StringTool.addSign("a","z",StringTool.alphaSigns);
  2849. StringTool.addSign("A","Z",StringTool.alphaSigns);
  2850. StringTool.addSign("0","9",StringTool.alphaSigns);
  2851. }
  2852. StringTool.addSign=function(ss,e,tar){
  2853. var i=0;
  2854. var len=0;
  2855. var s=0;
  2856. s=ss.charCodeAt(0);
  2857. len=e.charCodeAt(0);
  2858. for(i=s;i<=len;i++){
  2859. tar[String.fromCharCode(i)]=true;
  2860. console.log("add :"+String.fromCharCode(i));
  2861. }
  2862. }
  2863. StringTool.isPureAlphaNum=function(str){
  2864. StringTool.initAlphaSign();
  2865. if (!str)return true;
  2866. var i=0,len=0;
  2867. len=str.length;
  2868. for (i=0;i < len;i++){
  2869. if (!StringTool.alphaSigns[str.charAt(i)])return false;
  2870. }
  2871. return true;
  2872. }
  2873. StringTool.emptyDic={};
  2874. StringTool.alphaSigns=null;
  2875. __static(StringTool,
  2876. ['emptyStrDic',function(){return this.emptyStrDic={
  2877. " ":true,
  2878. "\r":true,
  2879. "\n":true,
  2880. "\t":true
  2881. };},'specialChars',function(){return this.specialChars={"*":true,"&":true,"%":true,"#":true,"?":true};}
  2882. ]);
  2883. return StringTool;
  2884. })()
  2885. /**
  2886. *...
  2887. *@author ww
  2888. */
  2889. //class laya.debug.tools.ResTools
  2890. var ResTools=(function(){
  2891. function ResTools(){}
  2892. __class(ResTools,'laya.debug.tools.ResTools');
  2893. ResTools.getCachedResList=function(){
  2894. if (Render.isWebGL){
  2895. return ResTools.getWebGlResList();
  2896. }else{
  2897. return ResTools.getCanvasResList();
  2898. }
  2899. }
  2900. ResTools.getWebGlResList=function(){
  2901. var rst;
  2902. rst=[];
  2903. return rst;
  2904. }
  2905. ResTools.getCanvasResList=function(){
  2906. var picDic;
  2907. picDic={};
  2908. var dataO;
  2909. dataO=Loader.loadedMap;
  2910. ResTools.collectPics(dataO,picDic);
  2911. return ResTools.getArrFromDic(picDic);
  2912. }
  2913. ResTools.getArrFromDic=function(dic){
  2914. var key;
  2915. var rst;
  2916. rst=[];
  2917. for (key in dic){
  2918. rst.push(key);
  2919. }
  2920. return rst;
  2921. }
  2922. ResTools.collectPics=function(dataO,picDic){
  2923. if (!dataO)return;
  2924. var key;
  2925. var tTexture;
  2926. for (key in dataO){
  2927. tTexture=dataO[key];
  2928. if (tTexture){
  2929. if (tTexture.bitmap&&tTexture.bitmap.src){
  2930. var url=tTexture.bitmap.src;
  2931. if(url.indexOf("data:image/png;base64")<0)
  2932. picDic[tTexture.bitmap.src]=true;
  2933. }
  2934. }
  2935. }
  2936. }
  2937. return ResTools;
  2938. })()
  2939. /**
  2940. *
  2941. *@author ww
  2942. *@version 1.0
  2943. *
  2944. *@created 2015-9-24 下午3:00:38
  2945. */
  2946. //class laya.debug.DebugTool
  2947. var DebugTool=(function(){
  2948. function DebugTool(){}
  2949. __class(DebugTool,'laya.debug.DebugTool');
  2950. __getset(1,DebugTool,'target',function(){
  2951. return DebugTool._target;
  2952. },function(v){
  2953. DebugTool._target=v;
  2954. });
  2955. __getset(1,DebugTool,'isThisShow',function(){
  2956. return false;
  2957. });
  2958. /**
  2959. *设置是否显示帧率信息
  2960. *@param value 是否显示true|false
  2961. */
  2962. __getset(1,DebugTool,'showStatu',null,function(value){
  2963. if (value){
  2964. Stat.show();
  2965. }
  2966. else {
  2967. Stat.hide();
  2968. DebugTool.clearDebugLayer();
  2969. }
  2970. });
  2971. /**
  2972. *是否自动显示点击对象的边框
  2973. *@param value
  2974. */
  2975. __getset(1,DebugTool,'showBound',function(){
  2976. return DebugTool._showBound;
  2977. },function(value){
  2978. DebugTool._showBound=value;
  2979. if (!DebugTool._showBound){
  2980. DebugTool.clearDebugLayer();
  2981. }
  2982. });
  2983. DebugTool.getMenuShowEvent=function(){
  2984. if (Browser.onMobile){
  2985. return /*laya.events.Event.DOUBLE_CLICK*/"doubleclick";
  2986. }
  2987. else {
  2988. return /*laya.events.Event.RIGHT_CLICK*/"rightclick";
  2989. }
  2990. }
  2991. DebugTool.initBasicFunctions=function(){
  2992. DisplayHook.initMe();
  2993. if (!DebugTool.debugLayer){
  2994. DebugInfoLayer.init();
  2995. DebugTool.debugLayer=DebugInfoLayer.I.graphicLayer;
  2996. DebugTool.debugLayer.mouseEnabled=false;
  2997. DebugTool.debugLayer.mouseThrough=true;
  2998. DebugTool.showStatu=true;
  2999. Laya.stage.on(/*laya.events.Event.KEY_DOWN*/"keydown",null,DebugTool.keyHandler);
  3000. DebugExport.export();
  3001. }
  3002. }
  3003. DebugTool.dTrace=function(str){
  3004. if (DebugTool._traceFun !=null){
  3005. DebugTool._traceFun(str);
  3006. }
  3007. console.log(str);
  3008. }
  3009. DebugTool.keyHandler=function(e){
  3010. var key;
  3011. key=String.fromCharCode(e.keyCode);
  3012. if (!e.altKey)
  3013. return;
  3014. switch (e.keyCode){
  3015. case 38:
  3016. DebugTool.showParent();
  3017. break ;
  3018. case 40:
  3019. DebugTool.showChild();
  3020. break ;
  3021. case 37:
  3022. DebugTool.showBrother(DebugTool.target,1);
  3023. break ;
  3024. case 39:
  3025. DebugTool.showBrother(DebugTool.target,-1);
  3026. break ;
  3027. }
  3028. DebugTool.dealCMDKey(key);
  3029. }
  3030. DebugTool.dealCMDKey=function(key){
  3031. switch (key){
  3032. case "上":
  3033. DebugTool.showParent();
  3034. break ;
  3035. case "下":
  3036. DebugTool.showChild();
  3037. break ;
  3038. case "左":
  3039. DebugTool.showBrother(DebugTool.target,1);
  3040. break ;
  3041. case "右":
  3042. DebugTool.showBrother(DebugTool.target,-1);
  3043. break ;
  3044. case "B":
  3045. DebugTool.showAllBrother();
  3046. break ;
  3047. case "C":
  3048. DebugTool.showAllChild();
  3049. break ;
  3050. case "E":
  3051. DebugTool.traceDisMouseEnable();
  3052. break ;
  3053. case "S":
  3054. DebugTool.traceDisSizeChain();
  3055. break ;
  3056. case "D":
  3057. DisControlTool.downDis(DebugTool.target);
  3058. break ;
  3059. case "U":
  3060. DisControlTool.upDis(DebugTool.target);
  3061. break ;
  3062. case "N":
  3063. DebugTool.getNodeInfo();
  3064. break ;
  3065. case "M":
  3066. DebugTool.showAllUnderMosue();
  3067. break ;
  3068. case "I":
  3069. break ;
  3070. case "O":
  3071. break ;
  3072. case "L":
  3073. DisController.I.switchType();
  3074. break ;
  3075. case "Q":
  3076. DebugTool.showNodeInfo();
  3077. break ;
  3078. case "F":
  3079. DebugTool.showToolPanel();
  3080. break ;
  3081. case "P":
  3082. DebugTool.showToolFilter();
  3083. break ;
  3084. case "V":
  3085. DebugTool.selectNodeUnderMouse();
  3086. break ;
  3087. case "A":
  3088. break ;
  3089. case "K":
  3090. NodeUtils.traceStage();
  3091. break ;
  3092. case "T":
  3093. DebugTool.switchNodeTree();
  3094. break ;
  3095. case "R":
  3096. break ;
  3097. case "X":
  3098. break ;
  3099. case "mCMD":
  3100. DebugTool.traceCMD();
  3101. break ;
  3102. case "allCMD":
  3103. DebugTool.traceCMDR();
  3104. break ;
  3105. }
  3106. }
  3107. DebugTool.switchNodeTree=function(){}
  3108. DebugTool.analyseMouseHit=function(){
  3109. if (DebugTool.target)
  3110. MouseEventAnalyser.analyseNode(DebugTool.target);
  3111. }
  3112. DebugTool.selectNodeUnderMouse=function(){
  3113. DisplayHook.instance.selectDisUnderMouse();
  3114. DebugTool.showDisBound();
  3115. return;
  3116. }
  3117. DebugTool.showToolPanel=function(){}
  3118. DebugTool.showToolFilter=function(){}
  3119. DebugTool.showNodeInfo=function(){
  3120. if (NodeInfoPanel.I.isWorkState){
  3121. NodeInfoPanel.I.recoverNodes();
  3122. }
  3123. else {
  3124. NodeInfoPanel.I.showDisInfo(DebugTool.target);
  3125. }
  3126. }
  3127. DebugTool.switchDisController=function(){
  3128. if (DisController.I.target){
  3129. DisController.I.target=null;
  3130. }
  3131. else {
  3132. if (DebugTool.target){
  3133. DisController.I.target=DebugTool.target;
  3134. }
  3135. }
  3136. }
  3137. DebugTool.showParent=function(sprite){
  3138. if (!sprite)
  3139. sprite=DebugTool.target;
  3140. if (!sprite){
  3141. console.log("no targetAvalible");
  3142. return null;
  3143. }
  3144. DebugTool.target=sprite.parent;
  3145. DebugTool.autoWork();
  3146. }
  3147. DebugTool.showChild=function(sprite){
  3148. if (!sprite)
  3149. sprite=DebugTool.target;
  3150. if (!sprite){
  3151. console.log("no targetAvalible");
  3152. return null;
  3153. }
  3154. if (sprite.numChildren > 0){
  3155. DebugTool.target=sprite.getChildAt(0);
  3156. DebugTool.autoWork();
  3157. }
  3158. }
  3159. DebugTool.showAllChild=function(sprite){
  3160. if (!sprite)
  3161. sprite=DebugTool.target;
  3162. if (!sprite){
  3163. console.log("no targetAvalible");
  3164. return null;
  3165. }
  3166. DebugTool.selectedNodes=DisControlTool.getAllChild(sprite);
  3167. DebugTool.showSelected();
  3168. }
  3169. DebugTool.showAllUnderMosue=function(){
  3170. DebugTool.selectedNodes=DisControlTool.getObjectsUnderGlobalPoint(Laya.stage);
  3171. DebugTool.showSelected();
  3172. }
  3173. DebugTool.showParentChain=function(sprite){
  3174. if (!sprite)
  3175. return;
  3176. DebugTool.selectedNodes=[];
  3177. var tar;
  3178. tar=sprite.parent;
  3179. while (tar){
  3180. DebugTool.selectedNodes.push(tar);
  3181. tar=tar.parent;
  3182. }
  3183. DebugTool.showSelected();
  3184. }
  3185. DebugTool.showAllBrother=function(sprite){
  3186. if (!sprite)
  3187. sprite=DebugTool.target;
  3188. if (!sprite){
  3189. console.log("no targetAvalible");
  3190. return null;
  3191. }
  3192. if (!sprite.parent)
  3193. return;
  3194. DebugTool.selectedNodes=DisControlTool.getAllChild(sprite.parent);
  3195. DebugTool.showSelected();
  3196. }
  3197. DebugTool.showBrother=function(sprite,dID){
  3198. (dID===void 0)&& (dID=1);
  3199. if (!sprite)
  3200. sprite=DebugTool.target;
  3201. if (!sprite){
  3202. console.log("no targetAvalible");
  3203. return null;
  3204. };
  3205. var p;
  3206. p=sprite.parent;
  3207. if (!p)
  3208. return;
  3209. var n=0;
  3210. n=p.getChildIndex(sprite);
  3211. n+=dID;
  3212. if (n < 0)
  3213. n+=p.numChildren;
  3214. if (n >=p.numChildren)
  3215. n-=p.numChildren;
  3216. DebugTool.target=p.getChildAt(n);
  3217. DebugTool.autoWork();
  3218. }
  3219. DebugTool.clearDebugLayer=function(){
  3220. if (DebugTool.debugLayer.graphics)
  3221. DebugTool.debugLayer.graphics.clear();
  3222. }
  3223. DebugTool.showSelected=function(){
  3224. if (!DebugTool.autoShowSelected)
  3225. return;
  3226. if (!DebugTool.selectedNodes || DebugTool.selectedNodes.length < 1)
  3227. return;
  3228. console.log("selected:",DebugTool.selectedNodes);
  3229. var i=0;
  3230. var len=0;
  3231. len=DebugTool.selectedNodes.length;
  3232. DebugTool.clearDebugLayer();
  3233. for (i=0;i < len;i++){
  3234. DebugTool.showDisBound(DebugTool.selectedNodes[i],false);
  3235. }
  3236. }
  3237. DebugTool.getClassCreateInfo=function(className){
  3238. return RunProfile.getRunInfo(className);
  3239. }
  3240. DebugTool.autoWork=function(){
  3241. if (!DebugTool.isThisShow)
  3242. return;
  3243. if (DebugTool.showBound)
  3244. DebugTool.showDisBound();
  3245. if (DebugTool.autoTraceSpriteInfo && DebugTool.target){
  3246. TraceTool.traceSpriteInfo(DebugTool.target,DebugTool.autoTraceBounds,DebugTool.autoTraceSize,DebugTool.autoTraceTree);
  3247. }
  3248. if (!DebugTool.target)
  3249. return;
  3250. if (DebugTool.autoTraceCMD){
  3251. DebugTool.traceCMD();
  3252. }
  3253. if (DebugTool.autoTraceCMDR){
  3254. DebugTool.traceCMDR();
  3255. }
  3256. if (DebugTool.autoTraceEnable){
  3257. DebugTool.traceDisMouseEnable(DebugTool.target);
  3258. }
  3259. }
  3260. DebugTool.traceDisMouseEnable=function(tar){
  3261. console.log("----------------traceDisMouseEnable--------------------");
  3262. if (!tar)
  3263. tar=DebugTool.target;
  3264. if (!tar){
  3265. console.log("no targetAvalible");
  3266. return null;
  3267. };
  3268. var strArr;
  3269. strArr=[];
  3270. DebugTool.selectedNodes=[];
  3271. while (tar){
  3272. strArr.push(ClassTool.getNodeClassAndName(tar)+": mouseEnabled:"+tar.mouseEnabled+" hitFirst:"+tar.hitTestPrior);
  3273. DebugTool.selectedNodes.push(tar);
  3274. tar=tar.parent;
  3275. }
  3276. console.log(strArr.join("\n"));
  3277. DebugTool.showSelected();
  3278. return strArr.join("\n");
  3279. }
  3280. DebugTool.traceDisSizeChain=function(tar){
  3281. console.log("---------------------traceDisSizeChain-------------------");
  3282. if (!tar)
  3283. tar=DebugTool.target;
  3284. if (!tar){
  3285. console.log("no targetAvalible");
  3286. return null;
  3287. }
  3288. DebugTool.selectedNodes=[];
  3289. var strArr;
  3290. strArr=[];
  3291. while (tar){
  3292. strArr.push(ClassTool.getNodeClassAndName(tar)+": x:"+tar.x+" y:"+tar.y+" w:"+tar.width+" h:"+tar.height+" scaleX:"+tar.scaleX+" scaleY:"+tar.scaleY);
  3293. DebugTool.selectedNodes.push(tar);
  3294. tar=tar.parent;
  3295. }
  3296. console.log(strArr.join("\n"));
  3297. DebugTool.showSelected();
  3298. return strArr.join("\n");
  3299. }
  3300. DebugTool.showDisBound=function(sprite,clearPre,color){
  3301. (clearPre===void 0)&& (clearPre=true);
  3302. (color===void 0)&& (color="#ff0000");
  3303. if (!sprite)
  3304. sprite=DebugTool.target;
  3305. if (!sprite){
  3306. console.log("no targetAvalible");
  3307. return null;
  3308. }
  3309. if (clearPre)
  3310. DebugTool.clearDebugLayer();
  3311. var pointList;
  3312. pointList=sprite._getBoundPointsM(true);
  3313. if (!pointList || pointList.length < 1)
  3314. return;
  3315. pointList=GrahamScan.pListToPointList(pointList,true);
  3316. WalkTools.walkArr(pointList,sprite.localToGlobal,sprite);
  3317. pointList=GrahamScan.pointListToPlist(pointList);
  3318. DebugTool._disBoundRec=Rectangle._getWrapRec(pointList,DebugTool._disBoundRec);
  3319. DebugTool.debugLayer.graphics.drawRect(DebugTool._disBoundRec.x,DebugTool._disBoundRec.y,DebugTool._disBoundRec.width,DebugTool._disBoundRec.height,null,color);
  3320. DebugInfoLayer.I.setTop();
  3321. }
  3322. DebugTool.showDisBoundToSprite=function(sprite,graphicSprite,color,lineWidth){
  3323. (color===void 0)&& (color="#ff0000");
  3324. (lineWidth===void 0)&& (lineWidth=1);
  3325. var pointList;
  3326. pointList=sprite._getBoundPointsM(true);
  3327. if (!pointList || pointList.length < 1)
  3328. return;
  3329. pointList=GrahamScan.pListToPointList(pointList,true);
  3330. WalkTools.walkArr(pointList,sprite.localToGlobal,sprite);
  3331. pointList=GrahamScan.pointListToPlist(pointList);
  3332. DebugTool._disBoundRec=Rectangle._getWrapRec(pointList,DebugTool._disBoundRec);
  3333. graphicSprite.graphics.drawRect(DebugTool._disBoundRec.x,DebugTool._disBoundRec.y,DebugTool._disBoundRec.width,DebugTool._disBoundRec.height,null,color,lineWidth);
  3334. }
  3335. DebugTool.getNodeInfo=function(){
  3336. DebugTool.counter.reset();
  3337. WalkTools.walkTarget(Laya.stage,DebugTool.addNodeInfo);
  3338. console.log("node info:");
  3339. DebugTool.counter.traceSelf();
  3340. return DebugTool.counter.data;
  3341. }
  3342. DebugTool.findByClass=function(className){
  3343. DebugTool._classList=[];
  3344. DebugTool._tFindClass=className;
  3345. WalkTools.walkTarget(Laya.stage,DebugTool.addClassNode);
  3346. DebugTool.selectedNodes=DebugTool._classList;
  3347. DebugTool.showSelected();
  3348. return DebugTool._classList;
  3349. }
  3350. DebugTool.addClassNode=function(node){
  3351. var type;
  3352. type=node["constructor"].name;
  3353. if (type==DebugTool._tFindClass){
  3354. DebugTool._classList.push(node);
  3355. }
  3356. }
  3357. DebugTool.traceCMD=function(sprite){
  3358. if (!sprite)
  3359. sprite=DebugTool.target;
  3360. if (!sprite){
  3361. console.log("no targetAvalible");
  3362. return null;
  3363. }
  3364. console.log("self CMDs:");
  3365. console.log(sprite.graphics.cmds);
  3366. var renderSprite;
  3367. renderSprite=RenderSprite.renders[sprite._renderType];
  3368. console.log("renderSprite:",renderSprite);
  3369. DebugTool._rSpList.length=0;
  3370. while (renderSprite && renderSprite["_sign"] > 0){
  3371. DebugTool._rSpList.push(DebugTool.cmdToTypeO[renderSprite["_sign"]]);
  3372. renderSprite=renderSprite._next;
  3373. }
  3374. console.log("fun:",DebugTool._rSpList.join(","));
  3375. DebugTool.counter.reset();
  3376. DebugTool.addCMDs(sprite.graphics.cmds);
  3377. DebugTool.counter.traceSelf();
  3378. return DebugTool.counter.data;
  3379. }
  3380. DebugTool.addCMDs=function(cmds){
  3381. WalkTools.walkArr(cmds,DebugTool.addCMD);
  3382. }
  3383. DebugTool.addCMD=function(cmd){
  3384. DebugTool.counter.add(cmd.callee);
  3385. }
  3386. DebugTool.traceCMDR=function(sprite){
  3387. if (!sprite)
  3388. sprite=DebugTool.target;
  3389. if (!sprite){
  3390. console.log("no targetAvalible");
  3391. return 0;
  3392. }
  3393. DebugTool.counter.reset();
  3394. WalkTools.walkTarget(sprite,DebugTool.getCMdCount);
  3395. console.log("cmds include children");
  3396. DebugTool.counter.traceSelf();
  3397. return DebugTool.counter.data;
  3398. }
  3399. DebugTool.getCMdCount=function(target){
  3400. if (!target)
  3401. return 0;
  3402. if (! (target instanceof laya.display.Sprite ))
  3403. return 0;
  3404. if (!target.graphics.cmds)
  3405. return 0;
  3406. DebugTool.addCMDs(target.graphics.cmds);
  3407. var rst=target.graphics.cmds.length;
  3408. return rst;
  3409. }
  3410. DebugTool.addNodeInfo=function(node){
  3411. var type;
  3412. type=node["constructor"].name;
  3413. DebugTool.counter.add(type);
  3414. }
  3415. DebugTool.find=function(filter,ifShowSelected){
  3416. (ifShowSelected===void 0)&& (ifShowSelected=true);
  3417. var rst;
  3418. rst=DebugTool.findTarget(Laya.stage,filter);
  3419. DebugTool.selectedNodes=rst;
  3420. if (DebugTool.selectedNodes){
  3421. DebugTool.target=DebugTool.selectedNodes[0];
  3422. }
  3423. if (ifShowSelected)
  3424. DebugTool.showSelected();
  3425. return rst;
  3426. }
  3427. DebugTool.findByName=function(name){
  3428. DebugTool.nameFilter.name=name;
  3429. return DebugTool.find(DebugTool.nameFilter);
  3430. }
  3431. DebugTool.findNameStartWith=function(startStr){
  3432. DebugTool.nameFilter.name=DebugTool.getStartWithFun(startStr);
  3433. return DebugTool.find(DebugTool.nameFilter);
  3434. }
  3435. DebugTool.findNameHas=function(hasStr,showSelected){
  3436. (showSelected===void 0)&& (showSelected=true);
  3437. DebugTool.nameFilter.name=DebugTool.getHasFun(hasStr);
  3438. return DebugTool.find(DebugTool.nameFilter,showSelected);
  3439. }
  3440. DebugTool.getStartWithFun=function(startStr){
  3441. var rst=function (str){
  3442. if (!str)
  3443. return false;
  3444. if (str.indexOf(startStr)==0)
  3445. return true;
  3446. return false;
  3447. };
  3448. return rst;
  3449. }
  3450. DebugTool.getHasFun=function(hasStr){
  3451. var rst=function (str){
  3452. if (!str)
  3453. return false;
  3454. if (str.indexOf(hasStr)>=0)
  3455. return true;
  3456. return false;
  3457. };
  3458. return rst;
  3459. }
  3460. DebugTool.findTarget=function(target,filter){
  3461. var rst=[];
  3462. if (DebugTool.isFit(target,filter))
  3463. rst.push(target);
  3464. var i=0;
  3465. var len=0;
  3466. var tChild;
  3467. len=target.numChildren;
  3468. for (i=0;i < len;i++){
  3469. tChild=target.getChildAt(i);
  3470. if ((tChild instanceof laya.display.Sprite )){
  3471. rst=rst.concat(DebugTool.findTarget(tChild,filter));
  3472. }
  3473. }
  3474. return rst;
  3475. }
  3476. DebugTool.findClassHas=function(target,str){
  3477. var rst=[];
  3478. if (ClassTool.getClassName(target).indexOf(str)>=0)
  3479. rst.push(target);
  3480. var i=0;
  3481. var len=0;
  3482. var tChild;
  3483. len=target.numChildren;
  3484. for (i=0;i < len;i++){
  3485. tChild=target.getChildAt(i);
  3486. if ((tChild instanceof laya.display.Sprite )){
  3487. rst=rst.concat(DebugTool.findClassHas(tChild,str));
  3488. }
  3489. }
  3490. return rst;
  3491. }
  3492. DebugTool.isFit=function(tar,filter){
  3493. if (!tar)
  3494. return false;
  3495. if (!filter)
  3496. return true;
  3497. if ((typeof filter=='function')){
  3498. return (filter)(tar);
  3499. };
  3500. var key;
  3501. for (key in filter){
  3502. if ((typeof (filter[key])=='function')){
  3503. if (!filter[key](tar[key]))
  3504. return false;
  3505. }
  3506. else {
  3507. if (tar[key] !=filter[key])
  3508. return false;
  3509. }
  3510. }
  3511. return true;
  3512. }
  3513. DebugTool.log=function(__args){
  3514. var args=arguments;
  3515. var arr;
  3516. arr=DTrace.getArgArr(args);
  3517. if (DebugTool._logFun !=null){
  3518. DebugTool._logFun(arr.join(" "));
  3519. }
  3520. }
  3521. DebugTool.enableCacheAnalyse=false;
  3522. DebugTool.enableNodeCreateAnalyse=true;
  3523. DebugTool._traceFun=null;
  3524. DebugTool.debugLayer=null;
  3525. DebugTool._target=null;
  3526. DebugTool.selectedNodes=[];
  3527. DebugTool.autoShowSelected=true;
  3528. DebugTool._showBound=true;
  3529. DebugTool._disBoundRec=null;
  3530. DebugTool.autoTraceEnable=false;
  3531. DebugTool.autoTraceBounds=false;
  3532. DebugTool.autoTraceSize=false;
  3533. DebugTool.autoTraceTree=true;
  3534. DebugTool.autoTraceCMD=true;
  3535. DebugTool.autoTraceCMDR=false;
  3536. DebugTool.autoTraceSpriteInfo=true;
  3537. DebugTool._classList=null;
  3538. DebugTool._tFindClass=null;
  3539. DebugTool._rSpList=[];
  3540. DebugTool._logFun=null;
  3541. __static(DebugTool,
  3542. ['text',function(){return this.text=new Stat();},'cmdToTypeO',function(){return this.cmdToTypeO={
  3543. };},'counter',function(){return this.counter=new CountTool();},'nameFilter',function(){return this.nameFilter={"name":"name"};}
  3544. ]);
  3545. return DebugTool;
  3546. })()
  3547. /**
  3548. *...
  3549. *@author ww
  3550. */
  3551. //class laya.debug.tools.ColorTool
  3552. var ColorTool=(function(){
  3553. function ColorTool(){
  3554. this.red=NaN;
  3555. this.green=NaN;
  3556. this.blue=NaN;
  3557. }
  3558. __class(ColorTool,'laya.debug.tools.ColorTool');
  3559. ColorTool.toHexColor=function(color){
  3560. return Utils.toHexColor(color);
  3561. }
  3562. ColorTool.getRGBByRGBStr=function(str){
  3563. str.charAt(0)=='#' && (str=str.substr(1));
  3564. var color=/*__JS__ */parseInt(str,16);
  3565. var flag=(str.length==8);
  3566. var _color;
  3567. _color=[((0x00FF0000 & color)>> 16),((0x0000FF00 & color)>> 8),(0x000000FF & color)];
  3568. return _color;
  3569. }
  3570. ColorTool.getColorBit=function(value){
  3571. var rst;
  3572. rst=Math.floor(value).toString(16);
  3573. rst=rst.length > 1 ? rst :"0"+rst;
  3574. return rst;
  3575. }
  3576. ColorTool.getRGBStr=function(rgb,coefficient){
  3577. (coefficient===void 0)&& (coefficient=1);
  3578. return "#"+ColorTool.getColorBit(rgb[0] *coefficient)+ColorTool.getColorBit(rgb[1] *coefficient)+ColorTool.getColorBit(rgb[2] *coefficient);
  3579. }
  3580. ColorTool.traseHSB=function(hsb){
  3581. console.log("hsb:",hsb[0],hsb[1],hsb[2]);
  3582. }
  3583. ColorTool.rgb2hsb=function(rgbR,rgbG,rgbB){
  3584. var rgb=[rgbR,rgbG,rgbB];
  3585. rgb.sort(MathTools.sortNumSmallFirst);
  3586. var max=rgb[2];
  3587. var min=rgb[0];
  3588. var hsbB=max / 255.0;
  3589. var hsbS=max==0 ? 0 :(max-min)/ max;
  3590. var hsbH=0;
  3591. if(max==min){
  3592. hsbH=1;
  3593. }
  3594. else
  3595. if (rgbR==0 && rgbG==0&&rgbB==0){
  3596. }else
  3597. if (max==rgbR && rgbG >=rgbB){
  3598. hsbH=(rgbG-rgbB)*60 / (max-min)+0;
  3599. }
  3600. else if (max==rgbR && rgbG < rgbB){
  3601. hsbH=(rgbG-rgbB)*60 / (max-min)+360;
  3602. }
  3603. else if (max==rgbG){
  3604. hsbH=(rgbB-rgbR)*60 / (max-min)+120;
  3605. }
  3606. else if (max==rgbB){
  3607. hsbH=(rgbR-rgbG)*60 / (max-min)+240;
  3608. }
  3609. return [hsbH,hsbS,hsbB];
  3610. }
  3611. ColorTool.hsb2rgb=function(h,s,v){
  3612. var r=0,g=0,b=0;
  3613. var i=Math.floor((h / 60)% 6);
  3614. var f=(h / 60)-i;
  3615. var p=v *(1-s);
  3616. var q=v *(1-f *s);
  3617. var t=v *(1-(1-f)*s);
  3618. switch (i){
  3619. case 0:
  3620. r=v;
  3621. g=t;
  3622. b=p;
  3623. break ;
  3624. case 1:
  3625. r=q;
  3626. g=v;
  3627. b=p;
  3628. break ;
  3629. case 2:
  3630. r=p;
  3631. g=v;
  3632. b=t;
  3633. break ;
  3634. case 3:
  3635. r=p;
  3636. g=q;
  3637. b=v;
  3638. break ;
  3639. case 4:
  3640. r=t;
  3641. g=p;
  3642. b=v;
  3643. break ;
  3644. case 5:
  3645. r=v;
  3646. g=p;
  3647. b=q;
  3648. break ;
  3649. default :
  3650. break ;
  3651. }
  3652. return [Math.floor(r *255.0),Math.floor(g *255.0),Math.floor(b *255.0)];
  3653. }
  3654. return ColorTool;
  3655. })()
  3656. /**
  3657. *
  3658. *@author ww
  3659. *@version 1.0
  3660. *
  3661. *@created 2015-12-23 下午12:00:48
  3662. */
  3663. //class laya.debug.tools.RecInfo
  3664. var RecInfo=(function(){
  3665. function RecInfo(){
  3666. this.oX=0;
  3667. this.oY=0;
  3668. this.hX=1;
  3669. this.hY=0;
  3670. this.vX=0;
  3671. this.vY=1;
  3672. }
  3673. __class(RecInfo,'laya.debug.tools.RecInfo');
  3674. var __proto=RecInfo.prototype;
  3675. __proto.initByPoints=function(oPoint,ePoint,vPoint){
  3676. this.oX=oPoint.x;
  3677. this.oY=oPoint.y;
  3678. this.hX=ePoint.x;
  3679. this.hY=ePoint.y;
  3680. this.vX=vPoint.x;
  3681. this.vY=vPoint.y;
  3682. }
  3683. __getset(0,__proto,'rotation',function(){
  3684. return this.rotationRad/Math.PI*180;
  3685. });
  3686. __getset(0,__proto,'width',function(){
  3687. return Math.sqrt((this.hX-this.oX)*(this.hX-this.oX)+(this.hY-this.oY)*(this.hY-this.oY));
  3688. });
  3689. __getset(0,__proto,'x',function(){
  3690. return this.oX;
  3691. });
  3692. __getset(0,__proto,'rotationRadV',function(){
  3693. var dx=this.vX-this.oX;
  3694. var dy=this.vY-this.oY;
  3695. return Math.atan2(dy,dx);
  3696. });
  3697. __getset(0,__proto,'y',function(){
  3698. return this.oY;
  3699. });
  3700. __getset(0,__proto,'rotationRad',function(){
  3701. var dx=this.hX-this.oX;
  3702. var dy=this.hY-this.oY;
  3703. return Math.atan2(dy,dx);
  3704. });
  3705. __getset(0,__proto,'height',function(){
  3706. return Math.sqrt((this.vX-this.oX)*(this.vX-this.oX)+(this.vY-this.oY)*(this.vY-this.oY));
  3707. });
  3708. __getset(0,__proto,'rotationV',function(){
  3709. return this.rotationRadV/Math.PI*180;
  3710. });
  3711. RecInfo.createByPoints=function(oPoint,ePoint,vPoint){
  3712. var rst;
  3713. rst=new RecInfo();
  3714. rst.initByPoints(oPoint,ePoint,vPoint);
  3715. return rst;
  3716. }
  3717. RecInfo.getGlobalPoints=function(sprite,x,y){
  3718. return sprite.localToGlobal(new Point(x,y));
  3719. }
  3720. RecInfo.getGlobalRecInfo=function(sprite,x0,y0,x1,y1,x2,y2){
  3721. (x0===void 0)&& (x0=0);
  3722. (y0===void 0)&& (y0=0);
  3723. (x1===void 0)&& (x1=1);
  3724. (y1===void 0)&& (y1=0);
  3725. (x2===void 0)&& (x2=0);
  3726. (y2===void 0)&& (y2=1);
  3727. return RecInfo.createByPoints(RecInfo.getGlobalPoints(sprite,x0,y0),RecInfo.getGlobalPoints(sprite,x1,y1),RecInfo.getGlobalPoints(sprite,x2,y2));
  3728. }
  3729. return RecInfo;
  3730. })()
  3731. /**
  3732. *布局工具类,目前只支持水平方向布局
  3733. *@author ww
  3734. */
  3735. //class laya.debug.tools.layout.Layouter
  3736. var Layouter=(function(){
  3737. function Layouter(){
  3738. /**
  3739. *布局用的数据,与布局方法有关
  3740. */
  3741. this.data=null;
  3742. /**
  3743. *布局涉及的对象
  3744. */
  3745. this._items=null;
  3746. /**
  3747. *布局用的函数
  3748. */
  3749. this.layoutFun=null;
  3750. /**
  3751. *布局起始x
  3752. */
  3753. this._sX=0;
  3754. /**
  3755. *布局宽
  3756. */
  3757. this._width=0;
  3758. }
  3759. __class(Layouter,'laya.debug.tools.layout.Layouter');
  3760. var __proto=Layouter.prototype;
  3761. __proto.layout=function(){
  3762. this.layoutFun(this._width,this._items,this.data,this._sX);
  3763. }
  3764. /**
  3765. *重新布局
  3766. *
  3767. */
  3768. __proto.changed=function(){
  3769. Laya.timer.callLater(this,this.layout);
  3770. }
  3771. /**
  3772. *根据当前的对象状态计算位置大小
  3773. *
  3774. */
  3775. __proto.calSize=function(){
  3776. var i=0,len=0;
  3777. var tItem;
  3778. tItem=this.items[0];
  3779. this._sX=tItem.x;
  3780. var maxX=NaN;
  3781. maxX=this._sX+tItem.width;
  3782. len=this.items.length;
  3783. for (i=1;i < len;i++){
  3784. tItem=this.items[i];
  3785. if (this._sX > tItem.x){
  3786. this._sX=tItem.x;
  3787. }
  3788. if (maxX < tItem.x+tItem.width){
  3789. maxX=tItem.x+tItem.width;
  3790. }
  3791. }
  3792. this._width=maxX-this._sX;
  3793. }
  3794. __getset(0,__proto,'width',function(){
  3795. return this._width;
  3796. },function(v){
  3797. this._width=v;
  3798. this.changed();
  3799. });
  3800. __getset(0,__proto,'x',function(){
  3801. return this._sX;
  3802. },function(v){
  3803. this._sX=v;
  3804. this.changed();
  3805. });
  3806. __getset(0,__proto,'items',function(){
  3807. return this._items;
  3808. },function(arr){
  3809. this._items=arr;
  3810. this.calSize();
  3811. });
  3812. return Layouter;
  3813. })()
  3814. /**
  3815. *...
  3816. *@author ww
  3817. */
  3818. //class laya.debug.tools.RenderAnalyser
  3819. var RenderAnalyser=(function(){
  3820. function RenderAnalyser(){
  3821. this.timeDic={};
  3822. this.resultDic={};
  3823. this.countDic={};
  3824. this.resultCountDic={};
  3825. this.nodeDic={};
  3826. this.isWorking=false;
  3827. this.working=true;
  3828. }
  3829. __class(RenderAnalyser,'laya.debug.tools.RenderAnalyser');
  3830. var __proto=RenderAnalyser.prototype;
  3831. __proto.render=function(sprite,time){
  3832. this.addTime(sprite,time);
  3833. }
  3834. __proto.addTime=function(sprite,time){
  3835. IDTools.idObj(sprite);
  3836. var key=0;
  3837. key=IDTools.getObjID(sprite);
  3838. if (!this.timeDic.hasOwnProperty(key)){
  3839. this.timeDic[key]=0;
  3840. }
  3841. this.timeDic[key]=this.timeDic[key]+time;
  3842. if (!this.countDic.hasOwnProperty(key)){
  3843. this.countDic[key]=0;
  3844. }
  3845. this.countDic[key]=this.countDic[key]+1;
  3846. this.nodeDic[key]=sprite;
  3847. }
  3848. __proto.getTime=function(sprite){
  3849. IDTools.idObj(sprite);
  3850. var key=0;
  3851. key=IDTools.getObjID(sprite);
  3852. if (!this.resultDic[key])return 0;
  3853. return this.resultDic[key];
  3854. }
  3855. __proto.getCount=function(sprite){
  3856. IDTools.idObj(sprite);
  3857. var key=0;
  3858. key=IDTools.getObjID(sprite);
  3859. return this.resultCountDic[key];
  3860. }
  3861. __proto.reset=function(){
  3862. var key;
  3863. for (key in this.timeDic){
  3864. this.timeDic[key]=0;
  3865. this.countDic[key]=0;
  3866. }
  3867. ObjectTools.clearObj(this.nodeDic);
  3868. }
  3869. __proto.updates=function(){
  3870. ObjectTools.clearObj(this.resultDic);
  3871. ObjectTools.insertValue(this.resultDic,this.timeDic);
  3872. ObjectTools.clearObj(this.resultCountDic);
  3873. ObjectTools.insertValue(this.resultCountDic,this.countDic);
  3874. this.reset();
  3875. }
  3876. __getset(0,__proto,'working',null,function(v){
  3877. this.isWorking=v;
  3878. if (v){
  3879. Laya.timer.loop(NodeConsts.RenderCostMaxTime,this,this.updates);
  3880. }else{
  3881. Laya.timer.clear(this,this.updates);
  3882. }
  3883. });
  3884. __static(RenderAnalyser,
  3885. ['I',function(){return this.I=new RenderAnalyser();}
  3886. ]);
  3887. return RenderAnalyser;
  3888. })()
  3889. /**
  3890. *
  3891. *@author ww
  3892. *@version 1.0
  3893. *
  3894. *@created 2015-9-25 下午7:19:44
  3895. */
  3896. //class laya.debug.tools.DisControlTool
  3897. var DisControlTool=(function(){
  3898. function DisControlTool(){}
  3899. __class(DisControlTool,'laya.debug.tools.DisControlTool');
  3900. DisControlTool.getObjectsUnderPoint=function(sprite,x,y,rst,filterFun){
  3901. rst=rst?rst:[];
  3902. if(filterFun!=null&&!filterFun(sprite))return rst;
  3903. if (sprite.getBounds().contains(x,y)){
  3904. rst.push(sprite);
  3905. var tS;
  3906. var tempP=new Point();
  3907. tempP.setTo(x,y);
  3908. tempP=sprite.fromParentPoint(tempP);
  3909. x=tempP.x;
  3910. y=tempP.y;
  3911. for (var i=sprite._children.length-1;i >-1;i--){
  3912. var child=sprite._children[i];
  3913. if((child instanceof laya.display.Sprite ))
  3914. DisControlTool.getObjectsUnderPoint(child,x,y,rst,filterFun);
  3915. }
  3916. }
  3917. return rst;
  3918. }
  3919. DisControlTool.getObjectsUnderGlobalPoint=function(sprite,filterFun){
  3920. var point=new Point();
  3921. point.setTo(Laya.stage.mouseX,Laya.stage.mouseY);
  3922. if(sprite.parent)
  3923. point=(sprite.parent).globalToLocal(point);
  3924. return DisControlTool.getObjectsUnderPoint(sprite,point.x,point.y,null,filterFun);
  3925. }
  3926. DisControlTool.findFirstObjectsUnderGlobalPoint=function(){
  3927. var disList;
  3928. disList=DisControlTool.getObjectsUnderGlobalPoint(Laya.stage);
  3929. if (!disList)return null;
  3930. var i=0,len=0;
  3931. var tDis;
  3932. len=disList.length;
  3933. for (i=len-1;i>=0;i--){
  3934. tDis=disList[i];
  3935. if (tDis && tDis.numChildren < 1){
  3936. return tDis;
  3937. }
  3938. }
  3939. return tDis;
  3940. }
  3941. DisControlTool.visibleAndEnableObjFun=function(tar){
  3942. return tar.visible&&tar.mouseEnabled;
  3943. }
  3944. DisControlTool.visibleObjFun=function(tar){
  3945. return tar.visible;
  3946. }
  3947. DisControlTool.getMousePoint=function(sprite){
  3948. var point=new Point();
  3949. point.setTo(Laya.stage.mouseX,Laya.stage.mouseY);
  3950. point=sprite.globalToLocal(point);
  3951. return point;
  3952. }
  3953. DisControlTool.isChildE=function(parent,child){
  3954. if (!parent)return false;
  3955. while (child){
  3956. if (child.parent==parent)return true;
  3957. child=child.parent;
  3958. }
  3959. return false;
  3960. }
  3961. DisControlTool.isInTree=function(pNode,child){
  3962. return pNode==child || DisControlTool.isChildE(pNode,child);
  3963. }
  3964. DisControlTool.setTop=function(tar){
  3965. if(tar&&tar.parent){
  3966. var tParent;
  3967. tParent=tar.parent;
  3968. tParent.setChildIndex(tar,tParent.numChildren-1);
  3969. }
  3970. }
  3971. DisControlTool.clearItemRelativeInfo=function(item){
  3972. var Nan="NaN";
  3973. item.getLayout().left=Nan;
  3974. item.getLayout().right=Nan;
  3975. item.getLayout().top=Nan;
  3976. item.getLayout().bottom=Nan;
  3977. }
  3978. DisControlTool.swap=function(tarA,tarB){
  3979. if (tarA==tarB)return;
  3980. var iA=0;
  3981. iA=tarA.parent.getChildIndex(tarA);
  3982. var iB=0;
  3983. iB=tarB.parent.getChildIndex(tarB);
  3984. var bP;
  3985. bP=tarB.parent;
  3986. tarA.parent.addChildAt(tarB,iA);
  3987. bP.addChildAt(tarA,iB);
  3988. }
  3989. DisControlTool.insertToTarParent=function(tarA,tars,after){
  3990. (after===void 0)&& (after=false);
  3991. var tIndex=0;
  3992. var parent;
  3993. if(!tarA)return;
  3994. parent=tarA.parent;
  3995. if(!parent)return;
  3996. tIndex=parent.getChildIndex(tarA);
  3997. if(after)tIndex++;
  3998. DisControlTool.insertToParent(parent,tars,tIndex);
  3999. }
  4000. DisControlTool.insertToParent=function(parent,tars,index){
  4001. (index===void 0)&& (index=-1);
  4002. if(!parent)return;
  4003. if(index<0)index=parent.numChildren;
  4004. var i=0,len=0;
  4005. len=tars.length;
  4006. for(i=0;i<len;i++){
  4007. DisControlTool.transParent(tars[i],parent);
  4008. parent.addChildAt(tars[i],index);
  4009. }
  4010. }
  4011. DisControlTool.transParent=function(tar,newParent){
  4012. if(!tar||!newParent)return;
  4013. if(!tar.parent)return;
  4014. var preParent;
  4015. preParent=tar.parent;
  4016. var pos;
  4017. pos=new Point(tar.x,tar.y);
  4018. pos=preParent.localToGlobal(pos);
  4019. pos=newParent.globalToLocal(pos);
  4020. tar.pos(pos.x,pos.y);
  4021. }
  4022. DisControlTool.transPoint=function(nowParent,tarParent,point){
  4023. point=nowParent.localToGlobal(point);
  4024. point=tarParent.globalToLocal(point);
  4025. return point;
  4026. }
  4027. DisControlTool.removeItems=function(itemList){
  4028. var i=0,len=0;
  4029. len=itemList.length;
  4030. for (i=0;i < len;i++){
  4031. (itemList [i]).removeSelf();
  4032. }
  4033. }
  4034. DisControlTool.addItems=function(itemList,parent){
  4035. var i=0,len=0;
  4036. len=itemList.length;
  4037. for (i=0;i < len;i++){
  4038. parent.addChild(itemList[i]);
  4039. }
  4040. }
  4041. DisControlTool.getAllChild=function(tar){
  4042. if(!tar)return [];
  4043. var i=0;
  4044. var len=0;
  4045. var rst=[];
  4046. len=tar.numChildren;
  4047. for(i=0;i<len;i++){
  4048. rst.push(tar.getChildAt(i));
  4049. }
  4050. return rst;
  4051. }
  4052. DisControlTool.upDis=function(child){
  4053. if(child&&child.parent){
  4054. var tParent;
  4055. tParent=child.parent;
  4056. var newIndex=0;
  4057. newIndex=tParent.getChildIndex(child)+1;
  4058. if(newIndex>=tParent.numChildren){
  4059. newIndex=tParent.numChildren-1;
  4060. }
  4061. console.log("setChildIndex:"+newIndex);
  4062. tParent.setChildIndex(child,newIndex);
  4063. }
  4064. }
  4065. DisControlTool.downDis=function(child){
  4066. if(child&&child.parent){
  4067. var tParent;
  4068. tParent=child.parent;
  4069. var newIndex=0;
  4070. newIndex=tParent.getChildIndex(child)-1;
  4071. if(newIndex<0)newIndex=0;
  4072. console.log("setChildIndex:"+newIndex);
  4073. tParent.setChildIndex(child,newIndex);
  4074. }
  4075. }
  4076. DisControlTool.setResizeAbleEx=function(node){
  4077. var clickItem;
  4078. clickItem=node.getChildByName("resizeBtn");
  4079. if (clickItem){
  4080. SimpleResizer.setResizeAble(clickItem,node);
  4081. }
  4082. }
  4083. DisControlTool.setResizeAble=function(node){
  4084. node.on(/*laya.events.Event.CLICK*/"click",null,DisControlTool.resizeHandler,[node]);
  4085. }
  4086. DisControlTool.resizeHandler=function(tar){
  4087. DisResizer.setUp(tar);
  4088. }
  4089. DisControlTool.setDragingItem=function(dragBar,tar){
  4090. dragBar.on(/*laya.events.Event.MOUSE_DOWN*/"mousedown",null,DisControlTool.dragingHandler,[tar]);
  4091. tar.on(/*laya.events.Event.DRAG_END*/"dragend",null,DisControlTool.dragingEnd,[tar]);
  4092. }
  4093. DisControlTool.dragingHandler=function(tar){
  4094. if (tar){
  4095. tar.startDrag();
  4096. }
  4097. }
  4098. DisControlTool.dragingEnd=function(tar){
  4099. DisControlTool.intFyDisPos(tar);
  4100. console.log(tar.x,tar.y);
  4101. }
  4102. DisControlTool.showToStage=function(dis,offX,offY){
  4103. (offX===void 0)&& (offX=0);
  4104. (offY===void 0)&& (offY=0);
  4105. var rec=dis.getBounds();
  4106. dis.x=Laya.stage.mouseX+offX;
  4107. dis.y=Laya.stage.mouseY+offY;
  4108. if (dis.x+rec.width > Laya.stage.width){
  4109. dis.x-=rec.width+offX;
  4110. }
  4111. if (dis.y+rec.height > Laya.stage.height){
  4112. dis.y-=rec.height+offY;
  4113. }
  4114. DisControlTool.intFyDisPos(dis);
  4115. }
  4116. DisControlTool.intFyDisPos=function(dis){
  4117. if (!dis)return;
  4118. dis.x=Math.round(dis.x);
  4119. dis.y=Math.round(dis.y);
  4120. }
  4121. DisControlTool.showOnly=function(disList,showItem){
  4122. var i=0,len=0;
  4123. len=disList.length;
  4124. for (i=0;i < len;i++){
  4125. disList[i].visible=disList[i]==showItem;
  4126. }
  4127. }
  4128. DisControlTool.showOnlyByIndex=function(disList,index){
  4129. DisControlTool.showOnly(disList,disList[index]);
  4130. }
  4131. DisControlTool.addOnly=function(disList,showItem,parent){
  4132. var i=0,len=0;
  4133. len=disList.length;
  4134. for (i=0;i < len;i++){
  4135. if (disList[i] !=showItem){
  4136. disList[i].removeSelf();
  4137. }else{
  4138. parent.addChild(disList[i]);
  4139. }
  4140. }
  4141. }
  4142. DisControlTool.addOnlyByIndex=function(disList,index,parent){
  4143. DisControlTool.addOnly(disList,disList[index],parent);
  4144. }
  4145. __static(DisControlTool,
  4146. ['tempP',function(){return this.tempP=new Point();}
  4147. ]);
  4148. return DisControlTool;
  4149. })()
  4150. /**
  4151. *...
  4152. *@author ww
  4153. */
  4154. //class laya.debug.view.nodeInfo.NodeConsts
  4155. var NodeConsts=(function(){
  4156. function NodeConsts(){}
  4157. __class(NodeConsts,'laya.debug.view.nodeInfo.NodeConsts');
  4158. NodeConsts.defaultFitlerStr="x,y,width,height,scaleX,scaleY,alpha,renderCost";
  4159. NodeConsts.RenderCostMaxTime=3000;
  4160. return NodeConsts;
  4161. })()
  4162. /**
  4163. *本类提供obj相关的一些操作
  4164. *@author ww
  4165. *@version 1.0
  4166. *
  4167. *@created 2015-10-21 下午2:03:36
  4168. */
  4169. //class laya.debug.tools.ObjectTools
  4170. var ObjectTools=(function(){
  4171. function ObjectTools(){}
  4172. __class(ObjectTools,'laya.debug.tools.ObjectTools');
  4173. ObjectTools.getFlatKey=function(tKey,aKey){
  4174. if(tKey=="")return aKey;
  4175. return tKey+ObjectTools.sign+aKey;
  4176. }
  4177. ObjectTools.flatObj=function(obj,rst,tKey){
  4178. (tKey===void 0)&& (tKey="");
  4179. rst=rst?rst:{};
  4180. var key;
  4181. var tValue;
  4182. for(key in obj){
  4183. if((typeof (obj[key])=='object')){
  4184. ObjectTools.flatObj(obj[key],rst,ObjectTools.getFlatKey(tKey,key));
  4185. }else{
  4186. tValue=obj[key];
  4187. rst[ObjectTools.getFlatKey(tKey,key)]=obj[key];
  4188. }
  4189. }
  4190. return rst;
  4191. }
  4192. ObjectTools.recoverObj=function(obj){
  4193. var rst={};
  4194. var tKey;
  4195. for(tKey in obj){
  4196. ObjectTools.setKeyValue(rst,tKey,obj[tKey]);
  4197. }
  4198. return rst;
  4199. }
  4200. ObjectTools.differ=function(objA,objB){
  4201. var tKey;
  4202. var valueA;
  4203. var valueB;
  4204. objA=ObjectTools.flatObj(objA);
  4205. objB=ObjectTools.flatObj(objB);
  4206. var rst={};
  4207. for(tKey in objA){
  4208. if(!objB.hasOwnProperty(tKey)){
  4209. rst[tKey]="被删除";
  4210. }
  4211. }
  4212. for(tKey in objB){
  4213. if(objB[tKey]!=objA[tKey]){
  4214. rst[tKey]={"pre":objA[tKey],"now":objB[tKey]};
  4215. }
  4216. }
  4217. return rst;
  4218. }
  4219. ObjectTools.traceDifferObj=function(obj){
  4220. var key;
  4221. var tO;
  4222. for(key in obj){
  4223. if((typeof (obj[key])=='string')){
  4224. console.log(key+":",obj[key]);
  4225. }else{
  4226. tO=obj[key];
  4227. console.log(key+":","now:",tO["now"],"pre:",tO["pre"]);
  4228. }
  4229. }
  4230. }
  4231. ObjectTools.setKeyValue=function(obj,flatKey,value){
  4232. if(flatKey.indexOf(ObjectTools.sign)>=0){
  4233. var keys=flatKey.split(ObjectTools.sign);
  4234. var tKey;
  4235. while(keys.length>1){
  4236. tKey=keys.shift();
  4237. if(!obj[tKey]){
  4238. obj[tKey]={};
  4239. console.log("addKeyObj:",tKey);
  4240. }
  4241. obj=obj[tKey];
  4242. if(!obj){
  4243. console.log("wrong flatKey:",flatKey);
  4244. return;
  4245. }
  4246. }
  4247. obj[keys.shift()]=value;
  4248. }else{
  4249. obj[flatKey]=value;
  4250. }
  4251. }
  4252. ObjectTools.clearObj=function(obj){
  4253. var key;
  4254. for (key in obj){
  4255. delete obj[key];
  4256. }
  4257. }
  4258. ObjectTools.copyObjFast=function(obj){
  4259. var jsStr;
  4260. jsStr=laya.debug.tools.ObjectTools.getJsonString(obj);
  4261. return laya.debug.tools.ObjectTools.getObj(jsStr);
  4262. }
  4263. ObjectTools.copyObj=function(obj){
  4264. if((obj instanceof Array))return ObjectTools.copyArr(obj);
  4265. var rst={};
  4266. var key;
  4267. for(key in obj){
  4268. if(obj[key]===null||obj[key]===undefined){
  4269. rst[key]=obj[key];
  4270. }else
  4271. if(((obj[key])instanceof Array)){
  4272. rst[key]=ObjectTools.copyArr(obj[key]);
  4273. }
  4274. else
  4275. if((typeof (obj[key])=='object')){
  4276. rst[key]=ObjectTools.copyObj(obj[key]);
  4277. }else{
  4278. rst[key]=obj[key];
  4279. }
  4280. }
  4281. return rst;
  4282. }
  4283. ObjectTools.copyArr=function(arr){
  4284. var rst;
  4285. rst=[];
  4286. var i=0,len=0;
  4287. len=arr.length;
  4288. for(i=0;i<len;i++){
  4289. rst.push(ObjectTools.copyObj(arr[i]));
  4290. }
  4291. return rst;
  4292. }
  4293. ObjectTools.concatArr=function(src,a){
  4294. if (!a)return src;
  4295. if (!src)return a;
  4296. var i=0,len=a.length;
  4297. for (i=0;i < len;i++){
  4298. src.push(a[i]);
  4299. }
  4300. return src;
  4301. }
  4302. ObjectTools.insertArrToArr=function(src,insertArr,pos){
  4303. (pos===void 0)&& (pos=0);
  4304. if (pos < 0)pos=0;
  4305. if (pos > src.length)pos=src.length;
  4306. var preLen=src.length;
  4307. var i=0,len=0;
  4308. src.length+=insertArr.length;
  4309. var moveLen=0;
  4310. moveLen=insertArr.length;
  4311. for (i=src.length-1;i >=pos;i--){
  4312. src[i]=src[i-moveLen];
  4313. }
  4314. len=insertArr.length;
  4315. for (i=0;i < len;i++){
  4316. src[pos+i]=insertArr[i];
  4317. }
  4318. return src;
  4319. }
  4320. ObjectTools.clearArr=function(arr){
  4321. if (!arr)return arr;
  4322. arr.length=0;
  4323. return arr;
  4324. }
  4325. ObjectTools.removeFromArr=function(arr,item){
  4326. var i=0,len=0;
  4327. len=arr.length;
  4328. for(i=0;i<len;i++){
  4329. if(arr[i]==item){
  4330. arr[i].splice(i,1);
  4331. return;
  4332. }
  4333. }
  4334. }
  4335. ObjectTools.setValueArr=function(src,v){
  4336. src || (src=[]);
  4337. src.length=0;
  4338. return ObjectTools.concatArr(src,v);
  4339. }
  4340. ObjectTools.getFrom=function(rst,src,count){
  4341. var i=0;
  4342. for (i=0;i < count;i++){
  4343. rst.push(src[i]);
  4344. }
  4345. return rst;
  4346. }
  4347. ObjectTools.getFromR=function(rst,src,count){
  4348. var i=0;
  4349. for (i=0;i < count;i++){
  4350. rst.push(src.pop());
  4351. }
  4352. return rst;
  4353. }
  4354. ObjectTools.enableDisplayTree=function(dis){
  4355. while (dis){
  4356. dis.mouseEnabled=true;
  4357. dis=dis.parent;
  4358. }
  4359. }
  4360. ObjectTools.getJsonString=function(obj){
  4361. var rst;
  4362. /*__JS__ */rst=JSON.stringify(obj);
  4363. return rst;
  4364. }
  4365. ObjectTools.getObj=function(jsonStr){
  4366. var rst;
  4367. /*__JS__ */rst=JSON.parse(jsonStr);
  4368. return rst;
  4369. }
  4370. ObjectTools.getKeyArr=function(obj){
  4371. var rst;
  4372. var key;
  4373. rst=[];
  4374. for(key in obj){
  4375. rst.push(key);
  4376. }
  4377. return rst;
  4378. }
  4379. ObjectTools.getObjValues=function(dataList,key){
  4380. var rst;
  4381. var i=0,len=0;
  4382. len=dataList.length;
  4383. rst=[];
  4384. for(i=0;i<len;i++){
  4385. rst.push(dataList[i][key]);
  4386. }
  4387. return rst;
  4388. }
  4389. ObjectTools.hasKeys=function(obj,keys){
  4390. var i=0,len=0;
  4391. len=keys.length;
  4392. for(i=0;i<len;i++){
  4393. if(!obj.hasOwnProperty(keys[i]))return false;
  4394. }
  4395. return true;
  4396. }
  4397. ObjectTools.copyValueByArr=function(tar,src,keys){
  4398. var i=0,len=keys.length;
  4399. for(i=0;i<len;i++){
  4400. if(!(src[keys[i]]===null))
  4401. tar[keys[i]]=src[keys[i]];
  4402. }
  4403. }
  4404. ObjectTools.getNoSameArr=function(arr){
  4405. var i=0,len=0;
  4406. var rst;
  4407. rst=[];
  4408. var tItem;
  4409. len=arr.length;
  4410. for (i=0;i < len;i++){
  4411. tItem=arr[i];
  4412. if (rst.indexOf(tItem)< 0){
  4413. rst.push(tItem);
  4414. }
  4415. }
  4416. return rst;
  4417. }
  4418. ObjectTools.insertValue=function(tar,src){
  4419. var key;
  4420. for (key in src){
  4421. tar[key]=src[key];
  4422. }
  4423. }
  4424. ObjectTools.replaceValue=function(obj,replaceO){
  4425. var key;
  4426. for(key in obj){
  4427. if(replaceO.hasOwnProperty(obj[key])){
  4428. obj[key]=replaceO[obj[key]];
  4429. }
  4430. if((typeof (obj[key])=='object')){
  4431. ObjectTools.replaceValue(obj[key],replaceO);
  4432. }
  4433. }
  4434. }
  4435. ObjectTools.setKeyValues=function(items,key,value){
  4436. var i=0,len=0;
  4437. len=items.length;
  4438. for(i=0;i<len;i++){
  4439. items[i][key]=value;
  4440. }
  4441. }
  4442. ObjectTools.findItemPos=function(items,sign,value){
  4443. var i=0,len=0;
  4444. len=items.length;
  4445. for(i=0;i<len;i++){
  4446. if(items[i][sign]==value){
  4447. return i;
  4448. }
  4449. }
  4450. return-1;
  4451. }
  4452. ObjectTools.setObjValue=function(obj,key,value){
  4453. obj[key]=value;
  4454. return obj;
  4455. }
  4456. ObjectTools.setAutoTypeValue=function(obj,key,value){
  4457. if(obj.hasOwnProperty(key)){
  4458. if(ObjectTools.isNumber(obj[key])){
  4459. obj[key]=parseFloat(value);
  4460. }else{
  4461. obj[key]=value;
  4462. }
  4463. }else{
  4464. obj[key]=value;
  4465. }
  4466. return obj;
  4467. }
  4468. ObjectTools.getAutoValue=function(value){
  4469. var tFloat=parseFloat(value);
  4470. if(typeof(value)=="string"){
  4471. if(tFloat+""===StringTool.trimSide(value))return tFloat;
  4472. }
  4473. return value;
  4474. }
  4475. ObjectTools.isNumber=function(value){
  4476. return (parseFloat(value)==value);
  4477. }
  4478. ObjectTools.isNaNS=function(value){
  4479. return (value.toString()=="NaN");
  4480. }
  4481. ObjectTools.isNaN=function(value){
  4482. if(typeof(value)=="number")return false;
  4483. if(typeof(value)=="string"){
  4484. if(parseFloat(value).toString()!="NaN"){
  4485. if(parseFloat(value)==value){
  4486. return false;
  4487. }
  4488. }
  4489. }
  4490. return true;
  4491. }
  4492. ObjectTools.getStrTypedValue=function(value){
  4493. if(value=="false"){
  4494. return false;
  4495. }else
  4496. if(value=="true"){
  4497. return true;
  4498. }else
  4499. if(value=="null"){
  4500. return null;
  4501. }else
  4502. if(value=="undefined"){
  4503. return null;
  4504. }else{
  4505. return ObjectTools.getAutoValue(value);
  4506. }
  4507. }
  4508. ObjectTools.createKeyValueDic=function(dataList,keySign){
  4509. var rst;
  4510. rst={};
  4511. var i=0,len=0;
  4512. len=dataList.length;
  4513. var tItem;
  4514. var tKey;
  4515. for(i=0;i<len;i++){
  4516. tItem=dataList[i];
  4517. tKey=tItem[keySign];
  4518. rst[tKey]=tItem;
  4519. }
  4520. return rst;
  4521. }
  4522. ObjectTools.sign="_";
  4523. return ObjectTools;
  4524. })()
  4525. /**
  4526. *...
  4527. *@author ww
  4528. */
  4529. //class laya.debug.view.nodeInfo.NodeUtils
  4530. var NodeUtils=(function(){
  4531. function NodeUtils(){}
  4532. __class(NodeUtils,'laya.debug.view.nodeInfo.NodeUtils');
  4533. NodeUtils.getFilterdTree=function(sprite,keys){
  4534. if (!keys)
  4535. keys=NodeUtils.defaultKeys;
  4536. var me;
  4537. me={};
  4538. var key;
  4539. var i=0,len=0;
  4540. len=keys.length;
  4541. for (i=0;i < len;i++){
  4542. key=keys[i];
  4543. me[key]=sprite[key];
  4544. };
  4545. var cList;
  4546. var tChild;
  4547. cList=sprite._children;
  4548. len=cList.length;
  4549. var mClist;
  4550. mClist=[];
  4551. for (i=0;i < len;i++){
  4552. tChild=cList[i];
  4553. mClist.push(NodeUtils.getFilterdTree(tChild,keys));
  4554. }
  4555. me.childs=mClist;
  4556. return me;
  4557. }
  4558. NodeUtils.getNodeValue=function(node,key){
  4559. var rst;
  4560. if ((node instanceof laya.display.Sprite )){
  4561. var tNode;
  4562. tNode=node;
  4563. switch (key){
  4564. case "gRec":
  4565. rst=laya.debug.view.nodeInfo.NodeUtils.getGRec(tNode).toString();
  4566. break ;
  4567. case "gAlpha":
  4568. rst=laya.debug.view.nodeInfo.NodeUtils.getGAlpha(tNode)+"";
  4569. break ;
  4570. case "cmdCount":
  4571. rst=laya.debug.view.nodeInfo.NodeUtils.getNodeCmdCount(tNode)+"";
  4572. break ;
  4573. case "cmdAll":
  4574. rst=laya.debug.view.nodeInfo.NodeUtils.getNodeCmdTotalCount(tNode)+"";
  4575. break ;
  4576. case "nodeAll":
  4577. rst=""+laya.debug.view.nodeInfo.NodeUtils.getNodeCount(tNode);
  4578. break ;
  4579. case "nodeVisible":
  4580. rst=""+laya.debug.view.nodeInfo.NodeUtils.getNodeCount(tNode,true);
  4581. break ;
  4582. case "nodeRender":
  4583. rst=""+laya.debug.view.nodeInfo.NodeUtils.getRenderNodeCount(tNode);
  4584. break ;
  4585. case "nodeReCache":
  4586. rst=""+laya.debug.view.nodeInfo.NodeUtils.getReFreshRenderNodeCount(tNode);
  4587. break ;
  4588. case "renderCost":
  4589. rst=""+RenderAnalyser.I.getTime(tNode);
  4590. break ;
  4591. case "renderCount":
  4592. rst=""+RenderAnalyser.I.getCount(tNode);
  4593. break ;
  4594. default :
  4595. rst=node[key]+"";
  4596. }
  4597. }
  4598. else {
  4599. rst=node[key]+"";
  4600. }
  4601. return rst;
  4602. }
  4603. NodeUtils.getPropertyDesO=function(tValue,keys){
  4604. if (!keys)
  4605. keys=NodeUtils.defaultKeys;
  4606. var rst={};
  4607. if ((typeof tValue=='object')){
  4608. rst.label=""+ClassTool.getNodeClassAndName(tValue);
  4609. }
  4610. else {
  4611. rst.label=""+tValue;
  4612. }
  4613. rst.type="";
  4614. rst.path=tValue;
  4615. rst.childs=[];
  4616. rst.isDirectory=false;
  4617. var key;
  4618. var i=0,len=0;
  4619. var tChild;
  4620. if ((tValue instanceof laya.display.Node )){
  4621. rst.des=ClassTool.getNodeClassAndName(tValue);
  4622. rst.isDirectory=true;
  4623. len=keys.length;
  4624. for (i=0;i < len;i++){
  4625. key=keys[i];
  4626. tChild=NodeUtils.getPropertyDesO(tValue[key],keys);
  4627. if (tValue.hasOwnProperty(key)){
  4628. tChild.label=""+key+":"+tChild.des;
  4629. }
  4630. else {
  4631. tChild.label=""+key+":"+NodeUtils.getNodeValue(tValue,key);
  4632. }
  4633. rst.childs.push(tChild);
  4634. }
  4635. key="_children";
  4636. tChild=NodeUtils.getPropertyDesO(tValue[key],keys);
  4637. tChild.label=""+key+":"+tChild.des;
  4638. tChild.isChilds=true;
  4639. rst.childs.push(tChild);
  4640. }
  4641. else if ((tValue instanceof Array)){
  4642. rst.des="Array["+(tValue).length+"]";
  4643. rst.isDirectory=true;
  4644. var tList;
  4645. tList=tValue;
  4646. len=tList.length;
  4647. for (i=0;i < len;i++){
  4648. tChild=NodeUtils.getPropertyDesO(tList[i],keys);
  4649. tChild.label=""+i+":"+tChild.des;
  4650. rst.childs.push(tChild);
  4651. }
  4652. }
  4653. else if ((typeof tValue=='object')){
  4654. rst.des=ClassTool.getNodeClassAndName(tValue);
  4655. rst.isDirectory=true;
  4656. for (key in tValue){
  4657. tChild=NodeUtils.getPropertyDesO(tValue[key],keys);
  4658. tChild.label=""+key+":"+tChild.des;
  4659. rst.childs.push(tChild);
  4660. }
  4661. }
  4662. else {
  4663. rst.des=""+tValue;
  4664. }
  4665. rst.hasChild=rst.childs.length > 0;
  4666. return rst;
  4667. }
  4668. NodeUtils.adptShowKeys=function(keys){
  4669. var i=0,len=0;
  4670. len=keys.length;
  4671. for (i=len-1;i >=0;i--){
  4672. keys[i]=StringTool.trimSide(keys[i]);
  4673. if (keys[i].length < 1){
  4674. keys.splice(i,1);
  4675. }
  4676. }
  4677. return keys;
  4678. }
  4679. NodeUtils.getNodeTreeData=function(sprite,keys){
  4680. NodeUtils.adptShowKeys(keys);
  4681. var treeO;
  4682. treeO=NodeUtils.getPropertyDesO(sprite,keys);
  4683. var treeArr;
  4684. treeArr=[];
  4685. NodeUtils.getTreeArr(treeO,treeArr);
  4686. return treeArr;
  4687. }
  4688. NodeUtils.getTreeArr=function(treeO,arr,add){
  4689. (add===void 0)&& (add=true);
  4690. if (add)
  4691. arr.push(treeO);
  4692. var tArr=treeO.childs;
  4693. var i=0,len=tArr.length;
  4694. for (i=0;i < len;i++){
  4695. if (!add){
  4696. tArr[i].nodeParent=null;
  4697. }
  4698. else {
  4699. tArr[i].nodeParent=treeO;
  4700. }
  4701. if (tArr[i].isDirectory){
  4702. NodeUtils.getTreeArr(tArr[i],arr);
  4703. }
  4704. else {
  4705. arr.push(tArr[i]);
  4706. }
  4707. }
  4708. }
  4709. NodeUtils.traceStage=function(){
  4710. console.log(NodeUtils.getFilterdTree(Laya.stage,null));
  4711. console.log("treeArr:",NodeUtils.getNodeTreeData(Laya.stage,null));
  4712. }
  4713. NodeUtils.getNodeCount=function(node,visibleRequire){
  4714. (visibleRequire===void 0)&& (visibleRequire=false);
  4715. if (visibleRequire){
  4716. if (!node.visible)
  4717. return 0;
  4718. };
  4719. var rst=0;
  4720. rst=1;
  4721. var i=0,len=0;
  4722. var cList;
  4723. cList=node._children;
  4724. len=cList.length;
  4725. for (i=0;i < len;i++){
  4726. rst+=NodeUtils.getNodeCount(cList[i],visibleRequire);
  4727. }
  4728. return rst;
  4729. }
  4730. NodeUtils.getGVisible=function(node){
  4731. while (node){
  4732. if (!node.visible)
  4733. return false;
  4734. node=node.parent;
  4735. }
  4736. return true;
  4737. }
  4738. NodeUtils.getGAlpha=function(node){
  4739. var rst=NaN;
  4740. rst=1;
  4741. while (node){
  4742. rst *=node.alpha;
  4743. node=node.parent;
  4744. }
  4745. return rst;
  4746. }
  4747. NodeUtils.getGPos=function(node){
  4748. var point;
  4749. point=new Point();
  4750. node.localToGlobal(point);
  4751. return point;
  4752. }
  4753. NodeUtils.getGRec=function(node){
  4754. var pointList;
  4755. pointList=node._getBoundPointsM(true);
  4756. if (!pointList || pointList.length < 1)
  4757. return Rectangle.TEMP.setTo(0,0,0,0);
  4758. pointList=GrahamScan.pListToPointList(pointList,true);
  4759. WalkTools.walkArr(pointList,node.localToGlobal,node);
  4760. pointList=GrahamScan.pointListToPlist(pointList);
  4761. var _disBoundRec;
  4762. _disBoundRec=Rectangle._getWrapRec(pointList,_disBoundRec);
  4763. return _disBoundRec;
  4764. }
  4765. NodeUtils.getGGraphicRec=function(node){
  4766. var pointList;
  4767. pointList=node.getGraphicBounds()._getBoundPoints();
  4768. if (!pointList || pointList.length < 1)
  4769. return Rectangle.TEMP.setTo(0,0,0,0);
  4770. pointList=GrahamScan.pListToPointList(pointList,true);
  4771. WalkTools.walkArr(pointList,node.localToGlobal,node);
  4772. pointList=GrahamScan.pointListToPlist(pointList);
  4773. var _disBoundRec;
  4774. _disBoundRec=Rectangle._getWrapRec(pointList,_disBoundRec);
  4775. return _disBoundRec;
  4776. }
  4777. NodeUtils.getNodeCmdCount=function(node){
  4778. var rst=0;
  4779. if (node.graphics){
  4780. if (node.graphics.cmds){
  4781. rst=node.graphics.cmds.length;
  4782. }
  4783. else {
  4784. if (node.graphics._one){
  4785. rst=1;
  4786. }
  4787. else {
  4788. rst=0;
  4789. }
  4790. }
  4791. }
  4792. else {
  4793. rst=0;
  4794. }
  4795. return rst;
  4796. }
  4797. NodeUtils.getNodeCmdTotalCount=function(node){
  4798. var rst=0;
  4799. var i=0,len=0;
  4800. var cList;
  4801. cList=node._children;
  4802. len=cList.length;
  4803. rst=NodeUtils.getNodeCmdCount(node);
  4804. for (i=0;i < len;i++){
  4805. rst+=NodeUtils.getNodeCmdTotalCount(cList[i]);
  4806. }
  4807. return rst;
  4808. }
  4809. NodeUtils.getRenderNodeCount=function(node){
  4810. if (node.cacheAs !="none")
  4811. return 1;
  4812. var rst=0;
  4813. var i=0,len=0;
  4814. var cList;
  4815. cList=node._children;
  4816. len=cList.length;
  4817. rst=1;
  4818. for (i=0;i < len;i++){
  4819. rst+=NodeUtils.getRenderNodeCount(cList[i]);
  4820. }
  4821. return rst;
  4822. }
  4823. NodeUtils.getReFreshRenderNodeCount=function(node){
  4824. var rst=0;
  4825. var i=0,len=0;
  4826. var cList;
  4827. cList=node._children;
  4828. len=cList.length;
  4829. rst=1;
  4830. for (i=0;i < len;i++){
  4831. rst+=NodeUtils.getRenderNodeCount(cList[i]);
  4832. }
  4833. return rst;
  4834. }
  4835. NodeUtils.showCachedSpriteRecs=function(){
  4836. NodeUtils.g=DebugInfoLayer.I.graphicLayer.graphics;
  4837. NodeUtils.g.clear();
  4838. WalkTools.walkTarget(Laya.stage,NodeUtils.drawCachedBounds,null);
  4839. }
  4840. NodeUtils.drawCachedBounds=function(sprite){
  4841. if (sprite.cacheAs=="none")
  4842. return;
  4843. if (DebugInfoLayer.I.isDebugItem(sprite))
  4844. return;
  4845. var rec;
  4846. rec=NodeUtils.getGRec(sprite);
  4847. NodeUtils.g.drawRect(rec.x,rec.y,rec.width,rec.height,null,"#0000ff",2);
  4848. }
  4849. NodeUtils.g=null;
  4850. __static(NodeUtils,
  4851. ['defaultKeys',function(){return this.defaultKeys=["x","y","width","height"];}
  4852. ]);
  4853. return NodeUtils;
  4854. })()
  4855. /**
  4856. *...
  4857. *@author ww
  4858. */
  4859. //class laya.debug.tools.CacheAnalyser
  4860. var CacheAnalyser=(function(){
  4861. function CacheAnalyser(){}
  4862. __class(CacheAnalyser,'laya.debug.tools.CacheAnalyser');
  4863. var __proto=CacheAnalyser.prototype;
  4864. __proto.renderCanvas=function(sprite,time){
  4865. (time===void 0)&& (time=0);
  4866. if (!CacheAnalyser.showCacheSprite)return;
  4867. if (DebugInfoLayer.I.isDebugItem(sprite))return;
  4868. DebugTool.showDisBoundToSprite(sprite,DebugInfoLayer.I.cacheViewLayer,DebugConsts.CANVAS_REC_COLOR,4);
  4869. }
  4870. __proto.reCacheCanvas=function(sprite,time){
  4871. (time===void 0)&& (time=0);
  4872. if (!CacheAnalyser.showRecacheSprite)return;
  4873. if (DebugInfoLayer.I.isDebugItem(sprite))return;
  4874. var info;
  4875. info=CacheAnalyser.getNodeInfoByNode(sprite);
  4876. info.addCount(time);
  4877. CacheAnalyser.counter.addTime(sprite,time);
  4878. if (!info.parent){
  4879. DebugInfoLayer.I.nodeRecInfoLayer.addChild(info);
  4880. }
  4881. }
  4882. CacheAnalyser.renderLoopBegin=function(){
  4883. DebugInfoLayer.I.cacheViewLayer.graphics.clear();
  4884. }
  4885. CacheAnalyser.getNodeInfoByNode=function(node){
  4886. IDTools.idObj(node);
  4887. var key=0;
  4888. key=IDTools.getObjID(node);
  4889. if (!CacheAnalyser._nodeInfoDic[key]){
  4890. CacheAnalyser._nodeInfoDic[key]=new ReCacheRecInfo();
  4891. }
  4892. (CacheAnalyser._nodeInfoDic [key]).setTarget(node);
  4893. return CacheAnalyser._nodeInfoDic[key];
  4894. }
  4895. CacheAnalyser._nodeInfoDic={};
  4896. CacheAnalyser.showCacheSprite=false;
  4897. CacheAnalyser.showRecacheSprite=true;
  4898. __static(CacheAnalyser,
  4899. ['counter',function(){return this.counter=new ObjTimeCountTool();},'I',function(){return this.I=new CacheAnalyser();}
  4900. ]);
  4901. return CacheAnalyser;
  4902. })()
  4903. /**
  4904. *本类用于在对象的函数上挂钩子
  4905. *@author ww
  4906. *@version 1.0
  4907. *
  4908. *@created 2015-10-23 下午1:13:13
  4909. */
  4910. //class laya.debug.tools.hook.FunHook
  4911. var FunHook=(function(){
  4912. function FunHook(){}
  4913. __class(FunHook,'laya.debug.tools.hook.FunHook');
  4914. FunHook.hook=function(obj,funName,preFun,aftFun){
  4915. FunHook.hookFuns(obj,funName,[preFun,obj[funName],aftFun],1);
  4916. }
  4917. FunHook.hookAllFun=function(obj){
  4918. var key;
  4919. var arr;
  4920. arr=ClassTool.getOwnPropertyNames(obj);
  4921. for(key in arr){
  4922. key=arr[key];
  4923. if (FunHook.special[key])continue ;
  4924. console.log("try hook:",key);
  4925. if((typeof (obj[key])=='function')){
  4926. console.log("hook:",key);
  4927. FunHook.hookFuns(obj,key,[FunHook.getTraceMsg("call:"+key),obj[key]],1);
  4928. }
  4929. }
  4930. if(obj["__proto__"]){
  4931. FunHook.hookAllFun(obj["__proto__"]);
  4932. }else{
  4933. console.log("end:",obj);
  4934. }
  4935. }
  4936. FunHook.getTraceMsg=function(msg){
  4937. var rst;
  4938. rst=function (){
  4939. console.log(msg);
  4940. }
  4941. return rst;
  4942. }
  4943. FunHook.hookFuns=function(obj,funName,funList,rstI){
  4944. (rstI===void 0)&& (rstI=-1);
  4945. var _preFun=obj[funName];
  4946. var newFun;
  4947. newFun=function (__args){
  4948. var args=arguments;
  4949. var rst;
  4950. var i=0;
  4951. var len=0;
  4952. len=funList.length;
  4953. for(i=0;i<len;i++){
  4954. if(!funList[i])continue ;
  4955. if(i==rstI){
  4956. rst=funList[i].apply(this,args);
  4957. }else{
  4958. funList[i].apply(this,args);
  4959. }
  4960. }
  4961. return rst;
  4962. };
  4963. newFun["pre"]=_preFun;
  4964. obj[funName]=newFun;
  4965. }
  4966. FunHook.removeHook=function(obj,funName){
  4967. if(obj[funName].pre!=null){
  4968. obj[funName]=obj[funName].pre;
  4969. }
  4970. }
  4971. FunHook.debugHere=function(){
  4972. /*__JS__ */debugger;;
  4973. }
  4974. FunHook.traceLoc=function(level,msg){
  4975. (level===void 0)&& (level=0);
  4976. (msg===void 0)&& (msg="");
  4977. console.log(msg,"fun loc:",TraceTool.getCallLoc(3+level));
  4978. }
  4979. FunHook.getLocFun=function(level,msg){
  4980. (level===void 0)&& (level=0);
  4981. (msg===void 0)&& (msg="");
  4982. level+=1;
  4983. var rst;
  4984. rst=function (){
  4985. FunHook.traceLoc(level,msg);
  4986. }
  4987. return rst;
  4988. }
  4989. __static(FunHook,
  4990. ['special',function(){return this.special={
  4991. "length":true,
  4992. "name":true,
  4993. "arguments":true,
  4994. "caller":true,
  4995. "prototype":true,
  4996. "is":true,
  4997. "isExtensible":true,
  4998. "isFrozen":true,
  4999. "isSealed":true,
  5000. "preventExtensions":true,
  5001. "seal":true,
  5002. "unobserve":true,
  5003. "apply":true,
  5004. "call":true,
  5005. "bind":true,
  5006. "freeze":true,
  5007. "unobserve":true
  5008. };}
  5009. ]);
  5010. return FunHook;
  5011. })()
  5012. /**
  5013. *本类调用原生watch接口,仅火狐有效
  5014. *@author ww
  5015. *@version 1.0
  5016. *
  5017. *@created 2015-10-26 上午9:48:18
  5018. */
  5019. //class laya.debug.tools.exp.Watch
  5020. var Watch=(function(){
  5021. function Watch(){}
  5022. __class(Watch,'laya.debug.tools.exp.Watch');
  5023. Watch.watch=function(obj,name,callBack){
  5024. /*__JS__ */obj.watch(name,callBack);
  5025. }
  5026. Watch.unwatch=function(obj,name,callBack){
  5027. /*__JS__ */obj.unwatch(name,callBack);
  5028. }
  5029. return Watch;
  5030. })()
  5031. /**
  5032. *tianpeng
  5033. *@author
  5034. */
  5035. //class laya.debug.tools.AtlasTools
  5036. var AtlasTools=(function(){
  5037. function AtlasTools(){
  5038. this.mSprite=null;
  5039. this.mIndex=0;
  5040. this.mTextureDic={};
  5041. }
  5042. __class(AtlasTools,'laya.debug.tools.AtlasTools');
  5043. var __proto=AtlasTools.prototype;
  5044. __proto.start=function(){
  5045. if (!Render.isWebGL)return;
  5046. if (this.mSprite==null){
  5047. this.mSprite=new Sprite();
  5048. }
  5049. Laya.stage.addChild(this.mSprite);
  5050. this.showNext();
  5051. }
  5052. __proto.end=function(){
  5053. if (!Render.isWebGL)return;
  5054. if (this.mSprite){
  5055. Laya.stage.removeChild(this.mSprite);
  5056. }
  5057. }
  5058. __proto.showNext=function(){
  5059. if (!Render.isWebGL)return;
  5060. if (this.mSprite==null){
  5061. this.mSprite=new Sprite();
  5062. }
  5063. Laya.stage.addChild(this.mSprite);
  5064. this.mIndex++;
  5065. var resManager;
  5066. /*__JS__ */resManager=laya.webgl.atlas.AtlasResourceManager.instance;;
  5067. var tCount=resManager.getAtlaserCount();
  5068. if (this.mIndex >=tCount){
  5069. this.mIndex=0;
  5070. };
  5071. var tTexture;
  5072. if (this.mTextureDic[this.mIndex]){
  5073. tTexture=this.mTextureDic[this.mIndex];
  5074. }else {
  5075. var tAtlaser=resManager.getAtlaserByIndex(this.mIndex);
  5076. if (tAtlaser && tAtlaser.texture){
  5077. tTexture=new Texture(tAtlaser.texture,null);
  5078. this.mTextureDic[this.mIndex]=tTexture;
  5079. }
  5080. }
  5081. if (tTexture){
  5082. this.mSprite.graphics.clear();
  5083. this.mSprite.graphics.save();
  5084. this.mSprite.graphics.alpha(0.9);
  5085. this.mSprite.graphics.drawRect(0,0,1024,1024,"#efefefe");
  5086. this.mSprite.graphics.restore();
  5087. this.mSprite.graphics.drawTexture(tTexture,0,0,1024,1024);
  5088. this.mSprite.graphics.fillText((this.mIndex+1).toString()+"/"+tCount.toString(),25,100,"40px Arial","#ff0000","left");
  5089. }
  5090. }
  5091. AtlasTools.getInstance=function(){
  5092. return AtlasTools.mInstance=AtlasTools.mInstance|| new AtlasTools();
  5093. }
  5094. AtlasTools.mInstance=null;
  5095. return AtlasTools;
  5096. })()
  5097. //class laya.debug.data.Base64AtlasManager
  5098. var Base64AtlasManager=(function(){
  5099. function Base64AtlasManager(){}
  5100. __class(Base64AtlasManager,'laya.debug.data.Base64AtlasManager');
  5101. Base64AtlasManager.replaceRes=function(uiO){
  5102. Base64AtlasManager.base64.replaceRes(uiO);
  5103. }
  5104. __static(Base64AtlasManager,
  5105. ['dataO',function(){return this.dataO={"comp/button1.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGIAAABRCAYAAAApS3MNAAABSUlEQVR4Xu3a0QmFMADFUJ1JXM0h3moPZ6qg4AoNeLqAIenFn65jjLE40w2sQkxvcAMI0eggRKSDEEJUDEQ4/COEiBiIYFiEEBEDEQyLECJiIIJhEUJEDEQwLEKIiIEIhkUIETEQwbAIISIGIhgWIUTEQATDIoSIGIhgWIQQEQMRDIsQImIggnEvYvv9IzjfxDiP/XlgJsTcCyDEXP/v14UQImIggmERQkQMRDAsQoiIgQiGRQgRMRDBsAghIgYiGBYhRMRABMMihIgYiGBYhBARAxEMixAiYiCCYRFCRAxEMCxCiIiBCMa7iAjPpzG8fY3kF0KIiIEIhkUIETEQwbAIISIGIhgWIUTEQATDIoSIGIhgWIQQEQMRDIsQImIggmERQkQMRDAsQoiIgQiGRQgRMRDBsAghIgYiGBYhRMRABMMihIgYiGBcGJiOHTRZjZAAAAAASUVORK5CYII=","comp/line2.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAAG0lEQVQYV2NkoDJgpLJ5DIxtra3/qWko1V0IAJvgApS1libIAAAAAElFTkSuQmCC","view/create.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAkCAYAAAC9itu8AAAAdElEQVQ4T2NkwAIWLFjwH5t4QkICIyM2CXQxmAHka/j///9mXDYxMjL6YtgwBDUg+w8crIT8MBQ0oEca55JvWNPS9xgu4tISzADyNfz///8MnrRkgmHDENSALWng9fRQ0DA40xLecglbWhpqGoZCMUNKUQkANAHAJVkE5XwAAAAASUVORK5CYII=","view/rendertime.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAkCAYAAAC9itu8AAABeUlEQVQ4T+2Uv0tCURSAvyNdcwiXBlsaaomWFgeHlqAtCPsDJHwIiUtDSxERtErtmQ6CjkHo4FpDBQ0tbVFR0BYE0eQvOnFF7T17QlOTd3m88873OD8+rtA9uVzOBIPBlIisAwvd8B1QajQahXQ63bIx6QHFYrEEJHrv7qeqZhzHOfYA+Xw+Yow5B+YHoGwymdxW1QAQEFWNAk8i8uEDuZM3gUcLZIEJYNcNqWrVcZyd7p9t8jLwYIFTYBx47UHlcjmcSCQ+B5JtpU0LnAFj3br7kE+yTalb4BCYczVqoT3AjteW4T73FlgFNgY+1IGQz4hPLGCAI2DGbweu2Auw1Vmcqk4C+8DsEOgZOBCR9/6mVdU2vgIsAdOuIVwANRFpezatuahpTYVSop1m+y6pasm8NQqSvvW61KwslkSHuCRkgvErr0taiUXaal1Sr0siWRO/9HfpF+RN9nfpB/qqmrXrv7mktVhYVm5GLo1cct9LI5e8d84/3UvfAgdlKH0EO7MAAAAASUVORK5CYII=","view/cache.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAAkCAYAAABSSLCCAAAAcElEQVQ4T2NcsGDB/4SEBEYGBgYGYtmMxCpENhhsA6mA8f///5tHNTEwkBcQpIYcSD15kUtWigi51vR/jVYdOGUQy2YkViGywWSnvTOkhiAonkY1gZIRqSEHTntkRe4g10RWQIyWe5Bgo2O5R7dkBADztyP+yFzirAAAAABJRU5ErkJggg==","comp/clip_selectBox.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAoCAYAAAAIeF9DAAAAsElEQVRoQ+3ZQQ0AMQzEwAuqEgh/Sj2pKObhIrBsrfLonHPu12MMTEGYFg+kIFaPgmA9ClIQzQDG0w0pCGYAw2khBcEMYDgtpCCYAQynhRQEM4DhtJCCYAYwnBZSEMwAhtNCCoIZwHBmd/tTh6IUBIrx/tRbiFWkIFaPFoL1KEhBNAMYTzekIJgBDKeFFAQzgOG0kIJgBjCcFlIQzACG00IKghnAcFpIQTADGE4LwYL8U/BE1dCJ3PsAAAAASUVORK5CYII=","comp/label.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAASCAYAAACQCxruAAAAmElEQVRoQ+3aMQqAQBBDUef+hx4Zq1mrbPnhWylECHmghVZ397OOqqp97TlugdNzgEXFIaaFuwROt0LmBEay5aXb920+FjIpMJItLy1wvhUyKTCSLS8tcL4VMikwki0vLXC+FTIpMJItLy1wvhUyKTCSLS89wPP1Qeh8M0zy+84gMMbruqjA15OxbtjAu7mPa5bj0fb/A8cLgD4n/wQKNiIAAAAASUVORK5CYII=","comp/clip_tree_arrow.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAQCAYAAAArij59AAAAwUlEQVQoU5WRPRKCMBCFWUt6vYQeB06RUDpoBbFDa7yDwm30FGi9dHnOMiQDBgvT5c3b7+0PRVEUlVV9A3NmzL6T//SRfMz5CgCdtVafjlmzaHAigAbM2tE8YVo1pf0yvABoc9D3wACgBbMKIgD4qqDJsqqlMV8VGL5n/88geCJKlijSMBXFZUNx/CSi9WwX1r7R99thzKKqkxXRbMUWSE2u2sEwHsxHCbrMVSq6N4xRD9HAvJstylEkarhurlqnfQC58YP5+CvQNwAAAABJRU5ErkJggg==","view/bg_panel.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAMUlEQVRYR+3QQREAAAjDMGZk/l2CDD6pgl7SduexGCBAgAABAgQIECBAgAABAgS+BQ4oyStBhXcy5AAAAABJRU5ErkJggg==","view/bg_top.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAMUlEQVRYR+3QQREAAAjDMKZp/rWBDD6pgl7SduexGCBAgAABAgQIECBAgAABAgS+BQ6WyDMhXMLeQgAAAABJRU5ErkJggg==","view/clickselect.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAqCAYAAACDdWrxAAACfElEQVRIS8WVO2iTYRSGn5OWqpMOurg0VRBdVVCsg7GgDjpZECyirl4GEYfSgBlaB5VSpApdxCJIoeKgg7dKC21ALahIiyiKKUjxAiI4qCH1lRP/hPhfAnHpGZPv+c4573nP95ukO/xHmINmtq8RtswsPiipB/gAPAFem5nCbcSWKukIsD84/A2YBh4DL8ysWLkk0qOkDcD5GLF+Ac+Ap35ZHGjAdWB5gtJvgZFYVSWdBHaFwBlg1Mw8K0ngFiAbAm+a2XBij/6HpBbgBrAEmAVeAZ1AFU40QDCWrcBZL0/S4Vq4HtgB7DWzU5XyauDBMhhWz70ryVVdb2ZuhGpI2g1MODjfiMFrxZk3s9WNwJ6snHFxQUlXgXfAPeC5mf2O2Y5oqZLcMceCw1+AseCSSTP7mSiOpM3A7RixfvgYgAd+WUQcSSnfPWBlgtIvgf5YVSVdBA6GQF/mS2bmWcvbERmHJF+payFw0MzO1TWApKXBViwL3h5/Pk4AVTjRAMFY9njJXl6wLccrcD3wAHDUzBwuRw18JtbkbkFJruomM7sf2o4u4Jals/mFRgxeFcfBQm97UyOwM+WMiwums/k3QnMps+HWpuLIRC5TCrcRW2pbT35MRiY4XDRsVmiU5uJQIZfxb0k5Ij229eQPySJ287MLGO8Rd1M0XY6AO3LjzYVSy3fAH+VICL4a6o9VtTWbnzbYGKI+IrtQ6Ns2EFuq/5jOTnWD9f4DikeFvvbqhyg2Yzo3voJSy2fAjfEJMYPRQQ2caAAfC7AW2WkvrzU79dCwnRW4Hjgg6JrrbV9VKbkKw1Csyd2Ca7on1y2krHOub3t16//2n79SarbsH7BKtfejoCjmAAAAAElFTkSuQmCC","view/resize.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAqCAYAAACDdWrxAAABeUlEQVRIS+2UvUpdURCFvxXRKJpIEBURsVAIiiBoaaGCjY2VLyH4MBaCPoWlnQlpI6SxsQmkURQL5eK/6JK57iuRnMPZtxAkuOFUhzWz96xvjcg8tluAT5LOQqJMHba/AgPAD0nOEtruAOaB6Lon6U+ucAoYTLe7Bb5XCm1/BCaAXqAVOAHyOkYn27PA5/TGWmXHxvBeT2i7TVIM4MUp7ZhGPlY3V/pVKUxEjAIjyac74LIAjK70PwCoyfYXYDJwyqDoHtiRdFOfql0naBgIrILF/ZIi1yH6h1XbYXCPpKOq7s34GEX7JB00m445YBzYlPSQ1dF2N7CaWN2W9DNXuJxAj1uGVeuVQtvh32LyuR34DexWCv+CfAXoBzYkHb8Boe1OSRcFkBdfNY18IQiUtFUpTJjNAPEFHVfAaQFyjZ3zNBzbQ8BSWkZViEbk1uIpjXR8AKbT7jwEvpVUqEk6L0pHLN5hSWWxeq7XjI/v6Sgz0vZ7Ov7DdDwCkcb1m86tSukAAAAASUVORK5CYII=","view/clickanalyse.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAqCAYAAACDdWrxAAAC7UlEQVRIS5WWT2hUZxTFfyfGFolkoUVKrHQiEaX+IfgHa54UQzUqpWYhLbQU6ULNwgYXuog6yiiTgK2LgtAu6yqbFkpRBEURQzJEBN200NqKkxoDLnQhFUrizJU7vje8SSbzZr7FwDy+c75z7z3nfU80uMxMDin9JC0zewvYAHwIrAH65wWaWQuwOdy8CVgUHnBd0sUKoJktBbYC24B1QHMVNeck3ZWZrYhtXpUg/3/gS0kzDnT2/cDqpFqBUUnnK5pjZutDgo01Tr0g6XbVrprZypBgO9AUU/EK+ErSyzLQzC5XkTkCfBR7fl/Smeh/qasOlPRp9DAkOgp8H5P9o6SriUAnMrOzgNdswNeSntcL9IYNAQ8kHYuXU5Y6u8ZIupldAO5I+nkOsNb8wjk/ljTZKFCSvMbSMrPSiOpNx9uAz3UP4IbfWSsdrcDH4eZuYHF46LCk47PT8S6wG9gbJmRhlfoPSLrhJvdERJs7E+S73dZKmnagsx8JB50UEHdY3+x0dIUEO2qcekTSr/OlY21I4N5dEJMwA6yX9CKejqkqGn8DemPPb0v6YrZXpyS1xYbsRD3AtZjsk5IuJQKdyMyGAa/ZnbNR0tN6gd6wXwAP8SfV0jGnxki6mV1xyf4ubdTkPue/Jf3TEJCMNZFRMQLtyNwqvaTrSkdHZry1MFM8bLLPgY5U8/SyeYHvncotb5b1A/t8c2QGg3sT2WBLBbD95PiGogr9Ej0Gbap8r4ZJ5kR+MPhW7WdGd5npEFaa15IE+YWW5uklf2S6/1N7OnfasG+Ad5KiAfyVzwYfVDQnlc71YTaA8Ntrvtq/y2eDgapdTZ0a60UMhjdvmcCgWDClJge7npSBqfRYYY5M6U/M/NqO1mQ+G7xf4VUH5rNBOXtviLQfzH0afizop0fZroOJQCdKpcfyUKrZFhTpfDgU/F4nMNcH9gPwLJ8Nls3xarUaI+mp9NhTg5GJbPBZQyb3OReayP17rutmHPga1PpCOk+zrlEAAAAASUVORK5CYII=","view/res.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAoCAYAAAD6xArmAAADwUlEQVRIS+3WT2gcdRQH8O/b2SwNC7l4MAEPvbilUkoPOUmLjSDrZn4hxYKH/kGwyB4tQogiu/N+GymyoWguhVBQKKkHQTHsW9fUQwqKp4AgtMXkInhILl4CkoTdmSe/6XZp2pntLli8uMedt9/3mze/33yW8Jw+9Jxy0TeYmV8FcFVVTxPRiwA6AP5U1TvZbHapUqn8nrawxGBVJWvtNVWdJ6K05h1V/dhaW08KT/wRM1sAVQCRqn5JRLdyudw9Iora7faJKIrKqnrBNSWiahAEC0+GHwpm5utEdD+KopsuBMDbzPxt0oqstRdV9Za7lslkzlar1Z8erzsUHATBJhG93C34fmJi4ly5XG6nzTEIgjoRzanqkrX2amowM98F8Fq3wK34PWb+Ii14cXExv7e3V6hWq78+axQrANwt/kVEl5j5h0G2IzMfUdWCtfa3R/VPzvhTAG8AOM/MfwwYehTANwB+ZOYPE4ODIDhJRJvMvD9IqLW2GEXRbSJ6AcBtZr6UGPzoS2Y+lc/nt+bm5v5Oa2CtvaKqywC8bs06M7+eGszMn7nTBqDOzPNpwcvLyyPb29vfAZh2Naq6Za0tpAbXarUzURS53eGKL1trv0oKZ+a3AHytqplMJlOOoui4tfaDvqOw1lZUtabubBOtqOqN0dHRB/v7++62XwHwDoB33dkAUGPmoO92e/yitXZeVT8BkE1acbdpPQiCj4hIBw52hQsLC8c6nc77AN4E8FK3yQ4R/Qzgc2b+Je0ZDPU+fjiZp1eXFD5U8CB7u+/DGybgXxnFMA3/m1GISGwegNMAeuYBuON53lKpVBrePBG5RkTuSPc1b2ZmZnDzRKRnHoDYvIODg3u5XM69/E8AKAO40G1aNcb0N6/ZbF5X1fsAbjpInXnGmETzGo3GRdew+0DPGmPSzRORTQA988bHx89NTk6mmtdoNGLziGjJ9/1085rN5l1VPWSeMSbVvLW1tXwYhoXp6en+5olIbB6A2Dzf9wcyb319/cju7m5hdnY22TwRic3zPO98qVQayLxWq3U0DMPYPGNMsnmrq6snx8bGNqempgYyT0SKzjoAsXnGmP7mNZvNU9lsdqtYLKaaJyJXABwyzxiTbp6IxOYRUd33/VTzNjY2RnZ2dnrmAdgyxqSbJyJnAMTmEdFl3/cTzROR2DzHk6qWiei4Maa/eSJScZY99FRXPM+7MTIy8iAMQ6/dbsfmEVHPPGPM4OaJiBtDqnmuqfuL4Pv+8Oa1Wq1jYRg+ZR6A2DxjzP/mPRupfwAf56Q4urCh6QAAAABJRU5ErkJggg==","view/tab_panel.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAABICAYAAADyMAW8AAAAcUlEQVRYR+3WsQ3AMAhE0TCMeyTvP1tShRQo7lxYegxA8fUPLuac97VhwuKXKhTlFxRQ9GPDClawYvGEDwxIZu7pFRZXr4ACinY1ghWsYMX/NxWQr22edyvGGHt6hcV1NqGAon8QVrCCFYteISDnBuQB3xJuQcDkEngAAAAASUVORK5CYII=","view/btn_close.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAqCAYAAACz+XvQAAACmUlEQVRIS7WWS0/bUBCFz7mJmyZxENm06mNVoVZC7LqGn9FNqy55/BSWSEhs2/4uuqFVoA150JLKJvGdaiIH2TfXNoKQpeP5PHPO3GMTK/5xxTwsAUWkBeBZ+qAByb/Zh4pIA8CL9NqY5Dj7vw9YA/ABwDsAfwB8ITnUIhF5CuATgNcAfgH4RnJSCkwLl6AA/lXBtLZQQxFxoTr6q6LOFl2WmuJAtcY7ZuXIixsczfRyTlPfhpSN7BpwBeBtFdQLFJE2gI8AXi7GBBBl3Fdnv5L87XbpWxuFfQbw3NXM0dQLLdrDIH3ylGTiLLYB8CS9lpCc3tmU+xzL1Z9lEXl/n06KavjowCiK1uM4fqMd1Ov1s3a7fZntZjabtSeTiQYHgiC4aLVavZwpbofT6TQYDAaH1tod3bMwDHc7nc5PLZrNZmG/3z8WkS1jzGm32z1oNBqjUqD+6YM2m81xFWyeNkUaulAAlyKyWdTZbdqUmZKFakEVrLRDV7P5zY6m3rQp6tA1AMC5tXY7he51Op0fdwbGcdwdDodHWc2MMdcL9wGM1tbW9sMw/L6UNm6HChuNRifW2g1XM0dTL3TJZS1KkkTDFbVaLQqCIJcm6k0URRpxuvg39Xo9rtzDh5zt1Z/lXq+32rR5dKC1dt0YM08bAGd65BxN1ZB52ojIBcl82rgdWmsDkocAdgDoW22X5DxtSIZJkhyT3AJwCuCAZD5tfCP7oMaYcRVs/tAiDT1QHX2zqLPbtCkzxYFqjXfM3GKXAR3NtC6nqTccioAeA84BbCuU5B4Af9r4gCLSBXCU1UxErjPuj0Rk3xiznDYuMIWdANhwNXM09UKXXNai9LtQ9y4yxuS/XUijr9L0lXBDMp82j370HhJdWvsftiHJYFPSIqEAAAAASUVORK5CYII=","comp/combobox.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFsAAABCCAYAAAA476rKAAACfElEQVR4Xu3bMYsTURQF4PMmExgIWkgEU5hskyJYxGYKY5VS7NzCylL8Bftj3NbKQjuxTBWbaUwhKdIYLCJotlACA5m8kQTZZZkkeN9dbuNJOXPPu/DN5ZHkMa7dbpfgx0TAEdvEedeE2HbWxDa0JjaxLQUMe3HPJrahQECrNE3RarUOJheLBbIsq9znZAdgJ0mC4XCIer1eSa/Xa4xGI+R5TuwA272RTqeDfr9fuTeZTDCfz/dmONkK/cFggGazebnCcrnEeDw+uCKxFdiNRmO3nURRBO/9bvtYrVbEVpgejXa7XfR6PUynU8xms6O1nGzlU3DO7fbu7V5dlsf/0yO2ElsSJ7ZES1lLbCWgJE5siZaylthKQEmc2BItZS2xlYCSOLElWspaYisBJXFiS7SUtcRWAkrixJZoKWuJrQSUxIkt0VLWElsJKIkTW6L1t5an6wFooRGerofKBeZ4uh4IFxrj6XqoXECOp+sBaJoIT9c1esIsT9eFYFbl/J5tJc13agyliU1sWwHDbtyziW0oYNiKk22JfXJ6xnfXjcDdFttnb43a/b9tovQ5iG30/IltBL1tQ2xiGwoYtuJkE9tQILBV/ugl4rh2MF1sPJJP59fuc7IDsTe37mHz8Bki+MoKHhFqn9+j9vs7sQN9K7G89xRx837levHzG5Lph8p1TrZK3iF//ApxdLVI4YFk/BpA9Uc5sVXYwObOCfyDJ3AoUcIh+vIRtYuve1clthJ7G8/7p4hv30Xx6weSybuDKxL7BrARxcjTF0iyN4AviH0Tpto1ONlaQUGe2AIsbSmxtYKCPLEFWNpSYmsFBXliC7C0pZfY2oWY/zeBP8uaLni/AFTVAAAAAElFTkSuQmCC","comp/textinput.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFsAAAAWCAYAAACv8OArAAAAZElEQVRYR+3UQQkAMAwEwcZI/LtsoSL2NTGwMByZ3b3HJQIDO3H+EdidNezQGjbsUiBs+dmwQ4EwZdmwQ4EwZdmwQ4EwZdmwQ4EwZdmwQ4EwZdmwQ4EwZdmwQ4EwZdmwQ4Ew9QBe0R29X9x+dwAAAABJRU5ErkJggg==","comp/vscroll.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAhCAYAAAA/F0BXAAAAOklEQVRIS2N8+OzVf2YWFgYmJiYGcgHjqCEYQTcaJpipaTRMRsOEmDJmNJ2MppPRdEJMCIymE2JCCQAYonwDuu2VMAAAAABJRU5ErkJggg==","comp/vscroll$down.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAzCAYAAABxCePHAAAC/klEQVRIS+2WS0wTURSG/zszBcrLFVvjio0LiAqRRDAmGpRodFE1MQQQkOKGqBujRo3ExLjB4MaKgDzUaGQhvoJGYwAjYoioERcuDGxYEIwPkBY6nWvObXuLnXZaSklYOIu5M/fxzZn/nvPPsInJKa5qGhRFQaIH+w8xSbcymtTd+gBFYXAdyjM9sf7ORxgGR0t5/j9jpkhq2t5B0xQwBrgqNsnJ9V0j4BzQdQNtNYXWkKz0NDiaXkBTFTCFoaWmCHVtQ+AGh+4z0HNiO2bmPNYQGiXQvkuPoaqqiIgi8Pl8eHBqtwlA86MKS6Cy8z1gjIFzjqcXHBEBlpBgRNuOd+HVlYqogJiQIChcg/BtW5k8SaSSkxPJ5PRPTttHfkI7kcghIpn8NYfp33NLXp+TnYG1OWvA3ox9499nPSjdkCsgHJxOIjc43VMrugL9dEUD4Oj/PA4CsUfDX/jOjbmisHTDCCzi4t4QgLDrQF+qTYOmqhgYGw9BvLpv0ZNjQwieaU9b7ZCDriFhSt3VBSZNartHA6aUJ7SK+jqO5n5pSp1HiqSw1e3Di0ypwBpiU1XsudwnTanraDEqrg2GmZLbGkJh2jQVZY29JlPqPe03JX/uxLE7Nk3DjjP3pCn1Ne7HrNsjdYoLQsmWYtNQ3NCBgeZKzLrn/foEoogbQgvSUmz4454P7VQikGhpHzGSZdVOUqqYTGli6gemZ9yJ+0lSTalk/TrxtQOYaBnESbTinokev4UG+p+9/xoyJQKQn8x7vf7JjEFZ1FJBBvuC12RINIdAwtkIQuksnxgHhKBUZ6scQtLSNyiWJpav47z9STjbjfJ8k5iVN0eEs911bhZjUTWpbR+RztZ6uFBERNCq1rfS2e43lFhDsjPscDS9lM7W4dyCquuvpbM9PFkq0iHm7mSl2yP+bj05uxdeXZe5FHOL6Xdr17nQ79bziwew4NXFqwUTMiaEtKBPwtZjnRi8WgXPglfqsyQITc60pwpAeNpH1GRZtRM0pWVVcTJM6S+dYaRsIf025wAAAABJRU5ErkJggg==","comp/vscroll$bar.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAA/CAYAAAAGyyO8AAABYElEQVRYR+2Wv0sDMRTH30tarCg6dRWnQnFT6OiqoP+tk+Cig+AiHayDiNSlg+jgD47K1US+Lwm5s4o/mkElN1xy73KfcF/efTi+Ht3Y0X1Btw8FffdoLy3QSnuZ+HhwZe+exrS13hGGJYsTWSszN0rJ1zHDDbJ0eDYkgHjv5Nxub3TIGEsTY/xDVq6NAN7MfW2u2aCG1nQ0GEZIOXmp7Pw5BPDF+VaGIGQfbM6k0ng5kw8/wF/eJzP5JInZkjg2CSS8zk6vCys7Wb8r5qqsncAP+pdR1Lu9rvgVT4uYg+3F+PCtAzjzu/taKdKKBSS2/wkEMBg/Q+rB50zqzZb7ZPoD/GeZ1HySxGxJHJsEEl5nc22VmCFalpFJTjLKNUtFxlDfP72IogYAP8PPZekWM5OqjErFWpjjbxprABJRA/JYjOOOX4Bgo6bWGYKsfMg5k+lmy5n8uUxm8kkSs6Vw7Cstibc9Fv5vWQAAAABJRU5ErkJggg==","comp/vscroll$up.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAzCAYAAABxCePHAAADF0lEQVRIS92WTUhUURTHz31vPv0KKmkXrtxUGNomkCANLdCUpEatJFuIClIEFRl9kGH0BYWQElLpotGKEJXAtKQooYUFpi1axLQZMCyyZJqv926cM2/uTM288emoUHfx3v16v3fuuef+72Hume/c7/cBAwaLKWaLBZjLPc0Zk0CSJGBs4SDOObDP7i9ckuXkIbLJRJDFFrJk2SGNvZNwy7ExoZEJLWnqfQ+4SlUFaHNs0gXpQhq6x0GWGe0Y7oCicGivyYsLigup7XgFJlkCJjFwNm2HqrZR4CqHoKLC3fr8GFAMpPLqEJhMoZjpay6Bnx4vpKfYoLx1kCwKBlXoOV78BygGsudCH1nwtNVBgHBBUFFzL1n0+Gx5YghOxhINiAbFG1uZODESxf+bJShKrulv8HUusp1G/IBz1qTZIGvdamBjU584Aopzs+lbDhwfFFgc2/imLq0fazgAHF5MumBtuh3YwJsPfGdeNqgY1qqqfcSprRLgr7rWZzWbwCTL8HLKFYEEgkrUn+eHIDzNbltBSG33O+jcnxNZmrYcw5Yc7hoXotRenRPyz0IgBzrGYkTp9qEtxiEV10eEKD08Wgh7bzwTonSvIV/soK5jd53rE6I0eGY3/PL5wWYxQ+nFgShRKqK6LqTwhJNEafRKNQHCcWK3WmDHqR5NlMoSQzAWUV+9vkBMsKXYLCSbs3Oe+SGqqupGrIL3h3YclifYkjo7yZ7izIzUUGrhnvXAzA+PURkR8xCwPnMVsCUVpW0bsiCUKOH9S0980JvaLJSQUTal9Q+9/RgRJQSgnvgCgdBkxkCKektSpC9cR0HCOQgiZUMI3njijwYg+COzLP9rkLr7E3Dn4Gbhp7BPDC+n0TkhlK2zJpccuSBIfVdsutVdt9U4pLbjtVC2B0cKYN/N50LZHh0rFGGguztV14aFsvWfLiVhSrVboaSlXyjbk/NlBNKFVLT0k7INX3KAx+sXfkBlKzjpJItGLlcmhmSkptAB83h9MTuCICxBRUkMwUmY5+uFPY7LmJ7GW05SZycsSos9xUsmSr8BfgGeWI6+BgEAAAAASUVORK5CYII=","comp/button.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE0AAABFCAYAAAAPWmvdAAABA0lEQVR4Xu3ZMRGDUBRFwXwfKSgxFhfRgAbUxEakkCEO3qmX+p9m5w7NW9v7cz18I4EFbeT1fwxtbgYtmEGDVgRC458GLQiExNKgBYGQWBq0IBASS4MWBEJiadCCQEgsDVoQCImlQQsCIbE0aEEgJJZW0Pbj64Q3hFvQhmL3CQ8atLlAKCwNWhAIiaVBCwIhsTRoQSAklgYtCITE0qAFgZBYGrQgEBJLgxYEQmJp0IJASCwNWhAIiaUVtOfrdMIbwi1oQ7H7hAcN2lwgFJYGLQiExNKgBYGQWBq0IBASS4MWBEJiadCCQEgsDVoQCImlQQsCIbE0aEEgJJYGLQiExNIC2g/MxaMp6CSauwAAAABJRU5ErkJggg==","view/bg_tool.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAMklEQVRYR+3QQREAAAjDMCYG/DsEGXxSBb2ke7YeiwECBAgQIECAAAECBAgQIEDgW+AAAeIuAVS/mngAAAAASUVORK5CYII=","comp/minBtn.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAA8CAYAAAB1odqiAAAArUlEQVRYR+3X0QmAMAwE0GQN19B9nM193CmiIH7ZXOAoRc/fpjl8jVDdOj/eOc8USBcXqUjLAtDQRMSOdHb3JatTYCZUXodIy10bGxTI1Lx6/YA0Ima6W2tKFcjmdpGKtCow7NBAdxozy+804Gfx/cDqbLzWDzs0ekNY4B9nOMEehMKTVIEEyKeFSKmc18+MppRtipJuYPCa1SkwEyqvo6Tlxm8bFEijvBt9n/QA/fOPydLHcUIAAAAASUVORK5CYII=","view/zoom_out.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAoCAYAAAD6xArmAAACy0lEQVRIS92WQU8TQRTH/28oQkj0CL0QOMAJQkz4DkS6A+GA+A00Hrhj0uy8NiTwEdBPAOrB0Fnq3U8g6gkOSjxUjpCQCu08M5u2qaVAt7YmOqfNZPa3b9/+Z35L6NOgPnHx98Gbm5sTlUplA0AGQBpACcBBKpXazmaz3+5607YVM/MjEXlNRPdbASJyTkRrzPz+Nvg1MDNPAvgI4AGA10qpvHPuSCk17ZwLAazV4HPM/PUmeDvwSwBPAbxl5sf+RmYWZo7XMvOehwPYYebnScAnAMaVUrNhGH5pBefz+Rnn3GcAJ8w8kQT8E8A9AEMA/HXrqM9fMrO/bjvataJvFdd7/IaZfS9/67ExZpeIngB4xczPklQ8KSKHPmoispdKpXKjo6PHp6enU5VKxXhoV6moVXhnjpVS5wDOwjD81K7qG7e033lXV1cviMjvvDEAP0TkYHBwcKtarT4UkXcALolo1RhTaIV3dVYYY9aIyOfZDw9fMcYUm+FdgWvtYgCmBisrpRbCMPxQh3cNbgM3zJzvCdhDcrncuojMA8gy8/eegTvO8U0Lk87/UY9ve9h/BI6iyJ+1GyLScB4RHQDYDoKgO+dFURSfFQCuOQ9A7LwgCJI5r1gsTlar1YbznHP5crl8NDw8PK2Uip3n4QMDA3OLi4udO89a23Ce1jp2nrVWtNbxh7bWxs4jop0gCDp3XhRFJyIy7pybXV5ejp3XDN7f359RSsXO01p37jxrbey8i4uLoZGRkWvOa5q/1Fp37rx+VtxwntY6dl5zK6Io2hWR2Hla686dV0vFoY+aP8xFJJdOp49LpdIUEZkaNHkqfIWd5JiIzkXkLAiCZM7zO09EYueJyBgRxc4joi0ADeeJyOrS0lJvnBdFkf8xbDhPKbWSyWR647xCocC+53XnAVjQWvfGeS1wo7XunfOstesA5pVS2Uwm8w877xeHf444cscwYAAAAABJRU5ErkJggg==","view/refresh2.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAA/CAYAAAAPIIPGAAAEIElEQVRYR+2XTUhjVxTH/+fGpBrGT/xoBQdFFMMQLNLNbLooLbaFzqKMUhCSZwsuhGG6KCNd6DuRLgqzmGVxUd8LUrpoYWZTKO1yNi2F1oVtceEHflSLqNEav8bklPuqgsl75sUPSsucTQj33v895+R/7y+XcA1B16CJ/6GoYRiDItKfzWZjExMTv5/XtoLlx2Kxm0qp1wH0AHgTwC4RfWRZ1mdewp6ig4ODN9Lp9CMieh+AchH41Lbtj92EXUUHBgaCh4eH3wJ4zSObGSLqtSzrZ9+ihmF8CODR8YIflFL3MplMNxF9IiJWIBC4Pz4+/ldR5RuG8QuAlwGsAWi3bTsVj8dvAWhOJpPfFPK2a/mGYewDeAHAV7Zt9+aK9PX1VYRCoVcApNxa4CX6J4B6AE9t2341V9QwjO8AvAFg27btytxxL9EvAbynJxNRj2VZX58sjMfjd4joyT9D9NiyrHf9iup+/gggBCALQPfxVwARAO8cWywD4LZt2z/5EtWT+vv774rIBIBSlx/mmT5dyWTyC9+WOpkYi8XalVIPRKQbwItEpHv9PRE9tCzrt6IsVcgyhcYLnv1CAkWXfxFBxzEXXXipq+8imz7P9CJdO3+N754y86A+vYFAIDY8PHw58DHzTQB54DNNs3jwMfONY6R4go+Z/YNvbGwsuLKyci74APQys3/wMfMZ8InIPaVUt4g44AuHw/eHhoaKAx8znwEfM6dGR0dviUizaZoXA59pmvtE5ICPmfPAx8wVABzwubXA1VLM7IBPRJ4mEok88DHzKfiY2R/4mPkUfCLSk0gkTsHHzHdE5Immnog8TiQS/sDHzK7gE5EIEZ2CTyl1e2RkxD/4TNO8S0Su4BORZ0qpftM0iwefaZrtAB4QkQM+AA74ADxk5ufgc78CfV99xdy61yMajUbfAvA5gJeKycZj7gqADygajf5xRYIn+6xoUbmCDM9I/LuidXV1qK2txdzcHPb39ZPAOwpmGgqFUFFRgerqauczm81iaWkJa2v64eLhU6+eKqXQ1NTkZOcWq6urWF5edh1zzZSI0NbWhvLyctdFBwcHmJ2dxe7urn/R+vp6J0sd6XQaCwsLqKysRGNjI9bX17G4uIhMRr8jiig/EokgHA7j6OgIU1NTjkBZWRl0f7e2tgo60LX8rq4u/UjC5uamU2ZuBAIBZ1O9mVsLXEU7OztRUlKCnZ0dTE9P54nqfmsnaNHJycm8cVfRlpYW1NTUOJN1pjrjk6iqqkJra6vzNZVKYWZmxp+oLq2jo8NpgQ7dx729PZSWlkKL6hARpwr9Q+aGp/m12Zubm6H9mhtacH5+HhsbG/4tdTJTZ9bQ0OD0LxgMOm7Y3t6GNv55R7XgMS3oH5cJ/y3Rq775V3X5bx8zSv8DuWzoa2vgb5tumbHGlerDAAAAAElFTkSuQmCC","view/settings2.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAA/CAYAAAAPIIPGAAAD2ElEQVRYR+1Xz08bRxT+ZjAGYQoH4rS9IBJBQJEsUC8VKNdQtamUE0fLayqhKHeOaGbFkT8gFVLZtXzk1qqKSs4NUg8RXCIQVoOQ2jRFHHCwBRj2VW+zttY/14BXVaPOyR7NfPN9771536xACEOEgImPDHRhYaHv/Pz8kEMVjUbjq6urxVZhayo/lUo9chzndTabfWMYxkMAGx7QrG3bL5LJ5B0p5f1MJvNz7QENQdPp9LdE9CMAZrcHYAaoxJ8AvARwD8AtAI9t2/7JD9wQdH5+/q7jOLzx04DqeCelnFlbW/s9EJQXGIbxq8eQ//4mhPieiJjlEwBf8qQQYtOyLFZRNeqYJpPJWCQSeUBEzz3JrwqFwvT6+vo575ybm4vGYrFNAF8AICnlbKlU2sxms4Uych2oYRh5AJ9UFggxb1mW5aeSTqfTRLTmm3tv2/bAVUCfWpb1zA9qGAaHwD/XGjQU+WVGHU0Ug4ZSUjXFnwMwXVP8nP1RAPG2i5/Z+q9pKpWaFUL8wvNE9FUmk9m48jWtLWavofztNZTb124oN2neH1mTvmoo/pcfHDGtdZ9nLbw4rrW+nvGZpvlISvl6aWnpjWmaD4nINT4hxKxS6sXy8vIdx3HuK6XaMz6ttWt8QohDInKNTwjhJtWzlJdCiHtEdEtK+VgpFWx8Wuu7RMQbWxofEb0TQsxordszPq11Q+MjoidCCNf4AGxqrYONb2VlJVYsFh84jvPck/yKW5/W2jU+rXWUwdj4OBQcYzbCxcXF5sanlMoLIaqMTylVZXymaVYZHxG9N02zufE1AH2qlKoyPqUUh6AyFwgaivzyVehoorxkdL6k/MUPIEdE0/7i5zcUGx8Rxdsufmbrv6ZKqSrjM01z48rXtLbFeA3FNT4At6/dUIJ7V/MV/6HOn0gkvgbwA4DPbyLZ2/sWwHcikUj82SHAMqe3DMrv+I6Ofw9USonJyUlXzfb2NhzHaamsKdPBwUGcnp7i7OwMAwMDGBsbc4H29vaQz+fR09OD3t5eHB8f1x3QEJQBR0dHcXFx4QL39/dXbTw5OXEBI5EIcrlcHXBDUGYxPj6O7u7uljJLpRJ2d3ddNf7RVD6DlhkWCgUcHrof0YjH44jFYu5vnt/Z2QmWz0lhsHIMi8Wiu/HDF6T7mMDExAT6+vjR8iHGHA5/8uqYTk1Noaurq3L6/v4+jo6OqtgMDQ1hZGSkMnd5eYmtra3K/0DQg4ODivTyLg7B8PBw+6ChyC8f39FEMWgoJRVK8TPbjl/T2mruWEO5SYMNo/P/xaDfeB712U3YeXv/ALDwD+TbY8Dbd9BBAAAAAElFTkSuQmCC","view/setting.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAkCAYAAAC9itu8AAACAklEQVQ4T5XUS4iOcRTH8c9xCeVeiiiXhSJRJFIusRO2lEtZKFlgY6GxZDUrk2TFwii22JJLlERRLKRQJmXBkHIb8+hM/2d6ememed93957n93v+55zf9/mHll9VVTNxopTPR8T3piTyT1VVs7AL9zEd+4roOn5gK25HxLfacAjL8A8TWw6ta28jorc2LMLhIu7Ds2Jah4XlRVci4mNUVTUDadiLFF/G5GL4iyOYjxsYMnQ1BDfxujk0VmJPecFAO4bV2Nk05Bqzz3Za6ut86JJDx2vN4Hbj3hjBbcOt4eCaQZXUj5daT4pGoNFimI1zpdYVEf2jsTQX+5MX5NaOFdFFJHzJ2bWI+FJv6SRWYACTWliqa68ioqc2LMWpwtJ7PCymzVhSWOqOiHeZdPachqNIcXdBJV/2B6cLa5cwZLjQYOkqnuNsOeEM1uJgE43xDBsaH9QQfJ21VNBoHfpBaWHLiKGLoeO1ZnAHkpcxgkvOeoeDa0FjTnNLEfF1PJamYkcR3YmIX6OxNA35Kb7BFKwvoqf4jeV4GRE/azQ2Yh4GMaGFpbr2OSKe1Ibse1MRJ84fimkxMqc0Pc55MrjsOYvZRoofNW6/vPUSwEQ+2+tPQ14h9fX4Ap+aQ2MB1pQTB9sx5K24qmnorKWCRvtDF0PHa+0suBaW0ry91O5mus3n/wHmQwUTIH+tVgAAAABJRU5ErkJggg==","view/refresh.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAkCAYAAAC9itu8AAACiElEQVQ4T4WVS4iPYRTGf4/7/X6XcivXcktEUhTKQkqyYCOKjWyUhezFThbIlJ3LYrIRkoWGUhhhTMko4zJujYRpxgxHj9737/P3zfh239c57/uc5/zO+UQ3T0QsBRYCtZI+5jBVx0fEcGA6MA+YCXQCVyXddWwlISL6ARuARcXvhQPrJF3/nRARvYHtwLRuFLYCFyW15ITl6XTHvwIuJzlrgHrgiqSOiqSI2ANMAL4BxyW1R8RYYKSkp8Vb8w2HgD7AE0kXSozoD0wC2nPCAWAw0CyppiRhBzAD6MgJW4D5KdDFNeSkiJgFbEvONeYE698N2K0ArPsDMAZwguN+AmeKfZgLbAb6llj7A7gk6eFfnY6I0cDKpNc1tQFNwG1JvvFPp0sKXQ2sAGokveuJpVHAHGBJ4ul76vLNapbs9dYk6R8oU7driyztA2Z3w5L1n5LUnBPWptMd/xw4l+RscsHAeeNSZMloTAG+AIcltUXERPdB0qMylk4klu5LOlni2ABgqm3Oko4BQ4Fnko6WJOxPzlXg2wV4hv2czuOYhmsBsDf1rD7fYP0HkyyzZN0twHjACZmlI0WWFgM7e2DprKQ71SyNA9YDBnFYcq0RuOZ5/h9LdsVS6yV97YmlgYDn2X3wjUa7QdKLapY8015ePrWMJVtembhewLI0YWU4eZvck/Q525pXo4M/AY+TLMP40u+SuooseVjsitm/IakzItz5QcXhKSZsBCyrpdjlwuZwfSO8mLOkdYAHqFXSrRKWvErtXFdOcJcnp0AX96ZwuldQ5uxtTrD+VUmWWXqfujwk8eQ4f68rsuRG+d/gZVb9eIk9kPS6miXvIv91rNc12TXPc5MkTyO/AFhJCujHqZlCAAAAAElFTkSuQmCC","comp/checkbox.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAqCAYAAACDdWrxAAABbUlEQVRIS+2TP0gCURzHv88GRYsrExyOo5cEQVEtWdQQpE4N0R+HxmirXXCrKYigqMF2IRqCQByaLJqNIFpyUIzu4rIwpExODy88ITD/cJ603Rsf7/OGz+/zI5TSEAE20cZRgBMySKni8XrbwICrWAwG2ESZIadFS53J0R25brCyHZNud1vbcRuPV7fDAOu9GXJatNSZHN2R6wb/PfJCrxOZCR8Gbk6hWc6Xg8PrcgBETMIVPdIGSjYG/NoOSHcfkLqDK3qsBSRIrgRAuBF1quUPEUPhYGMwb2dhywrqQ3F0Dt++jSokJMBdhmDO52pB2WwFP7OK8rgH9os99IgppNf3QWwMFP4RNHKALrmoflIj53l6CaWpRcBkgiIkYHl6gDTrh5JJg57v/kJ1YOUixw7jfWELxMpAKUmAXAR7tg3LZ7am3IbjKDBOvPiDqkUmcoj+9H1d7k3nmHdweBubB70ON9wRzQH8pVVQb+Q/zZAEfpwDCU4AAAAASUVORK5CYII=","comp/btn_close.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAA8CAYAAAB1odqiAAAE6UlEQVRYR+3Y30+bVRgH8G/T0t/0Jy0USrIsC0E2GMKAVYcRpmSbEzIGZhqyxCxeceGVF3pjvJl/wYyJWZYY4hZBFnBuBBUW2ewYAxlsSMiyLKH8aEt/0vZtSxvM+562We15C6jlxr53zfO8z+ec5z2nOTmCk598tY19fAQs+Hlvz76QX1zpAwd+1NMNXzieU1QtFeKbvn4CXvqgC95wLKegRirC1e8GCPjh+53wMnRwedkG54aLG4yhSI/ycnPawHaKJ5M1MhGuXR8k4MX3OnjBx3NPcLX3DPfepSu3odfrYC4r5X7bVlbhcrnT4kdrjlA7xYLffj9EwJ6udnhCW9TEJ08XUgWTqE6n5XLdbk9G7MjhKmodrbwAfQPDBLxw7h1ecH3dDq/Xm1GYrZqceXIgGo0GJSXFvOCNmz8RsLv9NNyhKO+icTqc8Pl8acDLyWyr1Wo1DEYDbw2dXIz+4TsE7DzbBneQH2SruDZc8Pv9GSiLqVQq6Iv0WVe5TiHG4K1RAnaceguuYCTrCx63G4FAgAoqlUpodbqs7+sVEgyN/ELAs20t2Ajwgz6vF6FgMGtL5QoF1BoNL1qklODW6DgBT518gxcM+P1gQqFdLRqZXA6lSkVFWXDk198I2NZyAs7NMDXR7XRmYBKZjMuNMEzmljHQF46hUIrR8XsEbG228IJ+T/rGFkskkMoVHBgOBRGNRNI2vkpL/5YsODZhJeCbJ47D4WeoM4wyDLai5PsWiCUQJ2aXTN4pnswzqmS4e+8BAZstDbxg1qW3hyALTlinCPh6Uz1C0Rg2w/S/tz3UpaYWSgsgF4twf3IagvOXr297PR5YGuv+bd2s71sfzkCj1ULQe+3u9vraGlg0lw+LlZhMEIzUNu7vmYYFmz/9LJeTS9We+PIymaGl6wLizo2cokJDEawDNxLg+W7EHTkGjUWw/tBPwOMdnYg7nNQZep4/Q2B9jYspS0zQHjyUlrdTPJksNBrwYGiQgE3vtiNup4O2SSuOzk5y7z2ubYKyuBiaAwe5394XzxGw29Pi5iYLdeDCYgMmfxxOgKfPIG53UBNt049SBVNo4g864HRmxMz1x3hAIybv3CZg49ttiK/bqYneFRuCLldGYTY5OfPkQBR6PTRl6cfIVEtLivHw51ECNrS2Ir62zrtKfWtrCHo8acDLyWyrFVot1CYTbw2hqQRTY2MJsLk5K8hW8TkcCPp8GSiHqdVQG41ZtxUHTkwQ8NhrFsRXyUrke3wuF0L+TSooVxVCrc9+iBKWmvDodysB65saEFtZ5cX8Hi+YQDBrS2VKBVRa/jONqKwU05NTBKyrexWxlRUquOnfBBNidrVoZHIZClWF1DqisjLMzPxBwNraasRsdHDD6c7ApDIJVzTMRDJiRQb6EUNkLsPs7DwBa6qrELPZqCNzu/1pG1siEUOhkHK5wWAYkUg0La7T0U9tIrMZc/MLBKw+XImtZTrIMBFEouQkIBEXQJaYXXJ0O8WTeQXlZsw/XSRg1SsVvGDWpbuHIAsu/LlEwMrKCsQDAcQ93j2U2H2qUKuBUKnE4uISBF9f/Hj7wJwVhyordl/hH2Q+W1zCixoLOdNUj98Ei+byYbH5lnPkmJhL6O+18/c0/1m38/c0qVbm72nYVuTvadgu5O9pUtsif0+Tv6dhF8P/657mLz4NfQVdLmZiAAAAAElFTkSuQmCC","comp/textarea.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFsAAAAXCAYAAABkrDOOAAAA4klEQVRoQ+3ZvQrCMBiF4e9rU+sPOErRqxDRe/KG9Fp0EAc3VzuIg1ML4uDmlkaaquDenMUTyJoDD+8W3ZyKlaoshSeogHOy1m1euOmoI1EU+auqQUf/8XHnnBzLp3jsWdaVJEnEGEPsADXU2Ifro8Gej/uSpqnHruvmaVegqirZX+4N9mIy8Nh13XEct7vE18RaK7vzjdiIFoiNUH5vEJvYQAHgFMsmNlAAOMWyiQ0UAE6xbGIDBYBTLJvYQAHgFMsmNlAAOMWyiQ0UAE79lM2fmrDy358a/q6Hhf68ng175QueKdEXxUGVVwAAAABJRU5ErkJggg==","view/re.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAoCAYAAAD6xArmAAACpklEQVRIS+WWPUgcQRiG3+8O70QEUwTB1EJgsTGdRRrhOMjOtEtSRbBIBMFKuCtkZleES2uRQoWQJggKKW7Of7GyTRvBLkVShhS73OXMfWGOU85Es7uXs0m2XeZh+OZ95xnCHX10R1ykBvu+P5fP59+VSqVvf9pUarBS6jWAR0Q0rbWOboP3BCaiOQAHAKTW+vtN8L8BW96W4zjPPM/78Ss8FlypVEYajYbHzALAJIAHALJdoDWl1Esi4m74rWBmpiAI5pk5AHAvJj0VrXU5Fmyhvu+/AfA8YRxfaa1LsWDf92eZeSMJlJnXtdYvEo1Ca30G4GEH/ImI1lqt1nE+nz9vNBrLnVTY39uO4zxNdHgrKytjzWbzs13FzKfDw8PFxcXF8HL3Nscd8BEAN3HcgiCYbLVaHyyIiGaUUm+7R9JzQZRSo0T0BUCGmRd831/tBttK53K5zXK5/DV1pZVSG0Q0C2BXa/0kySEmKojWeoiZD4hoKpvNTiwtLX1MC7+1IFrrQWZeJaJxx3EKN5186lF0LwiC4DEz31dKvU+z69i7Ig0stnm9wv4zsDGm7bxCodBf5xlj2s5j5mkpZf+c1wHPEdFBGIbS87z+OO8S3EnAVhRFvTnv8PBwpF6ve0QkiGiSmX9znuu66ZxXq9XmAcQ6j5krUspkzqvVaqmcJ4SId54xxl6ZiZwHYN113WTOq1arZ0R05TwAa5lM5rher5/ncrllAPYl1HZeFEXJnLe3tzd2cXHRdh6A04GBgWKxWLxyXlcqjqIochPHbWdn58p5AGaEENec13NB9vf3R5vNZtt5RLTguu4159lKA9gUQqR3njHGHpx9tOxKKfvnvGq1OmQrC2AKwIQQon/OOzk5GQzD0I5hPIqi/jvPGNN2npTyH3feTzoJOzgswwlqAAAAAElFTkSuQmCC","view/search.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAqCAYAAABcOxDuAAABX0lEQVRIS+3VsUrEQBAG4H9HiDZiJQg+gJVaiKAoWClYXWeZ7D6CtbWFr5Ai2ayQxkLQRgsLGwtBUQsRC6sDCxHxEIvIZSRwxRGSu83pNUe23c0H+89kR2AISwzBxAiinuctCSH2AawD+AFwRkR7QRC85CO0ur5SaoOZzwGM54A3IlrJw1aolPIewEJJUY+01jvde31RKeUMgNceXdLSWk9VQl3XnSWiZhnKzF9RFE1WQrPDUsonAHNFsBDiJAzDRmXUdd1tIjoFMJaDW0KI1TAMH61RpdQ0Mx8z8zMzHxLRAYBlAG0Al2ma7hpjHqxbqgNeAJgHcKW1XutEMeE4Ttv3/axXC1dh9XPgbZqmW8aYd9t3ohCVUt4BWARwkyTJZhzHH7Zgdq4MvQbw7ThOw/f9zypgKVoVsS7UX+C+v+kgeI0Oklrvb0Yw03rwlZW8Hnz14OvqjXrw1e/pPyfwCww91CttlMG7AAAAAElFTkSuQmCC","view/save.png":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAoCAYAAAD6xArmAAAA1klEQVRIS+2VzQ3DIAyFwxwdoMMAA/VQ8ZByyEBhmA7QOVxxKLIaOcIoSZUfrlifHw/wM91Ky6zE7SZgANTaDEDhzYJ5odSMC7nA5U7+b4X2dVQr3ic4hHCTlMcY33xPZUUGcwBvdEJwjcfGGIQQ4rd2qenWA3hyAUuABwCP31NtN+i1v02qP4DicRybM885J2ceB/NCyUupfuLxBS4WbmKF9rNUv4p9gq21d0l5SunF91RWZDAH8EYnBNd4nDPPWitnXst0I6Leez+feVowEQ3e+wNk3ge7C/Qp3GfwkgAAAABJRU5ErkJggg=="};},'base64',function(){return this.base64=new Base64Atlas(Base64AtlasManager.dataO);}
  5106. ]);
  5107. return Base64AtlasManager;
  5108. })()
  5109. /**
  5110. *
  5111. *@author ww
  5112. *@version 1.0
  5113. *
  5114. *@created 2015-9-25 上午10:48:54
  5115. */
  5116. //class laya.debug.tools.TraceTool
  5117. var TraceTool=(function(){
  5118. function TraceTool(){}
  5119. __class(TraceTool,'laya.debug.tools.TraceTool');
  5120. TraceTool.closeAllLog=function(){
  5121. var logFun;
  5122. logFun=TraceTool.emptyLog;
  5123. Browser.window.console.log=logFun;
  5124. }
  5125. TraceTool.emptyLog=function(){}
  5126. TraceTool.traceObj=function(obj){
  5127. TraceTool.tempArr.length=0;
  5128. var key;
  5129. for(key in obj){
  5130. TraceTool.tempArr.push(key+":"+obj[key]);
  5131. };
  5132. var rst;
  5133. rst=TraceTool.tempArr.join("\n");
  5134. console.log(rst);
  5135. return rst;
  5136. }
  5137. TraceTool.traceObjR=function(obj){
  5138. TraceTool.tempArr.length=0;
  5139. var key;
  5140. for(key in obj){
  5141. TraceTool.tempArr.push(obj[key]+":"+key);
  5142. };
  5143. var rst;
  5144. rst=TraceTool.tempArr.join("\n");
  5145. console.log(rst);
  5146. return rst;
  5147. }
  5148. TraceTool.traceSize=function(tar){
  5149. DebugTool.dTrace("Size: x:"+tar.x+" y:"+tar.y+" w:"+tar.width+" h:"+tar.height+" scaleX:"+tar.scaleX+" scaleY:"+tar.scaleY);
  5150. }
  5151. TraceTool.traceSplit=function(msg){
  5152. console.log("---------------------"+msg+"---------------------------");
  5153. }
  5154. TraceTool.group=function(gName){
  5155. /*__JS__ */console.group(gName);;
  5156. }
  5157. TraceTool.groupEnd=function(){
  5158. /*__JS__ */console.groupEnd();;
  5159. }
  5160. TraceTool.getCallStack=function(life,s){
  5161. (life===void 0)&& (life=1);
  5162. (s===void 0)&& (s=1);
  5163. var caller;
  5164. caller=TraceTool.getCallStack;
  5165. caller=caller.caller.caller;
  5166. var msg;
  5167. msg="";
  5168. while(caller&&life>0){
  5169. if(s<=0){
  5170. msg+=caller+"<-";
  5171. life--;
  5172. }else{
  5173. }
  5174. caller=caller.caller;
  5175. s--;
  5176. }
  5177. return msg;
  5178. }
  5179. TraceTool.getCallLoc=function(index){
  5180. (index===void 0)&& (index=2);
  5181. var loc;
  5182. try {
  5183. TraceTool.Erroer.i++;
  5184. }catch (e){
  5185. var arr;
  5186. arr=e.stack.replace(/Error\n/).split(/\n/);
  5187. if (arr[index]){
  5188. loc=arr[index].replace(/^\s+|\s+$/,"");
  5189. }else{
  5190. loc="unknow";
  5191. }
  5192. }
  5193. return loc;
  5194. }
  5195. TraceTool.traceCallStack=function(){
  5196. var loc;
  5197. try {
  5198. TraceTool.Erroer.i++;
  5199. }catch (e){
  5200. loc=e.stack;
  5201. }
  5202. console.log(loc);
  5203. return loc;
  5204. }
  5205. TraceTool.getPlaceHolder=function(len){
  5206. if(!TraceTool.holderDic.hasOwnProperty(len)){
  5207. var rst;
  5208. rst="";
  5209. var i=0;
  5210. for(i=0;i<len;i++){
  5211. rst+="-";
  5212. }
  5213. TraceTool.holderDic[len]=rst;
  5214. }
  5215. return TraceTool.holderDic[len];
  5216. }
  5217. TraceTool.traceTree=function(tar,depth,isFirst){
  5218. (depth===void 0)&& (depth=0);
  5219. (isFirst===void 0)&& (isFirst=true);
  5220. if(isFirst){
  5221. console.log("traceTree");
  5222. }
  5223. if(!tar)return;
  5224. var i=0;
  5225. var len=0;
  5226. if(tar.numChildren<1){
  5227. console.log(tar);
  5228. return;
  5229. }
  5230. TraceTool.group(tar);
  5231. len=tar.numChildren;
  5232. depth++;
  5233. for(i=0;i<len;i++){
  5234. TraceTool.traceTree(tar.getChildAt(i),depth,false);
  5235. }
  5236. TraceTool.groupEnd();
  5237. }
  5238. TraceTool.getClassName=function(tar){
  5239. return tar["constructor"].name;
  5240. }
  5241. TraceTool.traceSpriteInfo=function(tar,showBounds,showSize,showTree){
  5242. (showBounds===void 0)&& (showBounds=true);
  5243. (showSize===void 0)&& (showSize=true);
  5244. (showTree===void 0)&& (showTree=true);
  5245. if(!((tar instanceof laya.display.Sprite ))){
  5246. console.log("not Sprite");
  5247. return;
  5248. }
  5249. if(!tar){
  5250. console.log("null Sprite");
  5251. return;
  5252. }
  5253. TraceTool.traceSplit("traceSpriteInfo");
  5254. DebugTool.dTrace(laya.debug.tools.TraceTool.getClassName(tar)+":"+tar.name);
  5255. if(showTree){
  5256. TraceTool.traceTree(tar);
  5257. }else{
  5258. console.log(tar);
  5259. }
  5260. if(showSize){
  5261. TraceTool.traceSize(tar);
  5262. }
  5263. if(showBounds){
  5264. console.log("bounds:"+tar.getBounds());
  5265. }
  5266. }
  5267. TraceTool.tempArr=[];
  5268. TraceTool.Erroer=null;
  5269. TraceTool.holderDic={};
  5270. return TraceTool;
  5271. })()
  5272. /**
  5273. *
  5274. *@author ww
  5275. *@version 1.0
  5276. *
  5277. *@created 2015-10-31 下午3:35:16
  5278. */
  5279. //class laya.debug.tools.DebugExport
  5280. var DebugExport=(function(){
  5281. function DebugExport(){}
  5282. __class(DebugExport,'laya.debug.tools.DebugExport');
  5283. DebugExport.export=function(){
  5284. var _window;
  5285. /*__JS__ */_window=window;;
  5286. var key;
  5287. for(key in DebugExport._exportsDic){
  5288. _window[key]=DebugExport._exportsDic[key];
  5289. }
  5290. }
  5291. __static(DebugExport,
  5292. ['_exportsDic',function(){return this._exportsDic={
  5293. "DebugTool":DebugTool,
  5294. "Watcher":Watcher
  5295. };}
  5296. ]);
  5297. return DebugExport;
  5298. })()
  5299. /**
  5300. *...
  5301. *@author ww
  5302. */
  5303. //class laya.debug.tools.layout.LayoutFuns
  5304. var LayoutFuns=(function(){
  5305. function LayoutFuns(){}
  5306. __class(LayoutFuns,'laya.debug.tools.layout.LayoutFuns');
  5307. LayoutFuns.sameWidth=function(totalWidth,items,data,sX){
  5308. (sX===void 0)&& (sX=0);
  5309. var dWidth=0;
  5310. if (data && data.dWidth)
  5311. dWidth=data.dWidth;
  5312. var perWidth=NaN;
  5313. perWidth=(totalWidth-(items.length-1)*dWidth)/ items.length;
  5314. var tItem;
  5315. var i=0,len=0;
  5316. var tX=NaN;
  5317. tX=sX;
  5318. len=items.length;
  5319. for (i=0;i < len;i++){
  5320. tItem=items[i];
  5321. tItem.x=tX;
  5322. tItem.width=perWidth;
  5323. tX+=dWidth+perWidth;
  5324. }
  5325. }
  5326. LayoutFuns.getSameWidthLayout=function(items,dWidth){
  5327. var data;
  5328. data={};
  5329. data.dWidth=dWidth;
  5330. return LayoutFuns.getLayouter(items,data,laya.debug.tools.layout.LayoutFuns.sameWidth);
  5331. }
  5332. LayoutFuns.getLayouter=function(items,data,fun){
  5333. var layouter;
  5334. layouter=new Layouter();
  5335. layouter.items=items;
  5336. layouter.data=data;
  5337. layouter.layoutFun=fun;
  5338. return layouter;
  5339. }
  5340. LayoutFuns.sameDis=function(totalWidth,items,data,sX){
  5341. (sX===void 0)&& (sX=0);
  5342. var dWidth=NaN;
  5343. dWidth=totalWidth;
  5344. var tItem;
  5345. var i=0,len=0;
  5346. len=items.length;
  5347. LayoutFuns.prepareForLayoutWidth(totalWidth,items);
  5348. for (i=0;i < len;i++){
  5349. tItem=items[i];
  5350. dWidth-=tItem.width;
  5351. }
  5352. if (items.length > 1)
  5353. dWidth=dWidth / (items.length-1);
  5354. var tX=NaN;
  5355. tX=sX;
  5356. len=items.length;
  5357. for (i=0;i < len;i++){
  5358. tItem=items[i];
  5359. tItem.x=tX;
  5360. tX+=dWidth+tItem.width;
  5361. }
  5362. }
  5363. LayoutFuns.getSameDisLayout=function(items,rateSame){
  5364. (rateSame===void 0)&& (rateSame=false);
  5365. var data;
  5366. data={};
  5367. if (rateSame){
  5368. var i=0,len=0;
  5369. len=items.length;
  5370. var tItem;
  5371. var totalWidth=NaN;
  5372. totalWidth=0;
  5373. for (i=0;i < len;i++){
  5374. tItem=items[i];
  5375. totalWidth+=tItem.width;
  5376. }
  5377. totalWidth=tItem.x+tItem.width;
  5378. for (i=0;i < len;i++){
  5379. tItem=items[i];
  5380. LayoutFuns.setItemRate(tItem,tItem.width / totalWidth);
  5381. }
  5382. }
  5383. return LayoutFuns.getLayouter(items,data,laya.debug.tools.layout.LayoutFuns.sameDis);
  5384. }
  5385. LayoutFuns.fullFill=function(totalWidth,items,data,sX){
  5386. (sX===void 0)&& (sX=0);
  5387. var dL=0,dR=0;
  5388. if (data){
  5389. if (data.dL)
  5390. dL=data.dL;
  5391. if (data.dR)
  5392. dR=data.dR;
  5393. };
  5394. var item;
  5395. var i=0,len=0;
  5396. len=items.length;
  5397. for (i=0;i < len;i++){
  5398. item=items[i];
  5399. item.x=sX+dL;
  5400. item.width=totalWidth-dL-dR;
  5401. }
  5402. }
  5403. LayoutFuns.getFullFillLayout=function(items,dL,dR){
  5404. (dL===void 0)&& (dL=0);
  5405. (dR===void 0)&& (dR=0);
  5406. var data;
  5407. data={};
  5408. data.dL=dL;
  5409. data.dR=dR;
  5410. return LayoutFuns.getLayouter(items,data,laya.debug.tools.layout.LayoutFuns.fullFill);
  5411. }
  5412. LayoutFuns.fixPos=function(totalWidth,items,data,sX){
  5413. (sX===void 0)&& (sX=0);
  5414. var dLen=0;
  5415. var poss=[];
  5416. var isRate=false;
  5417. if (data){
  5418. if (data.dLen)
  5419. dLen=data.dLen;
  5420. if (data.poss)
  5421. poss=data.poss;
  5422. if (data.isRate)
  5423. isRate=data.isRate;
  5424. };
  5425. var item;
  5426. var i=0,len=0;
  5427. len=poss.length;
  5428. var tX=NaN;
  5429. tX=sX;
  5430. var tValue=NaN;
  5431. var preItem;
  5432. preItem=null;
  5433. for (i=0;i < len;i++){
  5434. item=items[i];
  5435. tValue=sX+poss[i];
  5436. if (isRate){
  5437. tValue=sX+poss[i] *totalWidth;
  5438. }
  5439. item.x=tValue;
  5440. if (preItem){
  5441. preItem.width=item.x-dLen-preItem.x;
  5442. }
  5443. preItem=item;
  5444. };
  5445. var lastItem;
  5446. lastItem=items[items.length-1];
  5447. lastItem.width=sX+totalWidth-dLen-lastItem.x;
  5448. }
  5449. LayoutFuns.getFixPos=function(items,dLen,isRate,poss){
  5450. (dLen===void 0)&& (dLen=0);
  5451. (isRate===void 0)&& (isRate=false);
  5452. var data;
  5453. data={};
  5454. var layout;
  5455. layout=LayoutFuns.getLayouter(items,data,LayoutFuns.fixPos);
  5456. var i=0,len=0;
  5457. var sX=NaN;
  5458. var totalWidth=NaN;
  5459. sX=layout.x;
  5460. totalWidth=layout.width;
  5461. if (!poss){
  5462. poss=[];
  5463. len=items.length;
  5464. var tValue=NaN;
  5465. for (i=0;i < len;i++){
  5466. tValue=items[i].x-sX;
  5467. if (isRate){
  5468. tValue=tValue / totalWidth;
  5469. }
  5470. else{
  5471. }
  5472. poss.push(tValue);
  5473. }
  5474. }
  5475. data.dLen=dLen;
  5476. data.poss=poss;
  5477. data.isRate=isRate;
  5478. return layout;
  5479. }
  5480. LayoutFuns.clearItemsRelativeInfo=function(items){
  5481. var i=0,len=0;
  5482. len=items.length;
  5483. for (i=0;i < len;i++){
  5484. LayoutFuns.clearItemRelativeInfo(items[i]);
  5485. }
  5486. }
  5487. LayoutFuns.clearItemRelativeInfo=function(item){
  5488. var Nan="NaN";
  5489. item.left=Nan;
  5490. item.right=Nan;
  5491. }
  5492. LayoutFuns.prepareForLayoutWidth=function(totalWidth,items){
  5493. var i=0,len=0;
  5494. len=items.length;
  5495. for (i=0;i < len;i++){
  5496. LayoutFuns.prepareItemForLayoutWidth(totalWidth,items[i]);
  5497. }
  5498. }
  5499. LayoutFuns.getSumWidth=function(items){
  5500. var sum=NaN;
  5501. sum=0;
  5502. var i=0,len=0;
  5503. len=items.length;
  5504. for (i=0;i < len;i++){
  5505. sum+=items[i].width;
  5506. }
  5507. return sum;
  5508. }
  5509. LayoutFuns.prepareItemForLayoutWidth=function(totalWidth,item){
  5510. if (LayoutFuns.getItemRate(item)> 0){
  5511. item.width=totalWidth *LayoutFuns.getItemRate(item);
  5512. }
  5513. }
  5514. LayoutFuns.setItemRate=function(item,rate){
  5515. item["layoutRate"]=rate;
  5516. }
  5517. LayoutFuns.getItemRate=function(item){
  5518. return item["layoutRate"] ? item["layoutRate"] :-1;
  5519. }
  5520. LayoutFuns.setItemFreeSize=function(item,free){
  5521. (free===void 0)&& (free=true);
  5522. item["layoutFreeSize"]=free;
  5523. }
  5524. LayoutFuns.isItemFreeSize=function(item){
  5525. return item["layoutFreeSize"];
  5526. }
  5527. LayoutFuns.lockedDis=function(totalWidth,items,data,sX){
  5528. (sX===void 0)&& (sX=0);
  5529. var dists;
  5530. dists=data.dists;
  5531. var sumDis=NaN;
  5532. sumDis=data.sumDis;
  5533. var sumWidth=NaN;
  5534. var i=0,len=0;
  5535. var tItem;
  5536. var preItem;
  5537. LayoutFuns.prepareForLayoutWidth(totalWidth,items);
  5538. sumWidth=LayoutFuns.getSumWidth(items);
  5539. var dWidth=NaN;
  5540. dWidth=totalWidth-sumDis-sumWidth;
  5541. var freeItem;
  5542. freeItem=LayoutFuns.getFreeItem(items);
  5543. if(freeItem){
  5544. freeItem.width+=dWidth;
  5545. }
  5546. preItem=items[0];
  5547. preItem.x=sX;
  5548. len=items.length;
  5549. for(i=1;i<len;i++){
  5550. tItem=items[i];
  5551. tItem.x=preItem.x+preItem.width+dists[i-1];
  5552. preItem=tItem;
  5553. }
  5554. }
  5555. LayoutFuns.getFreeItem=function(items){
  5556. var i=0,len=0;
  5557. len=items.length;
  5558. for (i=0;i < len;i++){
  5559. if(LayoutFuns.isItemFreeSize(items[i])){
  5560. return items[i];
  5561. }
  5562. }
  5563. return null;
  5564. }
  5565. LayoutFuns.getLockedDis=function(items){
  5566. var data;
  5567. data={};
  5568. var dists;
  5569. var i=0,len=0;
  5570. var tItem;
  5571. var preItem;
  5572. var sumDis=NaN;
  5573. sumDis=0;
  5574. var tDis=NaN;
  5575. preItem=items[0];
  5576. dists=[];
  5577. len=items.length;
  5578. for(i=1;i<len;i++){
  5579. tItem=items[i];
  5580. tDis=tItem.x-preItem.x-preItem.width;
  5581. dists.push(tDis);
  5582. sumDis+=tDis;
  5583. preItem=tItem;
  5584. }
  5585. data.dists=dists;
  5586. data.sumDis=sumDis;
  5587. return LayoutFuns.getLayouter(items,data,laya.debug.tools.layout.LayoutFuns.lockedDis);
  5588. }
  5589. LayoutFuns.RateSign="layoutRate";
  5590. LayoutFuns.FreeSizeSign="layoutFreeSize";
  5591. return LayoutFuns;
  5592. })()
  5593. /**
  5594. *...
  5595. *@author ww
  5596. */
  5597. //class laya.debug.tools.VisibleAnalyser
  5598. var VisibleAnalyser=(function(){
  5599. function VisibleAnalyser(){}
  5600. __class(VisibleAnalyser,'laya.debug.tools.VisibleAnalyser');
  5601. VisibleAnalyser.analyseTarget=function(node){
  5602. var isInstage=false;
  5603. isInstage=node.displayedInStage;
  5604. var gRec;
  5605. gRec=NodeUtils.getGRec(node);
  5606. var stageRec=new Rectangle();
  5607. stageRec.setTo(0,0,Laya.stage.width,Laya.stage.height);
  5608. var isInVisibleRec=false;
  5609. var visibleRec;
  5610. visibleRec=stageRec.intersection(gRec);
  5611. if (visibleRec.width > 0 && visibleRec.height > 0){
  5612. isInVisibleRec=true;
  5613. }
  5614. else{
  5615. isInVisibleRec=false;
  5616. };
  5617. var gAlpha=NaN;
  5618. gAlpha=NodeUtils.getGAlpha(node);
  5619. var gVisible=false;
  5620. gVisible=NodeUtils.getGVisible(node);
  5621. var msg;
  5622. msg="";
  5623. msg+="isInstage:"+isInstage+"\n";
  5624. msg+="isInVisibleRec:"+isInVisibleRec+"\n";
  5625. msg+="gVisible:"+gVisible+"\n";
  5626. msg+="gAlpha:"+gAlpha+"\n";
  5627. if (isInstage && isInVisibleRec && gVisible && gAlpha > 0){
  5628. if (Render.isWebGL){
  5629. VisibleAnalyser.anlyseRecVisible(node);
  5630. }
  5631. msg+="coverRate:"+VisibleAnalyser.coverRate+"\n";
  5632. if (VisibleAnalyser._coverList.length > 0){
  5633. Laya.timer.once(1000,null,VisibleAnalyser.showListLater);
  5634. }
  5635. }
  5636. console.log(msg);
  5637. }
  5638. VisibleAnalyser.showListLater=function(){}
  5639. VisibleAnalyser.isCoverByBrother=function(node){
  5640. var parent=node.parent;
  5641. if (!parent)
  5642. return;
  5643. var _childs;
  5644. _childs=parent._children;
  5645. var index=0;
  5646. index=_childs.indexOf(node);
  5647. if (index < 0)
  5648. return;
  5649. var i=0,len=0;
  5650. var canvas;
  5651. var rec;
  5652. rec=parent.getSelfBounds();
  5653. if (rec.width <=0 || rec.height <=0)
  5654. return;
  5655. }
  5656. VisibleAnalyser.anlyseRecVisible=function(node){
  5657. VisibleAnalyser.isNodeWalked=false;
  5658. VisibleAnalyser._analyseTarget=node;
  5659. if (!VisibleAnalyser.mainCanvas)
  5660. VisibleAnalyser.mainCanvas=CanvasTools.createCanvas(Laya.stage.width,Laya.stage.height);
  5661. CanvasTools.clearCanvas(VisibleAnalyser.mainCanvas);
  5662. VisibleAnalyser.tColor=1;
  5663. VisibleAnalyser.resetCoverList();
  5664. WalkTools.walkTargetEX(Laya.stage,VisibleAnalyser.recVisibleWalker,null,VisibleAnalyser.filterFun);
  5665. if (!VisibleAnalyser.isTarRecOK){
  5666. VisibleAnalyser.coverRate=0;
  5667. }
  5668. else{
  5669. VisibleAnalyser.coverRate=CanvasTools.getDifferRate(VisibleAnalyser.preImageData,VisibleAnalyser.tarImageData);
  5670. }
  5671. console.log("coverRate:",VisibleAnalyser.coverRate);
  5672. }
  5673. VisibleAnalyser.getRecArea=function(rec){
  5674. return rec.width *rec.height;
  5675. }
  5676. VisibleAnalyser.addCoverNode=function(node,coverRate){
  5677. var data;
  5678. data={};
  5679. data.path=node;
  5680. data.label=ClassTool.getNodeClassAndName(node)+":"+coverRate;
  5681. data.coverRate=coverRate;
  5682. VisibleAnalyser._coverList.push(data);
  5683. console.log("coverByNode:",node,coverRate);
  5684. }
  5685. VisibleAnalyser.resetCoverList=function(){
  5686. VisibleAnalyser._coverList.length=0;
  5687. }
  5688. VisibleAnalyser.recVisibleWalker=function(node){
  5689. if (node==VisibleAnalyser._analyseTarget){
  5690. VisibleAnalyser.isNodeWalked=true;
  5691. VisibleAnalyser.tarRec.copyFrom(NodeUtils.getGRec(node));
  5692. console.log("tarRec:",VisibleAnalyser.tarRec.toString());
  5693. if (VisibleAnalyser.tarRec.width > 0 && VisibleAnalyser.tarRec.height > 0){
  5694. VisibleAnalyser.isTarRecOK=true;
  5695. VisibleAnalyser.tColor++;
  5696. CanvasTools.fillCanvasRec(VisibleAnalyser.mainCanvas,VisibleAnalyser.tarRec,ColorTool.toHexColor(VisibleAnalyser.tColor));
  5697. VisibleAnalyser.preImageData=CanvasTools.getImageDataFromCanvasByRec(VisibleAnalyser.mainCanvas,VisibleAnalyser.tarRec);
  5698. VisibleAnalyser.tarImageData=CanvasTools.getImageDataFromCanvasByRec(VisibleAnalyser.mainCanvas,VisibleAnalyser.tarRec);
  5699. }
  5700. else{
  5701. console.log("tarRec Not OK:",VisibleAnalyser.tarRec);
  5702. }
  5703. }
  5704. else{
  5705. if (VisibleAnalyser.isTarRecOK){
  5706. var tRec;
  5707. tRec=NodeUtils.getGRec(node);
  5708. VisibleAnalyser.interRec=VisibleAnalyser.tarRec.intersection(tRec,VisibleAnalyser.interRec);
  5709. if (VisibleAnalyser.interRec && VisibleAnalyser.interRec.width > 0 && VisibleAnalyser.interRec.height > 0){
  5710. VisibleAnalyser.tColor++;
  5711. CanvasTools.fillCanvasRec(VisibleAnalyser.mainCanvas,tRec,ColorTool.toHexColor(VisibleAnalyser.tColor));
  5712. VisibleAnalyser.tImageData=CanvasTools.getImageDataFromCanvasByRec(VisibleAnalyser.mainCanvas,VisibleAnalyser.tarRec);
  5713. var dRate=NaN;
  5714. dRate=CanvasTools.getDifferRate(VisibleAnalyser.preImageData,VisibleAnalyser.tImageData);
  5715. VisibleAnalyser.preImageData=VisibleAnalyser.tImageData;
  5716. VisibleAnalyser.addCoverNode(node,dRate);
  5717. }
  5718. }
  5719. }
  5720. }
  5721. VisibleAnalyser.filterFun=function(node){
  5722. if (node.visible==false)
  5723. return false;
  5724. if (node.alpha < 0)
  5725. return false;
  5726. if (DebugInfoLayer.I.isDebugItem(node))return false;
  5727. return true;
  5728. }
  5729. VisibleAnalyser.isNodeWalked=false;
  5730. VisibleAnalyser._analyseTarget=null;
  5731. VisibleAnalyser.isTarRecOK=false;
  5732. VisibleAnalyser.mainCanvas=null;
  5733. VisibleAnalyser.preImageData=null;
  5734. VisibleAnalyser.tImageData=null;
  5735. VisibleAnalyser.tarImageData=null;
  5736. VisibleAnalyser.coverRate=NaN;
  5737. VisibleAnalyser.tColor=0;
  5738. VisibleAnalyser._coverList=[];
  5739. __static(VisibleAnalyser,
  5740. ['tarRec',function(){return this.tarRec=new Rectangle();},'interRec',function(){return this.interRec=new Rectangle();}
  5741. ]);
  5742. return VisibleAnalyser;
  5743. })()
  5744. /**
  5745. *...
  5746. *@author ww
  5747. */
  5748. //class laya.debug.tools.MathTools
  5749. var MathTools=(function(){
  5750. function MathTools(){}
  5751. __class(MathTools,'laya.debug.tools.MathTools');
  5752. MathTools.sortBigFirst=function(a,b){
  5753. if (a==b)
  5754. return 0;
  5755. return b > a ? 1 :-1;
  5756. }
  5757. MathTools.sortSmallFirst=function(a,b){
  5758. if (a==b)
  5759. return 0;
  5760. return b > a ?-1 :1;
  5761. }
  5762. MathTools.sortNumBigFirst=function(a,b){
  5763. return parseFloat(b)-parseFloat(a);
  5764. }
  5765. MathTools.sortNumSmallFirst=function(a,b){
  5766. return parseFloat(a)-parseFloat(b);
  5767. }
  5768. MathTools.sortByKey=function(key,bigFirst,forceNum){
  5769. (bigFirst===void 0)&& (bigFirst=false);
  5770. (forceNum===void 0)&& (forceNum=true);
  5771. var _sortFun;
  5772. if (bigFirst){
  5773. _sortFun=forceNum ? MathTools.sortNumBigFirst :MathTools.sortBigFirst;
  5774. }else {
  5775. _sortFun=forceNum ? MathTools.sortNumSmallFirst :MathTools.sortSmallFirst;
  5776. }
  5777. return function (a,b){
  5778. return _sortFun(a[key],b[key]);
  5779. };
  5780. }
  5781. return MathTools;
  5782. })()
  5783. /**
  5784. *...
  5785. *@author ww
  5786. */
  5787. //class laya.debug.view.StyleConsts
  5788. var StyleConsts=(function(){
  5789. function StyleConsts(){}
  5790. __class(StyleConsts,'laya.debug.view.StyleConsts');
  5791. StyleConsts.setViewScale=function(view){
  5792. view.scaleX=view.scaleY=StyleConsts.PanelScale;
  5793. }
  5794. __static(StyleConsts,
  5795. ['PanelScale',function(){return this.PanelScale=Browser.onPC?1:Browser.pixelRatio;}
  5796. ]);
  5797. return StyleConsts;
  5798. })()
  5799. /**
  5800. *...
  5801. *@author ww
  5802. */
  5803. //class laya.debug.divui.DivScripts
  5804. var DivScripts=(function(){
  5805. function DivScripts(){}
  5806. __class(DivScripts,'laya.debug.divui.DivScripts');
  5807. DivScripts.init=function(){
  5808. var script;
  5809. script=Base64Tool.decodeToByte(DivScripts.data).readUTFBytes();
  5810. Laya._runScript(script);
  5811. }
  5812. DivScripts.data="ZnVuY3Rpb24gZGh0bWx4RXZlbnQoZSx0LGkpe2UuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIodCxpLCExKTplLmF0dGFjaEV2ZW50JiZlLmF0dGFjaEV2ZW50KCJvbiIrdCxpKX1mdW5jdGlvbiBkaHRtbFhUcmVlT2JqZWN0KGUsdCxpLG4pe2lmKGRodG1seEV2ZW50LmluaXRUb3VjaCYmZGh0bWx4RXZlbnQuaW5pdFRvdWNoKCksX2lzSUUpdHJ5e2RvY3VtZW50LmV4ZWNDb21tYW5kKCJCYWNrZ3JvdW5kSW1hZ2VDYWNoZSIsITEsITApfWNhdGNoKG8pe310aGlzLnBhcmVudE9iamVjdD0ib2JqZWN0IiE9dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ZSx0aGlzLnBhcmVudE9iamVjdC5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIix0aGlzLl9pdGltX2RnPSEwLHRoaXMuZGxtdHI9IiwiLHRoaXMuZHJvcExvd2VyPSExLHRoaXMuZW5hYmxlSUVJbWFnZUZpeCghMCksdGhpcy54bWxzdGF0ZT0wLHRoaXMubXl0eXBlPSJ0cmVlIix0aGlzLnNtY2hlY2s9ITAsdGhpcy53aWR0aD10LHRoaXMuaGVpZ2h0PWksdGhpcy5yb290SWQ9bix0aGlzLmNoaWxkQ2FsYz1udWxsLHRoaXMuZGVmX2ltZ194PSIxOHB4Iix0aGlzLmRlZl9pbWdfeT0iMThweCIsdGhpcy5kZWZfbGluZV9pbWdfeD0iMThweCIsdGhpcy5kZWZfbGluZV9pbWdfeT0iMjRweCIsdGhpcy5fZHJhZ2dlZD1uZXcgQXJyYXksdGhpcy5fc2VsZWN0ZWQ9bmV3IEFycmF5LHRoaXMuc3R5bGVfcG9pbnRlcj0icG9pbnRlciIsdGhpcy5fYWltZ3M9ITAsdGhpcy5odG1sY0E9IiBbIix0aGlzLmh0bWxjQj0iXSIsdGhpcy5sV2luPXdpbmRvdyx0aGlzLmNNZW51PTAsdGhpcy5tbGl0ZW1zPTAsdGhpcy5pY29uVVJMPSIiLHRoaXMuZGFkbW9kZT0wLHRoaXMuc2xvd1BhcnNlPSExLHRoaXMuYXV0b1Njcm9sbD0hMCx0aGlzLmhmTW9kZT0wLHRoaXMubm9kZUN1dD1uZXcgQXJyYXksdGhpcy5YTUxzb3VyY2U9MCx0aGlzLlhNTGxvYWRpbmdXYXJuaW5nPTAsdGhpcy5faWRwdWxsPXt9LHRoaXMuX3B1bGxTaXplPTAsdGhpcy50cmVlTGluZXNPbj0hMCx0aGlzLnRzY2hlY2s9ITEsdGhpcy50aW1nZW49ITAsdGhpcy5kcGNweT0hMSx0aGlzLl9sZF9pZD1udWxsLHRoaXMuX2R5bkRlbGV0ZUJyYW5jaGVzPXt9LHRoaXMuX29pZV9vblhMRT1bXSx0aGlzLmltUGF0aD13aW5kb3cuZGh4X2dsb2JhbEltZ1BhdGh8fCIiLHRoaXMuY2hlY2tBcnJheT1uZXcgQXJyYXkoImljb25VbmNoZWNrQWxsLmdpZiIsImljb25DaGVja0FsbC5naWYiLCJpY29uQ2hlY2tHcmF5LmdpZiIsImljb25VbmNoZWNrRGlzLmdpZiIsImljb25DaGVja0Rpcy5naWYiLCJpY29uQ2hlY2tEaXMuZ2lmIiksdGhpcy5yYWRpb0FycmF5PW5ldyBBcnJheSgicmFkaW9fb2ZmLmdpZiIsInJhZGlvX29uLmdpZiIsInJhZGlvX29uLmdpZiIsInJhZGlvX29mZi5naWYiLCJyYWRpb19vbi5naWYiLCJyYWRpb19vbi5naWYiKSx0aGlzLmxpbmVBcnJheT1uZXcgQXJyYXkoImxpbmUyLmdpZiIsImxpbmUzLmdpZiIsImxpbmU0LmdpZiIsYmxhbmtfYmFzZTY0LGJsYW5rX2Jhc2U2NCwibGluZTEuZ2lmIiksdGhpcy5taW51c0FycmF5PW5ldyBBcnJheSgibWludXMyLmdpZiIsIm1pbnVzMy5naWYiLCJtaW51czQuZ2lmIiwiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoRWdBWUFKRUNBTEd2clo2ZG5mVDA5QUFBQUNINUJBRUFBQUlBTEFBQUFBQVNBQmdBQUFJY2xJK3B5KzBQbzV5MFdoc0NEV0IzbUdYZnd3SG1oYWJxeXJaVEFRQTciLCJtaW51czUuZ2lmIiksdGhpcy5wbHVzQXJyYXk9bmV3IEFycmF5KCJwbHVzMi5naWYiLCJwbHVzMy5naWYiLCJwbHVzNC5naWYiLCJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhFZ0FZQUpFQ0FLR2duN0d2cmZUMDlBQUFBQ0g1QkFFQUFBSUFMQUFBQUFBU0FCZ0FBQUljbEkrcHkrMFBvNXkwVW5CRHlIc0NMUUZmT0U2ZGhhYnF5clpKQVFBNyIsInBsdXM1LmdpZiIpLHRoaXMuaW1hZ2VBcnJheT1uZXcgQXJyYXkoImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEVnQVNBS0VDQUplWGw3R3ZyZi8vLy8vLy95SDVCQUVLQUFJQUxBQUFBQUFTQUJJQUFBSXpsSStwQXUyOURBaTAxamlUWFJuTm0zVEhCNDVCYUoyZXVsQm94TENTL0s2d09OODBYcHQ2citCOUhrU2FJSVdFS1EwRkFEcz0iLCJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhFZ0FTQUtFQ0FKZVhsN0d2cmYvLy8vLy8veUg1QkFFS0FBSUFMQUFBQUFBU0FCSUFBQUl6bEkrcHl3Y1BtM21oV2drQ3NqQk92VmtpbUVsRzlabENCbFhkKzJYampMS2c1R3FvZVpYcXZzT1FYSy9palVaVEtWVUZBRHM9IiwiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoRWdBU0FLRUNBSmVYbDdHdnJmLy8vLy8vL3lINUJBRUtBQUlBTEFBQUFBQVNBQklBQUFJd2xJK3B5d2NQbTNtaFdna0NzakJPdlZraW1FbEc5WmxDdVlJWTZUWXMrNmJtSERPNGlnZmREM0dOaGhlVjBWUUFBRHM9IiksdGhpcy5jdXRJbWc9bmV3IEFycmF5KDAsMCwwKSx0aGlzLmN1dEltYWdlPSJidXRfY3V0LmdpZiIsZGh4NC5fZXZlbnRhYmxlKHRoaXMpLHRoaXMuaHRtbE5vZGU9bmV3IGRodG1sWFRyZWVJdGVtT2JqZWN0KHRoaXMucm9vdElkLCIiLDAsdGhpcyksdGhpcy5odG1sTm9kZS5odG1sTm9kZS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0uc3R5bGUuZGlzcGxheT0ibm9uZSIsdGhpcy5odG1sTm9kZS5odG1sTm9kZS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS5jbGFzc05hbWU9ImhpZGRlblJvdyIsdGhpcy5hbGxUcmVlPXRoaXMuX2NyZWF0ZVNlbGYoKSx0aGlzLmFsbFRyZWUuYXBwZW5kQ2hpbGQodGhpcy5odG1sTm9kZS5odG1sTm9kZSksZGh0bWx4LiRjdXN0b21TY3JvbGwmJmRodG1seC5DdXN0b21TY3JvbGwuZW5hYmxlKHRoaXMpLF9pc0ZGJiYodGhpcy5hbGxUcmVlLmNoaWxkTm9kZXNbMF0ud2lkdGg9IjEwMCUiLHRoaXMuYWxsVHJlZS5jaGlsZE5vZGVzWzBdLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iKTt2YXIgcj10aGlzO2lmKHRoaXMuYWxsVHJlZS5vbnNlbGVjdHN0YXJ0PW5ldyBGdW5jdGlvbigicmV0dXJuIGZhbHNlOyIpLF9pc01hY09TJiYodGhpcy5hbGxUcmVlLm9uY29udGV4dG1lbnU9ZnVuY3Rpb24oZSl7cmV0dXJuIHIuX2RvQ29udENsaWNrKGV8fHdpbmRvdy5ldmVudCwhMCl9KSx0aGlzLmFsbFRyZWUub25tb3VzZWRvd249ZnVuY3Rpb24oZSl7cmV0dXJuIHIuX2RvQ29udENsaWNrKGV8fHdpbmRvdy5ldmVudCl9LHRoaXMuWE1MTG9hZGVyPXRoaXMuX3BhcnNlWE1MVHJlZSxfaXNJRSYmdGhpcy5wcmV2ZW50SUVDYXNoaW5nKCEwKSx0aGlzLnNlbGVjdGlvbkJhcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSx0aGlzLnNlbGVjdGlvbkJhci5jbGFzc05hbWU9InNlbGVjdGlvbkJhciIsdGhpcy5zZWxlY3Rpb25CYXIuaW5uZXJIVE1MPSImbmJzcDsiLHRoaXMuc2VsZWN0aW9uQmFyLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMuYWxsVHJlZS5hcHBlbmRDaGlsZCh0aGlzLnNlbGVjdGlvbkJhciksd2luZG93LmFkZEV2ZW50TGlzdGVuZXImJndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dHJ5e3IuZGVzdHJ1Y3RvcigpfWNhdGNoKGUpe319LCExKSx3aW5kb3cuYXR0YWNoRXZlbnQmJndpbmRvdy5hdHRhY2hFdmVudCgib251bmxvYWQiLGZ1bmN0aW9uKCl7dHJ5e3IuZGVzdHJ1Y3RvcigpfWNhdGNoKGUpe319KSx0aGlzLnNldEltYWdlc1BhdGg9dGhpcy5zZXRJbWFnZVBhdGgsdGhpcy5zZXRJY29uc1BhdGg9dGhpcy5zZXRJY29uUGF0aCx0aGlzLnNldFNraW4oIm1hdGVyaWFsIiksZGh0bWx4LmltYWdlX3BhdGgpe3ZhciBsPWRodG1seC5pbWFnZV9wYXRoLHM9dGhpcy5wYXJlbnRPYmplY3QuY2xhc3NOYW1lLm1hdGNoKC9kaHh0cmVlX2RoeF8oW2Etel9dKikvaSk7bnVsbCE9cyYmbnVsbCE9c1sxXSYmKGwrPSJkaHh0cmVlXyIrc1sxXSsiLyIpLHRoaXMuc2V0SW1hZ2VQYXRoKGwpfXJldHVybiB0aGlzfWZ1bmN0aW9uIGNPYmplY3QoKXtyZXR1cm4gdGhpc31mdW5jdGlvbiBkaHRtbFhUcmVlSXRlbU9iamVjdChlLHQsaSxuLG8scil7cmV0dXJuIHRoaXMuaHRtbE5vZGU9IiIsdGhpcy5hY29sb3I9IiIsdGhpcy5zY29sb3I9IiIsdGhpcy50cj0wLHRoaXMuY2hpbGRzQ291bnQ9MCx0aGlzLnRlbXBET01NPTAsdGhpcy50ZW1wRE9NVT0wLHRoaXMuZHJhZ1NwYW49MCx0aGlzLmRyYWdNb3ZlPTAsdGhpcy5zcGFuPTAsdGhpcy5jbG9zZWJsZT0xLHRoaXMuY2hpbGROb2Rlcz1uZXcgQXJyYXksdGhpcy51c2VyRGF0YT1uZXcgY09iamVjdCx0aGlzLmNoZWNrc3RhdGU9MCx0aGlzLnRyZWVOb2Q9bix0aGlzLmxhYmVsPXQsdGhpcy5wYXJlbnRPYmplY3Q9aSx0aGlzLmFjdGlvbkhhbmRsZXI9byx0aGlzLmltYWdlcz1uZXcgQXJyYXkobi5pbWFnZUFycmF5WzBdLG4uaW1hZ2VBcnJheVsxXSxuLmltYWdlQXJyYXlbMl0pLHRoaXMuaWQ9bi5fZ2xvYmFsSWRTdG9yYWdlQWRkKGUsdGhpcyksdGhpcy5odG1sTm9kZT10aGlzLnRyZWVOb2QuY2hlY2tCb3hPZmY/dGhpcy50cmVlTm9kLl9jcmVhdGVJdGVtKDEsdGhpcyxyKTp0aGlzLnRyZWVOb2QuX2NyZWF0ZUl0ZW0oMCx0aGlzLHIpLHRoaXMuaHRtbE5vZGUub2JqQmVsb25nPXRoaXMsdGhpc31mdW5jdGlvbiBqc29uUG9pbnRlcihlLHQpe3RoaXMuZD1lLHRoaXMuZHA9dH1mdW5jdGlvbiBkaHhfaW5pdF90cmVlcygpe2Zvcih2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2IiksdD0wO3Q8ZS5sZW5ndGg7dCsrKSJkaHRtbHhUcmVlIj09ZVt0XS5jbGFzc05hbWUmJmRodG1sWFRyZWVGcm9tSFRNTChlW3RdKX12YXIgYmxhbmtfYmFzZTY0PSJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhFZ0FTQUlBQUFQLy8vLy8vL3lINUJBVVVBQUVBTEFBQUFBQVNBQklBQUFJUGpJK3B5KzBQbzV5MDJvdXozcHdYQURzPSI7InVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3cuZGh4JiYod2luZG93LmRoeD13aW5kb3cuZGh4ND17dmVyc2lvbjoiNS4wIixza2luOm51bGwsbGFzdElkOjEsbmV3SWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXN0SWQrK30semltOntkYXRhOnt9LHN0ZXA6NSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiAxMDB9LGxhc3Q6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmZpcnN0KCk7Zm9yKHZhciB0IGluIHRoaXMuZGF0YSllPU1hdGgubWF4KGUsdGhpcy5kYXRhW3RdKTtyZXR1cm4gZX0scmVzZXJ2ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5kYXRhW2VdPXRoaXMubGFzdCgpK3RoaXMuc3RlcCx0aGlzLmRhdGFbZV19LGNsZWFyOmZ1bmN0aW9uKGUpe251bGwhPXRoaXMuZGF0YVtlXSYmKHRoaXMuZGF0YVtlXT1udWxsLGRlbGV0ZSB0aGlzLmRhdGFbZV0pfX0sczJiOmZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmKGU9ZS50b0xvd2VyQ2FzZSgpKSwxPT1lfHwxPT1lfHwidHJ1ZSI9PWV8fCIxIj09ZXx8InllcyI9PWV8fCJ5Ij09ZXx8Im9uIj09ZX0sczJqOmZ1bmN0aW9uKHMpe3ZhciBvYmo9bnVsbDtkaHg0LnRlbXA9bnVsbDt0cnl7ZXZhbCgiZGh4NC50ZW1wPSIrcyl9Y2F0Y2goZSl7ZGh4NC50ZW1wPW51bGx9cmV0dXJuIG9iaj1kaHg0LnRlbXAsZGh4NC50ZW1wPW51bGwsb2JqfSxhYnNMZWZ0OmZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmKGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSkpLHRoaXMuZ2V0T2Zmc2V0KGUpLmxlZnR9LGFic1RvcDpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpKSx0aGlzLmdldE9mZnNldChlKS50b3B9LF9hT2ZzOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLGk9MDtlOyl0Kz1wYXJzZUludChlLm9mZnNldFRvcCksaSs9cGFyc2VJbnQoZS5vZmZzZXRMZWZ0KSxlPWUub2Zmc2V0UGFyZW50O3JldHVybnt0b3A6dCxsZWZ0Oml9fSxfYU9mc1JlY3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxpPWRvY3VtZW50LmJvZHksbj1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsbz13aW5kb3cucGFnZVlPZmZzZXR8fG4uc2Nyb2xsVG9wfHxpLnNjcm9sbFRvcCxyPXdpbmRvdy5wYWdlWE9mZnNldHx8bi5zY3JvbGxMZWZ0fHxpLnNjcm9sbExlZnQsbD1uLmNsaWVudFRvcHx8aS5jbGllbnRUb3B8fDAscz1uLmNsaWVudExlZnR8fGkuY2xpZW50TGVmdHx8MCxhPXQudG9wK28tbCxkPXQubGVmdCtyLXM7cmV0dXJue3RvcDpNYXRoLnJvdW5kKGEpLGxlZnQ6TWF0aC5yb3VuZChkKX19LGdldE9mZnNldDpmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/dGhpcy5fYU9mc1JlY3QoZSk6dGhpcy5fYU9mcyhlKX0sX2lzT2JqOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lJiYib2JqZWN0Ij09dHlwZW9mIGUmJiJ1bmRlZmluZWQiPT10eXBlb2YgZS5sZW5ndGh9LF9jb3B5T2JqOmZ1bmN0aW9uKGUpe2lmKHRoaXMuX2lzT2JqKGUpKXt2YXIgdD17fTtmb3IodmFyIGkgaW4gZSl0W2ldPSJvYmplY3QiPT10eXBlb2YgZVtpXSYmbnVsbCE9ZVtpXT90aGlzLl9jb3B5T2JqKGVbaV0pOmVbaV19ZWxzZSBmb3IodmFyIHQ9W10saT0wO2k8ZS5sZW5ndGg7aSsrKXRbaV09Im9iamVjdCI9PXR5cGVvZiBlW2ldJiZudWxsIT1lW2ldP3RoaXMuX2NvcHlPYmooZVtpXSk6ZVtpXTtyZXR1cm4gdH19LHdpbmRvdy5kaHg0LmlzSUU9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIik+PTB8fG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiVHJpZGVudCIpPj0wLHdpbmRvdy5kaHg0LmlzSUU2PW51bGw9PXdpbmRvdy5YTUxIdHRwUmVxdWVzdCYmbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIik+PTAsd2luZG93LmRoeDQuaXNJRTc9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIDcuMCIpPj0wJiZuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlRyaWRlbnQiKTwwLHdpbmRvdy5kaHg0LmlzSUU4PW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSA4LjAiKT49MCYmbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJUcmlkZW50Iik+PTAsd2luZG93LmRoeDQuaXNJRTk9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIDkuMCIpPj0wJiZuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlRyaWRlbnQiKT49MCx3aW5kb3cuZGh4NC5pc0lFMTA9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIDEwLjAiKT49MCYmbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJUcmlkZW50Iik+PTAmJjEhPXdpbmRvdy5uYXZpZ2F0b3IucG9pbnRlckVuYWJsZWQsd2luZG93LmRoeDQuaXNJRTExPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiVHJpZGVudCIpPj0wJiYxPT13aW5kb3cubmF2aWdhdG9yLnBvaW50ZXJFbmFibGVkLHdpbmRvdy5kaHg0LmlzRWRnZT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKT49MCx3aW5kb3cuZGh4NC5pc09wZXJhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKT49MCx3aW5kb3cuZGh4NC5pc0Nocm9tZT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpPj0wJiYhd2luZG93LmRoeDQuaXNFZGdlLHdpbmRvdy5kaHg0LmlzS0hUTUw9KG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIik+PTB8fG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiS29ucXVlcm9yIik+PTApJiYhd2luZG93LmRoeDQuaXNFZGdlLHdpbmRvdy5kaHg0LmlzRkY9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94Iik+PTAsd2luZG93LmRoeDQuaXNJUGFkPW5hdmlnYXRvci51c2VyQWdlbnQuc2VhcmNoKC9pUGFkL2dpKT49MCx3aW5kb3cuZGh4NC5kbmQ9e2V2czp7fSxwX2VuOih3aW5kb3cuZGh4NC5pc0lFfHx3aW5kb3cuZGh4NC5pc0VkZ2UpJiYod2luZG93Lm5hdmlnYXRvci5wb2ludGVyRW5hYmxlZHx8d2luZG93Lm5hdmlnYXRvci5tc1BvaW50ZXJFbmFibGVkKSxfbVRvdWNoOmZ1bmN0aW9uKGUpe3JldHVybiB3aW5kb3cuZGh4NC5pc0lFMTAmJmUucG9pbnRlclR5cGU9PWUuTVNQT0lOVEVSX1RZUEVfTU9VU0V8fHdpbmRvdy5kaHg0LmlzSUUxMSYmIm1vdXNlIj09ZS5wb2ludGVyVHlwZXx8d2luZG93LmRoeDQuaXNFZGdlJiYibW91c2UiPT1lLnBvaW50ZXJUeXBlfSxfdG91Y2hPbjpmdW5jdGlvbihlKXtudWxsPT1lJiYoZT1kb2N1bWVudC5ib2R5KSxlLnN0eWxlLnRvdWNoQWN0aW9uPWUuc3R5bGUubXNUb3VjaEFjdGlvbj0iIixlPW51bGx9LF90b3VjaE9mZjpmdW5jdGlvbihlKXtudWxsPT1lJiYoZT1kb2N1bWVudC5ib2R5KSxlLnN0eWxlLnRvdWNoQWN0aW9uPWUuc3R5bGUubXNUb3VjaEFjdGlvbj0ibm9uZSIsZT1udWxsfX0sMT09d2luZG93Lm5hdmlnYXRvci5wb2ludGVyRW5hYmxlZD93aW5kb3cuZGh4NC5kbmQuZXZzPXtzdGFydDoicG9pbnRlcmRvd24iLG1vdmU6InBvaW50ZXJtb3ZlIixlbmQ6InBvaW50ZXJ1cCJ9OjE9PXdpbmRvdy5uYXZpZ2F0b3IubXNQb2ludGVyRW5hYmxlZD93aW5kb3cuZGh4NC5kbmQuZXZzPXtzdGFydDoiTVNQb2ludGVyRG93biIsbW92ZToiTVNQb2ludGVyTW92ZSIsZW5kOiJNU1BvaW50ZXJVcCJ9OiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93LmFkZEV2ZW50TGlzdGVuZXImJih3aW5kb3cuZGh4NC5kbmQuZXZzPXtzdGFydDoidG91Y2hzdGFydCIsbW92ZToidG91Y2htb3ZlIixlbmQ6InRvdWNoZW5kIn0pKSwidW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvdy5kaHg0Ll9ldmVudGFibGUmJih3aW5kb3cuZGh4NC5fZXZlbnRhYmxlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuImNsZWFyIj09dD8oZS5kZXRhY2hBbGxFdmVudHMoKSxlLmRoeGV2cz1udWxsLGUuYXR0YWNoRXZlbnQ9bnVsbCxlLmRldGFjaEV2ZW50PW51bGwsZS5jaGVja0V2ZW50PW51bGwsZS5jYWxsRXZlbnQ9bnVsbCxlLmRldGFjaEFsbEV2ZW50cz1udWxsLGU9bnVsbCx2b2lkIDApOihlLmRoeGV2cz17ZGF0YTp7fX0sZS5hdHRhY2hFdmVudD1mdW5jdGlvbihlLHQpe2U9U3RyaW5nKGUpLnRvTG93ZXJDYXNlKCksdGhpcy5kaHhldnMuZGF0YVtlXXx8KHRoaXMuZGh4ZXZzLmRhdGFbZV09e30pO3ZhciBpPXdpbmRvdy5kaHg0Lm5ld0lkKCk7cmV0dXJuIHRoaXMuZGh4ZXZzLmRhdGFbZV1baV09dCxpfSxlLmRldGFjaEV2ZW50PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdCBpbiB0aGlzLmRoeGV2cy5kYXRhKXt2YXIgaT0wO2Zvcih2YXIgbiBpbiB0aGlzLmRoeGV2cy5kYXRhW3RdKW49PWU/KHRoaXMuZGh4ZXZzLmRhdGFbdF1bbl09bnVsbCxkZWxldGUgdGhpcy5kaHhldnMuZGF0YVt0XVtuXSk6aSsrOzA9PWkmJih0aGlzLmRoeGV2cy5kYXRhW3RdPW51bGwsZGVsZXRlIHRoaXMuZGh4ZXZzLmRhdGFbdF0pfX0sZS5jaGVja0V2ZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlPVN0cmluZyhlKS50b0xvd2VyQ2FzZSgpLG51bGwhPXRoaXMuZGh4ZXZzLmRhdGFbZV19LGUuY2FsbEV2ZW50PWZ1bmN0aW9uKGUsdCl7aWYoZT1TdHJpbmcoZSkudG9Mb3dlckNhc2UoKSxudWxsPT10aGlzLmRoeGV2cy5kYXRhW2VdKXJldHVybiEwO3ZhciBpPSEwO2Zvcih2YXIgbiBpbiB0aGlzLmRoeGV2cy5kYXRhW2VdKWk9dGhpcy5kaHhldnMuZGF0YVtlXVtuXS5hcHBseSh0aGlzLHQpJiZpO3JldHVybiBpfSxlLmRldGFjaEFsbEV2ZW50cz1mdW5jdGlvbigpe2Zvcih2YXIgZSBpbiB0aGlzLmRoeGV2cy5kYXRhKXtmb3IodmFyIHQgaW4gdGhpcy5kaHhldnMuZGF0YVtlXSl0aGlzLmRoeGV2cy5kYXRhW2VdW3RdPW51bGwsZGVsZXRlIHRoaXMuZGh4ZXZzLmRhdGFbZV1bdF07dGhpcy5kaHhldnMuZGF0YVtlXT1udWxsLGRlbGV0ZSB0aGlzLmRoeGV2cy5kYXRhW2VdfX0sZT1udWxsLHZvaWQgMCl9LGRoeDQuX2V2ZW50YWJsZShkaHg0KSksInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3cuZGh0bWx4JiYod2luZG93LmRodG1seD17ZXh0ZW5kOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBpIGluIHQpZVtpXXx8KGVbaV09dFtpXSk7cmV0dXJuIGV9LGV4dGVuZF9hcGk6ZnVuY3Rpb24oZSx0LGkpe3ZhciBuPXdpbmRvd1tlXTtuJiYod2luZG93W2VdPWZ1bmN0aW9uKGUpe2lmKGUmJiJvYmplY3QiPT10eXBlb2YgZSYmIWUudGFnTmFtZSl7dmFyIGk9bi5hcHBseSh0aGlzLHQuX2luaXQ/dC5faW5pdChlKTphcmd1bWVudHMpO2Zvcih2YXIgbyBpbiBkaHRtbHgpdFtvXSYmdGhpc1t0W29dXShkaHRtbHhbb10pO2Zvcih2YXIgbyBpbiBlKXRbb10/dGhpc1t0W29dXShlW29dKTowPT09by5pbmRleE9mKCJvbiIpJiZ0aGlzLmF0dGFjaEV2ZW50KG8sZVtvXSl9ZWxzZSB2YXIgaT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gdC5fcGF0Y2gmJnQuX3BhdGNoKHRoaXMpLGl8fHRoaXN9LHdpbmRvd1tlXS5wcm90b3R5cGU9bi5wcm90b3R5cGUsaSYmZGh0bWx4LmV4dGVuZCh3aW5kb3dbZV0ucHJvdG90eXBlLGkpKX0sdXJsOmZ1bmN0aW9uKGUpe3JldHVybi0xIT1lLmluZGV4T2YoIj8iKT8iJiI6Ij8ifX0pLF9pc0ZGPSExLF9pc0lFPSExLF9pc09wZXJhPSExLF9pc0tIVE1MPSExLF9pc01hY09TPSExLF9pc0Nocm9tZT0hMSxfRkZydj0hMSxfS0hUTUxydj0hMSxfT3BlcmFSdj0hMSwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNYWNpbnRvc2giKSYmKF9pc01hY09TPSEwKSxuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiY2hyb21lIik+LTEmJihfaXNDaHJvbWU9ITApLC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJLb25xdWVyb3IiKT8oX0tIVE1McnY9cGFyc2VGbG9hdChuYXZpZ2F0b3IudXNlckFnZW50LnN1YnN0cihuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpKzcsNSkpLF9LSFRNTHJ2PjUyNT8oX2lzRkY9ITAsX0ZGcnY9MS45KTpfaXNLSFRNTD0hMCk6LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKT8oX2lzT3BlcmE9ITAsX09wZXJhUnY9cGFyc2VGbG9hdChuYXZpZ2F0b3IudXNlckFnZW50LnN1YnN0cihuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIikrNiwzKSkpOi0xIT1uYXZpZ2F0b3IuYXBwTmFtZS5pbmRleE9mKCJNaWNyb3NvZnQiKT8oX2lzSUU9ITAsKC0xIT1uYXZpZ2F0b3IuYXBwVmVyc2lvbi5pbmRleE9mKCJNU0lFIDguMCIpfHwtMSE9bmF2aWdhdG9yLmFwcFZlcnNpb24uaW5kZXhPZigiTVNJRSA5LjAiKXx8LTEhPW5hdmlnYXRvci5hcHBWZXJzaW9uLmluZGV4T2YoIk1TSUUgMTAuMCIpfHxkb2N1bWVudC5kb2N1bWVudE1vZGU+NykmJiJCYWNrQ29tcGF0IiE9ZG9jdW1lbnQuY29tcGF0TW9kZSYmKF9pc0lFPTgpKToiTmV0c2NhcGUiPT1uYXZpZ2F0b3IuYXBwTmFtZSYmLTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiVHJpZGVudCIpP19pc0lFPTg6KF9pc0ZGPSEwLF9GRnJ2PXBhcnNlRmxvYXQobmF2aWdhdG9yLnVzZXJBZ2VudC5zcGxpdCgicnY6IilbMV0pKSwidW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvdy5kaHRtbHhFdmVudCxudWxsPT1kaHRtbHhFdmVudC50b3VjaERlbGF5JiYoZGh0bWx4RXZlbnQudG91Y2hEZWxheT0yZTMpLCJ1bmRlZmluZWQiPT10eXBlb2YgZGh0bWx4RXZlbnQuaW5pdFRvdWNoJiYoZGh0bWx4RXZlbnQuaW5pdFRvdWNoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe2lmKGkpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJIVE1MRXZlbnRzIik7ZS5pbml0RXZlbnQoImRibGNsaWNrIiwhMCwhMCksaS5kaXNwYXRjaEV2ZW50KGUpLHQ9aT1udWxsfX12YXIgdCxpLG4sbztkaHRtbHhFdmVudChkb2N1bWVudC5ib2R5LCJ0b3VjaHN0YXJ0IixmdW5jdGlvbihyKXtpPXIudG91Y2hlc1swXS50YXJnZXQsbj1yLnRvdWNoZXNbMF0uY2xpZW50WCxvPXIudG91Y2hlc1swXS5jbGllbnRZLHQ9d2luZG93LnNldFRpbWVvdXQoZSxkaHRtbHhFdmVudC50b3VjaERlbGF5KX0pLGRodG1seEV2ZW50KGRvY3VtZW50LmJvZHksInRvdWNobW92ZSIsZnVuY3Rpb24oZSl7dCYmKE1hdGguYWJzKGUudG91Y2hlc1swXS5jbGllbnRYLW4pPjUwfHxNYXRoLmFicyhlLnRvdWNoZXNbMF0uY2xpZW50WS1vKT41MCkmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHQpLHQ9aT0hMSl9KSxkaHRtbHhFdmVudChkb2N1bWVudC5ib2R5LCJ0b3VjaGVuZCIsZnVuY3Rpb24oKXt0JiYod2luZG93LmNsZWFyVGltZW91dCh0KSx0PWk9ITEpfSksZGh0bWx4RXZlbnQuaW5pdFRvdWNoPWZ1bmN0aW9uKCl7fX0pLGRodG1sWFRyZWVPYmplY3QucHJvdG90eXBlLl9kb0NvbnRDbGljaz1mdW5jdGlvbihlLHQpe2lmKCF0JiYyIT1lLmJ1dHRvbilyZXR1cm4gdGhpcy5fYWNNZW51JiYodGhpcy5fYWNNZW51LmhpZGVDb250ZXh0TWVudT90aGlzLl9hY01lbnUuaGlkZUNvbnRleHRNZW51KCk6dGhpcy5jTWVudS5fY29udGV4dEVuZCgpKSwhMDtmb3IodmFyIGk9X2lzSUU/ZS5zcmNFbGVtZW50OmUudGFyZ2V0O2kmJiJCT0RZIiE9aS50YWdOYW1lJiYhaS5wYXJlbnRPYmplY3Q7KWk9aS5wYXJlbnROb2RlO2lmKCFpfHwhaS5wYXJlbnRPYmplY3QpcmV0dXJuITA7dmFyIG49aS5wYXJlbnRPYmplY3Q7aWYodGhpcy5jYWxsRXZlbnQoIm9uUmlnaHRDbGljayIsW24uaWQsZV0pfHwoKGUuc3JjRWxlbWVudHx8ZS50YXJnZXQpLm9uY29udGV4dG1lbnU9ZnVuY3Rpb24oZSl7cmV0dXJuKGV8fGV2ZW50KS5jYW5jZWxCdWJibGU9ITAsITF9KSx0aGlzLl9hY01lbnU9bi5jTWVudXx8dGhpcy5jTWVudSx0aGlzLl9hY01lbnUpe2lmKCF0aGlzLmNhbGxFdmVudCgib25CZWZvcmVDb250ZXh0TWVudSIsW24uaWRdKSlyZXR1cm4hMDtpZihfaXNNYWNPU3x8KChlLnNyY0VsZW1lbnR8fGUudGFyZ2V0KS5vbmNvbnRleHRtZW51PWZ1bmN0aW9uKGUpe3JldHVybihlfHxldmVudCkuY2FuY2VsQnViYmxlPSEwLCExfSksdGhpcy5fYWNNZW51LnNob3dDb250ZXh0TWVudSl7dmFyIG89d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxyPXdpbmRvdy5kb2N1bWVudC5ib2R5LGw9bmV3IEFycmF5KG8uc2Nyb2xsTGVmdHx8ci5zY3JvbGxMZWZ0LG8uc2Nyb2xsVG9wfHxyLnNjcm9sbFRvcCk7aWYoX2lzSUUpdmFyIHM9ZS5jbGllbnRYK2xbMF0sYT1lLmNsaWVudFkrbFsxXTtlbHNlIHZhciBzPWUucGFnZVgsYT1lLnBhZ2VZO3RoaXMuX2FjTWVudS5zaG93Q29udGV4dE1lbnUocy0xLGEtMSksdGhpcy5jb250ZXh0SUQ9bi5pZCxlLmNhbmNlbEJ1YmJsZT0hMCx0aGlzLl9hY01lbnUuX3NraXBfaGlkZT0hMH1lbHNlIGkuY29udGV4dE1lbnVJZD1uLmlkLGkuY29udGV4dE1lbnU9dGhpcy5fYWNNZW51LGkuYT10aGlzLl9hY01lbnUuX2NvbnRleHRTdGFydCxpLmEoaSxlKSxpLmE9bnVsbDtyZXR1cm4hMX1yZXR1cm4hMH0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUuZW5hYmxlSUVJbWFnZUZpeD1mdW5jdGlvbihlKXtlPyh0aGlzLl9nZXRJbWc9ZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKTtyZXR1cm4gZS5pbm5lckhUTUw9IiZuYnNwOyIsZS5jbGFzc05hbWU9ImRoeF9iZ19pbWdfZml4IixlfSx0aGlzLl9zZXRTcmM9ZnVuY3Rpb24oZSx0KXtlLnN0eWxlLmJhY2tncm91bmRJbWFnZT0idXJsKCIrdCsiKSJ9LHRoaXMuX2dldFNyYz1mdW5jdGlvbihlKXt2YXIgdD1lLnN0eWxlLmJhY2tncm91bmRJbWFnZTtyZXR1cm4gdC5zdWJzdHIoNCx0Lmxlbmd0aC01KS5yZXBsYWNlKC8oXiIpfCgiJCkvZywiIil9KToodGhpcy5fZ2V0SW1nPWZ1bmN0aW9uKGUpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGU9PXRoaXMucm9vdElkPyJkaXYiOiJpbWciKX0sdGhpcy5fc2V0U3JjPWZ1bmN0aW9uKGUsdCl7ZS5zcmM9dH0sdGhpcy5fZ2V0U3JjPWZ1bmN0aW9uKGUpe3JldHVybiBlLnNyY30pfSxkaHRtbFhUcmVlT2JqZWN0LnByb3RvdHlwZS5kZXN0cnVjdG9yPWZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHRoaXMuX2lkcHVsbCl7dmFyIHQ9dGhpcy5faWRwdWxsW2VdO3QmJih0LnBhcmVudE9iamVjdD1udWxsLHQudHJlZU5vZD1udWxsLHQuY2hpbGROb2Rlcz1udWxsLHQuc3Bhbj1udWxsLHQudHIubm9kZW09bnVsbCx0LnRyPW51bGwsdC5odG1sTm9kZS5vYmpCZWxvbmc9bnVsbCx0Lmh0bWxOb2RlPW51bGwsdGhpcy5faWRwdWxsW2VdPW51bGwpfXRoaXMucGFyZW50T2JqZWN0LmlubmVySFRNTD0iIix0aGlzLmFsbFRyZWUub25zZWxlY3RzdGFydD1udWxsLHRoaXMuYWxsVHJlZS5vbmNvbnRleHRtZW51PW51bGwsdGhpcy5hbGxUcmVlLm9ubW91c2Vkb3duPW51bGw7Zm9yKHZhciBlIGluIHRoaXMpdGhpc1tlXT1udWxsfSxjT2JqZWN0LnByb3RvdHlwZT1uZXcgT2JqZWN0LGNPYmplY3QucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe31yZXR1cm4gZS5wcm90b3R5cGU9dGhpcyxuZXcgZX0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUuX2dsb2JhbElkU3RvcmFnZUFkZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9nbG9iYWxJZFN0b3JhZ2VGaW5kKGUsMSwxKT8oZT1lKyJfIisobmV3IERhdGUpLnZhbHVlT2YoKSx0aGlzLl9nbG9iYWxJZFN0b3JhZ2VBZGQoZSx0KSk6KHRoaXMuX2lkcHVsbFtlXT10LHRoaXMuX3B1bGxTaXplKyssZSl9LGRodG1sWFRyZWVPYmplY3QucHJvdG90eXBlLl9nbG9iYWxJZFN0b3JhZ2VTdWI9ZnVuY3Rpb24oZSl7dGhpcy5faWRwdWxsW2VdJiYodGhpcy5fdW5zZWxlY3RJdGVtKHRoaXMuX2lkcHVsbFtlXSksdGhpcy5faWRwdWxsW2VdPW51bGwsdGhpcy5fcHVsbFNpemUtLSksdGhpcy5fbG9ja2VyJiZ0aGlzLl9sb2NrZXJbZV0mJih0aGlzLl9sb2NrZXJbZV09ITEpfSxkaHRtbFhUcmVlT2JqZWN0LnByb3RvdHlwZS5fZ2xvYmFsSWRTdG9yYWdlRmluZD1mdW5jdGlvbihlLHQsaSxuKXt2YXIgbz10aGlzLl9pZHB1bGxbZV07aWYobyl7aWYoby51blBhcnNlZCYmIWkmJnRoaXMucmVQYXJzZShvLDApLHRoaXMuX3NybmQmJiFvLmh0bWxOb2RlJiZ0aGlzLl9idWlsZFNSTkQobyxpKSxuJiZ0aGlzLl9lZHNicHNBKWZvcih2YXIgcj0wO3I8dGhpcy5fZWRzYnBzQS5sZW5ndGg7cisrKWlmKHRoaXMuX2Vkc2Jwc0Fbcl1bMl09PWUpcmV0dXJuIGRoeDQuY2FsbEV2ZW50KCJvbmdldEl0ZW1FcnJvciIsWyJSZXF1ZXN0ZWQgaXRlbSBzdGlsbCBpbiBwYXJzaW5nIHByb2Nlc3MuIixlXSksbnVsbDtyZXR1cm4gb31yZXR1cm4gdGhpcy5zbG93UGFyc2UmJjAhPWUmJiF0P3RoaXMucHJlUGFyc2UoZSk6bnVsbH0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUuX2RyYXdOZXdUcj1mdW5jdGlvbihlKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpLGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKSxuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7cmV0dXJuIGkuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiAiKSksbi5jb2xTcGFuPTMsbi5hcHBlbmRDaGlsZChlKSx0LmFwcGVuZENoaWxkKGkpLHQuYXBwZW5kQ2hpbGQobiksdH0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oZSx0LGkpe2lmKCJzdHJpbmciPT10eXBlb2YgdCYmKGk9dCx0PW51bGwpLCJqc29uIj09PWkpcmV0dXJuIHRoaXMuX2xvYWRKU09OT2JqZWN0KGUsdCk7aWYoImNzdiI9PT1pKXJldHVybiB0aGlzLl9sb2FkQ1NWU3RyaW5nKGUsdCk7aWYoImpzYXJyYXkiPT09aSlyZXR1cm4gdGhpcy5fbG9hZEpTQXJyYXkoZSx0KTt2YXIgbj10aGlzO3RoaXMucGFyc0NvdW50fHx0aGlzLmNhbGxFdmVudCgib25YTFMiLFtuLG51bGxdKSx0aGlzLnhtbHN0YXRlPTEsdGhpcy5YTUxMb2FkZXIoe3Jlc3BvbnNlWE1MOmRoeDQuYWpheC5wYXJzZShlKX0sdCl9LGRodG1sWFRyZWVPYmplY3QucHJvdG90eXBlLl9hdHRhY2hDaGlsZE5vZGU9ZnVuY3Rpb24oZSx0LGksbixvLHIsbCxzLGEsZCxoKXtkJiZkLnBhcmVudE9iamVjdCYmKGU9ZC5wYXJlbnRPYmplY3QpLDA9PWUuWE1MbG9hZCYmdGhpcy5YTUxzb3VyY2UmJiF0aGlzLlhNTGxvYWRpbmdXYXJuaW5nJiYoZS5YTUxsb2FkPTEsdGhpcy5fbG9hZER5blhNTChlLmlkKSk7dmFyIGM9ZS5jaGlsZHNDb3VudCx1PWUuY2hpbGROb2RlcztpZihoJiZoLnRyLnByZXZpb3VzU2libGluZyYmKGgudHIucHJldmlvdXNTaWJsaW5nLnByZXZpb3VzU2libGluZz9kPWgudHIucHJldmlvdXNTaWJsaW5nLm5vZGVtOnM9cy5yZXBsYWNlKCJUT1AiLCIiKSsiLFRPUCIpLGQpe3ZhciBwLF87Zm9yKHA9MDtjPnA7cCsrKWlmKHVbcF09PWQpe2ZvcihfPWM7XyE9cDtfLS0pdVsxK19dPXVbX107YnJlYWt9cCsrLGM9cH1pZihzKWZvcih2YXIgbT1zLnNwbGl0KCIsIiksZz0wO2c8bS5sZW5ndGg7ZysrKXN3aXRjaChtW2ddKXtjYXNlIlRPUCI6Zm9yKGUuY2hpbGRzQ291bnQ+MCYmKGQ9bmV3IE9iamVjdCxkLnRyPWUuY2hpbGROb2Rlc1swXS50ci5wcmV2aW91c1NpYmxpbmcpLGUuX2hhc190b3A9ITAscD1jO3A+MDtwLS0pdVtwXT11W3AtMV07Yz0wfXZhciBmOyhmPXRoaXMuX2lkcHVsbFt0XSkmJi0xPT1mLnNwYW58fChmPXVbY109bmV3IGRodG1sWFRyZWVJdGVtT2JqZWN0KHQsaSxlLHRoaXMsbiwxKSx0PXVbY10uaWQsZS5jaGlsZHNDb3VudCsrKSxmLmh0bWxOb2RlfHwoZi5sYWJlbD1pLGYuaHRtbE5vZGU9dGhpcy5fY3JlYXRlSXRlbSh0aGlzLmNoZWNrQm94T2ZmPzE6MCxmKSxmLmh0bWxOb2RlLm9iakJlbG9uZz1mKSxvJiYoZi5pbWFnZXNbMF09byksciYmKGYuaW1hZ2VzWzFdPXIpLGwmJihmLmltYWdlc1syXT1sKTt2YXIgYj10aGlzLl9kcmF3TmV3VHIoZi5odG1sTm9kZSk7aWYoKHRoaXMuWE1MbG9hZGluZ1dhcm5pbmd8fHRoaXMuX2hBZEkpJiYoZi5odG1sTm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGQmJmQudHImJmQudHIubmV4dFNpYmxpbmc/ZS5odG1sTm9kZS5jaGlsZE5vZGVzWzBdLmluc2VydEJlZm9yZShiLGQudHIubmV4dFNpYmxpbmcpOnRoaXMucGFyc2luZ09uPT1lLmlkP3RoaXMucGFyc2VkQXJyYXlbdGhpcy5wYXJzZWRBcnJheS5sZW5ndGhdPWI6ZS5odG1sTm9kZS5jaGlsZE5vZGVzWzBdLmFwcGVuZENoaWxkKGIpLGQmJiFkLnNwYW4mJihkPW51bGwpLHRoaXMuWE1Mc291cmNlJiYoZi5YTUxsb2FkPWEmJjAhPWE/MDoxKSxmLnRyPWIsYi5ub2RlbT1mLDA9PWUuaXRlbUlkJiYoYi5jaGlsZE5vZGVzWzBdLmNsYXNzTmFtZT0iaGlkZGVuUm93IiksKGUuX3JfbG9naWN8fHRoaXMuX2ZyYnRyKSYmdGhpcy5fc2V0U3JjKGYuaHRtbE5vZGUuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1swXSx0aGlzLmltUGF0aCt0aGlzLnJhZGlvQXJyYXlbMF0pLHMpZm9yKHZhciBtPXMuc3BsaXQoIiwiKSxnPTA7ZzxtLmxlbmd0aDtnKyspc3dpdGNoKG1bZ10pe2Nhc2UiU0VMRUNUIjp0aGlzLnNlbGVjdEl0ZW0odCwhMSk7YnJlYWs7Y2FzZSJDQUxMIjp0aGlzLnNlbGVjdEl0ZW0odCwhMCk7YnJlYWs7Y2FzZSJDSElMRCI6Zi5YTUxsb2FkPTA7YnJlYWs7Y2FzZSJDSEVDS0VEIjp0aGlzLlhNTGxvYWRpbmdXYXJuaW5nP3RoaXMuc2V0Q2hlY2tMaXN0Kz10aGlzLmRsbXRyK3Q6dGhpcy5zZXRDaGVjayh0LDEpO2JyZWFrO2Nhc2UiSENIRUNLRUQiOnRoaXMuX3NldENoZWNrKGYsInVuc3VyZSIpO2JyZWFrO2Nhc2UiT1BFTiI6Zi5vcGVuTWU9MX1pZighdGhpcy5YTUxsb2FkaW5nV2FybmluZyYmKHRoaXMuX2dldE9wZW5TdGF0ZShlKTwwJiYhdGhpcy5faEFkSSYmdGhpcy5vcGVuSXRlbShlLmlkKSxkJiYodGhpcy5fY29ycmVjdFBsdXMoZCksdGhpcy5fY29ycmVjdExpbmUoZCkpLHRoaXMuX2NvcnJlY3RQbHVzKGUpLHRoaXMuX2NvcnJlY3RMaW5lKGUpLHRoaXMuX2NvcnJlY3RQbHVzKGYpLGUuY2hpbGRzQ291bnQ+PTImJih0aGlzLl9jb3JyZWN0UGx1cyh1W2UuY2hpbGRzQ291bnQtMl0pLHRoaXMuX2NvcnJlY3RMaW5lKHVbZS5jaGlsZHNDb3VudC0yXSkpLDIhPWUuY2hpbGRzQ291bnQmJnRoaXMuX2NvcnJlY3RQbHVzKHVbMF0pLHRoaXMudHNjaGVjayYmdGhpcy5fY29ycmVjdENoZWNrU3RhdGVzKGUpLHRoaXMuX29ucmFkaCkpaWYoMT09dGhpcy54bWxzdGF0ZSl7dmFyIHY9dGhpcy5vblhMRTt0aGlzLm9uWExFPWZ1bmN0aW9uKGUpe3RoaXMuX29ucmFkaCh0KSx2JiZ2KGUpfX1lbHNlIHRoaXMuX29ucmFkaCh0KTtyZXR1cm4gZn0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUuX3BhcnNlSXRlbT1mdW5jdGlvbihlLHQsaSxuKXt2YXIgbztpZih0aGlzLl9zcm5kJiYoIXRoaXMuX2lkcHVsbFtvPWUuZ2V0KCJpZCIpXXx8IXRoaXMuX2lkcHVsbFtvXS5zcGFuKSlyZXR1cm4gdGhpcy5fYWRkSXRlbVNSTkQodC5pZCxvLGUpLHZvaWQgMDt2YXIgcj1lLmdldF9hbGwoKTtpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMud2FpdFVwZGF0ZVhNTCYmIXRoaXMud2FpdFVwZGF0ZVhNTFtyLmlkXSlyZXR1cm4gdGhpcy5fcGFyc2UoZSxyLmlkLDEpLHZvaWQgMDsobnVsbD09PXIudGV4dHx8InVuZGVmaW5lZCI9PXR5cGVvZiByLnRleHQpJiYoci50ZXh0PWUuc3ViKCJpdGVtdGV4dCIpLHIudGV4dCYmKHIudGV4dD1yLnRleHQuY29udGVudCgpKSk7dmFyIGw9W107aWYoci5zZWxlY3QmJmwucHVzaCgiU0VMRUNUIiksci50b3AmJmwucHVzaCgiVE9QIiksci5jYWxsJiYodGhpcy5ub2RlQXNraW5nQ2FsbD1yLmlkKSwtMT09ci5jaGVja2VkP2wucHVzaCgiSENIRUNLRUQiKTpyLmNoZWNrZWQmJmwucHVzaCgiQ0hFQ0tFRCIpLHIub3BlbiYmbC5wdXNoKCJPUEVOIiksdGhpcy53YWl0VXBkYXRlWE1MKWlmKHRoaXMuX2dsb2JhbElkU3RvcmFnZUZpbmQoci5pZCkpdmFyIHM9dGhpcy51cGRhdGVJdGVtKHIuaWQsci50ZXh0LHIuaW0wLHIuaW0xLHIuaW0yLHIuY2hlY2tlZCxyLmNoaWxkKTtlbHNlezA9PXRoaXMubnBsP2wucHVzaCgiVE9QIik6aT10LmNoaWxkTm9kZXNbdGhpcy5ucGxdO3ZhciBzPXRoaXMuX2F0dGFjaENoaWxkTm9kZSh0LHIuaWQsci50ZXh0LDAsci5pbTAsci5pbTEsci5pbTIsbC5qb2luKCIsIiksci5jaGlsZCwwLGkpO3IuaWQ9cy5pZCxpPW51bGx9ZWxzZSB2YXIgcz10aGlzLl9hdHRhY2hDaGlsZE5vZGUodCxyLmlkLHIudGV4dCwwLHIuaW0wLHIuaW0xLHIuaW0yLGwuam9pbigiLCIpLHIuY2hpbGQsbnx8MCxpKTtpZihyLnRvb2x0aXAmJihzLnNwYW4ucGFyZW50Tm9kZS5wYXJlbnROb2RlLnRpdGxlPXIudG9vbHRpcCksci5zdHlsZSYmKHMuc3Bhbi5zdHlsZS5jc3NUZXh0P3Muc3Bhbi5zdHlsZS5jc3NUZXh0Kz0iOyIrci5zdHlsZTpzLnNwYW4uc2V0QXR0cmlidXRlKCJzdHlsZSIscy5zcGFuLmdldEF0dHJpYnV0ZSgic3R5bGUiKSsiOyAiK3Iuc3R5bGUpKSxyLnJhZGlvJiYocy5fcl9sb2dpYz0hMCksci5ub2NoZWNrYm94KXt2YXIgYT1zLnNwYW4ucGFyZW50Tm9kZS5wcmV2aW91c1NpYmxpbmcucHJldmlvdXNTaWJsaW5nO2Euc3R5bGUuZGlzcGxheT0ibm9uZSIscy5ub2NoZWNrYm94PSEwfXIuZGlzYWJsZWQmJihudWxsIT1yLmNoZWNrZWQmJnRoaXMuX3NldENoZWNrKHMsci5jaGVja2VkKSx0aGlzLmRpc2FibGVDaGVja2JveChzLDEpKSxzLl9hY2M9ci5jaGlsZHx8MCx0aGlzLnBhcnNlckV4dGVuc2lvbiYmdGhpcy5wYXJzZXJFeHRlbnNpb24uX3BhcnNlRXh0ZW5zaW9uLmNhbGwodGhpcyxlLHIsdD90LmlkOjApLHRoaXMuc2V0SXRlbUNvbG9yKHMsci5hQ29sLHIuc0NvbCksIjEiPT1yLmxvY2tlZCYmdGhpcy5sb2NrSXRlbShzLmlkLCEwLCEwKSwoci5pbXdpZHRofHxyLmltaGVpZ2h0KSYmdGhpcy5zZXRJY29uU2l6ZShyLmltd2lkdGgsci5pbWhlaWdodCxzKSwoIjAiPT1yLmNsb3NlYWJsZXx8IjEiPT1yLmNsb3NlYWJsZSkmJnRoaXMuc2V0SXRlbUNsb3NlYWJsZShzLHIuY2xvc2VhYmxlKTt2YXIgZD0iIjtyLnRvcG9mZnNldCYmdGhpcy5zZXRJdGVtVG9wT2Zmc2V0KHMsci50b3BvZmZzZXQpLHRoaXMuc2xvd1BhcnNlJiYib2JqZWN0IiE9dHlwZW9mIHRoaXMud2FpdFVwZGF0ZVhNTD8oIXMuY2hpbGRzQ291bnQmJmUuc3ViX2V4aXN0cygiaXRlbSIpJiYocy51blBhcnNlZD1lLmNsb25lKCkpLGUuZWFjaCgidXNlcmRhdGEiLGZ1bmN0aW9uKGUpe3RoaXMuc2V0VXNlckRhdGEoci5pZCxlLmdldCgibmFtZSIpLGUuY29udGVudCgpKX0sdGhpcykpOmUuc3ViX2V4aXN0cygiaXRlbSIpJiYoZD10aGlzLl9wYXJzZShlLHIuaWQsMSkpLCIiIT1kJiYodGhpcy5ub2RlQXNraW5nQ2FsbD1kKSxlLmVhY2goInVzZXJkYXRhIixmdW5jdGlvbih0KXt0aGlzLnNldFVzZXJEYXRhKGUuZ2V0KCJpZCIpLHQuZ2V0KCJuYW1lIiksdC5jb250ZW50KCkpfSx0aGlzKX0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUuX3BhcnNlPWZ1bmN0aW9uKGUsdCxpLG4pe2lmKHRoaXMuX3NybmQmJiF0aGlzLnBhcmVudE9iamVjdC5vZmZzZXRIZWlnaHQpe3ZhciBvPXRoaXM7cmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7by5fcGFyc2UoZSx0LGksbil9LDEwMCl9aWYoZS5leGlzdHMoKSl7aWYodGhpcy5za2lwTG9jaz0hMCwhdCl7dD1lLmdldCgiaWQiKSx0aGlzLl9keW5EZWxldGVCcmFuY2hlc1t0XSYmKHRoaXMuZGVsZXRlQ2hpbGRJdGVtcyh0KSx0aGlzLl9keW5EZWxldGVCcmFuY2hlc1t0XS0tLHRoaXMuX2R5bkRlbGV0ZUJyYW5jaGVzW3RdfHxkZWxldGUgdGhpcy5fZHluRGVsZXRlQnJhbmNoZXNbdF0pO3ZhciByPWUuZ2V0KCJkaHhfc2VjdXJpdHkiKTtyJiYoZGh0bWx4LnNlY3VyaXR5X2tleT1yKSxlLmdldCgicmFkaW8iKSYmKHRoaXMuaHRtbE5vZGUuX3JfbG9naWM9ITApLHRoaXMucGFyc2luZ09uPXQsdGhpcy5wYXJzZWRBcnJheT1uZXcgQXJyYXksdGhpcy5zZXRDaGVja0xpc3Q9IiIsdGhpcy5ub2RlQXNraW5nQ2FsbD0iIn12YXIgbD10aGlzLl9nbG9iYWxJZFN0b3JhZ2VGaW5kKHQpO2lmKCFsKXJldHVybiBkaHg0LmNhbGxFdmVudCgib25EYXRhU3RydWN0dXJlRXJyb3IiLFsiWE1MIHJlZmVycyB0byBub3QgZXhpc3RpbmcgcGFyZW50Il0pO2lmKHRoaXMucGFyc0NvdW50PXRoaXMucGFyc0NvdW50P3RoaXMucGFyc0NvdW50KzE6MSx0aGlzLlhNTGxvYWRpbmdXYXJuaW5nPTEsIWwuY2hpbGRzQ291bnR8fG58fHRoaXMuX2Vkc2Jwc3x8bC5faGFzX3RvcCl2YXIgcz0wO2Vsc2UgdmFyIHM9MDtpZih0aGlzLm5wbD0wLGUuZWFjaCgiaXRlbSIsZnVuY3Rpb24obixvKXtyZXR1cm4gbC5YTUxsb2FkPTEsdGhpcy5fcGFyc2VJdGVtKG4sbCwwLHMpLHRoaXMuX2Vkc2JwcyYmdGhpcy5ucGw9PXRoaXMuX2Vkc2Jwc0M/KHRoaXMuX2Rpc3RyaWJ1dGVkU3RhcnQoZSxvKzEsdCxpLGwuY2hpbGRzQ291bnQpLC0xKToodGhpcy5ucGwrKyx2b2lkIDApfSx0aGlzLG4pLCFpKXtpZihlLmVhY2goInVzZXJkYXRhIixmdW5jdGlvbih0KXt0aGlzLnNldFVzZXJEYXRhKGUuZ2V0KCJpZCIpLHQuZ2V0KCJuYW1lIiksdC5jb250ZW50KCkpfSx0aGlzKSxsLlhNTGxvYWQ9MSx0aGlzLndhaXRVcGRhdGVYTUwpe3RoaXMud2FpdFVwZGF0ZVhNTD0hMTtmb3IodmFyIGE9bC5jaGlsZHNDb3VudC0xO2E+PTA7YS0tKWwuY2hpbGROb2Rlc1thXS5fZG1hcmsmJnRoaXMuZGVsZXRlSXRlbShsLmNoaWxkTm9kZXNbYV0uaWQpfWZvcih2YXIgYT0odGhpcy5fZ2xvYmFsSWRTdG9yYWdlRmluZCh0aGlzLnBhcnNpbmdPbiksMCk7YTx0aGlzLnBhcnNlZEFycmF5Lmxlbmd0aDthKyspbC5odG1sTm9kZS5jaGlsZE5vZGVzWzBdLmFwcGVuZENoaWxkKHRoaXMucGFyc2VkQXJyYXlbYV0pO3RoaXMucGFyc2VkQXJyYXk9W10sdGhpcy5sYXN0TG9hZGVkWE1MSWQ9dCx0aGlzLlhNTGxvYWRpbmdXYXJuaW5nPTA7Zm9yKHZhciBkPXRoaXMuc2V0Q2hlY2tMaXN0LnNwbGl0KHRoaXMuZGxtdHIpLGg9MDtoPGQubGVuZ3RoO2grKylkW2hdJiZ0aGlzLnNldENoZWNrKGRbaF0sMSk7dGhpcy5YTUxzb3VyY2UmJnRoaXMudHNjaGVjayYmdGhpcy5zbWNoZWNrJiZsLmlkIT10aGlzLnJvb3RJZCYmKDA9PT1sLmNoZWNrc3RhdGU/dGhpcy5fc2V0U3ViQ2hlY2tlZCgwLGwpOjE9PT1sLmNoZWNrc3RhdGUmJnRoaXMuX3NldFN1YkNoZWNrZWQoMSxsKSksdGhpcy5fcmVkcmF3RnJvbSh0aGlzLG51bGwsbiksZS5nZXQoIm9yZGVyIikmJiJub25lIiE9ZS5nZXQoIm9yZGVyIikmJnRoaXMuX3Jlb3JkZXJCcmFuY2gobCxlLmdldCgib3JkZXIiKSwhMCksIiIhPXRoaXMubm9kZUFza2luZ0NhbGwmJnRoaXMuY2FsbEV2ZW50KCJvbkNsaWNrIixbdGhpcy5ub2RlQXNraW5nQ2FsbCx0aGlzLmdldFNlbGVjdGVkSXRlbUlkKCldKSx0aGlzLl9icmFuY2hVcGRhdGUmJnRoaXMuX2JyYW5jaFVwZGF0ZU5leHQoZSl9aWYoMT09dGhpcy5wYXJzQ291bnQpe2lmKHRoaXMucGFyc2luZ09uPW51bGwsdGhpcy5fc3JuZCYmbC5pZCE9dGhpcy5yb290SWQmJih0aGlzLnByZXBhcmVTUihsLmlkKSx0aGlzLlhNTHNvdXJjZSYmdGhpcy5vcGVuSXRlbShsLmlkKSksZS50aHJvdWdoKCJpdGVtIiwib3BlbiIsbnVsbCxmdW5jdGlvbihlKXt0aGlzLm9wZW5JdGVtKGUuZ2V0KCJpZCIpKX0sdGhpcyksIXRoaXMuX2Vkc2Jwc3x8IXRoaXMuX2Vkc2Jwc0EubGVuZ3RoKXt2YXIgYz10aGlzO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yy5jYWxsRXZlbnQoIm9uWExFIixbYyx0XSl9LDEpLHRoaXMueG1sc3RhdGU9MH10aGlzLnNraXBMb2NrPSExfXRoaXMucGFyc0NvdW50LS07dmFyIGM9dGhpcztyZXR1cm4gdGhpcy5fZWRzYnBzJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2MuX2Rpc3RyaWJ1dGVkU3RlcCh0KX0sdGhpcy5fZWRzYnBzRCksIWkmJnRoaXMub25YTEUmJnRoaXMub25YTEUodGhpcyx0KSx0aGlzLm5vZGVBc2tpbmdDYWxsfX0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUuX3JlZHJhd0Zyb209ZnVuY3Rpb24oZSx0LGksbil7aWYodClvPXQ7ZWxzZXt2YXIgbz1lLl9nbG9iYWxJZFN0b3JhZ2VGaW5kKGUubGFzdExvYWRlZFhNTElkKTtpZihlLmxhc3RMb2FkZWRYTUxJZD0tMSwhbylyZXR1cm4gMH1mb3IodmFyIHI9MCxsPWk/aS0xOjA7bDxvLmNoaWxkc0NvdW50O2wrKylpZih0aGlzLl9icmFuY2hVcGRhdGUmJjEhPXRoaXMuX2dldE9wZW5TdGF0ZShvKXx8dCYmMSE9bnx8KG8uY2hpbGROb2Rlc1tsXS5odG1sTm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUuc3R5bGUuZGlzcGxheT0iIiksMT09by5jaGlsZE5vZGVzW2xdLm9wZW5NZSYmKHRoaXMuX29wZW5JdGVtKG8uY2hpbGROb2Rlc1tsXSksby5jaGlsZE5vZGVzW2xdLm9wZW5NZT0wKSxlLl9yZWRyYXdGcm9tKGUsby5jaGlsZE5vZGVzW2xdKSxudWxsIT10aGlzLmNoaWxkQ2FsYyl7aWYoKG8uY2hpbGROb2Rlc1tsXS51blBhcnNlZHx8IW8uY2hpbGROb2Rlc1tsXS5YTUxsb2FkJiZ0aGlzLlhNTHNvdXJjZSkmJihvLmNoaWxkTm9kZXNbbF0uc3Bhbi5pbm5lckhUTUw9by5jaGlsZE5vZGVzW2xdLl9hY2M/by5jaGlsZE5vZGVzW2xdLmxhYmVsK3RoaXMuaHRtbGNBK28uY2hpbGROb2Rlc1tsXS5fYWNjK3RoaXMuaHRtbGNCOm8uY2hpbGROb2Rlc1tsXS5sYWJlbCksby5jaGlsZE5vZGVzW2xdLmNoaWxkTm9kZXMubGVuZ3RoJiZ0aGlzLmNoaWxkQ2FsYyl7aWYoMT09dGhpcy5jaGlsZENhbGMmJihvLmNoaWxkTm9kZXNbbF0uc3Bhbi5pbm5lckhUTUw9by5jaGlsZE5vZGVzW2xdLmxhYmVsK3RoaXMuaHRtbGNBK28uY2hpbGROb2Rlc1tsXS5jaGlsZHNDb3VudCt0aGlzLmh0bWxjQiksMj09dGhpcy5jaGlsZENhbGMpe3ZhciBzPW8uY2hpbGROb2Rlc1tsXS5jaGlsZHNDb3VudC0oby5jaGlsZE5vZGVzW2xdLnB1cmVDaGlsZHN8fDApO3MmJihvLmNoaWxkTm9kZXNbbF0uc3Bhbi5pbm5lckhUTUw9by5jaGlsZE5vZGVzW2xdLmxhYmVsK3RoaXMuaHRtbGNBK3MrdGhpcy5odG1sY0IpLG8ucHVyZUNoaWxkcz9vLnB1cmVDaGlsZHMrKzpvLnB1cmVDaGlsZHM9MX1pZigzPT10aGlzLmNoaWxkQ2FsYyYmKG8uY2hpbGROb2Rlc1tsXS5zcGFuLmlubmVySFRNTD1vLmNoaWxkTm9kZXNbbF0ubGFiZWwrdGhpcy5odG1sY0Erby5jaGlsZE5vZGVzW2xdLl9hY2MrdGhpcy5odG1sY0IpLDQ9PXRoaXMuY2hpbGRDYWxjKXt2YXIgcz1vLmNoaWxkTm9kZXNbbF0uX2FjYztzJiYoby5jaGlsZE5vZGVzW2xdLnNwYW4uaW5uZXJIVE1MPW8uY2hpbGROb2Rlc1tsXS5sYWJlbCt0aGlzLmh0bWxjQStzK3RoaXMuaHRtbGNCKX19ZWxzZSA0PT10aGlzLmNoaWxkQ2FsYyYmcisrO3IrPW8uY2hpbGROb2Rlc1tsXS5fYWNjLDM9PXRoaXMuY2hpbGRDYWxjJiZyKyt9by51blBhcnNlZHx8IW8uWE1MbG9hZCYmdGhpcy5YTUxzb3VyY2V8fChvLl9hY2M9ciksZS5fY29ycmVjdExpbmUobyksZS5fY29ycmVjdFBsdXMobyksdGhpcy5jaGlsZENhbGMmJiF0JiZlLl9maXhDaGlsZENvdW50TGFiZWwobyl9LGRodG1sWFRyZWVPYmplY3QucHJvdG90eXBlLl9jcmVhdGVTZWxmPWZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV0dXJuIGUuY2xhc3NOYW1lPSJjb250YWluZXJUYWJsZVN0eWxlIixlLnN0eWxlLndpZHRoPXRoaXMud2lkdGgsZS5zdHlsZS5oZWlnaHQ9dGhpcy5oZWlnaHQsdGhpcy5wYXJlbnRPYmplY3QuYXBwZW5kQ2hpbGQoZSksZX0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUuX3hjbG9zZUFsbD1mdW5jdGlvbihlKXtpZighZS51blBhcnNlZCl7aWYodGhpcy5yb290SWQhPWUuaWQpe2lmKCFlLmh0bWxOb2RlKXJldHVybjtmb3IodmFyIHQ9ZS5odG1sTm9kZS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXMsaT10Lmxlbmd0aCxuPTE7aT5uO24rKyl0W25dLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuX2NvcnJlY3RQbHVzKGUpfWZvcih2YXIgbj0wO248ZS5jaGlsZHNDb3VudDtuKyspZS5jaGlsZE5vZGVzW25dLmNoaWxkc0NvdW50JiZ0aGlzLl94Y2xvc2VBbGwoZS5jaGlsZE5vZGVzW25dKX19LGRodG1sWFRyZWVPYmplY3QucHJvdG90eXBlLl94b3BlbkFsbD1mdW5jdGlvbihlKXt0aGlzLl9IaWRlU2hvdyhlLDIpO2Zvcih2YXIgdD0wO3Q8ZS5jaGlsZHNDb3VudDt0KyspdGhpcy5feG9wZW5BbGwoZS5jaGlsZE5vZGVzW3RdKX0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUuX2NvcnJlY3RQbHVzPWZ1bmN0aW9uKGUpe2lmKGUuaHRtbE5vZGUpe3ZhciB0PWUuaHRtbE5vZGUuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0ubGFzdENoaWxkLGk9ZS5odG1sTm9kZS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1syXS5jaGlsZE5vZGVzWzBdLG49dGhpcy5saW5lQXJyYXk7aWYodGhpcy5YTUxzb3VyY2UmJiFlLlhNTGxvYWQpe3ZhciBuPXRoaXMucGx1c0FycmF5O2lmKHRoaXMuX3NldFNyYyhpLHRoaXMuaWNvblVSTCtlLmltYWdlc1syXSksdGhpcy5fdHh0aW1nKXJldHVybiB0LmlubmVySFRNTD0iWytdIn1lbHNlIGlmKGUuY2hpbGRzQ291bnR8fGUudW5QYXJzZWQpaWYoZS5odG1sTm9kZS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV0mJiJub25lIiE9ZS5odG1sTm9kZS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV0uc3R5bGUuZGlzcGxheSl7aWYoIWUud3NpZ24pdmFyIG49dGhpcy5taW51c0FycmF5O2lmKHRoaXMuX3NldFNyYyhpLHRoaXMuaWNvblVSTCtlLmltYWdlc1sxXSksdGhpcy5fdHh0aW1nKXJldHVybiB0LmlubmVySFRNTD0iWy1dIn1lbHNle2lmKCFlLndzaWduKXZhciBuPXRoaXMucGx1c0FycmF5O2lmKHRoaXMuX3NldFNyYyhpLHRoaXMuaWNvblVSTCtlLmltYWdlc1syXSksdGhpcy5fdHh0aW1nKXJldHVybiB0LmlubmVySFRNTD0iWytdIn1lbHNlIHRoaXMuX3NldFNyYyhpLHRoaXMuaWNvblVSTCtlLmltYWdlc1swXSk7dmFyIG89MjtlLnRyZWVOb2QudHJlZUxpbmVzT24/KGUucGFyZW50T2JqZWN0JiYobz10aGlzLl9nZXRDb3VudFN0YXR1cyhlLmlkLGUucGFyZW50T2JqZWN0KSksdGhpcy5fc2V0U3JjKHQsdGhpcy5pbVBhdGgrbltvXSkpOnRoaXMuX3NldFNyYyh0LHRoaXMuaW1QYXRoK25bM10pfX0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUuX2NvcnJlY3RMaW5lPWZ1bmN0aW9uKGUpe2lmKGUuaHRtbE5vZGUpe3ZhciB0PWUucGFyZW50T2JqZWN0O2lmKHQpaWYoMCE9dGhpcy5fZ2V0TGluZVN0YXR1cyhlLmlkLHQpJiZ0aGlzLnRyZWVMaW5lc09uKWZvcih2YXIgaT0xO2k8PWUuY2hpbGRzQ291bnQmJmUuaHRtbE5vZGUuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzW2ldO2krKyllLmh0bWxOb2RlLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1tpXS5jaGlsZE5vZGVzWzBdLnN0eWxlLmJhY2tncm91bmRJbWFnZT0idXJsKCIrdGhpcy5pbVBhdGgrdGhpcy5saW5lQXJyYXlbNV0rIikiLGUuaHRtbE5vZGUuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzW2ldLmNoaWxkTm9kZXNbMF0uc3R5bGUuYmFja2dyb3VuZFJlcGVhdD0icmVwZWF0LXkiO2Vsc2UgZm9yKHZhciBpPTE7aTw9ZS5jaGlsZHNDb3VudCYmZS5odG1sTm9kZS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbaV07aSsrKWUuaHRtbE5vZGUuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzW2ldLmNoaWxkTm9kZXNbMF0uc3R5bGUuYmFja2dyb3VuZEltYWdlPSIiLGUuaHRtbE5vZGUuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzW2ldLmNoaWxkTm9kZXNbMF0uc3R5bGUuYmFja2dyb3VuZFJlcGVhdD0iIn19LGRodG1sWFRyZWVPYmplY3QucHJvdG90eXBlLl9nZXRMaW5lU3RhdHVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuY2hpbGROb2Rlc1t0LmNoaWxkc0NvdW50LTFdLmlkPT1lPzA6MX0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUuX0hpZGVTaG93PWZ1bmN0aW9uKGUsdCl7aWYoIXRoaXMuX2xvY2tlcnx8dGhpcy5za2lwTG9ja3x8IXRoaXMuX2xvY2tlcltlLmlkXSl7aWYodGhpcy5YTUxzb3VyY2UmJiFlLlhNTGxvYWQpe2lmKDE9PXQpcmV0dXJuO3JldHVybiBlLlhNTGxvYWQ9MSx0aGlzLl9sb2FkRHluWE1MKGUuaWQpLHZvaWQgMH1lLnVuUGFyc2VkJiZ0aGlzLnJlUGFyc2UoZSk7dmFyIGk9ZS5odG1sTm9kZS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXMsbj1pLmxlbmd0aDtpZihuPjEpeyJub25lIj09aVsxXS5zdHlsZS5kaXNwbGF5JiYxIT10fHwyPT10P25vZGVzdHlsZT0iIjoodGhpcy5hbGxUcmVlLmNoaWxkTm9kZXNbMF0uYm9yZGVyPSIxIix0aGlzLmFsbFRyZWUuY2hpbGROb2Rlc1swXS5ib3JkZXI9IjAiLG5vZGVzdHlsZT0ibm9uZSIpO2Zvcih2YXIgbz0xO24+bztvKyspaVtvXS5zdHlsZS5kaXNwbGF5PW5vZGVzdHlsZX10aGlzLl9jb3JyZWN0UGx1cyhlKX19LGRodG1sWFRyZWVPYmplY3QucHJvdG90eXBlLl9nZXRPcGVuU3RhdGU9ZnVuY3Rpb24oZSl7aWYoIWUuaHRtbE5vZGUpcmV0dXJuIDA7dmFyIHQ9ZS5odG1sTm9kZS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXM7cmV0dXJuIHQubGVuZ3RoPD0xPzA6Im5vbmUiIT10WzFdLnN0eWxlLmRpc3BsYXk/MTotMX0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUub25Sb3dDbGljazI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnBhcmVudE9iamVjdC50cmVlTm9kO3JldHVybiBlLmNhbGxFdmVudCgib25EYmxDbGljayIsW3RoaXMucGFyZW50T2JqZWN0LmlkLGVdKT8odGhpcy5wYXJlbnRPYmplY3QuY2xvc2VibGUmJiIwIiE9dGhpcy5wYXJlbnRPYmplY3QuY2xvc2VibGU/ZS5fSGlkZVNob3codGhpcy5wYXJlbnRPYmplY3QpOmUuX0hpZGVTaG93KHRoaXMucGFyZW50T2JqZWN0LDIpLGUuY2hlY2tFdmVudCgib25PcGVuRW5kIikmJihlLnhtbHN0YXRlPyhlLl9vaWVfb25YTEUucHVzaChlLm9uWExFKSxlLm9uWExFPWUuX2VwbkZIZSk6ZS5jYWxsRXZlbnQoIm9uT3BlbkVuZCIsW3RoaXMucGFyZW50T2JqZWN0LmlkLGUuX2dldE9wZW5TdGF0ZSh0aGlzLnBhcmVudE9iamVjdCldKSksITEpOiExfSxkaHRtbFhUcmVlT2JqZWN0LnByb3RvdHlwZS5vblJvd0NsaWNrPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wYXJlbnRPYmplY3QudHJlZU5vZDtyZXR1cm4gZS5jYWxsRXZlbnQoIm9uT3BlblN0YXJ0IixbdGhpcy5wYXJlbnRPYmplY3QuaWQsZS5fZ2V0T3BlblN0YXRlKHRoaXMucGFyZW50T2JqZWN0KV0pPyh0aGlzLnBhcmVudE9iamVjdC5jbG9zZWJsZSYmIjAiIT10aGlzLnBhcmVudE9iamVjdC5jbG9zZWJsZT9lLl9IaWRlU2hvdyh0aGlzLnBhcmVudE9iamVjdCk6ZS5fSGlkZVNob3codGhpcy5wYXJlbnRPYmplY3QsMiksZS5jaGVja0V2ZW50KCJvbk9wZW5FbmQiKSYmKGUueG1sc3RhdGU/KGUuX29pZV9vblhMRS5wdXNoKGUub25YTEUpLGUub25YTEU9ZS5fZXBuRkhlKTplLmNhbGxFdmVudCgib25PcGVuRW5kIixbdGhpcy5wYXJlbnRPYmplY3QuaWQsZS5fZ2V0T3BlblN0YXRlKHRoaXMucGFyZW50T2JqZWN0KV0pKSx2b2lkIDApOjB9LGRodG1sWFRyZWVPYmplY3QucHJvdG90eXBlLmdldFNlbGVjdGVkSXRlbUlkPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPW5ldyBBcnJheSx0PTA7dDx0aGlzLl9zZWxlY3RlZC5sZW5ndGg7dCsrKWVbdF09dGhpcy5fc2VsZWN0ZWRbdF0uaWQ7cmV0dXJuIGUuam9pbih0aGlzLmRsbXRyKX0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUuX3NlbGVjdEl0ZW09ZnVuY3Rpb24oZSx0KXtpZih0aGlzLmNoZWNrRXZlbnQoIm9uU2VsZWN0IikmJih0aGlzLl9vblNTQ0ZvbGQ9dGhpcy5nZXRTZWxlY3RlZEl0ZW1JZCgpKSx0aGlzLl9hbXNlbCYmdCYmKHQuY3RybEtleXx8dC5tZXRhS2V5fHx0LnNoaWZ0S2V5KXx8dGhpcy5fdW5zZWxlY3RJdGVtcygpLGUuaV9zZWwmJnRoaXMuX2Ftc2VsJiZ0JiYodC5jdHJsS2V5fHx0Lm1ldGFLZXkpKXRoaXMuX3Vuc2VsZWN0SXRlbShlKTtlbHNlIGlmKCEoZS5pX3NlbHx8dGhpcy5fYW1zZWxTJiYwIT10aGlzLl9zZWxlY3RlZC5sZW5ndGgmJnRoaXMuX3NlbGVjdGVkWzBdLnBhcmVudE9iamVjdCE9ZS5wYXJlbnRPYmplY3QpKWlmKHRoaXMuX2Ftc2VsJiZ0JiZ0LnNoaWZ0S2V5JiYwIT10aGlzLl9zZWxlY3RlZC5sZW5ndGgmJnRoaXMuX3NlbGVjdGVkW3RoaXMuX3NlbGVjdGVkLmxlbmd0aC0xXS5wYXJlbnRPYmplY3Q9PWUucGFyZW50T2JqZWN0KXt2YXIgaT10aGlzLl9nZXRJbmRleCh0aGlzLl9zZWxlY3RlZFt0aGlzLl9zZWxlY3RlZC5sZW5ndGgtMV0pLG49dGhpcy5fZ2V0SW5kZXgoZSk7aWYoaT5uKXt2YXIgbz1pO2k9bixuPW99Zm9yKHZhciByPWk7bj49cjtyKyspZS5wYXJlbnRPYmplY3QuY2hpbGROb2Rlc1tyXS5pX3NlbHx8dGhpcy5fbWFya0l0ZW0oZS5wYXJlbnRPYmplY3QuY2hpbGROb2Rlc1tyXSl9ZWxzZSB0aGlzLl9tYXJrSXRlbShlKTtpZih0aGlzLmNoZWNrRXZlbnQoIm9uU2VsZWN0Iikpe3ZhciBsPXRoaXMuZ2V0U2VsZWN0ZWRJdGVtSWQoKTtsIT10aGlzLl9vblNTQ0ZvbGQmJnRoaXMuY2FsbEV2ZW50KCJvblNlbGVjdCIsW2xdKX19LGRodG1sWFRyZWVPYmplY3QucHJvdG90eXBlLl9tYXJrSXRlbT1mdW5jdGlvbihlKXtlLnNjb2xvciYmKGUuc3Bhbi5zdHlsZS5jb2xvcj1lLnNjb2xvciksZS5zcGFuLmNsYXNzTmFtZT0ic2VsZWN0ZWRUcmVlUm93IixlLnNwYW4ucGFyZW50Tm9kZS5wYXJlbnROb2RlLmNsYXNzTmFtZT0ic2VsZWN0ZWRUcmVlUm93RnVsbCIsZS5pX3NlbD0hMCx0aGlzLl9zZWxlY3RlZFt0aGlzLl9zZWxlY3RlZC5sZW5ndGhdPWV9LGRodG1sWFRyZWVPYmplY3QucHJvdG90eXBlLmdldEluZGV4QnlJZD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nbG9iYWxJZFN0b3JhZ2VGaW5kKGUpO3JldHVybiB0P3RoaXMuX2dldEluZGV4KHQpOm51bGx9LGRodG1sWFRyZWVPYmplY3QucHJvdG90eXBlLl9nZXRJbmRleD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5wYXJlbnRPYmplY3QsaT0wO2k8dC5jaGlsZHNDb3VudDtpKyspaWYodC5jaGlsZE5vZGVzW2ldPT1lKXJldHVybiBpfSxkaHRtbFhUcmVlT2JqZWN0LnByb3RvdHlwZS5fdW5zZWxlY3RJdGVtPWZ1bmN0aW9uKGUpe2lmKGUmJmUuaV9zZWwpe2Uuc3Bhbi5jbGFzc05hbWU9InN0YW5kYXJ0VHJlZVJvdyIsZS5zcGFuLnBhcmVudE5vZGUucGFyZW50Tm9kZS5jbGFzc05hbWU9IiIsZS5hY29sb3ImJihlLnNwYW4uc3R5bGUuY29sb3I9ZS5hY29sb3IpLGUuaV9zZWw9ITE7Zm9yKHZhciB0PTA7dDx0aGlzLl9zZWxlY3RlZC5sZW5ndGg7dCsrKWlmKCF0aGlzLl9zZWxlY3RlZFt0XS5pX3NlbCl7dGhpcy5fc2VsZWN0ZWQuc3BsaWNlKHQsMSk7YnJlYWt9fX0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUuX3Vuc2VsZWN0SXRlbXM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHRoaXMuX3NlbGVjdGVkLmxlbmd0aDtlKyspe3ZhciB0PXRoaXMuX3NlbGVjdGVkW2VdO3Quc3Bhbi5jbGFzc05hbWU9InN0YW5kYXJ0VHJlZVJvdyIsdC5zcGFuLnBhcmVudE5vZGUucGFyZW50Tm9kZS5jbGFzc05hbWU9IiIsdC5hY29sb3ImJih0LnNwYW4uc3R5bGUuY29sb3I9dC5hY29sb3IpLHQuaV9zZWw9ITF9dGhpcy5fc2VsZWN0ZWQ9bmV3IEFycmF5fSxkaHRtbFhUcmVlT2JqZWN0LnByb3RvdHlwZS5vblJvd1NlbGVjdD1mdW5jdGlvbihlLHQsaSl7ZT1lfHx3aW5kb3cuZXZlbnQ7dmFyIG49dGhpcy5wYXJlbnRPYmplY3Q7dCYmKG49dC5wYXJlbnRPYmplY3QpO3ZhciBvPW4udHJlZU5vZCxyPW8uZ2V0U2VsZWN0ZWRJdGVtSWQoKTtlJiZlLnNraXBVblNlbHx8by5fc2VsZWN0SXRlbShuLGUpLGl8fChuLmFjdGlvbkhhbmRsZXI/bi5hY3Rpb25IYW5kbGVyKG4uaWQscik6by5jYWxsRXZlbnQoIm9uQ2xpY2siLFtuLmlkLHJdKSl9LGRodG1sWFRyZWVPYmplY3QucHJvdG90eXBlLl9jcmVhdGVJdGVtPWZ1bmN0aW9uKGUsdCxpKXt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpO24uY2VsbFNwYWNpbmc9MCxuLmNlbGxQYWRkaW5nPTAsbi5ib3JkZXI9MCx0aGlzLmhmTW9kZSYmKG4uc3R5bGUudGFibGVMYXlvdXQ9ImZpeGVkIiksbi5zdHlsZS5tYXJnaW49MCxuLnN0eWxlLnBhZGRpbmc9MDt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpLHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKSxsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7aWYobC5jbGFzc05hbWU9InN0YW5kYXJ0VHJlZUltYWdlIix0aGlzLl90eHRpbWcpe3ZhciBzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2wuYXBwZW5kQ2hpbGQocykscy5jbGFzc05hbWU9ImRoeF90cmVlX3RleHRTaWduIn1lbHNle3ZhciBzPXRoaXMuX2dldEltZyh0LmlkKTtzLmJvcmRlcj0iMCIsIklNRyI9PXMudGFnTmFtZSYmKHMuYWxpZ249ImFic21pZGRsZSIpLGwuYXBwZW5kQ2hpbGQocykscy5zdHlsZS5wYWRkaW5nPTAscy5zdHlsZS5tYXJnaW49MCxzLnN0eWxlLndpZHRoPXRoaXMuZGVmX2xpbmVfaW1nX3h9dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKSxkPXRoaXMuX2dldEltZyh0aGlzLmNCUk9mP3RoaXMucm9vdElkOnQuaWQpO2QuY2hlY2tlZD0wLHRoaXMuX3NldFNyYyhkLHRoaXMuaW1QYXRoK3RoaXMuY2hlY2tBcnJheVswXSksZC5zdHlsZS53aWR0aD0iMThweCIsZC5zdHlsZS5oZWlnaHQ9IjE4cHgiLGV8fChhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhLmFwcGVuZENoaWxkKGQpLHRoaXMuY0JST2Z8fCJJTUciIT1kLnRhZ05hbWV8fChkLmFsaWduPSJhYnNtaWRkbGUiKSxkLm9uY2xpY2s9dGhpcy5vbkNoZWNrQm94Q2xpY2ssZC50cmVlTm9kPXRoaXMsZC5wYXJlbnRPYmplY3Q9dCxhLndpZHRoPXdpbmRvdy5fS0hUTUxydj8iMTZweCI6IjIwcHgiO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7aC5jbGFzc05hbWU9InN0YW5kYXJ0VHJlZUltYWdlIjt2YXIgYz10aGlzLl9nZXRJbWcodGhpcy50aW1nZW4/dC5pZDp0aGlzLnJvb3RJZCk7Yy5vbm1vdXNlZG93bj10aGlzLl9wcmV2ZW50TnNEcmFnLGMub25kcmFnc3RhcnQ9dGhpcy5fcHJldmVudE5zRHJhZyxjLmJvcmRlcj0iMCIsdGhpcy5fYWltZ3MmJihjLnBhcmVudE9iamVjdD10LCJJTUciPT1jLnRhZ05hbWUmJihjLmFsaWduPSJhYnNtaWRkbGUiKSxjLm9uY2xpY2s9dGhpcy5vblJvd1NlbGVjdCksaXx8dGhpcy5fc2V0U3JjKGMsdGhpcy5pY29uVVJMK3RoaXMuaW1hZ2VBcnJheVswXSksaC5hcHBlbmRDaGlsZChjKSxjLnN0eWxlLnBhZGRpbmc9MCxjLnN0eWxlLm1hcmdpbj0wLHRoaXMudGltZ2VuPyhoLnN0eWxlLndpZHRoPWMuc3R5bGUud2lkdGg9dGhpcy5kZWZfaW1nX3gsYy5zdHlsZS5oZWlnaHQ9dGhpcy5kZWZfaW1nX3kpOihjLnN0eWxlLndpZHRoPSIwcHgiLGMuc3R5bGUuaGVpZ2h0PSIwcHgiLChfaXNPcGVyYXx8d2luZG93Ll9LSFRNTHJ2KSYmKGguc3R5bGUuZGlzcGxheT0ibm9uZSIpKTsKdmFyIHU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtyZXR1cm4gdS5jbGFzc05hbWU9ImRoeFRleHRDZWxsIHN0YW5kYXJ0VHJlZVJvdyIsdC5zcGFuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKSx0LnNwYW4uY2xhc3NOYW1lPSJzdGFuZGFydFRyZWVSb3ciLHRoaXMubWxpdGVtcz8odC5zcGFuLnN0eWxlLndpZHRoPXRoaXMubWxpdGVtcyx0LnNwYW4uc3R5bGUuZGlzcGxheT0iYmxvY2siKTp1Lm5vV3JhcD0hMCxkaHg0LmlzSUU4P3Uuc3R5bGUud2lkdGg9Ijk5OTk5cHgiOndpbmRvdy5fS0hUTUxydnx8KHUuc3R5bGUud2lkdGg9IjEwMCUiKSx0LnNwYW4uaW5uZXJIVE1MPXQubGFiZWwsdS5hcHBlbmRDaGlsZCh0LnNwYW4pLHUucGFyZW50T2JqZWN0PXQsbC5wYXJlbnRPYmplY3Q9dCx1Lm9uY2xpY2s9dGhpcy5vblJvd1NlbGVjdCxsLm9uY2xpY2s9dGhpcy5vblJvd0NsaWNrLHUub25kYmxjbGljaz10aGlzLm9uUm93Q2xpY2syLHRoaXMuZXR0aXAmJihyLnRpdGxlPXQubGFiZWwpLHRoaXMuZHJhZ0FuZERyb3BPZmYmJih0aGlzLl9haW1ncyYmKHRoaXMuZHJhZ2dlci5hZGREcmFnZ2FibGVJdGVtKGgsdGhpcyksaC5wYXJlbnRPYmplY3Q9dCksdGhpcy5kcmFnZ2VyLmFkZERyYWdnYWJsZUl0ZW0odSx0aGlzKSksdC5zcGFuLnN0eWxlLnBhZGRpbmdMZWZ0PSI1cHgiLHQuc3Bhbi5zdHlsZS5wYWRkaW5nUmlnaHQ9IjVweCIsdS5zdHlsZS52ZXJ0aWNhbEFsaWduPSIiLHUuc3R5bGUuZm9udFNpemU9IjEwcHQiLHUuc3R5bGUuY3Vyc29yPXRoaXMuc3R5bGVfcG9pbnRlcixyLmFwcGVuZENoaWxkKGwpLHIuYXBwZW5kQ2hpbGQoYSksci5hcHBlbmRDaGlsZChoKSxyLmFwcGVuZENoaWxkKHUpLG8uYXBwZW5kQ2hpbGQociksbi5hcHBlbmRDaGlsZChvKSwodGhpcy5laGx0fHx0aGlzLmNoZWNrRXZlbnQoIm9uTW91c2VJbiIpfHx0aGlzLmNoZWNrRXZlbnQoIm9uTW91c2VPdXQiKSkmJihyLm9ubW91c2Vtb3ZlPXRoaXMuX2l0ZW1Nb3VzZUluLHJbX2lzSUU/Im9ubW91c2VsZWF2ZSI6Im9ubW91c2VvdXQiXT10aGlzLl9pdGVtTW91c2VPdXQpLG59LGRodG1sWFRyZWVPYmplY3QucHJvdG90eXBlLnNldE9uUmlnaHRDbGlja0hhbmRsZXI9ZnVuY3Rpb24oZSl7dGhpcy5hdHRhY2hFdmVudCgib25SaWdodENsaWNrIixlKX0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUuc2V0T25DbGlja0hhbmRsZXI9ZnVuY3Rpb24oZSl7dGhpcy5hdHRhY2hFdmVudCgib25DbGljayIsZSl9LGRodG1sWFRyZWVPYmplY3QucHJvdG90eXBlLnNldE9uU2VsZWN0U3RhdGVDaGFuZ2U9ZnVuY3Rpb24oZSl7dGhpcy5hdHRhY2hFdmVudCgib25TZWxlY3QiLGUpfSxkaHRtbFhUcmVlT2JqZWN0LnByb3RvdHlwZS5zZXRYTUxBdXRvTG9hZGluZz1mdW5jdGlvbihlKXt0aGlzLlhNTHNvdXJjZT1lfSxkaHRtbFhUcmVlT2JqZWN0LnByb3RvdHlwZS5zZXRPbkNoZWNrSGFuZGxlcj1mdW5jdGlvbihlKXt0aGlzLmF0dGFjaEV2ZW50KCJvbkNoZWNrIixlKX0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUuc2V0T25PcGVuSGFuZGxlcj1mdW5jdGlvbihlKXt0aGlzLmF0dGFjaEV2ZW50KCJvbk9wZW5TdGFydCIsZSl9LGRodG1sWFRyZWVPYmplY3QucHJvdG90eXBlLnNldE9uT3BlblN0YXJ0SGFuZGxlcj1mdW5jdGlvbihlKXt0aGlzLmF0dGFjaEV2ZW50KCJvbk9wZW5TdGFydCIsZSl9LGRodG1sWFRyZWVPYmplY3QucHJvdG90eXBlLnNldE9uT3BlbkVuZEhhbmRsZXI9ZnVuY3Rpb24oZSl7dGhpcy5hdHRhY2hFdmVudCgib25PcGVuRW5kIixlKX0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUuc2V0T25EYmxDbGlja0hhbmRsZXI9ZnVuY3Rpb24oZSl7dGhpcy5hdHRhY2hFdmVudCgib25EYmxDbGljayIsZSl9LGRodG1sWFRyZWVPYmplY3QucHJvdG90eXBlLm9wZW5BbGxJdGVtcz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nbG9iYWxJZFN0b3JhZ2VGaW5kKGUpO3JldHVybiB0Pyh0aGlzLl94b3BlbkFsbCh0KSx2b2lkIDApOjB9LGRodG1sWFRyZWVPYmplY3QucHJvdG90eXBlLmdldE9wZW5TdGF0ZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nbG9iYWxJZFN0b3JhZ2VGaW5kKGUpO3JldHVybiB0P3RoaXMuX2dldE9wZW5TdGF0ZSh0KToiIn0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUuY2xvc2VBbGxJdGVtcz1mdW5jdGlvbihlKXtlPT09d2luZG93LnVuZGVmaW5lZCYmKGU9dGhpcy5yb290SWQpO3ZhciB0PXRoaXMuX2dsb2JhbElkU3RvcmFnZUZpbmQoZSk7cmV0dXJuIHQ/KHRoaXMuX3hjbG9zZUFsbCh0KSx0aGlzLmFsbFRyZWUuY2hpbGROb2Rlc1swXS5ib3JkZXI9IjEiLHRoaXMuYWxsVHJlZS5jaGlsZE5vZGVzWzBdLmJvcmRlcj0iMCIsdm9pZCAwKTowfSxkaHRtbFhUcmVlT2JqZWN0LnByb3RvdHlwZS5zZXRVc2VyRGF0YT1mdW5jdGlvbihlLHQsaSl7dmFyIG49dGhpcy5fZ2xvYmFsSWRTdG9yYWdlRmluZChlLDAsITApO24mJigiaGludCI9PXQmJihuLmh0bWxOb2RlLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS50aXRsZT1pKSwidW5kZWZpbmVkIj09dHlwZW9mIG4udXNlckRhdGFbInRfIit0XSYmKG4uX3VzZXJkYXRhbGlzdD9uLl91c2VyZGF0YWxpc3QrPSIsIit0Om4uX3VzZXJkYXRhbGlzdD10KSxuLnVzZXJEYXRhWyJ0XyIrdF09aSl9LGRodG1sWFRyZWVPYmplY3QucHJvdG90eXBlLmdldFVzZXJEYXRhPWZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcy5fZ2xvYmFsSWRTdG9yYWdlRmluZChlLDAsITApO2lmKGkpcmV0dXJuIGkudXNlckRhdGFbInRfIit0XX0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUuZ2V0SXRlbUNvbG9yPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2dsb2JhbElkU3RvcmFnZUZpbmQoZSk7aWYoIXQpcmV0dXJuIDA7dmFyIGk9bmV3IE9iamVjdDtyZXR1cm4gdC5hY29sb3ImJihpLmFjb2xvcj10LmFjb2xvciksdC5zY29sb3ImJihpLnNjb2xvcj10LnNjb2xvciksaX0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUuc2V0SXRlbUNvbG9yPWZ1bmN0aW9uKGUsdCxpKXtpZihlJiZlLnNwYW4pdmFyIG49ZTtlbHNlIHZhciBuPXRoaXMuX2dsb2JhbElkU3RvcmFnZUZpbmQoZSk7cmV0dXJuIG4/KG4uaV9zZWw/KGl8fHQpJiYobi5zcGFuLnN0eWxlLmNvbG9yPWl8fHQpOnQmJihuLnNwYW4uc3R5bGUuY29sb3I9dCksaSYmKG4uc2NvbG9yPWkpLHQmJihuLmFjb2xvcj10KSx2b2lkIDApOjB9LGRodG1sWFRyZWVPYmplY3QucHJvdG90eXBlLnNldE9uTW91c2VJbkhhbmRsZXI9ZnVuY3Rpb24oZSl7dGhpcy5laGx0PSEwLHRoaXMuYXR0YWNoRXZlbnQoIm9uTW91c2VJbiIsZSl9LGRodG1sWFRyZWVPYmplY3QucHJvdG90eXBlLnNldE9uTW91c2VPdXRIYW5kbGVyPWZ1bmN0aW9uKGUpe3RoaXMuZWhsdD0hMCx0aGlzLmF0dGFjaEV2ZW50KCJvbk1vdXNlT3V0IixlKX0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUuZW5hYmxlVHJlZUxpbmVzPWZ1bmN0aW9uKGUpe3RoaXMudHJlZUxpbmVzT249ZGh4NC5zMmIoZSl9LGRodG1sWFRyZWVPYmplY3QucHJvdG90eXBlLm9wZW5JdGVtPWZ1bmN0aW9uKGUpe3RoaXMuc2tpcExvY2s9ITA7dmFyIHQ9dGhpcy5fZ2xvYmFsSWRTdG9yYWdlRmluZChlKTtyZXR1cm4gdD90aGlzLl9vcGVuSXRlbSh0KTowfSxkaHRtbFhUcmVlT2JqZWN0LnByb3RvdHlwZS5fb3Blbkl0ZW09ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZ2V0T3BlblN0YXRlKGUpO2lmKDA+dHx8dGhpcy5YTUxzb3VyY2UmJiFlLlhNTGxvYWQpe2lmKCF0aGlzLmNhbGxFdmVudCgib25PcGVuU3RhcnQiLFtlLmlkLHRdKSlyZXR1cm4gMDt0aGlzLl9IaWRlU2hvdyhlLDIpLHRoaXMuY2hlY2tFdmVudCgib25PcGVuRW5kIikmJih0aGlzLm9uWExFPT10aGlzLl9lcG5GSGUmJnRoaXMuX2VwbkZIZSh0aGlzLGUuaWQsITApLHRoaXMueG1sc3RhdGUmJnRoaXMuWE1Mc291cmNlPyh0aGlzLl9vaWVfb25YTEUucHVzaCh0aGlzLm9uWExFKSx0aGlzLm9uWExFPXRoaXMuX2VwbkZIZSk6dGhpcy5jYWxsRXZlbnQoIm9uT3BlbkVuZCIsW2UuaWQsdGhpcy5fZ2V0T3BlblN0YXRlKGUpXSkpfWVsc2UgdGhpcy5fc3JuZCYmdGhpcy5fSGlkZVNob3coZSwyKTtlLnBhcmVudE9iamVjdCYmIXRoaXMuX3NraXBfb3Blbl9wYXJlbnQmJnRoaXMuX29wZW5JdGVtKGUucGFyZW50T2JqZWN0KX0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUuX2dldEFsbEZhdEl0ZW1zPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0iIixpPTA7aTxlLmNoaWxkc0NvdW50O2krKylpZihlLmNoaWxkTm9kZXNbaV0udW5QYXJzZWR8fGUuY2hpbGROb2Rlc1tpXS5jaGlsZHNDb3VudD4wKXtpZih0P3QrPXRoaXMuZGxtdHIrZS5jaGlsZE5vZGVzW2ldLmlkOnQ9IiIrZS5jaGlsZE5vZGVzW2ldLmlkLGUuY2hpbGROb2Rlc1tpXS51blBhcnNlZCl2YXIgbj10aGlzLl9nZXRBbGxGYXRJdGVtc1hNTChlLmNoaWxkTm9kZXNbaV0udW5QYXJzZWQsMSk7ZWxzZSB2YXIgbj10aGlzLl9nZXRBbGxGYXRJdGVtcyhlLmNoaWxkTm9kZXNbaV0pO24mJih0Kz10aGlzLmRsbXRyK24pfXJldHVybiB0fSxkaHRtbFhUcmVlT2JqZWN0LnByb3RvdHlwZS5zZWxlY3RJdGVtPWZ1bmN0aW9uKGUsdCxpKXt0PWRoeDQuczJiKHQpO3ZhciBuPXRoaXMuX2dsb2JhbElkU3RvcmFnZUZpbmQoZSk7aWYoIW58fCFuLnBhcmVudE9iamVjdClyZXR1cm4gMDt0aGlzLlhNTGxvYWRpbmdXYXJuaW5nP24ucGFyZW50T2JqZWN0Lm9wZW5NZT0xOnRoaXMuX29wZW5JdGVtKG4ucGFyZW50T2JqZWN0KTt2YXIgbz1udWxsO2kmJihvPW5ldyBPYmplY3Qsby5jdHJsS2V5PSEwLG4uaV9zZWwmJihvLnNraXBVblNlbD0hMCkpLHQ/dGhpcy5vblJvd1NlbGVjdChvLG4uaHRtbE5vZGUuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbM10sITEpOnRoaXMub25Sb3dTZWxlY3QobyxuLmh0bWxOb2RlLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzNdLCEwKX0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUuX2NvbXByZXNzQ2hpbGRMaXN0PWZ1bmN0aW9uKGUsdCl7ZS0tO2Zvcih2YXIgaT0wO2U+aTtpKyspMD09dFtpXSYmKHRbaV09dFtpKzFdLHRbaSsxXT0wKX0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUuX2RlbGV0ZU5vZGU9ZnVuY3Rpb24oZSx0LGkpe2lmKCF0fHwhdC5wYXJlbnRPYmplY3QpcmV0dXJuIDA7dmFyIG49MCxvPTA7dC50ci5uZXh0U2libGluZyYmKG49dC50ci5uZXh0U2libGluZy5ub2RlbSksdC50ci5wcmV2aW91c1NpYmxpbmcmJihvPXQudHIucHJldmlvdXNTaWJsaW5nLm5vZGVtKTtmb3IodmFyIHI9dC5wYXJlbnRPYmplY3QsbD1yLmNoaWxkc0NvdW50LHM9ci5jaGlsZE5vZGVzLGE9MDtsPmE7YSsrKWlmKHNbYV0uaWQ9PWUpe2l8fHIuaHRtbE5vZGUuY2hpbGROb2Rlc1swXS5yZW1vdmVDaGlsZChzW2FdLnRyKSxzW2FdPTA7YnJlYWt9dGhpcy5fY29tcHJlc3NDaGlsZExpc3QobCxzKSxpfHxyLmNoaWxkc0NvdW50LS0sbiYmKHRoaXMuX2NvcnJlY3RQbHVzKG4pLHRoaXMuX2NvcnJlY3RMaW5lKG4pKSxvJiYodGhpcy5fY29ycmVjdFBsdXMobyksdGhpcy5fY29ycmVjdExpbmUobykpLHRoaXMudHNjaGVjayYmdGhpcy5fY29ycmVjdENoZWNrU3RhdGVzKHIpLGl8fHRoaXMuX2dsb2JhbElkU3RvcmFnZVJlY1N1Yih0KX0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUuZGVsZXRlQ2hpbGRJdGVtcz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nbG9iYWxJZFN0b3JhZ2VGaW5kKGUpO2lmKHQpZm9yKHZhciBpPXQuY2hpbGRzQ291bnQsbj0wO2k+bjtuKyspdGhpcy5fZGVsZXRlTm9kZSh0LmNoaWxkTm9kZXNbMF0uaWQsdC5jaGlsZE5vZGVzWzBdKX0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUuX2dsb2JhbElkU3RvcmFnZVJlY1N1Yj1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUuY2hpbGRzQ291bnQ7dCsrKXRoaXMuX2dsb2JhbElkU3RvcmFnZVJlY1N1YihlLmNoaWxkTm9kZXNbdF0pLHRoaXMuX2dsb2JhbElkU3RvcmFnZVN1YihlLmNoaWxkTm9kZXNbdF0uaWQpO3RoaXMuX2dsb2JhbElkU3RvcmFnZVN1YihlLmlkKTt2YXIgaT1lO2kuc3Bhbj1udWxsLGkudHIubm9kZW09bnVsbCxpLnRyPW51bGwsaS5odG1sTm9kZT1udWxsfSxkaHRtbFhUcmVlT2JqZWN0LnByb3RvdHlwZS5fYXV0b1Njcm9sbD1mdW5jdGlvbihlLHQsaSl7dGhpcy5hdXRvU2Nyb2xsJiYoZSYmKHQ9ZGh4NC5hYnNUb3AoZSksaT1kaHg0LmFic1RvcCh0aGlzLmFsbFRyZWUpLXRoaXMuYWxsVHJlZS5zY3JvbGxUb3ApLHQtaS1wYXJzZUludCh0aGlzLmFsbFRyZWUuc2Nyb2xsVG9wKT5wYXJzZUludCh0aGlzLmFsbFRyZWUub2Zmc2V0SGVpZ2h0KS01MCYmKHRoaXMuYWxsVHJlZS5zY3JvbGxUb3A9cGFyc2VJbnQodGhpcy5hbGxUcmVlLnNjcm9sbFRvcCkrMjApLHQtaTxwYXJzZUludCh0aGlzLmFsbFRyZWUuc2Nyb2xsVG9wKSszMCYmKHRoaXMuYWxsVHJlZS5zY3JvbGxUb3A9cGFyc2VJbnQodGhpcy5hbGxUcmVlLnNjcm9sbFRvcCktMjApKX0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUuZW5hYmxlVGV4dFNpZ25zPWZ1bmN0aW9uKGUpe3RoaXMuX3R4dGltZz1kaHg0LnMyYihlKX0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUucHJldmVudElFQ2FjaGluZz1mdW5jdGlvbihlKXtkaHg0LmFqYXguY2FjaGU9IWV9LGRodG1sWFRyZWVPYmplY3QucHJvdG90eXBlLnByZXZlbnRJRUNhc2hpbmc9ZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUucHJldmVudElFQ2FjaGluZyxkaHRtbFhUcmVlT2JqZWN0LnByb3RvdHlwZS5zZXRJY29uU2l6ZT1mdW5jdGlvbihlLHQsaSl7aWYoaSl7aWYoaSYmaS5zcGFuKXZhciBuPWk7ZWxzZSB2YXIgbj10aGlzLl9nbG9iYWxJZFN0b3JhZ2VGaW5kKGkpO2lmKCFuKXJldHVybiAwO3ZhciBvPW4uc3Bhbi5wYXJlbnROb2RlLnByZXZpb3VzU2libGluZy5jaGlsZE5vZGVzWzBdO2UmJihvLnN0eWxlLndpZHRoPWUrInB4Iix3aW5kb3cuX0tIVE1McnYmJihvLnBhcmVudE5vZGUuc3R5bGUud2lkdGg9ZSsicHgiKSksdCYmKG8uc3R5bGUuaGVpZ2h0PXQrInB4Iix3aW5kb3cuX0tIVE1McnYmJihvLnBhcmVudE5vZGUuc3R5bGUuaGVpZ2h0PXQrInB4IikpfWVsc2UgdGhpcy5kZWZfaW1nX3g9ZSsicHgiLHRoaXMuZGVmX2ltZ195PXQrInB4In0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUuZW5hYmxlU2luZ2xlUmFkaW9Nb2RlPWZ1bmN0aW9uKGUpe3RoaXMuX2ZyYnRycz1kaHg0LnMyYihlKX0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUub3Blbk9uSXRlbUFkZGVkPWZ1bmN0aW9uKGUpe3RoaXMuX2hBZEk9IWRoeDQuczJiKGUpfSxkaHRtbFhUcmVlT2JqZWN0LnByb3RvdHlwZS5vcGVuT25JdGVtQWRkaW5nPWZ1bmN0aW9uKGUpe3RoaXMuX2hBZEk9IWRoeDQuczJiKGUpfSxkaHRtbFhUcmVlT2JqZWN0LnByb3RvdHlwZS5nZXRBbGxJdGVtc1dpdGhLaWRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldEFsbEZhdEl0ZW1zKHRoaXMuaHRtbE5vZGUpfSxkaHRtbFhUcmVlT2JqZWN0LnByb3RvdHlwZS5zZXRTa2luPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMucGFyZW50T2JqZWN0LmNsYXNzTmFtZS5yZXBsYWNlKC9kaHh0cmVlX1teIF0qL2dpLCIiKTt0aGlzLnBhcmVudE9iamVjdC5jbGFzc05hbWU9dCsiIGRoeHRyZWVfIitlLCgiZGh4X3RlcnJhY2UiPT1lfHwiZGh4X3dlYiI9PWV8fCJtYXRlcmlhbCI9PWUpJiZ0aGlzLmVuYWJsZVRyZWVMaW5lcyghMSksIm1hdGVyaWFsIj09ZSYmdGhpcy5zZXRJY29uU2l6ZSgiMjUiLCIyNSIpfSxqc29uUG9pbnRlci5wcm90b3R5cGU9e3RleHQ6ZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbihlKXtmb3IodmFyIGk9W10sbj0wO248ZS5sZW5ndGg7bisrKWkucHVzaCgieyIrdChlW25dKSsifSIpO3JldHVybiBpLmpvaW4oIiwiKX0sdD1mdW5jdGlvbihpKXt2YXIgbj1bXTtmb3IodmFyIG8gaW4gaSkib2JqZWN0Ij09dHlwZW9mIGlbb10/by5sZW5ndGg/bi5wdXNoKCciJytvKyciOlsnK2UoaVtvXSkrIl0iKTpuLnB1c2goJyInK28rJyI6eycrdChpW29dKSsifSIpOm4ucHVzaCgnIicrbysnIjoiJytpW29dKyciJyk7cmV0dXJuIG4uam9pbigiLCIpfTtyZXR1cm4ieyIrdCh0aGlzLmQpKyJ9In0sZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmRbZV19LGV4aXN0czpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5kfSxjb250ZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZC5jb250ZW50fSxlYWNoOmZ1bmN0aW9uKGUsdCxpKXt2YXIgbj10aGlzLmRbZV0sbz1uZXcganNvblBvaW50ZXI7aWYobilmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKylvLmQ9bltyXSx0LmFwcGx5KGksW28scl0pfSxnZXRfYWxsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZH0sc3ViOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcganNvblBvaW50ZXIodGhpcy5kW2VdLHRoaXMuZCl9LHN1Yl9leGlzdHM6ZnVuY3Rpb24oZSl7cmV0dXJuISF0aGlzLmRbZV19LGVhY2hfeDpmdW5jdGlvbihlLHQsaSxuLG8pe3ZhciByPXRoaXMuZFtlXSxsPW5ldyBqc29uUG9pbnRlcigwLHRoaXMuZCk7aWYocilmb3Iobz1vfHwwO288ci5sZW5ndGg7bysrKWlmKHJbb11bdF0mJihsLmQ9cltvXSwtMT09aS5hcHBseShuLFtsLG9dKSkpcmV0dXJufSx1cDpmdW5jdGlvbigpe3JldHVybiBuZXcganNvblBvaW50ZXIodGhpcy5kcCx0aGlzLmQpfSxzZXQ6ZnVuY3Rpb24oZSx0KXt0aGlzLmRbZV09dH0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGpzb25Qb2ludGVyKHRoaXMuZCx0aGlzLmRwKX0sdGhyb3VnaDpmdW5jdGlvbihlLHQsaSxuLG8pe3ZhciByPXRoaXMuZFtlXTtpZihyLmxlbmd0aClmb3IodmFyIGw9MDtsPHIubGVuZ3RoO2wrKyl7aWYobnVsbCE9cltsXVt0XSYmIiIhPXJbbF1bdF0mJighaXx8cltsXVt0XT09aSkpe3ZhciBzPW5ldyBqc29uUG9pbnRlcihyW2xdLHRoaXMuZCk7bi5hcHBseShvLFtzLGxdKX12YXIgYT10aGlzLmQ7dGhpcy5kPXJbbF0sdGhpcy5zdWJfZXhpc3RzKGUpJiZ0aGlzLnRocm91Z2goZSx0LGksbixvKSx0aGlzLmQ9YX19fSxkaHRtbFhUcmVlT2JqZWN0LnByb3RvdHlwZS5sb2FkSlNPTk9iamVjdD1mdW5jdGlvbihlLHQpe3JldHVybiB3aW5kb3cuY29uc29sZSYmd2luZG93LmNvbnNvbGUuaW5mbyYmd2luZG93LmNvbnNvbGUuaW5mbygibG9hZEpTT05PYmplY3Qgd2FzIGRlcHJlY2F0ZWQiLCJodHRwOi8vZG9jcy5kaHRtbHguY29tL21pZ3JhdGlvbl9faW5kZXguaHRtbCNtaWdyYXRpb25mcm9tNDN0bzQ0IiksdGhpcy5fbG9hZEpTT05PYmplY3QoZSx0KX0sZGh0bWxYVHJlZU9iamVjdC5wcm90b3R5cGUuX2xvYWRKU09OT2JqZWN0PWZ1bmN0aW9uKGUsdCl7dGhpcy5wYXJzQ291bnR8fHRoaXMuY2FsbEV2ZW50KCJvblhMUyIsW3RoaXMsbnVsbF0pLHRoaXMueG1sc3RhdGU9MTt2YXIgaT1uZXcganNvblBvaW50ZXIoZSk7dGhpcy5fcGFyc2UoaSksdGhpcy5fcD1pLHQmJnQoKX0sd2luZG93LmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGRoeF9pbml0X3RyZWVzLCExKTp3aW5kb3cuYXR0YWNoRXZlbnQmJndpbmRvdy5hdHRhY2hFdmVudCgib25sb2FkIixkaHhfaW5pdF90cmVlcyk7dmFyIHN0eWxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7c3R5bGUuaW5uZXJIVE1MPSdAa2V5ZnJhbWVzIGRoeF9sb2FkZXJfcm90YXRlezEwMCV7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpO319QGtleWZyYW1lcyBkaHhfbG9hZGVyX2Rhc2h7MCV7c3Ryb2tlLWRhc2hhcnJheToxLDIwMDtzdHJva2UtZGFzaG9mZnNldDowO301MCV7c3Ryb2tlLWRhc2hhcnJheTo4OSwyMDA7c3Ryb2tlLWRhc2hvZmZzZXQ6LTM1cHg7fTEwMCV7c3Ryb2tlLWRhc2hhcnJheTo4OSwyMDA7c3Ryb2tlLWRhc2hvZmZzZXQ6LTEyNHB4O319LmRodG1seE1lbnVfbWF0ZXJpYWxfTWlkZGxle3Bvc2l0aW9uOnJlbGF0aXZlO2hlaWdodDoyOHB4O2xpbmUtaGVpZ2h0OjI4cHg7YmFja2dyb3VuZC1jb2xvcjojZjVmNWY1O292ZXJmbG93OmhpZGRlbjtib3JkZXI6bm9uZTtmb250LXNpemU6MTRweDtmb250LWZhbWlseTpSb2JvdG8sQXJpYWwsSGVsdmV0aWNhO2NvbG9yOiM0MDQwNDA7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1raHRtbC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTstby11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7fS5kaHRtbHhNZW51X21hdGVyaWFsX01pZGRsZSBkaXYuZGh0bWx4TWVudV9tYXRlcmlhbF9Ub3BMZXZlbF9JdGVtX05vcm1hbCwuZGh0bWx4TWVudV9tYXRlcmlhbF9NaWRkbGUgZGl2LmRodG1seE1lbnVfbWF0ZXJpYWxfVG9wTGV2ZWxfSXRlbV9EaXNhYmxlZCwuZGh0bWx4TWVudV9tYXRlcmlhbF9NaWRkbGUgZGl2LmRodG1seE1lbnVfbWF0ZXJpYWxfVG9wTGV2ZWxfSXRlbV9TZWxlY3RlZHtwb3NpdGlvbjpyZWxhdGl2ZTtmbG9hdDpsZWZ0O2ZvbnQ6aW5oZXJpdDtoZWlnaHQ6MjhweDtsaW5lLWhlaWdodDoyOHB4O21hcmdpbjowO3BhZGRpbmc6MCA4cHg7Y3Vyc29yOmRlZmF1bHQ7d2hpdGUtc3BhY2U6bm93cmFwOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTsta2h0bWwtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7LW8tdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO30uZGh0bWx4TWVudV9tYXRlcmlhbF9NaWRkbGUgZGl2LmRodG1seE1lbnVfbWF0ZXJpYWxfVG9wTGV2ZWxfSXRlbV9Ob3JtYWwgZGl2LnRvcF9sZXZlbF90ZXh0LC5kaHRtbHhNZW51X21hdGVyaWFsX01pZGRsZSBkaXYuZGh0bWx4TWVudV9tYXRlcmlhbF9Ub3BMZXZlbF9JdGVtX0Rpc2FibGVkIGRpdi50b3BfbGV2ZWxfdGV4dCwuZGh0bWx4TWVudV9tYXRlcmlhbF9NaWRkbGUgZGl2LmRodG1seE1lbnVfbWF0ZXJpYWxfVG9wTGV2ZWxfSXRlbV9TZWxlY3RlZCBkaXYudG9wX2xldmVsX3RleHR7ZmxvYXQ6bGVmdDttYXJnaW46MCAzcHg7fS5kaHRtbHhNZW51X21hdGVyaWFsX01pZGRsZSBkaXYuZGh0bWx4TWVudV9tYXRlcmlhbF9Ub3BMZXZlbF9JdGVtX05vcm1hbCBpLC5kaHRtbHhNZW51X21hdGVyaWFsX01pZGRsZSBkaXYuZGh0bWx4TWVudV9tYXRlcmlhbF9Ub3BMZXZlbF9JdGVtX0Rpc2FibGVkIGksLmRodG1seE1lbnVfbWF0ZXJpYWxfTWlkZGxlIGRpdi5kaHRtbHhNZW51X21hdGVyaWFsX1RvcExldmVsX0l0ZW1fU2VsZWN0ZWQgaXtoZWlnaHQ6aW5oZXJpdDtsaW5lLWhlaWdodDppbmhlcml0O2Zsb2F0OmxlZnQ7Y29sb3I6aW5oZXJpdDttYXJnaW46MCA0cHg7Zm9udC1zaXplOjEuMmVtO30uZGh0bWx4TWVudV9tYXRlcmlhbF9NaWRkbGUgZGl2LmRodG1seE1lbnVfbWF0ZXJpYWxfVG9wTGV2ZWxfSXRlbV9EaXNhYmxlZHtjb2xvcjojYTZhNmE2O30uZGh0bWx4TWVudV9tYXRlcmlhbF9NaWRkbGUgZGl2LmRodG1seE1lbnVfbWF0ZXJpYWxfVG9wTGV2ZWxfSXRlbV9TZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOiNlYmViZWI7fS5kaHRtbHhNZW51X21hdGVyaWFsX01pZGRsZSBpbWcuZGh0bWx4TWVudV9Ub3BMZXZlbF9JdGVtX0ljb257ZmxvYXQ6bGVmdDttYXJnaW46NXB4IDNweCAwIDNweDt3aWR0aDoxOHB4O2hlaWdodDoxOHB4O2N1cnNvcjpkZWZhdWx0O30uZGh0bWx4TWVudV9tYXRlcmlhbF9NaWRkbGUgZGl2LnRvcF9zZXB7cG9zaXRpb246cmVsYXRpdmU7ZmxvYXQ6bGVmdDtoZWlnaHQ6MjJweDt3aWR0aDowO2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjZGZkZmRmO21hcmdpbjozcHggOHB4IDAgOHB4O2ZvbnQtc2l6ZToxcHg7b3ZlcmZsb3c6aGlkZGVuO2N1cnNvcjpkZWZhdWx0Oy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTsta2h0bWwtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7LW8tdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO30uZGh0bWx4TWVudV9tYXRlcmlhbF9NaWRkbGUgZGl2LmRodG1seE1lbnVfVG9wTGV2ZWxfVGV4dF9yaWdodCwuZGh0bWx4TWVudV9tYXRlcmlhbF9NaWRkbGUgZGl2LmRodG1seE1lbnVfVG9wTGV2ZWxfVGV4dF9sZWZ0e3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2hlaWdodDoyOHB4O2xpbmUtaGVpZ2h0OjI4cHg7Y3Vyc29yOmRlZmF1bHQ7Zm9udC1zaXplOjE0cHg7Zm9udC1mYW1pbHk6Um9ib3RvLEFyaWFsLEhlbHZldGljYTtjb2xvcjojNDA0MDQwOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTsta2h0bWwtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7LW8tdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO30uZGh0bWx4TWVudV9tYXRlcmlhbF9NaWRkbGUgZGl2LmRodG1seE1lbnVfVG9wTGV2ZWxfVGV4dF9yaWdodHtyaWdodDo2cHg7fS5kaHRtbHhNZW51X21hdGVyaWFsX01pZGRsZSBkaXYuZGh0bWx4TWVudV9Ub3BMZXZlbF9UZXh0X2xlZnR7bGVmdDo2cHg7fWRpdi5kaHRtbHhNZW51X21hdGVyaWFsX1N1YkxldmVsQXJlYV9Qb2x5Z29ue3Bvc2l0aW9uOmFic29sdXRlO3BhZGRpbmc6NXB4IDA7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO292ZXJmbG93OmhpZGRlbjtjdXJzb3I6ZGVmYXVsdDtsaW5lLWhlaWdodDpub3JtYWw7b3ZlcmZsb3cteTphdXRvOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNoOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjpyZ2JhKDAsMCwwLDApO2JveC1zaGFkb3c6MCAxcHggM3B4IHJnYmEoMCwwLDAsMC4xMiksMCAxcHggMnB4IHJnYmEoMCwwLDAsMC4yNCk7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1raHRtbC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTstby11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7fWRpdi5kaHRtbHhNZW51X21hdGVyaWFsX1N1YkxldmVsQXJlYV9Qb2x5Z29uIHRke3BhZGRpbmc6MDttYXJnaW46MDtsaW5lLWhlaWdodDpub3JtYWw7d2hpdGUtc3BhY2U6bm93cmFwO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtZmFtaWx5OlJvYm90byxBcmlhbCxIZWx2ZXRpY2E7Y29sb3I6IzQwNDA0MDt9ZGl2LmRodG1seE1lbnVfbWF0ZXJpYWxfU3ViTGV2ZWxBcmVhX1BvbHlnb24gdGQuc3ViX2l0ZW1faWNvbnt3aWR0aDoxOHB4O3RleHQtYWxpZ246Y2VudGVyO31kaXYuZGh0bWx4TWVudV9tYXRlcmlhbF9TdWJMZXZlbEFyZWFfUG9seWdvbiB0ZC5zdWJfaXRlbV9pY29uIGltZy5zdWJfaWNvbnttYXJnaW46NHB4IDZweCAwIDZweDt3aWR0aDoxOHB4O2hlaWdodDoxOHB4O31kaXYuZGh0bWx4TWVudV9tYXRlcmlhbF9TdWJMZXZlbEFyZWFfUG9seWdvbiB0ZC5zdWJfaXRlbV9pY29uIGl7d2lkdGg6MThweDtoZWlnaHQ6MzBweDtsaW5lLWhlaWdodDoyOXB4O21hcmdpbjowIDZweDtmb250LXNpemU6MS4yZW07dGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6aW5oZXJpdDt9ZGl2LmRodG1seE1lbnVfbWF0ZXJpYWxfU3ViTGV2ZWxBcmVhX1BvbHlnb24gdGQuc3ViX2l0ZW1faWNvbiBkaXYuc3ViX2ljb257bWFyZ2luOjAgNnB4O3dpZHRoOjE4cHg7aGVpZ2h0OjMwcHg7bGluZS1oZWlnaHQ6MzBweDtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgNXB4O2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLWltYWdlOnVybCgiaW1ncy9kaHhtZW51X21hdGVyaWFsL2RoeG1lbnVfY2hyZC5wbmciKTt9ZGl2LmRodG1seE1lbnVfbWF0ZXJpYWxfU3ViTGV2ZWxBcmVhX1BvbHlnb24gdGQuc3ViX2l0ZW1faWNvbiBkaXYuc3ViX2ljb24uY2hieF8we2JhY2tncm91bmQtcG9zaXRpb246MCA1cHg7fWRpdi5kaHRtbHhNZW51X21hdGVyaWFsX1N1YkxldmVsQXJlYV9Qb2x5Z29uIHRkLnN1Yl9pdGVtX2ljb24gZGl2LnN1Yl9pY29uLmNoYnhfMXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xOHB4IDVweDt9ZGl2LmRodG1seE1lbnVfbWF0ZXJpYWxfU3ViTGV2ZWxBcmVhX1BvbHlnb24gdGQuc3ViX2l0ZW1faWNvbiBkaXYuc3ViX2ljb24ucmRidF8we2JhY2tncm91bmQtcG9zaXRpb246LTcycHggNXB4O31kaXYuZGh0bWx4TWVudV9tYXRlcmlhbF9TdWJMZXZlbEFyZWFfUG9seWdvbiB0ZC5zdWJfaXRlbV9pY29uIGRpdi5zdWJfaWNvbi5yZGJ0XzF7YmFja2dyb3VuZC1wb3NpdGlvbjotOTBweCA1cHg7fWRpdi5kaHRtbHhNZW51X21hdGVyaWFsX1N1YkxldmVsQXJlYV9Qb2x5Z29uIHRkLnN1Yl9pdGVtX3RleHQgZGl2LnN1Yl9pdGVtX3RleHR7cG9zaXRpb246cmVsYXRpdmU7aGVpZ2h0OjMwcHg7bGluZS1oZWlnaHQ6MzBweDtwYWRkaW5nOjAgMjJweCAwIDFweDtvdmVyZmxvdzpoaWRkZW47fWRpdi5kaHRtbHhNZW51X21hdGVyaWFsX1N1YkxldmVsQXJlYV9Qb2x5Z29uIHRkLnN1Yl9pdGVtX2hre3BhZGRpbmc6MCAxMHB4IDAgOHB4O31kaXYuZGh0bWx4TWVudV9tYXRlcmlhbF9TdWJMZXZlbEFyZWFfUG9seWdvbiB0ZC5zdWJfaXRlbV9oayBkaXYuc3ViX2l0ZW1faGt7Y29sb3I6IzhkOGQ4ZDtmb250LXNpemU6MTJweDt0ZXh0LWFsaWduOnJpZ2h0O31kaXYuZGh0bWx4TWVudV9tYXRlcmlhbF9TdWJMZXZlbEFyZWFfUG9seWdvbiB0ZCBkaXYuY29tcGxleF9hcnJvd3tmbG9hdDpyaWdodDt3aWR0aDoxMHB4O21hcmdpbjowIDFweCAwIDExcHg7aGVpZ2h0OjMwcHg7bGluZS1oZWlnaHQ6MzBweDtiYWNrZ3JvdW5kLWltYWdlOnVybCgiaW1ncy9kaHhtZW51X21hdGVyaWFsL2RoeG1lbnVfc3ViYXIucG5nIik7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtcG9zaXRpb246MCAxMHB4O292ZXJmbG93OmhpZGRlbjtmb250LXNpemU6MXB4O31kaXYuZGh0bWx4TWVudV9tYXRlcmlhbF9TdWJMZXZlbEFyZWFfUG9seWdvbiB0ZCBkaXYuY29tcGxleF9hcnJvd19sb2FkaW5ne3dpZHRoOjE2cHg7aGVpZ2h0OjMwcHg7bGluZS1oZWlnaHQ6MzBweDtiYWNrZ3JvdW5kLXBvc2l0aW9uOmNlbnRlciBjZW50ZXI7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtaW1hZ2U6dXJsKCJpbWdzL2RoeG1lbnVfbWF0ZXJpYWwvZGh4bWVudV9sb2FkZXIuZ2lmIik7ZmxvYXQ6cmlnaHQ7fWRpdi5kaHRtbHhNZW51X21hdGVyaWFsX1N1YkxldmVsQXJlYV9Qb2x5Z29uIHRyLnN1Yl9pdGVtX3NlbGVjdGVkIHRke2JhY2tncm91bmQtY29sb3I6I2ViZWJlYjt9ZGl2LmRodG1seE1lbnVfbWF0ZXJpYWxfU3ViTGV2ZWxBcmVhX1BvbHlnb24gdHIuc3ViX2l0ZW1fc2VsZWN0ZWQgdGQgZGl2LmNvbXBsZXhfYXJyb3d7YmFja2dyb3VuZC1wb3NpdGlvbjotMTBweCAxMHB4O31kaXYuZGh0bWx4TWVudV9tYXRlcmlhbF9TdWJMZXZlbEFyZWFfUG9seWdvbiB0ci5zdWJfaXRlbV9kaXMgdGQuc3ViX2l0ZW1faGsgZGl2LnN1Yl9pdGVtX2hre2NvbG9yOiNjMGMwYzA7fWRpdi5kaHRtbHhNZW51X21hdGVyaWFsX1N1YkxldmVsQXJlYV9Qb2x5Z29uIHRyLnN1Yl9pdGVtX2RpcyB0ZCBkaXYuc3ViX2l0ZW1fdGV4dCxkaXYuZGh0bWx4TWVudV9tYXRlcmlhbF9TdWJMZXZlbEFyZWFfUG9seWdvbiB0ci5zdWJfaXRlbV9kaXMgdGQgdGQuc3ViX2l0ZW1faWNvbiBpe2NvbG9yOiNhNmE2YTY7fWRpdi5kaHRtbHhNZW51X21hdGVyaWFsX1N1YkxldmVsQXJlYV9Qb2x5Z29uIHRyLnN1Yl9pdGVtX2RpcyB0ZCBkaXYuY29tcGxleF9hcnJvd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMHB4IDEwcHg7fWRpdi5kaHRtbHhNZW51X21hdGVyaWFsX1N1YkxldmVsQXJlYV9Qb2x5Z29uIHRyLnN1Yl9pdGVtX2RpcyB0ZCBkaXYuc3ViX2ljb24uY2hieF8we2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggNXB4O31kaXYuZGh0bWx4TWVudV9tYXRlcmlhbF9TdWJMZXZlbEFyZWFfUG9seWdvbiB0ci5zdWJfaXRlbV9kaXMgdGQgZGl2LnN1Yl9pY29uLmNoYnhfMXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi01NHB4IDVweDt9ZGl2LmRodG1seE1lbnVfbWF0ZXJpYWxfU3ViTGV2ZWxBcmVhX1BvbHlnb24gdHIuc3ViX2l0ZW1fZGlzIHRkIGRpdi5zdWJfaWNvbi5yZGJ0XzB7YmFja2dyb3VuZC1wb3NpdGlvbjotMTA4cHggNXB4O31kaXYuZGh0bWx4TWVudV9tYXRlcmlhbF9TdWJMZXZlbEFyZWFfUG9seWdvbiB0ci5zdWJfaXRlbV9kaXMgdGQgZGl2LnN1Yl9pY29uLnJkYnRfMXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjZweCA1cHg7fWRpdi5kaHRtbHhNZW51X21hdGVyaWFsX1N1YkxldmVsQXJlYV9Qb2x5Z29uIHRyLnN1Yl9pdGVtX2RpcyB0ZCBpe2NvbG9yOiNhNmE2YTY7fWRpdi5kaHRtbHhNZW51X21hdGVyaWFsX1N1YkxldmVsQXJlYV9Qb2x5Z29uIHRyLnN1Yl9zZXAgdGR7cGFkZGluZzo1cHggM3B4O31kaXYuZGh0bWx4TWVudV9tYXRlcmlhbF9TdWJMZXZlbEFyZWFfUG9seWdvbiB0ci5zdWJfc2VwIHRkIGRpdi5zdWJfc2Vwe3Bvc2l0aW9uOnJlbGF0aXZlO2ZvbnQtc2l6ZToxcHg7bGluZS1oZWlnaHQ6MXB4O2hlaWdodDowO3dpZHRoOjEwMCU7Ym9yZGVyLXRvcDoxcHggc29saWQgI2RmZGZkZjt9ZGl2LmRodG1seE1lbnVfbWF0ZXJpYWxfU3ViTGV2ZWxBcmVhX1BvbHlnb24gZGl2LmRodG1seE1lbnVfbWF0ZXJpYWxfU3ViTGV2ZWxBcmVhX0Fycm93VXAsZGl2LmRodG1seE1lbnVfbWF0ZXJpYWxfU3ViTGV2ZWxBcmVhX1BvbHlnb24gZGl2LmRodG1seE1lbnVfbWF0ZXJpYWxfU3ViTGV2ZWxBcmVhX0Fycm93VXBfT3ZlcixkaXYuZGh0bWx4TWVudV9tYXRlcmlhbF9TdWJMZXZlbEFyZWFfUG9seWdvbiBkaXYuZGh0bWx4TWVudV9tYXRlcmlhbF9TdWJMZXZlbEFyZWFfQXJyb3dVcF9EaXNhYmxlZHtwb3NpdGlvbjpyZWxhdGl2ZTtmb250LXNpemU6MXB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNkZmRmZGY7YmFja2dyb3VuZC1pbWFnZTp1cmwoImltZ3MvZGh4bWVudV9tYXRlcmlhbC9kaHhtZW51X2Fycm93X3VwLnBuZyIpO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOmNlbnRlciAycHg7cGFkZGluZzo4cHggMDttYXJnaW4tYm90dG9tOjNweDt9ZGl2LmRodG1seE1lbnVfbWF0ZXJpYWxfU3ViTGV2ZWxBcmVhX1BvbHlnb24gZGl2LmRodG1seE1lbnVfbWF0ZXJpYWxfU3ViTGV2ZWxBcmVhX0Fycm93VXBfRGlzYWJsZWR7YmFja2dyb3VuZC1pbWFnZTp1cmwoImltZ3MvZGh4bWVudV9tYXRlcmlhbC9kaHhtZW51X2Fycm93X3VwX2Rpcy5wbmciKTt9ZGl2LmRodG1seE1lbnVfbWF0ZXJpYWxfU3ViTGV2ZWxBcmVhX1BvbHlnb24gZGl2LmRodG1seE1lbnVfbWF0ZXJpYWxfU3ViTGV2ZWxBcmVhX0Fycm93RG93bixkaXYuZGh0bWx4TWVudV9tYXRlcmlhbF9TdWJMZXZlbEFyZWFfUG9seWdvbiBkaXYuZGh0bWx4TWVudV9tYXRlcmlhbF9TdWJMZXZlbEFyZWFfQXJyb3dEb3duX092ZXIsZGl2LmRodG1seE1lbnVfbWF0ZXJpYWxfU3ViTGV2ZWxBcmVhX1BvbHlnb24gZGl2LmRodG1seE1lbnVfbWF0ZXJpYWxfU3ViTGV2ZWxBcmVhX0Fycm93RG93bl9EaXNhYmxlZHtwb3NpdGlvbjpyZWxhdGl2ZTtmb250LXNpemU6MXB4O2JvcmRlci10b3A6MXB4IHNvbGlkICNkZmRmZGY7YmFja2dyb3VuZC1pbWFnZTp1cmwoImltZ3MvZGh4bWVudV9tYXRlcmlhbC9kaHhtZW51X2Fycm93X2Rvd24ucG5nIik7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtcG9zaXRpb246Y2VudGVyIDZweDtwYWRkaW5nOjhweCAwO21hcmdpbi10b3A6M3B4O31kaXYuZGh0bWx4TWVudV9tYXRlcmlhbF9TdWJMZXZlbEFyZWFfUG9seWdvbiBkaXYuZGh0bWx4TWVudV9tYXRlcmlhbF9TdWJMZXZlbEFyZWFfQXJyb3dEb3duX0Rpc2FibGVke2JhY2tncm91bmQtaW1hZ2U6dXJsKCJpbWdzL2RoeG1lbnVfbWF0ZXJpYWwvZGh4bWVudV9hcnJvd19kb3duX2Rpcy5wbmciKTt9aWZyYW1lLmRodG1seE1lbnVfSUU2Q292ZXJGaXhfbWF0ZXJpYWx7cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOm5vbmU7YmFja2dyb3VuZDojMDAwO2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGEob3BhY2l0eT0xMDApO30uZGh0bWx4TWVudV9tYXRlcmlhbF9NaWRkbGUuZGlyX2xlZnQgZGl2LmFsaWduX2xlZnR7ZmxvYXQ6bGVmdDt9LmRodG1seE1lbnVfbWF0ZXJpYWxfTWlkZGxlLmRpcl9sZWZ0IGRpdi5hbGlnbl9yaWdodHtmbG9hdDpyaWdodDt9LmRoeG1lbnVfc2tpbl9kZXRlY3R7cG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3RvcDotMTAwcHg7bWFyZ2luOjA7cGFkZGluZzowO2JvcmRlcjowIHNvbGlkIHdoaXRlO3dpZHRoOjQwcHg7aGVpZ2h0OjEwcHg7b3ZlcmZsb3c6aGlkZGVuO31Aa2V5ZnJhbWVzIGRoeF9sb2FkZXJfcm90YXRlezEwMCV7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpO319QGtleWZyYW1lcyBkaHhfbG9hZGVyX2Rhc2h7MCV7c3Ryb2tlLWRhc2hhcnJheToxLDIwMDtzdHJva2UtZGFzaG9mZnNldDowO301MCV7c3Ryb2tlLWRhc2hhcnJheTo4OSwyMDA7c3Ryb2tlLWRhc2hvZmZzZXQ6LTM1cHg7fTEwMCV7c3Ryb2tlLWRhc2hhcnJheTo4OSwyMDA7c3Ryb2tlLWRhc2hvZmZzZXQ6LTEyNHB4O319LmRlZmF1bHRUcmVlVGFibGV7bWFyZ2luOjA7cGFkZGluZzowO2JvcmRlcjowO30uY29udGFpbmVyVGFibGVTdHlsZXtvdmVyZmxvdzphdXRvOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNoO3Bvc2l0aW9uOnJlbGF0aXZlO3RvcDowO2ZvbnQtc2l6ZToxMnB4Oy1raHRtbC11c2VyLXNlbGVjdDpub25lO30uY29udGFpbmVyVGFibGVTdHlsZVJUTCBzcGFue2RpcmVjdGlvbjpydGw7dW5pY29kZS1iaWRpOmJpZGktb3ZlcnJpZGU7fS5jb250YWluZXJUYWJsZVN0eWxlUlRMe2RpcmVjdGlvbjpydGw7b3ZlcmZsb3c6YXV0bztwb3NpdGlvbjpyZWxhdGl2ZTt0b3A6MDtmb250LXNpemU6MTJweDt9LnN0YW5kYXJ0VHJlZVJvd3tmb250LWZhbWlseTpSb2JvdG8sQXJpYWwsSGVsdmV0aWNhO2ZvbnQtc2l6ZTo7LW1vei11c2VyLXNlbGVjdDpub25lO2xpbmUtaGVpZ2h0OjI0cHg7fS5zZWxlY3RlZFRyZWVSb3d7Zm9udC1mYW1pbHk6Um9ib3RvLEFyaWFsLEhlbHZldGljYTtmb250LXNpemU6Oy1tb3otdXNlci1zZWxlY3Q6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOiNlZWU7Y29sb3I6IzM5Yzt9LmRoeHRyZWVfbWF0ZXJpYWwgLnNlbGVjdGVkVHJlZVJvd0Z1bGwgLmRoeFRleHRDZWxse2JhY2tncm91bmQtY29sb3I6I2VlZTtjb2xvcjojMzljO30uZHJhZ0FuZERyb3BSb3d7Y29sb3I6IzM5Yzt9LnN0YW5kYXJ0VHJlZVJvd19sb3J7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtiYWNrZ3JvdW5kLWNvbG9yOjtmb250LWZhbWlseTpSb2JvdG8sQXJpYWwsSGVsdmV0aWNhO2ZvbnQtc2l6ZTo7LW1vei11c2VyLXNlbGVjdDpub25lO30uc3RhbmRhcnRUcmVlSW1hZ2V7aGVpZ2h0OjI0cHg7b3ZlcmZsb3c6aGlkZGVuO2JvcmRlcjowO3BhZGRpbmc6MDttYXJnaW46MDtmb250LXNpemU6MXB4O30uc3RhbmRhcnRUcmVlSW1hZ2UgaW1ne3dpZHRoOjE4cHg7aGVpZ2h0OjI0cHg7YmFja2dyb3VuZC1wb3NpdGlvbjpjZW50ZXIgY2VudGVyO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtib3JkZXI6MDtwYWRkaW5nOjA7bWFyZ2luOjA7Zm9udC1zaXplOjFweDstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LWtodG1sLXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lOy1vLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt9LmhpZGRlblJvd3t3aWR0aDoxcHg7b3ZlcmZsb3c6aGlkZGVuO30uZHJhZ1NwYW5EaXYsLmRyYWdTcGFuRGl2IHRke2ZvbnQtZmFtaWx5OlJvYm90byxBcmlhbCxIZWx2ZXRpY2E7Zm9udC1zaXplOjtsaW5lLWhlaWdodDo7dmVydGljYWwtYWxpZ246Y2VudGVyO2JhY2tncm91bmQtY29sb3I6d2hpdGU7ei1pbmRleDo5OTk7fS5kcmFnU3BhbkRpdiB0ZHtwYWRkaW5nOjVweDt9LmFfZGh4X2hpZGRlbl9pbnB1dHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTFweDtsZWZ0Oi0xcHg7d2lkdGg6MXB4O2hlaWdodDoxcHg7Ym9yZGVyOm5vbmU7YmFja2dyb3VuZDpub25lO30uYV9kaHhfaGlkZGVuX2lucHV0e3Bvc2l0aW9uOmFic29sdXRlO3RvcDotMXB4O2xlZnQ6LTFweDt3aWR0aDoxcHg7aGVpZ2h0OjFweDtib3JkZXI6bm9uZTtiYWNrZ3JvdW5kOm5vbmU7fS5zZWxlY3Rpb25CYXJ7dG9wOjA7YmFja2dyb3VuZC1jb2xvcjpibGFjaztwb3NpdGlvbjphYnNvbHV0ZTtvdmVyZmxvdzpoaWRkZW47aGVpZ2h0OjJweDt6LWluZGV4OjExO30uaW50cmVlZWRpdFJvd3tmb250LXNpemU6OHB0O2hlaWdodDoxNnB4O2JvcmRlcjoxcHggc29saWQgc2lsdmVyO3BhZGRpbmc6MDttYXJnaW46MDttYXJnaW4tbGVmdDo0cHg7LW1vei11c2VyLXNlbGVjdDp0ZXh0Oy1raHRtbC11c2VyLXNlbGVjdDp0ZXh0O30uZGh4X3RyZWVfdGV4dFNpZ257Zm9udC1zaXplOjhwdDtmb250LWZhbWlseTptb25vc3BhY2U7d2lkdGg6MjFweDtjb2xvcjo7cGFkZGluZzowO21hcmdpbjowO2N1cnNvcjpwb2ludGVyO3RleHQtYWxpZ246Y2VudGVyO30uZGh4X3RyZWVfb3BhY2l0eXtvcGFjaXR5OjA7ZmlsdGVyOnByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYShvcGFjaXR5PTApOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTsta2h0bWwtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7LW8tdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO30uZGh4X2JnX2ltZ19maXh7d2lkdGg6MThweDtoZWlnaHQ6MjRweDtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjpjZW50ZXI7YmFja2dyb3VuZC1wb3NpdGlvbi14OmNlbnRlcjtiYWNrZ3JvdW5kLXBvc2l0aW9uLXk6Y2VudGVyO30uZGh4dHJlZV9za2luX2RldGVjdHtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7dG9wOi0xMDBweDttYXJnaW46MDtwYWRkaW5nOjA7Ym9yZGVyOjAgc29saWQgd2hpdGU7d2lkdGg6NDBweDtoZWlnaHQ6MTBweDtvdmVyZmxvdzpoaWRkZW47fScsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7dmFyIGxheWFhaXJfZGVidWdfdmlldz17fTt3aW5kb3cubGF5YWFpcl9kZWJ1Z192aWV3PWxheWFhaXJfZGVidWdfdmlldyxsYXlhYWlyX2RlYnVnX3ZpZXcuaW5pdExheWFBaXJEZWJ1Z1ZpZXc9ZnVuY3Rpb24oZSl7ZS5zdHlsZS5ib3JkZXI9IjFweCBzb2xpZCBibGFjayI7dmFyIHQ9TWF0aC5taW4oMjUwLC4zKmUub2Zmc2V0V2lkdGgpLGk9JzxkaXYgY2xhc3M9InRvcC1iYW5uZXIiPlxuPC9kaXY+XG48ZGl2PlxuPGRpdiBzdHlsZT0ib3ZlcmZsb3c6aGlkZGVuOyBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjNDQ0OyBwYWRkaW5nOjVweCI+XG48ZGl2IHN0eWxlPSJmbG9hdDpsZWZ0Ij5cbjxidXR0b24gaWQ9Im5vZGVfZnVuY3Rpb25hbGl0eV9jb250cm9sIj7lrqHmn6XlhYPntKA8L2J1dHRvbj5cbjxidXR0b24gaWQ9InJlZnJlc2hfY29udHJvbCI+5Yi35pawPC9idXR0b24+XG48L2Rpdj5cbjxkaXYgc3R5bGU9ImZsb2F0OnJpZ2h0Ij5cbjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InNob3dfY3VycmVudF9jYWNoZV9jb250cm9sIj7mmL7npLpjYWNoZemHjee7mDwvaW5wdXQ+XG48aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJzaG93X2FsbF9jYWNoZV9jb250cm9sIj7mmL7npLpjYWNoZeWMuuWfnzwvaW5wdXQ+XG48aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJzaG93X2F0bGFzX2NvbnRyb2wiPuaYvuekuuaWh+Wtl+WbvumbhjwvaW5wdXQ+XG48L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz0iaGdyb3VwIj5cbjxkaXYgc3R5bGU9ImZsb2F0OmxlZnQ7d2lkdGg6Jyt0KydweDsgYm9yZGVyLXJpZ2h0OjFweCBzb2xpZCBibGFjayIgaWQ9InRyZWVfY29udGFpbmVyIj48L2Rpdj5cbjxkaXYgc3R5bGU9Im92ZXJmbG93OmhpZGRlbiI+XG48ZGl2IGlkPSJjb250ZW50X3Rvb2xiYXIiIHN0eWxlPSJ3aWR0aDoxMDAlO21hcmdpbjoxMHB4Ij48aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ2aXNpYmlsaXR5X2NvbnRyb2wiPuWPr+ingTwvaW5wdXQ+XG48aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJzaG93X2JvcmRlcl9jb250cm9sIj7mmL7npLrovrnmoYY8L2lucHV0PlxuPGJ1dHRvbiBpZD0ibG9nX2luZm9fY29udHJvbCI+5omT5Y2w5Yiw5o6n5Yi25Y+wPC9idXR0b24+XG48YnV0dG9uIGlkPSJlbmFibGVkX25vZGVfY2hhaW5fY29udHJvbCI+ZW5hYmxl6ZO+PC9idXR0b24+XG48YnV0dG9uIGlkPSJzaXplX2NoYWluX2NvbnRyb2wiPnNpemXpk748L2J1dHRvbj5cbjwvZGl2PjxkaXYgc3R5bGU9Im92ZXJmbG93OmF1dG8iPjx0YWJsZSBpZD0iY29udGVudF90YWJsZSIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2NjY2NjYztib3JkZXItY29sbGFwc2U6Y29sbGFwc2UiPjwvdGFibGU+XG48L2Rpdj48L2Rpdj5cbjwvZGl2PlxuPC9kaXY+JztlLmlubmVySFRNTD1pLHRoaXMuY29udGFpbmVyPWUsdGhpcy50cmVlPW5ldyBkaHRtbFhUcmVlT2JqZWN0KHRyZWVfY29udGFpbmVyLCIxMDAlIiwiMTAwJSIsMCksbm9kZV9mdW5jdGlvbmFsaXR5X2NvbnRyb2wub25jbGljaz1mdW5jdGlvbihlKXtlLnN0b3BQcm9wYWdhdGlvbigpLGxheWFhaXJfZGVidWdfdmlldy5vbl9pbnNwZWN0X2VsZW1lbnRfY2FsbGJhY2soKSxub2RlX2Z1bmN0aW9uYWxpdHlfY29udHJvbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiNGRkYiLG5vZGVfZnVuY3Rpb25hbGl0eV9jb250cm9sLnN0eWxlLmNvbG9yPSJyZ2IoMTA3LCAxNjMsIDI1NSkifX0sbGF5YWFpcl9kZWJ1Z192aWV3LnNldFRyZWU9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMudHJlZS5nZXRBbGxJdGVtc1dpdGhLaWRzKCkuc3BsaXQoIiwiKSxpPVtdLG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIG89dFtuXSxyPXRoaXMudHJlZS5nZXRPcGVuU3RhdGUobyk7MT09ciYmaS5wdXNoKG8pfXRoaXMudHJlZS5kZWxldGVDaGlsZEl0ZW1zKDApLHRoaXMudHJlZS5wYXJzZShlLCJqc29uIik7Zm9yKHZhciBuPTA7bjxpLmxlbmd0aDtuKyspdGhpcy50cmVlLm9wZW5JdGVtKGlbbl0pfSxsYXlhYWlyX2RlYnVnX3ZpZXcucmVzaXplPWZ1bmN0aW9uKGUsdCl7dGhpcy5jb250YWluZXIuc3R5bGUud2lkdGg9ZSsicHgiLHRoaXMuY29udGFpbmVyLnN0eWxlLmhlaWdodD10KyJweCI7dmFyIGk9dGhpcy5jb250YWluZXIub2Zmc2V0SGVpZ2h0LXRyZWVfY29udGFpbmVyLm9mZnNldFRvcDt0cmVlX2NvbnRhaW5lci5zdHlsZS5oZWlnaHQ9aSsicHgiLGNvbnRlbnRfdG9vbGJhci5zdHlsZS53aWR0aD1lLXRyZWVfY29udGFpbmVyLm9mZnNldFdpZHRoKyJweCIsY29udGVudF90YWJsZS5wYXJlbnRFbGVtZW50LnN0eWxlLmhlaWdodD1pLWNvbnRlbnRfdG9vbGJhci5vZmZzZXRIZWlnaHQtMjErInB4Iixjb250ZW50X3RhYmxlLnN0eWxlLndpZHRoPWUtdHJlZV9jb250YWluZXIub2Zmc2V0V2lkdGgtMTYrInB4In0sbGF5YWFpcl9kZWJ1Z192aWV3LmJvdW5jZVVwSW5zcGVjdEJ1dHRvbj1mdW5jdGlvbigpe25vZGVfZnVuY3Rpb25hbGl0eV9jb250cm9sLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iYnV0dG9uZmFjZSIsbm9kZV9mdW5jdGlvbmFsaXR5X2NvbnRyb2wuc3R5bGUuY29sb3I9ImJsYWNrIn0sbGF5YWFpcl9kZWJ1Z192aWV3LnNldFZhbHVlSW5wdXRIYW5kbGVyPWZ1bmN0aW9uKGUpe3RoaXMudmFsdWVfaW5wdXRfY2FsbGJhY2s9ZX0sbGF5YWFpcl9kZWJ1Z192aWV3LnNldFZhbHVlQ2hhbmdlSGFuZGxlcj1mdW5jdGlvbihlKXt0aGlzLnZhbHVlX2NoYW5nZV9jYWxsYmFjaz1lfSxsYXlhYWlyX2RlYnVnX3ZpZXcuYWRkQ29udGVudD1mdW5jdGlvbihlKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpO3QuaW5uZXJIVE1MPSc8dGQgc3R5bGU9IndpZHRoOjEwMHB4O2ZvbnQtc2l6ZToxM3B4O2JvcmRlcjoxcHggc29saWQgI0NDQztwYWRkaW5nLWxlZnQ6MTBweCI+JytlLmtleSsnPC90ZD5cbjx0ZCBzdHlsZT0id2lkdGg6MjAwcHg7Ym9yZGVyOjFweCBzb2xpZCAjQ0NDOyI+PGlucHV0IHN0eWxlPSJib3JkZXI6bm9uZTt3aWR0aDoxMDAlO2hlaWdodDoyNXB4O3BhZGRpbmctbGVmdDoxMHB4OyIgdmFsdWU9JytlLnZhbHVlKyI+PC90ZD4iLGNvbnRlbnRfdGFibGUuYXBwZW5kQ2hpbGQodCk7dmFyIGk9dC5sYXN0RWxlbWVudENoaWxkLmxhc3RFbGVtZW50Q2hpbGQ7aS5kYXRhPWUsaS5vbmlucHV0PWZ1bmN0aW9uKGUpe3RoaXMudmFsdWVfaW5wdXRfY2FsbGJhY2smJnRoaXMudmFsdWVfaW5wdXRfY2FsbGJhY2soZS50YXJnZXQuZGF0YSxlLnRhcmdldC52YWx1ZSl9LmJpbmQodGhpcyksaS5vbmNoYW5nZT1mdW5jdGlvbihlKXt0aGlzLnZhbHVlX2NoYW5nZV9jYWxsYmFjayYmdGhpcy52YWx1ZV9jaGFuZ2VfY2FsbGJhY2soZS50YXJnZXQuZGF0YSxlLnRhcmdldC52YWx1ZSl9LmJpbmQodGhpcyl9LGxheWFhaXJfZGVidWdfdmlldy5zZXRDb250ZW50cz1mdW5jdGlvbihlKXtjb250ZW50X3RhYmxlLmlubmVySFRNTD0iIjtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyl7dmFyIGk9ZVt0XTt0aGlzLmFkZENvbnRlbnQoaSl9fSxsYXlhYWlyX2RlYnVnX3ZpZXcuY2hhbmdlVmFsdWVBdD1mdW5jdGlvbihlLHQpe2NvbnRlbnRfdGFibGUuY2hpbGRyZW5bZV0ubGFzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZC52YWx1ZT10fSxsYXlhYWlyX2RlYnVnX3ZpZXcuY2hhbmdlVmFsdWVCeUxhYmVsPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBpPWNvbnRlbnRfdGFibGUuY2hpbGRyZW4ubGVuZ3RoLTE7aT49MDtpLS0paWYoY29udGVudF90YWJsZS5jaGlsZHJlbltpXS5maXJzdEVsZW1lbnRDaGlsZC5pbm5lclRleHQ9PWUpe2NvbnRlbnRfdGFibGUuY2hpbGRyZW5baV0ubGFzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZC52YWx1ZT10O2JyZWFrfX0sbGF5YWFpcl9kZWJ1Z192aWV3LnNldFZpc2liaWxpdHk9ZnVuY3Rpb24oZSl7dmlzaWJpbGl0eV9jb250cm9sLmNoZWNrZWQ9ISFlfSxsYXlhYWlyX2RlYnVnX3ZpZXcuc2V0U2hvd0RlYnVnQm9yZGVyPWZ1bmN0aW9uKGUpe3Nob3dfYm9yZGVyX2NvbnRyb2wuY2hlY2tlZD0hIWV9LGxheWFhaXJfZGVidWdfdmlldy5nZXRWaXNpYmlsaXR5PWZ1bmN0aW9uKCl7cmV0dXJuIHZpc2liaWxpdHlfY29udHJvbC5jaGVja2VkfSxsYXlhYWlyX2RlYnVnX3ZpZXcuZ2V0U2hvd0RlYnVnQm9yZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHNob3dfYm9yZGVyX2NvbnRyb2wuY2hlY2tlZH0sbGF5YWFpcl9kZWJ1Z192aWV3LmdldFNob3dDdXJyZW50Q2FjaGU9ZnVuY3Rpb24oKXtyZXR1cm4gc2hvd19jdXJyZW50X2NhY2hlX2NvbnRyb2wuY2hlY2tlZH0sbGF5YWFpcl9kZWJ1Z192aWV3LmdldFNob3dBbGxDYWNoZT1mdW5jdGlvbigpe3JldHVybiBzaG93X2FsbF9jYWNoZV9jb250cm9sLmNoZWNrZWR9LGxheWFhaXJfZGVidWdfdmlldy5nZXRTaG93QXRsYXM9ZnVuY3Rpb24oKXtyZXR1cm4gc2hvd19hdGxhc19jb250cm9sLmNoZWNrZWR9LGxheWFhaXJfZGVidWdfdmlldy5vbkluc3BlY3RFbGVtZW50PWZ1bmN0aW9uKGUpe3RoaXMub25faW5zcGVjdF9lbGVtZW50X2NhbGxiYWNrPWV9LGxheWFhaXJfZGVidWdfdmlldy5vbkxvZ0luZm89ZnVuY3Rpb24oZSl7bG9nX2luZm9fY29udHJvbC5vbmNsaWNrPWV9LGxheWFhaXJfZGVidWdfdmlldy5vblJlZnJlc2g9ZnVuY3Rpb24oZSl7cmVmcmVzaF9jb250cm9sLm9uY2xpY2s9ZX0sbGF5YWFpcl9kZWJ1Z192aWV3Lm9uUHJpbnRFbmFibGVkTm9kZUNoYWluPWZ1bmN0aW9uKGUpe2VuYWJsZWRfbm9kZV9jaGFpbl9jb250cm9sLm9uY2xpY2s9ZX0sbGF5YWFpcl9kZWJ1Z192aWV3Lm9uUHJpbnRTaXplQ2hhaW49ZnVuY3Rpb24oZSl7c2l6ZV9jaGFpbl9jb250cm9sLm9uY2xpY2s9ZX0sbGF5YWFpcl9kZWJ1Z192aWV3Lm9uVG9nZ2xlVmlzaWJpbGl0eT1mdW5jdGlvbihlKXt2aXNpYmlsaXR5X2NvbnRyb2wub25jaGFuZ2U9ZX0sbGF5YWFpcl9kZWJ1Z192aWV3Lm9uVG9nZ2xlRGVidWdCb3JkZXI9ZnVuY3Rpb24oZSl7c2hvd19ib3JkZXJfY29udHJvbC5vbmNoYW5nZT1lfSxsYXlhYWlyX2RlYnVnX3ZpZXcub25Ub2dnbGVTaG93Q3VycmVudENhY2hlPWZ1bmN0aW9uKGUpe3Nob3dfY3VycmVudF9jYWNoZV9jb250cm9sLm9uY2hhbmdlPWV9LGxheWFhaXJfZGVidWdfdmlldy5vblRvZ2dsZVNob3dBbGxDYWNoZT1mdW5jdGlvbihlKXtzaG93X2FsbF9jYWNoZV9jb250cm9sLm9uY2hhbmdlPWV9LGxheWFhaXJfZGVidWdfdmlldy5vblRvZ2dsZVNob3dBdGxhcz1mdW5jdGlvbihlKXtzaG93X2F0bGFzX2NvbnRyb2wub25jaGFuZ2U9ZX07";
  5813. return DivScripts;
  5814. })()
  5815. /**
  5816. *调试拾取显示对象类
  5817. *@author ww
  5818. */
  5819. //class laya.debug.tools.DisplayHook
  5820. var DisplayHook=(function(){
  5821. function DisplayHook(){
  5822. this.mouseX=NaN;
  5823. this.mouseY=NaN;
  5824. this._stage=null;
  5825. this._target=null;
  5826. this.isGetting=false;
  5827. this._matrix=new Matrix();
  5828. this._point=new Point();
  5829. this._rect=new Rectangle();
  5830. this._event=Event.EMPTY;
  5831. this._stage=Laya.stage;
  5832. this.init(Render.context.canvas);
  5833. }
  5834. __class(DisplayHook,'laya.debug.tools.DisplayHook');
  5835. var __proto=DisplayHook.prototype;
  5836. __proto.init=function(canvas){
  5837. var _$this=this;
  5838. if (Browser.window.navigator.msPointerEnabled){
  5839. canvas.style['-ms-content-zooming']='none';
  5840. canvas.style['-ms-touch-action']='none';
  5841. };
  5842. var _this=this;
  5843. Browser.document.addEventListener('mousedown',function(e){
  5844. _$this._event._stoped=false;
  5845. DisplayHook.isFirst=true;
  5846. _this.check(_this._stage,e.offsetX,e.offsetY,_this.onMouseDown,true,false);
  5847. },true);
  5848. Browser.document.addEventListener('touchstart',function(e){
  5849. _$this._event._stoped=false;
  5850. DisplayHook.isFirst=true;
  5851. var touches=e.changedTouches;
  5852. for (var i=0,n=touches.length;i < n;i++){
  5853. var touch=touches[i];
  5854. initEvent(touch,e);
  5855. _this.check(_this._stage,_this.mouseX,_this.mouseY,_this.onMouseDown,true,false);
  5856. }
  5857. },true);
  5858. function initEvent (e,event){
  5859. _this._event._stoped=false;
  5860. _this._event.nativeEvent=event || e;
  5861. _this._target=null;
  5862. if (e.offsetX){
  5863. _this.mouseX=e.offsetX;
  5864. _this.mouseY=e.offsetY;
  5865. }else {
  5866. _this.mouseX=e.clientX-Laya.stage.offset.x;
  5867. _this.mouseY=e.clientY-Laya.stage.offset.y;
  5868. }
  5869. }
  5870. }
  5871. __proto.onMouseMove=function(ele,hit){
  5872. this.sendEvent(ele,/*laya.events.Event.MOUSE_MOVE*/"mousemove");
  5873. return;
  5874. if (hit && ele !=this._stage && ele!==this._target){
  5875. if (this._target){
  5876. if (this._target.$_MOUSEOVER){
  5877. this._target.$_MOUSEOVER=false;
  5878. this._target.event(/*laya.events.Event.MOUSE_OUT*/"mouseout");
  5879. }
  5880. }
  5881. this._target=ele;
  5882. if (!ele.$_MOUSEOVER){
  5883. ele.$_MOUSEOVER=true;
  5884. this.sendEvent(ele,/*laya.events.Event.MOUSE_OVER*/"mouseover");
  5885. }
  5886. }else if (!hit && this._target && ele===this._target){
  5887. this._target=null;
  5888. if (ele.$_MOUSEOVER){
  5889. ele.$_MOUSEOVER=false;
  5890. this.sendEvent(ele,/*laya.events.Event.MOUSE_OUT*/"mouseout");
  5891. }
  5892. }
  5893. }
  5894. __proto.onMouseUp=function(ele,hit){
  5895. hit && this.sendEvent(ele,/*laya.events.Event.MOUSE_UP*/"mouseup");
  5896. }
  5897. __proto.onMouseDown=function(ele,hit){
  5898. if (hit){
  5899. ele.$_MOUSEDOWN=true;
  5900. this.sendEvent(ele,/*laya.events.Event.MOUSE_DOWN*/"mousedown");
  5901. }
  5902. }
  5903. __proto.sendEvent=function(ele,type){
  5904. if (!this._event._stoped){
  5905. ele.event(type,this._event.setTo(type,ele,ele));
  5906. if (type===/*laya.events.Event.MOUSE_UP*/"mouseup" && ele.$_MOUSEDOWN){
  5907. ele.$_MOUSEDOWN=false;
  5908. ele.event(/*laya.events.Event.CLICK*/"click",this._event.setTo(/*laya.events.Event.CLICK*/"click",ele,ele));
  5909. }
  5910. }
  5911. }
  5912. __proto.selectDisUnderMouse=function(){
  5913. DisplayHook.isFirst=true;
  5914. this.check(Laya.stage,Laya.stage.mouseX,Laya.stage.mouseY,null,true,false);
  5915. }
  5916. __proto.getDisUnderMouse=function(){
  5917. this.isGetting=true;
  5918. DisplayHook.isFirst=true;
  5919. DebugTool.target=null;
  5920. this.check(Laya.stage,Laya.stage.mouseX,Laya.stage.mouseY,null,true,false);
  5921. this.isGetting=false;
  5922. return DebugTool.target;
  5923. }
  5924. __proto.check=function(sp,mouseX,mouseY,callBack,hitTest,mouseEnable){
  5925. if (sp==DebugTool.debugLayer)return false;
  5926. if (sp==DebugInfoLayer.I)return false;
  5927. if (this.isGetting && sp==DebugInfoLayer.I)return false;
  5928. if (!sp.visible || sp.getSelfBounds().width<=0)return false;
  5929. var isHit=false;
  5930. mouseEnable=true
  5931. if (mouseEnable){
  5932. var graphicHit=false;
  5933. if (hitTest){
  5934. this._rect=sp.getBounds();
  5935. isHit=this._rect.contains(mouseX,mouseY);
  5936. this._point.setTo(mouseX,mouseY);
  5937. sp.fromParentPoint(this._point);
  5938. mouseX=this._point.x;
  5939. mouseY=this._point.y;
  5940. }
  5941. if (isHit){
  5942. var flag=false;
  5943. for (var i=sp._children.length-1;i >-1;i--){
  5944. var child=sp._children[i];
  5945. (flag=this.check(child,mouseX,mouseY,callBack,hitTest,true));
  5946. if (flag)break ;
  5947. }
  5948. graphicHit=sp.getGraphicBounds().contains(mouseX,mouseY);
  5949. isHit=flag||graphicHit;
  5950. if(isHit&&!flag&&DisplayHook.isFirst){
  5951. DisplayHook.isFirst=false;
  5952. if(! ((sp instanceof laya.debug.tools.debugUI.DButton ))){
  5953. DebugTool.target=sp;
  5954. if (!this.isGetting){
  5955. DebugTool.autoWork();
  5956. Notice.notify("ItemClicked",sp);
  5957. }
  5958. }
  5959. }
  5960. }
  5961. }
  5962. return isHit;
  5963. }
  5964. DisplayHook.initMe=function(){
  5965. if(!DisplayHook.instance){
  5966. DisplayHook.instance=new DisplayHook();
  5967. }
  5968. }
  5969. DisplayHook.ITEM_CLICKED="ItemClicked";
  5970. DisplayHook.instance=null;
  5971. DisplayHook.isFirst=false;
  5972. return DisplayHook;
  5973. })()
  5974. /**
  5975. *...
  5976. *@author ww
  5977. */
  5978. //class laya.debug.tools.ClickSelectTool
  5979. var ClickSelectTool=(function(){
  5980. function ClickSelectTool(){
  5981. this.completeHandler=null;
  5982. this.tSelectTar=null;
  5983. this._selectTip=new Sprite();
  5984. this._selectTip.setSelfBounds(new Rectangle(0,0,0,0));
  5985. Notice.listen(/*laya.debug.tools.DisplayHook.ITEM_CLICKED*/"ItemClicked",this,this.itemClicked);
  5986. }
  5987. __class(ClickSelectTool,'laya.debug.tools.ClickSelectTool');
  5988. var __proto=ClickSelectTool.prototype;
  5989. __proto.beginClickSelect=function(complete){
  5990. this.completeHandler=complete;
  5991. ClickSelectTool.isClickSelectState=true;
  5992. this.clickSelectChange();
  5993. }
  5994. __proto.clickSelectChange=function(){
  5995. if (!Browser.onPC)return;
  5996. this.tSelectTar=null;
  5997. this.clearSelectTip();
  5998. if (ClickSelectTool.isClickSelectState){
  5999. Laya.timer.loop(200,this,this.updateSelectTar,null,true);
  6000. }else{
  6001. Laya.timer.clear(this,this.updateSelectTar);
  6002. }
  6003. }
  6004. __proto.clearSelectTip=function(){
  6005. this._selectTip.removeSelf();
  6006. }
  6007. __proto.updateSelectTar=function(){
  6008. this.clearSelectTip();
  6009. this.tSelectTar=DisplayHook.instance.getDisUnderMouse();
  6010. if (!this.tSelectTar){
  6011. return;
  6012. }
  6013. if (DebugInfoLayer.I.isDebugItem(this.tSelectTar))return;
  6014. var g;
  6015. g=this._selectTip.graphics;
  6016. g.clear();
  6017. var rec;
  6018. rec=NodeUtils.getGRec(this.tSelectTar);
  6019. DebugInfoLayer.I.popLayer.addChild(this._selectTip);
  6020. g.drawRect(0,0,rec.width,rec.height,null,DebugConsts.CLICK_SELECT_COLOR,2);
  6021. this._selectTip.pos(rec.x,rec.y);
  6022. }
  6023. __proto.itemClicked=function(tar){
  6024. if (!ClickSelectTool.isClickSelectState)return;
  6025. if (ClickSelectTool.ignoreDebugTool){
  6026. if (DebugInfoLayer.I.isDebugItem(tar))return;
  6027. }
  6028. DebugTool.showDisBound(tar);
  6029. if (this.completeHandler){
  6030. this.completeHandler.runWith(tar);
  6031. }
  6032. ClickSelectTool.isClickSelectState=false;
  6033. this.clickSelectChange();
  6034. }
  6035. __getset(1,ClickSelectTool,'I',function(){
  6036. if (!ClickSelectTool._I)ClickSelectTool._I=new ClickSelectTool();
  6037. return ClickSelectTool._I;
  6038. });
  6039. ClickSelectTool._I=null;
  6040. ClickSelectTool.isClickSelectState=false;
  6041. ClickSelectTool.ignoreDebugTool=false;
  6042. return ClickSelectTool;
  6043. })()
  6044. /**
  6045. *
  6046. *@author ww
  6047. *@version 1.0
  6048. *
  6049. *@created 2015-10-30 下午1:06:56
  6050. */
  6051. //class laya.debug.tools.FilterTool
  6052. var FilterTool=(function(){
  6053. function FilterTool(){}
  6054. __class(FilterTool,'laya.debug.tools.FilterTool');
  6055. FilterTool.getArrByFilter=function(arr,filterFun){
  6056. var i=0,len=arr.length;
  6057. var rst=[];
  6058. for(i=0;i<len;i++){
  6059. if(filterFun(arr[i]))rst.push(arr[i]);
  6060. }
  6061. return rst;
  6062. }
  6063. FilterTool.getArr=function(arr,sign,value){
  6064. var i=0,len=arr.length;
  6065. var rst=[];
  6066. for(i=0;i<len;i++){
  6067. if(arr[i][sign]==value)rst.push(arr[i]);
  6068. }
  6069. return rst;
  6070. }
  6071. return FilterTool;
  6072. })()
  6073. /**
  6074. *本类用于显示对象值变化过程
  6075. *@author ww
  6076. *@version 1.0
  6077. *
  6078. *@created 2015-10-23 上午10:41:50
  6079. */
  6080. //class laya.debug.tools.DifferTool
  6081. var DifferTool=(function(){
  6082. function DifferTool(sign,autoTrace){
  6083. this.autoTrace=true;
  6084. this.sign="";
  6085. this.obj=null;
  6086. (sign===void 0)&& (sign="");
  6087. (autoTrace===void 0)&& (autoTrace=true);
  6088. this.sign=sign;
  6089. this.autoTrace=autoTrace;
  6090. }
  6091. __class(DifferTool,'laya.debug.tools.DifferTool');
  6092. var __proto=DifferTool.prototype;
  6093. __proto.update=function(data,msg){
  6094. if(msg){
  6095. console.log(msg);
  6096. };
  6097. var tObj=ObjectTools.copyObj(data);
  6098. if(!this.obj)this.obj={};
  6099. var rst;
  6100. rst=ObjectTools.differ(this.obj,tObj);
  6101. this.obj=tObj;
  6102. if(this.autoTrace){
  6103. console.log(this.sign+" differ:");
  6104. ObjectTools.traceDifferObj(rst);
  6105. }
  6106. return rst;
  6107. }
  6108. DifferTool.differ=function(sign,data,msg){
  6109. if(!DifferTool._differO[sign])DifferTool._differO[sign]=new DifferTool(sign,true);
  6110. var tDiffer;
  6111. tDiffer=DifferTool._differO[sign];
  6112. return tDiffer.update(data,msg);
  6113. }
  6114. DifferTool._differO={};
  6115. return DifferTool;
  6116. })()
  6117. /**
  6118. *本类用于操作html对象
  6119. *@author ww
  6120. */
  6121. //class laya.debug.tools.JSTools
  6122. var JSTools=(function(){
  6123. function JSTools(){}
  6124. __class(JSTools,'laya.debug.tools.JSTools');
  6125. JSTools.showToBody=function(el,x,y){
  6126. (x===void 0)&& (x=0);
  6127. (y===void 0)&& (y=0);
  6128. Browser.document.body.appendChild(el);
  6129. var style;
  6130. style=el.style;
  6131. style.position="absolute";
  6132. style.top=y+"px";
  6133. style.left=x+"px";
  6134. }
  6135. JSTools.showToParent=function(el,x,y,parent){
  6136. (x===void 0)&& (x=0);
  6137. (y===void 0)&& (y=0);
  6138. parent.appendChild(el);
  6139. var style;
  6140. style=el.style;
  6141. style.position="absolute";
  6142. style.top=y+"px";
  6143. style.left=x+"px";
  6144. }
  6145. JSTools.addToBody=function(el){
  6146. Browser.document.body.appendChild(el);
  6147. }
  6148. JSTools.setPos=function(el,x,y){
  6149. var style;
  6150. style=el.style;
  6151. style.top=y+"px";
  6152. style.left=x+"px";
  6153. }
  6154. JSTools.setSize=function(el,width,height){
  6155. var style;
  6156. style=el.style;
  6157. style.width=width+"px";
  6158. style.height=height+"px";
  6159. }
  6160. JSTools.setTransform=function(el,mat){
  6161. var style;
  6162. style=el.style;
  6163. style.transformOrigin=style.webkitTransformOrigin=style.msTransformOrigin=style.mozTransformOrigin=style.oTransformOrigin="0px 0px 0px";
  6164. style.transform=style.webkitTransform=style.msTransform=style.mozTransform=style.oTransform="matrix("+mat.toString()+")";
  6165. }
  6166. JSTools.noMouseEvent=function(el){
  6167. var style;
  6168. style=el.style;
  6169. style["pointer-events"]="none";
  6170. }
  6171. JSTools.setMouseEnable=function(el,enable){
  6172. var style;
  6173. style=el.style;
  6174. style["pointer-events"]=enable?"auto":"none";
  6175. }
  6176. JSTools.setZIndex=function(el,zIndex){
  6177. var style;
  6178. style=el.style;
  6179. style["z-index"]=zIndex;
  6180. }
  6181. JSTools.showAboveSprite=function(el,sprite,dx,dy){
  6182. (dx===void 0)&& (dx=0);
  6183. (dy===void 0)&& (dy=0);
  6184. var pos;
  6185. pos=new Point();
  6186. pos=sprite.localToGlobal(pos);
  6187. pos.x+=dx;
  6188. pos.y+=dy;
  6189. pos.x+=Laya.stage.offset.x;
  6190. pos.y+=Laya.stage.offset.y;
  6191. JSTools.showToBody(el,pos.x,pos.y);
  6192. }
  6193. JSTools.removeElement=function(el){
  6194. Browser.removeElement(el);
  6195. }
  6196. JSTools.isElementInDom=function(el){
  6197. return el && el.parentNode;
  6198. }
  6199. JSTools.getImageSpriteByFile=function(file,width,height){
  6200. (width===void 0)&& (width=0);
  6201. (height===void 0)&& (height=0);
  6202. var reader;
  6203. /*__JS__ */reader=new FileReader();;
  6204. reader.readAsDataURL(file);
  6205. var sprite;
  6206. sprite=new Sprite();
  6207. reader.onload=function (e){
  6208. var txt;
  6209. txt=new Texture();
  6210. txt.load(reader.result);
  6211. sprite.graphics.drawTexture(txt,0,0,width,height);
  6212. }
  6213. return sprite;
  6214. }
  6215. JSTools.getPixelRatio=function(){
  6216. if (JSTools._pixelRatio > 0)return JSTools._pixelRatio;
  6217. var canvas=Browser.createElement("canvas");
  6218. var context=canvas.getContext('2d');
  6219. var devicePixelRatio=Browser.window.devicePixelRatio || 1;
  6220. var backingStoreRatio=context.webkitBackingStorePixelRatio ||
  6221. context.mozBackingStorePixelRatio ||
  6222. context.msBackingStorePixelRatio ||
  6223. context.oBackingStorePixelRatio ||
  6224. context.backingStorePixelRatio || 1;
  6225. var ratio=devicePixelRatio / backingStoreRatio;
  6226. console.log("pixelRatioc:",ratio);
  6227. JSTools._pixelRatio=ratio;
  6228. return ratio;
  6229. }
  6230. JSTools._pixelRatio=-1;
  6231. return JSTools;
  6232. })()
  6233. /**
  6234. *XML转Object类
  6235. *@author ww
  6236. *
  6237. */
  6238. //class laya.debug.tools.XML2Object
  6239. var XML2Object=(function(){
  6240. function XML2Object(){}
  6241. __class(XML2Object,'laya.debug.tools.XML2Object');
  6242. __getset(1,XML2Object,'arrays',function(){
  6243. if(!XML2Object._arrays){
  6244. XML2Object._arrays=[];
  6245. }
  6246. return XML2Object._arrays;
  6247. },function(a){
  6248. XML2Object._arrays=a;
  6249. });
  6250. XML2Object.parse=function(node,isFirst){
  6251. (isFirst===void 0)&& (isFirst=true);
  6252. var obj={};
  6253. if(isFirst)
  6254. obj.Name=node.localName;
  6255. var numOfChilds=node.children.length;
  6256. var childs=[];
  6257. var children={};
  6258. obj.c=children;
  6259. obj.cList=childs;
  6260. for(var i=0;i<numOfChilds;i++){
  6261. var childNode=node.children[i];
  6262. var childNodeName=childNode.localName;
  6263. var value;
  6264. var numOfAttributes
  6265. value=XML2Object.parse(childNode,true);
  6266. childs.push(value);
  6267. if(children[childNodeName]){
  6268. if(XML2Object.getTypeof(children[childNodeName])=="array"){
  6269. children[childNodeName].push(value);
  6270. }else {
  6271. children[childNodeName]=[children[childNodeName],value];
  6272. }
  6273. }else if(XML2Object.isArray(childNodeName)){
  6274. children[childNodeName]=[value];
  6275. }else {
  6276. children[childNodeName]=value;
  6277. }
  6278. }
  6279. numOfAttributes=0;
  6280. if(node.attributes){
  6281. numOfAttributes=node.attributes.length;
  6282. var prop={};
  6283. obj.p=prop;
  6284. for(i=0;i<numOfAttributes;i++){
  6285. prop[node.attributes[i].name.toString()]=String(node.attributes[i].nodeValue);
  6286. }
  6287. }
  6288. if(numOfChilds==0){
  6289. if(numOfAttributes==0){
  6290. obj="";
  6291. }else {}
  6292. }
  6293. return obj;
  6294. }
  6295. XML2Object.getArr=function(v){
  6296. if(!v)return [];
  6297. if(XML2Object.getTypeof(v)=="array")return v;
  6298. return [v];
  6299. }
  6300. XML2Object.isArray=function(nodeName){
  6301. var numOfArrays=XML2Object._arrays ? XML2Object._arrays.length :0;
  6302. for(var i=0;i<numOfArrays;i++){
  6303. if(nodeName==XML2Object._arrays[i]){
  6304. return true;
  6305. }
  6306. }
  6307. return false;
  6308. }
  6309. XML2Object.getTypeof=function(o){
  6310. if(typeof(o)=="object"){
  6311. if(o.length==null){
  6312. return "object";
  6313. }else if(typeof(o.length)=="number"){
  6314. return "array";
  6315. }else {
  6316. return "object";
  6317. }
  6318. }else {
  6319. return typeof(o);
  6320. }
  6321. }
  6322. XML2Object._arrays=null;
  6323. return XML2Object;
  6324. })()
  6325. /**
  6326. *简单的显示对象对象池
  6327. *从父容器上移除时即被视为可被重用
  6328. *@author ww
  6329. *@version 1.0
  6330. *
  6331. *@created 2015-11-13 下午8:05:13
  6332. */
  6333. //class laya.debug.tools.DisPool
  6334. var DisPool=(function(){
  6335. function DisPool(){}
  6336. __class(DisPool,'laya.debug.tools.DisPool');
  6337. DisPool.getDis=function(clz){
  6338. var clzName;
  6339. clzName=ClassTool.getClassNameByClz(clz);
  6340. if(!DisPool._objDic[clzName]){
  6341. DisPool._objDic[clzName]=[];
  6342. };
  6343. var disList;
  6344. disList=DisPool._objDic[clzName];
  6345. var i=0,len=0;
  6346. len=disList.length;
  6347. for(i=0;i<len;i++){
  6348. if(!disList[i].parent){
  6349. return disList[i];
  6350. }
  6351. }
  6352. disList.push(new clz());
  6353. return disList[disList.length-1];
  6354. }
  6355. DisPool._objDic={};
  6356. return DisPool;
  6357. })()
  6358. /**
  6359. *类实例创建分析工具
  6360. *@author ww
  6361. *@version 1.0
  6362. *
  6363. *@created 2015-9-25 下午3:31:46
  6364. */
  6365. //class laya.debug.tools.RunProfile
  6366. var RunProfile=(function(){
  6367. function RunProfile(){}
  6368. __class(RunProfile,'laya.debug.tools.RunProfile');
  6369. RunProfile.run=function(funName,callLen){
  6370. (callLen===void 0)&& (callLen=3);
  6371. var tCount;
  6372. if(!RunProfile.infoDic.hasOwnProperty(funName)){
  6373. RunProfile.infoDic[funName]=new CountTool();
  6374. }
  6375. tCount=RunProfile.infoDic[funName];
  6376. var msg;
  6377. msg=TraceTool.getCallLoc(callLen)+"\n"+TraceTool.getCallStack(1,callLen-3);
  6378. tCount.add(msg);
  6379. if(RunProfile._runShowDic[funName]){
  6380. console.log("Create:"+funName);
  6381. console.log(msg);
  6382. }
  6383. }
  6384. RunProfile.showClassCreate=function(funName){
  6385. RunProfile._runShowDic[funName]=true;
  6386. }
  6387. RunProfile.hideClassCreate=function(funName){
  6388. RunProfile._runShowDic[funName]=false;
  6389. }
  6390. RunProfile.getRunInfo=function(funName){
  6391. var rst;
  6392. rst=RunProfile.infoDic[funName];
  6393. if(rst){
  6394. }
  6395. return RunProfile.infoDic[funName];
  6396. }
  6397. RunProfile.runTest=function(fun,count,sign){
  6398. (sign===void 0)&& (sign="runTest");
  6399. DTrace.timeStart(sign);
  6400. var i=0;
  6401. for(i=0;i<count;i++){
  6402. fun();
  6403. }
  6404. DTrace.timeEnd(sign);
  6405. }
  6406. RunProfile.runTest2=function(fun,count,sign){
  6407. (sign===void 0)&& (sign="runTest");
  6408. var preTime=NaN;
  6409. preTime=Browser.now();
  6410. var i=0;
  6411. for(i=0;i<count;i++){
  6412. fun();
  6413. }
  6414. return Browser.now()-preTime;
  6415. }
  6416. RunProfile.infoDic={};
  6417. RunProfile._runShowDic={};
  6418. return RunProfile;
  6419. })()
  6420. /**
  6421. *...
  6422. *@author ww
  6423. */
  6424. //class laya.debug.tools.CanvasTools
  6425. var CanvasTools=(function(){
  6426. function CanvasTools(){}
  6427. __class(CanvasTools,'laya.debug.tools.CanvasTools');
  6428. CanvasTools.createCanvas=function(width,height){
  6429. var rst=new HTMLCanvas("2D");
  6430. rst.getContext('2d');
  6431. rst.size(width,height);
  6432. return rst;
  6433. }
  6434. CanvasTools.renderSpriteToCanvas=function(sprite,canvas,offsetX,offsetY){
  6435. RenderSprite.renders[sprite._renderType]._fun(sprite,canvas.context,offsetX,offsetY);
  6436. }
  6437. CanvasTools.getImageDataFromCanvas=function(canvas,x,y,width,height){
  6438. (x===void 0)&& (x=0);
  6439. (y===void 0)&& (y=0);
  6440. (width===void 0)&& (width=0);
  6441. (height===void 0)&& (height=0);
  6442. if (width <=0)
  6443. width=canvas.width;
  6444. if (height <=0)
  6445. height=canvas.height;
  6446. var imgdata=canvas.context.getImageData(x,y,width,height);
  6447. return imgdata;
  6448. }
  6449. CanvasTools.getImageDataFromCanvasByRec=function(canvas,rec){
  6450. var imgdata=canvas.context.getImageData(rec.x,rec.y,rec.width,rec.height);
  6451. return imgdata;
  6452. }
  6453. CanvasTools.getDifferCount=function(imageData1,imageData2){
  6454. var data1=imageData1.data;
  6455. var data2=imageData2.data;
  6456. var differCount=0;
  6457. differCount=0;
  6458. CanvasTools.walkImageData(imageData1,myWalkFun);
  6459. return differCount;
  6460. function myWalkFun (i,j,tarPos,data){
  6461. if (!CanvasTools.isPoinSame(tarPos,data1,data2))differCount++;
  6462. }
  6463. }
  6464. CanvasTools.getDifferRate=function(imageData1,imageData2){
  6465. return CanvasTools.getDifferCount(imageData1,imageData2)/(imageData1.width *imageData1.height);
  6466. }
  6467. CanvasTools.getCanvasDisRec=function(canvas){
  6468. var rst;
  6469. rst=new Rectangle;
  6470. var imgdata;
  6471. imgdata=CanvasTools.getImageDataFromCanvas(canvas,0,0);
  6472. var maxX=0;
  6473. var minX=0;
  6474. var maxY=0;
  6475. var minY=0;
  6476. maxX=maxY=0;
  6477. minX=imgdata.width;
  6478. minY=imgdata.height;
  6479. var i=0,iLen=0;
  6480. var j=0,jLen=0;
  6481. iLen=imgdata.width;
  6482. jLen=imgdata.height;
  6483. var data;
  6484. data=imgdata.data;
  6485. var tarPos=0;
  6486. for (j=0;j < jLen;j++){
  6487. for (i=0;i < iLen;i++){
  6488. if (!CanvasTools.isEmptyPoint(data,tarPos)){
  6489. if (minX > i)
  6490. minX=i;
  6491. if (maxX < i)
  6492. maxX=i;
  6493. if (minY > j)
  6494. minY=j;
  6495. if (maxY < j)
  6496. maxY=j;
  6497. }
  6498. tarPos+=4;
  6499. }
  6500. }
  6501. rst.setTo(minX,minY,maxX-minX+1,maxY-minY+1);
  6502. return rst;
  6503. }
  6504. CanvasTools.fillCanvasRec=function(canvas,rec,color){
  6505. var ctx=canvas.context;
  6506. ctx.fillStyle=color;
  6507. ctx.fillRect(rec.x,rec.y,rec.width,rec.height);
  6508. }
  6509. CanvasTools.isEmptyPoint=function(data,pos){
  6510. if (data[pos]==0 && data[pos+1]==0 && data[pos+2]==0 && data[pos+3]==0){
  6511. return true;
  6512. }
  6513. else{
  6514. return false;
  6515. }
  6516. }
  6517. CanvasTools.isPoinSame=function(pos,data1,data2){
  6518. if (data1[pos]==data2[pos] && data1[pos+1]==data2[pos+1] && data1[pos+2]==data2[pos+2] && data1[pos+3]==data2[pos+3]){
  6519. return true;
  6520. }
  6521. else{
  6522. return false;
  6523. }
  6524. }
  6525. CanvasTools.walkImageData=function(imgdata,walkFun){
  6526. var i=0,iLen=0;
  6527. var j=0,jLen=0;
  6528. iLen=imgdata.width;
  6529. jLen=imgdata.height;
  6530. var tarPos=0;
  6531. var data=imgdata.data;
  6532. for (i=0;i < iLen;i++){
  6533. for (j=0;j < jLen;j++){
  6534. walkFun(i,j,tarPos,data);
  6535. tarPos+=4;
  6536. }
  6537. }
  6538. }
  6539. CanvasTools.getSpriteByCanvas=function(canvas){
  6540. var rst;
  6541. rst=new Sprite();
  6542. rst.graphics.drawTexture(new Texture(canvas),0,0,canvas.width,canvas.height);
  6543. return rst;
  6544. }
  6545. CanvasTools.renderSpritesToCanvas=function(canvas,sprites,offx,offy,startIndex){
  6546. (offx===void 0)&& (offx=0);
  6547. (offy===void 0)&& (offy=0);
  6548. (startIndex===void 0)&& (startIndex=0);
  6549. var i=0,len=0;
  6550. len=sprites.length;
  6551. for (i=startIndex;i < len;i++){
  6552. CanvasTools.renderSpriteToCanvas(sprites[i],canvas,offx,offy);
  6553. }
  6554. }
  6555. CanvasTools.clearCanvas=function(canvas){
  6556. var preWidth=NaN;
  6557. var preHeight=NaN;
  6558. preWidth=canvas.width;
  6559. preHeight=canvas.height;
  6560. canvas.size(preWidth+1,preHeight);
  6561. canvas.size(preWidth,preHeight);
  6562. }
  6563. CanvasTools.getImagePixels=function(x,y,width,data,colorLen){
  6564. (colorLen===void 0)&& (colorLen=4);
  6565. var pos=0;
  6566. pos=(x *width+y)*colorLen;
  6567. var i=0,len=0;
  6568. var rst;
  6569. rst=[];
  6570. len=colorLen;
  6571. for (i=0;i < len;i++){
  6572. rst.push(data[pos+i]);
  6573. }
  6574. return rst;
  6575. }
  6576. return CanvasTools;
  6577. })()
  6578. /**
  6579. *
  6580. *@author ww
  6581. *@version 1.0
  6582. *
  6583. *@created 2015-9-28 上午10:39:47
  6584. */
  6585. //class laya.debug.tools.DTrace
  6586. var DTrace=(function(){
  6587. function DTrace(){}
  6588. __class(DTrace,'laya.debug.tools.DTrace');
  6589. DTrace.getArgArr=function(arg){
  6590. var rst;
  6591. rst=[];
  6592. var i=0,len=arg.length;
  6593. for(i=0;i<len;i++){
  6594. rst.push(arg[i]);
  6595. }
  6596. return rst;
  6597. }
  6598. DTrace.dTrace=function(__arg){
  6599. var arg=arguments;
  6600. arg=DTrace.getArgArr(arg);
  6601. arg.push(TraceTool.getCallLoc(2));
  6602. /*__JS__ */console.log.apply(console,arg);
  6603. var str;
  6604. str=arg.join(" ");
  6605. }
  6606. DTrace.timeStart=function(sign){
  6607. /*__JS__ */console.time(sign);;
  6608. }
  6609. DTrace.timeEnd=function(sign){
  6610. /*__JS__ */console.timeEnd(sign);;
  6611. }
  6612. DTrace.traceTable=function(data){
  6613. /*__JS__ */console.table(data);;
  6614. }
  6615. return DTrace;
  6616. })()
  6617. /**
  6618. *
  6619. *@author ww
  6620. *@version 1.0
  6621. *
  6622. *@created 2016-6-24 下午6:07:30
  6623. */
  6624. //class laya.debug.tools.SingleTool
  6625. var SingleTool=(function(){
  6626. function SingleTool(){
  6627. this._objDic={};
  6628. }
  6629. __class(SingleTool,'laya.debug.tools.SingleTool');
  6630. var __proto=SingleTool.prototype;
  6631. __proto.getArr=function(sign){
  6632. var dic;
  6633. dic=this.getTypeDic("Array");
  6634. if(!dic[sign])dic[sign]=[];
  6635. return dic[sign];
  6636. }
  6637. __proto.getObject=function(sign){
  6638. var dic;
  6639. dic=this.getTypeDic("Object");
  6640. if(!dic[sign])dic[sign]={};
  6641. return dic[sign];
  6642. }
  6643. __proto.getByClass=function(sign,clzSign,clz){
  6644. var dic;
  6645. dic=this.getTypeDic(clzSign);
  6646. if(!dic[sign])dic[sign]=new clz();
  6647. return dic[sign];
  6648. }
  6649. __proto.getTypeDic=function(type){
  6650. if(!this._objDic[type])this._objDic[type]={};
  6651. return this._objDic[type];
  6652. }
  6653. __static(SingleTool,
  6654. ['I',function(){return this.I=new SingleTool();}
  6655. ]);
  6656. return SingleTool;
  6657. })()
  6658. /**
  6659. *
  6660. *@author ww
  6661. *@version 1.0
  6662. *
  6663. *@created 2017-3-2 下午12:11:59
  6664. */
  6665. //class laya.debug.tools.CallLaterTool
  6666. var CallLaterTool=(function(){
  6667. function CallLaterTool(){
  6668. this._getHandler=null;
  6669. this._indexHandler=null;
  6670. this._pool=null;
  6671. this._laters=null;
  6672. }
  6673. __class(CallLaterTool,'laya.debug.tools.CallLaterTool');
  6674. var __proto=CallLaterTool.prototype;
  6675. /**
  6676. *延迟执行。
  6677. *@param caller 执行域(this)。
  6678. *@param method 定时器回调函数。
  6679. *@param args 回调参数。
  6680. */
  6681. __proto.callLater=function(caller,method,args){
  6682. if (this._getHandler(caller,method)==null){
  6683. CallLaterTool.oldCallLater.call(this,caller,method,args);
  6684. if(CallLaterTool._isRecording){
  6685. CallLaterTool._recordedCallLaters.push(this._laters[this._laters.length-1]);
  6686. }
  6687. }
  6688. }
  6689. CallLaterTool.initCallLaterRecorder=function(){
  6690. if(CallLaterTool.oldCallLater)return;
  6691. CallLaterTool.oldCallLater=Laya.timer["callLater"];
  6692. Laya.timer["callLater"]=CallLaterTool["prototype"]["callLater"];
  6693. }
  6694. CallLaterTool.beginRecordCallLater=function(){
  6695. CallLaterTool.initCallLaterRecorder();
  6696. CallLaterTool._isRecording=true;
  6697. }
  6698. CallLaterTool.runRecordedCallLaters=function(){
  6699. CallLaterTool._isRecording=false;
  6700. var timer;
  6701. timer=Laya.timer;
  6702. var laters=timer["_laters"];
  6703. laters=CallLaterTool._recordedCallLaters;
  6704. for (var i=0,n=laters.length-1;i <=n;i++){
  6705. var handler=laters[i];
  6706. if(CallLaterTool._recordedCallLaters.indexOf(handler)<0)continue ;
  6707. handler.method!==null && handler.run(false);
  6708. timer["_recoverHandler"](handler);
  6709. laters.splice(i,1);
  6710. }
  6711. CallLaterTool._recordedCallLaters.length=0;
  6712. }
  6713. CallLaterTool._recordedCallLaters=[];
  6714. CallLaterTool._isRecording=false;
  6715. CallLaterTool.oldCallLater=null;
  6716. return CallLaterTool;
  6717. })()
  6718. /**
  6719. *
  6720. *@author ww
  6721. *@version 1.0
  6722. *
  6723. *@created 2015-9-24 下午6:37:56
  6724. */
  6725. //class laya.debug.tools.CountTool
  6726. var CountTool=(function(){
  6727. function CountTool(){
  6728. this.data={};
  6729. this.preO={};
  6730. this.changeO={};
  6731. this.count=0;
  6732. }
  6733. __class(CountTool,'laya.debug.tools.CountTool');
  6734. var __proto=CountTool.prototype;
  6735. __proto.reset=function(){
  6736. this.data={};
  6737. this.count=0;
  6738. }
  6739. __proto.add=function(name,num){
  6740. (num===void 0)&& (num=1);
  6741. this.count++;
  6742. if(!this.data.hasOwnProperty(name)){
  6743. this.data[name]=0;
  6744. }
  6745. this.data[name]=this.data[name]+num;
  6746. }
  6747. __proto.getKeyCount=function(key){
  6748. if(!this.data.hasOwnProperty(key)){
  6749. this.data[key]=0;
  6750. }
  6751. return this.data[key];
  6752. }
  6753. __proto.getKeyChange=function(key){
  6754. if (!this.changeO[key])return 0;
  6755. return this.changeO[key];
  6756. }
  6757. __proto.record=function(){
  6758. var key;
  6759. for (key in this.changeO){
  6760. this.changeO[key]=0;
  6761. }
  6762. for (key in this.data){
  6763. if (!this.preO[key])this.preO[key]=0;
  6764. this.changeO[key]=this.data[key]-this.preO[key];
  6765. this.preO[key]=this.data[key]
  6766. }
  6767. }
  6768. __proto.getCount=function(dataO){
  6769. var rst=0;
  6770. var key;
  6771. for (key in dataO){
  6772. rst+=dataO[key];
  6773. }
  6774. return rst;
  6775. }
  6776. __proto.traceSelf=function(dataO){
  6777. if (!dataO)dataO=this.data;
  6778. var tCount=0;
  6779. tCount=this.getCount(dataO);
  6780. console.log("total:"+tCount);
  6781. return "total:"+tCount+"\n"+TraceTool.traceObj(dataO);
  6782. }
  6783. __proto.traceSelfR=function(dataO){
  6784. if (!dataO)dataO=this.data;
  6785. var tCount=0;
  6786. tCount=this.getCount(dataO);
  6787. console.log("total:"+tCount);
  6788. return "total:"+tCount+"\n"+TraceTool.traceObjR(dataO);
  6789. }
  6790. return CountTool;
  6791. })()
  6792. /**
  6793. *...
  6794. *@author ww
  6795. */
  6796. //class laya.debug.tools.resizer.SimpleResizer
  6797. var SimpleResizer=(function(){
  6798. function SimpleResizer(){}
  6799. __class(SimpleResizer,'laya.debug.tools.resizer.SimpleResizer');
  6800. SimpleResizer.setResizeAble=function(clickItem,tar,minWidth,minHeight){
  6801. (minWidth===void 0)&& (minWidth=150);
  6802. (minHeight===void 0)&& (minHeight=150);
  6803. clickItem.on(/*laya.events.Event.MOUSE_DOWN*/"mousedown",null,SimpleResizer.onMouseDown,[tar,minWidth,minHeight]);
  6804. }
  6805. SimpleResizer.onMouseDown=function(tar,minWidth,minHeight,e){
  6806. SimpleResizer.clearEvents();
  6807. if (!tar)return;
  6808. SimpleResizer.preMousePoint.setTo(Laya.stage.mouseX,Laya.stage.mouseY);
  6809. SimpleResizer.preTarSize.setTo(tar.width,tar.height);
  6810. SimpleResizer.preScale.setTo(1,1);
  6811. var rTar;
  6812. rTar=tar;
  6813. while (rTar&&rTar!=Laya.stage){
  6814. SimpleResizer.preScale.x *=rTar.scaleX;
  6815. SimpleResizer.preScale.y *=rTar.scaleY;
  6816. rTar=rTar.parent;
  6817. }
  6818. Laya.stage.on(/*laya.events.Event.MOUSE_UP*/"mouseup",null,SimpleResizer.onMouseMoveEnd);
  6819. Laya.timer.loop(100,null,SimpleResizer.onMouseMoving,[tar,minWidth,minHeight]);
  6820. }
  6821. SimpleResizer.onMouseMoving=function(tar,minWidth,minHeight,e){
  6822. var tWidth=(Laya.stage.mouseX-SimpleResizer.preMousePoint.x)/ SimpleResizer.preScale.x+SimpleResizer.preTarSize.x;
  6823. var tHeight=(Laya.stage.mouseY-SimpleResizer.preMousePoint.y)/SimpleResizer.preScale.y+SimpleResizer.preTarSize.y;
  6824. tar.width=tWidth > minWidth?tWidth:minWidth;
  6825. tar.height=tHeight>minHeight?tHeight:minHeight;
  6826. }
  6827. SimpleResizer.onMouseMoveEnd=function(e){
  6828. SimpleResizer.clearEvents();
  6829. }
  6830. SimpleResizer.clearEvents=function(){
  6831. Laya.timer.clear(null,SimpleResizer.onMouseMoving);
  6832. Laya.stage.off(/*laya.events.Event.MOUSE_UP*/"mouseup",null,SimpleResizer.onMouseMoveEnd);
  6833. }
  6834. __static(SimpleResizer,
  6835. ['preMousePoint',function(){return this.preMousePoint=new Point();},'preTarSize',function(){return this.preTarSize=new Point();},'preScale',function(){return this.preScale=new Point();}
  6836. ]);
  6837. return SimpleResizer;
  6838. })()
  6839. /**
  6840. *
  6841. *@author ww
  6842. *@version 1.0
  6843. *
  6844. *@created 2015-9-24 下午6:15:01
  6845. */
  6846. //class laya.debug.tools.WalkTools
  6847. var WalkTools=(function(){
  6848. function WalkTools(){}
  6849. __class(WalkTools,'laya.debug.tools.WalkTools');
  6850. WalkTools.walkTarget=function(target,fun,_this){
  6851. fun.apply(_this,[target]);
  6852. var i=0;
  6853. var len=0;
  6854. var tChild;
  6855. len=target.numChildren;
  6856. for(i=0;i<len;i++){
  6857. tChild=target.getChildAt(i);
  6858. WalkTools.walkTarget(tChild,fun,tChild);
  6859. }
  6860. }
  6861. WalkTools.walkTargetEX=function(target,fun,_this,filterFun){
  6862. if (filterFun !=null && !filterFun(target))return;
  6863. fun.apply(_this,[target]);
  6864. var i=0;
  6865. var len=0;
  6866. var tChild;
  6867. var childs;
  6868. childs=target._children;
  6869. len=childs.length;
  6870. for(i=0;i<len;i++){
  6871. tChild=childs[i];
  6872. WalkTools.walkTarget(tChild,fun,tChild);
  6873. }
  6874. }
  6875. WalkTools.walkChildren=function(target,fun,_this){
  6876. if(!target||target.numChildren<1)return;
  6877. WalkTools.walkArr(DisControlTool.getAllChild(target),fun,_this);
  6878. }
  6879. WalkTools.walkArr=function(arr,fun,_this){
  6880. if(!arr)return;
  6881. var i=0;
  6882. var len=0;
  6883. len=arr.length;
  6884. for(i=0;i<len;i++){
  6885. fun.apply(_this,[arr[i],i]);
  6886. }
  6887. }
  6888. return WalkTools;
  6889. })()
  6890. /**
  6891. *...
  6892. *@author ww
  6893. */
  6894. //class laya.debug.tools.DebugTxt
  6895. var DebugTxt=(function(){
  6896. function DebugTxt(){}
  6897. __class(DebugTxt,'laya.debug.tools.DebugTxt');
  6898. DebugTxt.init=function(){
  6899. if (DebugTxt._txt)return;
  6900. DebugTxt._txt=new Text();
  6901. DebugTxt._txt.pos(100,100);
  6902. DebugTxt._txt.color="#ff00ff";
  6903. DebugTxt._txt.zOrder=999;
  6904. DebugTxt._txt.fontSize=24;
  6905. DebugTxt._txt.text="debugTxt inited";
  6906. Laya.stage.addChild(DebugTxt._txt);
  6907. }
  6908. DebugTxt.getArgArr=function(arg){
  6909. var rst;
  6910. rst=[];
  6911. var i=0,len=arg.length;
  6912. for(i=0;i<len;i++){
  6913. rst.push(arg[i]);
  6914. }
  6915. return rst;
  6916. }
  6917. DebugTxt.dTrace=function(__arg){
  6918. var arg=arguments;
  6919. arg=DebugTxt.getArgArr(arg);
  6920. var str;
  6921. str=arg.join(" ");
  6922. if (DebugTxt._txt){
  6923. DebugTxt._txt.text=str+"\n"+DebugTxt._txt.text;
  6924. }
  6925. }
  6926. DebugTxt.getTimeStr=function(){
  6927. var dateO=/*__JS__ */new Date();
  6928. return dateO.toTimeString();
  6929. }
  6930. DebugTxt.traceTime=function(msg){
  6931. DebugTxt.dTrace(DebugTxt.getTimeStr());
  6932. DebugTxt.dTrace(msg);
  6933. }
  6934. DebugTxt.show=function(__arg){
  6935. var arg=arguments;
  6936. arg=DebugTxt.getArgArr(arg);
  6937. var str;
  6938. str=arg.join(" ");
  6939. if (DebugTxt._txt){
  6940. DebugTxt._txt.text=str;
  6941. }
  6942. }
  6943. DebugTxt._txt=null;
  6944. DebugTxt.I=null;
  6945. return DebugTxt;
  6946. })()
  6947. /**
  6948. *
  6949. *@author ww
  6950. *@version 1.0
  6951. *
  6952. *@created 2015-11-27 上午9:58:59
  6953. */
  6954. //class laya.debug.tools.JsonTool
  6955. var JsonTool=(function(){
  6956. function JsonTool(){}
  6957. __class(JsonTool,'laya.debug.tools.JsonTool');
  6958. JsonTool.getJsonString=function(obj,singleLine,split,depth,Width){
  6959. (singleLine===void 0)&& (singleLine=true);
  6960. (split===void 0)&& (split="\n");
  6961. (depth===void 0)&& (depth=0);
  6962. (Width===void 0)&& (Width=4);
  6963. var preStr="";
  6964. preStr=JsonTool.getEmptyStr(depth*Width);
  6965. var rst;
  6966. var keyValues;
  6967. keyValues={};
  6968. var tKey;
  6969. var tValue;
  6970. var type;
  6971. var keys;
  6972. keys=[];
  6973. for(tKey in obj){
  6974. keys.push(tKey);
  6975. tValue=obj[tKey];
  6976. if(JsonTool.singleLineKey[tKey]){
  6977. keyValues[tKey]=JsonTool.getValueStr(tValue,true,split,depth+1,Width);
  6978. }else{
  6979. keyValues[tKey]=JsonTool.getValueStr(tValue,singleLine,split,depth+1,Width);
  6980. }
  6981. };
  6982. var i=0,len=0;
  6983. len=keys.length;
  6984. keys.sort();
  6985. keys=keys.reverse();
  6986. var keyPreStr;
  6987. keyPreStr=JsonTool.getEmptyStr((depth+1)*Width);
  6988. if(singleLine){
  6989. split="";
  6990. preStr="";
  6991. keyPreStr="";
  6992. };
  6993. var keyValueStrArr;
  6994. keyValueStrArr=[];
  6995. for(i=0;i<len;i++){
  6996. tKey=keys[i];
  6997. keyValueStrArr.push(keyPreStr+JsonTool.wrapValue(tKey)+":"+keyValues[tKey]);
  6998. }
  6999. rst="{"+split+keyValueStrArr.join(","+split)+split+preStr+"}";
  7000. return rst;
  7001. }
  7002. JsonTool.wrapValue=function(value,wraper){
  7003. (wraper===void 0)&& (wraper="\"");
  7004. return wraper+value+wraper;
  7005. }
  7006. JsonTool.getArrStr=function(arr,singleLine,split,depth,Width){
  7007. (singleLine===void 0)&& (singleLine=true);
  7008. (split===void 0)&& (split="\n");
  7009. (depth===void 0)&& (depth=0);
  7010. (Width===void 0)&& (Width=4);
  7011. var rst;
  7012. var i=0,len=0;
  7013. len=arr.length;
  7014. var valueStrArr;
  7015. valueStrArr=[];
  7016. for(i=0;i<len;i++){
  7017. valueStrArr.push(JsonTool.getValueStr(arr[i],singleLine,split,depth+1,Width));
  7018. };
  7019. var preStr="";
  7020. preStr=JsonTool.getEmptyStr((depth+1)*Width);
  7021. if(singleLine){
  7022. split="";
  7023. preStr="";
  7024. }
  7025. rst="["+split+preStr+valueStrArr.join(","+split+preStr)+"]";
  7026. return rst;
  7027. }
  7028. JsonTool.quote=function(string){
  7029. JsonTool.escapable.lastIndex=0;
  7030. return JsonTool.escapable.test(string)? '"'+string.replace(JsonTool.escapable,function(a){
  7031. var c=JsonTool.meta[a];
  7032. return typeof c==='string' ? c :
  7033. '\\u'+('0000'+a.charCodeAt(0).toString(16)).slice(-4);
  7034. })+'"' :'"'+string+'"';
  7035. }
  7036. JsonTool.getValueStr=function(tValue,singleLine,split,depth,Width){
  7037. (singleLine===void 0)&& (singleLine=true);
  7038. (split===void 0)&& (split="\n");
  7039. (depth===void 0)&& (depth=0);
  7040. (Width===void 0)&& (Width=0);
  7041. var rst;
  7042. if((typeof tValue=='string')){
  7043. rst=JsonTool.quote(tValue);
  7044. }else if(tValue==null){
  7045. rst="null";
  7046. }else if((typeof tValue=='number')|| ((typeof tValue=='number')&& Math.floor(tValue)==tValue)|| (typeof tValue=='boolean')){
  7047. rst=tValue;
  7048. }else if((tValue instanceof Array)){
  7049. rst=JsonTool.getArrStr(tValue,singleLine,split,depth,Width);
  7050. }else if((typeof tValue=='object')){
  7051. rst=JsonTool.getJsonString(tValue,singleLine,split,depth,Width);
  7052. }else{
  7053. rst=tValue;
  7054. }
  7055. return rst;
  7056. }
  7057. JsonTool.getEmptyStr=function(width){
  7058. if(!JsonTool.emptyDic.hasOwnProperty(width)){
  7059. var i=0;
  7060. var len=0;
  7061. len=width;
  7062. var rst;
  7063. rst="";
  7064. for(i=0;i<len;i++){
  7065. rst+=" ";
  7066. }
  7067. JsonTool.emptyDic[width]=rst;
  7068. }
  7069. return JsonTool.emptyDic[width];
  7070. }
  7071. JsonTool.emptyDic={};
  7072. __static(JsonTool,
  7073. ['singleLineKey',function(){return this.singleLineKey={
  7074. "props":true
  7075. };},'escapable',function(){return this.escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;},'meta',function(){return this.meta = {
  7076. '\b':'\\b',
  7077. '\t':'\\t',
  7078. '\n':'\\n',
  7079. '\f':'\\f',
  7080. '\r':'\\r',
  7081. '"' :'\\"',
  7082. '\\':'\\\\'
  7083. };}
  7084. ]);
  7085. return JsonTool;
  7086. })()
  7087. /**
  7088. *base64编码解码类
  7089. *@author ww
  7090. */
  7091. //class laya.debug.tools.Base64Tool
  7092. var Base64Tool=(function(){
  7093. function Base64Tool(){}
  7094. __class(Base64Tool,'laya.debug.tools.Base64Tool');
  7095. Base64Tool.init=function(){
  7096. if (Base64Tool.lookup)
  7097. return;
  7098. Base64Tool.lookup=new Uint8Array(256)
  7099. for (var i=0;i < Base64Tool.chars.length;i++){
  7100. Base64Tool.lookup[Base64Tool.chars.charCodeAt(i)]=i;
  7101. }
  7102. }
  7103. Base64Tool.encode=function(arraybuffer){
  7104. var bytes=new Uint8Array(arraybuffer),i=0,len=bytes["length"],base64="";
  7105. for (i=0;i < len;i+=3){
  7106. base64+=Base64Tool.chars[bytes[i] >> 2];
  7107. base64+=Base64Tool.chars[((bytes[i] & 3)<< 4)| (bytes[i+1] >> 4)];
  7108. base64+=Base64Tool.chars[((bytes[i+1] & 15)<< 2)| (bytes[i+2] >> 6)];
  7109. base64+=Base64Tool.chars[bytes[i+2] & 63];
  7110. }
  7111. if ((len % 3)===2){
  7112. base64=base64.substring(0,base64.length-1)+"=";
  7113. }
  7114. else if (len % 3===1){
  7115. base64=base64.substring(0,base64.length-2)+"==";
  7116. }
  7117. return base64;
  7118. }
  7119. Base64Tool.encodeStr=function(str){
  7120. var byte;
  7121. byte=new ByteEx();
  7122. byte.writeUTFString(str);
  7123. return Base64Tool.encodeByte(byte);
  7124. }
  7125. Base64Tool.encodeStr2=function(str){
  7126. var byte;
  7127. byte=new ByteEx();
  7128. byte.writeUTFBytes(str);
  7129. return Base64Tool.encodeByte(byte);
  7130. }
  7131. Base64Tool.encodeByte=function(byte,start,end){
  7132. (start===void 0)&& (start=0);
  7133. (end===void 0)&& (end=-1);
  7134. if (end < 0){
  7135. end=byte.length;
  7136. }
  7137. return Base64Tool.encode(byte.buffer.slice(start,end));
  7138. }
  7139. Base64Tool.decodeToByte=function(base64){
  7140. return new ByteEx(Base64Tool.decode(base64));
  7141. }
  7142. Base64Tool.decode=function(base64){
  7143. Base64Tool.init();
  7144. var bufferLength=base64.length *0.75,len=base64.length,i=0,p=0,encoded1=0,encoded2=0,encoded3=0,encoded4=0;
  7145. if (base64[base64.length-1]==="="){
  7146. bufferLength--;
  7147. if (base64[base64.length-2]==="="){
  7148. bufferLength--;
  7149. }
  7150. };
  7151. var arraybuffer=new ArrayBuffer(bufferLength),bytes=new Uint8Array(arraybuffer);
  7152. for (i=0;i < len;i+=4){
  7153. encoded1=Base64Tool.lookup[base64.charCodeAt(i)];
  7154. encoded2=Base64Tool.lookup[base64.charCodeAt(i+1)];
  7155. encoded3=Base64Tool.lookup[base64.charCodeAt(i+2)];
  7156. encoded4=Base64Tool.lookup[base64.charCodeAt(i+3)];
  7157. bytes[p++]=(encoded1 << 2)| (encoded2 >> 4);
  7158. bytes[p++]=((encoded2 & 15)<< 4)| (encoded3 >> 2);
  7159. bytes[p++]=((encoded3 & 3)<< 6)| (encoded4 & 63);
  7160. }
  7161. return arraybuffer;
  7162. }
  7163. Base64Tool.chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  7164. Base64Tool.lookup=null;
  7165. return Base64Tool;
  7166. })()
  7167. /**
  7168. *全局时间速率控制类
  7169. *@author ww
  7170. */
  7171. //class laya.debug.tools.TimerControlTool
  7172. var TimerControlTool=(function(){
  7173. function TimerControlTool(){}
  7174. __class(TimerControlTool,'laya.debug.tools.TimerControlTool');
  7175. TimerControlTool.now=function(){
  7176. if (TimerControlTool._timeRate !=1)return TimerControlTool.getRatedNow();
  7177. return Date.now();
  7178. }
  7179. TimerControlTool.getRatedNow=function(){
  7180. var dTime=NaN;
  7181. dTime=TimerControlTool.getNow()-TimerControlTool._startTime;
  7182. return dTime *TimerControlTool._timeRate+TimerControlTool._startTime;
  7183. }
  7184. TimerControlTool.getNow=function(){
  7185. return Date.now();
  7186. }
  7187. TimerControlTool.setTimeRate=function(rate){
  7188. if (TimerControlTool._browerNow==null)TimerControlTool._browerNow=Browser["now"];
  7189. TimerControlTool._startTime=TimerControlTool.getNow();
  7190. TimerControlTool._timeRate=rate;
  7191. if (rate !=1){
  7192. Browser["now"]=TimerControlTool.now;
  7193. }else{
  7194. if(TimerControlTool._browerNow!=null)
  7195. Browser["now"]=TimerControlTool._browerNow;
  7196. }
  7197. }
  7198. TimerControlTool.recoverRate=function(){
  7199. TimerControlTool.setTimeRate(1);
  7200. }
  7201. TimerControlTool._startTime=NaN;
  7202. TimerControlTool._timeRate=1;
  7203. TimerControlTool._browerNow=null;
  7204. return TimerControlTool;
  7205. })()
  7206. /**
  7207. *...
  7208. *@author ww
  7209. */
  7210. //class laya.debug.tools.UVTools
  7211. var UVTools$1=(function(){
  7212. function UVTools(){}
  7213. __class(UVTools,'laya.debug.tools.UVTools',null,'UVTools$1');
  7214. UVTools.getUVByRec=function(x,y,width,height){
  7215. return [x,y,x+width,y,x+width,y+height,x,y+height];
  7216. }
  7217. UVTools.getRecFromUV=function(uv){
  7218. var rst;
  7219. rst=new Rectangle(uv[0],uv[1],uv[2]-uv[0],uv[5]-uv[1]);
  7220. return rst;
  7221. }
  7222. UVTools.isUVRight=function(uv){
  7223. if(uv[0]!=uv[6])return false;
  7224. if(uv[1]!=uv[3])return false;
  7225. if(uv[2]!=uv[4])return false;
  7226. if(uv[5]!=uv[7])return false;
  7227. return true;
  7228. }
  7229. UVTools.getTextureRec=function(texture){
  7230. var rst;
  7231. rst=UVTools.getRecFromUV(texture.uv);
  7232. rst.x*=texture.bitmap.width;
  7233. rst.y*=texture.bitmap.height;
  7234. rst.width*=texture.bitmap.width;
  7235. rst.height*=texture.bitmap.height;
  7236. return rst;
  7237. }
  7238. return UVTools;
  7239. })()
  7240. /**
  7241. *...
  7242. *@author ww
  7243. */
  7244. //class laya.debug.tools.enginehook.ClassCreateHook
  7245. var ClassCreateHook=(function(){
  7246. function ClassCreateHook(){
  7247. this.createInfo={};
  7248. }
  7249. __class(ClassCreateHook,'laya.debug.tools.enginehook.ClassCreateHook');
  7250. var __proto=ClassCreateHook.prototype;
  7251. __proto.hookClass=function(clz){
  7252. var _$this=this;
  7253. if (ClassCreateHook.isInited)return;
  7254. ClassCreateHook.isInited=true;
  7255. var createFun=function (sp){
  7256. _$this.classCreated(sp,clz);
  7257. }
  7258. FunHook.hook(clz,"call",createFun);
  7259. }
  7260. __proto.classCreated=function(clz,oClass){
  7261. var key;
  7262. key=ClassTool.getNodeClassAndName(clz);
  7263. var depth=0;
  7264. var tClz;
  7265. tClz=clz;
  7266. while (tClz && tClz !=oClass){
  7267. tClz=tClz.__super;
  7268. depth++;
  7269. }
  7270. if (!ClassCreateHook.I.createInfo[key]){
  7271. ClassCreateHook.I.createInfo[key]=0;
  7272. }
  7273. ClassCreateHook.I.createInfo[key]=ClassCreateHook.I.createInfo[key]+1;
  7274. RunProfile.run(key,depth+6);
  7275. }
  7276. __proto.getClassCreateInfo=function(clz){
  7277. var key;
  7278. key=ClassTool.getClassName(clz);
  7279. return RunProfile.getRunInfo(key);
  7280. }
  7281. ClassCreateHook.isInited=false;
  7282. __static(ClassCreateHook,
  7283. ['I',function(){return this.I=new ClassCreateHook();}
  7284. ]);
  7285. return ClassCreateHook;
  7286. })()
  7287. /**
  7288. *...
  7289. *@author ww
  7290. */
  7291. //class laya.debug.tools.Base64Atlas
  7292. var Base64Atlas=(function(){
  7293. function Base64Atlas(data,idKey){
  7294. this.data=null;
  7295. this.replaceO=null;
  7296. this.idKey=null;
  7297. this._loadedHandler=null;
  7298. this.data=data;
  7299. if (!idKey)idKey=Math.random()+"key";
  7300. this.idKey=idKey;
  7301. this.init();
  7302. }
  7303. __class(Base64Atlas,'laya.debug.tools.Base64Atlas');
  7304. var __proto=Base64Atlas.prototype;
  7305. //preLoad();
  7306. __proto.init=function(){
  7307. this.replaceO={};
  7308. var key;
  7309. for (key in this.data){
  7310. this.replaceO[key]=this.idKey+"/"+key;
  7311. }
  7312. }
  7313. __proto.getAdptUrl=function(url){
  7314. return this.replaceO[url];
  7315. }
  7316. __proto.preLoad=function(completeHandler){
  7317. this._loadedHandler=completeHandler;
  7318. Laya.loader.load(Base64ImageTool.getPreloads(this.data),new Handler(this,this.preloadEnd));
  7319. }
  7320. __proto.preloadEnd=function(){
  7321. var key;
  7322. for (key in this.data){
  7323. var tx;
  7324. tx=Laya.loader.getRes(this.data[key]);
  7325. Loader.cacheRes(this.replaceO[key],tx);
  7326. }
  7327. if (this._loadedHandler){
  7328. this._loadedHandler.run();
  7329. }
  7330. }
  7331. __proto.replaceRes=function(uiObj){
  7332. ObjectTools.replaceValue(uiObj,this.replaceO);
  7333. }
  7334. return Base64Atlas;
  7335. })()
  7336. /**
  7337. *
  7338. *@author ww
  7339. *@version 1.0
  7340. *
  7341. *@created 2015-9-29 下午12:53:31
  7342. */
  7343. //class laya.debug.tools.CommonTools
  7344. var CommonTools=(function(){
  7345. function CommonTools(){}
  7346. __class(CommonTools,'laya.debug.tools.CommonTools');
  7347. CommonTools.bind=function(fun,scope){
  7348. var rst;
  7349. /*__JS__ */rst=fun.bind(scope);
  7350. return rst;
  7351. }
  7352. CommonTools.insertP=function(tar,x,y,scaleX,scaleY,rotation){
  7353. var nSp;
  7354. nSp=new Sprite();
  7355. tar.parent.addChild(nSp);
  7356. nSp.x=x;
  7357. nSp.y=y;
  7358. nSp.scaleX=scaleX;
  7359. nSp.scaleY=scaleY;
  7360. nSp.rotation=rotation;
  7361. nSp.addChild(tar);
  7362. CommonTools.count++;
  7363. nSp.name="insertP:"+CommonTools.count;
  7364. }
  7365. CommonTools.insertChild=function(tar,x,y,scaleX,scaleY,rotation,color){
  7366. (color===void 0)&& (color="#ff00ff");
  7367. var nSp;
  7368. nSp=new Sprite();
  7369. tar.addChild(nSp);
  7370. nSp.x=x;
  7371. nSp.y=y;
  7372. nSp.scaleX=scaleX;
  7373. nSp.scaleY=scaleY;
  7374. nSp.rotation=rotation;
  7375. nSp.graphics.drawRect(0,0,20,20,color);
  7376. nSp.name="child:"+tar.numChildren;
  7377. return nSp;
  7378. }
  7379. CommonTools.createSprite=function(width,height,color){
  7380. (color===void 0)&& (color="#ff0000");
  7381. var sp;
  7382. sp=new Sprite();
  7383. sp.graphics.drawRect(0,0,width,height,color);
  7384. sp.size(width,height);
  7385. return sp;
  7386. }
  7387. CommonTools.createBtn=function(txt,width,height){
  7388. (width===void 0)&& (width=100);
  7389. (height===void 0)&& (height=40);
  7390. var sp;
  7391. sp=new Sprite();
  7392. sp.size(width,height);
  7393. sp.graphics.drawRect(0,0,sp.width,sp.height,"#ff0000");
  7394. sp.graphics.fillText(txt,sp.width *0.5,sp.height *0.5,null,"#ffff00","center");
  7395. return sp;
  7396. }
  7397. CommonTools.count=0;
  7398. return CommonTools;
  7399. })()
  7400. /**
  7401. *本类用于调整对象的宽高以及坐标
  7402. *@author ww
  7403. */
  7404. //class laya.debug.tools.resizer.DisResizer
  7405. var DisResizer=(function(){
  7406. function DisResizer(){}
  7407. __class(DisResizer,'laya.debug.tools.resizer.DisResizer');
  7408. DisResizer.init=function(){
  7409. if (DisResizer._up)return;
  7410. DisResizer._up=new AutoFillRec("T");
  7411. DisResizer._up.height=2;
  7412. DisResizer._up.type=0;
  7413. DisResizer._down=new AutoFillRec("T");
  7414. DisResizer._down.height=2;
  7415. DisResizer._down.type=0;
  7416. DisResizer._left=new AutoFillRec("R");
  7417. DisResizer._left.width=2;
  7418. DisResizer._left.type=1;
  7419. DisResizer._right=new AutoFillRec("R");
  7420. DisResizer._right.width=2;
  7421. DisResizer._right.type=1;
  7422. DisResizer._barList=[DisResizer._up,DisResizer._down,DisResizer._left,DisResizer._right];
  7423. DisResizer.addEvent();
  7424. }
  7425. DisResizer.stageDown=function(e){
  7426. var target;
  7427. target=e.target;
  7428. if (DisResizer._tar && DisControlTool.isInTree(DisResizer._tar,target)){
  7429. return;
  7430. }
  7431. DisResizer.clear();
  7432. }
  7433. DisResizer.clear=function(){
  7434. DisResizer._tar=null;
  7435. Laya.stage.off(/*laya.events.Event.MOUSE_UP*/"mouseup",null,DisResizer.stageDown);
  7436. DisControlTool.removeItems(DisResizer._barList);
  7437. DisResizer.clearDragEvents();
  7438. }
  7439. DisResizer.addEvent=function(){
  7440. var i=0,len=0;
  7441. var tBar;
  7442. len=DisResizer._barList.length;
  7443. for (i=0;i < len;i++){
  7444. tBar=DisResizer._barList[i];
  7445. tBar.on(/*laya.events.Event.MOUSE_DOWN*/"mousedown",null,DisResizer.barDown);
  7446. }
  7447. }
  7448. DisResizer.barDown=function(e){
  7449. DisResizer.clearDragEvents();
  7450. DisResizer.tBar=e.target;
  7451. if (!DisResizer.tBar)return;
  7452. var area;
  7453. area=new Rectangle();
  7454. if (DisResizer.tBar.type==0){
  7455. area.x=DisResizer.tBar.x;
  7456. area.width=0;
  7457. area.y=DisResizer.tBar.y-200;
  7458. area.height=400;
  7459. }else{
  7460. area.x=DisResizer.tBar.x-200;
  7461. area.width=400;
  7462. area.y=0;
  7463. area.height=0;
  7464. };
  7465. var option;
  7466. option={};
  7467. option.area=area;
  7468. DisResizer.tBar.record();
  7469. DisResizer.tBar.startDrag(area);
  7470. DisResizer.tBar.on(/*laya.events.Event.DRAG_MOVE*/"dragmove",null,DisResizer.draging);
  7471. DisResizer.tBar.on(/*laya.events.Event.DRAG_END*/"dragend",null,DisResizer.dragEnd);
  7472. }
  7473. DisResizer.draging=function(e){
  7474. console.log("draging");
  7475. if (!DisResizer.tBar)return;
  7476. if (!DisResizer._tar)return;
  7477. switch(DisResizer.tBar){
  7478. case DisResizer._left:
  7479. DisResizer._tar.x+=DisResizer.tBar.getDx();
  7480. DisResizer._tar.width-=DisResizer.tBar.getDx();
  7481. DisResizer._up.width-=DisResizer.tBar.getDx();
  7482. DisResizer._down.width-=DisResizer.tBar.getDx();
  7483. DisResizer._right.x-=DisResizer.tBar.getDx();
  7484. DisResizer.tBar.x-=DisResizer.tBar.getDx();
  7485. break ;
  7486. case DisResizer._right:
  7487. DisResizer._tar.width+=DisResizer.tBar.getDx();
  7488. DisResizer._up.width+=DisResizer.tBar.getDx();
  7489. DisResizer._down.width+=DisResizer.tBar.getDx();
  7490. break ;
  7491. case DisResizer._up:
  7492. DisResizer._tar.y+=DisResizer.tBar.getDy();
  7493. DisResizer._tar.height-=DisResizer.tBar.getDy();
  7494. DisResizer._right.height-=DisResizer.tBar.getDy();
  7495. DisResizer._left.height-=DisResizer.tBar.getDy();
  7496. DisResizer._down.y-=DisResizer.tBar.getDy();
  7497. DisResizer.tBar.y-=DisResizer.tBar.getDy();
  7498. break ;
  7499. case DisResizer._down:
  7500. DisResizer._tar.height+=DisResizer.tBar.getDy();
  7501. DisResizer._right.height+=DisResizer.tBar.getDy();
  7502. DisResizer._left.height+=DisResizer.tBar.getDy();
  7503. break ;
  7504. }
  7505. DisResizer.tBar.record();
  7506. }
  7507. DisResizer.dragEnd=function(e){
  7508. console.log("dragEnd");
  7509. DisResizer.clearDragEvents();
  7510. DisResizer.updates();
  7511. }
  7512. DisResizer.clearDragEvents=function(){
  7513. if (!DisResizer.tBar)return;
  7514. DisResizer.tBar.off(/*laya.events.Event.DRAG_MOVE*/"dragmove",null,DisResizer.draging);
  7515. DisResizer.tBar.off(/*laya.events.Event.DRAG_END*/"dragend",null,DisResizer.dragEnd);
  7516. }
  7517. DisResizer.setUp=function(dis,force){
  7518. (force===void 0)&& (force=false);
  7519. if (force && dis==DisResizer._tar){
  7520. return;
  7521. };
  7522. DisControlTool.removeItems(DisResizer._barList);
  7523. if (DisResizer._tar==dis){
  7524. DisResizer._tar=null;
  7525. DisResizer.clearDragEvents();
  7526. if(!force)
  7527. return;
  7528. }
  7529. DisResizer._tar=dis;
  7530. DisResizer.updates();
  7531. DisControlTool.addItems(DisResizer._barList,dis);
  7532. Laya.stage.off(/*laya.events.Event.MOUSE_UP*/"mouseup",null,DisResizer.stageDown);
  7533. Laya.stage.on(/*laya.events.Event.MOUSE_UP*/"mouseup",null,DisResizer.stageDown);
  7534. }
  7535. DisResizer.updates=function(){
  7536. var dis;
  7537. dis=DisResizer._tar;
  7538. if(!dis)return;
  7539. var bounds;
  7540. bounds=new Rectangle(0,0,dis.width,dis.height);
  7541. DisResizer._up.x=bounds.x;
  7542. DisResizer._up.y=bounds.y;
  7543. DisResizer._up.width=bounds.width;
  7544. DisResizer._down.x=bounds.x;
  7545. DisResizer._down.y=bounds.y+bounds.height-2;
  7546. DisResizer._down.width=bounds.width;
  7547. DisResizer._left.x=bounds.x;
  7548. DisResizer._left.y=bounds.y;
  7549. DisResizer._left.height=bounds.height;
  7550. DisResizer._right.x=bounds.x+bounds.width-2;
  7551. DisResizer._right.y=bounds.y;
  7552. DisResizer._right.height=bounds.height;
  7553. }
  7554. DisResizer.Side=2;
  7555. DisResizer.Vertical=1;
  7556. DisResizer.Horizon=0;
  7557. DisResizer._up=null;
  7558. DisResizer._down=null;
  7559. DisResizer._left=null;
  7560. DisResizer._right=null;
  7561. DisResizer._barList=null;
  7562. DisResizer._tar=null;
  7563. DisResizer.barWidth=2;
  7564. DisResizer.useGetBounds=false;
  7565. DisResizer.tBar=null;
  7566. return DisResizer;
  7567. })()
  7568. /**
  7569. *本类调用原生observe接口,仅支持部分浏览器,chrome有效
  7570. *变化输出为异步方式,所以无法跟踪到是什么函数导致变化
  7571. *@author ww
  7572. *@version 1.0
  7573. *
  7574. *@created 2015-10-26 上午9:35:45
  7575. */
  7576. //class laya.debug.tools.exp.Observer
  7577. var Observer=(function(){
  7578. function Observer(){}
  7579. __class(Observer,'laya.debug.tools.exp.Observer');
  7580. Observer.observe=function(obj,callBack){
  7581. /*__JS__ */Object.observe(obj,callBack);
  7582. }
  7583. Observer.unobserve=function(obj,callBack){
  7584. /*__JS__ */Object.unobserve(obj,callBack);
  7585. }
  7586. Observer.observeDiffer=function(obj,sign,msg){
  7587. (msg===void 0)&& (msg="obDiffer");
  7588. var differFun=function (){
  7589. DifferTool.differ(sign,obj,msg);
  7590. }
  7591. Observer.observe(obj,differFun);
  7592. }
  7593. return Observer;
  7594. })()
  7595. /**
  7596. *...
  7597. *@author ww
  7598. */
  7599. //class laya.debug.tools.enginehook.RenderSpriteHook
  7600. var RenderSpriteHook=(function(){
  7601. function RenderSpriteHook(){
  7602. /**@private */
  7603. //this._next=null;
  7604. /**@private */
  7605. //this._fun=null;
  7606. }
  7607. __class(RenderSpriteHook,'laya.debug.tools.enginehook.RenderSpriteHook');
  7608. var __proto=RenderSpriteHook.prototype;
  7609. __proto._canvas=function(sprite,context,x,y){
  7610. var _cacheStyle=sprite._cacheStyle;
  7611. var _next=this._next;
  7612. var _repaint;
  7613. if (!_cacheStyle.enableCanvasRender){
  7614. RenderSpriteHook._oldCanvas.call(this,sprite,context,x,y);
  7615. return;
  7616. }
  7617. if (sprite._needRepaint()|| (!_cacheStyle.canvas)){
  7618. _repaint=true;
  7619. }else{
  7620. _repaint=false;
  7621. };
  7622. var preTime;
  7623. preTime=Browser.now();
  7624. RenderSpriteHook._oldCanvas.call(this,sprite,context,x,y);
  7625. if (_repaint){
  7626. CacheAnalyser.I.reCacheCanvas(sprite,Browser.now()-preTime);
  7627. }else{
  7628. CacheAnalyser.I.renderCanvas(sprite,Browser.now()-preTime);
  7629. }
  7630. }
  7631. RenderSpriteHook.init=function(){
  7632. if (RenderSpriteHook._oldCanvas)return;
  7633. RenderSpriteHook._oldCanvas=RenderSprite["prototype"]["_canvas"];
  7634. RenderSprite["prototype"]["_canvas"]=RenderSpriteHook["prototype"]["_canvas"];
  7635. }
  7636. RenderSpriteHook.IMAGE=0x01;
  7637. RenderSpriteHook.FILTERS=0x02;
  7638. RenderSpriteHook.ALPHA=0x04;
  7639. RenderSpriteHook.TRANSFORM=0x08;
  7640. RenderSpriteHook.CANVAS=0x10;
  7641. RenderSpriteHook.BLEND=0x20;
  7642. RenderSpriteHook.CLIP=0x40;
  7643. RenderSpriteHook.STYLE=0x80;
  7644. RenderSpriteHook.GRAPHICS=0x100;
  7645. RenderSpriteHook.CUSTOM=0x200;
  7646. RenderSpriteHook.ENABLERENDERMERGE=0x400;
  7647. RenderSpriteHook.CHILDS=0x800;
  7648. RenderSpriteHook.INIT=0x11111;
  7649. RenderSpriteHook.renders=[];
  7650. RenderSpriteHook._oldCanvas=null;
  7651. RenderSpriteHook.I=null;
  7652. RenderSpriteHook._preCreateFun=null;
  7653. return RenderSpriteHook;
  7654. })()
  7655. /**
  7656. *...
  7657. *@author ww
  7658. */
  7659. //class laya.debug.tools.DebugConsts
  7660. var DebugConsts=(function(){
  7661. function DebugConsts(){}
  7662. __class(DebugConsts,'laya.debug.tools.DebugConsts');
  7663. DebugConsts.CLICK_SELECT_COLOR="#ff0000";
  7664. DebugConsts.CANVAS_REC_COLOR="#FF00FF";
  7665. DebugConsts.RECACHE_REC_COLOR="#00ff00";
  7666. DebugConsts.SPRITE_REC_COLOR="#ff0000";
  7667. DebugConsts.SPRITE_REC_LINEWIDTH=2;
  7668. return DebugConsts;
  7669. })()
  7670. /**
  7671. *...
  7672. *@author ww
  7673. */
  7674. //class laya.debug.tools.ObjTimeCountTool
  7675. var ObjTimeCountTool=(function(){
  7676. function ObjTimeCountTool(){
  7677. this.timeDic={};
  7678. this.resultDic={};
  7679. this.countDic={};
  7680. this.resultCountDic={};
  7681. this.nodeDic={};
  7682. this.resultNodeDic={};
  7683. }
  7684. __class(ObjTimeCountTool,'laya.debug.tools.ObjTimeCountTool');
  7685. var __proto=ObjTimeCountTool.prototype;
  7686. __proto.addTime=function(sprite,time){
  7687. IDTools.idObj(sprite);
  7688. var key=0;
  7689. key=IDTools.getObjID(sprite);
  7690. if (!this.timeDic.hasOwnProperty(key)){
  7691. this.timeDic[key]=0;
  7692. }
  7693. this.timeDic[key]=this.timeDic[key]+time;
  7694. if (!this.countDic.hasOwnProperty(key)){
  7695. this.countDic[key]=0;
  7696. }
  7697. this.countDic[key]=this.countDic[key]+1;
  7698. this.nodeDic[key]=sprite;
  7699. }
  7700. __proto.getTime=function(sprite){
  7701. IDTools.idObj(sprite);
  7702. var key=0;
  7703. key=IDTools.getObjID(sprite);
  7704. if (!this.resultDic[key])return 0;
  7705. return this.resultDic[key];
  7706. }
  7707. __proto.getCount=function(sprite){
  7708. IDTools.idObj(sprite);
  7709. var key=0;
  7710. key=IDTools.getObjID(sprite);
  7711. return this.resultCountDic[key];
  7712. }
  7713. __proto.reset=function(){
  7714. var key;
  7715. for (key in this.timeDic){
  7716. this.timeDic[key]=0;
  7717. this.countDic[key]=0;
  7718. }
  7719. ObjectTools.clearObj(this.nodeDic);
  7720. }
  7721. __proto.updates=function(){
  7722. ObjectTools.clearObj(this.resultDic);
  7723. ObjectTools.insertValue(this.resultDic,this.timeDic);
  7724. ObjectTools.clearObj(this.resultCountDic);
  7725. ObjectTools.insertValue(this.resultCountDic,this.countDic);
  7726. ObjectTools.insertValue(this.resultNodeDic,this.nodeDic);
  7727. this.reset();
  7728. }
  7729. return ObjTimeCountTool;
  7730. })()
  7731. /**
  7732. *本类用于模块间消息传递
  7733. *@author ww
  7734. */
  7735. //class laya.debug.tools.Notice extends laya.events.EventDispatcher
  7736. var Notice=(function(_super){
  7737. function Notice(){
  7738. Notice.__super.call(this);
  7739. }
  7740. __class(Notice,'laya.debug.tools.Notice',_super);
  7741. Notice.notify=function(type,data){
  7742. Notice.I.event(type,data);
  7743. }
  7744. Notice.listen=function(type,_scope,fun,args,cancelBefore){
  7745. (cancelBefore===void 0)&& (cancelBefore=false);
  7746. if(cancelBefore)Notice.cancel(type,_scope,fun);
  7747. Notice.I.on(type,_scope,fun,args);
  7748. }
  7749. Notice.cancel=function(type,_scope,fun){
  7750. Notice.I.off(type,_scope,fun);
  7751. }
  7752. __static(Notice,
  7753. ['I',function(){return this.I=new Notice();}
  7754. ]);
  7755. return Notice;
  7756. })(EventDispatcher)
  7757. /**
  7758. *...
  7759. *@author ww
  7760. */
  7761. //class laya.debug.tools.enginehook.LoaderHook extends laya.net.LoaderManager
  7762. var LoaderHook=(function(_super){
  7763. function LoaderHook(){
  7764. LoaderHook.__super.call(this);
  7765. }
  7766. __class(LoaderHook,'laya.debug.tools.enginehook.LoaderHook',_super);
  7767. var __proto=LoaderHook.prototype;
  7768. __proto.checkUrls=function(url){
  7769. var tarUrl;
  7770. if ((typeof url=='string')){
  7771. tarUrl=url;
  7772. }else{
  7773. tarUrl=url.url;
  7774. }
  7775. if (LoaderHook.preFails[tarUrl]){
  7776. if (LoaderHook.enableFailDebugger){
  7777. debugger;
  7778. }
  7779. }
  7780. }
  7781. __proto.chekUrlList=function(urls){
  7782. var i=0,len=0;
  7783. len=urls.length;
  7784. for (i=0;i < len;i++){
  7785. this.checkUrls(urls[i]);
  7786. }
  7787. }
  7788. __proto.load=function(url,complete,progress,type,priority,cache,group,ignoreCache,useWorkerLoader){
  7789. (priority===void 0)&& (priority=1);
  7790. (cache===void 0)&& (cache=true);
  7791. (ignoreCache===void 0)&& (ignoreCache=false);
  7792. (useWorkerLoader===void 0)&& (useWorkerLoader=false);
  7793. if ((url instanceof Array)){
  7794. this.chekUrlList(url);
  7795. }else{
  7796. this.checkUrls(url);
  7797. }
  7798. return _super.prototype.load.call(this,url,complete,progress,type,priority,cache,group,ignoreCache,useWorkerLoader);
  7799. }
  7800. LoaderHook.init=function(){
  7801. if (LoaderHook.isInited)return;
  7802. LoaderHook.isInited=true;
  7803. Laya.loader=new LoaderHook();
  7804. Laya.loader.on(/*laya.events.Event.ERROR*/"error",null,LoaderHook.onFail);
  7805. LoaderHook.preFails=LocalStorage.getJSON("LoadFailItems");
  7806. if (!LoaderHook.preFails)LoaderHook.preFails={};
  7807. }
  7808. LoaderHook.onFail=function(failFile){
  7809. LoaderHook.nowFails[failFile]=true;
  7810. LocalStorage.setJSON("LoadFailItems",LoaderHook.nowFails);
  7811. }
  7812. LoaderHook.resetFails=function(){
  7813. LoaderHook.nowFails={};
  7814. LocalStorage.setJSON("LoadFailItems",LoaderHook.nowFails);
  7815. }
  7816. LoaderHook.preFails={};
  7817. LoaderHook.nowFails={};
  7818. LoaderHook.enableFailDebugger=true;
  7819. LoaderHook.FailSign="LoadFailItems";
  7820. LoaderHook.isInited=false;
  7821. return LoaderHook;
  7822. })(LoaderManager)
  7823. /**
  7824. *...
  7825. *@author ww
  7826. */
  7827. //class laya.debug.view.nodeInfo.DebugInfoLayer extends laya.display.Sprite
  7828. var DebugInfoLayer=(function(_super){
  7829. function DebugInfoLayer(){
  7830. this.nodeRecInfoLayer=null;
  7831. this.lineLayer=null;
  7832. this.txtLayer=null;
  7833. this.popLayer=null;
  7834. this.graphicLayer=null;
  7835. this.cacheViewLayer=null;
  7836. DebugInfoLayer.__super.call(this);
  7837. this.nodeRecInfoLayer=new Sprite();
  7838. this.lineLayer=new Sprite();
  7839. this.txtLayer=new Sprite();
  7840. this.popLayer=new Sprite();
  7841. this.graphicLayer=new Sprite();
  7842. this.cacheViewLayer=new Sprite();
  7843. this.nodeRecInfoLayer.name="nodeRecInfoLayer";
  7844. this.lineLayer.name="lineLayer";
  7845. this.txtLayer.name="txtLayer";
  7846. this.popLayer.name="popLayer";
  7847. this.graphicLayer.name="graphicLayer";
  7848. this.cacheViewLayer.name="cacheViewLayer";
  7849. this.addChild(this.lineLayer);
  7850. this.addChild(this.cacheViewLayer);
  7851. this.addChild(this.nodeRecInfoLayer);
  7852. this.addChild(this.txtLayer);
  7853. this.addChild(this.popLayer);
  7854. this.addChild(this.graphicLayer);
  7855. DebugInfoLayer.I=this;
  7856. this.zOrder=999;
  7857. Laya.stage.on(/*laya.events.Event.DOUBLE_CLICK*/"doubleclick",this,this.setTop);
  7858. }
  7859. __class(DebugInfoLayer,'laya.debug.view.nodeInfo.DebugInfoLayer',_super);
  7860. var __proto=DebugInfoLayer.prototype;
  7861. __proto.setTop=function(){
  7862. DisControlTool.setTop(this);
  7863. }
  7864. __proto.isDebugItem=function(sprite){
  7865. return DisControlTool.isInTree(this,sprite);
  7866. }
  7867. DebugInfoLayer.init=function(){
  7868. if (!DebugInfoLayer.I){
  7869. new DebugInfoLayer();
  7870. Laya.stage.addChild(DebugInfoLayer.I);
  7871. }
  7872. }
  7873. DebugInfoLayer.I=null;
  7874. return DebugInfoLayer;
  7875. })(Sprite)
  7876. /**
  7877. *
  7878. *@author ww
  7879. *@version 1.0
  7880. *
  7881. *@created 2015-12-30 下午2:37:05
  7882. */
  7883. //class laya.debug.tools.comps.Axis extends laya.display.Sprite
  7884. var Axis=(function(_super){
  7885. function Axis(){
  7886. this._target=null;
  7887. this._lenType=
  7888. [
  7889. ["width","height"],
  7890. ["scaleX","scaleY"]];
  7891. this._type=1;
  7892. this.xAxis=new ArrowLine("X");
  7893. this.yAxis=new ArrowLine("Y");
  7894. this.controlBox=new Rect();
  7895. this._point=new Point();
  7896. this.oPoint=new Point();
  7897. this.myRotationChanger=ValueChanger.create(this,"rotation");
  7898. this.targetRotationChanger=ValueChanger.create(null,"rotation");
  7899. this.stageMouseRotationChanger=new ValueChanger();
  7900. Axis.__super.call(this);
  7901. this.mouseEnabled=true;
  7902. this.size(1,1);
  7903. this.initMe();
  7904. this.xAxis.rotationControl.on(/*laya.events.Event.MOUSE_DOWN*/"mousedown",this,this.controlMouseDown);
  7905. this.yAxis.rotationControl.on(/*laya.events.Event.MOUSE_DOWN*/"mousedown",this,this.controlMouseDown);
  7906. this.controlBox.on(/*laya.events.Event.MOUSE_DOWN*/"mousedown",this,this.controlBoxMouseDown);
  7907. this.on(/*laya.events.Event.DRAG_MOVE*/"dragmove",this,this.dragging);
  7908. }
  7909. __class(Axis,'laya.debug.tools.comps.Axis',_super);
  7910. var __proto=Axis.prototype;
  7911. __proto.updateChanges=function(){
  7912. if(this._target){
  7913. var params;
  7914. params=this._lenType[this._type];
  7915. this.xAxis.targetChanger=ValueChanger.create(this._target,params[0]);
  7916. this.yAxis.targetChanger=ValueChanger.create(this._target,params[1]);
  7917. }
  7918. }
  7919. __proto.switchType=function(){
  7920. this._type++;
  7921. this._type=this._type%this._lenType.length;
  7922. this.type=this._type;
  7923. }
  7924. __proto.controlBoxMouseDown=function(e){
  7925. this.startDrag();
  7926. }
  7927. __proto.dragging=function(){
  7928. if (this._target){
  7929. this._point.setTo(this.x,this.y);
  7930. DisControlTool.transPoint(this.parent,this._target.parent,this._point);
  7931. this._target.pos(this._point.x,this._point.y);
  7932. }
  7933. }
  7934. __proto.initMe=function(){
  7935. this.addChild(this.xAxis);
  7936. this.addChild(this.yAxis);
  7937. this.yAxis.rotation=90;
  7938. this.addChild(this.controlBox);
  7939. this.controlBox.posTo(0,0);
  7940. }
  7941. __proto.clearMoveEvents=function(){
  7942. Laya.stage.off(/*laya.events.Event.MOUSE_MOVE*/"mousemove",this,this.stageMouseMove);
  7943. Laya.stage.off(/*laya.events.Event.MOUSE_UP*/"mouseup",this,this.stageMouseUp);
  7944. }
  7945. __proto.controlMouseDown=function(e){
  7946. this.targetRotationChanger.target=this.target;
  7947. this.clearMoveEvents();
  7948. this.oPoint.setTo(0,0);
  7949. this.myRotationChanger.record();
  7950. this.oPoint=this.localToGlobal(this.oPoint);
  7951. this.stageMouseRotationChanger.value=this.getStageMouseRatation();
  7952. this.stageMouseRotationChanger.record();
  7953. this.targetRotationChanger.record();
  7954. Laya.stage.on(/*laya.events.Event.MOUSE_MOVE*/"mousemove",this,this.stageMouseMove);
  7955. Laya.stage.on(/*laya.events.Event.MOUSE_UP*/"mouseup",this,this.stageMouseUp);
  7956. }
  7957. __proto.getStageMouseRatation=function(){
  7958. return MathUtil.getRotation(this.oPoint.x,this.oPoint.y,Laya.stage.mouseX,Laya.stage.mouseY);
  7959. }
  7960. __proto.stageMouseMove=function(e){
  7961. this.stageMouseRotationChanger.value=this.getStageMouseRatation();
  7962. var dRotation=NaN;
  7963. dRotation=-this.stageMouseRotationChanger.dValue;
  7964. if(this.target){
  7965. this.targetRotationChanger.showValueByAdd(dRotation);
  7966. }else{
  7967. this.myRotationChanger.showValueByAdd(dRotation);
  7968. }
  7969. }
  7970. __proto.stageMouseUp=function(e){
  7971. this.noticeChange();
  7972. this.clearMoveEvents();
  7973. }
  7974. __proto.noticeChange=function(){
  7975. console.log("rotate:",-this.stageMouseRotationChanger.dValue);
  7976. }
  7977. __getset(0,__proto,'target',function(){
  7978. return this._target;
  7979. },function(tar){
  7980. this._target=tar;
  7981. this.updateChanges();
  7982. });
  7983. __getset(0,__proto,'type',function(){
  7984. return this._type;
  7985. },function(lenType){
  7986. this._type=lenType;
  7987. this.updateChanges();
  7988. });
  7989. return Axis;
  7990. })(Sprite)
  7991. /**
  7992. *
  7993. *@author ww
  7994. *@version 1.0
  7995. *
  7996. *@created 2015-12-30 下午3:23:06
  7997. */
  7998. //class laya.debug.tools.comps.Rect extends laya.display.Sprite
  7999. var Rect=(function(_super){
  8000. function Rect(){
  8001. this.recWidth=10;
  8002. Rect.__super.call(this);
  8003. this.drawMe();
  8004. }
  8005. __class(Rect,'laya.debug.tools.comps.Rect',_super);
  8006. var __proto=Rect.prototype;
  8007. __proto.drawMe=function(){
  8008. var g;
  8009. g=this.graphics;
  8010. g.clear();
  8011. g.drawRect(0,0,this.recWidth,this.recWidth,"#22ff22");
  8012. this.size(this.recWidth,this.recWidth);
  8013. }
  8014. __proto.posTo=function(x,y){
  8015. this.x=x-this.recWidth*0.5;
  8016. this.y=y-this.recWidth*0.5;
  8017. }
  8018. return Rect;
  8019. })(Sprite)
  8020. /**
  8021. *...
  8022. *@author ww
  8023. */
  8024. //class laya.debug.view.nodeInfo.NodeInfosItem extends laya.display.Sprite
  8025. var NodeInfosItem=(function(_super){
  8026. function NodeInfosItem(){
  8027. //addChild(_infoTxt);
  8028. this._infoTxt=null;
  8029. this._tar=null;
  8030. NodeInfosItem.__super.call(this);
  8031. this._infoTxt=new Text();
  8032. this._infoTxt.color="#ff0000";
  8033. this._infoTxt.bgColor="#00ff00";
  8034. this._infoTxt.fontSize=12;
  8035. }
  8036. __class(NodeInfosItem,'laya.debug.view.nodeInfo.NodeInfosItem',_super);
  8037. var __proto=NodeInfosItem.prototype;
  8038. __proto.removeSelf=function(){
  8039. this._infoTxt.removeSelf();
  8040. return laya.display.Node.prototype.removeSelf.call(this);
  8041. }
  8042. __proto.showToUI=function(){
  8043. NodeInfosItem.NodeInfoContainer.nodeRecInfoLayer.addChild(this);
  8044. this._infoTxt.removeSelf();
  8045. NodeInfosItem.NodeInfoContainer.txtLayer.addChild(this._infoTxt);
  8046. this.findOkPos();
  8047. }
  8048. __proto.randomAPos=function(r){
  8049. this._infoTxt.x=this.x+Laya.stage.width*Math.random();
  8050. this._infoTxt.y=this.y+r *Math.random();
  8051. }
  8052. __proto.findOkPos=function(){
  8053. var len=0;
  8054. len=20;
  8055. this.randomAPos(len);
  8056. return;
  8057. var count=0;
  8058. count=1;
  8059. while (!this.isPosOk()){
  8060. count++;
  8061. if (count >=500){
  8062. len+=10;
  8063. count=0;
  8064. }
  8065. this.randomAPos(len);
  8066. }
  8067. }
  8068. __proto.isPosOk=function(){
  8069. var tParent;
  8070. tParent=NodeInfosItem.NodeInfoContainer.nodeRecInfoLayer;
  8071. var i=0,len=0;
  8072. var cList;
  8073. cList=tParent._children;
  8074. len=cList.length;
  8075. var tChild;
  8076. var mRec;
  8077. mRec=this._infoTxt.getBounds();
  8078. if (mRec.x < 0)return false;
  8079. if (mRec.y < 0)return false;
  8080. if (mRec.right > Laya.stage.width)return false;
  8081. for (i=0;i < len;i++){
  8082. tChild=cList[i];
  8083. if (tChild==this._infoTxt)continue ;
  8084. if (mRec.intersects(tChild.getBounds()))return false;
  8085. }
  8086. return true;
  8087. }
  8088. __proto.showInfo=function(node){
  8089. this._tar=node;
  8090. if (!node)return;
  8091. NodeInfosItem._txts.length=0;
  8092. var i=0,len=0;
  8093. var tKey;
  8094. len=NodeInfosItem.showValues.length;
  8095. if (node.name){
  8096. NodeInfosItem._txts.push(ClassTool.getClassName(node)+"("+node.name+")");
  8097. }else{
  8098. NodeInfosItem._txts.push(ClassTool.getClassName(node));
  8099. }
  8100. for (i=0;i < len;i++){
  8101. tKey=NodeInfosItem.showValues[i];
  8102. NodeInfosItem._txts.push(tKey+":"+NodeInfosItem.getNodeValue(node,tKey));
  8103. }
  8104. this._infoTxt.text=NodeInfosItem._txts.join("\n");
  8105. this.graphics.clear();
  8106. var pointList;
  8107. pointList=node._getBoundPointsM(true);
  8108. if(!pointList||pointList.length<1)return;
  8109. pointList=GrahamScan.pListToPointList(pointList,true);
  8110. WalkTools.walkArr(pointList,node.localToGlobal,node);
  8111. pointList=GrahamScan.pointListToPlist(pointList);
  8112. NodeInfosItem._disBoundRec=Rectangle._getWrapRec(pointList,NodeInfosItem._disBoundRec);
  8113. this.graphics.drawRect(0,0,NodeInfosItem._disBoundRec.width,NodeInfosItem._disBoundRec.height,null,"#00ffff");
  8114. this.pos(NodeInfosItem._disBoundRec.x,NodeInfosItem._disBoundRec.y);
  8115. }
  8116. __proto.fresh=function(){
  8117. this.showInfo(this._tar);
  8118. }
  8119. __proto.clearMe=function(){
  8120. this._tar=null;
  8121. }
  8122. __proto.recover=function(){
  8123. Pool.recover("NodeInfosItem",this);
  8124. }
  8125. NodeInfosItem.init=function(){
  8126. if (!NodeInfosItem.NodeInfoContainer){
  8127. DebugInfoLayer.init();
  8128. NodeInfosItem.NodeInfoContainer=DebugInfoLayer.I;
  8129. Laya.stage.addChild(NodeInfosItem.NodeInfoContainer);
  8130. }
  8131. }
  8132. NodeInfosItem.getNodeInfoByNode=function(node){
  8133. IDTools.idObj(node);
  8134. var key=0;
  8135. key=IDTools.getObjID(node);
  8136. if (!NodeInfosItem._nodeInfoDic[key]){
  8137. NodeInfosItem._nodeInfoDic[key]=new NodeInfosItem();
  8138. }
  8139. return NodeInfosItem._nodeInfoDic[key];
  8140. }
  8141. NodeInfosItem.hideAllInfos=function(){
  8142. var key;
  8143. var tInfo;
  8144. for (key in NodeInfosItem._nodeInfoDic){
  8145. tInfo=NodeInfosItem._nodeInfoDic[key];
  8146. tInfo.removeSelf();
  8147. }
  8148. NodeInfosItem.clearRelations();
  8149. }
  8150. NodeInfosItem.showNodeInfo=function(node){
  8151. var nodeInfo;
  8152. nodeInfo=NodeInfosItem.getNodeInfoByNode(node);
  8153. nodeInfo.showInfo(node);
  8154. nodeInfo.showToUI();
  8155. }
  8156. NodeInfosItem.showDisInfos=function(node){
  8157. var _node;
  8158. _node=node;
  8159. if (!node)
  8160. return;
  8161. while (node){
  8162. NodeInfosItem.showNodeInfo(node);
  8163. node=node.parent;
  8164. }
  8165. DisControlTool.setTop(NodeInfosItem.NodeInfoContainer);
  8166. NodeInfosItem.apdtTxtInfoPoss(_node);
  8167. NodeInfosItem.updateRelations();
  8168. }
  8169. NodeInfosItem.apdtTxtInfoPoss=function(node){
  8170. var disList;
  8171. disList=[];
  8172. while (node){
  8173. disList.push(node);
  8174. node=node.parent;
  8175. };
  8176. var i=0,len=0;
  8177. var tInfo;
  8178. var tTxt;
  8179. len=disList.length;
  8180. var xPos=NaN;
  8181. xPos=Laya.stage.width-150;
  8182. var heightLen=0;
  8183. heightLen=100;
  8184. node=disList[0];
  8185. if (node){
  8186. tInfo=NodeInfosItem.getNodeInfoByNode(node);
  8187. if (tInfo){
  8188. tTxt=tInfo._infoTxt;
  8189. xPos=Laya.stage.width-tTxt.width-10;
  8190. heightLen=tTxt.height+10;
  8191. }
  8192. }
  8193. disList=disList.reverse();
  8194. for (i=0;i < len;i++){
  8195. node=disList[i];
  8196. tInfo=NodeInfosItem.getNodeInfoByNode(node);
  8197. if (tInfo){
  8198. tTxt=tInfo._infoTxt;
  8199. tTxt.pos(xPos,heightLen *i);
  8200. }
  8201. }
  8202. }
  8203. NodeInfosItem.clearRelations=function(){
  8204. var g;
  8205. g=NodeInfosItem.NodeInfoContainer.lineLayer.graphics;
  8206. g.clear();
  8207. }
  8208. NodeInfosItem.updateRelations=function(){
  8209. var g;
  8210. g=NodeInfosItem.NodeInfoContainer.lineLayer.graphics;
  8211. g.clear();
  8212. var key;
  8213. var tInfo;
  8214. for (key in NodeInfosItem._nodeInfoDic){
  8215. tInfo=NodeInfosItem._nodeInfoDic[key];
  8216. if (tInfo.parent){
  8217. g.drawLine(tInfo.x,tInfo.y,tInfo._infoTxt.x,tInfo._infoTxt.y,"#0000ff");
  8218. }
  8219. }
  8220. }
  8221. NodeInfosItem.getNodeValue=function(node,key){
  8222. var rst;
  8223. NodeInfosItem._nodePoint.setTo(0,0);
  8224. switch(key){
  8225. case "x":
  8226. rst=node["x"]+" (g:"+node.localToGlobal(NodeInfosItem._nodePoint).x+")"
  8227. break ;
  8228. case "y":
  8229. rst=node["y"]+" (g:"+node.localToGlobal(NodeInfosItem._nodePoint).y+")"
  8230. break ;
  8231. default :
  8232. rst=node[key];
  8233. }
  8234. return rst;
  8235. }
  8236. NodeInfosItem.NodeInfoContainer=null;
  8237. NodeInfosItem._nodeInfoDic={};
  8238. NodeInfosItem._txts=[];
  8239. __static(NodeInfosItem,
  8240. ['showValues',function(){return this.showValues=["x","y","scaleX","scaleY","width","height","visible","mouseEnabled"];},'_disBoundRec',function(){return this._disBoundRec=new Rectangle();},'_nodePoint',function(){return this._nodePoint=new Point();}
  8241. ]);
  8242. return NodeInfosItem;
  8243. })(Sprite)
  8244. /**
  8245. *...
  8246. *@author ww
  8247. */
  8248. //class laya.debug.tools.comps.AutoSizeRec extends laya.display.Sprite
  8249. var AutoSizeRec=(function(_super){
  8250. function AutoSizeRec(type){
  8251. this.type=0;
  8252. this._color="#ffffff";
  8253. this.preX=NaN;
  8254. this.preY=NaN;
  8255. AutoSizeRec.__super.call(this);
  8256. }
  8257. __class(AutoSizeRec,'laya.debug.tools.comps.AutoSizeRec',_super);
  8258. var __proto=AutoSizeRec.prototype;
  8259. __proto.setColor=function(color){
  8260. this._color=color;
  8261. this.reRender();
  8262. }
  8263. __proto.changeSize=function(){
  8264. this.reRender();
  8265. }
  8266. __proto.reRender=function(){
  8267. var g=this.graphics;
  8268. g.clear();
  8269. g.drawRect(0,0,this.width,this.height,this._color);
  8270. }
  8271. __proto.record=function(){
  8272. this.preX=this.x;
  8273. this.preY=this.y;
  8274. }
  8275. __proto.getDx=function(){
  8276. return this.x-this.preX;
  8277. }
  8278. __proto.getDy=function(){
  8279. return this.y-this.preY;
  8280. }
  8281. __getset(0,__proto,'height',_super.prototype._$get_height,function(value){
  8282. Laya.superSet(Sprite,this,'height',value);
  8283. this.changeSize();
  8284. });
  8285. __getset(0,__proto,'width',_super.prototype._$get_width,function(value){
  8286. Laya.superSet(Sprite,this,'width',value);
  8287. this.changeSize();
  8288. });
  8289. return AutoSizeRec;
  8290. })(Sprite)
  8291. /**
  8292. *...
  8293. *@author ww
  8294. */
  8295. //class laya.debug.view.nodeInfo.recinfos.NodeRecInfo extends laya.display.Sprite
  8296. var NodeRecInfo=(function(_super){
  8297. function NodeRecInfo(){
  8298. this.txt=null;
  8299. this._tar=null;
  8300. this.recColor="#00ff00";
  8301. NodeRecInfo.__super.call(this);
  8302. this.txt=new Text();
  8303. this.txt.color="#ff0000";
  8304. this.txt.bgColor="#00ff00";
  8305. this.txt.fontSize=12;
  8306. this.addChild(this.txt);
  8307. }
  8308. __class(NodeRecInfo,'laya.debug.view.nodeInfo.recinfos.NodeRecInfo',_super);
  8309. var __proto=NodeRecInfo.prototype;
  8310. __proto.setInfo=function(str){
  8311. this.txt.text=str;
  8312. }
  8313. __proto.setTarget=function(tar){
  8314. this._tar=tar;
  8315. }
  8316. __proto.showInfo=function(node){
  8317. this._tar=node;
  8318. if (!node)return;
  8319. if(node.destroyed)return;
  8320. this.graphics.clear();
  8321. var pointList;
  8322. pointList=node._getBoundPointsM(true);
  8323. if(!pointList||pointList.length<1)return;
  8324. pointList=GrahamScan.pListToPointList(pointList,true);
  8325. WalkTools.walkArr(pointList,node.localToGlobal,node);
  8326. pointList=GrahamScan.pointListToPlist(pointList);
  8327. NodeRecInfo._disBoundRec=Rectangle._getWrapRec(pointList,NodeRecInfo._disBoundRec);
  8328. this.graphics.drawRect(0,0,NodeRecInfo._disBoundRec.width,NodeRecInfo._disBoundRec.height,null,DebugConsts.RECACHE_REC_COLOR,2);
  8329. this.pos(NodeRecInfo._disBoundRec.x,NodeRecInfo._disBoundRec.y);
  8330. }
  8331. __proto.fresh=function(){
  8332. this.showInfo(this._tar);
  8333. }
  8334. __proto.clearMe=function(){
  8335. this._tar=null;
  8336. }
  8337. __static(NodeRecInfo,
  8338. ['_disBoundRec',function(){return this._disBoundRec=new Rectangle();}
  8339. ]);
  8340. return NodeRecInfo;
  8341. })(Sprite)
  8342. /**
  8343. *
  8344. *@author ww
  8345. *@version 1.0
  8346. *
  8347. *@created 2015-12-30 下午1:59:34
  8348. */
  8349. //class laya.debug.tools.comps.Arrow extends laya.display.Sprite
  8350. var Arrow=(function(_super){
  8351. function Arrow(){
  8352. Arrow.__super.call(this);
  8353. this.drawMe();
  8354. }
  8355. __class(Arrow,'laya.debug.tools.comps.Arrow',_super);
  8356. var __proto=Arrow.prototype;
  8357. __proto.drawMe=function(){
  8358. var g;
  8359. g=this.graphics;
  8360. g.clear();
  8361. g.drawLine(0,0,-1,-1,"#ff0000");
  8362. g.drawLine(0,0,1,-1,"#ff0000");
  8363. }
  8364. return Arrow;
  8365. })(Sprite)
  8366. //class laya.debug.tools.DragBox extends laya.display.Sprite
  8367. var DragBox=(function(_super){
  8368. function DragBox(type){
  8369. this._box=null;
  8370. this._target=null;
  8371. this._currDir=null;
  8372. /**0-无,1-水平,2-垂直,3-全部*/
  8373. this._type=0;
  8374. this.fixScale=NaN;
  8375. DragBox.__super.call(this);
  8376. this._left=this.drawBlock();
  8377. this._right=this.drawBlock();
  8378. this._top=this.drawBlock();
  8379. this._bottom=this.drawBlock();
  8380. this._topLeft=this.drawBlock();
  8381. this._topRight=this.drawBlock();
  8382. this._bottomLeft=this.drawBlock();
  8383. this._bottomRight=this.drawBlock();
  8384. this._lastPoint=new Point();
  8385. this._type=type=3;
  8386. this.addChild(this._box=this.drawBorder(0,0,0xff0000));
  8387. if (type==1 || type==3){
  8388. this.addChild(this._left);
  8389. this.addChild(this._right);
  8390. }
  8391. if (type==2 || type==3){
  8392. this.addChild(this._top);
  8393. this.addChild(this._bottom);
  8394. }
  8395. if (type==3){
  8396. this.addChild(this._topLeft);
  8397. this.addChild(this._topRight);
  8398. this.addChild(this._bottomLeft);
  8399. this.addChild(this._bottomRight);
  8400. }
  8401. this.on(/*laya.events.Event.MOUSE_DOWN*/"mousedown",this,this.onMouseDown);
  8402. this.mouseThrough=true;
  8403. }
  8404. __class(DragBox,'laya.debug.tools.DragBox',_super);
  8405. var __proto=DragBox.prototype;
  8406. __proto.onMouseDown=function(e){
  8407. this._currDir=e.target;
  8408. if(e.nativeEvent.shiftKey){
  8409. this.initFixScale();
  8410. }
  8411. if (this._currDir !=this){
  8412. this._lastPoint.x=Laya.stage.mouseX;
  8413. this._lastPoint.y=Laya.stage.mouseY;
  8414. Laya.stage.on(/*laya.events.Event.MOUSE_MOVE*/"mousemove",this,this.onMouseMove);
  8415. Laya.stage.on(/*laya.events.Event.MOUSE_UP*/"mouseup",this,this.onMouseUp);
  8416. e.stopPropagation();
  8417. }
  8418. }
  8419. __proto.onMouseUp=function(e){
  8420. Laya.stage.off(/*laya.events.Event.MOUSE_MOVE*/"mousemove",this,this.onMouseMove);
  8421. Laya.stage.off(/*laya.events.Event.MOUSE_UP*/"mouseup",this,this.onMouseUp);
  8422. }
  8423. __proto.initFixScale=function(){
  8424. this.fixScale=this._target.height / this._target.width;
  8425. }
  8426. __proto.onMouseMove=function(e){
  8427. var scale=1;
  8428. var tx=(Laya.stage.mouseX-this._lastPoint.x)/ scale;
  8429. var ty=(Laya.stage.mouseY-this._lastPoint.y)/ scale;
  8430. var sameScale=false;
  8431. var adptX=NaN;
  8432. var adptY=NaN;
  8433. if(e.nativeEvent.shiftKey){
  8434. if(this.fixScale<0)this.initFixScale();
  8435. adptY=tx *this.fixScale;
  8436. adptX=ty/this.fixScale;
  8437. sameScale=true;
  8438. switch(this._currDir){
  8439. case this._topLeft:
  8440. case this._bottomLeft:
  8441. this._currDir=this._left;
  8442. break ;
  8443. case this._topRight:
  8444. case this._bottomRight:
  8445. this._currDir=this._right;
  8446. break ;
  8447. }
  8448. }
  8449. if (tx !=0 || ty !=0){
  8450. this._lastPoint.x+=tx *scale;
  8451. this._lastPoint.y+=ty *scale;
  8452. var tw=tx / this._target.scaleX;
  8453. var th=ty / this._target.scaleY;
  8454. if (this._currDir==this._left){
  8455. this._target.x+=tx;
  8456. this._target.width-=tw;
  8457. if (sameScale){
  8458. this._target.height=this._target.width*this.fixScale;
  8459. }
  8460. }else if (this._currDir==this._right){
  8461. this._target.width+=tw;
  8462. if (sameScale){
  8463. this._target.height=this._target.width*this.fixScale;
  8464. }
  8465. }else if (this._currDir==this._top){
  8466. this._target.y+=ty;
  8467. this._target.height-=th;
  8468. if (sameScale){
  8469. this._target.width=this._target.height/this.fixScale;
  8470. }
  8471. }else if (this._currDir==this._bottom){
  8472. this._target.height+=th;
  8473. if (sameScale){
  8474. this._target.width=this._target.height/this.fixScale;
  8475. }
  8476. }else if (this._currDir==this._topLeft){
  8477. this._target.x+=tx;
  8478. this._target.y+=ty;
  8479. this._target.width-=tw;
  8480. this._target.height-=th;
  8481. }else if (this._currDir==this._topRight){
  8482. this._target.y+=ty;
  8483. this._target.width+=tw;
  8484. this._target.height-=th;
  8485. }else if (this._currDir==this._bottomLeft){
  8486. this._target.x+=tx;
  8487. this._target.width-=tw;
  8488. this._target.height+=th;
  8489. }else if (this._currDir==this._bottomRight){
  8490. this._target.width+=tw;
  8491. this._target.height+=th;
  8492. }
  8493. if (this._target.width < 1){
  8494. this._target.width=1;
  8495. }
  8496. if (this._target.height < 1){
  8497. this._target.height=1;
  8498. }
  8499. this._target.width=Math.round(this._target.width);
  8500. this._target.x=Math.round(this._target.x);
  8501. this._target.y=Math.round(this._target.y);
  8502. this._target.height=Math.round(this._target.height);
  8503. this.refresh();
  8504. }
  8505. }
  8506. /**画矩形*/
  8507. __proto.drawBorder=function(width,height,color,alpha){
  8508. (alpha===void 0)&& (alpha=1);
  8509. var box=new Sprite();
  8510. var g=box.graphics;
  8511. g.clear();
  8512. g.drawRect(0,0,width,height,null,"#"+color);
  8513. return box;
  8514. }
  8515. /**画矩形*/
  8516. __proto.drawBlock=function(){
  8517. var box=new Sprite();
  8518. var g=box.graphics;
  8519. g.clear();
  8520. box.width=DragBox.BLOCK_WIDTH;
  8521. box.height=DragBox.BLOCK_WIDTH;
  8522. g.drawRect(-DragBox.BLOCK_WIDTH *0.5,-DragBox.BLOCK_WIDTH *0.5,DragBox.BLOCK_WIDTH,DragBox.BLOCK_WIDTH,"#ffffff","#ff0000",1);
  8523. box.mouseEnabled=true;
  8524. box.mouseThrough=true;
  8525. return box;
  8526. }
  8527. /**设置对象*/
  8528. __proto.setTarget=function(target){
  8529. this._target=target;
  8530. this.refresh();
  8531. }
  8532. __proto.refresh=function(){
  8533. this.changePoint();
  8534. this.changeSize();
  8535. }
  8536. __proto.changePoint=function(){
  8537. var p=this._target.localToGlobal(new Point());
  8538. var np=(this.parent).globalToLocal(p);
  8539. this.x=np.x;
  8540. this.y=np.y;
  8541. }
  8542. /**设置大小*/
  8543. __proto.changeSize=function(){
  8544. var width=this._target.width *this._target.scaleX;
  8545. var height=this._target.height *this._target.scaleY;
  8546. console.log("change size");
  8547. this.rotation=this._target.rotation;
  8548. if (this._box.width !=width || this._box.height !=height){
  8549. this._box.graphics.clear();
  8550. this._box.graphics.drawRect(0,0,Math.abs(width),Math.abs(height),null,"#ff0000");
  8551. this._box.size(width,height);
  8552. this.size(width,height);
  8553. this._box.scaleX=Math.abs(this._box.scaleX)*(this._target.scaleX > 0 ? 1 :-1);
  8554. this._box.scaleY=Math.abs(this._box.scaleY)*(this._target.scaleY > 0 ? 1 :-1);
  8555. this._left.x=0;
  8556. this._left.y=height *0.5;
  8557. this._right.x=width;
  8558. this._right.y=height *0.5;
  8559. this._top.x=width *0.5;
  8560. this._top.y=0;
  8561. this._bottom.x=width *0.5;
  8562. this._bottom.y=height;
  8563. this._topLeft.x=this._topLeft.y=0;
  8564. this._topRight.x=width;
  8565. this._topRight.y=0;
  8566. this._bottomLeft.x=0;
  8567. this._bottomLeft.y=height;
  8568. this._bottomRight.x=width;
  8569. this._bottomRight.y=height;
  8570. }
  8571. }
  8572. DragBox.BLOCK_WIDTH=6;
  8573. return DragBox;
  8574. })(Sprite)
  8575. /**
  8576. *
  8577. *@author ww
  8578. *@version 1.0
  8579. *
  8580. *@created 2015-12-30 下午2:03:32
  8581. */
  8582. //class laya.debug.tools.comps.ArrowLine extends laya.display.Sprite
  8583. var ArrowLine=(function(_super){
  8584. function ArrowLine(sign){
  8585. this.lineLen=160;
  8586. this.arrowLen=10;
  8587. this.sign="Y";
  8588. this._targetChanger=null;
  8589. this._isMoving=false;
  8590. this.lenControl=new Rect();
  8591. this.rotationControl=new Rect();
  8592. this.lenChanger=ValueChanger.create(this,"lineLen");
  8593. this.lenControlXChanger=ValueChanger.create(this.lenControl,"x");
  8594. (sign===void 0)&& (sign="X");
  8595. ArrowLine.__super.call(this);
  8596. this.sign=sign;
  8597. this.addChild(this.lenControl);
  8598. this.addChild(this.rotationControl);
  8599. this.lenControl.on(/*laya.events.Event.MOUSE_DOWN*/"mousedown",this,this.controlMouseDown);
  8600. this.drawMe();
  8601. }
  8602. __class(ArrowLine,'laya.debug.tools.comps.ArrowLine',_super);
  8603. var __proto=ArrowLine.prototype;
  8604. __proto.drawMe=function(){
  8605. var g;
  8606. g=this.graphics;
  8607. g.clear();
  8608. g.drawLine(0,0,this.lineLen,0,"#ffff00");
  8609. g.drawLine(this.lineLen,0,this.lineLen-this.arrowLen,-this.arrowLen,"#ff0000");
  8610. g.drawLine(this.lineLen,0,this.lineLen-this.arrowLen,this.arrowLen,"#ff0000");
  8611. g.fillText(this.sign,50,-5,"","#ff0000","left");
  8612. if(this._isMoving&&this._targetChanger){
  8613. g.fillText(this._targetChanger.key+":"+this._targetChanger.value.toFixed(2),this.lineLen-15,-25,"","#ffff00","center");
  8614. }
  8615. this.lenControl.posTo(this.lineLen-15,0);
  8616. this.rotationControl.posTo(this.lineLen+10,0);
  8617. this.size(this.arrowLen,this.lineLen);
  8618. }
  8619. __proto.clearMoveEvents=function(){
  8620. Laya.stage.off(/*laya.events.Event.MOUSE_MOVE*/"mousemove",this,this.stageMouseMove);
  8621. Laya.stage.off(/*laya.events.Event.MOUSE_UP*/"mouseup",this,this.stageMouseUp);
  8622. }
  8623. __proto.controlMouseDown=function(e){
  8624. this.clearMoveEvents();
  8625. this.lenControlXChanger.record();
  8626. this.lenChanger.record();
  8627. if(this.targetChanger){
  8628. this.targetChanger.record();
  8629. }
  8630. this._isMoving=true;
  8631. Laya.stage.on(/*laya.events.Event.MOUSE_MOVE*/"mousemove",this,this.stageMouseMove);
  8632. Laya.stage.on(/*laya.events.Event.MOUSE_UP*/"mouseup",this,this.stageMouseUp);
  8633. }
  8634. __proto.stageMouseMove=function(e){
  8635. this.lenControlXChanger.value=this.mouseX;
  8636. this.lenChanger.showValueByScale(this.lenControlXChanger.scaleValue);
  8637. if(this.targetChanger){
  8638. this.targetChanger.showValueByScale(this.lenControlXChanger.scaleValue);
  8639. }
  8640. this.drawMe();
  8641. }
  8642. __proto.stageMouseUp=function(e){
  8643. this._isMoving=false;
  8644. this.noticeChange();
  8645. this.clearMoveEvents();
  8646. this.lenControlXChanger.recover();
  8647. this.lenChanger.recover();
  8648. this.drawMe();
  8649. }
  8650. __proto.noticeChange=function(){
  8651. var dLen=NaN;
  8652. dLen=this.lenChanger.dValue;
  8653. console.log("lenChange:",dLen);
  8654. }
  8655. __getset(0,__proto,'targetChanger',function(){
  8656. return this._targetChanger;
  8657. },function(changer){
  8658. if(this._targetChanger){
  8659. this._targetChanger.dispose();
  8660. }
  8661. this._targetChanger=changer;
  8662. });
  8663. return ArrowLine;
  8664. })(Sprite)
  8665. /**
  8666. *...
  8667. *@author ww
  8668. */
  8669. //class laya.debug.view.nodeInfo.NodeInfoPanel extends laya.display.Sprite
  8670. var NodeInfoPanel=(function(_super){
  8671. function NodeInfoPanel(){
  8672. this._stateDic={};
  8673. this.isWorkState=false;
  8674. NodeInfoPanel.__super.call(this);
  8675. }
  8676. __class(NodeInfoPanel,'laya.debug.view.nodeInfo.NodeInfoPanel',_super);
  8677. var __proto=NodeInfoPanel.prototype;
  8678. __proto.showDisInfo=function(node){
  8679. this.recoverNodes();
  8680. NodeInfosItem.showDisInfos(node);
  8681. this.showOnly(node);
  8682. this.isWorkState=true;
  8683. }
  8684. __proto.showOnly=function(node){
  8685. if (!node)
  8686. return;
  8687. this.hideBrothers(node);
  8688. this.showOnly(node.parent);
  8689. }
  8690. __proto.recoverNodes=function(){
  8691. NodeInfosItem.hideAllInfos();
  8692. var key;
  8693. var data;
  8694. var tTar;
  8695. for (key in this._stateDic){
  8696. data=this._stateDic[key];
  8697. tTar=data["target"];
  8698. if (tTar){
  8699. try{
  8700. tTar.visible=data.visible;
  8701. }catch (e){
  8702. }
  8703. }
  8704. }
  8705. this.isWorkState=false;
  8706. }
  8707. __proto.hideOtherChain=function(node){
  8708. if (!node)
  8709. return;
  8710. while (node){
  8711. this.hideBrothers(node);
  8712. node=node.parent;
  8713. }
  8714. }
  8715. __proto.hideChilds=function(node){
  8716. if (!node)
  8717. return;
  8718. var i=0,len=0;
  8719. var cList;
  8720. cList=node._children;
  8721. len=cList.length;
  8722. var tChild;
  8723. for (i=0;i < len;i++){
  8724. tChild=cList[i];
  8725. if (tChild==NodeInfosItem.NodeInfoContainer)continue ;
  8726. this.saveNodeInfo(tChild);
  8727. tChild.visible=false;
  8728. }
  8729. }
  8730. __proto.hideBrothers=function(node){
  8731. if (!node)
  8732. return;
  8733. var p;
  8734. p=node.parent;
  8735. if (!p)
  8736. return;
  8737. var i=0,len=0;
  8738. var cList;
  8739. cList=p._children;
  8740. len=cList.length;
  8741. var tChild;
  8742. for (i=0;i < len;i++){
  8743. tChild=cList[i];
  8744. if (tChild==NodeInfosItem.NodeInfoContainer)continue ;
  8745. if (tChild !=node){
  8746. this.saveNodeInfo(tChild);
  8747. tChild.visible=false;
  8748. }
  8749. }
  8750. }
  8751. __proto.saveNodeInfo=function(node){
  8752. IDTools.idObj(node);
  8753. if(this._stateDic.hasOwnProperty(IDTools.getObjID(node)))return;
  8754. var data;
  8755. data={};
  8756. data.target=node;
  8757. data.visible=node.visible;
  8758. this._stateDic[IDTools.getObjID(node)]=data;
  8759. }
  8760. __proto.recoverNodeInfo=function(node){
  8761. IDTools.idObj(node);
  8762. if (this._stateDic.hasOwnProperty(IDTools.getObjID(node))){
  8763. var data;
  8764. data=this._stateDic[IDTools.getObjID(node)];
  8765. node["visible"]=data.visible;
  8766. }
  8767. }
  8768. NodeInfoPanel.init=function(){
  8769. if (!NodeInfoPanel.I){
  8770. NodeInfoPanel.I=new NodeInfoPanel();
  8771. NodeInfosItem.init();
  8772. }
  8773. }
  8774. NodeInfoPanel.I=null;
  8775. return NodeInfoPanel;
  8776. })(Sprite)
  8777. /**
  8778. *自动根据大小填充自己全部区域的显示对象
  8779. *@author ww
  8780. */
  8781. //class laya.debug.tools.resizer.AutoFillRec extends laya.display.Sprite
  8782. var AutoFillRec=(function(_super){
  8783. function AutoFillRec(type){
  8784. this.type=0;
  8785. this.preX=NaN;
  8786. this.preY=NaN;
  8787. AutoFillRec.__super.call(this);
  8788. }
  8789. __class(AutoFillRec,'laya.debug.tools.resizer.AutoFillRec',_super);
  8790. var __proto=AutoFillRec.prototype;
  8791. __proto.changeSize=function(){
  8792. var g=this.graphics;
  8793. g.clear();
  8794. g.drawRect(0,0,this.width,this.height,"#33c5f5");
  8795. }
  8796. __proto.record=function(){
  8797. this.preX=this.x;
  8798. this.preY=this.y;
  8799. }
  8800. __proto.getDx=function(){
  8801. return this.x-this.preX;
  8802. }
  8803. __proto.getDy=function(){
  8804. return this.y-this.preY;
  8805. }
  8806. //super(type);
  8807. __getset(0,__proto,'width',_super.prototype._$get_width,function(value){
  8808. Laya.superSet(Sprite,this,'width',value);
  8809. this.changeSize();
  8810. });
  8811. __getset(0,__proto,'height',_super.prototype._$get_height,function(value){
  8812. Laya.superSet(Sprite,this,'height',value);
  8813. this.changeSize();
  8814. });
  8815. return AutoFillRec;
  8816. })(Sprite)
  8817. /**
  8818. *
  8819. *@author ww
  8820. *@version 1.0
  8821. *
  8822. *@created 2015-9-29 上午11:17:35
  8823. */
  8824. //class laya.debug.tools.debugUI.DButton extends laya.display.Text
  8825. var DButton=(function(_super){
  8826. function DButton(){
  8827. DButton.__super.call(this);
  8828. this.bgColor="#ffff00";
  8829. this.wordWrap=false;
  8830. this.mouseEnabled=true;
  8831. }
  8832. __class(DButton,'laya.debug.tools.debugUI.DButton',_super);
  8833. return DButton;
  8834. })(Text)
  8835. /**
  8836. *...
  8837. *@author ww
  8838. */
  8839. //class laya.debug.view.nodeInfo.recinfos.ReCacheRecInfo extends laya.debug.view.nodeInfo.recinfos.NodeRecInfo
  8840. var ReCacheRecInfo=(function(_super){
  8841. function ReCacheRecInfo(){
  8842. this.isWorking=false;
  8843. this.count=0;
  8844. this.mTime=0;
  8845. ReCacheRecInfo.__super.call(this);
  8846. this.txt.fontSize=12;
  8847. }
  8848. __class(ReCacheRecInfo,'laya.debug.view.nodeInfo.recinfos.ReCacheRecInfo',_super);
  8849. var __proto=ReCacheRecInfo.prototype;
  8850. __proto.addCount=function(time){
  8851. (time===void 0)&& (time=0);
  8852. this.count++;
  8853. this.mTime+=time;
  8854. if (!this.isWorking){
  8855. this.working=true;
  8856. }
  8857. }
  8858. __proto.updates=function(){
  8859. if (!this._tar["displayedInStage"]){
  8860. this.working=false;
  8861. this.removeSelf();
  8862. }
  8863. this.txt.text=ClassTool.getNodeClassAndName(this._tar)+"\n"+"reCache:"+this.count+"\ntime:"+this.mTime;
  8864. if (this.count > 0){
  8865. this.fresh();
  8866. Laya.timer.clear(this,this.removeSelfLater);
  8867. }else{
  8868. this.working=false;
  8869. Laya.timer.once(3000,this,this.removeSelfLater);
  8870. }
  8871. this.count=0;
  8872. this.mTime=0;
  8873. }
  8874. __proto.removeSelfLater=function(){
  8875. this.working=false;
  8876. this.removeSelf();
  8877. }
  8878. __getset(0,__proto,'working',null,function(v){
  8879. this.isWorking=v;
  8880. if (v){
  8881. Laya.timer.loop(1000,this,this.updates);
  8882. }else{
  8883. Laya.timer.clear(this,this.updates);
  8884. }
  8885. });
  8886. ReCacheRecInfo.showTime=3000;
  8887. return ReCacheRecInfo;
  8888. })(NodeRecInfo)
  8889. /**
  8890. *...
  8891. *@author ww
  8892. */
  8893. //class laya.debug.tools.debugUI.DInput extends laya.display.Input
  8894. var DInput=(function(_super){
  8895. function DInput(){
  8896. DInput.__super.call(this);
  8897. this.bgColor="#11ff00";
  8898. }
  8899. __class(DInput,'laya.debug.tools.debugUI.DInput',_super);
  8900. return DInput;
  8901. })(Input)
  8902. })(window,document,Laya);