vendor.min.js 917 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681
  1. /* Modernizr 2.6.2 (Custom Build) | MIT & BSD
  2. * Build: http://modernizr.com/download/#-fontface-backgroundsize-borderimage-borderradius-boxshadow-flexbox-hsla-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-applicationcache-canvas-canvastext-draganddrop-hashchange-history-audio-video-indexeddb-input-inputtypes-localstorage-postmessage-sessionstorage-websockets-websqldatabase-webworkers-geolocation-inlinesvg-smil-svg-svgclippaths-touch-webgl-shiv-mq-cssclasses-addtest-prefixed-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-load
  3. */
  4. ;window.Modernizr=function(a,b,c){function D(a){j.cssText=a}function E(a,b){return D(n.join(a+";")+(b||""))}function F(a,b){return typeof a===b}function G(a,b){return!!~(""+a).indexOf(b)}function H(a,b){for(var d in a){var e=a[d];if(!G(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function I(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:F(f,"function")?f.bind(d||b):f}return!1}function J(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+p.join(d+" ")+d).split(" ");return F(b,"string")||F(b,"undefined")?H(e,b):(e=(a+" "+q.join(d+" ")+d).split(" "),I(e,b,c))}function K(){e.input=function(c){for(var d=0,e=c.length;d<e;d++)u[c[d]]=c[d]in k;return u.list&&(u.list=!!b.createElement("datalist")&&!!a.HTMLDataListElement),u}("autocomplete autofocus list placeholder max min multiple pattern required step".split(" ")),e.inputtypes=function(a){for(var d=0,e,f,h,i=a.length;d<i;d++)k.setAttribute("type",f=a[d]),e=k.type!=="text",e&&(k.value=l,k.style.cssText="position:absolute;visibility:hidden;",/^range$/.test(f)&&k.style.WebkitAppearance!==c?(g.appendChild(k),h=b.defaultView,e=h.getComputedStyle&&h.getComputedStyle(k,null).WebkitAppearance!=="textfield"&&k.offsetHeight!==0,g.removeChild(k)):/^(search|tel)$/.test(f)||(/^(url|email)$/.test(f)?e=k.checkValidity&&k.checkValidity()===!1:e=k.value!=l)),t[a[d]]=!!e;return t}("search tel url email datetime date month week time datetime-local number range color".split(" "))}var d="2.6.2",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k=b.createElement("input"),l=":)",m={}.toString,n=" -webkit- -moz- -o- -ms- ".split(" "),o="Webkit Moz O ms",p=o.split(" "),q=o.toLowerCase().split(" "),r={svg:"http://www.w3.org/2000/svg"},s={},t={},u={},v=[],w=v.slice,x,y=function(a,c,d,e){var f,i,j,k,l=b.createElement("div"),m=b.body,n=m||b.createElement("body");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:h+(d+1),l.appendChild(j);return f=["&#173;",'<style id="s',h,'">',a,"</style>"].join(""),l.id=h,(m?l:n).innerHTML+=f,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=g.style.overflow,g.style.overflow="hidden",g.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),g.style.overflow=k),!!i},z=function(b){var c=a.matchMedia||a.msMatchMedia;if(c)return c(b).matches;var d;return y("@media "+b+" { #"+h+" { position: absolute; } }",function(b){d=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle)["position"]=="absolute"}),d},A=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;return f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=F(e[d],"function"),F(e[d],"undefined")||(e[d]=c),e.removeAttribute(d))),e=null,f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),B={}.hasOwnProperty,C;!F(B,"undefined")&&!F(B.call,"undefined")?C=function(a,b){return B.call(a,b)}:C=function(a,b){return b in a&&F(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=w.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(w.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(w.call(arguments)))};return e}),s.flexbox=function(){return J("flexWrap")},s.canvas=function(){var a=b.createElement("canvas");return!!a.getContext&&!!a.getContext("2d")},s.canvastext=function(){return!!e.canvas&&!!F(b.createElement("canvas").getContext("2d").fillText,"function")},s.webgl=function(){return!!a.WebGLRenderingContext},s.touch=function(){var c;return"ontouchstart"in a||a.DocumentTouch&&b instanceof DocumentTouch?c=!0:y(["@media (",n.join("touch-enabled),("),h,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(a){c=a.offsetTop===9}),c},s.geolocation=function(){return"geolocation"in navigator},s.postmessage=function(){return!!a.postMessage},s.websqldatabase=function(){return!!a.openDatabase},s.indexedDB=function(){return!!J("indexedDB",a)},s.hashchange=function(){return A("hashchange",a)&&(b.documentMode===c||b.documentMode>7)},s.history=function(){return!!a.history&&!!history.pushState},s.draganddrop=function(){var a=b.createElement("div");return"draggable"in a||"ondragstart"in a&&"ondrop"in a},s.websockets=function(){return"WebSocket"in a||"MozWebSocket"in a},s.rgba=function(){return D("background-color:rgba(150,255,150,.5)"),G(j.backgroundColor,"rgba")},s.hsla=function(){return D("background-color:hsla(120,40%,100%,.5)"),G(j.backgroundColor,"rgba")||G(j.backgroundColor,"hsla")},s.multiplebgs=function(){return D("background:url(https://),url(https://),red url(https://)"),/(url\s*\(.*?){3}/.test(j.background)},s.backgroundsize=function(){return J("backgroundSize")},s.borderimage=function(){return J("borderImage")},s.borderradius=function(){return J("borderRadius")},s.boxshadow=function(){return J("boxShadow")},s.textshadow=function(){return b.createElement("div").style.textShadow===""},s.opacity=function(){return E("opacity:.55"),/^0.55$/.test(j.opacity)},s.cssanimations=function(){return J("animationName")},s.csscolumns=function(){return J("columnCount")},s.cssgradients=function(){var a="background-image:",b="gradient(linear,left top,right bottom,from(#9f9),to(white));",c="linear-gradient(left top,#9f9, white);";return D((a+"-webkit- ".split(" ").join(b+a)+n.join(c+a)).slice(0,-a.length)),G(j.backgroundImage,"gradient")},s.cssreflections=function(){return J("boxReflect")},s.csstransforms=function(){return!!J("transform")},s.csstransforms3d=function(){var a=!!J("perspective");return a&&"webkitPerspective"in g.style&&y("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(b,c){a=b.offsetLeft===9&&b.offsetHeight===3}),a},s.csstransitions=function(){return J("transition")},s.fontface=function(){var a;return y('@font-face {font-family:"font";src:url("https://")}',function(c,d){var e=b.getElementById("smodernizr"),f=e.sheet||e.styleSheet,g=f?f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||"":"";a=/src/i.test(g)&&g.indexOf(d.split(" ")[0])===0}),a},s.generatedcontent=function(){var a;return y(["#",h,"{font:0/0 a}#",h,':after{content:"',l,'";visibility:hidden;font:3px/1 a}'].join(""),function(b){a=b.offsetHeight>=3}),a},s.video=function(){var a=b.createElement("video"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),c.h264=a.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,"")}catch(d){}return c},s.audio=function(){var a=b.createElement("audio"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),c.mp3=a.canPlayType("audio/mpeg;").replace(/^no$/,""),c.wav=a.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),c.m4a=(a.canPlayType("audio/x-m4a;")||a.canPlayType("audio/aac;")).replace(/^no$/,"")}catch(d){}return c},s.localstorage=function(){try{return localStorage.setItem(h,h),localStorage.removeItem(h),!0}catch(a){return!1}},s.sessionstorage=function(){try{return sessionStorage.setItem(h,h),sessionStorage.removeItem(h),!0}catch(a){return!1}},s.webworkers=function(){return!!a.Worker},s.applicationcache=function(){return!!a.applicationCache},s.svg=function(){return!!b.createElementNS&&!!b.createElementNS(r.svg,"svg").createSVGRect},s.inlinesvg=function(){var a=b.createElement("div");return a.innerHTML="<svg/>",(a.firstChild&&a.firstChild.namespaceURI)==r.svg},s.smil=function(){return!!b.createElementNS&&/SVGAnimate/.test(m.call(b.createElementNS(r.svg,"animate")))},s.svgclippaths=function(){return!!b.createElementNS&&/SVGClipPath/.test(m.call(b.createElementNS(r.svg,"clipPath")))};for(var L in s)C(s,L)&&(x=L.toLowerCase(),e[x]=s[L](),v.push((e[x]?"":"no-")+x));return e.input||K(),e.addTest=function(a,b){if(typeof a=="object")for(var d in a)C(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},D(""),i=k=null,function(a,b){function k(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function l(){var a=r.elements;return typeof a=="string"?a.split(" "):a}function m(a){var b=i[a[g]];return b||(b={},h++,a[g]=h,i[h]=b),b}function n(a,c,f){c||(c=b);if(j)return c.createElement(a);f||(f=m(c));var g;return f.cache[a]?g=f.cache[a].cloneNode():e.test(a)?g=(f.cache[a]=f.createElem(a)).cloneNode():g=f.createElem(a),g.canHaveChildren&&!d.test(a)?f.frag.appendChild(g):g}function o(a,c){a||(a=b);if(j)return a.createDocumentFragment();c=c||m(a);var d=c.frag.cloneNode(),e=0,f=l(),g=f.length;for(;e<g;e++)d.createElement(f[e]);return d}function p(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return r.shivMethods?n(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+l().join().replace(/\w+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(r,b.frag)}function q(a){a||(a=b);var c=m(a);return r.shivCSS&&!f&&!c.hasCSS&&(c.hasCSS=!!k(a,"article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}mark{background:#FF0;color:#000}")),j||p(a,c),a}var c=a.html5||{},d=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,e=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,f,g="_html5shiv",h=0,i={},j;(function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",f="hidden"in a,j=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){f=!0,j=!0}})();var r={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:c.shivCSS!==!1,supportsUnknownElements:j,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:q,createElement:n,createDocumentFragment:o};a.html5=r,q(b)}(this,b),e._version=d,e._prefixes=n,e._domPrefixes=q,e._cssomPrefixes=p,e.mq=z,e.hasEvent=A,e.testProp=function(a){return H([a])},e.testAllProps=J,e.testStyles=y,e.prefixed=function(a,b,c){return b?J(a,b,c):J(a,"pfx")},g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+v.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f<d;f++)g=a[f].split("="),(e=z[g.shift()])&&(c=e(c,g));for(f=0;f<b;f++)c=x[f](c);return c}function g(a,e,f,g,h){var i=b(a),j=i.autoCallback;i.url.split(".").pop().split("?").shift(),i.bypass||(e&&(e=d(e)?e:e[a]||e[g]||e[a.split("/").pop().split("?")[0]]),i.instead?i.instead(a,e,f,g,h):(y[i.url]?i.noexec=!0:y[i.url]=1,f.load(i.url,i.forceCSS||!i.forceJS&&"css"==i.url.split(".").pop().split("?").shift()?"c":c,i.noexec,i.attrs,i.timeout),(d(e)||d(j))&&f.load(function(){k(),e&&e(i.origUrl,h,g),j&&j(i.origUrl,h,g),y[i.url]=2})))}function h(a,b){function c(a,c){if(a){if(e(a))c||(j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}),g(a,j,b,0,h);else if(Object(a)===a)for(n in m=function(){var b=0,c;for(c in a)a.hasOwnProperty(c)&&b++;return b}(),a)a.hasOwnProperty(n)&&(!c&&!--m&&(d(j)?j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}:j[n]=function(a){return function(){var b=[].slice.call(arguments);a&&a.apply(this,b),l()}}(k[n])),g(a[n],j,b,n,h))}else!c&&l()}var h=!!a.test,i=a.load||a.both,j=a.callback||f,k=j,l=a.complete||f,m,n;c(h?a.yep:a.nope,!!i),i&&c(i)}var i,j,l=this.yepnope.loader;if(e(a))g(a,0,l,0);else if(w(a))for(i=0;i<a.length;i++)j=a[i],e(j)?g(j,0,l,0):w(j)?B(j):Object(j)===j&&h(j,l);else Object(a)===a&&h(a,l)},B.addPrefix=function(a,b){z[a]=b},B.addFilter=function(a){x.push(a)},B.errorTimeout=1e4,null==b.readyState&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",A=function(){b.removeEventListener("DOMContentLoaded",A,0),b.readyState="complete"},0)),a.yepnope=k(),a.yepnope.executeStack=h,a.yepnope.injectJs=function(a,c,d,e,i,j){var k=b.createElement("script"),l,o,e=e||B.errorTimeout;k.src=a;for(o in d)k.setAttribute(o,d[o]);c=j?h:c||f,k.onreadystatechange=k.onload=function(){!l&&g(k.readyState)&&(l=1,c(),k.onload=k.onreadystatechange=null)},m(function(){l||(l=1,c(1))},e),i?k.onload():n.parentNode.insertBefore(k,n)},a.yepnope.injectCss=function(a,c,d,e,g,i){var e=b.createElement("link"),j,c=i?h:c||f;e.href=a,e.rel="stylesheet",e.type="text/css";for(j in d)e.setAttribute(j,d[j]);g||(n.parentNode.insertBefore(e,n),m(c,0))}}(this,document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))};
  5. /*! jQuery v2.1.4 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */
  6. !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b="length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function ra(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){
  7. return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=L.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var Q=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,R=["Top","Right","Bottom","Left"],S=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},T=/^(?:checkbox|radio)$/i;!function(){var a=l.createDocumentFragment(),b=a.appendChild(l.createElement("div")),c=l.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||l,d=c.documentElement,e=c.body,a.pageX=b.clientX+(d&&d.scrollLeft||e&&e.scrollLeft||0)-(d&&d.clientLeft||e&&e.clientLeft||0),a.pageY=b.clientY+(d&&d.scrollTop||e&&e.scrollTop||0)-(d&&d.clientTop||e&&e.clientTop||0)),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=W.test(e)?this.mouseHooks:V.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=l),3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==_()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===_()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&n.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?Z:$):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:$,isPropagationStopped:$,isImmediatePropagationStopped:$,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=Z,a&&a.preventDefault&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=Z,a&&a.stopPropagation&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=Z,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.focusinBubbles||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=L.access(d,b);e||d.addEventListener(a,c,!0),L.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=L.access(d,b)-1;e?L.access(d,b,e):(d.removeEventListener(a,c,!0),L.remove(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(g in a)this.on(g,b,c,a[g],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=$;else if(!d)return this;return 1===e&&(f=d,d=function(a){return n().off(a),f.apply(this,arguments)},d.guid=f.guid||(f.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=$),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ba=/<([\w:]+)/,ca=/<|&#?\w+;/,da=/<(?:script|style|link)/i,ea=/checked\s*(?:[^=]|=\s*.checked.)/i,fa=/^$|\/(?:java|ecma)script/i,ga=/^true\/(.*)/,ha=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ia={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ia.optgroup=ia.option,ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead,ia.th=ia.td;function ja(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function ka(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function la(a){var b=ga.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function ma(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function na(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function oa(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pa(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=oa(h),f=oa(a),d=0,e=f.length;e>d;d++)pa(f[d],g[d]);if(b)if(c)for(f=f||oa(a),g=g||oa(h),d=0,e=f.length;e>d;d++)na(f[d],g[d]);else na(a,h);return g=oa(h,"script"),g.length>0&&ma(g,!i&&oa(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(ca.test(e)){f=f||k.appendChild(b.createElement("div")),g=(ba.exec(e)||["",""])[1].toLowerCase(),h=ia[g]||ia._default,f.innerHTML=h[1]+e.replace(aa,"<$1></$2>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=oa(k.appendChild(e),"script"),i&&ma(f),c)){j=0;while(e=f[j++])fa.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(oa(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&ma(oa(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(oa(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!da.test(a)&&!ia[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(aa,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(oa(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(oa(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&ea.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(oa(c,"script"),ka),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,oa(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,la),j=0;g>j;j++)h=f[j],fa.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(ha,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qa,ra={};function sa(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function ta(a){var b=l,c=ra[a];return c||(c=sa(a,b),"none"!==c&&c||(qa=(qa||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=qa[0].contentDocument,b.write(),b.close(),c=sa(a,b),qa.detach()),ra[a]=c),c}var ua=/^margin/,va=new RegExp("^("+Q+")(?!px)[a-z%]+$","i"),wa=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)};function xa(a,b,c){var d,e,f,g,h=a.style;return c=c||wa(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),va.test(g)&&ua.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function ya(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d=l.documentElement,e=l.createElement("div"),f=l.createElement("div");if(f.style){f.style.backgroundClip="content-box",f.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===f.style.backgroundClip,e.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",e.appendChild(f);function g(){f.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",f.innerHTML="",d.appendChild(e);var g=a.getComputedStyle(f,null);b="1%"!==g.top,c="4px"===g.width,d.removeChild(e)}a.getComputedStyle&&n.extend(k,{pixelPosition:function(){return g(),b},boxSizingReliable:function(){return null==c&&g(),c},reliableMarginRight:function(){var b,c=f.appendChild(l.createElement("div"));return c.style.cssText=f.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",f.style.width="1px",d.appendChild(e),b=!parseFloat(a.getComputedStyle(c,null).marginRight),d.removeChild(e),f.removeChild(c),b}})}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var za=/^(none|table(?!-c[ea]).+)/,Aa=new RegExp("^("+Q+")(.*)$","i"),Ba=new RegExp("^([+-])=("+Q+")","i"),Ca={position:"absolute",visibility:"hidden",display:"block"},Da={letterSpacing:"0",fontWeight:"400"},Ea=["Webkit","O","Moz","ms"];function Fa(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),d=b,e=Ea.length;while(e--)if(b=Ea[e]+c,b in a)return b;return d}function Ga(a,b,c){var d=Aa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Ha(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+R[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+R[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+R[f]+"Width",!0,e))):(g+=n.css(a,"padding"+R[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+R[f]+"Width",!0,e)));return g}function Ia(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=wa(a),g="border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=xa(a,b,f),(0>e||null==e)&&(e=a.style[b]),va.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Ha(a,b,c||(g?"border":"content"),d,f)+"px"}function Ja(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=L.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&S(d)&&(f[g]=L.access(d,"olddisplay",ta(d.nodeName)))):(e=S(d),"none"===c&&e||L.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=xa(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Fa(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Ba.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Fa(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=xa(a,b,d)),"normal"===e&&b in Da&&(e=Da[b]),""===c||c?(f=parseFloat(e),c===!0||n.isNumeric(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?za.test(n.css(a,"display"))&&0===a.offsetWidth?n.swap(a,Ca,function(){return Ia(a,b,d)}):Ia(a,b,d):void 0},set:function(a,c,d){var e=d&&wa(a);return Ga(a,c,d?Ha(a,b,d,"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),n.cssHooks.marginRight=ya(k.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},xa,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+R[d]+b]=f[d]||f[d-2]||f[0];return e}},ua.test(a)||(n.cssHooks[a+b].set=Ga)}),n.fn.extend({css:function(a,b){return J(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=wa(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Ja(this,!0)},hide:function(){return Ja(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){S(this)?n(this).show():n(this).hide()})}});function Ka(a,b,c,d,e){return new Ka.prototype.init(a,b,c,d,e)}n.Tween=Ka,Ka.prototype={constructor:Ka,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Ka.propHooks[this.prop];return a&&a.get?a.get(this):Ka.propHooks._default.get(this)},run:function(a){var b,c=Ka.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ka.propHooks._default.set(this),this}},Ka.prototype.init.prototype=Ka.prototype,Ka.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Ka.propHooks.scrollTop=Ka.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=Ka.prototype.init,n.fx.step={};var La,Ma,Na=/^(?:toggle|show|hide)$/,Oa=new RegExp("^(?:([+-])=|)("+Q+")([a-z%]*)$","i"),Pa=/queueHooks$/,Qa=[Va],Ra={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=Oa.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&Oa.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function Sa(){return setTimeout(function(){La=void 0}),La=n.now()}function Ta(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ua(a,b,c){for(var d,e=(Ra[b]||[]).concat(Ra["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Va(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&S(a),q=L.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?L.get(a,"olddisplay")||ta(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Na.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?ta(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=L.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;L.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ua(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function Wa(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Xa(a,b,c){var d,e,f=0,g=Qa.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=La||Sa(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:La||Sa(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Wa(k,j.opts.specialEasing);g>f;f++)if(d=Qa[f].call(j,a,k,j.opts))return d;return n.map(k,Ua,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(Xa,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],Ra[c]=Ra[c]||[],Ra[c].unshift(b)},prefilter:function(a,b){b?Qa.unshift(a):Qa.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(S).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=Xa(this,n.extend({},a),f);(e||L.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=L.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Pa.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=L.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Ta(b,!0),a,d,e)}}),n.each({slideDown:Ta("show"),slideUp:Ta("hide"),slideToggle:Ta("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(La=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),La=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Ma||(Ma=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(Ma),Ma=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a=l.createElement("input"),b=l.createElement("select"),c=b.appendChild(l.createElement("option"));a.type="checkbox",k.checkOn=""!==a.value,k.optSelected=c.selected,b.disabled=!0,k.optDisabled=!c.disabled,a=l.createElement("input"),a.value="t",a.type="radio",k.radioValue="t"===a.value}();var Ya,Za,$a=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return J(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===U?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?Za:Ya)),
  8. void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Za={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$a[b]||n.find.attr;$a[b]=function(a,b,d){var e,f;return d||(f=$a[b],$a[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$a[b]=f),e}});var _a=/^(?:input|select|textarea|button)$/i;n.fn.extend({prop:function(a,b){return J(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||_a.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),k.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var ab=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||"boolean"===c)&&(this.className&&L.set(this,"__className__",this.className),this.className=this.className||a===!1?"":L.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ab," ").indexOf(b)>=0)return!0;return!1}});var bb=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(bb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},k.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var cb=n.now(),db=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&n.error("Invalid XML: "+a),b};var eb=/#.*$/,fb=/([?&])_=[^&]*/,gb=/^(.*?):[ \t]*([^\r\n]*)$/gm,hb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,ib=/^(?:GET|HEAD)$/,jb=/^\/\//,kb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,lb={},mb={},nb="*/".concat("*"),ob=a.location.href,pb=kb.exec(ob.toLowerCase())||[];function qb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function rb(a,b,c,d){var e={},f=a===mb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function sb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function tb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function ub(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:ob,type:"GET",isLocal:hb.test(pb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":nb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?sb(sb(a,n.ajaxSettings),b):sb(n.ajaxSettings,a)},ajaxPrefilter:qb(lb),ajaxTransport:qb(mb),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!f){f={};while(b=gb.exec(e))f[b[1].toLowerCase()]=b[2]}b=f[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?e:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return c&&c.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||ob)+"").replace(eb,"").replace(jb,pb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(h=kb.exec(k.url.toLowerCase()),k.crossDomain=!(!h||h[1]===pb[1]&&h[2]===pb[2]&&(h[3]||("http:"===h[1]?"80":"443"))===(pb[3]||("http:"===pb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),rb(lb,k,b,v),2===t)return v;i=n.event&&k.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!ib.test(k.type),d=k.url,k.hasContent||(k.data&&(d=k.url+=(db.test(d)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=fb.test(d)?d.replace(fb,"$1_="+cb++):d+(db.test(d)?"&":"?")+"_="+cb++)),k.ifModified&&(n.lastModified[d]&&v.setRequestHeader("If-Modified-Since",n.lastModified[d]),n.etag[d]&&v.setRequestHeader("If-None-Match",n.etag[d])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+nb+"; q=0.01":""):k.accepts["*"]);for(j in k.headers)v.setRequestHeader(j,k.headers[j]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(j in{success:1,error:1,complete:1})v[j](k[j]);if(c=rb(mb,k,b,v)){v.readyState=1,i&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,c.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=void 0,e=h||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,f&&(u=tb(k,v,f)),u=ub(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[d]=w),w=v.getResponseHeader("etag"),w&&(n.etag[d]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,i&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),i&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var vb=/%20/g,wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&").replace(vb,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!T.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Bb=0,Cb={},Db={0:200,1223:204},Eb=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Cb)Cb[a]()}),k.cors=!!Eb&&"withCredentials"in Eb,k.ajax=Eb=!!Eb,n.ajaxTransport(function(a){var b;return k.cors||Eb&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Bb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Cb[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Db[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Cb[g]=b("abort");try{f.send(a.hasContent&&a.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=n("<script>").prop({async:!0,charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&e("error"===a.type?404:200,a.type)}),l.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Fb=[],Gb=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Fb.pop()||n.expando+"_"+cb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Gb.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Gb.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Gb,"$1"+e):b.jsonp!==!1&&(b.url+=(db.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Fb.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||l;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var Hb=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&Hb)return Hb.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e,dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,f||[a.responseText,b,a])}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var Ib=a.document.documentElement;function Jb(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(typeof d.getBoundingClientRect!==U&&(e=d.getBoundingClientRect()),c=Jb(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===n.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(d=a.offset()),d.top+=n.css(a[0],"borderTopWidth",!0),d.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-n.css(c,"marginTop",!0),left:b.left-d.left-n.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||Ib;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Ib})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b,c){var d="pageYOffset"===c;n.fn[b]=function(e){return J(this,function(b,e,f){var g=Jb(b);return void 0===f?g?g[c]:b[e]:void(g?g.scrollTo(d?a.pageXOffset:f,d?f:a.pageYOffset):b[e]=f)},b,e,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=ya(k.pixelPosition,function(a,c){return c?(c=xa(a,b),va.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return J(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var Kb=a.jQuery,Lb=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Lb),b&&a.jQuery===n&&(a.jQuery=Kb),n},typeof b===U&&(a.jQuery=a.$=n),n});
  9. //# sourceMappingURL=jquery.min.map
  10. /*!
  11. * Bootstrap v3.3.4 (http://getbootstrap.com)
  12. * Copyright 2011-2015 Twitter, Inc.
  13. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  14. */
  15. if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.4",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.4",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.4",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.4",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.4",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27|32)/.test(b.which)&&!/input|textarea/i.test(b.target.tagName)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g&&27!=b.which||g&&27==b.which)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(b.target);38==b.which&&j>0&&j--,40==b.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="menu"]',g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="listbox"]',g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.4",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in").attr("aria-hidden",!1),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a('<div class="modal-backdrop '+e+'" />').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.3.4",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport),this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c&&c.$tip&&c.$tip.is(":visible")?void(c.hoverState="in"):(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.options.container?a(this.options.container):this.$element.parent(),p=this.getPosition(o);h="bottom"==h&&k.bottom+m>p.bottom?"top":"top"==h&&k.top-m<p.top?"bottom":"right"==h&&k.right+l>p.width?"left":"left"==h&&k.left-l<p.left?"right":h,f.removeClass(n).addClass(h)}var q=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(q,h);var r=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",r).emulateTransitionEnd(c.TRANSITION_DURATION):r()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top=b.top+g,b.left=b.left+h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type)})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.4",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.4",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.4",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){
  16. var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.4",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=a(document.body).height();"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
  17. !function(t){var e={config:{},container:{},controls:{},errors:{},items:{},utils:{}};e.utils.F=function(){},e.utils.extend=function(t,i){t.prototype=e.utils.createObject(i.prototype),t.prototype.contructor=t},e.utils.createObject=function(t){return"function"==typeof Object.create?Object.create(t):(e.utils.F.prototype=t,new e.utils.F)},e.utils.objectKeys=function(t){var e,i;if("function"==typeof Object.keys)return Object.keys(t);e=[];for(i in t)e.push(i);return e},e.utils.getQueryStringParam=function(t){if(!window.location.search)return null;var e,i,n=window.location.search.substr(1).split("&"),s={};for(i=0;i<n.length;i++)e=n[i].split("="),s[e[0]]=e[1];return s[t]||null},e.utils.copy=function(t,e){for(var i in e)t[i]=e[i];return t},e.utils.animFrame=function(t){return(window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)})(function(){t()})},e.utils.indexOf=function(t,e){if(!(e instanceof Array))throw new Error("Haystack is not an Array");if(e.indexOf)return e.indexOf(t);for(var i=0;i<e.length;i++)if(e[i]===t)return i;return-1},e.utils.fnBind=function(t,e,i){if(void 0!==Function.prototype.bind)return Function.prototype.bind.apply(t,[e].concat(i||[]));var n=function(){var s=(i||[]).concat(Array.prototype.slice.call(arguments,0));return this instanceof n?void t.apply(this,s):t.apply(e,s)};return n.prototype=t.prototype,n},e.utils.removeFromArray=function(t,i){var n=e.utils.indexOf(t,i);if(-1===n)throw new Error("Can't remove item from array. Item is not in the array");i.splice(n,1)},e.utils.now=function(){return"function"==typeof Date.now?Date.now():(new Date).getTime()},e.utils.getUniqueId=function(){return(1e15*Math.random()).toString(36).replace(".","")},e.utils.filterXss=function(t,e){var i=t.replace(/javascript/gi,"j&#97;vascript").replace(/expression/gi,"expr&#101;ssion").replace(/onload/gi,"onlo&#97;d").replace(/script/gi,"&#115;cript").replace(/onerror/gi,"on&#101;rror");return e===!0?i:i.replace(/>/g,"&gt;").replace(/</g,"&lt;")},e.utils.stripTags=function(e){return t.trim(e.replace(/(<([^>]+)>)/gi,""))},e.utils.EventEmitter=function(){this._mSubscriptions={},this._mSubscriptions[e.utils.EventEmitter.ALL_EVENT]=[],this.on=function(t,e,i){this._mSubscriptions[t]||(this._mSubscriptions[t]=[]),this._mSubscriptions[t].push({fn:e,ctx:i})},this.emit=function(t){var i,n,s;if(s=Array.prototype.slice.call(arguments,1),this._mSubscriptions[t])for(i=0;i<this._mSubscriptions[t].length;i++)n=this._mSubscriptions[t][i].ctx||{},this._mSubscriptions[t][i].fn.apply(n,s);for(s.unshift(t),i=0;i<this._mSubscriptions[e.utils.EventEmitter.ALL_EVENT].length;i++)n=this._mSubscriptions[e.utils.EventEmitter.ALL_EVENT][i].ctx||{},this._mSubscriptions[e.utils.EventEmitter.ALL_EVENT][i].fn.apply(n,s)},this.unbind=function(t,e,i){if(!this._mSubscriptions[t])throw new Error("No subscribtions to unsubscribe for event "+t);var n,s=!1;for(n=0;n<this._mSubscriptions[t].length;n++)this._mSubscriptions[t][n].fn!==e||i&&i!==this._mSubscriptions[t][n].ctx||(this._mSubscriptions[t].splice(n,1),s=!0);if(s===!1)throw new Error("Nothing to unbind for "+t)},this.off=this.unbind,this.trigger=this.emit},e.utils.EventEmitter.ALL_EVENT="__all",e.utils.DragListener=function(i,n){e.utils.EventEmitter.call(this),this._eElement=t(i),this._oDocument=t(document),this._eBody=t(document.body),this._nButtonCode=n||0,this._nDelay=200,this._nDistance=10,this._nX=0,this._nY=0,this._nOriginalX=0,this._nOriginalY=0,this._bDragging=!1,this._fMove=e.utils.fnBind(this.onMouseMove,this),this._fUp=e.utils.fnBind(this.onMouseUp,this),this._fDown=e.utils.fnBind(this.onMouseDown,this),this._eElement.on("mousedown touchstart",this._fDown)},e.utils.DragListener.timeout=null,e.utils.copy(e.utils.DragListener.prototype,{destroy:function(){this._eElement.unbind("mousedown touchstart",this._fDown)},onMouseDown:function(t){t.preventDefault();var i=this._getCoordinates(t);this._nOriginalX=i.x,this._nOriginalY=i.y,this._oDocument.on("mousemove touchmove",this._fMove),this._oDocument.one("mouseup touchend",this._fUp),this._timeout=setTimeout(e.utils.fnBind(this._startDrag,this),this._nDelay)},onMouseMove:function(t){t.preventDefault();var e=this._getCoordinates(t);this._nX=e.x-this._nOriginalX,this._nY=e.y-this._nOriginalY,this._bDragging===!1&&(Math.abs(this._nX)>this._nDistance||Math.abs(this._nY)>this._nDistance)&&(clearTimeout(this._timeout),this._startDrag()),this._bDragging&&this.emit("drag",this._nX,this._nY,t)},onMouseUp:function(t){clearTimeout(this._timeout),this._eBody.removeClass("lm_dragging"),this._oDocument.unbind("mousemove touchmove",this._fMove),this._bDragging===!0&&(this._bDragging=!1,this.emit("dragStop",t,this._nOriginalX+this._nX))},_startDrag:function(){this._bDragging=!0,this._eBody.addClass("lm_dragging"),this.emit("dragStart",this._nOriginalX,this._nOriginalY)},_getCoordinates:function(t){var e={};return"touch"===t.type.substr(0,5)?(e.x=t.originalEvent.targetTouches[0].pageX,e.y=t.originalEvent.targetTouches[0].pageY):(e.x=t.pageX,e.y=t.pageY),e}}),e.LayoutManager=function(i,n){if(!t||"function"!=typeof t.noConflict){var s="jQuery is missing as dependency for GoldenLayout. ";throw s+='Please either expose $ on GoldenLayout\'s scope (e.g. window) or add "jquery" to ',s+="your paths when using RequireJS/AMD",new Error(s)}e.utils.EventEmitter.call(this),this.isInitialised=!1,this._isFullPage=!1,this._resizeTimeoutId=null,this._components={},this._itemAreas=[],this._resizeFunction=e.utils.fnBind(this._onResize,this),this._maximisedItem=null,this._maximisePlaceholder=t('<div class="lm_maximise_place"></div>'),this._creationTimeoutPassed=!1,this._subWindowsCreated=!1,this.width=null,this.height=null,this.root=null,this.openPopouts=[],this.selectedItem=null,this.isSubWindow=!1,this.eventHub=new e.utils.EventHub(this),this.config=this._createConfig(i),this.container=n,this.dropTargetIndicator=null,this.transitionIndicator=null,this.tabDropPlaceholder=t('<div class="lm_drop_tab_placeholder"></div>'),this.isSubWindow===!0&&t("body").css("visibility","hidden"),t(window).on("unload beforeunload",e.utils.fnBind(this._onUnload,this)),this._typeToItem={column:e.utils.fnBind(e.items.RowOrColumn,this,[!0]),row:e.utils.fnBind(e.items.RowOrColumn,this,[!1]),stack:e.items.Stack,component:e.items.Component}},e.LayoutManager.__lm=e,e.LayoutManager.minifyConfig=function(t){return(new e.utils.ConfigMinifier).minifyConfig(t)},e.LayoutManager.unminifyConfig=function(t){return(new e.utils.ConfigMinifier).unminifyConfig(t)},e.utils.copy(e.LayoutManager.prototype,{registerComponent:function(t,e){if("function"!=typeof e)throw new Error("Please register a constructor function");if(void 0!==this._components[t])throw new Error("Component "+t+" is already registered");this._components[t]=e},toConfig:function(t){var i,n,s;if(this.isInitialised===!1)throw new Error("Can't create config, layout not yet initialised");if(t&&!(t instanceof e.items.AbstractContentItem))throw new Error("Root must be a ContentItem");for(i={settings:e.utils.copy({},this.config.settings),dimensions:e.utils.copy({},this.config.dimensions),labels:e.utils.copy({},this.config.labels)},i.content=[],n=function(t,e){var i,s;for(i in e.config)"content"!==i&&(t[i]=e.config[i]);if(e.contentItems.length)for(t.content=[],s=0;s<e.contentItems.length;s++)t.content[s]={},n(t.content[s],e.contentItems[s])},t?n(i,{contentItems:[t]}):n(i,this.root),this._$reconcilePopoutWindows(),i.openPopouts=[],s=0;s<this.openPopouts.length;s++)i.openPopouts.push(this.openPopouts[s].toConfig());return i.maximisedItemId=this._maximisedItem?"__glMaximised":null,i},getComponent:function(t){if(void 0===this._components[t])throw new e.errors.ConfigurationError('Unknown component "'+t+'"');return this._components[t]},init:function(){return this._subWindowsCreated===!1&&(this._createSubWindows(),this._subWindowsCreated=!0),"loading"===document.readyState||null===document.body?void t(document).ready(e.utils.fnBind(this.init,this)):this.isSubWindow===!0&&this._creationTimeoutPassed===!1?(setTimeout(e.utils.fnBind(this.init,this),7),void(this._creationTimeoutPassed=!0)):(this.isSubWindow===!0&&this._adjustToWindowMode(),this._setContainer(),this.dropTargetIndicator=new e.controls.DropTargetIndicator(this.container),this.transitionIndicator=new e.controls.TransitionIndicator,this.updateSize(),this._create(this.config),this._bindEvents(),this.isInitialised=!0,void this.emit("initialised"))},updateSize:function(t,e){2===arguments.length?(this.width=t,this.height=e):(this.width=this.container.width(),this.height=this.container.height()),this.isInitialised===!0&&(this.root.callDownwards("setSize"),this._maximisedItem&&(this._maximisedItem.element.width(this.container.width()),this._maximisedItem.element.height(this.container.height()),this._maximisedItem.callDownwards("setSize")))},destroy:function(){this.isInitialised!==!1&&(this._onUnload(),t(window).off("resize",this._resizeFunction),this.root.callDownwards("_$destroy",[],!0),this.root.contentItems=[],this.tabDropPlaceholder.remove(),this.dropTargetIndicator.destroy(),this.transitionIndicator.destroy())},createContentItem:function(t,i){var n,s;if("string"!=typeof t.type)throw new e.errors.ConfigurationError("Missing parameter 'type'",t);if(!this._typeToItem[t.type])throw n="Unknown type '"+t.type+"'. Valid types are "+e.utils.objectKeys(this._typeToItem).join(","),new e.errors.ConfigurationError(n);return"component"!==t.type||i instanceof e.items.Stack||!i||this.isSubWindow===!0&&i instanceof e.items.Root||(t={type:"stack",isClosable:t.isClosable,width:t.width,height:t.height,content:[t]}),s=new this._typeToItem[t.type](this,t,i)},createPopout:function(t,i,n,s){var o,r,h,a,l,c,m=t,d=t instanceof e.items.AbstractContentItem,u=this;if(n=n||null,d){for(m=this.toConfig(t).content,n=e.utils.getUniqueId(),a=t.parent,l=t;1===a.contentItems.length&&!a.isRoot;)a=a.parent,l=l.parent;a.addId(n),isNaN(s)&&(s=e.utils.indexOf(l,a.contentItems))}else m instanceof Array||(m=[m]);return!i&&d&&(o=window.screenX||window.screenLeft,r=window.screenY||window.screenTop,h=t.element.offset(),i={left:o+h.left,top:r+h.top,width:t.element.width(),height:t.element.height()}),i||d||(i={left:window.screenX||window.screenLeft+20,top:window.screenY||window.screenTop+20,width:500,height:309}),d&&t.remove(),c=new e.controls.BrowserPopout(m,i,n,s,this),c.on("initialised",function(){u.emit("windowOpened",c)}),c.on("closed",function(){u._$reconcilePopoutWindows()}),this.openPopouts.push(c),c},createDragSource:function(i,n){this.config.settings.constrainDragToContainer=!1,new e.controls.DragSource(t(i),n,this)},selectItem:function(t,e){if(this.config.settings.selectionEnabled!==!0)throw new Error("Please set selectionEnabled to true to use this feature");t!==this.selectedItem&&(null!==this.selectedItem&&this.selectedItem.deselect(),t&&e!==!0&&t.select(),this.selectedItem=t,this.emit("selectionChanged",t))},_$maximiseItem:function(t){null!==this._maximisedItem&&this._$minimiseItem(this._maximisedItem),this._maximisedItem=t,this._maximisedItem.addId("__glMaximised"),t.element.addClass("lm_maximised"),t.element.after(this._maximisePlaceholder),this.root.element.prepend(t.element),t.element.width(this.container.width()),t.element.height(this.container.height()),t.callDownwards("setSize"),this._maximisedItem.emit("maximised"),this.emit("stateChanged")},_$minimiseItem:function(t){t.element.removeClass("lm_maximised"),t.removeId("__glMaximised"),this._maximisePlaceholder.after(t.element),this._maximisePlaceholder.remove(),t.parent.callDownwards("setSize"),this._maximisedItem=null,t.emit("minimised"),this.emit("stateChanged")},_$closeWindow:function(){window.setTimeout(function(){window.close()},1)},_$getArea:function(t,e){var i,n,s=1/0,o=null;for(i=0;i<this._itemAreas.length;i++)n=this._itemAreas[i],t>n.x1&&t<n.x2&&e>n.y1&&e<n.y2&&s>n.surface&&(s=n.surface,o=n);return o},_$calculateItemAreas:function(){var t,e,i=this._getAllContentItems();if(this._itemAreas=[],1===i.length)return void this._itemAreas.push(this.root._$getArea());for(t=0;t<i.length;t++)i[t].isStack&&(e=i[t]._$getArea(),null!==e&&(e instanceof Array?this._itemAreas=this._itemAreas.concat(e):this._itemAreas.push(e)))},_$normalizeContentItem:function(i,n){if(!i)throw new Error("No content item defined");if(i instanceof e.items.AbstractContentItem)return i;if(t.isPlainObject(i)&&i.type){var s=this.createContentItem(i,n);return s.callDownwards("_$init"),s}throw new Error("Invalid contentItem")},_$reconcilePopoutWindows:function(){var t,e=[];for(t=0;t<this.openPopouts.length;t++)this.openPopouts[t].getWindow().closed===!1?e.push(this.openPopouts[t]):this.emit("windowClosed",this.openPopouts[t]);this.openPopouts.length!==e.length&&(this.emit("stateChanged"),this.openPopouts=e)},_getAllContentItems:function(){var t=[],e=function(i){if(t.push(i),i.contentItems instanceof Array)for(var n=0;n<i.contentItems.length;n++)e(i.contentItems[n])};return e(this.root),t},_bindEvents:function(){this._isFullPage&&t(window).resize(this._resizeFunction)},_onResize:function(){clearTimeout(this._resizeTimeoutId),this._resizeTimeoutId=setTimeout(e.utils.fnBind(this.updateSize,this),100)},_createConfig:function(i){var n=e.utils.getQueryStringParam("gl-window");return n&&(this.isSubWindow=!0,i=localStorage.getItem(n),i=JSON.parse(i),i=(new e.utils.ConfigMinifier).unminifyConfig(i),localStorage.removeItem(n)),i=t.extend(!0,{},e.config.defaultConfig,i),i.settings.hasHeaders===!1&&(i.dimensions.headerHeight=0),i},_adjustToWindowMode:function(){var i=t('<div class="lm_popin" title="'+this.config.labels.popin+'"><div class="lm_icon"></div><div class="lm_bg"></div></div>');i.click(e.utils.fnBind(function(){this.emit("popIn")},this)),document.title=e.utils.stripTags(this.config.content[0].title),t("head").append(t("body link, body style, template, .gl_keep")),this.container=t("body").html("").css("visibility","visible").append(i);document.body.offsetHeight;window.__glInstance=this},_createSubWindows:function(){var t,e;for(t=0;t<this.config.openPopouts.length;t++)e=this.config.openPopouts[t],this.createPopout(e.content,e.dimensions,e.parentId,e.indexInParent)},_setContainer:function(){var e=t(this.container||"body");if(0===e.length)throw new Error("GoldenLayout container not found");if(e.length>1)throw new Error("GoldenLayout more than one container element specified");e[0]===document.body&&(this._isFullPage=!0,t("html, body").css({height:"100%",margin:0,padding:0,overflow:"hidden"})),this.container=e},_create:function(t){var i;if(!(t.content instanceof Array))throw i=void 0===t.content?"Missing setting 'content' on top level of configuration":"Configuration parameter 'content' must be an array",new e.errors.ConfigurationError(i,t);if(t.content.length>1)throw i="Top level content can't contain more then one element.",new e.errors.ConfigurationError(i,t);this.root=new e.items.Root(this,{content:t.content},this.container),this.root.callDownwards("_$init"),"__glMaximised"===t.maximisedItemId&&this.root.getItemsById(t.maximisedItemId)[0].toggleMaximise()},_onUnload:function(){if(this.config.settings.closePopoutsOnUnload===!0)for(var t=0;t<this.openPopouts.length;t++)this.openPopouts[t].close()}}),function(){"function"==typeof define&&define.amd?define(["jquery"],function(i){return t=i,e.LayoutManager}):"object"==typeof exports?module.exports=e.LayoutManager:window.GoldenLayout=e.LayoutManager}(),e.config.itemDefaultConfig={isClosable:!0,reorderEnabled:!0,title:""},e.config.defaultConfig={openPopouts:[],settings:{hasHeaders:!0,constrainDragToContainer:!0,reorderEnabled:!0,selectionEnabled:!1,popoutWholeStack:!1,blockedPopoutsThrowError:!0,closePopoutsOnUnload:!0,showPopoutIcon:!0,showMaximiseIcon:!0,showCloseIcon:!0},dimensions:{borderWidth:5,minItemHeight:10,minItemWidth:10,headerHeight:20,dragProxyWidth:300,dragProxyHeight:200},labels:{close:"close",maximise:"maximise",minimise:"minimise",popout:"open in new window",popin:"pop in"}},e.container.ItemContainer=function(i,n,s){e.utils.EventEmitter.call(this),this.width=null,this.height=null,this.title=i.componentName,this.parent=n,this.layoutManager=s,this.isHidden=!1,this._config=i,this._element=t(['<div class="lm_item_container">','<div class="lm_content"></div>',"</div>"].join("")),this._contentElement=this._element.find(".lm_content")},e.utils.copy(e.container.ItemContainer.prototype,{getElement:function(){return this._contentElement},hide:function(){this.emit("hide"),this.isHidden=!0,this._element.hide()},show:function(){this.emit("show"),this.isHidden=!1,this._element.show()},setSize:function(t,e){for(var i,n,s,o,r,h,a=this.parent,l=this;!a.isColumn&&!a.isRow;)if(l=a,a=a.parent,a.isRoot)return!1;for(s=a.isColumn?"height":"width",o="height"===s?e:t,i=this[s]*(1/(l.config[s]/100)),n=o/i*100,r=(l.config[s]-n)/a.contentItems.length,h=0;h<a.contentItems.length;h++)a.contentItems[h]===l?a.contentItems[h].config[s]=n:a.contentItems[h].config[s]+=r;return a.callDownwards("setSize"),!0},close:function(){this._config.isClosable&&(this.emit("close"),this.parent.close())},getState:function(){return this._config.componentState},extendState:function(e){this.setState(t.extend(!0,this.getState(),e))},setState:function(t){this._config.componentState=t,this.parent.emitBubblingEvent("stateChanged")},setTitle:function(t){this.parent.setTitle(t)},_$setSize:function(t,e){(t!==this.width||e!==this.height)&&(this.width=t,this.height=e,this._contentElement.width(this.width).height(this.height),this.emit("resize"))}}),e.controls.BrowserPopout=function(t,i,n,s,o){e.utils.EventEmitter.call(this),this.isInitialised=!1,this._config=t,this._dimensions=i,this._parentId=n,this._indexInParent=s,this._layoutManager=o,this._popoutWindow=null,this._id=null,this._createWindow()},e.utils.copy(e.controls.BrowserPopout.prototype,{toConfig:function(){return{dimensions:{width:this.getGlInstance().width,height:this.getGlInstance().height,left:this._popoutWindow.screenX||this._popoutWindow.screenLeft,top:this._popoutWindow.screenY||this._popoutWindow.screenTop},content:this.getGlInstance().toConfig().content,parentId:this._parentId,indexInParent:this._indexInParent}},getGlInstance:function(){return this._popoutWindow.__glInstance},getWindow:function(){return this._popoutWindow},close:function(){if(this.getGlInstance())this.getGlInstance()._$closeWindow();else try{this.getWindow().close()}catch(t){}},popIn:function(){var e,i,n=this._indexInParent;this._parentId&&(e=t.extend(!0,{},this.getGlInstance().toConfig()).content[0],i=this._layoutManager.root.getItemsById(this._parentId)[0],i||(i=this._layoutManager.root.contentItems.length>0?this._layoutManager.root.contentItems[0]:this._layoutManager.root,n=0)),i.addChild(e,this._indexInParent),this.close()},_createWindow:function(){var i,n=this._createUrl(),s=Math.floor(1e6*Math.random()).toString(36),o=this._serializeWindowOptions({width:this._dimensions.width,height:this._dimensions.height,innerWidth:this._dimensions.width,innerHeight:this._dimensions.height,menubar:"no",toolbar:"no",location:"no",personalbar:"no",resizable:"yes",scrollbars:"no",status:"no"});if(this._popoutWindow=window.open(n,s,o),this._popoutWindow)t(this._popoutWindow).on("load",e.utils.fnBind(this._positionWindow,this)).on("unload beforeunload",e.utils.fnBind(this._onClose,this)),i=setInterval(e.utils.fnBind(function(){this._popoutWindow.__glInstance&&this._popoutWindow.__glInstance.isInitialised&&(this._onInitialised(),clearInterval(i))},this),10);else if(this._layoutManager.config.settings.blockedPopoutsThrowError===!0){var r=new Error("Popout blocked");throw r.type="popoutBlocked",r}},_serializeWindowOptions:function(t){var e,i=[];for(e in t)i.push(e+"="+t[e]);return i.join(",")},_createUrl:function(){var t,i={content:this._config},n="gl-window-config-"+e.utils.getUniqueId();i=(new e.utils.ConfigMinifier).minifyConfig(i);try{localStorage.setItem(n,JSON.stringify(i))}catch(s){throw new Error("Error while writing to localStorage "+s.toString())}return t=document.location.href.split("?"),1===t.length?t[0]+"?gl-window="+n:document.location.href+"&gl-window="+n},_positionWindow:function(){this._popoutWindow.moveTo(this._dimensions.left,this._dimensions.top),this._popoutWindow.focus()},_onInitialised:function(){this.isInitialised=!0,this.getGlInstance().on("popIn",this.popIn,this),this.emit("initialised")},_onClose:function(){setTimeout(e.utils.fnBind(this.emit,this,["closed"]),50)}}),e.controls.DragProxy=function(i,n,s,o,r,h){e.utils.EventEmitter.call(this),this._dragListener=s,this._layoutManager=o,this._contentItem=r,this._originalParent=h,this._area=null,this._lastValidArea=null,this._dragListener.on("drag",this._onDrag,this),this._dragListener.on("dragStop",this._onDrop,this),this.element=t(e.controls.DragProxy._template),this.element.css({left:i,top:n}),this.element.find(".lm_title").html(this._contentItem.config.title),this.childElementContainer=this.element.find(".lm_content"),this.childElementContainer.append(r.element),this._updateTree(),this._layoutManager._$calculateItemAreas(),this._setDimensions(),t(document.body).append(this.element);var a=this._layoutManager.container.offset();this._minX=a.left,this._minY=a.top,this._maxX=this._layoutManager.container.width()+this._minX,this._maxY=this._layoutManager.container.height()+this._minY,this._width=this.element.width(),this._height=this.element.height()},e.controls.DragProxy._template='<div class="lm_dragProxy"><div class="lm_header"><ul class="lm_tabs"><li class="lm_tab lm_active"><i class="lm_left"></i><span class="lm_title"></span><i class="lm_right"></i></li></ul></div><div class="lm_content"></div></div>',e.utils.copy(e.controls.DragProxy.prototype,{_onDrag:function(t,e,i){var n=i.pageX,s=i.pageY,o=n>this._minX&&n<this._maxX&&s>this._minY&&s<this._maxY;(o||this._layoutManager.config.settings.constrainDragToContainer!==!0)&&(this.element.css({left:n,top:s}),this._area=this._layoutManager._$getArea(n,s),null!==this._area&&(this._lastValidArea=this._area,this._area.contentItem._$highlightDropZone(n,s,this._area)))},_onDrop:function(){this._layoutManager.dropTargetIndicator.hide(),null!==this._area?this._area.contentItem._$onDrop(this._contentItem):null!==this._lastValidArea?this._lastValidArea.contentItem._$onDrop(this._contentItem):this._originalParent&&this._originalParent.addChild(this._contentItem),this.element.remove()},_updateTree:function(){this._contentItem.parent&&this._contentItem.parent.removeChild(this._contentItem,!0),this._contentItem._$setParent(this)},_setDimensions:function(){var t=this._layoutManager.config.dimensions,e=t.dragProxyWidth,i=t.dragProxyHeight-t.headerHeight;this.childElementContainer.width(e),this.childElementContainer.height(i),this._contentItem.element.width(e),this._contentItem.element.height(i),this._contentItem.callDownwards("_$show"),this._contentItem.callDownwards("setSize")}}),e.controls.DragSource=function(t,e,i){this._element=t,this._itemConfig=e,this._layoutManager=i,this._dragListener=null,this._createDragListener()},e.utils.copy(e.controls.DragSource.prototype,{_createDragListener:function(){null!==this._dragListener&&this._dragListener.destroy(),this._dragListener=new e.utils.DragListener(this._element),this._dragListener.on("dragStart",this._onDragStart,this),this._dragListener.on("dragStop",this._createDragListener,this)},_onDragStart:function(t,i){var n=this._layoutManager._$normalizeContentItem(this._itemConfig),s=new e.controls.DragProxy(t,i,this._dragListener,this._layoutManager,n,null);this._layoutManager.transitionIndicator.transitionElements(this._element,s.element)}}),e.controls.DropTargetIndicator=function(){this.element=t(e.controls.DropTargetIndicator._template),t(document.body).append(this.element)},e.controls.DropTargetIndicator._template='<div class="lm_dropTargetIndicator"><div class="lm_inner"></div></div>',e.utils.copy(e.controls.DropTargetIndicator.prototype,{destroy:function(){this.element.remove()},highlight:function(t,e,i,n){this.highlightArea({x1:t,y1:e,x2:i,y2:n})},highlightArea:function(t){this.element.css({left:t.x1,top:t.y1,width:t.x2-t.x1,height:t.y2-t.y1}).show()},hide:function(){this.element.hide()}}),e.controls.Header=function(i,n){e.utils.EventEmitter.call(this),this.layoutManager=i,this.element=t(e.controls.Header._template),this.layoutManager.config.settings.selectionEnabled===!0&&(this.element.addClass("lm_selectable"),this.element.click(e.utils.fnBind(this._onHeaderClick,this))),this.element.height(i.config.dimensions.headerHeight),this.tabsContainer=this.element.find(".lm_tabs"),this.controlsContainer=this.element.find(".lm_controls"),this.parent=n,this.parent.on("resize",this._updateTabSizes,this),this.tabs=[],this.activeContentItem=null,this._createControls()},e.controls.Header._template=['<div class="lm_header">','<ul class="lm_tabs"></ul>','<ul class="lm_controls"></ul>',"</div>"].join(""),e.utils.copy(e.controls.Header.prototype,{createTab:function(t,i){var n,s;for(s=0;s<this.tabs.length;s++)if(this.tabs[s].contentItem===t)return;return n=new e.controls.Tab(this,t),0===this.tabs.length?(this.tabs.push(n),void this.tabsContainer.append(n.element)):(void 0===i&&(i=this.tabs.length),i>0?this.tabs[i-1].element.after(n.element):this.tabs[0].element.before(n.element),this.tabs.splice(i,0,n),void this._updateTabSizes())},removeTab:function(t){for(var e=0;e<this.tabs.length;e++)if(this.tabs[e].contentItem===t)return this.tabs[e]._$destroy(),void this.tabs.splice(e,1);throw new Error("contentItem is not controlled by this header")},setActiveContentItem:function(t){var e,i;for(e=0;e<this.tabs.length;e++)i=this.tabs[e].contentItem===t,this.tabs[e].setActive(i),i===!0&&(this.activeContentItem=t,this.parent.config.activeItemIndex=e);this._updateTabSizes(),this.parent.emitBubblingEvent("stateChanged")},_$destroy:function(){this.emit("destroy");for(var t=0;t<this.tabs.length;t++)this.tabs[t]._$destroy();this.element.remove()},_createControls:function(){var t,i,n,s,o,r,h;this.layoutManager.config.settings.showPopoutIcon&&(i=e.utils.fnBind(this._onPopoutClick,this),n=this.layoutManager.config.labels.popout,new e.controls.HeaderButton(this,n,"lm_popout",i)),this.layoutManager.config.settings.showMaximiseIcon&&(r=e.utils.fnBind(this.parent.toggleMaximise,this.parent),s=this.layoutManager.config.labels.maximise,o=this.layoutManager.config.labels.minimise,h=new e.controls.HeaderButton(this,s,"lm_maximise",r),this.parent.on("maximised",function(){h.element.attr("title",o)}),this.parent.on("minimised",function(){h.element.attr("title",s)})),this.parent.config.isClosable&&this.layoutManager.config.settings.showCloseIcon&&(t=e.utils.fnBind(this.parent.remove,this.parent),n=this.layoutManager.config.labels.close,new e.controls.HeaderButton(this,n,"lm_close",t))},_onPopoutClick:function(){this.layoutManager.config.settings.popoutWholeStack===!0?this.parent.popout():this.activeContentItem.popout()},_onHeaderClick:function(t){t.target===this.element[0]&&this.parent.select()},_updateTabSizes:function(){if(0!==this.tabs.length){var t,e,i,n,s=this.element.outerWidth()-this.controlsContainer.outerWidth(),o=0;for(e=0;e<this.tabs.length;e++)t=this.tabs[e].element,t.css("z-index",this.tabs.length-e),o+=t.outerWidth()+parseInt(t.css("margin-right"),10);for(n=(o-s)/(this.tabs.length-1),e=0;e<this.tabs.length;e++)i=!this.tabs[e].isActive&&n>0?"-"+Math.floor(n)+"px":"",this.tabs[e].element.css("margin-left",i);o>s?this.element.css("overflow","hidden"):this.element.css("overflow","visible")}}}),e.controls.HeaderButton=function(e,i,n,s){this._header=e,this.element=t('<li class="'+n+'" title="'+i+'"></li>'),this._header.on("destroy",this._$destroy,this),this._action=s,this.element.click(this._action),this._header.controlsContainer.append(this.element)},e.utils.copy(e.controls.HeaderButton.prototype,{_$destroy:function(){this.element.off(this._action),this.element.remove()}}),e.controls.Splitter=function(t,i){this._isVertical=t,this._size=i,this.element=this._createElement(),this._dragListener=new e.utils.DragListener(this.element)},e.utils.copy(e.controls.Splitter.prototype,{on:function(t,e,i){this._dragListener.on(t,e,i)},_$destroy:function(){this.element.remove()},_createElement:function(){var e=t('<div class="lm_splitter"><div class="lm_drag_handle"></div></div>');return e.addClass("lm_"+(this._isVertical?"vertical":"horizontal")),e[this._isVertical?"height":"width"](this._size),e}}),e.controls.Tab=function(i,n){this.header=i,this.contentItem=n,this.element=t(e.controls.Tab._template),this.titleElement=this.element.find(".lm_title"),this.closeElement=this.element.find(".lm_close_tab"),this.closeElement[n.config.isClosable?"show":"hide"](),this.isActive=!1,this.setTitle(n.config.title),this.contentItem.on("titleChanged",this.setTitle,this),this._layoutManager=this.contentItem.layoutManager,this._layoutManager.config.settings.reorderEnabled===!0&&n.config.reorderEnabled===!0&&(this._dragListener=new e.utils.DragListener(this.element),this._dragListener.on("dragStart",this._onDragStart,this)),this._onTabClickFn=e.utils.fnBind(this._onTabClick,this),this._onCloseClickFn=e.utils.fnBind(this._onCloseClick,this),this.element.click(this._onTabClickFn),this._layoutManager.config.settings.showCloseIcon===!0?this.closeElement.click(this._onCloseClickFn):this.closeElement.remove(),this.contentItem.tab=this,this.contentItem.emit("tab",this),this.contentItem.layoutManager.emit("tabCreated",this),this.contentItem.isComponent&&(this.contentItem.container.tab=this,this.contentItem.container.emit("tab",this))},e.controls.Tab._template='<li class="lm_tab"><i class="lm_left"></i><span class="lm_title"></span><div class="lm_close_tab"></div><i class="lm_right"></i></li>',e.utils.copy(e.controls.Tab.prototype,{setTitle:function(t){this.element.attr("title",e.utils.stripTags(t)),this.titleElement.html(t)},setActive:function(t){t!==this.isActive&&(this.isActive=t,t?this.element.addClass("lm_active"):this.element.removeClass("lm_active"))},_$destroy:function(){this.element.off("click",this._onTabClickFn),this.closeElement.off("click",this._onCloseClickFn),this.element.remove()},_onDragStart:function(t,i){this.contentItem.parent.isMaximised===!0&&this.contentItem.parent.toggleMaximise(),new e.controls.DragProxy(t,i,this._dragListener,this._layoutManager,this.contentItem,this.header.parent)},_onTabClick:function(t){0===t.button?this.header.parent.setActiveContentItem(this.contentItem):1===t.button&&this.contentItem.config.isClosable&&this._onCloseClick(t)},_onCloseClick:function(t){t.stopPropagation(),this.header.parent.removeChild(this.contentItem)}}),e.controls.TransitionIndicator=function(){this._element=t('<div class="lm_transition_indicator"></div>'),t(document.body).append(this._element),this._toElement=null,this._fromDimensions=null,this._totalAnimationDuration=200,this._animationStartTime=null},e.utils.copy(e.controls.TransitionIndicator.prototype,{destroy:function(){this._element.remove()},transitionElements:function(t,e){},_nextAnimationFrame:function(){var t,i=this._measure(this._toElement),n=(e.utils.now()-this._animationStartTime)/this._totalAnimationDuration,s={};if(n>=1)return void this._element.hide();i.opacity=0;for(t in this._fromDimensions)s[t]=this._fromDimensions[t]+(i[t]-this._fromDimensions[t])*n;this._element.css(s),e.utils.animFrame(e.utils.fnBind(this._nextAnimationFrame,this))},_measure:function(t){var e=t.offset();return{left:e.left,top:e.top,width:t.outerWidth(),height:t.outerHeight()}}}),e.errors.ConfigurationError=function(t,e){Error.call(this),this.name="Configuration Error",this.message=t,this.node=e},e.errors.ConfigurationError.prototype=new Error,e.items.AbstractContentItem=function(t,i,n){e.utils.EventEmitter.call(this),this.config=this._extendItemNode(i),this.type=i.type,this.contentItems=[],this.parent=n,this.isInitialised=!1,this.isMaximised=!1,this.isRoot=!1,this.isRow=!1,this.isColumn=!1,this.isStack=!1,this.isComponent=!1,this.layoutManager=t,this._pendingEventPropagations={},
  18. this._throttledEvents=["stateChanged"],this.on(e.utils.EventEmitter.ALL_EVENT,this._propagateEvent,this),i.content&&this._createContentItems(i)},e.utils.copy(e.items.AbstractContentItem.prototype,{setSize:function(){throw new Error("Abstract Method")},callDownwards:function(t,e,i,n){var s;for(i!==!0&&n!==!0&&this[t].apply(this,e||[]),s=0;s<this.contentItems.length;s++)this.contentItems[s].callDownwards(t,e,i);i===!0&&n!==!0&&this[t].apply(this,e||[])},removeChild:function(t,i){var n=e.utils.indexOf(t,this.contentItems);if(-1===n)throw new Error("Can't remove child item. Unknown content item");i!==!0&&this.contentItems[n]._$destroy(),this.contentItems.splice(n,1),this.config.content.splice(n,1),this.contentItems.length>0?this.callDownwards("setSize"):this instanceof e.items.Root||this.config.isClosable!==!0||this.parent.removeChild(this)},addChild:function(t,e){void 0===e&&(e=this.contentItems.length),this.contentItems.splice(e,0,t),void 0===this.config.content&&(this.config.content=[]),this.config.content.splice(e,0,t.config),t.parent=this,t.parent.isInitialised===!0&&t.isInitialised===!1&&t._$init()},replaceChild:function(t,i,n){i=this.layoutManager._$normalizeContentItem(i);var s=e.utils.indexOf(t,this.contentItems),o=t.element[0].parentNode;if(-1===s)throw new Error("Can't replace child. oldChild is not child of this");o.replaceChild(i.element[0],t.element[0]),n===!0&&(t.parent=null,t._$destroy()),this.contentItems[s]=i,i.parent=this,i.parent.isInitialised===!0&&i.isInitialised===!1&&i._$init(),this.callDownwards("setSize")},remove:function(){this.parent.removeChild(this)},popout:function(){var t=this.layoutManager.createPopout(this);return this.emitBubblingEvent("stateChanged"),t},toggleMaximise:function(){this.isMaximised===!0?this.layoutManager._$minimiseItem(this):this.layoutManager._$maximiseItem(this),this.isMaximised=!this.isMaximised,this.emitBubblingEvent("stateChanged")},select:function(){this.layoutManager.selectedItem!==this&&(this.layoutManager.selectItem(this,!0),this.element.addClass("lm_selected"))},deselect:function(){this.layoutManager.selectedItem===this&&(this.layoutManager.selectedItem=null,this.element.removeClass("lm_selected"))},setTitle:function(t){this.config.title=t,this.emit("titleChanged",t),this.emit("stateChanged")},hasId:function(t){return this.config.id?"string"==typeof this.config.id?this.config.id===t:this.config.id instanceof Array?-1!==e.utils.indexOf(t,this.config.id):void 0:!1},addId:function(t){this.hasId(t)||(this.config.id?"string"==typeof this.config.id?this.config.id=[this.config.id,t]:this.config.id instanceof Array&&this.config.id.push(t):this.config.id=t)},removeId:function(t){if(!this.hasId(t))throw new Error("Id not found");if("string"==typeof this.config.id)delete this.config.id;else if(this.config.id instanceof Array){var i=e.utils.indexOf(t,this.config.id);this.config.id.splice(i,1)}},getItemsByFilter:function(t){var e=[],i=function(n){for(var s=0;s<n.contentItems.length;s++)t(n.contentItems[s])===!0&&e.push(n.contentItems[s]),i(n.contentItems[s])};return i(this),e},getItemsById:function(t){return this.getItemsByFilter(function(i){return i.config.id instanceof Array?-1!==e.utils.indexOf(t,i.config.id):i.config.id===t})},getItemsByType:function(t){return this._$getItemsByProperty("type",t)},getComponentsByName:function(t){var e,i=this._$getItemsByProperty("componentName",t),n=[];for(e=0;e<i.length;e++)n.push(i[e].instance);return n},_$getItemsByProperty:function(t,e){return this.getItemsByFilter(function(i){return i[t]===e})},_$setParent:function(t){this.parent=t},_$highlightDropZone:function(t,e,i){this.layoutManager.dropTargetIndicator.highlightArea(i)},_$onDrop:function(t){this.addChild(t)},_$hide:function(){this.callDownwards("_$hide",[],!0,!0),this.element.hide()},_$show:function(){this.callDownwards("_$show",[],!0,!0),this.element.show()},_$destroy:function(){this.callDownwards("_$destroy",[],!0,!0),this.element.remove(),this.emitBubblingEvent("itemDestroyed")},_$getArea:function(t){t=t||this.element;var e=t.offset(),i=t.width(),n=t.height();return{x1:e.left,y1:e.top,x2:e.left+i,y2:e.top+n,surface:i*n,contentItem:this}},_$init:function(){var t;for(this.setSize(),t=0;t<this.contentItems.length;t++)this.childElementContainer.append(this.contentItems[t].element);this.isInitialised=!0,this.emitBubblingEvent("itemCreated"),this.emitBubblingEvent(this.type+"Created")},emitBubblingEvent:function(t){var i=new e.utils.BubblingEvent(t,this);this.emit(t,i)},_createContentItems:function(t){var i,n;if(!(t.content instanceof Array))throw new e.errors.ConfigurationError("content must be an Array",t);for(n=0;n<t.content.length;n++)i=this.layoutManager.createContentItem(t.content[n],this),this.contentItems.push(i)},_extendItemNode:function(t){for(var i in e.config.itemDefaultConfig)void 0===t[i]&&(t[i]=e.config.itemDefaultConfig[i]);return t},_propagateEvent:function(t,i){i instanceof e.utils.BubblingEvent&&i.isPropagationStopped===!1&&this.isInitialised===!0&&(this.isRoot===!1&&this.parent?this.parent.emit.apply(this.parent,Array.prototype.slice.call(arguments,0)):this._scheduleEventPropagationToLayoutManager(t,i))},_scheduleEventPropagationToLayoutManager:function(t,i){-1===e.utils.indexOf(t,this._throttledEvents)?this.layoutManager.emit(t,i.origin):this._pendingEventPropagations[t]!==!0&&(this._pendingEventPropagations[t]=!0,e.utils.animFrame(e.utils.fnBind(this._propagateEventToLayoutManager,this,[t,i])))},_propagateEventToLayoutManager:function(t,e){this._pendingEventPropagations[t]=!1,this.layoutManager.emit(t,e)}}),e.items.Component=function(i,n,s){e.items.AbstractContentItem.call(this,i,n,s);var o=i.getComponent(this.config.componentName),r=t.extend(!0,{},this.config.componentState||{});r.componentName=this.config.componentName,this.componentName=this.config.componentName,""===this.config.title&&(this.config.title=this.config.componentName),this.isComponent=!0,this.container=new e.container.ItemContainer(this.config,this,i),this.instance=new o(this.container,r),this.element=this.container._element},e.utils.extend(e.items.Component,e.items.AbstractContentItem),e.utils.copy(e.items.Component.prototype,{close:function(){this.parent.removeChild(this)},setSize:function(){this.container._$setSize(this.element.width(),this.element.height())},_$init:function(){e.items.AbstractContentItem.prototype._$init.call(this),this.container.emit("open")},_$hide:function(){this.container.hide(),e.items.AbstractContentItem.prototype._$hide.call(this)},_$show:function(){this.container.show(),e.items.AbstractContentItem.prototype._$show.call(this)},_$destroy:function(){this.container.emit("destroy"),e.items.AbstractContentItem.prototype._$destroy.call(this)},_$getArea:function(){return null}}),e.items.Root=function(i,n,s){e.items.AbstractContentItem.call(this,i,n,null),this.isRoot=!0,this.type="root",this.element=t('<div class="lm_goldenlayout lm_item lm_root"></div>'),this.childElementContainer=this.element,this._containerElement=s,this._containerElement.append(this.element)},e.utils.extend(e.items.Root,e.items.AbstractContentItem),e.utils.copy(e.items.Root.prototype,{addChild:function(t){if(this.contentItems.length>0)throw new Error("Root node can only have a single child");t=this.layoutManager._$normalizeContentItem(t,this),this.childElementContainer.append(t.element),e.items.AbstractContentItem.prototype.addChild.call(this,t),this.callDownwards("setSize"),this.emitBubblingEvent("stateChanged")},setSize:function(){var t=this._containerElement.width(),e=this._containerElement.height();this.element.width(t),this.element.height(e),this.contentItems[0]&&(this.contentItems[0].element.width(t),this.contentItems[0].element.height(e))},_$onDrop:function(t){var e;t.isComponent===!0?(e=this.layoutManager.createContentItem({type:"stack"},this),e.addChild(t),this.addChild(e)):this.addChild(t)}}),e.items.RowOrColumn=function(i,n,s,o){e.items.AbstractContentItem.call(this,n,s,o),this.isRow=!i,this.isColumn=i,this.element=t('<div class="lm_item lm_'+(i?"column":"row")+'"></div>'),this.childElementContainer=this.element,this._splitterSize=n.config.dimensions.borderWidth,this._isColumn=i,this._dimension=i?"height":"width",this._splitter=[],this._splitterPosition=null,this._splitterMinPosition=null,this._splitterMaxPosition=null},e.utils.extend(e.items.RowOrColumn,e.items.AbstractContentItem),e.utils.copy(e.items.RowOrColumn.prototype,{addChild:function(t,i,n){var s,o,r,h;if(t=this.layoutManager._$normalizeContentItem(t,this),void 0===i&&(i=this.contentItems.length),this.contentItems.length>0?(h=this._createSplitter(Math.max(0,i-1)).element,i>0?(this.contentItems[i-1].element.after(h),h.after(t.element)):(this.contentItems[0].element.before(h),h.before(t.element))):this.childElementContainer.append(t.element),e.items.AbstractContentItem.prototype.addChild.call(this,t,i),s=1/this.contentItems.length*100,n===!0)return void this.emitBubblingEvent("stateChanged");for(r=0;r<this.contentItems.length;r++)this.contentItems[r]===t?t.config[this._dimension]=s:(o=this.contentItems[r].config[this._dimension]*=(100-s)/100,this.contentItems[r].config[this._dimension]=o);this.callDownwards("setSize"),this.emitBubblingEvent("stateChanged")},removeChild:function(t,i){var n,s,o=t.config[this._dimension],r=e.utils.indexOf(t,this.contentItems),h=Math.max(r-1,0);if(-1===r)throw new Error("Can't remove child. ContentItem is not child of this Row or Column");for(this._splitter[h]&&(this._splitter[h]._$destroy(),this._splitter.splice(h,1)),n=0;n<this.contentItems.length;n++)this.contentItems[n]!==t&&(this.contentItems[n].config[this._dimension]+=o/(this.contentItems.length-1));e.items.AbstractContentItem.prototype.removeChild.call(this,t,i),1===this.contentItems.length&&this.config.isClosable===!0?(s=this.contentItems[0],this.contentItems=[],this.parent.replaceChild(this,s,!0)):(this.callDownwards("setSize"),this.emitBubblingEvent("stateChanged"))},replaceChild:function(t,i){var n=t.config[this._dimension];e.items.AbstractContentItem.prototype.replaceChild.call(this,t,i),i.config[this._dimension]=n,this.callDownwards("setSize"),this.emitBubblingEvent("stateChanged")},setSize:function(){this.contentItems.length>0&&(this._calculateRelativeSizes(),this._setAbsoluteSizes()),this.emitBubblingEvent("stateChanged"),this.emit("resize")},_$init:function(){if(this.isInitialised!==!0){var t;for(e.items.AbstractContentItem.prototype._$init.call(this),t=0;t<this.contentItems.length-1;t++)this.contentItems[t].element.after(this._createSplitter(t).element)}},_setAbsoluteSizes:function(){var t,e,i,n=(this.contentItems.length-1)*this._splitterSize,s=this.element.width(),o=this.element.height(),r=0,h=[];for(this._isColumn?o-=n:s-=n,t=0;t<this.contentItems.length;t++)i=Math.floor(this._isColumn?o*(this.contentItems[t].config.height/100):s*(this.contentItems[t].config.width/100)),r+=i,h.push(i);for(e=(this._isColumn?o:s)-r,t=0;t<this.contentItems.length;t++)e-t>0&&h[t]++,this._isColumn?(this.contentItems[t].element.width(s),this.contentItems[t].element.height(h[t])):(this.contentItems[t].element.width(h[t]),this.contentItems[t].element.height(o))},_calculateRelativeSizes:function(){var t,e=0,i=[],n=this._isColumn?"height":"width";for(t=0;t<this.contentItems.length;t++)void 0!==this.contentItems[t].config[n]?e+=this.contentItems[t].config[n]:i.push(this.contentItems[t]);if(100!==Math.round(e))if(Math.round(e)<100&&i.length>0)for(t=0;t<i.length;t++)i[t].config[n]=(100-e)/i.length;else{if(Math.round(e)>100)for(t=0;t<i.length;t++)i[t].config[n]=50,e+=50;for(t=0;t<this.contentItems.length;t++)this.contentItems[t].config[n]=this.contentItems[t].config[n]/e*100}},_createSplitter:function(t){var i;return i=new e.controls.Splitter(this._isColumn,this._splitterSize),i.on("drag",e.utils.fnBind(this._onSplitterDrag,this,[i]),this),i.on("dragStop",e.utils.fnBind(this._onSplitterDragStop,this,[i]),this),i.on("dragStart",e.utils.fnBind(this._onSplitterDragStart,this,[i]),this),this._splitter.splice(t,0,i),i},_getItemsForSplitter:function(t){var i=e.utils.indexOf(t,this._splitter);return{before:this.contentItems[i],after:this.contentItems[i+1]}},_onSplitterDragStart:function(t){var e=this._getItemsForSplitter(t),i=this.layoutManager.config.dimensions[this._isColumn?"minItemHeight":"minItemWidth"];this._splitterPosition=0,this._splitterMinPosition=-1*(e.before.element[this._dimension]()-i),this._splitterMaxPosition=e.after.element[this._dimension]()-i},_onSplitterDrag:function(t,e,i){var n=this._isColumn?i:e;n>this._splitterMinPosition&&n<this._splitterMaxPosition&&(this._splitterPosition=n,t.element.css(this._isColumn?"top":"left",n))},_onSplitterDragStop:function(t){var i=this._getItemsForSplitter(t),n=i.before.element[this._dimension](),s=i.after.element[this._dimension](),o=(this._splitterPosition+n)/(n+s),r=i.before.config[this._dimension]+i.after.config[this._dimension];i.before.config[this._dimension]=o*r,i.after.config[this._dimension]=(1-o)*r,t.element.css({top:0,left:0}),e.utils.animFrame(e.utils.fnBind(this.callDownwards,this,["setSize"]))}}),e.items.Stack=function(i,n,s){e.items.AbstractContentItem.call(this,i,n,s),this.element=t('<div class="lm_item lm_stack"></div>'),this._activeContentItem=null,this._dropZones={},this._dropSegment=null,this._contentAreaDimensions=null,this._dropIndex=null,this.isStack=!0,this.childElementContainer=t('<div class="lm_items"></div>'),this.header=new e.controls.Header(i,this),i.config.settings.hasHeaders===!0&&this.element.append(this.header.element),this.element.append(this.childElementContainer)},e.utils.extend(e.items.Stack,e.items.AbstractContentItem),e.utils.copy(e.items.Stack.prototype,{setSize:function(){var t,e=this.element.width(),i=this.element.height()-this.layoutManager.config.dimensions.headerHeight;for(this.childElementContainer.width(e),this.childElementContainer.height(i),t=0;t<this.contentItems.length;t++)this.contentItems[t].element.width(e).height(i);this.emit("resize"),this.emitBubblingEvent("stateChanged")},_$init:function(){var t,i;if(this.isInitialised!==!0){for(e.items.AbstractContentItem.prototype._$init.call(this),t=0;t<this.contentItems.length;t++)this.header.createTab(this.contentItems[t]),this.contentItems[t]._$hide();if(this.contentItems.length>0){if(i=this.contentItems[this.config.activeItemIndex||0],!i)throw new Error("Configured activeItemIndex out of bounds");this.setActiveContentItem(i)}}},setActiveContentItem:function(t){if(-1===e.utils.indexOf(t,this.contentItems))throw new Error("contentItem is not a child of this stack");null!==this._activeContentItem&&this._activeContentItem._$hide(),this._activeContentItem=t,this.header.setActiveContentItem(t),t._$show(),this.emit("activeContentItemChanged",t),this.emitBubblingEvent("stateChanged")},getActiveContentItem:function(){return this.header.activeContentItem},addChild:function(t,i){t=this.layoutManager._$normalizeContentItem(t,this),e.items.AbstractContentItem.prototype.addChild.call(this,t,i),this.childElementContainer.append(t.element),this.header.createTab(t,i),this.setActiveContentItem(t),this.callDownwards("setSize"),this.emitBubblingEvent("stateChanged")},removeChild:function(t,i){var n=e.utils.indexOf(t,this.contentItems);e.items.AbstractContentItem.prototype.removeChild.call(this,t,i),this.header.removeTab(t),this.contentItems.length>0?this.setActiveContentItem(this.contentItems[Math.max(n-1,0)]):this._activeContentItem=null,this.emitBubblingEvent("stateChanged")},_$destroy:function(){e.items.AbstractContentItem.prototype._$destroy.call(this),this.header._$destroy()},_$onDrop:function(t){if("header"===this._dropSegment)return this._resetHeaderDropZone(),void this.addChild(t,this._dropIndex);if("body"===this._dropSegment)return void this.addChild(t);var i,n,s,o="top"===this._dropSegment||"bottom"===this._dropSegment,r="left"===this._dropSegment||"right"===this._dropSegment,h="top"===this._dropSegment||"left"===this._dropSegment,a=o&&this.parent.isColumn||r&&this.parent.isRow,l=o?"column":"row",c=o?"height":"width";t.isComponent&&(n=this.layoutManager.createContentItem({type:"stack"},this),n._$init(),n.addChild(t),t=n),a?(i=e.utils.indexOf(this,this.parent.contentItems),this.parent.addChild(t,h?i:i+1,!0),this.config[c]*=.5,t.config[c]=this.config[c],this.parent.callDownwards("setSize")):(l=o?"column":"row",s=this.layoutManager.createContentItem({type:l},this),this.parent.replaceChild(this,s),s.addChild(t,h?0:void 0,!0),s.addChild(this,h?void 0:0,!0),this.config[c]=50,t.config[c]=50,s.callDownwards("setSize"))},_$highlightDropZone:function(t,e){var i,n;for(i in this._contentAreaDimensions)if(n=this._contentAreaDimensions[i].hoverArea,n.x1<t&&n.x2>t&&n.y1<e&&n.y2>e)return void("header"===i?(this._dropSegment="header",this._highlightHeaderDropZone(t)):(this._resetHeaderDropZone(),this._highlightBodyDropZone(i)))},_$getArea:function(){var t=e.items.AbstractContentItem.prototype._$getArea,i=t.call(this,this.header.element),n=t.call(this,this.childElementContainer),s=n.x2-n.x1,o=n.y2-n.y1;return this._contentAreaDimensions={header:{hoverArea:{x1:i.x1,y1:i.y1,x2:i.x2,y2:i.y2},highlightArea:{x1:i.x1,y1:i.y1,x2:i.x2,y2:i.y2}}},this._activeContentItem&&this._activeContentItem.isComponent===!1?i:0===this.contentItems.length?(this._contentAreaDimensions.body={hoverArea:{x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y2},highlightArea:{x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y2}},t.call(this,this.element)):(this._contentAreaDimensions.left={hoverArea:{x1:n.x1,y1:n.y1,x2:n.x1+.25*s,y2:n.y2},highlightArea:{x1:n.x1,y1:n.y1,x2:n.x1+.5*s,y2:n.y2}},this._contentAreaDimensions.top={hoverArea:{x1:n.x1+.25*s,y1:n.y1,x2:n.x1+.75*s,y2:n.y1+.5*o},highlightArea:{x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y1+.5*o}},this._contentAreaDimensions.right={hoverArea:{x1:n.x1+.75*s,y1:n.y1,x2:n.x2,y2:n.y2},highlightArea:{x1:n.x1+.5*s,y1:n.y1,x2:n.x2,y2:n.y2}},this._contentAreaDimensions.bottom={hoverArea:{x1:n.x1+.25*s,y1:n.y1+.5*o,x2:n.x1+.75*s,y2:n.y2},highlightArea:{x1:n.x1,y1:n.y1+.5*o,x2:n.x2,y2:n.y2}},t.call(this,this.element))},_highlightHeaderDropZone:function(t){var e,i,n,s,o,r,h,a,l,c=this.header.tabs.length,m=!1;if(0===c)return h=this.header.element.offset(),void this.layoutManager.dropTargetIndicator.highlightArea({x1:h.left,x2:h.left+100,y1:h.top+this.header.element.height()-20,y2:h.top+this.header.element.height()});for(e=0;c>e;e++)if(i=this.header.tabs[e].element,o=i.offset(),s=o.left,n=o.top,a=i.width(),t>s&&s+a>t){m=!0;break}m===!1&&s>t||(l=s+a/2,l>t?(this._dropIndex=e,i.before(this.layoutManager.tabDropPlaceholder)):(this._dropIndex=Math.min(e+1,c),i.after(this.layoutManager.tabDropPlaceholder)),r=this.layoutManager.tabDropPlaceholder.offset().left,this.layoutManager.dropTargetIndicator.highlightArea({x1:r,x2:r+this.layoutManager.tabDropPlaceholder.width(),y1:n,y2:n+i.innerHeight()}))},_resetHeaderDropZone:function(){this.layoutManager.tabDropPlaceholder.remove()},_highlightBodyDropZone:function(t){var e=this._contentAreaDimensions[t].highlightArea;this.layoutManager.dropTargetIndicator.highlightArea(e),this._dropSegment=t}}),e.utils.BubblingEvent=function(t,e){this.name=t,this.origin=e,this.isPropagationStopped=!1},e.utils.BubblingEvent.prototype.stopPropagation=function(){this.isPropagationStopped=!0},e.utils.ConfigMinifier=function(){this._keys=["settings","hasHeaders","constrainDragToContainer","selectionEnabled","dimensions","borderWidth","minItemHeight","minItemWidth","headerHeight","dragProxyWidth","dragProxyHeight","labels","close","maximise","minimise","popout","content","componentName","componentState","id","width","type","height","isClosable","title","popoutWholeStack","openPopouts","parentId","activeItemIndex","reorderEnabled"],this._values=[!0,!1,"row","column","stack","component","close","maximise","minimise","open in new window"]},e.utils.copy(e.utils.ConfigMinifier.prototype,{minifyConfig:function(t){var e={};return this._nextLevel(t,e,"_min"),e},unminifyConfig:function(t){var e={};return this._nextLevel(t,e,"_max"),e},_nextLevel:function(t,e,i){var n,s;for(n in t)t instanceof Array&&(n=parseInt(n,10)),t.hasOwnProperty(n)&&(s=this[i](n,this._keys),"object"==typeof t[n]?(e[s]=t[n]instanceof Array?[]:{},this._nextLevel(t[n],e[s],i)):e[s]=this[i](t[n],this._values))},_min:function(t,i){if("string"==typeof t&&1===t.length)return"___"+t;var n=e.utils.indexOf(t,i);return-1===n?t:n.toString(36)},_max:function(t,e){return"string"==typeof t&&1===t.length?e[parseInt(t,36)]:"string"==typeof t&&"___"===t.substr(0,3)?t[3]:t}}),e.utils.EventHub=function(i){e.utils.EventEmitter.call(this),this._layoutManager=i,this._dontPropagateToParent=null,this._childEventSource=null,this.on(e.utils.EventEmitter.ALL_EVENT,e.utils.fnBind(this._onEventFromThis,this)),t(window).on("gl_child_event",e.utils.fnBind(this._onEventFromChild,this))},e.utils.EventHub.prototype._onEventFromThis=function(){var t=Array.prototype.slice.call(arguments);this._layoutManager.isSubWindow&&t[0]!==this._dontPropagateToParent&&this._propagateToParent(t),this._propagateToChildren(t),this._dontPropagateToParent=null,this._childEventSource=null},e.utils.EventHub.prototype._$onEventFromParent=function(t){this._dontPropagateToParent=t[0],this.emit.apply(this,t)},e.utils.EventHub.prototype._onEventFromChild=function(t){this._childEventSource=t.originalEvent.__gl,this.emit.apply(this,t.originalEvent.__glArgs)},e.utils.EventHub.prototype._propagateToParent=function(t){var e,i="gl_child_event";document.createEvent?(e=window.opener.document.createEvent("HTMLEvents"),e.initEvent(i,!0,!0)):(e=window.opener.document.createEventObject(),e.eventType=i),e.eventName=i,e.__glArgs=t,e.__gl=this._layoutManager,document.createEvent?window.opener.dispatchEvent(e):window.opener.fireEvent("on"+e.eventType,e)},e.utils.EventHub.prototype._propagateToChildren=function(t){var e,i;for(i=0;i<this._layoutManager.openPopouts.length;i++)e=this._layoutManager.openPopouts[i].getGlInstance(),e!==this._childEventSource&&e.eventHub._$onEventFromParent(t)}}(window.$);
  19. /* ***** BEGIN LICENSE BLOCK *****
  20. * Distributed under the BSD license:
  21. *
  22. * Copyright (c) 2010, Ajax.org B.V.
  23. * All rights reserved.
  24. *
  25. * Redistribution and use in source and binary forms, with or without
  26. * modification, are permitted provided that the following conditions are met:
  27. * * Redistributions of source code must retain the above copyright
  28. * notice, this list of conditions and the following disclaimer.
  29. * * Redistributions in binary form must reproduce the above copyright
  30. * notice, this list of conditions and the following disclaimer in the
  31. * documentation and/or other materials provided with the distribution.
  32. * * Neither the name of Ajax.org B.V. nor the
  33. * names of its contributors may be used to endorse or promote products
  34. * derived from this software without specific prior written permission.
  35. *
  36. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  37. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  38. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  39. * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
  40. * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  41. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  42. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  44. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  45. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  46. *
  47. * ***** END LICENSE BLOCK ***** */
  48. /**
  49. * Define a module along with a payload
  50. * @param module a name for the payload
  51. * @param payload a function to call with (require, exports, module) params
  52. */
  53. (function() {
  54. var ACE_NAMESPACE = "ace";
  55. var global = (function() { return this; })();
  56. if (!global && typeof window != "undefined") global = window; // strict mode
  57. if (!ACE_NAMESPACE && typeof requirejs !== "undefined")
  58. return;
  59. var define = function(module, deps, payload) {
  60. if (typeof module !== "string") {
  61. if (define.original)
  62. define.original.apply(this, arguments);
  63. else {
  64. console.error("dropping module because define wasn\'t a string.");
  65. console.trace();
  66. }
  67. return;
  68. }
  69. if (arguments.length == 2)
  70. payload = deps;
  71. if (!define.modules[module]) {
  72. define.payloads[module] = payload;
  73. define.modules[module] = null;
  74. }
  75. };
  76. define.modules = {};
  77. define.payloads = {};
  78. /**
  79. * Get at functionality ace.define()ed using the function above
  80. */
  81. var _require = function(parentId, module, callback) {
  82. if (typeof module === "string") {
  83. var payload = lookup(parentId, module);
  84. if (payload != undefined) {
  85. callback && callback();
  86. return payload;
  87. }
  88. } else if (Object.prototype.toString.call(module) === "[object Array]") {
  89. var params = [];
  90. for (var i = 0, l = module.length; i < l; ++i) {
  91. var dep = lookup(parentId, module[i]);
  92. if (dep == undefined && require.original)
  93. return;
  94. params.push(dep);
  95. }
  96. return callback && callback.apply(null, params) || true;
  97. }
  98. };
  99. var require = function(module, callback) {
  100. var packagedModule = _require("", module, callback);
  101. if (packagedModule == undefined && require.original)
  102. return require.original.apply(this, arguments);
  103. return packagedModule;
  104. };
  105. var normalizeModule = function(parentId, moduleName) {
  106. // normalize plugin requires
  107. if (moduleName.indexOf("!") !== -1) {
  108. var chunks = moduleName.split("!");
  109. return normalizeModule(parentId, chunks[0]) + "!" + normalizeModule(parentId, chunks[1]);
  110. }
  111. // normalize relative requires
  112. if (moduleName.charAt(0) == ".") {
  113. var base = parentId.split("/").slice(0, -1).join("/");
  114. moduleName = base + "/" + moduleName;
  115. while(moduleName.indexOf(".") !== -1 && previous != moduleName) {
  116. var previous = moduleName;
  117. moduleName = moduleName.replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, "");
  118. }
  119. }
  120. return moduleName;
  121. };
  122. /**
  123. * Internal function to lookup moduleNames and resolve them by calling the
  124. * definition function if needed.
  125. */
  126. var lookup = function(parentId, moduleName) {
  127. moduleName = normalizeModule(parentId, moduleName);
  128. var module = define.modules[moduleName];
  129. if (!module) {
  130. module = define.payloads[moduleName];
  131. if (typeof module === 'function') {
  132. var exports = {};
  133. var mod = {
  134. id: moduleName,
  135. uri: '',
  136. exports: exports,
  137. packaged: true
  138. };
  139. var req = function(module, callback) {
  140. return _require(moduleName, module, callback);
  141. };
  142. var returnValue = module(req, exports, mod);
  143. exports = returnValue || mod.exports;
  144. define.modules[moduleName] = exports;
  145. delete define.payloads[moduleName];
  146. }
  147. module = define.modules[moduleName] = exports || module;
  148. }
  149. return module;
  150. };
  151. function exportAce(ns) {
  152. var root = global;
  153. if (ns) {
  154. if (!global[ns])
  155. global[ns] = {};
  156. root = global[ns];
  157. }
  158. if (!root.define || !root.define.packaged) {
  159. define.original = root.define;
  160. root.define = define;
  161. root.define.packaged = true;
  162. }
  163. if (!root.require || !root.require.packaged) {
  164. require.original = root.require;
  165. root.require = require;
  166. root.require.packaged = true;
  167. }
  168. }
  169. exportAce(ACE_NAMESPACE);
  170. })();
  171. ace.define("ace/lib/regexp",["require","exports","module"], function(require, exports, module) {
  172. "use strict";
  173. var real = {
  174. exec: RegExp.prototype.exec,
  175. test: RegExp.prototype.test,
  176. match: String.prototype.match,
  177. replace: String.prototype.replace,
  178. split: String.prototype.split
  179. },
  180. compliantExecNpcg = real.exec.call(/()??/, "")[1] === undefined, // check `exec` handling of nonparticipating capturing groups
  181. compliantLastIndexIncrement = function () {
  182. var x = /^/g;
  183. real.test.call(x, "");
  184. return !x.lastIndex;
  185. }();
  186. if (compliantLastIndexIncrement && compliantExecNpcg)
  187. return;
  188. RegExp.prototype.exec = function (str) {
  189. var match = real.exec.apply(this, arguments),
  190. name, r2;
  191. if ( typeof(str) == 'string' && match) {
  192. if (!compliantExecNpcg && match.length > 1 && indexOf(match, "") > -1) {
  193. r2 = RegExp(this.source, real.replace.call(getNativeFlags(this), "g", ""));
  194. real.replace.call(str.slice(match.index), r2, function () {
  195. for (var i = 1; i < arguments.length - 2; i++) {
  196. if (arguments[i] === undefined)
  197. match[i] = undefined;
  198. }
  199. });
  200. }
  201. if (this._xregexp && this._xregexp.captureNames) {
  202. for (var i = 1; i < match.length; i++) {
  203. name = this._xregexp.captureNames[i - 1];
  204. if (name)
  205. match[name] = match[i];
  206. }
  207. }
  208. if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))
  209. this.lastIndex--;
  210. }
  211. return match;
  212. };
  213. if (!compliantLastIndexIncrement) {
  214. RegExp.prototype.test = function (str) {
  215. var match = real.exec.call(this, str);
  216. if (match && this.global && !match[0].length && (this.lastIndex > match.index))
  217. this.lastIndex--;
  218. return !!match;
  219. };
  220. }
  221. function getNativeFlags (regex) {
  222. return (regex.global ? "g" : "") +
  223. (regex.ignoreCase ? "i" : "") +
  224. (regex.multiline ? "m" : "") +
  225. (regex.extended ? "x" : "") + // Proposed for ES4; included in AS3
  226. (regex.sticky ? "y" : "");
  227. }
  228. function indexOf (array, item, from) {
  229. if (Array.prototype.indexOf) // Use the native array method if available
  230. return array.indexOf(item, from);
  231. for (var i = from || 0; i < array.length; i++) {
  232. if (array[i] === item)
  233. return i;
  234. }
  235. return -1;
  236. }
  237. });
  238. ace.define("ace/lib/es5-shim",["require","exports","module"], function(require, exports, module) {
  239. function Empty() {}
  240. if (!Function.prototype.bind) {
  241. Function.prototype.bind = function bind(that) { // .length is 1
  242. var target = this;
  243. if (typeof target != "function") {
  244. throw new TypeError("Function.prototype.bind called on incompatible " + target);
  245. }
  246. var args = slice.call(arguments, 1); // for normal call
  247. var bound = function () {
  248. if (this instanceof bound) {
  249. var result = target.apply(
  250. this,
  251. args.concat(slice.call(arguments))
  252. );
  253. if (Object(result) === result) {
  254. return result;
  255. }
  256. return this;
  257. } else {
  258. return target.apply(
  259. that,
  260. args.concat(slice.call(arguments))
  261. );
  262. }
  263. };
  264. if(target.prototype) {
  265. Empty.prototype = target.prototype;
  266. bound.prototype = new Empty();
  267. Empty.prototype = null;
  268. }
  269. return bound;
  270. };
  271. }
  272. var call = Function.prototype.call;
  273. var prototypeOfArray = Array.prototype;
  274. var prototypeOfObject = Object.prototype;
  275. var slice = prototypeOfArray.slice;
  276. var _toString = call.bind(prototypeOfObject.toString);
  277. var owns = call.bind(prototypeOfObject.hasOwnProperty);
  278. var defineGetter;
  279. var defineSetter;
  280. var lookupGetter;
  281. var lookupSetter;
  282. var supportsAccessors;
  283. if ((supportsAccessors = owns(prototypeOfObject, "__defineGetter__"))) {
  284. defineGetter = call.bind(prototypeOfObject.__defineGetter__);
  285. defineSetter = call.bind(prototypeOfObject.__defineSetter__);
  286. lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);
  287. lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);
  288. }
  289. if ([1,2].splice(0).length != 2) {
  290. if(function() { // test IE < 9 to splice bug - see issue #138
  291. function makeArray(l) {
  292. var a = new Array(l+2);
  293. a[0] = a[1] = 0;
  294. return a;
  295. }
  296. var array = [], lengthBefore;
  297. array.splice.apply(array, makeArray(20));
  298. array.splice.apply(array, makeArray(26));
  299. lengthBefore = array.length; //46
  300. array.splice(5, 0, "XXX"); // add one element
  301. lengthBefore + 1 == array.length
  302. if (lengthBefore + 1 == array.length) {
  303. return true;// has right splice implementation without bugs
  304. }
  305. }()) {//IE 6/7
  306. var array_splice = Array.prototype.splice;
  307. Array.prototype.splice = function(start, deleteCount) {
  308. if (!arguments.length) {
  309. return [];
  310. } else {
  311. return array_splice.apply(this, [
  312. start === void 0 ? 0 : start,
  313. deleteCount === void 0 ? (this.length - start) : deleteCount
  314. ].concat(slice.call(arguments, 2)))
  315. }
  316. };
  317. } else {//IE8
  318. Array.prototype.splice = function(pos, removeCount){
  319. var length = this.length;
  320. if (pos > 0) {
  321. if (pos > length)
  322. pos = length;
  323. } else if (pos == void 0) {
  324. pos = 0;
  325. } else if (pos < 0) {
  326. pos = Math.max(length + pos, 0);
  327. }
  328. if (!(pos+removeCount < length))
  329. removeCount = length - pos;
  330. var removed = this.slice(pos, pos+removeCount);
  331. var insert = slice.call(arguments, 2);
  332. var add = insert.length;
  333. if (pos === length) {
  334. if (add) {
  335. this.push.apply(this, insert);
  336. }
  337. } else {
  338. var remove = Math.min(removeCount, length - pos);
  339. var tailOldPos = pos + remove;
  340. var tailNewPos = tailOldPos + add - remove;
  341. var tailCount = length - tailOldPos;
  342. var lengthAfterRemove = length - remove;
  343. if (tailNewPos < tailOldPos) { // case A
  344. for (var i = 0; i < tailCount; ++i) {
  345. this[tailNewPos+i] = this[tailOldPos+i];
  346. }
  347. } else if (tailNewPos > tailOldPos) { // case B
  348. for (i = tailCount; i--; ) {
  349. this[tailNewPos+i] = this[tailOldPos+i];
  350. }
  351. } // else, add == remove (nothing to do)
  352. if (add && pos === lengthAfterRemove) {
  353. this.length = lengthAfterRemove; // truncate array
  354. this.push.apply(this, insert);
  355. } else {
  356. this.length = lengthAfterRemove + add; // reserves space
  357. for (i = 0; i < add; ++i) {
  358. this[pos+i] = insert[i];
  359. }
  360. }
  361. }
  362. return removed;
  363. };
  364. }
  365. }
  366. if (!Array.isArray) {
  367. Array.isArray = function isArray(obj) {
  368. return _toString(obj) == "[object Array]";
  369. };
  370. }
  371. var boxedString = Object("a"),
  372. splitString = boxedString[0] != "a" || !(0 in boxedString);
  373. if (!Array.prototype.forEach) {
  374. Array.prototype.forEach = function forEach(fun /*, thisp*/) {
  375. var object = toObject(this),
  376. self = splitString && _toString(this) == "[object String]" ?
  377. this.split("") :
  378. object,
  379. thisp = arguments[1],
  380. i = -1,
  381. length = self.length >>> 0;
  382. if (_toString(fun) != "[object Function]") {
  383. throw new TypeError(); // TODO message
  384. }
  385. while (++i < length) {
  386. if (i in self) {
  387. fun.call(thisp, self[i], i, object);
  388. }
  389. }
  390. };
  391. }
  392. if (!Array.prototype.map) {
  393. Array.prototype.map = function map(fun /*, thisp*/) {
  394. var object = toObject(this),
  395. self = splitString && _toString(this) == "[object String]" ?
  396. this.split("") :
  397. object,
  398. length = self.length >>> 0,
  399. result = Array(length),
  400. thisp = arguments[1];
  401. if (_toString(fun) != "[object Function]") {
  402. throw new TypeError(fun + " is not a function");
  403. }
  404. for (var i = 0; i < length; i++) {
  405. if (i in self)
  406. result[i] = fun.call(thisp, self[i], i, object);
  407. }
  408. return result;
  409. };
  410. }
  411. if (!Array.prototype.filter) {
  412. Array.prototype.filter = function filter(fun /*, thisp */) {
  413. var object = toObject(this),
  414. self = splitString && _toString(this) == "[object String]" ?
  415. this.split("") :
  416. object,
  417. length = self.length >>> 0,
  418. result = [],
  419. value,
  420. thisp = arguments[1];
  421. if (_toString(fun) != "[object Function]") {
  422. throw new TypeError(fun + " is not a function");
  423. }
  424. for (var i = 0; i < length; i++) {
  425. if (i in self) {
  426. value = self[i];
  427. if (fun.call(thisp, value, i, object)) {
  428. result.push(value);
  429. }
  430. }
  431. }
  432. return result;
  433. };
  434. }
  435. if (!Array.prototype.every) {
  436. Array.prototype.every = function every(fun /*, thisp */) {
  437. var object = toObject(this),
  438. self = splitString && _toString(this) == "[object String]" ?
  439. this.split("") :
  440. object,
  441. length = self.length >>> 0,
  442. thisp = arguments[1];
  443. if (_toString(fun) != "[object Function]") {
  444. throw new TypeError(fun + " is not a function");
  445. }
  446. for (var i = 0; i < length; i++) {
  447. if (i in self && !fun.call(thisp, self[i], i, object)) {
  448. return false;
  449. }
  450. }
  451. return true;
  452. };
  453. }
  454. if (!Array.prototype.some) {
  455. Array.prototype.some = function some(fun /*, thisp */) {
  456. var object = toObject(this),
  457. self = splitString && _toString(this) == "[object String]" ?
  458. this.split("") :
  459. object,
  460. length = self.length >>> 0,
  461. thisp = arguments[1];
  462. if (_toString(fun) != "[object Function]") {
  463. throw new TypeError(fun + " is not a function");
  464. }
  465. for (var i = 0; i < length; i++) {
  466. if (i in self && fun.call(thisp, self[i], i, object)) {
  467. return true;
  468. }
  469. }
  470. return false;
  471. };
  472. }
  473. if (!Array.prototype.reduce) {
  474. Array.prototype.reduce = function reduce(fun /*, initial*/) {
  475. var object = toObject(this),
  476. self = splitString && _toString(this) == "[object String]" ?
  477. this.split("") :
  478. object,
  479. length = self.length >>> 0;
  480. if (_toString(fun) != "[object Function]") {
  481. throw new TypeError(fun + " is not a function");
  482. }
  483. if (!length && arguments.length == 1) {
  484. throw new TypeError("reduce of empty array with no initial value");
  485. }
  486. var i = 0;
  487. var result;
  488. if (arguments.length >= 2) {
  489. result = arguments[1];
  490. } else {
  491. do {
  492. if (i in self) {
  493. result = self[i++];
  494. break;
  495. }
  496. if (++i >= length) {
  497. throw new TypeError("reduce of empty array with no initial value");
  498. }
  499. } while (true);
  500. }
  501. for (; i < length; i++) {
  502. if (i in self) {
  503. result = fun.call(void 0, result, self[i], i, object);
  504. }
  505. }
  506. return result;
  507. };
  508. }
  509. if (!Array.prototype.reduceRight) {
  510. Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {
  511. var object = toObject(this),
  512. self = splitString && _toString(this) == "[object String]" ?
  513. this.split("") :
  514. object,
  515. length = self.length >>> 0;
  516. if (_toString(fun) != "[object Function]") {
  517. throw new TypeError(fun + " is not a function");
  518. }
  519. if (!length && arguments.length == 1) {
  520. throw new TypeError("reduceRight of empty array with no initial value");
  521. }
  522. var result, i = length - 1;
  523. if (arguments.length >= 2) {
  524. result = arguments[1];
  525. } else {
  526. do {
  527. if (i in self) {
  528. result = self[i--];
  529. break;
  530. }
  531. if (--i < 0) {
  532. throw new TypeError("reduceRight of empty array with no initial value");
  533. }
  534. } while (true);
  535. }
  536. do {
  537. if (i in this) {
  538. result = fun.call(void 0, result, self[i], i, object);
  539. }
  540. } while (i--);
  541. return result;
  542. };
  543. }
  544. if (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) {
  545. Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {
  546. var self = splitString && _toString(this) == "[object String]" ?
  547. this.split("") :
  548. toObject(this),
  549. length = self.length >>> 0;
  550. if (!length) {
  551. return -1;
  552. }
  553. var i = 0;
  554. if (arguments.length > 1) {
  555. i = toInteger(arguments[1]);
  556. }
  557. i = i >= 0 ? i : Math.max(0, length + i);
  558. for (; i < length; i++) {
  559. if (i in self && self[i] === sought) {
  560. return i;
  561. }
  562. }
  563. return -1;
  564. };
  565. }
  566. if (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {
  567. Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {
  568. var self = splitString && _toString(this) == "[object String]" ?
  569. this.split("") :
  570. toObject(this),
  571. length = self.length >>> 0;
  572. if (!length) {
  573. return -1;
  574. }
  575. var i = length - 1;
  576. if (arguments.length > 1) {
  577. i = Math.min(i, toInteger(arguments[1]));
  578. }
  579. i = i >= 0 ? i : length - Math.abs(i);
  580. for (; i >= 0; i--) {
  581. if (i in self && sought === self[i]) {
  582. return i;
  583. }
  584. }
  585. return -1;
  586. };
  587. }
  588. if (!Object.getPrototypeOf) {
  589. Object.getPrototypeOf = function getPrototypeOf(object) {
  590. return object.__proto__ || (
  591. object.constructor ?
  592. object.constructor.prototype :
  593. prototypeOfObject
  594. );
  595. };
  596. }
  597. if (!Object.getOwnPropertyDescriptor) {
  598. var ERR_NON_OBJECT = "Object.getOwnPropertyDescriptor called on a " +
  599. "non-object: ";
  600. Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {
  601. if ((typeof object != "object" && typeof object != "function") || object === null)
  602. throw new TypeError(ERR_NON_OBJECT + object);
  603. if (!owns(object, property))
  604. return;
  605. var descriptor, getter, setter;
  606. descriptor = { enumerable: true, configurable: true };
  607. if (supportsAccessors) {
  608. var prototype = object.__proto__;
  609. object.__proto__ = prototypeOfObject;
  610. var getter = lookupGetter(object, property);
  611. var setter = lookupSetter(object, property);
  612. object.__proto__ = prototype;
  613. if (getter || setter) {
  614. if (getter) descriptor.get = getter;
  615. if (setter) descriptor.set = setter;
  616. return descriptor;
  617. }
  618. }
  619. descriptor.value = object[property];
  620. return descriptor;
  621. };
  622. }
  623. if (!Object.getOwnPropertyNames) {
  624. Object.getOwnPropertyNames = function getOwnPropertyNames(object) {
  625. return Object.keys(object);
  626. };
  627. }
  628. if (!Object.create) {
  629. var createEmpty;
  630. if (Object.prototype.__proto__ === null) {
  631. createEmpty = function () {
  632. return { "__proto__": null };
  633. };
  634. } else {
  635. createEmpty = function () {
  636. var empty = {};
  637. for (var i in empty)
  638. empty[i] = null;
  639. empty.constructor =
  640. empty.hasOwnProperty =
  641. empty.propertyIsEnumerable =
  642. empty.isPrototypeOf =
  643. empty.toLocaleString =
  644. empty.toString =
  645. empty.valueOf =
  646. empty.__proto__ = null;
  647. return empty;
  648. }
  649. }
  650. Object.create = function create(prototype, properties) {
  651. var object;
  652. if (prototype === null) {
  653. object = createEmpty();
  654. } else {
  655. if (typeof prototype != "object")
  656. throw new TypeError("typeof prototype["+(typeof prototype)+"] != 'object'");
  657. var Type = function () {};
  658. Type.prototype = prototype;
  659. object = new Type();
  660. object.__proto__ = prototype;
  661. }
  662. if (properties !== void 0)
  663. Object.defineProperties(object, properties);
  664. return object;
  665. };
  666. }
  667. function doesDefinePropertyWork(object) {
  668. try {
  669. Object.defineProperty(object, "sentinel", {});
  670. return "sentinel" in object;
  671. } catch (exception) {
  672. }
  673. }
  674. if (Object.defineProperty) {
  675. var definePropertyWorksOnObject = doesDefinePropertyWork({});
  676. var definePropertyWorksOnDom = typeof document == "undefined" ||
  677. doesDefinePropertyWork(document.createElement("div"));
  678. if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {
  679. var definePropertyFallback = Object.defineProperty;
  680. }
  681. }
  682. if (!Object.defineProperty || definePropertyFallback) {
  683. var ERR_NON_OBJECT_DESCRIPTOR = "Property description must be an object: ";
  684. var ERR_NON_OBJECT_TARGET = "Object.defineProperty called on non-object: "
  685. var ERR_ACCESSORS_NOT_SUPPORTED = "getters & setters can not be defined " +
  686. "on this javascript engine";
  687. Object.defineProperty = function defineProperty(object, property, descriptor) {
  688. if ((typeof object != "object" && typeof object != "function") || object === null)
  689. throw new TypeError(ERR_NON_OBJECT_TARGET + object);
  690. if ((typeof descriptor != "object" && typeof descriptor != "function") || descriptor === null)
  691. throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);
  692. if (definePropertyFallback) {
  693. try {
  694. return definePropertyFallback.call(Object, object, property, descriptor);
  695. } catch (exception) {
  696. }
  697. }
  698. if (owns(descriptor, "value")) {
  699. if (supportsAccessors && (lookupGetter(object, property) ||
  700. lookupSetter(object, property)))
  701. {
  702. var prototype = object.__proto__;
  703. object.__proto__ = prototypeOfObject;
  704. delete object[property];
  705. object[property] = descriptor.value;
  706. object.__proto__ = prototype;
  707. } else {
  708. object[property] = descriptor.value;
  709. }
  710. } else {
  711. if (!supportsAccessors)
  712. throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
  713. if (owns(descriptor, "get"))
  714. defineGetter(object, property, descriptor.get);
  715. if (owns(descriptor, "set"))
  716. defineSetter(object, property, descriptor.set);
  717. }
  718. return object;
  719. };
  720. }
  721. if (!Object.defineProperties) {
  722. Object.defineProperties = function defineProperties(object, properties) {
  723. for (var property in properties) {
  724. if (owns(properties, property))
  725. Object.defineProperty(object, property, properties[property]);
  726. }
  727. return object;
  728. };
  729. }
  730. if (!Object.seal) {
  731. Object.seal = function seal(object) {
  732. return object;
  733. };
  734. }
  735. if (!Object.freeze) {
  736. Object.freeze = function freeze(object) {
  737. return object;
  738. };
  739. }
  740. try {
  741. Object.freeze(function () {});
  742. } catch (exception) {
  743. Object.freeze = (function freeze(freezeObject) {
  744. return function freeze(object) {
  745. if (typeof object == "function") {
  746. return object;
  747. } else {
  748. return freezeObject(object);
  749. }
  750. };
  751. })(Object.freeze);
  752. }
  753. if (!Object.preventExtensions) {
  754. Object.preventExtensions = function preventExtensions(object) {
  755. return object;
  756. };
  757. }
  758. if (!Object.isSealed) {
  759. Object.isSealed = function isSealed(object) {
  760. return false;
  761. };
  762. }
  763. if (!Object.isFrozen) {
  764. Object.isFrozen = function isFrozen(object) {
  765. return false;
  766. };
  767. }
  768. if (!Object.isExtensible) {
  769. Object.isExtensible = function isExtensible(object) {
  770. if (Object(object) === object) {
  771. throw new TypeError(); // TODO message
  772. }
  773. var name = '';
  774. while (owns(object, name)) {
  775. name += '?';
  776. }
  777. object[name] = true;
  778. var returnValue = owns(object, name);
  779. delete object[name];
  780. return returnValue;
  781. };
  782. }
  783. if (!Object.keys) {
  784. var hasDontEnumBug = true,
  785. dontEnums = [
  786. "toString",
  787. "toLocaleString",
  788. "valueOf",
  789. "hasOwnProperty",
  790. "isPrototypeOf",
  791. "propertyIsEnumerable",
  792. "constructor"
  793. ],
  794. dontEnumsLength = dontEnums.length;
  795. for (var key in {"toString": null}) {
  796. hasDontEnumBug = false;
  797. }
  798. Object.keys = function keys(object) {
  799. if (
  800. (typeof object != "object" && typeof object != "function") ||
  801. object === null
  802. ) {
  803. throw new TypeError("Object.keys called on a non-object");
  804. }
  805. var keys = [];
  806. for (var name in object) {
  807. if (owns(object, name)) {
  808. keys.push(name);
  809. }
  810. }
  811. if (hasDontEnumBug) {
  812. for (var i = 0, ii = dontEnumsLength; i < ii; i++) {
  813. var dontEnum = dontEnums[i];
  814. if (owns(object, dontEnum)) {
  815. keys.push(dontEnum);
  816. }
  817. }
  818. }
  819. return keys;
  820. };
  821. }
  822. if (!Date.now) {
  823. Date.now = function now() {
  824. return new Date().getTime();
  825. };
  826. }
  827. var ws = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003" +
  828. "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" +
  829. "\u2029\uFEFF";
  830. if (!String.prototype.trim || ws.trim()) {
  831. ws = "[" + ws + "]";
  832. var trimBeginRegexp = new RegExp("^" + ws + ws + "*"),
  833. trimEndRegexp = new RegExp(ws + ws + "*$");
  834. String.prototype.trim = function trim() {
  835. return String(this).replace(trimBeginRegexp, "").replace(trimEndRegexp, "");
  836. };
  837. }
  838. function toInteger(n) {
  839. n = +n;
  840. if (n !== n) { // isNaN
  841. n = 0;
  842. } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) {
  843. n = (n > 0 || -1) * Math.floor(Math.abs(n));
  844. }
  845. return n;
  846. }
  847. function isPrimitive(input) {
  848. var type = typeof input;
  849. return (
  850. input === null ||
  851. type === "undefined" ||
  852. type === "boolean" ||
  853. type === "number" ||
  854. type === "string"
  855. );
  856. }
  857. function toPrimitive(input) {
  858. var val, valueOf, toString;
  859. if (isPrimitive(input)) {
  860. return input;
  861. }
  862. valueOf = input.valueOf;
  863. if (typeof valueOf === "function") {
  864. val = valueOf.call(input);
  865. if (isPrimitive(val)) {
  866. return val;
  867. }
  868. }
  869. toString = input.toString;
  870. if (typeof toString === "function") {
  871. val = toString.call(input);
  872. if (isPrimitive(val)) {
  873. return val;
  874. }
  875. }
  876. throw new TypeError();
  877. }
  878. var toObject = function (o) {
  879. if (o == null) { // this matches both null and undefined
  880. throw new TypeError("can't convert "+o+" to object");
  881. }
  882. return Object(o);
  883. };
  884. });
  885. ace.define("ace/lib/fixoldbrowsers",["require","exports","module","ace/lib/regexp","ace/lib/es5-shim"], function(require, exports, module) {
  886. "use strict";
  887. require("./regexp");
  888. require("./es5-shim");
  889. });
  890. ace.define("ace/lib/dom",["require","exports","module"], function(require, exports, module) {
  891. "use strict";
  892. var XHTML_NS = "http://www.w3.org/1999/xhtml";
  893. exports.getDocumentHead = function(doc) {
  894. if (!doc)
  895. doc = document;
  896. return doc.head || doc.getElementsByTagName("head")[0] || doc.documentElement;
  897. }
  898. exports.createElement = function(tag, ns) {
  899. return document.createElementNS ?
  900. document.createElementNS(ns || XHTML_NS, tag) :
  901. document.createElement(tag);
  902. };
  903. exports.hasCssClass = function(el, name) {
  904. var classes = (el.className || "").split(/\s+/g);
  905. return classes.indexOf(name) !== -1;
  906. };
  907. exports.addCssClass = function(el, name) {
  908. if (!exports.hasCssClass(el, name)) {
  909. el.className += " " + name;
  910. }
  911. };
  912. exports.removeCssClass = function(el, name) {
  913. var classes = el.className.split(/\s+/g);
  914. while (true) {
  915. var index = classes.indexOf(name);
  916. if (index == -1) {
  917. break;
  918. }
  919. classes.splice(index, 1);
  920. }
  921. el.className = classes.join(" ");
  922. };
  923. exports.toggleCssClass = function(el, name) {
  924. var classes = el.className.split(/\s+/g), add = true;
  925. while (true) {
  926. var index = classes.indexOf(name);
  927. if (index == -1) {
  928. break;
  929. }
  930. add = false;
  931. classes.splice(index, 1);
  932. }
  933. if(add)
  934. classes.push(name);
  935. el.className = classes.join(" ");
  936. return add;
  937. };
  938. exports.setCssClass = function(node, className, include) {
  939. if (include) {
  940. exports.addCssClass(node, className);
  941. } else {
  942. exports.removeCssClass(node, className);
  943. }
  944. };
  945. exports.hasCssString = function(id, doc) {
  946. var index = 0, sheets;
  947. doc = doc || document;
  948. if (doc.createStyleSheet && (sheets = doc.styleSheets)) {
  949. while (index < sheets.length)
  950. if (sheets[index++].owningElement.id === id) return true;
  951. } else if ((sheets = doc.getElementsByTagName("style"))) {
  952. while (index < sheets.length)
  953. if (sheets[index++].id === id) return true;
  954. }
  955. return false;
  956. };
  957. exports.importCssString = function importCssString(cssText, id, doc) {
  958. doc = doc || document;
  959. if (id && exports.hasCssString(id, doc))
  960. return null;
  961. var style;
  962. if (doc.createStyleSheet) {
  963. style = doc.createStyleSheet();
  964. style.cssText = cssText;
  965. if (id)
  966. style.owningElement.id = id;
  967. } else {
  968. style = doc.createElementNS
  969. ? doc.createElementNS(XHTML_NS, "style")
  970. : doc.createElement("style");
  971. style.appendChild(doc.createTextNode(cssText));
  972. if (id)
  973. style.id = id;
  974. exports.getDocumentHead(doc).appendChild(style);
  975. }
  976. };
  977. exports.importCssStylsheet = function(uri, doc) {
  978. if (doc.createStyleSheet) {
  979. doc.createStyleSheet(uri);
  980. } else {
  981. var link = exports.createElement('link');
  982. link.rel = 'stylesheet';
  983. link.href = uri;
  984. exports.getDocumentHead(doc).appendChild(link);
  985. }
  986. };
  987. exports.getInnerWidth = function(element) {
  988. return (
  989. parseInt(exports.computedStyle(element, "paddingLeft"), 10) +
  990. parseInt(exports.computedStyle(element, "paddingRight"), 10) +
  991. element.clientWidth
  992. );
  993. };
  994. exports.getInnerHeight = function(element) {
  995. return (
  996. parseInt(exports.computedStyle(element, "paddingTop"), 10) +
  997. parseInt(exports.computedStyle(element, "paddingBottom"), 10) +
  998. element.clientHeight
  999. );
  1000. };
  1001. if (typeof document == "undefined")
  1002. return;
  1003. if (window.pageYOffset !== undefined) {
  1004. exports.getPageScrollTop = function() {
  1005. return window.pageYOffset;
  1006. };
  1007. exports.getPageScrollLeft = function() {
  1008. return window.pageXOffset;
  1009. };
  1010. }
  1011. else {
  1012. exports.getPageScrollTop = function() {
  1013. return document.body.scrollTop;
  1014. };
  1015. exports.getPageScrollLeft = function() {
  1016. return document.body.scrollLeft;
  1017. };
  1018. }
  1019. if (window.getComputedStyle)
  1020. exports.computedStyle = function(element, style) {
  1021. if (style)
  1022. return (window.getComputedStyle(element, "") || {})[style] || "";
  1023. return window.getComputedStyle(element, "") || {};
  1024. };
  1025. else
  1026. exports.computedStyle = function(element, style) {
  1027. if (style)
  1028. return element.currentStyle[style];
  1029. return element.currentStyle;
  1030. };
  1031. exports.scrollbarWidth = function(document) {
  1032. var inner = exports.createElement("ace_inner");
  1033. inner.style.width = "100%";
  1034. inner.style.minWidth = "0px";
  1035. inner.style.height = "200px";
  1036. inner.style.display = "block";
  1037. var outer = exports.createElement("ace_outer");
  1038. var style = outer.style;
  1039. style.position = "absolute";
  1040. style.left = "-10000px";
  1041. style.overflow = "hidden";
  1042. style.width = "200px";
  1043. style.minWidth = "0px";
  1044. style.height = "150px";
  1045. style.display = "block";
  1046. outer.appendChild(inner);
  1047. var body = document.documentElement;
  1048. body.appendChild(outer);
  1049. var noScrollbar = inner.offsetWidth;
  1050. style.overflow = "scroll";
  1051. var withScrollbar = inner.offsetWidth;
  1052. if (noScrollbar == withScrollbar) {
  1053. withScrollbar = outer.clientWidth;
  1054. }
  1055. body.removeChild(outer);
  1056. return noScrollbar-withScrollbar;
  1057. };
  1058. exports.setInnerHtml = function(el, innerHtml) {
  1059. var element = el.cloneNode(false);//document.createElement("div");
  1060. element.innerHTML = innerHtml;
  1061. el.parentNode.replaceChild(element, el);
  1062. return element;
  1063. };
  1064. if ("textContent" in document.documentElement) {
  1065. exports.setInnerText = function(el, innerText) {
  1066. el.textContent = innerText;
  1067. };
  1068. exports.getInnerText = function(el) {
  1069. return el.textContent;
  1070. };
  1071. }
  1072. else {
  1073. exports.setInnerText = function(el, innerText) {
  1074. el.innerText = innerText;
  1075. };
  1076. exports.getInnerText = function(el) {
  1077. return el.innerText;
  1078. };
  1079. }
  1080. exports.getParentWindow = function(document) {
  1081. return document.defaultView || document.parentWindow;
  1082. };
  1083. });
  1084. ace.define("ace/lib/oop",["require","exports","module"], function(require, exports, module) {
  1085. "use strict";
  1086. exports.inherits = function(ctor, superCtor) {
  1087. ctor.super_ = superCtor;
  1088. ctor.prototype = Object.create(superCtor.prototype, {
  1089. constructor: {
  1090. value: ctor,
  1091. enumerable: false,
  1092. writable: true,
  1093. configurable: true
  1094. }
  1095. });
  1096. };
  1097. exports.mixin = function(obj, mixin) {
  1098. for (var key in mixin) {
  1099. obj[key] = mixin[key];
  1100. }
  1101. return obj;
  1102. };
  1103. exports.implement = function(proto, mixin) {
  1104. exports.mixin(proto, mixin);
  1105. };
  1106. });
  1107. ace.define("ace/lib/keys",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/oop"], function(require, exports, module) {
  1108. "use strict";
  1109. require("./fixoldbrowsers");
  1110. var oop = require("./oop");
  1111. var Keys = (function() {
  1112. var ret = {
  1113. MODIFIER_KEYS: {
  1114. 16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta'
  1115. },
  1116. KEY_MODS: {
  1117. "ctrl": 1, "alt": 2, "option" : 2, "shift": 4,
  1118. "super": 8, "meta": 8, "command": 8, "cmd": 8
  1119. },
  1120. FUNCTION_KEYS : {
  1121. 8 : "Backspace",
  1122. 9 : "Tab",
  1123. 13 : "Return",
  1124. 19 : "Pause",
  1125. 27 : "Esc",
  1126. 32 : "Space",
  1127. 33 : "PageUp",
  1128. 34 : "PageDown",
  1129. 35 : "End",
  1130. 36 : "Home",
  1131. 37 : "Left",
  1132. 38 : "Up",
  1133. 39 : "Right",
  1134. 40 : "Down",
  1135. 44 : "Print",
  1136. 45 : "Insert",
  1137. 46 : "Delete",
  1138. 96 : "Numpad0",
  1139. 97 : "Numpad1",
  1140. 98 : "Numpad2",
  1141. 99 : "Numpad3",
  1142. 100: "Numpad4",
  1143. 101: "Numpad5",
  1144. 102: "Numpad6",
  1145. 103: "Numpad7",
  1146. 104: "Numpad8",
  1147. 105: "Numpad9",
  1148. '-13': "NumpadEnter",
  1149. 112: "F1",
  1150. 113: "F2",
  1151. 114: "F3",
  1152. 115: "F4",
  1153. 116: "F5",
  1154. 117: "F6",
  1155. 118: "F7",
  1156. 119: "F8",
  1157. 120: "F9",
  1158. 121: "F10",
  1159. 122: "F11",
  1160. 123: "F12",
  1161. 144: "Numlock",
  1162. 145: "Scrolllock"
  1163. },
  1164. PRINTABLE_KEYS: {
  1165. 32: ' ', 48: '0', 49: '1', 50: '2', 51: '3', 52: '4', 53: '5',
  1166. 54: '6', 55: '7', 56: '8', 57: '9', 59: ';', 61: '=', 65: 'a',
  1167. 66: 'b', 67: 'c', 68: 'd', 69: 'e', 70: 'f', 71: 'g', 72: 'h',
  1168. 73: 'i', 74: 'j', 75: 'k', 76: 'l', 77: 'm', 78: 'n', 79: 'o',
  1169. 80: 'p', 81: 'q', 82: 'r', 83: 's', 84: 't', 85: 'u', 86: 'v',
  1170. 87: 'w', 88: 'x', 89: 'y', 90: 'z', 107: '+', 109: '-', 110: '.',
  1171. 186: ';', 187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`',
  1172. 219: '[', 220: '\\',221: ']', 222: '\''
  1173. }
  1174. };
  1175. var name, i;
  1176. for (i in ret.FUNCTION_KEYS) {
  1177. name = ret.FUNCTION_KEYS[i].toLowerCase();
  1178. ret[name] = parseInt(i, 10);
  1179. }
  1180. for (i in ret.PRINTABLE_KEYS) {
  1181. name = ret.PRINTABLE_KEYS[i].toLowerCase();
  1182. ret[name] = parseInt(i, 10);
  1183. }
  1184. oop.mixin(ret, ret.MODIFIER_KEYS);
  1185. oop.mixin(ret, ret.PRINTABLE_KEYS);
  1186. oop.mixin(ret, ret.FUNCTION_KEYS);
  1187. ret.enter = ret["return"];
  1188. ret.escape = ret.esc;
  1189. ret.del = ret["delete"];
  1190. ret[173] = '-';
  1191. (function() {
  1192. var mods = ["cmd", "ctrl", "alt", "shift"];
  1193. for (var i = Math.pow(2, mods.length); i--;) {
  1194. ret.KEY_MODS[i] = mods.filter(function(x) {
  1195. return i & ret.KEY_MODS[x];
  1196. }).join("-") + "-";
  1197. }
  1198. })();
  1199. ret.KEY_MODS[0] = "";
  1200. ret.KEY_MODS[-1] = "input-";
  1201. return ret;
  1202. })();
  1203. oop.mixin(exports, Keys);
  1204. exports.keyCodeToString = function(keyCode) {
  1205. var keyString = Keys[keyCode];
  1206. if (typeof keyString != "string")
  1207. keyString = String.fromCharCode(keyCode);
  1208. return keyString.toLowerCase();
  1209. };
  1210. });
  1211. ace.define("ace/lib/useragent",["require","exports","module"], function(require, exports, module) {
  1212. "use strict";
  1213. exports.OS = {
  1214. LINUX: "LINUX",
  1215. MAC: "MAC",
  1216. WINDOWS: "WINDOWS"
  1217. };
  1218. exports.getOS = function() {
  1219. if (exports.isMac) {
  1220. return exports.OS.MAC;
  1221. } else if (exports.isLinux) {
  1222. return exports.OS.LINUX;
  1223. } else {
  1224. return exports.OS.WINDOWS;
  1225. }
  1226. };
  1227. if (typeof navigator != "object")
  1228. return;
  1229. var os = (navigator.platform.match(/mac|win|linux/i) || ["other"])[0].toLowerCase();
  1230. var ua = navigator.userAgent;
  1231. exports.isWin = (os == "win");
  1232. exports.isMac = (os == "mac");
  1233. exports.isLinux = (os == "linux");
  1234. exports.isIE =
  1235. (navigator.appName == "Microsoft Internet Explorer" || navigator.appName.indexOf("MSAppHost") >= 0)
  1236. ? parseFloat((ua.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1])
  1237. : parseFloat((ua.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]); // for ie
  1238. exports.isOldIE = exports.isIE && exports.isIE < 9;
  1239. exports.isGecko = exports.isMozilla = (window.Controllers || window.controllers) && window.navigator.product === "Gecko";
  1240. exports.isOldGecko = exports.isGecko && parseInt((ua.match(/rv\:(\d+)/)||[])[1], 10) < 4;
  1241. exports.isOpera = window.opera && Object.prototype.toString.call(window.opera) == "[object Opera]";
  1242. exports.isWebKit = parseFloat(ua.split("WebKit/")[1]) || undefined;
  1243. exports.isChrome = parseFloat(ua.split(" Chrome/")[1]) || undefined;
  1244. exports.isAIR = ua.indexOf("AdobeAIR") >= 0;
  1245. exports.isIPad = ua.indexOf("iPad") >= 0;
  1246. exports.isTouchPad = ua.indexOf("TouchPad") >= 0;
  1247. exports.isChromeOS = ua.indexOf(" CrOS ") >= 0;
  1248. });
  1249. ace.define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent"], function(require, exports, module) {
  1250. "use strict";
  1251. var keys = require("./keys");
  1252. var useragent = require("./useragent");
  1253. exports.addListener = function(elem, type, callback) {
  1254. if (elem.addEventListener) {
  1255. return elem.addEventListener(type, callback, false);
  1256. }
  1257. if (elem.attachEvent) {
  1258. var wrapper = function() {
  1259. callback.call(elem, window.event);
  1260. };
  1261. callback._wrapper = wrapper;
  1262. elem.attachEvent("on" + type, wrapper);
  1263. }
  1264. };
  1265. exports.removeListener = function(elem, type, callback) {
  1266. if (elem.removeEventListener) {
  1267. return elem.removeEventListener(type, callback, false);
  1268. }
  1269. if (elem.detachEvent) {
  1270. elem.detachEvent("on" + type, callback._wrapper || callback);
  1271. }
  1272. };
  1273. exports.stopEvent = function(e) {
  1274. exports.stopPropagation(e);
  1275. exports.preventDefault(e);
  1276. return false;
  1277. };
  1278. exports.stopPropagation = function(e) {
  1279. if (e.stopPropagation)
  1280. e.stopPropagation();
  1281. else
  1282. e.cancelBubble = true;
  1283. };
  1284. exports.preventDefault = function(e) {
  1285. if (e.preventDefault)
  1286. e.preventDefault();
  1287. else
  1288. e.returnValue = false;
  1289. };
  1290. exports.getButton = function(e) {
  1291. if (e.type == "dblclick")
  1292. return 0;
  1293. if (e.type == "contextmenu" || (useragent.isMac && (e.ctrlKey && !e.altKey && !e.shiftKey)))
  1294. return 2;
  1295. if (e.preventDefault) {
  1296. return e.button;
  1297. }
  1298. else {
  1299. return {1:0, 2:2, 4:1}[e.button];
  1300. }
  1301. };
  1302. exports.capture = function(el, eventHandler, releaseCaptureHandler) {
  1303. function onMouseUp(e) {
  1304. eventHandler && eventHandler(e);
  1305. releaseCaptureHandler && releaseCaptureHandler(e);
  1306. exports.removeListener(document, "mousemove", eventHandler, true);
  1307. exports.removeListener(document, "mouseup", onMouseUp, true);
  1308. exports.removeListener(document, "dragstart", onMouseUp, true);
  1309. }
  1310. exports.addListener(document, "mousemove", eventHandler, true);
  1311. exports.addListener(document, "mouseup", onMouseUp, true);
  1312. exports.addListener(document, "dragstart", onMouseUp, true);
  1313. return onMouseUp;
  1314. };
  1315. exports.addMouseWheelListener = function(el, callback) {
  1316. if ("onmousewheel" in el) {
  1317. exports.addListener(el, "mousewheel", function(e) {
  1318. var factor = 8;
  1319. if (e.wheelDeltaX !== undefined) {
  1320. e.wheelX = -e.wheelDeltaX / factor;
  1321. e.wheelY = -e.wheelDeltaY / factor;
  1322. } else {
  1323. e.wheelX = 0;
  1324. e.wheelY = -e.wheelDelta / factor;
  1325. }
  1326. callback(e);
  1327. });
  1328. } else if ("onwheel" in el) {
  1329. exports.addListener(el, "wheel", function(e) {
  1330. var factor = 0.35;
  1331. switch (e.deltaMode) {
  1332. case e.DOM_DELTA_PIXEL:
  1333. e.wheelX = e.deltaX * factor || 0;
  1334. e.wheelY = e.deltaY * factor || 0;
  1335. break;
  1336. case e.DOM_DELTA_LINE:
  1337. case e.DOM_DELTA_PAGE:
  1338. e.wheelX = (e.deltaX || 0) * 5;
  1339. e.wheelY = (e.deltaY || 0) * 5;
  1340. break;
  1341. }
  1342. callback(e);
  1343. });
  1344. } else {
  1345. exports.addListener(el, "DOMMouseScroll", function(e) {
  1346. if (e.axis && e.axis == e.HORIZONTAL_AXIS) {
  1347. e.wheelX = (e.detail || 0) * 5;
  1348. e.wheelY = 0;
  1349. } else {
  1350. e.wheelX = 0;
  1351. e.wheelY = (e.detail || 0) * 5;
  1352. }
  1353. callback(e);
  1354. });
  1355. }
  1356. };
  1357. exports.addMultiMouseDownListener = function(el, timeouts, eventHandler, callbackName) {
  1358. var clicks = 0;
  1359. var startX, startY, timer;
  1360. var eventNames = {
  1361. 2: "dblclick",
  1362. 3: "tripleclick",
  1363. 4: "quadclick"
  1364. };
  1365. exports.addListener(el, "mousedown", function(e) {
  1366. if (exports.getButton(e) !== 0) {
  1367. clicks = 0;
  1368. } else if (e.detail > 1) {
  1369. clicks++;
  1370. if (clicks > 4)
  1371. clicks = 1;
  1372. } else {
  1373. clicks = 1;
  1374. }
  1375. if (useragent.isIE) {
  1376. var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5;
  1377. if (!timer || isNewClick)
  1378. clicks = 1;
  1379. if (timer)
  1380. clearTimeout(timer);
  1381. timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600);
  1382. if (clicks == 1) {
  1383. startX = e.clientX;
  1384. startY = e.clientY;
  1385. }
  1386. }
  1387. e._clicks = clicks;
  1388. eventHandler[callbackName]("mousedown", e);
  1389. if (clicks > 4)
  1390. clicks = 0;
  1391. else if (clicks > 1)
  1392. return eventHandler[callbackName](eventNames[clicks], e);
  1393. });
  1394. if (useragent.isOldIE) {
  1395. exports.addListener(el, "dblclick", function(e) {
  1396. clicks = 2;
  1397. if (timer)
  1398. clearTimeout(timer);
  1399. timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600);
  1400. eventHandler[callbackName]("mousedown", e);
  1401. eventHandler[callbackName](eventNames[clicks], e);
  1402. });
  1403. }
  1404. };
  1405. var getModifierHash = useragent.isMac && useragent.isOpera && !("KeyboardEvent" in window)
  1406. ? function(e) {
  1407. return 0 | (e.metaKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.ctrlKey ? 8 : 0);
  1408. }
  1409. : function(e) {
  1410. return 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0);
  1411. };
  1412. exports.getModifierString = function(e) {
  1413. return keys.KEY_MODS[getModifierHash(e)];
  1414. };
  1415. function normalizeCommandKeys(callback, e, keyCode) {
  1416. var hashId = getModifierHash(e);
  1417. if (!useragent.isMac && pressedKeys) {
  1418. if (pressedKeys[91] || pressedKeys[92])
  1419. hashId |= 8;
  1420. if (pressedKeys.altGr) {
  1421. if ((3 & hashId) != 3)
  1422. pressedKeys.altGr = 0;
  1423. else
  1424. return;
  1425. }
  1426. if (keyCode === 18 || keyCode === 17) {
  1427. var location = "location" in e ? e.location : e.keyLocation;
  1428. if (keyCode === 17 && location === 1) {
  1429. if (pressedKeys[keyCode] == 1)
  1430. ts = e.timeStamp;
  1431. } else if (keyCode === 18 && hashId === 3 && location === 2) {
  1432. var dt = e.timestamp - ts;
  1433. if (dt < 50)
  1434. pressedKeys.altGr = true;
  1435. }
  1436. }
  1437. }
  1438. if (keyCode in keys.MODIFIER_KEYS) {
  1439. keyCode = -1;
  1440. }
  1441. if (hashId & 8 && (keyCode === 91 || keyCode === 93)) {
  1442. keyCode = -1;
  1443. }
  1444. if (!hashId && keyCode === 13) {
  1445. var location = "location" in e ? e.location : e.keyLocation;
  1446. if (location === 3) {
  1447. callback(e, hashId, -keyCode);
  1448. if (e.defaultPrevented)
  1449. return;
  1450. }
  1451. }
  1452. if (useragent.isChromeOS && hashId & 8) {
  1453. callback(e, hashId, keyCode);
  1454. if (e.defaultPrevented)
  1455. return;
  1456. else
  1457. hashId &= ~8;
  1458. }
  1459. if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) {
  1460. return false;
  1461. }
  1462. return callback(e, hashId, keyCode);
  1463. }
  1464. var pressedKeys = null;
  1465. var ts = 0;
  1466. exports.addCommandKeyListener = function(el, callback) {
  1467. var addListener = exports.addListener;
  1468. if (useragent.isOldGecko || (useragent.isOpera && !("KeyboardEvent" in window))) {
  1469. var lastKeyDownKeyCode = null;
  1470. addListener(el, "keydown", function(e) {
  1471. lastKeyDownKeyCode = e.keyCode;
  1472. });
  1473. addListener(el, "keypress", function(e) {
  1474. return normalizeCommandKeys(callback, e, lastKeyDownKeyCode);
  1475. });
  1476. } else {
  1477. var lastDefaultPrevented = null;
  1478. addListener(el, "keydown", function(e) {
  1479. pressedKeys[e.keyCode] = (pressedKeys[e.keyCode] || 0) + 1;
  1480. var result = normalizeCommandKeys(callback, e, e.keyCode);
  1481. lastDefaultPrevented = e.defaultPrevented;
  1482. return result;
  1483. });
  1484. addListener(el, "keypress", function(e) {
  1485. if (lastDefaultPrevented && (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey)) {
  1486. exports.stopEvent(e);
  1487. lastDefaultPrevented = null;
  1488. }
  1489. });
  1490. addListener(el, "keyup", function(e) {
  1491. pressedKeys[e.keyCode] = null;
  1492. });
  1493. if (!pressedKeys) {
  1494. pressedKeys = Object.create(null);
  1495. addListener(window, "focus", function(e) {
  1496. pressedKeys = Object.create(null);
  1497. });
  1498. }
  1499. }
  1500. };
  1501. if (window.postMessage && !useragent.isOldIE) {
  1502. var postMessageId = 1;
  1503. exports.nextTick = function(callback, win) {
  1504. win = win || window;
  1505. var messageName = "zero-timeout-message-" + postMessageId;
  1506. exports.addListener(win, "message", function listener(e) {
  1507. if (e.data == messageName) {
  1508. exports.stopPropagation(e);
  1509. exports.removeListener(win, "message", listener);
  1510. callback();
  1511. }
  1512. });
  1513. win.postMessage(messageName, "*");
  1514. };
  1515. }
  1516. exports.nextFrame = window.requestAnimationFrame ||
  1517. window.mozRequestAnimationFrame ||
  1518. window.webkitRequestAnimationFrame ||
  1519. window.msRequestAnimationFrame ||
  1520. window.oRequestAnimationFrame;
  1521. if (exports.nextFrame)
  1522. exports.nextFrame = exports.nextFrame.bind(window);
  1523. else
  1524. exports.nextFrame = function(callback) {
  1525. setTimeout(callback, 17);
  1526. };
  1527. });
  1528. ace.define("ace/lib/lang",["require","exports","module"], function(require, exports, module) {
  1529. "use strict";
  1530. exports.last = function(a) {
  1531. return a[a.length - 1];
  1532. };
  1533. exports.stringReverse = function(string) {
  1534. return string.split("").reverse().join("");
  1535. };
  1536. exports.stringRepeat = function (string, count) {
  1537. var result = '';
  1538. while (count > 0) {
  1539. if (count & 1)
  1540. result += string;
  1541. if (count >>= 1)
  1542. string += string;
  1543. }
  1544. return result;
  1545. };
  1546. var trimBeginRegexp = /^\s\s*/;
  1547. var trimEndRegexp = /\s\s*$/;
  1548. exports.stringTrimLeft = function (string) {
  1549. return string.replace(trimBeginRegexp, '');
  1550. };
  1551. exports.stringTrimRight = function (string) {
  1552. return string.replace(trimEndRegexp, '');
  1553. };
  1554. exports.copyObject = function(obj) {
  1555. var copy = {};
  1556. for (var key in obj) {
  1557. copy[key] = obj[key];
  1558. }
  1559. return copy;
  1560. };
  1561. exports.copyArray = function(array){
  1562. var copy = [];
  1563. for (var i=0, l=array.length; i<l; i++) {
  1564. if (array[i] && typeof array[i] == "object")
  1565. copy[i] = this.copyObject( array[i] );
  1566. else
  1567. copy[i] = array[i];
  1568. }
  1569. return copy;
  1570. };
  1571. exports.deepCopy = function (obj) {
  1572. if (typeof obj !== "object" || !obj)
  1573. return obj;
  1574. var cons = obj.constructor;
  1575. if (cons === RegExp)
  1576. return obj;
  1577. var copy = cons();
  1578. for (var key in obj) {
  1579. if (typeof obj[key] === "object") {
  1580. copy[key] = exports.deepCopy(obj[key]);
  1581. } else {
  1582. copy[key] = obj[key];
  1583. }
  1584. }
  1585. return copy;
  1586. };
  1587. exports.arrayToMap = function(arr) {
  1588. var map = {};
  1589. for (var i=0; i<arr.length; i++) {
  1590. map[arr[i]] = 1;
  1591. }
  1592. return map;
  1593. };
  1594. exports.createMap = function(props) {
  1595. var map = Object.create(null);
  1596. for (var i in props) {
  1597. map[i] = props[i];
  1598. }
  1599. return map;
  1600. };
  1601. exports.arrayRemove = function(array, value) {
  1602. for (var i = 0; i <= array.length; i++) {
  1603. if (value === array[i]) {
  1604. array.splice(i, 1);
  1605. }
  1606. }
  1607. };
  1608. exports.escapeRegExp = function(str) {
  1609. return str.replace(/([.*+?^${}()|[\]\/\\])/g, '\\$1');
  1610. };
  1611. exports.escapeHTML = function(str) {
  1612. return str.replace(/&/g, "&#38;").replace(/"/g, "&#34;").replace(/'/g, "&#39;").replace(/</g, "&#60;");
  1613. };
  1614. exports.getMatchOffsets = function(string, regExp) {
  1615. var matches = [];
  1616. string.replace(regExp, function(str) {
  1617. matches.push({
  1618. offset: arguments[arguments.length-2],
  1619. length: str.length
  1620. });
  1621. });
  1622. return matches;
  1623. };
  1624. exports.deferredCall = function(fcn) {
  1625. var timer = null;
  1626. var callback = function() {
  1627. timer = null;
  1628. fcn();
  1629. };
  1630. var deferred = function(timeout) {
  1631. deferred.cancel();
  1632. timer = setTimeout(callback, timeout || 0);
  1633. return deferred;
  1634. };
  1635. deferred.schedule = deferred;
  1636. deferred.call = function() {
  1637. this.cancel();
  1638. fcn();
  1639. return deferred;
  1640. };
  1641. deferred.cancel = function() {
  1642. clearTimeout(timer);
  1643. timer = null;
  1644. return deferred;
  1645. };
  1646. deferred.isPending = function() {
  1647. return timer;
  1648. };
  1649. return deferred;
  1650. };
  1651. exports.delayedCall = function(fcn, defaultTimeout) {
  1652. var timer = null;
  1653. var callback = function() {
  1654. timer = null;
  1655. fcn();
  1656. };
  1657. var _self = function(timeout) {
  1658. if (timer == null)
  1659. timer = setTimeout(callback, timeout || defaultTimeout);
  1660. };
  1661. _self.delay = function(timeout) {
  1662. timer && clearTimeout(timer);
  1663. timer = setTimeout(callback, timeout || defaultTimeout);
  1664. };
  1665. _self.schedule = _self;
  1666. _self.call = function() {
  1667. this.cancel();
  1668. fcn();
  1669. };
  1670. _self.cancel = function() {
  1671. timer && clearTimeout(timer);
  1672. timer = null;
  1673. };
  1674. _self.isPending = function() {
  1675. return timer;
  1676. };
  1677. return _self;
  1678. };
  1679. });
  1680. ace.define("ace/keyboard/textinput",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/dom","ace/lib/lang"], function(require, exports, module) {
  1681. "use strict";
  1682. var event = require("../lib/event");
  1683. var useragent = require("../lib/useragent");
  1684. var dom = require("../lib/dom");
  1685. var lang = require("../lib/lang");
  1686. var BROKEN_SETDATA = useragent.isChrome < 18;
  1687. var USE_IE_MIME_TYPE = useragent.isIE;
  1688. var TextInput = function(parentNode, host) {
  1689. var text = dom.createElement("textarea");
  1690. text.className = "ace_text-input";
  1691. if (useragent.isTouchPad)
  1692. text.setAttribute("x-palm-disable-auto-cap", true);
  1693. text.setAttribute("wrap", "off");
  1694. text.setAttribute("autocorrect", "off");
  1695. text.setAttribute("autocapitalize", "off");
  1696. text.setAttribute("spellcheck", false);
  1697. text.style.opacity = "0";
  1698. if (useragent.isOldIE) text.style.top = "-1000px";
  1699. parentNode.insertBefore(text, parentNode.firstChild);
  1700. var PLACEHOLDER = "\x01\x01";
  1701. var copied = false;
  1702. var pasted = false;
  1703. var inComposition = false;
  1704. var tempStyle = '';
  1705. var isSelectionEmpty = true;
  1706. try { var isFocused = document.activeElement === text; } catch(e) {}
  1707. event.addListener(text, "blur", function(e) {
  1708. host.onBlur(e);
  1709. isFocused = false;
  1710. });
  1711. event.addListener(text, "focus", function(e) {
  1712. isFocused = true;
  1713. host.onFocus(e);
  1714. resetSelection();
  1715. });
  1716. this.focus = function() {
  1717. if (tempStyle) return text.focus();
  1718. text.style.position = "fixed";
  1719. text.style.top = "-1000px";
  1720. text.focus();
  1721. setTimeout(function() {
  1722. text.style.position = "";
  1723. }, 0);
  1724. };
  1725. this.blur = function() { text.blur(); };
  1726. this.isFocused = function() {
  1727. return isFocused;
  1728. };
  1729. var syncSelection = lang.delayedCall(function() {
  1730. isFocused && resetSelection(isSelectionEmpty);
  1731. });
  1732. var syncValue = lang.delayedCall(function() {
  1733. if (!inComposition) {
  1734. text.value = PLACEHOLDER;
  1735. isFocused && resetSelection();
  1736. }
  1737. });
  1738. function resetSelection(isEmpty) {
  1739. if (inComposition)
  1740. return;
  1741. inComposition = true;
  1742. if (inputHandler) {
  1743. selectionStart = 0;
  1744. selectionEnd = isEmpty ? 0 : text.value.length - 1;
  1745. } else {
  1746. var selectionStart = isEmpty ? 2 : 1;
  1747. var selectionEnd = 2;
  1748. }
  1749. try {
  1750. text.setSelectionRange(selectionStart, selectionEnd);
  1751. } catch(e){}
  1752. inComposition = false;
  1753. }
  1754. function resetValue() {
  1755. if (inComposition)
  1756. return;
  1757. text.value = PLACEHOLDER;
  1758. if (useragent.isWebKit)
  1759. syncValue.schedule();
  1760. }
  1761. useragent.isWebKit || host.addEventListener('changeSelection', function() {
  1762. if (host.selection.isEmpty() != isSelectionEmpty) {
  1763. isSelectionEmpty = !isSelectionEmpty;
  1764. syncSelection.schedule();
  1765. }
  1766. });
  1767. resetValue();
  1768. if (isFocused)
  1769. host.onFocus();
  1770. var isAllSelected = function(text) {
  1771. return text.selectionStart === 0 && text.selectionEnd === text.value.length;
  1772. };
  1773. if (!text.setSelectionRange && text.createTextRange) {
  1774. text.setSelectionRange = function(selectionStart, selectionEnd) {
  1775. var range = this.createTextRange();
  1776. range.collapse(true);
  1777. range.moveStart('character', selectionStart);
  1778. range.moveEnd('character', selectionEnd);
  1779. range.select();
  1780. };
  1781. isAllSelected = function(text) {
  1782. try {
  1783. var range = text.ownerDocument.selection.createRange();
  1784. }catch(e) {}
  1785. if (!range || range.parentElement() != text) return false;
  1786. return range.text == text.value;
  1787. }
  1788. }
  1789. if (useragent.isOldIE) {
  1790. var inPropertyChange = false;
  1791. var onPropertyChange = function(e){
  1792. if (inPropertyChange)
  1793. return;
  1794. var data = text.value;
  1795. if (inComposition || !data || data == PLACEHOLDER)
  1796. return;
  1797. if (e && data == PLACEHOLDER[0])
  1798. return syncProperty.schedule();
  1799. sendText(data);
  1800. inPropertyChange = true;
  1801. resetValue();
  1802. inPropertyChange = false;
  1803. };
  1804. var syncProperty = lang.delayedCall(onPropertyChange);
  1805. event.addListener(text, "propertychange", onPropertyChange);
  1806. var keytable = { 13:1, 27:1 };
  1807. event.addListener(text, "keyup", function (e) {
  1808. if (inComposition && (!text.value || keytable[e.keyCode]))
  1809. setTimeout(onCompositionEnd, 0);
  1810. if ((text.value.charCodeAt(0)||0) < 129) {
  1811. return syncProperty.call();
  1812. }
  1813. inComposition ? onCompositionUpdate() : onCompositionStart();
  1814. });
  1815. event.addListener(text, "keydown", function (e) {
  1816. syncProperty.schedule(50);
  1817. });
  1818. }
  1819. var onSelect = function(e) {
  1820. if (copied) {
  1821. copied = false;
  1822. } else if (isAllSelected(text)) {
  1823. host.selectAll();
  1824. resetSelection();
  1825. } else if (inputHandler) {
  1826. resetSelection(host.selection.isEmpty());
  1827. }
  1828. };
  1829. var inputHandler = null;
  1830. this.setInputHandler = function(cb) {inputHandler = cb};
  1831. this.getInputHandler = function() {return inputHandler};
  1832. var afterContextMenu = false;
  1833. var sendText = function(data) {
  1834. if (inputHandler) {
  1835. data = inputHandler(data);
  1836. inputHandler = null;
  1837. }
  1838. if (pasted) {
  1839. resetSelection();
  1840. if (data)
  1841. host.onPaste(data);
  1842. pasted = false;
  1843. } else if (data == PLACEHOLDER.charAt(0)) {
  1844. if (afterContextMenu)
  1845. host.execCommand("del", {source: "ace"});
  1846. else // some versions of android do not fire keydown when pressing backspace
  1847. host.execCommand("backspace", {source: "ace"});
  1848. } else {
  1849. if (data.substring(0, 2) == PLACEHOLDER)
  1850. data = data.substr(2);
  1851. else if (data.charAt(0) == PLACEHOLDER.charAt(0))
  1852. data = data.substr(1);
  1853. else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))
  1854. data = data.slice(0, -1);
  1855. if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))
  1856. data = data.slice(0, -1);
  1857. if (data)
  1858. host.onTextInput(data);
  1859. }
  1860. if (afterContextMenu)
  1861. afterContextMenu = false;
  1862. };
  1863. var onInput = function(e) {
  1864. if (inComposition)
  1865. return;
  1866. var data = text.value;
  1867. sendText(data);
  1868. resetValue();
  1869. };
  1870. var handleClipboardData = function(e, data) {
  1871. var clipboardData = e.clipboardData || window.clipboardData;
  1872. if (!clipboardData || BROKEN_SETDATA)
  1873. return;
  1874. var mime = USE_IE_MIME_TYPE ? "Text" : "text/plain";
  1875. if (data) {
  1876. return clipboardData.setData(mime, data) !== false;
  1877. } else {
  1878. return clipboardData.getData(mime);
  1879. }
  1880. };
  1881. var doCopy = function(e, isCut) {
  1882. var data = host.getCopyText();
  1883. if (!data)
  1884. return event.preventDefault(e);
  1885. if (handleClipboardData(e, data)) {
  1886. isCut ? host.onCut() : host.onCopy();
  1887. event.preventDefault(e);
  1888. } else {
  1889. copied = true;
  1890. text.value = data;
  1891. text.select();
  1892. setTimeout(function(){
  1893. copied = false;
  1894. resetValue();
  1895. resetSelection();
  1896. isCut ? host.onCut() : host.onCopy();
  1897. });
  1898. }
  1899. };
  1900. var onCut = function(e) {
  1901. doCopy(e, true);
  1902. };
  1903. var onCopy = function(e) {
  1904. doCopy(e, false);
  1905. };
  1906. var onPaste = function(e) {
  1907. var data = handleClipboardData(e);
  1908. if (typeof data == "string") {
  1909. if (data)
  1910. host.onPaste(data);
  1911. if (useragent.isIE)
  1912. setTimeout(resetSelection);
  1913. event.preventDefault(e);
  1914. }
  1915. else {
  1916. text.value = "";
  1917. pasted = true;
  1918. }
  1919. };
  1920. event.addCommandKeyListener(text, host.onCommandKey.bind(host));
  1921. event.addListener(text, "select", onSelect);
  1922. event.addListener(text, "input", onInput);
  1923. event.addListener(text, "cut", onCut);
  1924. event.addListener(text, "copy", onCopy);
  1925. event.addListener(text, "paste", onPaste);
  1926. if (!('oncut' in text) || !('oncopy' in text) || !('onpaste' in text)){
  1927. event.addListener(parentNode, "keydown", function(e) {
  1928. if ((useragent.isMac && !e.metaKey) || !e.ctrlKey)
  1929. return;
  1930. switch (e.keyCode) {
  1931. case 67:
  1932. onCopy(e);
  1933. break;
  1934. case 86:
  1935. onPaste(e);
  1936. break;
  1937. case 88:
  1938. onCut(e);
  1939. break;
  1940. }
  1941. });
  1942. }
  1943. var onCompositionStart = function(e) {
  1944. if (inComposition || !host.onCompositionStart || host.$readOnly)
  1945. return;
  1946. inComposition = {};
  1947. host.onCompositionStart();
  1948. setTimeout(onCompositionUpdate, 0);
  1949. host.on("mousedown", onCompositionEnd);
  1950. if (!host.selection.isEmpty()) {
  1951. host.insert("");
  1952. host.session.markUndoGroup();
  1953. host.selection.clearSelection();
  1954. }
  1955. host.session.markUndoGroup();
  1956. };
  1957. var onCompositionUpdate = function() {
  1958. if (!inComposition || !host.onCompositionUpdate || host.$readOnly)
  1959. return;
  1960. var val = text.value.replace(/\x01/g, "");
  1961. if (inComposition.lastValue === val) return;
  1962. host.onCompositionUpdate(val);
  1963. if (inComposition.lastValue)
  1964. host.undo();
  1965. inComposition.lastValue = val;
  1966. if (inComposition.lastValue) {
  1967. var r = host.selection.getRange();
  1968. host.insert(inComposition.lastValue);
  1969. host.session.markUndoGroup();
  1970. inComposition.range = host.selection.getRange();
  1971. host.selection.setRange(r);
  1972. host.selection.clearSelection();
  1973. }
  1974. };
  1975. var onCompositionEnd = function(e) {
  1976. if (!host.onCompositionEnd || host.$readOnly) return;
  1977. var c = inComposition;
  1978. inComposition = false;
  1979. var timer = setTimeout(function() {
  1980. timer = null;
  1981. var str = text.value.replace(/\x01/g, "");
  1982. if (inComposition)
  1983. return;
  1984. else if (str == c.lastValue)
  1985. resetValue();
  1986. else if (!c.lastValue && str) {
  1987. resetValue();
  1988. sendText(str);
  1989. }
  1990. });
  1991. inputHandler = function compositionInputHandler(str) {
  1992. if (timer)
  1993. clearTimeout(timer);
  1994. str = str.replace(/\x01/g, "");
  1995. if (str == c.lastValue)
  1996. return "";
  1997. if (c.lastValue && timer)
  1998. host.undo();
  1999. return str;
  2000. };
  2001. host.onCompositionEnd();
  2002. host.removeListener("mousedown", onCompositionEnd);
  2003. if (e.type == "compositionend" && c.range) {
  2004. host.selection.setRange(c.range);
  2005. }
  2006. };
  2007. var syncComposition = lang.delayedCall(onCompositionUpdate, 50);
  2008. event.addListener(text, "compositionstart", onCompositionStart);
  2009. if (useragent.isGecko) {
  2010. event.addListener(text, "text", function(){syncComposition.schedule()});
  2011. } else {
  2012. event.addListener(text, "keyup", function(){syncComposition.schedule()});
  2013. event.addListener(text, "keydown", function(){syncComposition.schedule()});
  2014. }
  2015. event.addListener(text, "compositionend", onCompositionEnd);
  2016. this.getElement = function() {
  2017. return text;
  2018. };
  2019. this.setReadOnly = function(readOnly) {
  2020. text.readOnly = readOnly;
  2021. };
  2022. this.onContextMenu = function(e) {
  2023. afterContextMenu = true;
  2024. resetSelection(host.selection.isEmpty());
  2025. host._emit("nativecontextmenu", {target: host, domEvent: e});
  2026. this.moveToMouse(e, true);
  2027. };
  2028. this.moveToMouse = function(e, bringToFront) {
  2029. if (!bringToFront && useragent.isOldIE)
  2030. return;
  2031. if (!tempStyle)
  2032. tempStyle = text.style.cssText;
  2033. text.style.cssText = (bringToFront ? "z-index:100000;" : "")
  2034. + "height:" + text.style.height + ";"
  2035. + (useragent.isIE ? "opacity:0.1;" : "");
  2036. var rect = host.container.getBoundingClientRect();
  2037. var style = dom.computedStyle(host.container);
  2038. var top = rect.top + (parseInt(style.borderTopWidth) || 0);
  2039. var left = rect.left + (parseInt(rect.borderLeftWidth) || 0);
  2040. var maxTop = rect.bottom - top - text.clientHeight -2;
  2041. var move = function(e) {
  2042. text.style.left = e.clientX - left - 2 + "px";
  2043. text.style.top = Math.min(e.clientY - top - 2, maxTop) + "px";
  2044. };
  2045. move(e);
  2046. if (e.type != "mousedown")
  2047. return;
  2048. if (host.renderer.$keepTextAreaAtCursor)
  2049. host.renderer.$keepTextAreaAtCursor = null;
  2050. if (useragent.isWin && !useragent.isOldIE)
  2051. event.capture(host.container, move, onContextMenuClose);
  2052. };
  2053. this.onContextMenuClose = onContextMenuClose;
  2054. var closeTimeout;
  2055. function onContextMenuClose() {
  2056. clearTimeout(closeTimeout)
  2057. closeTimeout = setTimeout(function () {
  2058. if (tempStyle) {
  2059. text.style.cssText = tempStyle;
  2060. tempStyle = '';
  2061. }
  2062. if (host.renderer.$keepTextAreaAtCursor == null) {
  2063. host.renderer.$keepTextAreaAtCursor = true;
  2064. host.renderer.$moveTextAreaToCursor();
  2065. }
  2066. }, useragent.isOldIE ? 200 : 0);
  2067. }
  2068. var onContextMenu = function(e) {
  2069. host.textInput.onContextMenu(e);
  2070. onContextMenuClose();
  2071. };
  2072. event.addListener(host.renderer.scroller, "contextmenu", onContextMenu);
  2073. event.addListener(text, "contextmenu", onContextMenu);
  2074. };
  2075. exports.TextInput = TextInput;
  2076. });
  2077. ace.define("ace/mouse/default_handlers",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"], function(require, exports, module) {
  2078. "use strict";
  2079. var dom = require("../lib/dom");
  2080. var event = require("../lib/event");
  2081. var useragent = require("../lib/useragent");
  2082. var DRAG_OFFSET = 0; // pixels
  2083. function DefaultHandlers(mouseHandler) {
  2084. mouseHandler.$clickSelection = null;
  2085. var editor = mouseHandler.editor;
  2086. editor.setDefaultHandler("mousedown", this.onMouseDown.bind(mouseHandler));
  2087. editor.setDefaultHandler("dblclick", this.onDoubleClick.bind(mouseHandler));
  2088. editor.setDefaultHandler("tripleclick", this.onTripleClick.bind(mouseHandler));
  2089. editor.setDefaultHandler("quadclick", this.onQuadClick.bind(mouseHandler));
  2090. editor.setDefaultHandler("mousewheel", this.onMouseWheel.bind(mouseHandler));
  2091. var exports = ["select", "startSelect", "selectEnd", "selectAllEnd", "selectByWordsEnd",
  2092. "selectByLinesEnd", "dragWait", "dragWaitEnd", "focusWait"];
  2093. exports.forEach(function(x) {
  2094. mouseHandler[x] = this[x];
  2095. }, this);
  2096. mouseHandler.selectByLines = this.extendSelectionBy.bind(mouseHandler, "getLineRange");
  2097. mouseHandler.selectByWords = this.extendSelectionBy.bind(mouseHandler, "getWordRange");
  2098. }
  2099. (function() {
  2100. this.onMouseDown = function(ev) {
  2101. var inSelection = ev.inSelection();
  2102. var pos = ev.getDocumentPosition();
  2103. this.mousedownEvent = ev;
  2104. var editor = this.editor;
  2105. var button = ev.getButton();
  2106. if (button !== 0) {
  2107. var selectionRange = editor.getSelectionRange();
  2108. var selectionEmpty = selectionRange.isEmpty();
  2109. editor.$blockScrolling++;
  2110. if (selectionEmpty)
  2111. editor.selection.moveToPosition(pos);
  2112. editor.$blockScrolling--;
  2113. editor.textInput.onContextMenu(ev.domEvent);
  2114. return; // stopping event here breaks contextmenu on ff mac
  2115. }
  2116. this.mousedownEvent.time = Date.now();
  2117. if (inSelection && !editor.isFocused()) {
  2118. editor.focus();
  2119. if (this.$focusTimout && !this.$clickSelection && !editor.inMultiSelectMode) {
  2120. this.setState("focusWait");
  2121. this.captureMouse(ev);
  2122. return;
  2123. }
  2124. }
  2125. this.captureMouse(ev);
  2126. this.startSelect(pos, ev.domEvent._clicks > 1);
  2127. return ev.preventDefault();
  2128. };
  2129. this.startSelect = function(pos, waitForClickSelection) {
  2130. pos = pos || this.editor.renderer.screenToTextCoordinates(this.x, this.y);
  2131. var editor = this.editor;
  2132. editor.$blockScrolling++;
  2133. if (this.mousedownEvent.getShiftKey())
  2134. editor.selection.selectToPosition(pos);
  2135. else if (!waitForClickSelection)
  2136. editor.selection.moveToPosition(pos);
  2137. if (!waitForClickSelection)
  2138. this.select();
  2139. if (editor.renderer.scroller.setCapture) {
  2140. editor.renderer.scroller.setCapture();
  2141. }
  2142. editor.setStyle("ace_selecting");
  2143. this.setState("select");
  2144. editor.$blockScrolling--;
  2145. };
  2146. this.select = function() {
  2147. var anchor, editor = this.editor;
  2148. var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);
  2149. editor.$blockScrolling++;
  2150. if (this.$clickSelection) {
  2151. var cmp = this.$clickSelection.comparePoint(cursor);
  2152. if (cmp == -1) {
  2153. anchor = this.$clickSelection.end;
  2154. } else if (cmp == 1) {
  2155. anchor = this.$clickSelection.start;
  2156. } else {
  2157. var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);
  2158. cursor = orientedRange.cursor;
  2159. anchor = orientedRange.anchor;
  2160. }
  2161. editor.selection.setSelectionAnchor(anchor.row, anchor.column);
  2162. }
  2163. editor.selection.selectToPosition(cursor);
  2164. editor.$blockScrolling--;
  2165. editor.renderer.scrollCursorIntoView();
  2166. };
  2167. this.extendSelectionBy = function(unitName) {
  2168. var anchor, editor = this.editor;
  2169. var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);
  2170. var range = editor.selection[unitName](cursor.row, cursor.column);
  2171. editor.$blockScrolling++;
  2172. if (this.$clickSelection) {
  2173. var cmpStart = this.$clickSelection.comparePoint(range.start);
  2174. var cmpEnd = this.$clickSelection.comparePoint(range.end);
  2175. if (cmpStart == -1 && cmpEnd <= 0) {
  2176. anchor = this.$clickSelection.end;
  2177. if (range.end.row != cursor.row || range.end.column != cursor.column)
  2178. cursor = range.start;
  2179. } else if (cmpEnd == 1 && cmpStart >= 0) {
  2180. anchor = this.$clickSelection.start;
  2181. if (range.start.row != cursor.row || range.start.column != cursor.column)
  2182. cursor = range.end;
  2183. } else if (cmpStart == -1 && cmpEnd == 1) {
  2184. cursor = range.end;
  2185. anchor = range.start;
  2186. } else {
  2187. var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);
  2188. cursor = orientedRange.cursor;
  2189. anchor = orientedRange.anchor;
  2190. }
  2191. editor.selection.setSelectionAnchor(anchor.row, anchor.column);
  2192. }
  2193. editor.selection.selectToPosition(cursor);
  2194. editor.$blockScrolling--;
  2195. editor.renderer.scrollCursorIntoView();
  2196. };
  2197. this.selectEnd =
  2198. this.selectAllEnd =
  2199. this.selectByWordsEnd =
  2200. this.selectByLinesEnd = function() {
  2201. this.$clickSelection = null;
  2202. this.editor.unsetStyle("ace_selecting");
  2203. if (this.editor.renderer.scroller.releaseCapture) {
  2204. this.editor.renderer.scroller.releaseCapture();
  2205. }
  2206. };
  2207. this.focusWait = function() {
  2208. var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);
  2209. var time = Date.now();
  2210. if (distance > DRAG_OFFSET || time - this.mousedownEvent.time > this.$focusTimout)
  2211. this.startSelect(this.mousedownEvent.getDocumentPosition());
  2212. };
  2213. this.onDoubleClick = function(ev) {
  2214. var pos = ev.getDocumentPosition();
  2215. var editor = this.editor;
  2216. var session = editor.session;
  2217. var range = session.getBracketRange(pos);
  2218. if (range) {
  2219. if (range.isEmpty()) {
  2220. range.start.column--;
  2221. range.end.column++;
  2222. }
  2223. this.setState("select");
  2224. } else {
  2225. range = editor.selection.getWordRange(pos.row, pos.column);
  2226. this.setState("selectByWords");
  2227. }
  2228. this.$clickSelection = range;
  2229. this.select();
  2230. };
  2231. this.onTripleClick = function(ev) {
  2232. var pos = ev.getDocumentPosition();
  2233. var editor = this.editor;
  2234. this.setState("selectByLines");
  2235. var range = editor.getSelectionRange();
  2236. if (range.isMultiLine() && range.contains(pos.row, pos.column)) {
  2237. this.$clickSelection = editor.selection.getLineRange(range.start.row);
  2238. this.$clickSelection.end = editor.selection.getLineRange(range.end.row).end;
  2239. } else {
  2240. this.$clickSelection = editor.selection.getLineRange(pos.row);
  2241. }
  2242. this.select();
  2243. };
  2244. this.onQuadClick = function(ev) {
  2245. var editor = this.editor;
  2246. editor.selectAll();
  2247. this.$clickSelection = editor.getSelectionRange();
  2248. this.setState("selectAll");
  2249. };
  2250. this.onMouseWheel = function(ev) {
  2251. if (ev.getAccelKey())
  2252. return;
  2253. if (ev.getShiftKey() && ev.wheelY && !ev.wheelX) {
  2254. ev.wheelX = ev.wheelY;
  2255. ev.wheelY = 0;
  2256. }
  2257. var t = ev.domEvent.timeStamp;
  2258. var dt = t - (this.$lastScrollTime||0);
  2259. var editor = this.editor;
  2260. var isScrolable = editor.renderer.isScrollableBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);
  2261. if (isScrolable || dt < 200) {
  2262. this.$lastScrollTime = t;
  2263. editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);
  2264. return ev.stop();
  2265. }
  2266. };
  2267. }).call(DefaultHandlers.prototype);
  2268. exports.DefaultHandlers = DefaultHandlers;
  2269. function calcDistance(ax, ay, bx, by) {
  2270. return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));
  2271. }
  2272. function calcRangeOrientation(range, cursor) {
  2273. if (range.start.row == range.end.row)
  2274. var cmp = 2 * cursor.column - range.start.column - range.end.column;
  2275. else if (range.start.row == range.end.row - 1 && !range.start.column && !range.end.column)
  2276. var cmp = cursor.column - 4;
  2277. else
  2278. var cmp = 2 * cursor.row - range.start.row - range.end.row;
  2279. if (cmp < 0)
  2280. return {cursor: range.start, anchor: range.end};
  2281. else
  2282. return {cursor: range.end, anchor: range.start};
  2283. }
  2284. });
  2285. ace.define("ace/tooltip",["require","exports","module","ace/lib/oop","ace/lib/dom"], function(require, exports, module) {
  2286. "use strict";
  2287. var oop = require("./lib/oop");
  2288. var dom = require("./lib/dom");
  2289. function Tooltip (parentNode) {
  2290. this.isOpen = false;
  2291. this.$element = null;
  2292. this.$parentNode = parentNode;
  2293. }
  2294. (function() {
  2295. this.$init = function() {
  2296. this.$element = dom.createElement("div");
  2297. this.$element.className = "ace_tooltip";
  2298. this.$element.style.display = "none";
  2299. this.$parentNode.appendChild(this.$element);
  2300. return this.$element;
  2301. };
  2302. this.getElement = function() {
  2303. return this.$element || this.$init();
  2304. };
  2305. this.setText = function(text) {
  2306. dom.setInnerText(this.getElement(), text);
  2307. };
  2308. this.setHtml = function(html) {
  2309. this.getElement().innerHTML = html;
  2310. };
  2311. this.setPosition = function(x, y) {
  2312. this.getElement().style.left = x + "px";
  2313. this.getElement().style.top = y + "px";
  2314. };
  2315. this.setClassName = function(className) {
  2316. dom.addCssClass(this.getElement(), className);
  2317. };
  2318. this.show = function(text, x, y) {
  2319. if (text != null)
  2320. this.setText(text);
  2321. if (x != null && y != null)
  2322. this.setPosition(x, y);
  2323. if (!this.isOpen) {
  2324. this.getElement().style.display = "block";
  2325. this.isOpen = true;
  2326. }
  2327. };
  2328. this.hide = function() {
  2329. if (this.isOpen) {
  2330. this.getElement().style.display = "none";
  2331. this.isOpen = false;
  2332. }
  2333. };
  2334. this.getHeight = function() {
  2335. return this.getElement().offsetHeight;
  2336. };
  2337. this.getWidth = function() {
  2338. return this.getElement().offsetWidth;
  2339. };
  2340. }).call(Tooltip.prototype);
  2341. exports.Tooltip = Tooltip;
  2342. });
  2343. ace.define("ace/mouse/default_gutter_handler",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event","ace/tooltip"], function(require, exports, module) {
  2344. "use strict";
  2345. var dom = require("../lib/dom");
  2346. var oop = require("../lib/oop");
  2347. var event = require("../lib/event");
  2348. var Tooltip = require("../tooltip").Tooltip;
  2349. function GutterHandler(mouseHandler) {
  2350. var editor = mouseHandler.editor;
  2351. var gutter = editor.renderer.$gutterLayer;
  2352. var tooltip = new GutterTooltip(editor.container);
  2353. mouseHandler.editor.setDefaultHandler("guttermousedown", function(e) {
  2354. if (!editor.isFocused() || e.getButton() != 0)
  2355. return;
  2356. var gutterRegion = gutter.getRegion(e);
  2357. if (gutterRegion == "foldWidgets")
  2358. return;
  2359. var row = e.getDocumentPosition().row;
  2360. var selection = editor.session.selection;
  2361. if (e.getShiftKey())
  2362. selection.selectTo(row, 0);
  2363. else {
  2364. if (e.domEvent.detail == 2) {
  2365. editor.selectAll();
  2366. return e.preventDefault();
  2367. }
  2368. mouseHandler.$clickSelection = editor.selection.getLineRange(row);
  2369. }
  2370. mouseHandler.setState("selectByLines");
  2371. mouseHandler.captureMouse(e);
  2372. return e.preventDefault();
  2373. });
  2374. var tooltipTimeout, mouseEvent, tooltipAnnotation;
  2375. function showTooltip() {
  2376. var row = mouseEvent.getDocumentPosition().row;
  2377. var annotation = gutter.$annotations[row];
  2378. if (!annotation)
  2379. return hideTooltip();
  2380. var maxRow = editor.session.getLength();
  2381. if (row == maxRow) {
  2382. var screenRow = editor.renderer.pixelToScreenCoordinates(0, mouseEvent.y).row;
  2383. var pos = mouseEvent.$pos;
  2384. if (screenRow > editor.session.documentToScreenRow(pos.row, pos.column))
  2385. return hideTooltip();
  2386. }
  2387. if (tooltipAnnotation == annotation)
  2388. return;
  2389. tooltipAnnotation = annotation.text.join("<br/>");
  2390. tooltip.setHtml(tooltipAnnotation);
  2391. tooltip.show();
  2392. editor.on("mousewheel", hideTooltip);
  2393. if (mouseHandler.$tooltipFollowsMouse) {
  2394. moveTooltip(mouseEvent);
  2395. } else {
  2396. var gutterElement = gutter.$cells[editor.session.documentToScreenRow(row, 0)].element;
  2397. var rect = gutterElement.getBoundingClientRect();
  2398. var style = tooltip.getElement().style;
  2399. style.left = rect.right + "px";
  2400. style.top = rect.bottom + "px";
  2401. }
  2402. }
  2403. function hideTooltip() {
  2404. if (tooltipTimeout)
  2405. tooltipTimeout = clearTimeout(tooltipTimeout);
  2406. if (tooltipAnnotation) {
  2407. tooltip.hide();
  2408. tooltipAnnotation = null;
  2409. editor.removeEventListener("mousewheel", hideTooltip);
  2410. }
  2411. }
  2412. function moveTooltip(e) {
  2413. tooltip.setPosition(e.x, e.y);
  2414. }
  2415. mouseHandler.editor.setDefaultHandler("guttermousemove", function(e) {
  2416. var target = e.domEvent.target || e.domEvent.srcElement;
  2417. if (dom.hasCssClass(target, "ace_fold-widget"))
  2418. return hideTooltip();
  2419. if (tooltipAnnotation && mouseHandler.$tooltipFollowsMouse)
  2420. moveTooltip(e);
  2421. mouseEvent = e;
  2422. if (tooltipTimeout)
  2423. return;
  2424. tooltipTimeout = setTimeout(function() {
  2425. tooltipTimeout = null;
  2426. if (mouseEvent && !mouseHandler.isMousePressed)
  2427. showTooltip();
  2428. else
  2429. hideTooltip();
  2430. }, 50);
  2431. });
  2432. event.addListener(editor.renderer.$gutter, "mouseout", function(e) {
  2433. mouseEvent = null;
  2434. if (!tooltipAnnotation || tooltipTimeout)
  2435. return;
  2436. tooltipTimeout = setTimeout(function() {
  2437. tooltipTimeout = null;
  2438. hideTooltip();
  2439. }, 50);
  2440. });
  2441. editor.on("changeSession", hideTooltip);
  2442. }
  2443. function GutterTooltip(parentNode) {
  2444. Tooltip.call(this, parentNode);
  2445. }
  2446. oop.inherits(GutterTooltip, Tooltip);
  2447. (function(){
  2448. this.setPosition = function(x, y) {
  2449. var windowWidth = window.innerWidth || document.documentElement.clientWidth;
  2450. var windowHeight = window.innerHeight || document.documentElement.clientHeight;
  2451. var width = this.getWidth();
  2452. var height = this.getHeight();
  2453. x += 15;
  2454. y += 15;
  2455. if (x + width > windowWidth) {
  2456. x -= (x + width) - windowWidth;
  2457. }
  2458. if (y + height > windowHeight) {
  2459. y -= 20 + height;
  2460. }
  2461. Tooltip.prototype.setPosition.call(this, x, y);
  2462. };
  2463. }).call(GutterTooltip.prototype);
  2464. exports.GutterHandler = GutterHandler;
  2465. });
  2466. ace.define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"], function(require, exports, module) {
  2467. "use strict";
  2468. var event = require("../lib/event");
  2469. var useragent = require("../lib/useragent");
  2470. var MouseEvent = exports.MouseEvent = function(domEvent, editor) {
  2471. this.domEvent = domEvent;
  2472. this.editor = editor;
  2473. this.x = this.clientX = domEvent.clientX;
  2474. this.y = this.clientY = domEvent.clientY;
  2475. this.$pos = null;
  2476. this.$inSelection = null;
  2477. this.propagationStopped = false;
  2478. this.defaultPrevented = false;
  2479. };
  2480. (function() {
  2481. this.stopPropagation = function() {
  2482. event.stopPropagation(this.domEvent);
  2483. this.propagationStopped = true;
  2484. };
  2485. this.preventDefault = function() {
  2486. event.preventDefault(this.domEvent);
  2487. this.defaultPrevented = true;
  2488. };
  2489. this.stop = function() {
  2490. this.stopPropagation();
  2491. this.preventDefault();
  2492. };
  2493. this.getDocumentPosition = function() {
  2494. if (this.$pos)
  2495. return this.$pos;
  2496. this.$pos = this.editor.renderer.screenToTextCoordinates(this.clientX, this.clientY);
  2497. return this.$pos;
  2498. };
  2499. this.inSelection = function() {
  2500. if (this.$inSelection !== null)
  2501. return this.$inSelection;
  2502. var editor = this.editor;
  2503. var selectionRange = editor.getSelectionRange();
  2504. if (selectionRange.isEmpty())
  2505. this.$inSelection = false;
  2506. else {
  2507. var pos = this.getDocumentPosition();
  2508. this.$inSelection = selectionRange.contains(pos.row, pos.column);
  2509. }
  2510. return this.$inSelection;
  2511. };
  2512. this.getButton = function() {
  2513. return event.getButton(this.domEvent);
  2514. };
  2515. this.getShiftKey = function() {
  2516. return this.domEvent.shiftKey;
  2517. };
  2518. this.getAccelKey = useragent.isMac
  2519. ? function() { return this.domEvent.metaKey; }
  2520. : function() { return this.domEvent.ctrlKey; };
  2521. }).call(MouseEvent.prototype);
  2522. });
  2523. ace.define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"], function(require, exports, module) {
  2524. "use strict";
  2525. var dom = require("../lib/dom");
  2526. var event = require("../lib/event");
  2527. var useragent = require("../lib/useragent");
  2528. var AUTOSCROLL_DELAY = 200;
  2529. var SCROLL_CURSOR_DELAY = 200;
  2530. var SCROLL_CURSOR_HYSTERESIS = 5;
  2531. function DragdropHandler(mouseHandler) {
  2532. var editor = mouseHandler.editor;
  2533. var blankImage = dom.createElement("img");
  2534. blankImage.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
  2535. if (useragent.isOpera)
  2536. blankImage.style.cssText = "width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;";
  2537. var exports = ["dragWait", "dragWaitEnd", "startDrag", "dragReadyEnd", "onMouseDrag"];
  2538. exports.forEach(function(x) {
  2539. mouseHandler[x] = this[x];
  2540. }, this);
  2541. editor.addEventListener("mousedown", this.onMouseDown.bind(mouseHandler));
  2542. var mouseTarget = editor.container;
  2543. var dragSelectionMarker, x, y;
  2544. var timerId, range;
  2545. var dragCursor, counter = 0;
  2546. var dragOperation;
  2547. var isInternal;
  2548. var autoScrollStartTime;
  2549. var cursorMovedTime;
  2550. var cursorPointOnCaretMoved;
  2551. this.onDragStart = function(e) {
  2552. if (this.cancelDrag || !mouseTarget.draggable) {
  2553. var self = this;
  2554. setTimeout(function(){
  2555. self.startSelect();
  2556. self.captureMouse(e);
  2557. }, 0);
  2558. return e.preventDefault();
  2559. }
  2560. range = editor.getSelectionRange();
  2561. var dataTransfer = e.dataTransfer;
  2562. dataTransfer.effectAllowed = editor.getReadOnly() ? "copy" : "copyMove";
  2563. if (useragent.isOpera) {
  2564. editor.container.appendChild(blankImage);
  2565. blankImage.scrollTop = 0;
  2566. }
  2567. dataTransfer.setDragImage && dataTransfer.setDragImage(blankImage, 0, 0);
  2568. if (useragent.isOpera) {
  2569. editor.container.removeChild(blankImage);
  2570. }
  2571. dataTransfer.clearData();
  2572. dataTransfer.setData("Text", editor.session.getTextRange());
  2573. isInternal = true;
  2574. this.setState("drag");
  2575. };
  2576. this.onDragEnd = function(e) {
  2577. mouseTarget.draggable = false;
  2578. isInternal = false;
  2579. this.setState(null);
  2580. if (!editor.getReadOnly()) {
  2581. var dropEffect = e.dataTransfer.dropEffect;
  2582. if (!dragOperation && dropEffect == "move")
  2583. editor.session.remove(editor.getSelectionRange());
  2584. editor.renderer.$cursorLayer.setBlinking(true);
  2585. }
  2586. this.editor.unsetStyle("ace_dragging");
  2587. this.editor.renderer.setCursorStyle("");
  2588. };
  2589. this.onDragEnter = function(e) {
  2590. if (editor.getReadOnly() || !canAccept(e.dataTransfer))
  2591. return;
  2592. x = e.clientX;
  2593. y = e.clientY;
  2594. if (!dragSelectionMarker)
  2595. addDragMarker();
  2596. counter++;
  2597. e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);
  2598. return event.preventDefault(e);
  2599. };
  2600. this.onDragOver = function(e) {
  2601. if (editor.getReadOnly() || !canAccept(e.dataTransfer))
  2602. return;
  2603. x = e.clientX;
  2604. y = e.clientY;
  2605. if (!dragSelectionMarker) {
  2606. addDragMarker();
  2607. counter++;
  2608. }
  2609. if (onMouseMoveTimer !== null)
  2610. onMouseMoveTimer = null;
  2611. e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);
  2612. return event.preventDefault(e);
  2613. };
  2614. this.onDragLeave = function(e) {
  2615. counter--;
  2616. if (counter <= 0 && dragSelectionMarker) {
  2617. clearDragMarker();
  2618. dragOperation = null;
  2619. return event.preventDefault(e);
  2620. }
  2621. };
  2622. this.onDrop = function(e) {
  2623. if (!dragCursor)
  2624. return;
  2625. var dataTransfer = e.dataTransfer;
  2626. if (isInternal) {
  2627. switch (dragOperation) {
  2628. case "move":
  2629. if (range.contains(dragCursor.row, dragCursor.column)) {
  2630. range = {
  2631. start: dragCursor,
  2632. end: dragCursor
  2633. };
  2634. } else {
  2635. range = editor.moveText(range, dragCursor);
  2636. }
  2637. break;
  2638. case "copy":
  2639. range = editor.moveText(range, dragCursor, true);
  2640. break;
  2641. }
  2642. } else {
  2643. var dropData = dataTransfer.getData('Text');
  2644. range = {
  2645. start: dragCursor,
  2646. end: editor.session.insert(dragCursor, dropData)
  2647. };
  2648. editor.focus();
  2649. dragOperation = null;
  2650. }
  2651. clearDragMarker();
  2652. return event.preventDefault(e);
  2653. };
  2654. event.addListener(mouseTarget, "dragstart", this.onDragStart.bind(mouseHandler));
  2655. event.addListener(mouseTarget, "dragend", this.onDragEnd.bind(mouseHandler));
  2656. event.addListener(mouseTarget, "dragenter", this.onDragEnter.bind(mouseHandler));
  2657. event.addListener(mouseTarget, "dragover", this.onDragOver.bind(mouseHandler));
  2658. event.addListener(mouseTarget, "dragleave", this.onDragLeave.bind(mouseHandler));
  2659. event.addListener(mouseTarget, "drop", this.onDrop.bind(mouseHandler));
  2660. function scrollCursorIntoView(cursor, prevCursor) {
  2661. var now = Date.now();
  2662. var vMovement = !prevCursor || cursor.row != prevCursor.row;
  2663. var hMovement = !prevCursor || cursor.column != prevCursor.column;
  2664. if (!cursorMovedTime || vMovement || hMovement) {
  2665. editor.$blockScrolling += 1;
  2666. editor.moveCursorToPosition(cursor);
  2667. editor.$blockScrolling -= 1;
  2668. cursorMovedTime = now;
  2669. cursorPointOnCaretMoved = {x: x, y: y};
  2670. } else {
  2671. var distance = calcDistance(cursorPointOnCaretMoved.x, cursorPointOnCaretMoved.y, x, y);
  2672. if (distance > SCROLL_CURSOR_HYSTERESIS) {
  2673. cursorMovedTime = null;
  2674. } else if (now - cursorMovedTime >= SCROLL_CURSOR_DELAY) {
  2675. editor.renderer.scrollCursorIntoView();
  2676. cursorMovedTime = null;
  2677. }
  2678. }
  2679. }
  2680. function autoScroll(cursor, prevCursor) {
  2681. var now = Date.now();
  2682. var lineHeight = editor.renderer.layerConfig.lineHeight;
  2683. var characterWidth = editor.renderer.layerConfig.characterWidth;
  2684. var editorRect = editor.renderer.scroller.getBoundingClientRect();
  2685. var offsets = {
  2686. x: {
  2687. left: x - editorRect.left,
  2688. right: editorRect.right - x
  2689. },
  2690. y: {
  2691. top: y - editorRect.top,
  2692. bottom: editorRect.bottom - y
  2693. }
  2694. };
  2695. var nearestXOffset = Math.min(offsets.x.left, offsets.x.right);
  2696. var nearestYOffset = Math.min(offsets.y.top, offsets.y.bottom);
  2697. var scrollCursor = {row: cursor.row, column: cursor.column};
  2698. if (nearestXOffset / characterWidth <= 2) {
  2699. scrollCursor.column += (offsets.x.left < offsets.x.right ? -3 : +2);
  2700. }
  2701. if (nearestYOffset / lineHeight <= 1) {
  2702. scrollCursor.row += (offsets.y.top < offsets.y.bottom ? -1 : +1);
  2703. }
  2704. var vScroll = cursor.row != scrollCursor.row;
  2705. var hScroll = cursor.column != scrollCursor.column;
  2706. var vMovement = !prevCursor || cursor.row != prevCursor.row;
  2707. if (vScroll || (hScroll && !vMovement)) {
  2708. if (!autoScrollStartTime)
  2709. autoScrollStartTime = now;
  2710. else if (now - autoScrollStartTime >= AUTOSCROLL_DELAY)
  2711. editor.renderer.scrollCursorIntoView(scrollCursor);
  2712. } else {
  2713. autoScrollStartTime = null;
  2714. }
  2715. }
  2716. function onDragInterval() {
  2717. var prevCursor = dragCursor;
  2718. dragCursor = editor.renderer.screenToTextCoordinates(x, y);
  2719. scrollCursorIntoView(dragCursor, prevCursor);
  2720. autoScroll(dragCursor, prevCursor);
  2721. }
  2722. function addDragMarker() {
  2723. range = editor.selection.toOrientedRange();
  2724. dragSelectionMarker = editor.session.addMarker(range, "ace_selection", editor.getSelectionStyle());
  2725. editor.clearSelection();
  2726. if (editor.isFocused())
  2727. editor.renderer.$cursorLayer.setBlinking(false);
  2728. clearInterval(timerId);
  2729. onDragInterval();
  2730. timerId = setInterval(onDragInterval, 20);
  2731. counter = 0;
  2732. event.addListener(document, "mousemove", onMouseMove);
  2733. }
  2734. function clearDragMarker() {
  2735. clearInterval(timerId);
  2736. editor.session.removeMarker(dragSelectionMarker);
  2737. dragSelectionMarker = null;
  2738. editor.$blockScrolling += 1;
  2739. editor.selection.fromOrientedRange(range);
  2740. editor.$blockScrolling -= 1;
  2741. if (editor.isFocused() && !isInternal)
  2742. editor.renderer.$cursorLayer.setBlinking(!editor.getReadOnly());
  2743. range = null;
  2744. dragCursor = null;
  2745. counter = 0;
  2746. autoScrollStartTime = null;
  2747. cursorMovedTime = null;
  2748. event.removeListener(document, "mousemove", onMouseMove);
  2749. }
  2750. var onMouseMoveTimer = null;
  2751. function onMouseMove() {
  2752. if (onMouseMoveTimer == null) {
  2753. onMouseMoveTimer = setTimeout(function() {
  2754. if (onMouseMoveTimer != null && dragSelectionMarker)
  2755. clearDragMarker();
  2756. }, 20);
  2757. }
  2758. }
  2759. function canAccept(dataTransfer) {
  2760. var types = dataTransfer.types;
  2761. return !types || Array.prototype.some.call(types, function(type) {
  2762. return type == 'text/plain' || type == 'Text';
  2763. });
  2764. }
  2765. function getDropEffect(e) {
  2766. var copyAllowed = ['copy', 'copymove', 'all', 'uninitialized'];
  2767. var moveAllowed = ['move', 'copymove', 'linkmove', 'all', 'uninitialized'];
  2768. var copyModifierState = useragent.isMac ? e.altKey : e.ctrlKey;
  2769. var effectAllowed = "uninitialized";
  2770. try {
  2771. effectAllowed = e.dataTransfer.effectAllowed.toLowerCase();
  2772. } catch (e) {}
  2773. var dropEffect = "none";
  2774. if (copyModifierState && copyAllowed.indexOf(effectAllowed) >= 0)
  2775. dropEffect = "copy";
  2776. else if (moveAllowed.indexOf(effectAllowed) >= 0)
  2777. dropEffect = "move";
  2778. else if (copyAllowed.indexOf(effectAllowed) >= 0)
  2779. dropEffect = "copy";
  2780. return dropEffect;
  2781. }
  2782. }
  2783. (function() {
  2784. this.dragWait = function() {
  2785. var interval = Date.now() - this.mousedownEvent.time;
  2786. if (interval > this.editor.getDragDelay())
  2787. this.startDrag();
  2788. };
  2789. this.dragWaitEnd = function() {
  2790. var target = this.editor.container;
  2791. target.draggable = false;
  2792. this.startSelect(this.mousedownEvent.getDocumentPosition());
  2793. this.selectEnd();
  2794. };
  2795. this.dragReadyEnd = function(e) {
  2796. this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly());
  2797. this.editor.unsetStyle("ace_dragging");
  2798. this.editor.renderer.setCursorStyle("");
  2799. this.dragWaitEnd();
  2800. };
  2801. this.startDrag = function(){
  2802. this.cancelDrag = false;
  2803. var editor = this.editor;
  2804. var target = editor.container;
  2805. target.draggable = true;
  2806. editor.renderer.$cursorLayer.setBlinking(false);
  2807. editor.setStyle("ace_dragging");
  2808. var cursorStyle = useragent.isWin ? "default" : "move";
  2809. editor.renderer.setCursorStyle(cursorStyle);
  2810. this.setState("dragReady");
  2811. };
  2812. this.onMouseDrag = function(e) {
  2813. var target = this.editor.container;
  2814. if (useragent.isIE && this.state == "dragReady") {
  2815. var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);
  2816. if (distance > 3)
  2817. target.dragDrop();
  2818. }
  2819. if (this.state === "dragWait") {
  2820. var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);
  2821. if (distance > 0) {
  2822. target.draggable = false;
  2823. this.startSelect(this.mousedownEvent.getDocumentPosition());
  2824. }
  2825. }
  2826. };
  2827. this.onMouseDown = function(e) {
  2828. if (!this.$dragEnabled)
  2829. return;
  2830. this.mousedownEvent = e;
  2831. var editor = this.editor;
  2832. var inSelection = e.inSelection();
  2833. var button = e.getButton();
  2834. var clickCount = e.domEvent.detail || 1;
  2835. if (clickCount === 1 && button === 0 && inSelection) {
  2836. if (e.editor.inMultiSelectMode && (e.getAccelKey() || e.getShiftKey()))
  2837. return;
  2838. this.mousedownEvent.time = Date.now();
  2839. var eventTarget = e.domEvent.target || e.domEvent.srcElement;
  2840. if ("unselectable" in eventTarget)
  2841. eventTarget.unselectable = "on";
  2842. if (editor.getDragDelay()) {
  2843. if (useragent.isWebKit) {
  2844. this.cancelDrag = true;
  2845. var mouseTarget = editor.container;
  2846. mouseTarget.draggable = true;
  2847. }
  2848. this.setState("dragWait");
  2849. } else {
  2850. this.startDrag();
  2851. }
  2852. this.captureMouse(e, this.onMouseDrag.bind(this));
  2853. e.defaultPrevented = true;
  2854. }
  2855. };
  2856. }).call(DragdropHandler.prototype);
  2857. function calcDistance(ax, ay, bx, by) {
  2858. return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));
  2859. }
  2860. exports.DragdropHandler = DragdropHandler;
  2861. });
  2862. ace.define("ace/lib/net",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
  2863. "use strict";
  2864. var dom = require("./dom");
  2865. exports.get = function (url, callback) {
  2866. var xhr = new XMLHttpRequest();
  2867. xhr.open('GET', url, true);
  2868. xhr.onreadystatechange = function () {
  2869. if (xhr.readyState === 4) {
  2870. callback(xhr.responseText);
  2871. }
  2872. };
  2873. xhr.send(null);
  2874. };
  2875. exports.loadScript = function(path, callback) {
  2876. var head = dom.getDocumentHead();
  2877. var s = document.createElement('script');
  2878. s.src = path;
  2879. head.appendChild(s);
  2880. s.onload = s.onreadystatechange = function(_, isAbort) {
  2881. if (isAbort || !s.readyState || s.readyState == "loaded" || s.readyState == "complete") {
  2882. s = s.onload = s.onreadystatechange = null;
  2883. if (!isAbort)
  2884. callback();
  2885. }
  2886. };
  2887. };
  2888. exports.qualifyURL = function(url) {
  2889. var a = document.createElement('a');
  2890. a.href = url;
  2891. return a.href;
  2892. }
  2893. });
  2894. ace.define("ace/lib/event_emitter",["require","exports","module"], function(require, exports, module) {
  2895. "use strict";
  2896. var EventEmitter = {};
  2897. var stopPropagation = function() { this.propagationStopped = true; };
  2898. var preventDefault = function() { this.defaultPrevented = true; };
  2899. EventEmitter._emit =
  2900. EventEmitter._dispatchEvent = function(eventName, e) {
  2901. this._eventRegistry || (this._eventRegistry = {});
  2902. this._defaultHandlers || (this._defaultHandlers = {});
  2903. var listeners = this._eventRegistry[eventName] || [];
  2904. var defaultHandler = this._defaultHandlers[eventName];
  2905. if (!listeners.length && !defaultHandler)
  2906. return;
  2907. if (typeof e != "object" || !e)
  2908. e = {};
  2909. if (!e.type)
  2910. e.type = eventName;
  2911. if (!e.stopPropagation)
  2912. e.stopPropagation = stopPropagation;
  2913. if (!e.preventDefault)
  2914. e.preventDefault = preventDefault;
  2915. listeners = listeners.slice();
  2916. for (var i=0; i<listeners.length; i++) {
  2917. listeners[i](e, this);
  2918. if (e.propagationStopped)
  2919. break;
  2920. }
  2921. if (defaultHandler && !e.defaultPrevented)
  2922. return defaultHandler(e, this);
  2923. };
  2924. EventEmitter._signal = function(eventName, e) {
  2925. var listeners = (this._eventRegistry || {})[eventName];
  2926. if (!listeners)
  2927. return;
  2928. listeners = listeners.slice();
  2929. for (var i=0; i<listeners.length; i++)
  2930. listeners[i](e, this);
  2931. };
  2932. EventEmitter.once = function(eventName, callback) {
  2933. var _self = this;
  2934. callback && this.addEventListener(eventName, function newCallback() {
  2935. _self.removeEventListener(eventName, newCallback);
  2936. callback.apply(null, arguments);
  2937. });
  2938. };
  2939. EventEmitter.setDefaultHandler = function(eventName, callback) {
  2940. var handlers = this._defaultHandlers
  2941. if (!handlers)
  2942. handlers = this._defaultHandlers = {_disabled_: {}};
  2943. if (handlers[eventName]) {
  2944. var old = handlers[eventName];
  2945. var disabled = handlers._disabled_[eventName];
  2946. if (!disabled)
  2947. handlers._disabled_[eventName] = disabled = [];
  2948. disabled.push(old);
  2949. var i = disabled.indexOf(callback);
  2950. if (i != -1)
  2951. disabled.splice(i, 1);
  2952. }
  2953. handlers[eventName] = callback;
  2954. };
  2955. EventEmitter.removeDefaultHandler = function(eventName, callback) {
  2956. var handlers = this._defaultHandlers
  2957. if (!handlers)
  2958. return;
  2959. var disabled = handlers._disabled_[eventName];
  2960. if (handlers[eventName] == callback) {
  2961. var old = handlers[eventName];
  2962. if (disabled)
  2963. this.setDefaultHandler(eventName, disabled.pop());
  2964. } else if (disabled) {
  2965. var i = disabled.indexOf(callback);
  2966. if (i != -1)
  2967. disabled.splice(i, 1);
  2968. }
  2969. };
  2970. EventEmitter.on =
  2971. EventEmitter.addEventListener = function(eventName, callback, capturing) {
  2972. this._eventRegistry = this._eventRegistry || {};
  2973. var listeners = this._eventRegistry[eventName];
  2974. if (!listeners)
  2975. listeners = this._eventRegistry[eventName] = [];
  2976. if (listeners.indexOf(callback) == -1)
  2977. listeners[capturing ? "unshift" : "push"](callback);
  2978. return callback;
  2979. };
  2980. EventEmitter.off =
  2981. EventEmitter.removeListener =
  2982. EventEmitter.removeEventListener = function(eventName, callback) {
  2983. this._eventRegistry = this._eventRegistry || {};
  2984. var listeners = this._eventRegistry[eventName];
  2985. if (!listeners)
  2986. return;
  2987. var index = listeners.indexOf(callback);
  2988. if (index !== -1)
  2989. listeners.splice(index, 1);
  2990. };
  2991. EventEmitter.removeAllListeners = function(eventName) {
  2992. if (this._eventRegistry) this._eventRegistry[eventName] = [];
  2993. };
  2994. exports.EventEmitter = EventEmitter;
  2995. });
  2996. ace.define("ace/lib/app_config",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module) {
  2997. "no use strict";
  2998. var oop = require("./oop");
  2999. var EventEmitter = require("./event_emitter").EventEmitter;
  3000. var optionsProvider = {
  3001. setOptions: function(optList) {
  3002. Object.keys(optList).forEach(function(key) {
  3003. this.setOption(key, optList[key]);
  3004. }, this);
  3005. },
  3006. getOptions: function(optionNames) {
  3007. var result = {};
  3008. if (!optionNames) {
  3009. optionNames = Object.keys(this.$options);
  3010. } else if (!Array.isArray(optionNames)) {
  3011. result = optionNames;
  3012. optionNames = Object.keys(result);
  3013. }
  3014. optionNames.forEach(function(key) {
  3015. result[key] = this.getOption(key);
  3016. }, this);
  3017. return result;
  3018. },
  3019. setOption: function(name, value) {
  3020. if (this["$" + name] === value)
  3021. return;
  3022. var opt = this.$options[name];
  3023. if (!opt) {
  3024. return warn('misspelled option "' + name + '"');
  3025. }
  3026. if (opt.forwardTo)
  3027. return this[opt.forwardTo] && this[opt.forwardTo].setOption(name, value);
  3028. if (!opt.handlesSet)
  3029. this["$" + name] = value;
  3030. if (opt && opt.set)
  3031. opt.set.call(this, value);
  3032. },
  3033. getOption: function(name) {
  3034. var opt = this.$options[name];
  3035. if (!opt) {
  3036. return warn('misspelled option "' + name + '"');
  3037. }
  3038. if (opt.forwardTo)
  3039. return this[opt.forwardTo] && this[opt.forwardTo].getOption(name);
  3040. return opt && opt.get ? opt.get.call(this) : this["$" + name];
  3041. }
  3042. };
  3043. function warn(message) {
  3044. if (typeof console != "undefined" && console.warn)
  3045. console.warn.apply(console, arguments);
  3046. }
  3047. function reportError(msg, data) {
  3048. var e = new Error(msg);
  3049. e.data = data;
  3050. if (typeof console == "object" && console.error)
  3051. console.error(e);
  3052. setTimeout(function() { throw e; });
  3053. }
  3054. var AppConfig = function() {
  3055. this.$defaultOptions = {};
  3056. };
  3057. (function() {
  3058. oop.implement(this, EventEmitter);
  3059. this.defineOptions = function(obj, path, options) {
  3060. if (!obj.$options)
  3061. this.$defaultOptions[path] = obj.$options = {};
  3062. Object.keys(options).forEach(function(key) {
  3063. var opt = options[key];
  3064. if (typeof opt == "string")
  3065. opt = {forwardTo: opt};
  3066. opt.name || (opt.name = key);
  3067. obj.$options[opt.name] = opt;
  3068. if ("initialValue" in opt)
  3069. obj["$" + opt.name] = opt.initialValue;
  3070. });
  3071. oop.implement(obj, optionsProvider);
  3072. return this;
  3073. };
  3074. this.resetOptions = function(obj) {
  3075. Object.keys(obj.$options).forEach(function(key) {
  3076. var opt = obj.$options[key];
  3077. if ("value" in opt)
  3078. obj.setOption(key, opt.value);
  3079. });
  3080. };
  3081. this.setDefaultValue = function(path, name, value) {
  3082. var opts = this.$defaultOptions[path] || (this.$defaultOptions[path] = {});
  3083. if (opts[name]) {
  3084. if (opts.forwardTo)
  3085. this.setDefaultValue(opts.forwardTo, name, value);
  3086. else
  3087. opts[name].value = value;
  3088. }
  3089. };
  3090. this.setDefaultValues = function(path, optionHash) {
  3091. Object.keys(optionHash).forEach(function(key) {
  3092. this.setDefaultValue(path, key, optionHash[key]);
  3093. }, this);
  3094. };
  3095. this.warn = warn;
  3096. this.reportError = reportError;
  3097. }).call(AppConfig.prototype);
  3098. exports.AppConfig = AppConfig;
  3099. });
  3100. ace.define("ace/config",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/lib/net","ace/lib/app_config"], function(require, exports, module) {
  3101. "no use strict";
  3102. var lang = require("./lib/lang");
  3103. var oop = require("./lib/oop");
  3104. var net = require("./lib/net");
  3105. var AppConfig = require("./lib/app_config").AppConfig;
  3106. module.exports = exports = new AppConfig();
  3107. var global = (function() {
  3108. return this;
  3109. })();
  3110. var options = {
  3111. packaged: false,
  3112. workerPath: null,
  3113. modePath: null,
  3114. themePath: null,
  3115. basePath: "",
  3116. suffix: ".js",
  3117. $moduleUrls: {}
  3118. };
  3119. exports.get = function(key) {
  3120. if (!options.hasOwnProperty(key))
  3121. throw new Error("Unknown config key: " + key);
  3122. return options[key];
  3123. };
  3124. exports.set = function(key, value) {
  3125. if (!options.hasOwnProperty(key))
  3126. throw new Error("Unknown config key: " + key);
  3127. options[key] = value;
  3128. };
  3129. exports.all = function() {
  3130. return lang.copyObject(options);
  3131. };
  3132. exports.moduleUrl = function(name, component) {
  3133. if (options.$moduleUrls[name])
  3134. return options.$moduleUrls[name];
  3135. var parts = name.split("/");
  3136. component = component || parts[parts.length - 2] || "";
  3137. var sep = component == "snippets" ? "/" : "-";
  3138. var base = parts[parts.length - 1];
  3139. if (component == "worker" && sep == "-") {
  3140. var re = new RegExp("^" + component + "[\\-_]|[\\-_]" + component + "$", "g");
  3141. base = base.replace(re, "");
  3142. }
  3143. if ((!base || base == component) && parts.length > 1)
  3144. base = parts[parts.length - 2];
  3145. var path = options[component + "Path"];
  3146. if (path == null) {
  3147. path = options.basePath;
  3148. } else if (sep == "/") {
  3149. component = sep = "";
  3150. }
  3151. if (path && path.slice(-1) != "/")
  3152. path += "/";
  3153. return path + component + sep + base + this.get("suffix");
  3154. };
  3155. exports.setModuleUrl = function(name, subst) {
  3156. return options.$moduleUrls[name] = subst;
  3157. };
  3158. exports.$loading = {};
  3159. exports.loadModule = function(moduleName, onLoad) {
  3160. var module, moduleType;
  3161. if (Array.isArray(moduleName)) {
  3162. moduleType = moduleName[0];
  3163. moduleName = moduleName[1];
  3164. }
  3165. try {
  3166. module = require(moduleName);
  3167. } catch (e) {}
  3168. if (module && !exports.$loading[moduleName])
  3169. return onLoad && onLoad(module);
  3170. if (!exports.$loading[moduleName])
  3171. exports.$loading[moduleName] = [];
  3172. exports.$loading[moduleName].push(onLoad);
  3173. if (exports.$loading[moduleName].length > 1)
  3174. return;
  3175. var afterLoad = function() {
  3176. require([moduleName], function(module) {
  3177. exports._emit("load.module", {name: moduleName, module: module});
  3178. var listeners = exports.$loading[moduleName];
  3179. exports.$loading[moduleName] = null;
  3180. listeners.forEach(function(onLoad) {
  3181. onLoad && onLoad(module);
  3182. });
  3183. });
  3184. };
  3185. if (!exports.get("packaged"))
  3186. return afterLoad();
  3187. net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad);
  3188. };
  3189. init(true);function init(packaged) {
  3190. options.packaged = packaged || require.packaged || module.packaged || (global.define && define.packaged);
  3191. if (!global.document)
  3192. return "";
  3193. var scriptOptions = {};
  3194. var scriptUrl = "";
  3195. var currentScript = (document.currentScript || document._currentScript ); // native or polyfill
  3196. var currentDocument = currentScript && currentScript.ownerDocument || document;
  3197. var scripts = currentDocument.getElementsByTagName("script");
  3198. for (var i=0; i<scripts.length; i++) {
  3199. var script = scripts[i];
  3200. var src = script.src || script.getAttribute("src");
  3201. if (!src)
  3202. continue;
  3203. var attributes = script.attributes;
  3204. for (var j=0, l=attributes.length; j < l; j++) {
  3205. var attr = attributes[j];
  3206. if (attr.name.indexOf("data-ace-") === 0) {
  3207. scriptOptions[deHyphenate(attr.name.replace(/^data-ace-/, ""))] = attr.value;
  3208. }
  3209. }
  3210. var m = src.match(/^(.*)\/ace(\-\w+)?\.js(\?|$)/);
  3211. if (m)
  3212. scriptUrl = m[1];
  3213. }
  3214. if (scriptUrl) {
  3215. scriptOptions.base = scriptOptions.base || scriptUrl;
  3216. scriptOptions.packaged = true;
  3217. }
  3218. scriptOptions.basePath = scriptOptions.base;
  3219. scriptOptions.workerPath = scriptOptions.workerPath || scriptOptions.base;
  3220. scriptOptions.modePath = scriptOptions.modePath || scriptOptions.base;
  3221. scriptOptions.themePath = scriptOptions.themePath || scriptOptions.base;
  3222. delete scriptOptions.base;
  3223. for (var key in scriptOptions)
  3224. if (typeof scriptOptions[key] !== "undefined")
  3225. exports.set(key, scriptOptions[key]);
  3226. };
  3227. exports.init = init;
  3228. function deHyphenate(str) {
  3229. return str.replace(/-(.)/g, function(m, m1) { return m1.toUpperCase(); });
  3230. }
  3231. });
  3232. ace.define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop_handler","ace/config"], function(require, exports, module) {
  3233. "use strict";
  3234. var event = require("../lib/event");
  3235. var useragent = require("../lib/useragent");
  3236. var DefaultHandlers = require("./default_handlers").DefaultHandlers;
  3237. var DefaultGutterHandler = require("./default_gutter_handler").GutterHandler;
  3238. var MouseEvent = require("./mouse_event").MouseEvent;
  3239. var DragdropHandler = require("./dragdrop_handler").DragdropHandler;
  3240. var config = require("../config");
  3241. var MouseHandler = function(editor) {
  3242. var _self = this;
  3243. this.editor = editor;
  3244. new DefaultHandlers(this);
  3245. new DefaultGutterHandler(this);
  3246. new DragdropHandler(this);
  3247. var focusEditor = function(e) {
  3248. if (!document.hasFocus || !document.hasFocus())
  3249. window.focus();
  3250. editor.focus();
  3251. };
  3252. var mouseTarget = editor.renderer.getMouseEventTarget();
  3253. event.addListener(mouseTarget, "click", this.onMouseEvent.bind(this, "click"));
  3254. event.addListener(mouseTarget, "mousemove", this.onMouseMove.bind(this, "mousemove"));
  3255. event.addMultiMouseDownListener(mouseTarget, [400, 300, 250], this, "onMouseEvent");
  3256. if (editor.renderer.scrollBarV) {
  3257. event.addMultiMouseDownListener(editor.renderer.scrollBarV.inner, [400, 300, 250], this, "onMouseEvent");
  3258. event.addMultiMouseDownListener(editor.renderer.scrollBarH.inner, [400, 300, 250], this, "onMouseEvent");
  3259. if (useragent.isIE) {
  3260. event.addListener(editor.renderer.scrollBarV.element, "mousedown", focusEditor);
  3261. event.addListener(editor.renderer.scrollBarH.element, "mousedown", focusEditor);
  3262. }
  3263. }
  3264. event.addMouseWheelListener(editor.container, this.onMouseWheel.bind(this, "mousewheel"));
  3265. var gutterEl = editor.renderer.$gutter;
  3266. event.addListener(gutterEl, "mousedown", this.onMouseEvent.bind(this, "guttermousedown"));
  3267. event.addListener(gutterEl, "click", this.onMouseEvent.bind(this, "gutterclick"));
  3268. event.addListener(gutterEl, "dblclick", this.onMouseEvent.bind(this, "gutterdblclick"));
  3269. event.addListener(gutterEl, "mousemove", this.onMouseEvent.bind(this, "guttermousemove"));
  3270. event.addListener(mouseTarget, "mousedown", focusEditor);
  3271. event.addListener(gutterEl, "mousedown", function(e) {
  3272. editor.focus();
  3273. return event.preventDefault(e);
  3274. });
  3275. editor.on("mousemove", function(e){
  3276. if (_self.state || _self.$dragDelay || !_self.$dragEnabled)
  3277. return;
  3278. var character = editor.renderer.screenToTextCoordinates(e.x, e.y);
  3279. var range = editor.session.selection.getRange();
  3280. var renderer = editor.renderer;
  3281. if (!range.isEmpty() && range.insideStart(character.row, character.column)) {
  3282. renderer.setCursorStyle("default");
  3283. } else {
  3284. renderer.setCursorStyle("");
  3285. }
  3286. });
  3287. };
  3288. (function() {
  3289. this.onMouseEvent = function(name, e) {
  3290. this.editor._emit(name, new MouseEvent(e, this.editor));
  3291. };
  3292. this.onMouseMove = function(name, e) {
  3293. var listeners = this.editor._eventRegistry && this.editor._eventRegistry.mousemove;
  3294. if (!listeners || !listeners.length)
  3295. return;
  3296. this.editor._emit(name, new MouseEvent(e, this.editor));
  3297. };
  3298. this.onMouseWheel = function(name, e) {
  3299. var mouseEvent = new MouseEvent(e, this.editor);
  3300. mouseEvent.speed = this.$scrollSpeed * 2;
  3301. mouseEvent.wheelX = e.wheelX;
  3302. mouseEvent.wheelY = e.wheelY;
  3303. this.editor._emit(name, mouseEvent);
  3304. };
  3305. this.setState = function(state) {
  3306. this.state = state;
  3307. };
  3308. this.captureMouse = function(ev, mouseMoveHandler) {
  3309. this.x = ev.x;
  3310. this.y = ev.y;
  3311. this.isMousePressed = true;
  3312. var renderer = this.editor.renderer;
  3313. if (renderer.$keepTextAreaAtCursor)
  3314. renderer.$keepTextAreaAtCursor = null;
  3315. var self = this;
  3316. var onMouseMove = function(e) {
  3317. if (!e) return;
  3318. if (useragent.isWebKit && !e.which && self.releaseMouse)
  3319. return self.releaseMouse();
  3320. self.x = e.clientX;
  3321. self.y = e.clientY;
  3322. mouseMoveHandler && mouseMoveHandler(e);
  3323. self.mouseEvent = new MouseEvent(e, self.editor);
  3324. self.$mouseMoved = true;
  3325. };
  3326. var onCaptureEnd = function(e) {
  3327. clearInterval(timerId);
  3328. onCaptureInterval();
  3329. self[self.state + "End"] && self[self.state + "End"](e);
  3330. self.state = "";
  3331. if (renderer.$keepTextAreaAtCursor == null) {
  3332. renderer.$keepTextAreaAtCursor = true;
  3333. renderer.$moveTextAreaToCursor();
  3334. }
  3335. self.isMousePressed = false;
  3336. self.$onCaptureMouseMove = self.releaseMouse = null;
  3337. e && self.onMouseEvent("mouseup", e);
  3338. };
  3339. var onCaptureInterval = function() {
  3340. self[self.state] && self[self.state]();
  3341. self.$mouseMoved = false;
  3342. };
  3343. if (useragent.isOldIE && ev.domEvent.type == "dblclick") {
  3344. return setTimeout(function() {onCaptureEnd(ev);});
  3345. }
  3346. self.$onCaptureMouseMove = onMouseMove;
  3347. self.releaseMouse = event.capture(this.editor.container, onMouseMove, onCaptureEnd);
  3348. var timerId = setInterval(onCaptureInterval, 20);
  3349. };
  3350. this.releaseMouse = null;
  3351. this.cancelContextMenu = function() {
  3352. var stop = function(e) {
  3353. if (e && e.domEvent && e.domEvent.type != "contextmenu")
  3354. return;
  3355. this.editor.off("nativecontextmenu", stop);
  3356. if (e && e.domEvent)
  3357. event.stopEvent(e.domEvent);
  3358. }.bind(this);
  3359. setTimeout(stop, 10);
  3360. this.editor.on("nativecontextmenu", stop);
  3361. };
  3362. }).call(MouseHandler.prototype);
  3363. config.defineOptions(MouseHandler.prototype, "mouseHandler", {
  3364. scrollSpeed: {initialValue: 2},
  3365. dragDelay: {initialValue: (useragent.isMac ? 150 : 0)},
  3366. dragEnabled: {initialValue: true},
  3367. focusTimout: {initialValue: 0},
  3368. tooltipFollowsMouse: {initialValue: true}
  3369. });
  3370. exports.MouseHandler = MouseHandler;
  3371. });
  3372. ace.define("ace/mouse/fold_handler",["require","exports","module"], function(require, exports, module) {
  3373. "use strict";
  3374. function FoldHandler(editor) {
  3375. editor.on("click", function(e) {
  3376. var position = e.getDocumentPosition();
  3377. var session = editor.session;
  3378. var fold = session.getFoldAt(position.row, position.column, 1);
  3379. if (fold) {
  3380. if (e.getAccelKey())
  3381. session.removeFold(fold);
  3382. else
  3383. session.expandFold(fold);
  3384. e.stop();
  3385. }
  3386. });
  3387. editor.on("gutterclick", function(e) {
  3388. var gutterRegion = editor.renderer.$gutterLayer.getRegion(e);
  3389. if (gutterRegion == "foldWidgets") {
  3390. var row = e.getDocumentPosition().row;
  3391. var session = editor.session;
  3392. if (session.foldWidgets && session.foldWidgets[row])
  3393. editor.session.onFoldWidgetClick(row, e);
  3394. if (!editor.isFocused())
  3395. editor.focus();
  3396. e.stop();
  3397. }
  3398. });
  3399. editor.on("gutterdblclick", function(e) {
  3400. var gutterRegion = editor.renderer.$gutterLayer.getRegion(e);
  3401. if (gutterRegion == "foldWidgets") {
  3402. var row = e.getDocumentPosition().row;
  3403. var session = editor.session;
  3404. var data = session.getParentFoldRangeData(row, true);
  3405. var range = data.range || data.firstRange;
  3406. if (range) {
  3407. row = range.start.row;
  3408. var fold = session.getFoldAt(row, session.getLine(row).length, 1);
  3409. if (fold) {
  3410. session.removeFold(fold);
  3411. } else {
  3412. session.addFold("...", range);
  3413. editor.renderer.scrollCursorIntoView({row: range.start.row, column: 0});
  3414. }
  3415. }
  3416. e.stop();
  3417. }
  3418. });
  3419. }
  3420. exports.FoldHandler = FoldHandler;
  3421. });
  3422. ace.define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event"], function(require, exports, module) {
  3423. "use strict";
  3424. var keyUtil = require("../lib/keys");
  3425. var event = require("../lib/event");
  3426. var KeyBinding = function(editor) {
  3427. this.$editor = editor;
  3428. this.$data = {editor: editor};
  3429. this.$handlers = [];
  3430. this.setDefaultHandler(editor.commands);
  3431. };
  3432. (function() {
  3433. this.setDefaultHandler = function(kb) {
  3434. this.removeKeyboardHandler(this.$defaultHandler);
  3435. this.$defaultHandler = kb;
  3436. this.addKeyboardHandler(kb, 0);
  3437. };
  3438. this.setKeyboardHandler = function(kb) {
  3439. var h = this.$handlers;
  3440. if (h[h.length - 1] == kb)
  3441. return;
  3442. while (h[h.length - 1] && h[h.length - 1] != this.$defaultHandler)
  3443. this.removeKeyboardHandler(h[h.length - 1]);
  3444. this.addKeyboardHandler(kb, 1);
  3445. };
  3446. this.addKeyboardHandler = function(kb, pos) {
  3447. if (!kb)
  3448. return;
  3449. if (typeof kb == "function" && !kb.handleKeyboard)
  3450. kb.handleKeyboard = kb;
  3451. var i = this.$handlers.indexOf(kb);
  3452. if (i != -1)
  3453. this.$handlers.splice(i, 1);
  3454. if (pos == undefined)
  3455. this.$handlers.push(kb);
  3456. else
  3457. this.$handlers.splice(pos, 0, kb);
  3458. if (i == -1 && kb.attach)
  3459. kb.attach(this.$editor);
  3460. };
  3461. this.removeKeyboardHandler = function(kb) {
  3462. var i = this.$handlers.indexOf(kb);
  3463. if (i == -1)
  3464. return false;
  3465. this.$handlers.splice(i, 1);
  3466. kb.detach && kb.detach(this.$editor);
  3467. return true;
  3468. };
  3469. this.getKeyboardHandler = function() {
  3470. return this.$handlers[this.$handlers.length - 1];
  3471. };
  3472. this.getStatusText = function() {
  3473. var data = this.$data;
  3474. var editor = data.editor;
  3475. return this.$handlers.map(function(h) {
  3476. return h.getStatusText && h.getStatusText(editor, data) || "";
  3477. }).filter(Boolean).join(" ");
  3478. };
  3479. this.$callKeyboardHandlers = function(hashId, keyString, keyCode, e) {
  3480. var toExecute;
  3481. var success = false;
  3482. var commands = this.$editor.commands;
  3483. for (var i = this.$handlers.length; i--;) {
  3484. toExecute = this.$handlers[i].handleKeyboard(
  3485. this.$data, hashId, keyString, keyCode, e
  3486. );
  3487. if (!toExecute || !toExecute.command)
  3488. continue;
  3489. if (toExecute.command == "null") {
  3490. success = true;
  3491. } else {
  3492. success = commands.exec(toExecute.command, this.$editor, toExecute.args, e);
  3493. }
  3494. if (success && e && hashId != -1 &&
  3495. toExecute.passEvent != true && toExecute.command.passEvent != true
  3496. ) {
  3497. event.stopEvent(e);
  3498. }
  3499. if (success)
  3500. break;
  3501. }
  3502. return success;
  3503. };
  3504. this.onCommandKey = function(e, hashId, keyCode) {
  3505. var keyString = keyUtil.keyCodeToString(keyCode);
  3506. this.$callKeyboardHandlers(hashId, keyString, keyCode, e);
  3507. };
  3508. this.onTextInput = function(text) {
  3509. var success = this.$callKeyboardHandlers(-1, text);
  3510. if (!success)
  3511. this.$editor.commands.exec("insertstring", this.$editor, text);
  3512. };
  3513. }).call(KeyBinding.prototype);
  3514. exports.KeyBinding = KeyBinding;
  3515. });
  3516. ace.define("ace/range",["require","exports","module"], function(require, exports, module) {
  3517. "use strict";
  3518. var comparePoints = function(p1, p2) {
  3519. return p1.row - p2.row || p1.column - p2.column;
  3520. };
  3521. var Range = function(startRow, startColumn, endRow, endColumn) {
  3522. this.start = {
  3523. row: startRow,
  3524. column: startColumn
  3525. };
  3526. this.end = {
  3527. row: endRow,
  3528. column: endColumn
  3529. };
  3530. };
  3531. (function() {
  3532. this.isEqual = function(range) {
  3533. return this.start.row === range.start.row &&
  3534. this.end.row === range.end.row &&
  3535. this.start.column === range.start.column &&
  3536. this.end.column === range.end.column;
  3537. };
  3538. this.toString = function() {
  3539. return ("Range: [" + this.start.row + "/" + this.start.column +
  3540. "] -> [" + this.end.row + "/" + this.end.column + "]");
  3541. };
  3542. this.contains = function(row, column) {
  3543. return this.compare(row, column) == 0;
  3544. };
  3545. this.compareRange = function(range) {
  3546. var cmp,
  3547. end = range.end,
  3548. start = range.start;
  3549. cmp = this.compare(end.row, end.column);
  3550. if (cmp == 1) {
  3551. cmp = this.compare(start.row, start.column);
  3552. if (cmp == 1) {
  3553. return 2;
  3554. } else if (cmp == 0) {
  3555. return 1;
  3556. } else {
  3557. return 0;
  3558. }
  3559. } else if (cmp == -1) {
  3560. return -2;
  3561. } else {
  3562. cmp = this.compare(start.row, start.column);
  3563. if (cmp == -1) {
  3564. return -1;
  3565. } else if (cmp == 1) {
  3566. return 42;
  3567. } else {
  3568. return 0;
  3569. }
  3570. }
  3571. };
  3572. this.comparePoint = function(p) {
  3573. return this.compare(p.row, p.column);
  3574. };
  3575. this.containsRange = function(range) {
  3576. return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;
  3577. };
  3578. this.intersects = function(range) {
  3579. var cmp = this.compareRange(range);
  3580. return (cmp == -1 || cmp == 0 || cmp == 1);
  3581. };
  3582. this.isEnd = function(row, column) {
  3583. return this.end.row == row && this.end.column == column;
  3584. };
  3585. this.isStart = function(row, column) {
  3586. return this.start.row == row && this.start.column == column;
  3587. };
  3588. this.setStart = function(row, column) {
  3589. if (typeof row == "object") {
  3590. this.start.column = row.column;
  3591. this.start.row = row.row;
  3592. } else {
  3593. this.start.row = row;
  3594. this.start.column = column;
  3595. }
  3596. };
  3597. this.setEnd = function(row, column) {
  3598. if (typeof row == "object") {
  3599. this.end.column = row.column;
  3600. this.end.row = row.row;
  3601. } else {
  3602. this.end.row = row;
  3603. this.end.column = column;
  3604. }
  3605. };
  3606. this.inside = function(row, column) {
  3607. if (this.compare(row, column) == 0) {
  3608. if (this.isEnd(row, column) || this.isStart(row, column)) {
  3609. return false;
  3610. } else {
  3611. return true;
  3612. }
  3613. }
  3614. return false;
  3615. };
  3616. this.insideStart = function(row, column) {
  3617. if (this.compare(row, column) == 0) {
  3618. if (this.isEnd(row, column)) {
  3619. return false;
  3620. } else {
  3621. return true;
  3622. }
  3623. }
  3624. return false;
  3625. };
  3626. this.insideEnd = function(row, column) {
  3627. if (this.compare(row, column) == 0) {
  3628. if (this.isStart(row, column)) {
  3629. return false;
  3630. } else {
  3631. return true;
  3632. }
  3633. }
  3634. return false;
  3635. };
  3636. this.compare = function(row, column) {
  3637. if (!this.isMultiLine()) {
  3638. if (row === this.start.row) {
  3639. return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);
  3640. };
  3641. }
  3642. if (row < this.start.row)
  3643. return -1;
  3644. if (row > this.end.row)
  3645. return 1;
  3646. if (this.start.row === row)
  3647. return column >= this.start.column ? 0 : -1;
  3648. if (this.end.row === row)
  3649. return column <= this.end.column ? 0 : 1;
  3650. return 0;
  3651. };
  3652. this.compareStart = function(row, column) {
  3653. if (this.start.row == row && this.start.column == column) {
  3654. return -1;
  3655. } else {
  3656. return this.compare(row, column);
  3657. }
  3658. };
  3659. this.compareEnd = function(row, column) {
  3660. if (this.end.row == row && this.end.column == column) {
  3661. return 1;
  3662. } else {
  3663. return this.compare(row, column);
  3664. }
  3665. };
  3666. this.compareInside = function(row, column) {
  3667. if (this.end.row == row && this.end.column == column) {
  3668. return 1;
  3669. } else if (this.start.row == row && this.start.column == column) {
  3670. return -1;
  3671. } else {
  3672. return this.compare(row, column);
  3673. }
  3674. };
  3675. this.clipRows = function(firstRow, lastRow) {
  3676. if (this.end.row > lastRow)
  3677. var end = {row: lastRow + 1, column: 0};
  3678. else if (this.end.row < firstRow)
  3679. var end = {row: firstRow, column: 0};
  3680. if (this.start.row > lastRow)
  3681. var start = {row: lastRow + 1, column: 0};
  3682. else if (this.start.row < firstRow)
  3683. var start = {row: firstRow, column: 0};
  3684. return Range.fromPoints(start || this.start, end || this.end);
  3685. };
  3686. this.extend = function(row, column) {
  3687. var cmp = this.compare(row, column);
  3688. if (cmp == 0)
  3689. return this;
  3690. else if (cmp == -1)
  3691. var start = {row: row, column: column};
  3692. else
  3693. var end = {row: row, column: column};
  3694. return Range.fromPoints(start || this.start, end || this.end);
  3695. };
  3696. this.isEmpty = function() {
  3697. return (this.start.row === this.end.row && this.start.column === this.end.column);
  3698. };
  3699. this.isMultiLine = function() {
  3700. return (this.start.row !== this.end.row);
  3701. };
  3702. this.clone = function() {
  3703. return Range.fromPoints(this.start, this.end);
  3704. };
  3705. this.collapseRows = function() {
  3706. if (this.end.column == 0)
  3707. return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0)
  3708. else
  3709. return new Range(this.start.row, 0, this.end.row, 0)
  3710. };
  3711. this.toScreenRange = function(session) {
  3712. var screenPosStart = session.documentToScreenPosition(this.start);
  3713. var screenPosEnd = session.documentToScreenPosition(this.end);
  3714. return new Range(
  3715. screenPosStart.row, screenPosStart.column,
  3716. screenPosEnd.row, screenPosEnd.column
  3717. );
  3718. };
  3719. this.moveBy = function(row, column) {
  3720. this.start.row += row;
  3721. this.start.column += column;
  3722. this.end.row += row;
  3723. this.end.column += column;
  3724. };
  3725. }).call(Range.prototype);
  3726. Range.fromPoints = function(start, end) {
  3727. return new Range(start.row, start.column, end.row, end.column);
  3728. };
  3729. Range.comparePoints = comparePoints;
  3730. Range.comparePoints = function(p1, p2) {
  3731. return p1.row - p2.row || p1.column - p2.column;
  3732. };
  3733. exports.Range = Range;
  3734. });
  3735. ace.define("ace/selection",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/range"], function(require, exports, module) {
  3736. "use strict";
  3737. var oop = require("./lib/oop");
  3738. var lang = require("./lib/lang");
  3739. var EventEmitter = require("./lib/event_emitter").EventEmitter;
  3740. var Range = require("./range").Range;
  3741. var Selection = function(session) {
  3742. this.session = session;
  3743. this.doc = session.getDocument();
  3744. this.clearSelection();
  3745. this.lead = this.selectionLead = this.doc.createAnchor(0, 0);
  3746. this.anchor = this.selectionAnchor = this.doc.createAnchor(0, 0);
  3747. var self = this;
  3748. this.lead.on("change", function(e) {
  3749. self._emit("changeCursor");
  3750. if (!self.$isEmpty)
  3751. self._emit("changeSelection");
  3752. if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column)
  3753. self.$desiredColumn = null;
  3754. });
  3755. this.selectionAnchor.on("change", function() {
  3756. if (!self.$isEmpty)
  3757. self._emit("changeSelection");
  3758. });
  3759. };
  3760. (function() {
  3761. oop.implement(this, EventEmitter);
  3762. this.isEmpty = function() {
  3763. return (this.$isEmpty || (
  3764. this.anchor.row == this.lead.row &&
  3765. this.anchor.column == this.lead.column
  3766. ));
  3767. };
  3768. this.isMultiLine = function() {
  3769. if (this.isEmpty()) {
  3770. return false;
  3771. }
  3772. return this.getRange().isMultiLine();
  3773. };
  3774. this.getCursor = function() {
  3775. return this.lead.getPosition();
  3776. };
  3777. this.setSelectionAnchor = function(row, column) {
  3778. this.anchor.setPosition(row, column);
  3779. if (this.$isEmpty) {
  3780. this.$isEmpty = false;
  3781. this._emit("changeSelection");
  3782. }
  3783. };
  3784. this.getSelectionAnchor = function() {
  3785. if (this.$isEmpty)
  3786. return this.getSelectionLead();
  3787. else
  3788. return this.anchor.getPosition();
  3789. };
  3790. this.getSelectionLead = function() {
  3791. return this.lead.getPosition();
  3792. };
  3793. this.shiftSelection = function(columns) {
  3794. if (this.$isEmpty) {
  3795. this.moveCursorTo(this.lead.row, this.lead.column + columns);
  3796. return;
  3797. }
  3798. var anchor = this.getSelectionAnchor();
  3799. var lead = this.getSelectionLead();
  3800. var isBackwards = this.isBackwards();
  3801. if (!isBackwards || anchor.column !== 0)
  3802. this.setSelectionAnchor(anchor.row, anchor.column + columns);
  3803. if (isBackwards || lead.column !== 0) {
  3804. this.$moveSelection(function() {
  3805. this.moveCursorTo(lead.row, lead.column + columns);
  3806. });
  3807. }
  3808. };
  3809. this.isBackwards = function() {
  3810. var anchor = this.anchor;
  3811. var lead = this.lead;
  3812. return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column));
  3813. };
  3814. this.getRange = function() {
  3815. var anchor = this.anchor;
  3816. var lead = this.lead;
  3817. if (this.isEmpty())
  3818. return Range.fromPoints(lead, lead);
  3819. if (this.isBackwards()) {
  3820. return Range.fromPoints(lead, anchor);
  3821. }
  3822. else {
  3823. return Range.fromPoints(anchor, lead);
  3824. }
  3825. };
  3826. this.clearSelection = function() {
  3827. if (!this.$isEmpty) {
  3828. this.$isEmpty = true;
  3829. this._emit("changeSelection");
  3830. }
  3831. };
  3832. this.selectAll = function() {
  3833. var lastRow = this.doc.getLength() - 1;
  3834. this.setSelectionAnchor(0, 0);
  3835. this.moveCursorTo(lastRow, this.doc.getLine(lastRow).length);
  3836. };
  3837. this.setRange =
  3838. this.setSelectionRange = function(range, reverse) {
  3839. if (reverse) {
  3840. this.setSelectionAnchor(range.end.row, range.end.column);
  3841. this.selectTo(range.start.row, range.start.column);
  3842. } else {
  3843. this.setSelectionAnchor(range.start.row, range.start.column);
  3844. this.selectTo(range.end.row, range.end.column);
  3845. }
  3846. if (this.getRange().isEmpty())
  3847. this.$isEmpty = true;
  3848. this.$desiredColumn = null;
  3849. };
  3850. this.$moveSelection = function(mover) {
  3851. var lead = this.lead;
  3852. if (this.$isEmpty)
  3853. this.setSelectionAnchor(lead.row, lead.column);
  3854. mover.call(this);
  3855. };
  3856. this.selectTo = function(row, column) {
  3857. this.$moveSelection(function() {
  3858. this.moveCursorTo(row, column);
  3859. });
  3860. };
  3861. this.selectToPosition = function(pos) {
  3862. this.$moveSelection(function() {
  3863. this.moveCursorToPosition(pos);
  3864. });
  3865. };
  3866. this.moveTo = function(row, column) {
  3867. this.clearSelection();
  3868. this.moveCursorTo(row, column);
  3869. };
  3870. this.moveToPosition = function(pos) {
  3871. this.clearSelection();
  3872. this.moveCursorToPosition(pos);
  3873. };
  3874. this.selectUp = function() {
  3875. this.$moveSelection(this.moveCursorUp);
  3876. };
  3877. this.selectDown = function() {
  3878. this.$moveSelection(this.moveCursorDown);
  3879. };
  3880. this.selectRight = function() {
  3881. this.$moveSelection(this.moveCursorRight);
  3882. };
  3883. this.selectLeft = function() {
  3884. this.$moveSelection(this.moveCursorLeft);
  3885. };
  3886. this.selectLineStart = function() {
  3887. this.$moveSelection(this.moveCursorLineStart);
  3888. };
  3889. this.selectLineEnd = function() {
  3890. this.$moveSelection(this.moveCursorLineEnd);
  3891. };
  3892. this.selectFileEnd = function() {
  3893. this.$moveSelection(this.moveCursorFileEnd);
  3894. };
  3895. this.selectFileStart = function() {
  3896. this.$moveSelection(this.moveCursorFileStart);
  3897. };
  3898. this.selectWordRight = function() {
  3899. this.$moveSelection(this.moveCursorWordRight);
  3900. };
  3901. this.selectWordLeft = function() {
  3902. this.$moveSelection(this.moveCursorWordLeft);
  3903. };
  3904. this.getWordRange = function(row, column) {
  3905. if (typeof column == "undefined") {
  3906. var cursor = row || this.lead;
  3907. row = cursor.row;
  3908. column = cursor.column;
  3909. }
  3910. return this.session.getWordRange(row, column);
  3911. };
  3912. this.selectWord = function() {
  3913. this.setSelectionRange(this.getWordRange());
  3914. };
  3915. this.selectAWord = function() {
  3916. var cursor = this.getCursor();
  3917. var range = this.session.getAWordRange(cursor.row, cursor.column);
  3918. this.setSelectionRange(range);
  3919. };
  3920. this.getLineRange = function(row, excludeLastChar) {
  3921. var rowStart = typeof row == "number" ? row : this.lead.row;
  3922. var rowEnd;
  3923. var foldLine = this.session.getFoldLine(rowStart);
  3924. if (foldLine) {
  3925. rowStart = foldLine.start.row;
  3926. rowEnd = foldLine.end.row;
  3927. } else {
  3928. rowEnd = rowStart;
  3929. }
  3930. if (excludeLastChar === true)
  3931. return new Range(rowStart, 0, rowEnd, this.session.getLine(rowEnd).length);
  3932. else
  3933. return new Range(rowStart, 0, rowEnd + 1, 0);
  3934. };
  3935. this.selectLine = function() {
  3936. this.setSelectionRange(this.getLineRange());
  3937. };
  3938. this.moveCursorUp = function() {
  3939. this.moveCursorBy(-1, 0);
  3940. };
  3941. this.moveCursorDown = function() {
  3942. this.moveCursorBy(1, 0);
  3943. };
  3944. this.moveCursorLeft = function() {
  3945. var cursor = this.lead.getPosition(),
  3946. fold;
  3947. if (fold = this.session.getFoldAt(cursor.row, cursor.column, -1)) {
  3948. this.moveCursorTo(fold.start.row, fold.start.column);
  3949. } else if (cursor.column === 0) {
  3950. if (cursor.row > 0) {
  3951. this.moveCursorTo(cursor.row - 1, this.doc.getLine(cursor.row - 1).length);
  3952. }
  3953. }
  3954. else {
  3955. var tabSize = this.session.getTabSize();
  3956. if (this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(cursor.column-tabSize, cursor.column).split(" ").length-1 == tabSize)
  3957. this.moveCursorBy(0, -tabSize);
  3958. else
  3959. this.moveCursorBy(0, -1);
  3960. }
  3961. };
  3962. this.moveCursorRight = function() {
  3963. var cursor = this.lead.getPosition(),
  3964. fold;
  3965. if (fold = this.session.getFoldAt(cursor.row, cursor.column, 1)) {
  3966. this.moveCursorTo(fold.end.row, fold.end.column);
  3967. }
  3968. else if (this.lead.column == this.doc.getLine(this.lead.row).length) {
  3969. if (this.lead.row < this.doc.getLength() - 1) {
  3970. this.moveCursorTo(this.lead.row + 1, 0);
  3971. }
  3972. }
  3973. else {
  3974. var tabSize = this.session.getTabSize();
  3975. var cursor = this.lead;
  3976. if (this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(cursor.column, cursor.column+tabSize).split(" ").length-1 == tabSize)
  3977. this.moveCursorBy(0, tabSize);
  3978. else
  3979. this.moveCursorBy(0, 1);
  3980. }
  3981. };
  3982. this.moveCursorLineStart = function() {
  3983. var row = this.lead.row;
  3984. var column = this.lead.column;
  3985. var screenRow = this.session.documentToScreenRow(row, column);
  3986. var firstColumnPosition = this.session.screenToDocumentPosition(screenRow, 0);
  3987. var beforeCursor = this.session.getDisplayLine(
  3988. row, null, firstColumnPosition.row,
  3989. firstColumnPosition.column
  3990. );
  3991. var leadingSpace = beforeCursor.match(/^\s*/);
  3992. if (leadingSpace[0].length != column && !this.session.$useEmacsStyleLineStart)
  3993. firstColumnPosition.column += leadingSpace[0].length;
  3994. this.moveCursorToPosition(firstColumnPosition);
  3995. };
  3996. this.moveCursorLineEnd = function() {
  3997. var lead = this.lead;
  3998. var lineEnd = this.session.getDocumentLastRowColumnPosition(lead.row, lead.column);
  3999. if (this.lead.column == lineEnd.column) {
  4000. var line = this.session.getLine(lineEnd.row);
  4001. if (lineEnd.column == line.length) {
  4002. var textEnd = line.search(/\s+$/);
  4003. if (textEnd > 0)
  4004. lineEnd.column = textEnd;
  4005. }
  4006. }
  4007. this.moveCursorTo(lineEnd.row, lineEnd.column);
  4008. };
  4009. this.moveCursorFileEnd = function() {
  4010. var row = this.doc.getLength() - 1;
  4011. var column = this.doc.getLine(row).length;
  4012. this.moveCursorTo(row, column);
  4013. };
  4014. this.moveCursorFileStart = function() {
  4015. this.moveCursorTo(0, 0);
  4016. };
  4017. this.moveCursorLongWordRight = function() {
  4018. var row = this.lead.row;
  4019. var column = this.lead.column;
  4020. var line = this.doc.getLine(row);
  4021. var rightOfCursor = line.substring(column);
  4022. var match;
  4023. this.session.nonTokenRe.lastIndex = 0;
  4024. this.session.tokenRe.lastIndex = 0;
  4025. var fold = this.session.getFoldAt(row, column, 1);
  4026. if (fold) {
  4027. this.moveCursorTo(fold.end.row, fold.end.column);
  4028. return;
  4029. }
  4030. if (match = this.session.nonTokenRe.exec(rightOfCursor)) {
  4031. column += this.session.nonTokenRe.lastIndex;
  4032. this.session.nonTokenRe.lastIndex = 0;
  4033. rightOfCursor = line.substring(column);
  4034. }
  4035. if (column >= line.length) {
  4036. this.moveCursorTo(row, line.length);
  4037. this.moveCursorRight();
  4038. if (row < this.doc.getLength() - 1)
  4039. this.moveCursorWordRight();
  4040. return;
  4041. }
  4042. if (match = this.session.tokenRe.exec(rightOfCursor)) {
  4043. column += this.session.tokenRe.lastIndex;
  4044. this.session.tokenRe.lastIndex = 0;
  4045. }
  4046. this.moveCursorTo(row, column);
  4047. };
  4048. this.moveCursorLongWordLeft = function() {
  4049. var row = this.lead.row;
  4050. var column = this.lead.column;
  4051. var fold;
  4052. if (fold = this.session.getFoldAt(row, column, -1)) {
  4053. this.moveCursorTo(fold.start.row, fold.start.column);
  4054. return;
  4055. }
  4056. var str = this.session.getFoldStringAt(row, column, -1);
  4057. if (str == null) {
  4058. str = this.doc.getLine(row).substring(0, column);
  4059. }
  4060. var leftOfCursor = lang.stringReverse(str);
  4061. var match;
  4062. this.session.nonTokenRe.lastIndex = 0;
  4063. this.session.tokenRe.lastIndex = 0;
  4064. if (match = this.session.nonTokenRe.exec(leftOfCursor)) {
  4065. column -= this.session.nonTokenRe.lastIndex;
  4066. leftOfCursor = leftOfCursor.slice(this.session.nonTokenRe.lastIndex);
  4067. this.session.nonTokenRe.lastIndex = 0;
  4068. }
  4069. if (column <= 0) {
  4070. this.moveCursorTo(row, 0);
  4071. this.moveCursorLeft();
  4072. if (row > 0)
  4073. this.moveCursorWordLeft();
  4074. return;
  4075. }
  4076. if (match = this.session.tokenRe.exec(leftOfCursor)) {
  4077. column -= this.session.tokenRe.lastIndex;
  4078. this.session.tokenRe.lastIndex = 0;
  4079. }
  4080. this.moveCursorTo(row, column);
  4081. };
  4082. this.$shortWordEndIndex = function(rightOfCursor) {
  4083. var match, index = 0, ch;
  4084. var whitespaceRe = /\s/;
  4085. var tokenRe = this.session.tokenRe;
  4086. tokenRe.lastIndex = 0;
  4087. if (match = this.session.tokenRe.exec(rightOfCursor)) {
  4088. index = this.session.tokenRe.lastIndex;
  4089. } else {
  4090. while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))
  4091. index ++;
  4092. if (index < 1) {
  4093. tokenRe.lastIndex = 0;
  4094. while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) {
  4095. tokenRe.lastIndex = 0;
  4096. index ++;
  4097. if (whitespaceRe.test(ch)) {
  4098. if (index > 2) {
  4099. index--;
  4100. break;
  4101. } else {
  4102. while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))
  4103. index ++;
  4104. if (index > 2)
  4105. break;
  4106. }
  4107. }
  4108. }
  4109. }
  4110. }
  4111. tokenRe.lastIndex = 0;
  4112. return index;
  4113. };
  4114. this.moveCursorShortWordRight = function() {
  4115. var row = this.lead.row;
  4116. var column = this.lead.column;
  4117. var line = this.doc.getLine(row);
  4118. var rightOfCursor = line.substring(column);
  4119. var fold = this.session.getFoldAt(row, column, 1);
  4120. if (fold)
  4121. return this.moveCursorTo(fold.end.row, fold.end.column);
  4122. if (column == line.length) {
  4123. var l = this.doc.getLength();
  4124. do {
  4125. row++;
  4126. rightOfCursor = this.doc.getLine(row);
  4127. } while (row < l && /^\s*$/.test(rightOfCursor));
  4128. if (!/^\s+/.test(rightOfCursor))
  4129. rightOfCursor = "";
  4130. column = 0;
  4131. }
  4132. var index = this.$shortWordEndIndex(rightOfCursor);
  4133. this.moveCursorTo(row, column + index);
  4134. };
  4135. this.moveCursorShortWordLeft = function() {
  4136. var row = this.lead.row;
  4137. var column = this.lead.column;
  4138. var fold;
  4139. if (fold = this.session.getFoldAt(row, column, -1))
  4140. return this.moveCursorTo(fold.start.row, fold.start.column);
  4141. var line = this.session.getLine(row).substring(0, column);
  4142. if (column === 0) {
  4143. do {
  4144. row--;
  4145. line = this.doc.getLine(row);
  4146. } while (row > 0 && /^\s*$/.test(line));
  4147. column = line.length;
  4148. if (!/\s+$/.test(line))
  4149. line = "";
  4150. }
  4151. var leftOfCursor = lang.stringReverse(line);
  4152. var index = this.$shortWordEndIndex(leftOfCursor);
  4153. return this.moveCursorTo(row, column - index);
  4154. };
  4155. this.moveCursorWordRight = function() {
  4156. if (this.session.$selectLongWords)
  4157. this.moveCursorLongWordRight();
  4158. else
  4159. this.moveCursorShortWordRight();
  4160. };
  4161. this.moveCursorWordLeft = function() {
  4162. if (this.session.$selectLongWords)
  4163. this.moveCursorLongWordLeft();
  4164. else
  4165. this.moveCursorShortWordLeft();
  4166. };
  4167. this.moveCursorBy = function(rows, chars) {
  4168. var screenPos = this.session.documentToScreenPosition(
  4169. this.lead.row,
  4170. this.lead.column
  4171. );
  4172. if (chars === 0) {
  4173. if (this.$desiredColumn)
  4174. screenPos.column = this.$desiredColumn;
  4175. else
  4176. this.$desiredColumn = screenPos.column;
  4177. }
  4178. var docPos = this.session.screenToDocumentPosition(screenPos.row + rows, screenPos.column);
  4179. if (rows !== 0 && chars === 0 && docPos.row === this.lead.row && docPos.column === this.lead.column) {
  4180. if (this.session.lineWidgets && this.session.lineWidgets[docPos.row])
  4181. docPos.row++;
  4182. }
  4183. this.moveCursorTo(docPos.row, docPos.column + chars, chars === 0);
  4184. };
  4185. this.moveCursorToPosition = function(position) {
  4186. this.moveCursorTo(position.row, position.column);
  4187. };
  4188. this.moveCursorTo = function(row, column, keepDesiredColumn) {
  4189. var fold = this.session.getFoldAt(row, column, 1);
  4190. if (fold) {
  4191. row = fold.start.row;
  4192. column = fold.start.column;
  4193. }
  4194. this.$keepDesiredColumnOnChange = true;
  4195. this.lead.setPosition(row, column);
  4196. this.$keepDesiredColumnOnChange = false;
  4197. if (!keepDesiredColumn)
  4198. this.$desiredColumn = null;
  4199. };
  4200. this.moveCursorToScreen = function(row, column, keepDesiredColumn) {
  4201. var pos = this.session.screenToDocumentPosition(row, column);
  4202. this.moveCursorTo(pos.row, pos.column, keepDesiredColumn);
  4203. };
  4204. this.detach = function() {
  4205. this.lead.detach();
  4206. this.anchor.detach();
  4207. this.session = this.doc = null;
  4208. };
  4209. this.fromOrientedRange = function(range) {
  4210. this.setSelectionRange(range, range.cursor == range.start);
  4211. this.$desiredColumn = range.desiredColumn || this.$desiredColumn;
  4212. };
  4213. this.toOrientedRange = function(range) {
  4214. var r = this.getRange();
  4215. if (range) {
  4216. range.start.column = r.start.column;
  4217. range.start.row = r.start.row;
  4218. range.end.column = r.end.column;
  4219. range.end.row = r.end.row;
  4220. } else {
  4221. range = r;
  4222. }
  4223. range.cursor = this.isBackwards() ? range.start : range.end;
  4224. range.desiredColumn = this.$desiredColumn;
  4225. return range;
  4226. };
  4227. this.getRangeOfMovements = function(func) {
  4228. var start = this.getCursor();
  4229. try {
  4230. func.call(null, this);
  4231. var end = this.getCursor();
  4232. return Range.fromPoints(start,end);
  4233. } catch(e) {
  4234. return Range.fromPoints(start,start);
  4235. } finally {
  4236. this.moveCursorToPosition(start);
  4237. }
  4238. };
  4239. this.toJSON = function() {
  4240. if (this.rangeCount) {
  4241. var data = this.ranges.map(function(r) {
  4242. var r1 = r.clone();
  4243. r1.isBackwards = r.cursor == r.start;
  4244. return r1;
  4245. });
  4246. } else {
  4247. var data = this.getRange();
  4248. data.isBackwards = this.isBackwards();
  4249. }
  4250. return data;
  4251. };
  4252. this.fromJSON = function(data) {
  4253. if (data.start == undefined) {
  4254. if (this.rangeList) {
  4255. this.toSingleRange(data[0]);
  4256. for (var i = data.length; i--; ) {
  4257. var r = Range.fromPoints(data[i].start, data[i].end);
  4258. if (data.isBackwards)
  4259. r.cursor = r.start;
  4260. this.addRange(r, true);
  4261. }
  4262. return;
  4263. } else
  4264. data = data[0];
  4265. }
  4266. if (this.rangeList)
  4267. this.toSingleRange(data);
  4268. this.setSelectionRange(data, data.isBackwards);
  4269. };
  4270. this.isEqual = function(data) {
  4271. if ((data.length || this.rangeCount) && data.length != this.rangeCount)
  4272. return false;
  4273. if (!data.length || !this.ranges)
  4274. return this.getRange().isEqual(data);
  4275. for (var i = this.ranges.length; i--; ) {
  4276. if (!this.ranges[i].isEqual(data[i]))
  4277. return false;
  4278. }
  4279. return true;
  4280. };
  4281. }).call(Selection.prototype);
  4282. exports.Selection = Selection;
  4283. });
  4284. ace.define("ace/tokenizer",["require","exports","module","ace/config"], function(require, exports, module) {
  4285. "use strict";
  4286. var config = require("./config");
  4287. var MAX_TOKEN_COUNT = 2000;
  4288. var Tokenizer = function(rules) {
  4289. this.states = rules;
  4290. this.regExps = {};
  4291. this.matchMappings = {};
  4292. for (var key in this.states) {
  4293. var state = this.states[key];
  4294. var ruleRegExps = [];
  4295. var matchTotal = 0;
  4296. var mapping = this.matchMappings[key] = {defaultToken: "text"};
  4297. var flag = "g";
  4298. var splitterRurles = [];
  4299. for (var i = 0; i < state.length; i++) {
  4300. var rule = state[i];
  4301. if (rule.defaultToken)
  4302. mapping.defaultToken = rule.defaultToken;
  4303. if (rule.caseInsensitive)
  4304. flag = "gi";
  4305. if (rule.regex == null)
  4306. continue;
  4307. if (rule.regex instanceof RegExp)
  4308. rule.regex = rule.regex.toString().slice(1, -1);
  4309. var adjustedregex = rule.regex;
  4310. var matchcount = new RegExp("(?:(" + adjustedregex + ")|(.))").exec("a").length - 2;
  4311. if (Array.isArray(rule.token)) {
  4312. if (rule.token.length == 1 || matchcount == 1) {
  4313. rule.token = rule.token[0];
  4314. } else if (matchcount - 1 != rule.token.length) {
  4315. this.reportError("number of classes and regexp groups doesn't match", {
  4316. rule: rule,
  4317. groupCount: matchcount - 1
  4318. });
  4319. rule.token = rule.token[0];
  4320. } else {
  4321. rule.tokenArray = rule.token;
  4322. rule.token = null;
  4323. rule.onMatch = this.$arrayTokens;
  4324. }
  4325. } else if (typeof rule.token == "function" && !rule.onMatch) {
  4326. if (matchcount > 1)
  4327. rule.onMatch = this.$applyToken;
  4328. else
  4329. rule.onMatch = rule.token;
  4330. }
  4331. if (matchcount > 1) {
  4332. if (/\\\d/.test(rule.regex)) {
  4333. adjustedregex = rule.regex.replace(/\\([0-9]+)/g, function(match, digit) {
  4334. return "\\" + (parseInt(digit, 10) + matchTotal + 1);
  4335. });
  4336. } else {
  4337. matchcount = 1;
  4338. adjustedregex = this.removeCapturingGroups(rule.regex);
  4339. }
  4340. if (!rule.splitRegex && typeof rule.token != "string")
  4341. splitterRurles.push(rule); // flag will be known only at the very end
  4342. }
  4343. mapping[matchTotal] = i;
  4344. matchTotal += matchcount;
  4345. ruleRegExps.push(adjustedregex);
  4346. if (!rule.onMatch)
  4347. rule.onMatch = null;
  4348. }
  4349. if (!ruleRegExps.length) {
  4350. mapping[0] = 0;
  4351. ruleRegExps.push("$");
  4352. }
  4353. splitterRurles.forEach(function(rule) {
  4354. rule.splitRegex = this.createSplitterRegexp(rule.regex, flag);
  4355. }, this);
  4356. this.regExps[key] = new RegExp("(" + ruleRegExps.join(")|(") + ")|($)", flag);
  4357. }
  4358. };
  4359. (function() {
  4360. this.$setMaxTokenCount = function(m) {
  4361. MAX_TOKEN_COUNT = m | 0;
  4362. };
  4363. this.$applyToken = function(str) {
  4364. var values = this.splitRegex.exec(str).slice(1);
  4365. var types = this.token.apply(this, values);
  4366. if (typeof types === "string")
  4367. return [{type: types, value: str}];
  4368. var tokens = [];
  4369. for (var i = 0, l = types.length; i < l; i++) {
  4370. if (values[i])
  4371. tokens[tokens.length] = {
  4372. type: types[i],
  4373. value: values[i]
  4374. };
  4375. }
  4376. return tokens;
  4377. },
  4378. this.$arrayTokens = function(str) {
  4379. if (!str)
  4380. return [];
  4381. var values = this.splitRegex.exec(str);
  4382. if (!values)
  4383. return "text";
  4384. var tokens = [];
  4385. var types = this.tokenArray;
  4386. for (var i = 0, l = types.length; i < l; i++) {
  4387. if (values[i + 1])
  4388. tokens[tokens.length] = {
  4389. type: types[i],
  4390. value: values[i + 1]
  4391. };
  4392. }
  4393. return tokens;
  4394. };
  4395. this.removeCapturingGroups = function(src) {
  4396. var r = src.replace(
  4397. /\[(?:\\.|[^\]])*?\]|\\.|\(\?[:=!]|(\()/g,
  4398. function(x, y) {return y ? "(?:" : x;}
  4399. );
  4400. return r;
  4401. };
  4402. this.createSplitterRegexp = function(src, flag) {
  4403. if (src.indexOf("(?=") != -1) {
  4404. var stack = 0;
  4405. var inChClass = false;
  4406. var lastCapture = {};
  4407. src.replace(/(\\.)|(\((?:\?[=!])?)|(\))|([\[\]])/g, function(
  4408. m, esc, parenOpen, parenClose, square, index
  4409. ) {
  4410. if (inChClass) {
  4411. inChClass = square != "]";
  4412. } else if (square) {
  4413. inChClass = true;
  4414. } else if (parenClose) {
  4415. if (stack == lastCapture.stack) {
  4416. lastCapture.end = index+1;
  4417. lastCapture.stack = -1;
  4418. }
  4419. stack--;
  4420. } else if (parenOpen) {
  4421. stack++;
  4422. if (parenOpen.length != 1) {
  4423. lastCapture.stack = stack
  4424. lastCapture.start = index;
  4425. }
  4426. }
  4427. return m;
  4428. });
  4429. if (lastCapture.end != null && /^\)*$/.test(src.substr(lastCapture.end)))
  4430. src = src.substring(0, lastCapture.start) + src.substr(lastCapture.end);
  4431. }
  4432. return new RegExp(src, (flag||"").replace("g", ""));
  4433. };
  4434. this.getLineTokens = function(line, startState) {
  4435. if (startState && typeof startState != "string") {
  4436. var stack = startState.slice(0);
  4437. startState = stack[0];
  4438. if (startState === "#tmp") {
  4439. stack.shift()
  4440. startState = stack.shift()
  4441. }
  4442. } else
  4443. var stack = [];
  4444. var currentState = startState || "start";
  4445. var state = this.states[currentState];
  4446. if (!state) {
  4447. currentState = "start";
  4448. state = this.states[currentState];
  4449. }
  4450. var mapping = this.matchMappings[currentState];
  4451. var re = this.regExps[currentState];
  4452. re.lastIndex = 0;
  4453. var match, tokens = [];
  4454. var lastIndex = 0;
  4455. var matchAttempts = 0;
  4456. var token = {type: null, value: ""};
  4457. while (match = re.exec(line)) {
  4458. var type = mapping.defaultToken;
  4459. var rule = null;
  4460. var value = match[0];
  4461. var index = re.lastIndex;
  4462. if (index - value.length > lastIndex) {
  4463. var skipped = line.substring(lastIndex, index - value.length);
  4464. if (token.type == type) {
  4465. token.value += skipped;
  4466. } else {
  4467. if (token.type)
  4468. tokens.push(token);
  4469. token = {type: type, value: skipped};
  4470. }
  4471. }
  4472. for (var i = 0; i < match.length-2; i++) {
  4473. if (match[i + 1] === undefined)
  4474. continue;
  4475. rule = state[mapping[i]];
  4476. if (rule.onMatch)
  4477. type = rule.onMatch(value, currentState, stack);
  4478. else
  4479. type = rule.token;
  4480. if (rule.next) {
  4481. if (typeof rule.next == "string") {
  4482. currentState = rule.next;
  4483. } else {
  4484. currentState = rule.next(currentState, stack);
  4485. }
  4486. state = this.states[currentState];
  4487. if (!state) {
  4488. this.reportError("state doesn't exist", currentState);
  4489. currentState = "start";
  4490. state = this.states[currentState];
  4491. }
  4492. mapping = this.matchMappings[currentState];
  4493. lastIndex = index;
  4494. re = this.regExps[currentState];
  4495. re.lastIndex = index;
  4496. }
  4497. break;
  4498. }
  4499. if (value) {
  4500. if (typeof type === "string") {
  4501. if ((!rule || rule.merge !== false) && token.type === type) {
  4502. token.value += value;
  4503. } else {
  4504. if (token.type)
  4505. tokens.push(token);
  4506. token = {type: type, value: value};
  4507. }
  4508. } else if (type) {
  4509. if (token.type)
  4510. tokens.push(token);
  4511. token = {type: null, value: ""};
  4512. for (var i = 0; i < type.length; i++)
  4513. tokens.push(type[i]);
  4514. }
  4515. }
  4516. if (lastIndex == line.length)
  4517. break;
  4518. lastIndex = index;
  4519. if (matchAttempts++ > MAX_TOKEN_COUNT) {
  4520. if (matchAttempts > 2 * line.length) {
  4521. this.reportError("infinite loop with in ace tokenizer", {
  4522. startState: startState,
  4523. line: line
  4524. });
  4525. }
  4526. while (lastIndex < line.length) {
  4527. if (token.type)
  4528. tokens.push(token);
  4529. token = {
  4530. value: line.substring(lastIndex, lastIndex += 2000),
  4531. type: "overflow"
  4532. };
  4533. }
  4534. currentState = "start";
  4535. stack = [];
  4536. break;
  4537. }
  4538. }
  4539. if (token.type)
  4540. tokens.push(token);
  4541. if (stack.length > 1) {
  4542. if (stack[0] !== currentState)
  4543. stack.unshift("#tmp", currentState);
  4544. }
  4545. return {
  4546. tokens : tokens,
  4547. state : stack.length ? stack : currentState
  4548. };
  4549. };
  4550. this.reportError = config.reportError;
  4551. }).call(Tokenizer.prototype);
  4552. exports.Tokenizer = Tokenizer;
  4553. });
  4554. ace.define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"], function(require, exports, module) {
  4555. "use strict";
  4556. var lang = require("../lib/lang");
  4557. var TextHighlightRules = function() {
  4558. this.$rules = {
  4559. "start" : [{
  4560. token : "empty_line",
  4561. regex : '^$'
  4562. }, {
  4563. defaultToken : "text"
  4564. }]
  4565. };
  4566. };
  4567. (function() {
  4568. this.addRules = function(rules, prefix) {
  4569. if (!prefix) {
  4570. for (var key in rules)
  4571. this.$rules[key] = rules[key];
  4572. return;
  4573. }
  4574. for (var key in rules) {
  4575. var state = rules[key];
  4576. for (var i = 0; i < state.length; i++) {
  4577. var rule = state[i];
  4578. if (rule.next || rule.onMatch) {
  4579. if (typeof rule.next != "string") {
  4580. if (rule.nextState && rule.nextState.indexOf(prefix) !== 0)
  4581. rule.nextState = prefix + rule.nextState;
  4582. } else {
  4583. if (rule.next.indexOf(prefix) !== 0)
  4584. rule.next = prefix + rule.next;
  4585. }
  4586. }
  4587. }
  4588. this.$rules[prefix + key] = state;
  4589. }
  4590. };
  4591. this.getRules = function() {
  4592. return this.$rules;
  4593. };
  4594. this.embedRules = function (HighlightRules, prefix, escapeRules, states, append) {
  4595. var embedRules = typeof HighlightRules == "function"
  4596. ? new HighlightRules().getRules()
  4597. : HighlightRules;
  4598. if (states) {
  4599. for (var i = 0; i < states.length; i++)
  4600. states[i] = prefix + states[i];
  4601. } else {
  4602. states = [];
  4603. for (var key in embedRules)
  4604. states.push(prefix + key);
  4605. }
  4606. this.addRules(embedRules, prefix);
  4607. if (escapeRules) {
  4608. var addRules = Array.prototype[append ? "push" : "unshift"];
  4609. for (var i = 0; i < states.length; i++)
  4610. addRules.apply(this.$rules[states[i]], lang.deepCopy(escapeRules));
  4611. }
  4612. if (!this.$embeds)
  4613. this.$embeds = [];
  4614. this.$embeds.push(prefix);
  4615. };
  4616. this.getEmbeds = function() {
  4617. return this.$embeds;
  4618. };
  4619. var pushState = function(currentState, stack) {
  4620. if (currentState != "start" || stack.length)
  4621. stack.unshift(this.nextState, currentState);
  4622. return this.nextState;
  4623. };
  4624. var popState = function(currentState, stack) {
  4625. stack.shift();
  4626. return stack.shift() || "start";
  4627. };
  4628. this.normalizeRules = function() {
  4629. var id = 0;
  4630. var rules = this.$rules;
  4631. function processState(key) {
  4632. var state = rules[key];
  4633. state.processed = true;
  4634. for (var i = 0; i < state.length; i++) {
  4635. var rule = state[i];
  4636. if (!rule.regex && rule.start) {
  4637. rule.regex = rule.start;
  4638. if (!rule.next)
  4639. rule.next = [];
  4640. rule.next.push({
  4641. defaultToken: rule.token
  4642. }, {
  4643. token: rule.token + ".end",
  4644. regex: rule.end || rule.start,
  4645. next: "pop"
  4646. });
  4647. rule.token = rule.token + ".start";
  4648. rule.push = true;
  4649. }
  4650. var next = rule.next || rule.push;
  4651. if (next && Array.isArray(next)) {
  4652. var stateName = rule.stateName;
  4653. if (!stateName) {
  4654. stateName = rule.token;
  4655. if (typeof stateName != "string")
  4656. stateName = stateName[0] || "";
  4657. if (rules[stateName])
  4658. stateName += id++;
  4659. }
  4660. rules[stateName] = next;
  4661. rule.next = stateName;
  4662. processState(stateName);
  4663. } else if (next == "pop") {
  4664. rule.next = popState;
  4665. }
  4666. if (rule.push) {
  4667. rule.nextState = rule.next || rule.push;
  4668. rule.next = pushState;
  4669. delete rule.push;
  4670. }
  4671. if (rule.rules) {
  4672. for (var r in rule.rules) {
  4673. if (rules[r]) {
  4674. if (rules[r].push)
  4675. rules[r].push.apply(rules[r], rule.rules[r]);
  4676. } else {
  4677. rules[r] = rule.rules[r];
  4678. }
  4679. }
  4680. }
  4681. if (rule.include || typeof rule == "string") {
  4682. var includeName = rule.include || rule;
  4683. var toInsert = rules[includeName];
  4684. } else if (Array.isArray(rule))
  4685. toInsert = rule;
  4686. if (toInsert) {
  4687. var args = [i, 1].concat(toInsert);
  4688. if (rule.noEscape)
  4689. args = args.filter(function(x) {return !x.next;});
  4690. state.splice.apply(state, args);
  4691. i--;
  4692. toInsert = null;
  4693. }
  4694. if (rule.keywordMap) {
  4695. rule.token = this.createKeywordMapper(
  4696. rule.keywordMap, rule.defaultToken || "text", rule.caseInsensitive
  4697. );
  4698. delete rule.defaultToken;
  4699. }
  4700. }
  4701. }
  4702. Object.keys(rules).forEach(processState, this);
  4703. };
  4704. this.createKeywordMapper = function(map, defaultToken, ignoreCase, splitChar) {
  4705. var keywords = Object.create(null);
  4706. Object.keys(map).forEach(function(className) {
  4707. var a = map[className];
  4708. if (ignoreCase)
  4709. a = a.toLowerCase();
  4710. var list = a.split(splitChar || "|");
  4711. for (var i = list.length; i--; )
  4712. keywords[list[i]] = className;
  4713. });
  4714. if (Object.getPrototypeOf(keywords)) {
  4715. keywords.__proto__ = null;
  4716. }
  4717. this.$keywordList = Object.keys(keywords);
  4718. map = null;
  4719. return ignoreCase
  4720. ? function(value) {return keywords[value.toLowerCase()] || defaultToken }
  4721. : function(value) {return keywords[value] || defaultToken };
  4722. };
  4723. this.getKeywords = function() {
  4724. return this.$keywords;
  4725. };
  4726. }).call(TextHighlightRules.prototype);
  4727. exports.TextHighlightRules = TextHighlightRules;
  4728. });
  4729. ace.define("ace/mode/behaviour",["require","exports","module"], function(require, exports, module) {
  4730. "use strict";
  4731. var Behaviour = function() {
  4732. this.$behaviours = {};
  4733. };
  4734. (function () {
  4735. this.add = function (name, action, callback) {
  4736. switch (undefined) {
  4737. case this.$behaviours:
  4738. this.$behaviours = {};
  4739. case this.$behaviours[name]:
  4740. this.$behaviours[name] = {};
  4741. }
  4742. this.$behaviours[name][action] = callback;
  4743. }
  4744. this.addBehaviours = function (behaviours) {
  4745. for (var key in behaviours) {
  4746. for (var action in behaviours[key]) {
  4747. this.add(key, action, behaviours[key][action]);
  4748. }
  4749. }
  4750. }
  4751. this.remove = function (name) {
  4752. if (this.$behaviours && this.$behaviours[name]) {
  4753. delete this.$behaviours[name];
  4754. }
  4755. }
  4756. this.inherit = function (mode, filter) {
  4757. if (typeof mode === "function") {
  4758. var behaviours = new mode().getBehaviours(filter);
  4759. } else {
  4760. var behaviours = mode.getBehaviours(filter);
  4761. }
  4762. this.addBehaviours(behaviours);
  4763. }
  4764. this.getBehaviours = function (filter) {
  4765. if (!filter) {
  4766. return this.$behaviours;
  4767. } else {
  4768. var ret = {}
  4769. for (var i = 0; i < filter.length; i++) {
  4770. if (this.$behaviours[filter[i]]) {
  4771. ret[filter[i]] = this.$behaviours[filter[i]];
  4772. }
  4773. }
  4774. return ret;
  4775. }
  4776. }
  4777. }).call(Behaviour.prototype);
  4778. exports.Behaviour = Behaviour;
  4779. });
  4780. ace.define("ace/unicode",["require","exports","module"], function(require, exports, module) {
  4781. "use strict";
  4782. exports.packages = {};
  4783. addUnicodePackage({
  4784. L: "0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",
  4785. Ll: "0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A",
  4786. Lu: "0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A",
  4787. Lt: "01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC",
  4788. Lm: "02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F",
  4789. Lo: "01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",
  4790. M: "0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26",
  4791. Mn: "0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26",
  4792. Mc: "0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC",
  4793. Me: "0488048906DE20DD-20E020E2-20E4A670-A672",
  4794. N: "0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",
  4795. Nd: "0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",
  4796. Nl: "16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF",
  4797. No: "00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835",
  4798. P: "0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65",
  4799. Pd: "002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D",
  4800. Ps: "0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62",
  4801. Pe: "0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63",
  4802. Pi: "00AB2018201B201C201F20392E022E042E092E0C2E1C2E20",
  4803. Pf: "00BB2019201D203A2E032E052E0A2E0D2E1D2E21",
  4804. Pc: "005F203F20402054FE33FE34FE4D-FE4FFF3F",
  4805. Po: "0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65",
  4806. S: "0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD",
  4807. Sm: "002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC",
  4808. Sc: "002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6",
  4809. Sk: "005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3",
  4810. So: "00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD",
  4811. Z: "002000A01680180E2000-200A20282029202F205F3000",
  4812. Zs: "002000A01680180E2000-200A202F205F3000",
  4813. Zl: "2028",
  4814. Zp: "2029",
  4815. C: "0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF",
  4816. Cc: "0000-001F007F-009F",
  4817. Cf: "00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB",
  4818. Co: "E000-F8FF",
  4819. Cs: "D800-DFFF",
  4820. Cn: "03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF"
  4821. });
  4822. function addUnicodePackage (pack) {
  4823. var codePoint = /\w{4}/g;
  4824. for (var name in pack)
  4825. exports.packages[name] = pack[name].replace(codePoint, "\\u$&");
  4826. };
  4827. });
  4828. ace.define("ace/token_iterator",["require","exports","module"], function(require, exports, module) {
  4829. "use strict";
  4830. var TokenIterator = function(session, initialRow, initialColumn) {
  4831. this.$session = session;
  4832. this.$row = initialRow;
  4833. this.$rowTokens = session.getTokens(initialRow);
  4834. var token = session.getTokenAt(initialRow, initialColumn);
  4835. this.$tokenIndex = token ? token.index : -1;
  4836. };
  4837. (function() {
  4838. this.stepBackward = function() {
  4839. this.$tokenIndex -= 1;
  4840. while (this.$tokenIndex < 0) {
  4841. this.$row -= 1;
  4842. if (this.$row < 0) {
  4843. this.$row = 0;
  4844. return null;
  4845. }
  4846. this.$rowTokens = this.$session.getTokens(this.$row);
  4847. this.$tokenIndex = this.$rowTokens.length - 1;
  4848. }
  4849. return this.$rowTokens[this.$tokenIndex];
  4850. };
  4851. this.stepForward = function() {
  4852. this.$tokenIndex += 1;
  4853. var rowCount;
  4854. while (this.$tokenIndex >= this.$rowTokens.length) {
  4855. this.$row += 1;
  4856. if (!rowCount)
  4857. rowCount = this.$session.getLength();
  4858. if (this.$row >= rowCount) {
  4859. this.$row = rowCount - 1;
  4860. return null;
  4861. }
  4862. this.$rowTokens = this.$session.getTokens(this.$row);
  4863. this.$tokenIndex = 0;
  4864. }
  4865. return this.$rowTokens[this.$tokenIndex];
  4866. };
  4867. this.getCurrentToken = function () {
  4868. return this.$rowTokens[this.$tokenIndex];
  4869. };
  4870. this.getCurrentTokenRow = function () {
  4871. return this.$row;
  4872. };
  4873. this.getCurrentTokenColumn = function() {
  4874. var rowTokens = this.$rowTokens;
  4875. var tokenIndex = this.$tokenIndex;
  4876. var column = rowTokens[tokenIndex].start;
  4877. if (column !== undefined)
  4878. return column;
  4879. column = 0;
  4880. while (tokenIndex > 0) {
  4881. tokenIndex -= 1;
  4882. column += rowTokens[tokenIndex].value.length;
  4883. }
  4884. return column;
  4885. };
  4886. }).call(TokenIterator.prototype);
  4887. exports.TokenIterator = TokenIterator;
  4888. });
  4889. ace.define("ace/mode/text",["require","exports","module","ace/tokenizer","ace/mode/text_highlight_rules","ace/mode/behaviour","ace/unicode","ace/lib/lang","ace/token_iterator","ace/range"], function(require, exports, module) {
  4890. "use strict";
  4891. var Tokenizer = require("../tokenizer").Tokenizer;
  4892. var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
  4893. var Behaviour = require("./behaviour").Behaviour;
  4894. var unicode = require("../unicode");
  4895. var lang = require("../lib/lang");
  4896. var TokenIterator = require("../token_iterator").TokenIterator;
  4897. var Range = require("../range").Range;
  4898. var Mode = function() {
  4899. this.HighlightRules = TextHighlightRules;
  4900. this.$behaviour = new Behaviour();
  4901. };
  4902. (function() {
  4903. this.tokenRe = new RegExp("^["
  4904. + unicode.packages.L
  4905. + unicode.packages.Mn + unicode.packages.Mc
  4906. + unicode.packages.Nd
  4907. + unicode.packages.Pc + "\\$_]+", "g"
  4908. );
  4909. this.nonTokenRe = new RegExp("^(?:[^"
  4910. + unicode.packages.L
  4911. + unicode.packages.Mn + unicode.packages.Mc
  4912. + unicode.packages.Nd
  4913. + unicode.packages.Pc + "\\$_]|\\s])+", "g"
  4914. );
  4915. this.getTokenizer = function() {
  4916. if (!this.$tokenizer) {
  4917. this.$highlightRules = this.$highlightRules || new this.HighlightRules();
  4918. this.$tokenizer = new Tokenizer(this.$highlightRules.getRules());
  4919. }
  4920. return this.$tokenizer;
  4921. };
  4922. this.lineCommentStart = "";
  4923. this.blockComment = "";
  4924. this.toggleCommentLines = function(state, session, startRow, endRow) {
  4925. var doc = session.doc;
  4926. var ignoreBlankLines = true;
  4927. var shouldRemove = true;
  4928. var minIndent = Infinity;
  4929. var tabSize = session.getTabSize();
  4930. var insertAtTabStop = false;
  4931. if (!this.lineCommentStart) {
  4932. if (!this.blockComment)
  4933. return false;
  4934. var lineCommentStart = this.blockComment.start;
  4935. var lineCommentEnd = this.blockComment.end;
  4936. var regexpStart = new RegExp("^(\\s*)(?:" + lang.escapeRegExp(lineCommentStart) + ")");
  4937. var regexpEnd = new RegExp("(?:" + lang.escapeRegExp(lineCommentEnd) + ")\\s*$");
  4938. var comment = function(line, i) {
  4939. if (testRemove(line, i))
  4940. return;
  4941. if (!ignoreBlankLines || /\S/.test(line)) {
  4942. doc.insertInLine({row: i, column: line.length}, lineCommentEnd);
  4943. doc.insertInLine({row: i, column: minIndent}, lineCommentStart);
  4944. }
  4945. };
  4946. var uncomment = function(line, i) {
  4947. var m;
  4948. if (m = line.match(regexpEnd))
  4949. doc.removeInLine(i, line.length - m[0].length, line.length);
  4950. if (m = line.match(regexpStart))
  4951. doc.removeInLine(i, m[1].length, m[0].length);
  4952. };
  4953. var testRemove = function(line, row) {
  4954. if (regexpStart.test(line))
  4955. return true;
  4956. var tokens = session.getTokens(row);
  4957. for (var i = 0; i < tokens.length; i++) {
  4958. if (tokens[i].type === 'comment')
  4959. return true;
  4960. }
  4961. };
  4962. } else {
  4963. if (Array.isArray(this.lineCommentStart)) {
  4964. var regexpStart = this.lineCommentStart.map(lang.escapeRegExp).join("|");
  4965. var lineCommentStart = this.lineCommentStart[0];
  4966. } else {
  4967. var regexpStart = lang.escapeRegExp(this.lineCommentStart);
  4968. var lineCommentStart = this.lineCommentStart;
  4969. }
  4970. regexpStart = new RegExp("^(\\s*)(?:" + regexpStart + ") ?");
  4971. insertAtTabStop = session.getUseSoftTabs();
  4972. var uncomment = function(line, i) {
  4973. var m = line.match(regexpStart);
  4974. if (!m) return;
  4975. var start = m[1].length, end = m[0].length;
  4976. if (!shouldInsertSpace(line, start, end) && m[0][end - 1] == " ")
  4977. end--;
  4978. doc.removeInLine(i, start, end);
  4979. };
  4980. var commentWithSpace = lineCommentStart + " ";
  4981. var comment = function(line, i) {
  4982. if (!ignoreBlankLines || /\S/.test(line)) {
  4983. if (shouldInsertSpace(line, minIndent, minIndent))
  4984. doc.insertInLine({row: i, column: minIndent}, commentWithSpace);
  4985. else
  4986. doc.insertInLine({row: i, column: minIndent}, lineCommentStart);
  4987. }
  4988. };
  4989. var testRemove = function(line, i) {
  4990. return regexpStart.test(line);
  4991. };
  4992. var shouldInsertSpace = function(line, before, after) {
  4993. var spaces = 0;
  4994. while (before-- && line.charAt(before) == " ")
  4995. spaces++;
  4996. if (spaces % tabSize != 0)
  4997. return false;
  4998. var spaces = 0;
  4999. while (line.charAt(after++) == " ")
  5000. spaces++;
  5001. if (tabSize > 2)
  5002. return spaces % tabSize != tabSize - 1;
  5003. else
  5004. return spaces % tabSize == 0;
  5005. return true;
  5006. };
  5007. }
  5008. function iter(fun) {
  5009. for (var i = startRow; i <= endRow; i++)
  5010. fun(doc.getLine(i), i);
  5011. }
  5012. var minEmptyLength = Infinity;
  5013. iter(function(line, i) {
  5014. var indent = line.search(/\S/);
  5015. if (indent !== -1) {
  5016. if (indent < minIndent)
  5017. minIndent = indent;
  5018. if (shouldRemove && !testRemove(line, i))
  5019. shouldRemove = false;
  5020. } else if (minEmptyLength > line.length) {
  5021. minEmptyLength = line.length;
  5022. }
  5023. });
  5024. if (minIndent == Infinity) {
  5025. minIndent = minEmptyLength;
  5026. ignoreBlankLines = false;
  5027. shouldRemove = false;
  5028. }
  5029. if (insertAtTabStop && minIndent % tabSize != 0)
  5030. minIndent = Math.floor(minIndent / tabSize) * tabSize;
  5031. iter(shouldRemove ? uncomment : comment);
  5032. };
  5033. this.toggleBlockComment = function(state, session, range, cursor) {
  5034. var comment = this.blockComment;
  5035. if (!comment)
  5036. return;
  5037. if (!comment.start && comment[0])
  5038. comment = comment[0];
  5039. var iterator = new TokenIterator(session, cursor.row, cursor.column);
  5040. var token = iterator.getCurrentToken();
  5041. var sel = session.selection;
  5042. var initialRange = session.selection.toOrientedRange();
  5043. var startRow, colDiff;
  5044. if (token && /comment/.test(token.type)) {
  5045. var startRange, endRange;
  5046. while (token && /comment/.test(token.type)) {
  5047. var i = token.value.indexOf(comment.start);
  5048. if (i != -1) {
  5049. var row = iterator.getCurrentTokenRow();
  5050. var column = iterator.getCurrentTokenColumn() + i;
  5051. startRange = new Range(row, column, row, column + comment.start.length);
  5052. break;
  5053. }
  5054. token = iterator.stepBackward();
  5055. }
  5056. var iterator = new TokenIterator(session, cursor.row, cursor.column);
  5057. var token = iterator.getCurrentToken();
  5058. while (token && /comment/.test(token.type)) {
  5059. var i = token.value.indexOf(comment.end);
  5060. if (i != -1) {
  5061. var row = iterator.getCurrentTokenRow();
  5062. var column = iterator.getCurrentTokenColumn() + i;
  5063. endRange = new Range(row, column, row, column + comment.end.length);
  5064. break;
  5065. }
  5066. token = iterator.stepForward();
  5067. }
  5068. if (endRange)
  5069. session.remove(endRange);
  5070. if (startRange) {
  5071. session.remove(startRange);
  5072. startRow = startRange.start.row;
  5073. colDiff = -comment.start.length;
  5074. }
  5075. } else {
  5076. colDiff = comment.start.length;
  5077. startRow = range.start.row;
  5078. session.insert(range.end, comment.end);
  5079. session.insert(range.start, comment.start);
  5080. }
  5081. if (initialRange.start.row == startRow)
  5082. initialRange.start.column += colDiff;
  5083. if (initialRange.end.row == startRow)
  5084. initialRange.end.column += colDiff;
  5085. session.selection.fromOrientedRange(initialRange);
  5086. };
  5087. this.getNextLineIndent = function(state, line, tab) {
  5088. return this.$getIndent(line);
  5089. };
  5090. this.checkOutdent = function(state, line, input) {
  5091. return false;
  5092. };
  5093. this.autoOutdent = function(state, doc, row) {
  5094. };
  5095. this.$getIndent = function(line) {
  5096. return line.match(/^\s*/)[0];
  5097. };
  5098. this.createWorker = function(session) {
  5099. return null;
  5100. };
  5101. this.createModeDelegates = function (mapping) {
  5102. this.$embeds = [];
  5103. this.$modes = {};
  5104. for (var i in mapping) {
  5105. if (mapping[i]) {
  5106. this.$embeds.push(i);
  5107. this.$modes[i] = new mapping[i]();
  5108. }
  5109. }
  5110. var delegations = ['toggleBlockComment', 'toggleCommentLines', 'getNextLineIndent',
  5111. 'checkOutdent', 'autoOutdent', 'transformAction', 'getCompletions'];
  5112. for (var i = 0; i < delegations.length; i++) {
  5113. (function(scope) {
  5114. var functionName = delegations[i];
  5115. var defaultHandler = scope[functionName];
  5116. scope[delegations[i]] = function() {
  5117. return this.$delegator(functionName, arguments, defaultHandler);
  5118. };
  5119. } (this));
  5120. }
  5121. };
  5122. this.$delegator = function(method, args, defaultHandler) {
  5123. var state = args[0];
  5124. if (typeof state != "string")
  5125. state = state[0];
  5126. for (var i = 0; i < this.$embeds.length; i++) {
  5127. if (!this.$modes[this.$embeds[i]]) continue;
  5128. var split = state.split(this.$embeds[i]);
  5129. if (!split[0] && split[1]) {
  5130. args[0] = split[1];
  5131. var mode = this.$modes[this.$embeds[i]];
  5132. return mode[method].apply(mode, args);
  5133. }
  5134. }
  5135. var ret = defaultHandler.apply(this, args);
  5136. return defaultHandler ? ret : undefined;
  5137. };
  5138. this.transformAction = function(state, action, editor, session, param) {
  5139. if (this.$behaviour) {
  5140. var behaviours = this.$behaviour.getBehaviours();
  5141. for (var key in behaviours) {
  5142. if (behaviours[key][action]) {
  5143. var ret = behaviours[key][action].apply(this, arguments);
  5144. if (ret) {
  5145. return ret;
  5146. }
  5147. }
  5148. }
  5149. }
  5150. };
  5151. this.getKeywords = function(append) {
  5152. if (!this.completionKeywords) {
  5153. var rules = this.$tokenizer.rules;
  5154. var completionKeywords = [];
  5155. for (var rule in rules) {
  5156. var ruleItr = rules[rule];
  5157. for (var r = 0, l = ruleItr.length; r < l; r++) {
  5158. if (typeof ruleItr[r].token === "string") {
  5159. if (/keyword|support|storage/.test(ruleItr[r].token))
  5160. completionKeywords.push(ruleItr[r].regex);
  5161. }
  5162. else if (typeof ruleItr[r].token === "object") {
  5163. for (var a = 0, aLength = ruleItr[r].token.length; a < aLength; a++) {
  5164. if (/keyword|support|storage/.test(ruleItr[r].token[a])) {
  5165. var rule = ruleItr[r].regex.match(/\(.+?\)/g)[a];
  5166. completionKeywords.push(rule.substr(1, rule.length - 2));
  5167. }
  5168. }
  5169. }
  5170. }
  5171. }
  5172. this.completionKeywords = completionKeywords;
  5173. }
  5174. if (!append)
  5175. return this.$keywordList;
  5176. return completionKeywords.concat(this.$keywordList || []);
  5177. };
  5178. this.$createKeywordList = function() {
  5179. if (!this.$highlightRules)
  5180. this.getTokenizer();
  5181. return this.$keywordList = this.$highlightRules.$keywordList || [];
  5182. };
  5183. this.getCompletions = function(state, session, pos, prefix) {
  5184. var keywords = this.$keywordList || this.$createKeywordList();
  5185. return keywords.map(function(word) {
  5186. return {
  5187. name: word,
  5188. value: word,
  5189. score: 0,
  5190. meta: "keyword"
  5191. };
  5192. });
  5193. };
  5194. this.$id = "ace/mode/text";
  5195. }).call(Mode.prototype);
  5196. exports.Mode = Mode;
  5197. });
  5198. ace.define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module) {
  5199. "use strict";
  5200. var oop = require("./lib/oop");
  5201. var EventEmitter = require("./lib/event_emitter").EventEmitter;
  5202. var Anchor = exports.Anchor = function(doc, row, column) {
  5203. this.$onChange = this.onChange.bind(this);
  5204. this.attach(doc);
  5205. if (typeof column == "undefined")
  5206. this.setPosition(row.row, row.column);
  5207. else
  5208. this.setPosition(row, column);
  5209. };
  5210. (function() {
  5211. oop.implement(this, EventEmitter);
  5212. this.getPosition = function() {
  5213. return this.$clipPositionToDocument(this.row, this.column);
  5214. };
  5215. this.getDocument = function() {
  5216. return this.document;
  5217. };
  5218. this.$insertRight = false;
  5219. this.onChange = function(e) {
  5220. var delta = e.data;
  5221. var range = delta.range;
  5222. if (range.start.row == range.end.row && range.start.row != this.row)
  5223. return;
  5224. if (range.start.row > this.row)
  5225. return;
  5226. if (range.start.row == this.row && range.start.column > this.column)
  5227. return;
  5228. var row = this.row;
  5229. var column = this.column;
  5230. var start = range.start;
  5231. var end = range.end;
  5232. if (delta.action === "insertText") {
  5233. if (start.row === row && start.column <= column) {
  5234. if (start.column === column && this.$insertRight) {
  5235. } else if (start.row === end.row) {
  5236. column += end.column - start.column;
  5237. } else {
  5238. column -= start.column;
  5239. row += end.row - start.row;
  5240. }
  5241. } else if (start.row !== end.row && start.row < row) {
  5242. row += end.row - start.row;
  5243. }
  5244. } else if (delta.action === "insertLines") {
  5245. if (start.row === row && column === 0 && this.$insertRight) {
  5246. }
  5247. else if (start.row <= row) {
  5248. row += end.row - start.row;
  5249. }
  5250. } else if (delta.action === "removeText") {
  5251. if (start.row === row && start.column < column) {
  5252. if (end.column >= column)
  5253. column = start.column;
  5254. else
  5255. column = Math.max(0, column - (end.column - start.column));
  5256. } else if (start.row !== end.row && start.row < row) {
  5257. if (end.row === row)
  5258. column = Math.max(0, column - end.column) + start.column;
  5259. row -= (end.row - start.row);
  5260. } else if (end.row === row) {
  5261. row -= end.row - start.row;
  5262. column = Math.max(0, column - end.column) + start.column;
  5263. }
  5264. } else if (delta.action == "removeLines") {
  5265. if (start.row <= row) {
  5266. if (end.row <= row)
  5267. row -= end.row - start.row;
  5268. else {
  5269. row = start.row;
  5270. column = 0;
  5271. }
  5272. }
  5273. }
  5274. this.setPosition(row, column, true);
  5275. };
  5276. this.setPosition = function(row, column, noClip) {
  5277. var pos;
  5278. if (noClip) {
  5279. pos = {
  5280. row: row,
  5281. column: column
  5282. };
  5283. } else {
  5284. pos = this.$clipPositionToDocument(row, column);
  5285. }
  5286. if (this.row == pos.row && this.column == pos.column)
  5287. return;
  5288. var old = {
  5289. row: this.row,
  5290. column: this.column
  5291. };
  5292. this.row = pos.row;
  5293. this.column = pos.column;
  5294. this._signal("change", {
  5295. old: old,
  5296. value: pos
  5297. });
  5298. };
  5299. this.detach = function() {
  5300. this.document.removeEventListener("change", this.$onChange);
  5301. };
  5302. this.attach = function(doc) {
  5303. this.document = doc || this.document;
  5304. this.document.on("change", this.$onChange);
  5305. };
  5306. this.$clipPositionToDocument = function(row, column) {
  5307. var pos = {};
  5308. if (row >= this.document.getLength()) {
  5309. pos.row = Math.max(0, this.document.getLength() - 1);
  5310. pos.column = this.document.getLine(pos.row).length;
  5311. }
  5312. else if (row < 0) {
  5313. pos.row = 0;
  5314. pos.column = 0;
  5315. }
  5316. else {
  5317. pos.row = row;
  5318. pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));
  5319. }
  5320. if (column < 0)
  5321. pos.column = 0;
  5322. return pos;
  5323. };
  5324. }).call(Anchor.prototype);
  5325. });
  5326. ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/range","ace/anchor"], function(require, exports, module) {
  5327. "use strict";
  5328. var oop = require("./lib/oop");
  5329. var EventEmitter = require("./lib/event_emitter").EventEmitter;
  5330. var Range = require("./range").Range;
  5331. var Anchor = require("./anchor").Anchor;
  5332. var Document = function(text) {
  5333. this.$lines = [];
  5334. if (text.length === 0) {
  5335. this.$lines = [""];
  5336. } else if (Array.isArray(text)) {
  5337. this._insertLines(0, text);
  5338. } else {
  5339. this.insert({row: 0, column:0}, text);
  5340. }
  5341. };
  5342. (function() {
  5343. oop.implement(this, EventEmitter);
  5344. this.setValue = function(text) {
  5345. var len = this.getLength();
  5346. this.remove(new Range(0, 0, len, this.getLine(len-1).length));
  5347. this.insert({row: 0, column:0}, text);
  5348. };
  5349. this.getValue = function() {
  5350. return this.getAllLines().join(this.getNewLineCharacter());
  5351. };
  5352. this.createAnchor = function(row, column) {
  5353. return new Anchor(this, row, column);
  5354. };
  5355. if ("aaa".split(/a/).length === 0)
  5356. this.$split = function(text) {
  5357. return text.replace(/\r\n|\r/g, "\n").split("\n");
  5358. };
  5359. else
  5360. this.$split = function(text) {
  5361. return text.split(/\r\n|\r|\n/);
  5362. };
  5363. this.$detectNewLine = function(text) {
  5364. var match = text.match(/^.*?(\r\n|\r|\n)/m);
  5365. this.$autoNewLine = match ? match[1] : "\n";
  5366. this._signal("changeNewLineMode");
  5367. };
  5368. this.getNewLineCharacter = function() {
  5369. switch (this.$newLineMode) {
  5370. case "windows":
  5371. return "\r\n";
  5372. case "unix":
  5373. return "\n";
  5374. default:
  5375. return this.$autoNewLine || "\n";
  5376. }
  5377. };
  5378. this.$autoNewLine = "";
  5379. this.$newLineMode = "auto";
  5380. this.setNewLineMode = function(newLineMode) {
  5381. if (this.$newLineMode === newLineMode)
  5382. return;
  5383. this.$newLineMode = newLineMode;
  5384. this._signal("changeNewLineMode");
  5385. };
  5386. this.getNewLineMode = function() {
  5387. return this.$newLineMode;
  5388. };
  5389. this.isNewLine = function(text) {
  5390. return (text == "\r\n" || text == "\r" || text == "\n");
  5391. };
  5392. this.getLine = function(row) {
  5393. return this.$lines[row] || "";
  5394. };
  5395. this.getLines = function(firstRow, lastRow) {
  5396. return this.$lines.slice(firstRow, lastRow + 1);
  5397. };
  5398. this.getAllLines = function() {
  5399. return this.getLines(0, this.getLength());
  5400. };
  5401. this.getLength = function() {
  5402. return this.$lines.length;
  5403. };
  5404. this.getTextRange = function(range) {
  5405. if (range.start.row == range.end.row) {
  5406. return this.getLine(range.start.row)
  5407. .substring(range.start.column, range.end.column);
  5408. }
  5409. var lines = this.getLines(range.start.row, range.end.row);
  5410. lines[0] = (lines[0] || "").substring(range.start.column);
  5411. var l = lines.length - 1;
  5412. if (range.end.row - range.start.row == l)
  5413. lines[l] = lines[l].substring(0, range.end.column);
  5414. return lines.join(this.getNewLineCharacter());
  5415. };
  5416. this.$clipPosition = function(position) {
  5417. var length = this.getLength();
  5418. if (position.row >= length) {
  5419. position.row = Math.max(0, length - 1);
  5420. position.column = this.getLine(length-1).length;
  5421. } else if (position.row < 0)
  5422. position.row = 0;
  5423. return position;
  5424. };
  5425. this.insert = function(position, text) {
  5426. if (!text || text.length === 0)
  5427. return position;
  5428. position = this.$clipPosition(position);
  5429. if (this.getLength() <= 1)
  5430. this.$detectNewLine(text);
  5431. var lines = this.$split(text);
  5432. var firstLine = lines.splice(0, 1)[0];
  5433. var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0];
  5434. position = this.insertInLine(position, firstLine);
  5435. if (lastLine !== null) {
  5436. position = this.insertNewLine(position); // terminate first line
  5437. position = this._insertLines(position.row, lines);
  5438. position = this.insertInLine(position, lastLine || "");
  5439. }
  5440. return position;
  5441. };
  5442. this.insertLines = function(row, lines) {
  5443. if (row >= this.getLength())
  5444. return this.insert({row: row, column: 0}, "\n" + lines.join("\n"));
  5445. return this._insertLines(Math.max(row, 0), lines);
  5446. };
  5447. this._insertLines = function(row, lines) {
  5448. if (lines.length == 0)
  5449. return {row: row, column: 0};
  5450. while (lines.length > 20000) {
  5451. var end = this._insertLines(row, lines.slice(0, 20000));
  5452. lines = lines.slice(20000);
  5453. row = end.row;
  5454. }
  5455. var args = [row, 0];
  5456. args.push.apply(args, lines);
  5457. this.$lines.splice.apply(this.$lines, args);
  5458. var range = new Range(row, 0, row + lines.length, 0);
  5459. var delta = {
  5460. action: "insertLines",
  5461. range: range,
  5462. lines: lines
  5463. };
  5464. this._signal("change", { data: delta });
  5465. return range.end;
  5466. };
  5467. this.insertNewLine = function(position) {
  5468. position = this.$clipPosition(position);
  5469. var line = this.$lines[position.row] || "";
  5470. this.$lines[position.row] = line.substring(0, position.column);
  5471. this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length));
  5472. var end = {
  5473. row : position.row + 1,
  5474. column : 0
  5475. };
  5476. var delta = {
  5477. action: "insertText",
  5478. range: Range.fromPoints(position, end),
  5479. text: this.getNewLineCharacter()
  5480. };
  5481. this._signal("change", { data: delta });
  5482. return end;
  5483. };
  5484. this.insertInLine = function(position, text) {
  5485. if (text.length == 0)
  5486. return position;
  5487. var line = this.$lines[position.row] || "";
  5488. this.$lines[position.row] = line.substring(0, position.column) + text
  5489. + line.substring(position.column);
  5490. var end = {
  5491. row : position.row,
  5492. column : position.column + text.length
  5493. };
  5494. var delta = {
  5495. action: "insertText",
  5496. range: Range.fromPoints(position, end),
  5497. text: text
  5498. };
  5499. this._signal("change", { data: delta });
  5500. return end;
  5501. };
  5502. this.remove = function(range) {
  5503. if (!(range instanceof Range))
  5504. range = Range.fromPoints(range.start, range.end);
  5505. range.start = this.$clipPosition(range.start);
  5506. range.end = this.$clipPosition(range.end);
  5507. if (range.isEmpty())
  5508. return range.start;
  5509. var firstRow = range.start.row;
  5510. var lastRow = range.end.row;
  5511. if (range.isMultiLine()) {
  5512. var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1;
  5513. var lastFullRow = lastRow - 1;
  5514. if (range.end.column > 0)
  5515. this.removeInLine(lastRow, 0, range.end.column);
  5516. if (lastFullRow >= firstFullRow)
  5517. this._removeLines(firstFullRow, lastFullRow);
  5518. if (firstFullRow != firstRow) {
  5519. this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length);
  5520. this.removeNewLine(range.start.row);
  5521. }
  5522. }
  5523. else {
  5524. this.removeInLine(firstRow, range.start.column, range.end.column);
  5525. }
  5526. return range.start;
  5527. };
  5528. this.removeInLine = function(row, startColumn, endColumn) {
  5529. if (startColumn == endColumn)
  5530. return;
  5531. var range = new Range(row, startColumn, row, endColumn);
  5532. var line = this.getLine(row);
  5533. var removed = line.substring(startColumn, endColumn);
  5534. var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length);
  5535. this.$lines.splice(row, 1, newLine);
  5536. var delta = {
  5537. action: "removeText",
  5538. range: range,
  5539. text: removed
  5540. };
  5541. this._signal("change", { data: delta });
  5542. return range.start;
  5543. };
  5544. this.removeLines = function(firstRow, lastRow) {
  5545. if (firstRow < 0 || lastRow >= this.getLength())
  5546. return this.remove(new Range(firstRow, 0, lastRow + 1, 0));
  5547. return this._removeLines(firstRow, lastRow);
  5548. };
  5549. this._removeLines = function(firstRow, lastRow) {
  5550. var range = new Range(firstRow, 0, lastRow + 1, 0);
  5551. var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1);
  5552. var delta = {
  5553. action: "removeLines",
  5554. range: range,
  5555. nl: this.getNewLineCharacter(),
  5556. lines: removed
  5557. };
  5558. this._signal("change", { data: delta });
  5559. return removed;
  5560. };
  5561. this.removeNewLine = function(row) {
  5562. var firstLine = this.getLine(row);
  5563. var secondLine = this.getLine(row+1);
  5564. var range = new Range(row, firstLine.length, row+1, 0);
  5565. var line = firstLine + secondLine;
  5566. this.$lines.splice(row, 2, line);
  5567. var delta = {
  5568. action: "removeText",
  5569. range: range,
  5570. text: this.getNewLineCharacter()
  5571. };
  5572. this._signal("change", { data: delta });
  5573. };
  5574. this.replace = function(range, text) {
  5575. if (!(range instanceof Range))
  5576. range = Range.fromPoints(range.start, range.end);
  5577. if (text.length == 0 && range.isEmpty())
  5578. return range.start;
  5579. if (text == this.getTextRange(range))
  5580. return range.end;
  5581. this.remove(range);
  5582. if (text) {
  5583. var end = this.insert(range.start, text);
  5584. }
  5585. else {
  5586. end = range.start;
  5587. }
  5588. return end;
  5589. };
  5590. this.applyDeltas = function(deltas) {
  5591. for (var i=0; i<deltas.length; i++) {
  5592. var delta = deltas[i];
  5593. var range = Range.fromPoints(delta.range.start, delta.range.end);
  5594. if (delta.action == "insertLines")
  5595. this.insertLines(range.start.row, delta.lines);
  5596. else if (delta.action == "insertText")
  5597. this.insert(range.start, delta.text);
  5598. else if (delta.action == "removeLines")
  5599. this._removeLines(range.start.row, range.end.row - 1);
  5600. else if (delta.action == "removeText")
  5601. this.remove(range);
  5602. }
  5603. };
  5604. this.revertDeltas = function(deltas) {
  5605. for (var i=deltas.length-1; i>=0; i--) {
  5606. var delta = deltas[i];
  5607. var range = Range.fromPoints(delta.range.start, delta.range.end);
  5608. if (delta.action == "insertLines")
  5609. this._removeLines(range.start.row, range.end.row - 1);
  5610. else if (delta.action == "insertText")
  5611. this.remove(range);
  5612. else if (delta.action == "removeLines")
  5613. this._insertLines(range.start.row, delta.lines);
  5614. else if (delta.action == "removeText")
  5615. this.insert(range.start, delta.text);
  5616. }
  5617. };
  5618. this.indexToPosition = function(index, startRow) {
  5619. var lines = this.$lines || this.getAllLines();
  5620. var newlineLength = this.getNewLineCharacter().length;
  5621. for (var i = startRow || 0, l = lines.length; i < l; i++) {
  5622. index -= lines[i].length + newlineLength;
  5623. if (index < 0)
  5624. return {row: i, column: index + lines[i].length + newlineLength};
  5625. }
  5626. return {row: l-1, column: lines[l-1].length};
  5627. };
  5628. this.positionToIndex = function(pos, startRow) {
  5629. var lines = this.$lines || this.getAllLines();
  5630. var newlineLength = this.getNewLineCharacter().length;
  5631. var index = 0;
  5632. var row = Math.min(pos.row, lines.length);
  5633. for (var i = startRow || 0; i < row; ++i)
  5634. index += lines[i].length + newlineLength;
  5635. return index + pos.column;
  5636. };
  5637. }).call(Document.prototype);
  5638. exports.Document = Document;
  5639. });
  5640. ace.define("ace/background_tokenizer",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module) {
  5641. "use strict";
  5642. var oop = require("./lib/oop");
  5643. var EventEmitter = require("./lib/event_emitter").EventEmitter;
  5644. var BackgroundTokenizer = function(tokenizer, editor) {
  5645. this.running = false;
  5646. this.lines = [];
  5647. this.states = [];
  5648. this.currentLine = 0;
  5649. this.tokenizer = tokenizer;
  5650. var self = this;
  5651. this.$worker = function() {
  5652. if (!self.running) { return; }
  5653. var workerStart = new Date();
  5654. var currentLine = self.currentLine;
  5655. var endLine = -1;
  5656. var doc = self.doc;
  5657. while (self.lines[currentLine])
  5658. currentLine++;
  5659. var startLine = currentLine;
  5660. var len = doc.getLength();
  5661. var processedLines = 0;
  5662. self.running = false;
  5663. while (currentLine < len) {
  5664. self.$tokenizeRow(currentLine);
  5665. endLine = currentLine;
  5666. do {
  5667. currentLine++;
  5668. } while (self.lines[currentLine]);
  5669. processedLines ++;
  5670. if ((processedLines % 5 === 0) && (new Date() - workerStart) > 20) {
  5671. self.running = setTimeout(self.$worker, 20);
  5672. break;
  5673. }
  5674. }
  5675. self.currentLine = currentLine;
  5676. if (startLine <= endLine)
  5677. self.fireUpdateEvent(startLine, endLine);
  5678. };
  5679. };
  5680. (function(){
  5681. oop.implement(this, EventEmitter);
  5682. this.setTokenizer = function(tokenizer) {
  5683. this.tokenizer = tokenizer;
  5684. this.lines = [];
  5685. this.states = [];
  5686. this.start(0);
  5687. };
  5688. this.setDocument = function(doc) {
  5689. this.doc = doc;
  5690. this.lines = [];
  5691. this.states = [];
  5692. this.stop();
  5693. };
  5694. this.fireUpdateEvent = function(firstRow, lastRow) {
  5695. var data = {
  5696. first: firstRow,
  5697. last: lastRow
  5698. };
  5699. this._signal("update", {data: data});
  5700. };
  5701. this.start = function(startRow) {
  5702. this.currentLine = Math.min(startRow || 0, this.currentLine, this.doc.getLength());
  5703. this.lines.splice(this.currentLine, this.lines.length);
  5704. this.states.splice(this.currentLine, this.states.length);
  5705. this.stop();
  5706. this.running = setTimeout(this.$worker, 700);
  5707. };
  5708. this.scheduleStart = function() {
  5709. if (!this.running)
  5710. this.running = setTimeout(this.$worker, 700);
  5711. }
  5712. this.$updateOnChange = function(delta) {
  5713. var range = delta.range;
  5714. var startRow = range.start.row;
  5715. var len = range.end.row - startRow;
  5716. if (len === 0) {
  5717. this.lines[startRow] = null;
  5718. } else if (delta.action == "removeText" || delta.action == "removeLines") {
  5719. this.lines.splice(startRow, len + 1, null);
  5720. this.states.splice(startRow, len + 1, null);
  5721. } else {
  5722. var args = Array(len + 1);
  5723. args.unshift(startRow, 1);
  5724. this.lines.splice.apply(this.lines, args);
  5725. this.states.splice.apply(this.states, args);
  5726. }
  5727. this.currentLine = Math.min(startRow, this.currentLine, this.doc.getLength());
  5728. this.stop();
  5729. };
  5730. this.stop = function() {
  5731. if (this.running)
  5732. clearTimeout(this.running);
  5733. this.running = false;
  5734. };
  5735. this.getTokens = function(row) {
  5736. return this.lines[row] || this.$tokenizeRow(row);
  5737. };
  5738. this.getState = function(row) {
  5739. if (this.currentLine == row)
  5740. this.$tokenizeRow(row);
  5741. return this.states[row] || "start";
  5742. };
  5743. this.$tokenizeRow = function(row) {
  5744. var line = this.doc.getLine(row);
  5745. var state = this.states[row - 1];
  5746. var data = this.tokenizer.getLineTokens(line, state, row);
  5747. if (this.states[row] + "" !== data.state + "") {
  5748. this.states[row] = data.state;
  5749. this.lines[row + 1] = null;
  5750. if (this.currentLine > row + 1)
  5751. this.currentLine = row + 1;
  5752. } else if (this.currentLine == row) {
  5753. this.currentLine = row + 1;
  5754. }
  5755. return this.lines[row] = data.tokens;
  5756. };
  5757. }).call(BackgroundTokenizer.prototype);
  5758. exports.BackgroundTokenizer = BackgroundTokenizer;
  5759. });
  5760. ace.define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"], function(require, exports, module) {
  5761. "use strict";
  5762. var lang = require("./lib/lang");
  5763. var oop = require("./lib/oop");
  5764. var Range = require("./range").Range;
  5765. var SearchHighlight = function(regExp, clazz, type) {
  5766. this.setRegexp(regExp);
  5767. this.clazz = clazz;
  5768. this.type = type || "text";
  5769. };
  5770. (function() {
  5771. this.MAX_RANGES = 500;
  5772. this.setRegexp = function(regExp) {
  5773. if (this.regExp+"" == regExp+"")
  5774. return;
  5775. this.regExp = regExp;
  5776. this.cache = [];
  5777. };
  5778. this.update = function(html, markerLayer, session, config) {
  5779. if (!this.regExp)
  5780. return;
  5781. var start = config.firstRow, end = config.lastRow;
  5782. for (var i = start; i <= end; i++) {
  5783. var ranges = this.cache[i];
  5784. if (ranges == null) {
  5785. ranges = lang.getMatchOffsets(session.getLine(i), this.regExp);
  5786. if (ranges.length > this.MAX_RANGES)
  5787. ranges = ranges.slice(0, this.MAX_RANGES);
  5788. ranges = ranges.map(function(match) {
  5789. return new Range(i, match.offset, i, match.offset + match.length);
  5790. });
  5791. this.cache[i] = ranges.length ? ranges : "";
  5792. }
  5793. for (var j = ranges.length; j --; ) {
  5794. markerLayer.drawSingleLineMarker(
  5795. html, ranges[j].toScreenRange(session), this.clazz, config);
  5796. }
  5797. }
  5798. };
  5799. }).call(SearchHighlight.prototype);
  5800. exports.SearchHighlight = SearchHighlight;
  5801. });
  5802. ace.define("ace/edit_session/fold_line",["require","exports","module","ace/range"], function(require, exports, module) {
  5803. "use strict";
  5804. var Range = require("../range").Range;
  5805. function FoldLine(foldData, folds) {
  5806. this.foldData = foldData;
  5807. if (Array.isArray(folds)) {
  5808. this.folds = folds;
  5809. } else {
  5810. folds = this.folds = [ folds ];
  5811. }
  5812. var last = folds[folds.length - 1];
  5813. this.range = new Range(folds[0].start.row, folds[0].start.column,
  5814. last.end.row, last.end.column);
  5815. this.start = this.range.start;
  5816. this.end = this.range.end;
  5817. this.folds.forEach(function(fold) {
  5818. fold.setFoldLine(this);
  5819. }, this);
  5820. }
  5821. (function() {
  5822. this.shiftRow = function(shift) {
  5823. this.start.row += shift;
  5824. this.end.row += shift;
  5825. this.folds.forEach(function(fold) {
  5826. fold.start.row += shift;
  5827. fold.end.row += shift;
  5828. });
  5829. };
  5830. this.addFold = function(fold) {
  5831. if (fold.sameRow) {
  5832. if (fold.start.row < this.startRow || fold.endRow > this.endRow) {
  5833. throw new Error("Can't add a fold to this FoldLine as it has no connection");
  5834. }
  5835. this.folds.push(fold);
  5836. this.folds.sort(function(a, b) {
  5837. return -a.range.compareEnd(b.start.row, b.start.column);
  5838. });
  5839. if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) {
  5840. this.end.row = fold.end.row;
  5841. this.end.column = fold.end.column;
  5842. } else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) {
  5843. this.start.row = fold.start.row;
  5844. this.start.column = fold.start.column;
  5845. }
  5846. } else if (fold.start.row == this.end.row) {
  5847. this.folds.push(fold);
  5848. this.end.row = fold.end.row;
  5849. this.end.column = fold.end.column;
  5850. } else if (fold.end.row == this.start.row) {
  5851. this.folds.unshift(fold);
  5852. this.start.row = fold.start.row;
  5853. this.start.column = fold.start.column;
  5854. } else {
  5855. throw new Error("Trying to add fold to FoldRow that doesn't have a matching row");
  5856. }
  5857. fold.foldLine = this;
  5858. };
  5859. this.containsRow = function(row) {
  5860. return row >= this.start.row && row <= this.end.row;
  5861. };
  5862. this.walk = function(callback, endRow, endColumn) {
  5863. var lastEnd = 0,
  5864. folds = this.folds,
  5865. fold,
  5866. cmp, stop, isNewRow = true;
  5867. if (endRow == null) {
  5868. endRow = this.end.row;
  5869. endColumn = this.end.column;
  5870. }
  5871. for (var i = 0; i < folds.length; i++) {
  5872. fold = folds[i];
  5873. cmp = fold.range.compareStart(endRow, endColumn);
  5874. if (cmp == -1) {
  5875. callback(null, endRow, endColumn, lastEnd, isNewRow);
  5876. return;
  5877. }
  5878. stop = callback(null, fold.start.row, fold.start.column, lastEnd, isNewRow);
  5879. stop = !stop && callback(fold.placeholder, fold.start.row, fold.start.column, lastEnd);
  5880. if (stop || cmp === 0) {
  5881. return;
  5882. }
  5883. isNewRow = !fold.sameRow;
  5884. lastEnd = fold.end.column;
  5885. }
  5886. callback(null, endRow, endColumn, lastEnd, isNewRow);
  5887. };
  5888. this.getNextFoldTo = function(row, column) {
  5889. var fold, cmp;
  5890. for (var i = 0; i < this.folds.length; i++) {
  5891. fold = this.folds[i];
  5892. cmp = fold.range.compareEnd(row, column);
  5893. if (cmp == -1) {
  5894. return {
  5895. fold: fold,
  5896. kind: "after"
  5897. };
  5898. } else if (cmp === 0) {
  5899. return {
  5900. fold: fold,
  5901. kind: "inside"
  5902. };
  5903. }
  5904. }
  5905. return null;
  5906. };
  5907. this.addRemoveChars = function(row, column, len) {
  5908. var ret = this.getNextFoldTo(row, column),
  5909. fold, folds;
  5910. if (ret) {
  5911. fold = ret.fold;
  5912. if (ret.kind == "inside"
  5913. && fold.start.column != column
  5914. && fold.start.row != row)
  5915. {
  5916. window.console && window.console.log(row, column, fold);
  5917. } else if (fold.start.row == row) {
  5918. folds = this.folds;
  5919. var i = folds.indexOf(fold);
  5920. if (i === 0) {
  5921. this.start.column += len;
  5922. }
  5923. for (i; i < folds.length; i++) {
  5924. fold = folds[i];
  5925. fold.start.column += len;
  5926. if (!fold.sameRow) {
  5927. return;
  5928. }
  5929. fold.end.column += len;
  5930. }
  5931. this.end.column += len;
  5932. }
  5933. }
  5934. };
  5935. this.split = function(row, column) {
  5936. var pos = this.getNextFoldTo(row, column);
  5937. if (!pos || pos.kind == "inside")
  5938. return null;
  5939. var fold = pos.fold;
  5940. var folds = this.folds;
  5941. var foldData = this.foldData;
  5942. var i = folds.indexOf(fold);
  5943. var foldBefore = folds[i - 1];
  5944. this.end.row = foldBefore.end.row;
  5945. this.end.column = foldBefore.end.column;
  5946. folds = folds.splice(i, folds.length - i);
  5947. var newFoldLine = new FoldLine(foldData, folds);
  5948. foldData.splice(foldData.indexOf(this) + 1, 0, newFoldLine);
  5949. return newFoldLine;
  5950. };
  5951. this.merge = function(foldLineNext) {
  5952. var folds = foldLineNext.folds;
  5953. for (var i = 0; i < folds.length; i++) {
  5954. this.addFold(folds[i]);
  5955. }
  5956. var foldData = this.foldData;
  5957. foldData.splice(foldData.indexOf(foldLineNext), 1);
  5958. };
  5959. this.toString = function() {
  5960. var ret = [this.range.toString() + ": [" ];
  5961. this.folds.forEach(function(fold) {
  5962. ret.push(" " + fold.toString());
  5963. });
  5964. ret.push("]");
  5965. return ret.join("\n");
  5966. };
  5967. this.idxToPosition = function(idx) {
  5968. var lastFoldEndColumn = 0;
  5969. for (var i = 0; i < this.folds.length; i++) {
  5970. var fold = this.folds[i];
  5971. idx -= fold.start.column - lastFoldEndColumn;
  5972. if (idx < 0) {
  5973. return {
  5974. row: fold.start.row,
  5975. column: fold.start.column + idx
  5976. };
  5977. }
  5978. idx -= fold.placeholder.length;
  5979. if (idx < 0) {
  5980. return fold.start;
  5981. }
  5982. lastFoldEndColumn = fold.end.column;
  5983. }
  5984. return {
  5985. row: this.end.row,
  5986. column: this.end.column + idx
  5987. };
  5988. };
  5989. }).call(FoldLine.prototype);
  5990. exports.FoldLine = FoldLine;
  5991. });
  5992. ace.define("ace/range_list",["require","exports","module","ace/range"], function(require, exports, module) {
  5993. "use strict";
  5994. var Range = require("./range").Range;
  5995. var comparePoints = Range.comparePoints;
  5996. var RangeList = function() {
  5997. this.ranges = [];
  5998. };
  5999. (function() {
  6000. this.comparePoints = comparePoints;
  6001. this.pointIndex = function(pos, excludeEdges, startIndex) {
  6002. var list = this.ranges;
  6003. for (var i = startIndex || 0; i < list.length; i++) {
  6004. var range = list[i];
  6005. var cmpEnd = comparePoints(pos, range.end);
  6006. if (cmpEnd > 0)
  6007. continue;
  6008. var cmpStart = comparePoints(pos, range.start);
  6009. if (cmpEnd === 0)
  6010. return excludeEdges && cmpStart !== 0 ? -i-2 : i;
  6011. if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges))
  6012. return i;
  6013. return -i-1;
  6014. }
  6015. return -i - 1;
  6016. };
  6017. this.add = function(range) {
  6018. var excludeEdges = !range.isEmpty();
  6019. var startIndex = this.pointIndex(range.start, excludeEdges);
  6020. if (startIndex < 0)
  6021. startIndex = -startIndex - 1;
  6022. var endIndex = this.pointIndex(range.end, excludeEdges, startIndex);
  6023. if (endIndex < 0)
  6024. endIndex = -endIndex - 1;
  6025. else
  6026. endIndex++;
  6027. return this.ranges.splice(startIndex, endIndex - startIndex, range);
  6028. };
  6029. this.addList = function(list) {
  6030. var removed = [];
  6031. for (var i = list.length; i--; ) {
  6032. removed.push.call(removed, this.add(list[i]));
  6033. }
  6034. return removed;
  6035. };
  6036. this.substractPoint = function(pos) {
  6037. var i = this.pointIndex(pos);
  6038. if (i >= 0)
  6039. return this.ranges.splice(i, 1);
  6040. };
  6041. this.merge = function() {
  6042. var removed = [];
  6043. var list = this.ranges;
  6044. list = list.sort(function(a, b) {
  6045. return comparePoints(a.start, b.start);
  6046. });
  6047. var next = list[0], range;
  6048. for (var i = 1; i < list.length; i++) {
  6049. range = next;
  6050. next = list[i];
  6051. var cmp = comparePoints(range.end, next.start);
  6052. if (cmp < 0)
  6053. continue;
  6054. if (cmp == 0 && !range.isEmpty() && !next.isEmpty())
  6055. continue;
  6056. if (comparePoints(range.end, next.end) < 0) {
  6057. range.end.row = next.end.row;
  6058. range.end.column = next.end.column;
  6059. }
  6060. list.splice(i, 1);
  6061. removed.push(next);
  6062. next = range;
  6063. i--;
  6064. }
  6065. this.ranges = list;
  6066. return removed;
  6067. };
  6068. this.contains = function(row, column) {
  6069. return this.pointIndex({row: row, column: column}) >= 0;
  6070. };
  6071. this.containsPoint = function(pos) {
  6072. return this.pointIndex(pos) >= 0;
  6073. };
  6074. this.rangeAtPoint = function(pos) {
  6075. var i = this.pointIndex(pos);
  6076. if (i >= 0)
  6077. return this.ranges[i];
  6078. };
  6079. this.clipRows = function(startRow, endRow) {
  6080. var list = this.ranges;
  6081. if (list[0].start.row > endRow || list[list.length - 1].start.row < startRow)
  6082. return [];
  6083. var startIndex = this.pointIndex({row: startRow, column: 0});
  6084. if (startIndex < 0)
  6085. startIndex = -startIndex - 1;
  6086. var endIndex = this.pointIndex({row: endRow, column: 0}, startIndex);
  6087. if (endIndex < 0)
  6088. endIndex = -endIndex - 1;
  6089. var clipped = [];
  6090. for (var i = startIndex; i < endIndex; i++) {
  6091. clipped.push(list[i]);
  6092. }
  6093. return clipped;
  6094. };
  6095. this.removeAll = function() {
  6096. return this.ranges.splice(0, this.ranges.length);
  6097. };
  6098. this.attach = function(session) {
  6099. if (this.session)
  6100. this.detach();
  6101. this.session = session;
  6102. this.onChange = this.$onChange.bind(this);
  6103. this.session.on('change', this.onChange);
  6104. };
  6105. this.detach = function() {
  6106. if (!this.session)
  6107. return;
  6108. this.session.removeListener('change', this.onChange);
  6109. this.session = null;
  6110. };
  6111. this.$onChange = function(e) {
  6112. var changeRange = e.data.range;
  6113. if (e.data.action[0] == "i"){
  6114. var start = changeRange.start;
  6115. var end = changeRange.end;
  6116. } else {
  6117. var end = changeRange.start;
  6118. var start = changeRange.end;
  6119. }
  6120. var startRow = start.row;
  6121. var endRow = end.row;
  6122. var lineDif = endRow - startRow;
  6123. var colDiff = -start.column + end.column;
  6124. var ranges = this.ranges;
  6125. for (var i = 0, n = ranges.length; i < n; i++) {
  6126. var r = ranges[i];
  6127. if (r.end.row < startRow)
  6128. continue;
  6129. if (r.start.row > startRow)
  6130. break;
  6131. if (r.start.row == startRow && r.start.column >= start.column ) {
  6132. if (r.start.column == start.column && this.$insertRight) {
  6133. } else {
  6134. r.start.column += colDiff;
  6135. r.start.row += lineDif;
  6136. }
  6137. }
  6138. if (r.end.row == startRow && r.end.column >= start.column) {
  6139. if (r.end.column == start.column && this.$insertRight) {
  6140. continue;
  6141. }
  6142. if (r.end.column == start.column && colDiff > 0 && i < n - 1) {
  6143. if (r.end.column > r.start.column && r.end.column == ranges[i+1].start.column)
  6144. r.end.column -= colDiff;
  6145. }
  6146. r.end.column += colDiff;
  6147. r.end.row += lineDif;
  6148. }
  6149. }
  6150. if (lineDif != 0 && i < n) {
  6151. for (; i < n; i++) {
  6152. var r = ranges[i];
  6153. r.start.row += lineDif;
  6154. r.end.row += lineDif;
  6155. }
  6156. }
  6157. };
  6158. }).call(RangeList.prototype);
  6159. exports.RangeList = RangeList;
  6160. });
  6161. ace.define("ace/edit_session/fold",["require","exports","module","ace/range","ace/range_list","ace/lib/oop"], function(require, exports, module) {
  6162. "use strict";
  6163. var Range = require("../range").Range;
  6164. var RangeList = require("../range_list").RangeList;
  6165. var oop = require("../lib/oop")
  6166. var Fold = exports.Fold = function(range, placeholder) {
  6167. this.foldLine = null;
  6168. this.placeholder = placeholder;
  6169. this.range = range;
  6170. this.start = range.start;
  6171. this.end = range.end;
  6172. this.sameRow = range.start.row == range.end.row;
  6173. this.subFolds = this.ranges = [];
  6174. };
  6175. oop.inherits(Fold, RangeList);
  6176. (function() {
  6177. this.toString = function() {
  6178. return '"' + this.placeholder + '" ' + this.range.toString();
  6179. };
  6180. this.setFoldLine = function(foldLine) {
  6181. this.foldLine = foldLine;
  6182. this.subFolds.forEach(function(fold) {
  6183. fold.setFoldLine(foldLine);
  6184. });
  6185. };
  6186. this.clone = function() {
  6187. var range = this.range.clone();
  6188. var fold = new Fold(range, this.placeholder);
  6189. this.subFolds.forEach(function(subFold) {
  6190. fold.subFolds.push(subFold.clone());
  6191. });
  6192. fold.collapseChildren = this.collapseChildren;
  6193. return fold;
  6194. };
  6195. this.addSubFold = function(fold) {
  6196. if (this.range.isEqual(fold))
  6197. return;
  6198. if (!this.range.containsRange(fold))
  6199. throw new Error("A fold can't intersect already existing fold" + fold.range + this.range);
  6200. consumeRange(fold, this.start);
  6201. var row = fold.start.row, column = fold.start.column;
  6202. for (var i = 0, cmp = -1; i < this.subFolds.length; i++) {
  6203. cmp = this.subFolds[i].range.compare(row, column);
  6204. if (cmp != 1)
  6205. break;
  6206. }
  6207. var afterStart = this.subFolds[i];
  6208. if (cmp == 0)
  6209. return afterStart.addSubFold(fold);
  6210. var row = fold.range.end.row, column = fold.range.end.column;
  6211. for (var j = i, cmp = -1; j < this.subFolds.length; j++) {
  6212. cmp = this.subFolds[j].range.compare(row, column);
  6213. if (cmp != 1)
  6214. break;
  6215. }
  6216. var afterEnd = this.subFolds[j];
  6217. if (cmp == 0)
  6218. throw new Error("A fold can't intersect already existing fold" + fold.range + this.range);
  6219. var consumedFolds = this.subFolds.splice(i, j - i, fold);
  6220. fold.setFoldLine(this.foldLine);
  6221. return fold;
  6222. };
  6223. this.restoreRange = function(range) {
  6224. return restoreRange(range, this.start);
  6225. };
  6226. }).call(Fold.prototype);
  6227. function consumePoint(point, anchor) {
  6228. point.row -= anchor.row;
  6229. if (point.row == 0)
  6230. point.column -= anchor.column;
  6231. }
  6232. function consumeRange(range, anchor) {
  6233. consumePoint(range.start, anchor);
  6234. consumePoint(range.end, anchor);
  6235. }
  6236. function restorePoint(point, anchor) {
  6237. if (point.row == 0)
  6238. point.column += anchor.column;
  6239. point.row += anchor.row;
  6240. }
  6241. function restoreRange(range, anchor) {
  6242. restorePoint(range.start, anchor);
  6243. restorePoint(range.end, anchor);
  6244. }
  6245. });
  6246. ace.define("ace/edit_session/folding",["require","exports","module","ace/range","ace/edit_session/fold_line","ace/edit_session/fold","ace/token_iterator"], function(require, exports, module) {
  6247. "use strict";
  6248. var Range = require("../range").Range;
  6249. var FoldLine = require("./fold_line").FoldLine;
  6250. var Fold = require("./fold").Fold;
  6251. var TokenIterator = require("../token_iterator").TokenIterator;
  6252. function Folding() {
  6253. this.getFoldAt = function(row, column, side) {
  6254. var foldLine = this.getFoldLine(row);
  6255. if (!foldLine)
  6256. return null;
  6257. var folds = foldLine.folds;
  6258. for (var i = 0; i < folds.length; i++) {
  6259. var fold = folds[i];
  6260. if (fold.range.contains(row, column)) {
  6261. if (side == 1 && fold.range.isEnd(row, column)) {
  6262. continue;
  6263. } else if (side == -1 && fold.range.isStart(row, column)) {
  6264. continue;
  6265. }
  6266. return fold;
  6267. }
  6268. }
  6269. };
  6270. this.getFoldsInRange = function(range) {
  6271. var start = range.start;
  6272. var end = range.end;
  6273. var foldLines = this.$foldData;
  6274. var foundFolds = [];
  6275. start.column += 1;
  6276. end.column -= 1;
  6277. for (var i = 0; i < foldLines.length; i++) {
  6278. var cmp = foldLines[i].range.compareRange(range);
  6279. if (cmp == 2) {
  6280. continue;
  6281. }
  6282. else if (cmp == -2) {
  6283. break;
  6284. }
  6285. var folds = foldLines[i].folds;
  6286. for (var j = 0; j < folds.length; j++) {
  6287. var fold = folds[j];
  6288. cmp = fold.range.compareRange(range);
  6289. if (cmp == -2) {
  6290. break;
  6291. } else if (cmp == 2) {
  6292. continue;
  6293. } else
  6294. if (cmp == 42) {
  6295. break;
  6296. }
  6297. foundFolds.push(fold);
  6298. }
  6299. }
  6300. start.column -= 1;
  6301. end.column += 1;
  6302. return foundFolds;
  6303. };
  6304. this.getFoldsInRangeList = function(ranges) {
  6305. if (Array.isArray(ranges)) {
  6306. var folds = [];
  6307. ranges.forEach(function(range) {
  6308. folds = folds.concat(this.getFoldsInRange(range));
  6309. }, this);
  6310. } else {
  6311. var folds = this.getFoldsInRange(ranges);
  6312. }
  6313. return folds;
  6314. }
  6315. this.getAllFolds = function() {
  6316. var folds = [];
  6317. var foldLines = this.$foldData;
  6318. for (var i = 0; i < foldLines.length; i++)
  6319. for (var j = 0; j < foldLines[i].folds.length; j++)
  6320. folds.push(foldLines[i].folds[j]);
  6321. return folds;
  6322. };
  6323. this.getFoldStringAt = function(row, column, trim, foldLine) {
  6324. foldLine = foldLine || this.getFoldLine(row);
  6325. if (!foldLine)
  6326. return null;
  6327. var lastFold = {
  6328. end: { column: 0 }
  6329. };
  6330. var str, fold;
  6331. for (var i = 0; i < foldLine.folds.length; i++) {
  6332. fold = foldLine.folds[i];
  6333. var cmp = fold.range.compareEnd(row, column);
  6334. if (cmp == -1) {
  6335. str = this
  6336. .getLine(fold.start.row)
  6337. .substring(lastFold.end.column, fold.start.column);
  6338. break;
  6339. }
  6340. else if (cmp === 0) {
  6341. return null;
  6342. }
  6343. lastFold = fold;
  6344. }
  6345. if (!str)
  6346. str = this.getLine(fold.start.row).substring(lastFold.end.column);
  6347. if (trim == -1)
  6348. return str.substring(0, column - lastFold.end.column);
  6349. else if (trim == 1)
  6350. return str.substring(column - lastFold.end.column);
  6351. else
  6352. return str;
  6353. };
  6354. this.getFoldLine = function(docRow, startFoldLine) {
  6355. var foldData = this.$foldData;
  6356. var i = 0;
  6357. if (startFoldLine)
  6358. i = foldData.indexOf(startFoldLine);
  6359. if (i == -1)
  6360. i = 0;
  6361. for (i; i < foldData.length; i++) {
  6362. var foldLine = foldData[i];
  6363. if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) {
  6364. return foldLine;
  6365. } else if (foldLine.end.row > docRow) {
  6366. return null;
  6367. }
  6368. }
  6369. return null;
  6370. };
  6371. this.getNextFoldLine = function(docRow, startFoldLine) {
  6372. var foldData = this.$foldData;
  6373. var i = 0;
  6374. if (startFoldLine)
  6375. i = foldData.indexOf(startFoldLine);
  6376. if (i == -1)
  6377. i = 0;
  6378. for (i; i < foldData.length; i++) {
  6379. var foldLine = foldData[i];
  6380. if (foldLine.end.row >= docRow) {
  6381. return foldLine;
  6382. }
  6383. }
  6384. return null;
  6385. };
  6386. this.getFoldedRowCount = function(first, last) {
  6387. var foldData = this.$foldData, rowCount = last-first+1;
  6388. for (var i = 0; i < foldData.length; i++) {
  6389. var foldLine = foldData[i],
  6390. end = foldLine.end.row,
  6391. start = foldLine.start.row;
  6392. if (end >= last) {
  6393. if(start < last) {
  6394. if(start >= first)
  6395. rowCount -= last-start;
  6396. else
  6397. rowCount = 0;//in one fold
  6398. }
  6399. break;
  6400. } else if(end >= first){
  6401. if (start >= first) //fold inside range
  6402. rowCount -= end-start;
  6403. else
  6404. rowCount -= end-first+1;
  6405. }
  6406. }
  6407. return rowCount;
  6408. };
  6409. this.$addFoldLine = function(foldLine) {
  6410. this.$foldData.push(foldLine);
  6411. this.$foldData.sort(function(a, b) {
  6412. return a.start.row - b.start.row;
  6413. });
  6414. return foldLine;
  6415. };
  6416. this.addFold = function(placeholder, range) {
  6417. var foldData = this.$foldData;
  6418. var added = false;
  6419. var fold;
  6420. if (placeholder instanceof Fold)
  6421. fold = placeholder;
  6422. else {
  6423. fold = new Fold(range, placeholder);
  6424. fold.collapseChildren = range.collapseChildren;
  6425. }
  6426. this.$clipRangeToDocument(fold.range);
  6427. var startRow = fold.start.row;
  6428. var startColumn = fold.start.column;
  6429. var endRow = fold.end.row;
  6430. var endColumn = fold.end.column;
  6431. if (!(startRow < endRow ||
  6432. startRow == endRow && startColumn <= endColumn - 2))
  6433. throw new Error("The range has to be at least 2 characters width");
  6434. var startFold = this.getFoldAt(startRow, startColumn, 1);
  6435. var endFold = this.getFoldAt(endRow, endColumn, -1);
  6436. if (startFold && endFold == startFold)
  6437. return startFold.addSubFold(fold);
  6438. if (startFold && !startFold.range.isStart(startRow, startColumn))
  6439. this.removeFold(startFold);
  6440. if (endFold && !endFold.range.isEnd(endRow, endColumn))
  6441. this.removeFold(endFold);
  6442. var folds = this.getFoldsInRange(fold.range);
  6443. if (folds.length > 0) {
  6444. this.removeFolds(folds);
  6445. folds.forEach(function(subFold) {
  6446. fold.addSubFold(subFold);
  6447. });
  6448. }
  6449. for (var i = 0; i < foldData.length; i++) {
  6450. var foldLine = foldData[i];
  6451. if (endRow == foldLine.start.row) {
  6452. foldLine.addFold(fold);
  6453. added = true;
  6454. break;
  6455. } else if (startRow == foldLine.end.row) {
  6456. foldLine.addFold(fold);
  6457. added = true;
  6458. if (!fold.sameRow) {
  6459. var foldLineNext = foldData[i + 1];
  6460. if (foldLineNext && foldLineNext.start.row == endRow) {
  6461. foldLine.merge(foldLineNext);
  6462. break;
  6463. }
  6464. }
  6465. break;
  6466. } else if (endRow <= foldLine.start.row) {
  6467. break;
  6468. }
  6469. }
  6470. if (!added)
  6471. foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold));
  6472. if (this.$useWrapMode)
  6473. this.$updateWrapData(foldLine.start.row, foldLine.start.row);
  6474. else
  6475. this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row);
  6476. this.$modified = true;
  6477. this._emit("changeFold", { data: fold, action: "add" });
  6478. return fold;
  6479. };
  6480. this.addFolds = function(folds) {
  6481. folds.forEach(function(fold) {
  6482. this.addFold(fold);
  6483. }, this);
  6484. };
  6485. this.removeFold = function(fold) {
  6486. var foldLine = fold.foldLine;
  6487. var startRow = foldLine.start.row;
  6488. var endRow = foldLine.end.row;
  6489. var foldLines = this.$foldData;
  6490. var folds = foldLine.folds;
  6491. if (folds.length == 1) {
  6492. foldLines.splice(foldLines.indexOf(foldLine), 1);
  6493. } else
  6494. if (foldLine.range.isEnd(fold.end.row, fold.end.column)) {
  6495. folds.pop();
  6496. foldLine.end.row = folds[folds.length - 1].end.row;
  6497. foldLine.end.column = folds[folds.length - 1].end.column;
  6498. } else
  6499. if (foldLine.range.isStart(fold.start.row, fold.start.column)) {
  6500. folds.shift();
  6501. foldLine.start.row = folds[0].start.row;
  6502. foldLine.start.column = folds[0].start.column;
  6503. } else
  6504. if (fold.sameRow) {
  6505. folds.splice(folds.indexOf(fold), 1);
  6506. } else
  6507. {
  6508. var newFoldLine = foldLine.split(fold.start.row, fold.start.column);
  6509. folds = newFoldLine.folds;
  6510. folds.shift();
  6511. newFoldLine.start.row = folds[0].start.row;
  6512. newFoldLine.start.column = folds[0].start.column;
  6513. }
  6514. if (!this.$updating) {
  6515. if (this.$useWrapMode)
  6516. this.$updateWrapData(startRow, endRow);
  6517. else
  6518. this.$updateRowLengthCache(startRow, endRow);
  6519. }
  6520. this.$modified = true;
  6521. this._emit("changeFold", { data: fold, action: "remove" });
  6522. };
  6523. this.removeFolds = function(folds) {
  6524. var cloneFolds = [];
  6525. for (var i = 0; i < folds.length; i++) {
  6526. cloneFolds.push(folds[i]);
  6527. }
  6528. cloneFolds.forEach(function(fold) {
  6529. this.removeFold(fold);
  6530. }, this);
  6531. this.$modified = true;
  6532. };
  6533. this.expandFold = function(fold) {
  6534. this.removeFold(fold);
  6535. fold.subFolds.forEach(function(subFold) {
  6536. fold.restoreRange(subFold);
  6537. this.addFold(subFold);
  6538. }, this);
  6539. if (fold.collapseChildren > 0) {
  6540. this.foldAll(fold.start.row+1, fold.end.row, fold.collapseChildren-1);
  6541. }
  6542. fold.subFolds = [];
  6543. };
  6544. this.expandFolds = function(folds) {
  6545. folds.forEach(function(fold) {
  6546. this.expandFold(fold);
  6547. }, this);
  6548. };
  6549. this.unfold = function(location, expandInner) {
  6550. var range, folds;
  6551. if (location == null) {
  6552. range = new Range(0, 0, this.getLength(), 0);
  6553. expandInner = true;
  6554. } else if (typeof location == "number")
  6555. range = new Range(location, 0, location, this.getLine(location).length);
  6556. else if ("row" in location)
  6557. range = Range.fromPoints(location, location);
  6558. else
  6559. range = location;
  6560. folds = this.getFoldsInRangeList(range);
  6561. if (expandInner) {
  6562. this.removeFolds(folds);
  6563. } else {
  6564. var subFolds = folds;
  6565. while (subFolds.length) {
  6566. this.expandFolds(subFolds);
  6567. subFolds = this.getFoldsInRangeList(range);
  6568. }
  6569. }
  6570. if (folds.length)
  6571. return folds;
  6572. };
  6573. this.isRowFolded = function(docRow, startFoldRow) {
  6574. return !!this.getFoldLine(docRow, startFoldRow);
  6575. };
  6576. this.getRowFoldEnd = function(docRow, startFoldRow) {
  6577. var foldLine = this.getFoldLine(docRow, startFoldRow);
  6578. return foldLine ? foldLine.end.row : docRow;
  6579. };
  6580. this.getRowFoldStart = function(docRow, startFoldRow) {
  6581. var foldLine = this.getFoldLine(docRow, startFoldRow);
  6582. return foldLine ? foldLine.start.row : docRow;
  6583. };
  6584. this.getFoldDisplayLine = function(foldLine, endRow, endColumn, startRow, startColumn) {
  6585. if (startRow == null)
  6586. startRow = foldLine.start.row;
  6587. if (startColumn == null)
  6588. startColumn = 0;
  6589. if (endRow == null)
  6590. endRow = foldLine.end.row;
  6591. if (endColumn == null)
  6592. endColumn = this.getLine(endRow).length;
  6593. var doc = this.doc;
  6594. var textLine = "";
  6595. foldLine.walk(function(placeholder, row, column, lastColumn) {
  6596. if (row < startRow)
  6597. return;
  6598. if (row == startRow) {
  6599. if (column < startColumn)
  6600. return;
  6601. lastColumn = Math.max(startColumn, lastColumn);
  6602. }
  6603. if (placeholder != null) {
  6604. textLine += placeholder;
  6605. } else {
  6606. textLine += doc.getLine(row).substring(lastColumn, column);
  6607. }
  6608. }, endRow, endColumn);
  6609. return textLine;
  6610. };
  6611. this.getDisplayLine = function(row, endColumn, startRow, startColumn) {
  6612. var foldLine = this.getFoldLine(row);
  6613. if (!foldLine) {
  6614. var line;
  6615. line = this.doc.getLine(row);
  6616. return line.substring(startColumn || 0, endColumn || line.length);
  6617. } else {
  6618. return this.getFoldDisplayLine(
  6619. foldLine, row, endColumn, startRow, startColumn);
  6620. }
  6621. };
  6622. this.$cloneFoldData = function() {
  6623. var fd = [];
  6624. fd = this.$foldData.map(function(foldLine) {
  6625. var folds = foldLine.folds.map(function(fold) {
  6626. return fold.clone();
  6627. });
  6628. return new FoldLine(fd, folds);
  6629. });
  6630. return fd;
  6631. };
  6632. this.toggleFold = function(tryToUnfold) {
  6633. var selection = this.selection;
  6634. var range = selection.getRange();
  6635. var fold;
  6636. var bracketPos;
  6637. if (range.isEmpty()) {
  6638. var cursor = range.start;
  6639. fold = this.getFoldAt(cursor.row, cursor.column);
  6640. if (fold) {
  6641. this.expandFold(fold);
  6642. return;
  6643. } else if (bracketPos = this.findMatchingBracket(cursor)) {
  6644. if (range.comparePoint(bracketPos) == 1) {
  6645. range.end = bracketPos;
  6646. } else {
  6647. range.start = bracketPos;
  6648. range.start.column++;
  6649. range.end.column--;
  6650. }
  6651. } else if (bracketPos = this.findMatchingBracket({row: cursor.row, column: cursor.column + 1})) {
  6652. if (range.comparePoint(bracketPos) == 1)
  6653. range.end = bracketPos;
  6654. else
  6655. range.start = bracketPos;
  6656. range.start.column++;
  6657. } else {
  6658. range = this.getCommentFoldRange(cursor.row, cursor.column) || range;
  6659. }
  6660. } else {
  6661. var folds = this.getFoldsInRange(range);
  6662. if (tryToUnfold && folds.length) {
  6663. this.expandFolds(folds);
  6664. return;
  6665. } else if (folds.length == 1 ) {
  6666. fold = folds[0];
  6667. }
  6668. }
  6669. if (!fold)
  6670. fold = this.getFoldAt(range.start.row, range.start.column);
  6671. if (fold && fold.range.toString() == range.toString()) {
  6672. this.expandFold(fold);
  6673. return;
  6674. }
  6675. var placeholder = "...";
  6676. if (!range.isMultiLine()) {
  6677. placeholder = this.getTextRange(range);
  6678. if(placeholder.length < 4)
  6679. return;
  6680. placeholder = placeholder.trim().substring(0, 2) + "..";
  6681. }
  6682. this.addFold(placeholder, range);
  6683. };
  6684. this.getCommentFoldRange = function(row, column, dir) {
  6685. var iterator = new TokenIterator(this, row, column);
  6686. var token = iterator.getCurrentToken();
  6687. if (token && /^comment|string/.test(token.type)) {
  6688. var range = new Range();
  6689. var re = new RegExp(token.type.replace(/\..*/, "\\."));
  6690. if (dir != 1) {
  6691. do {
  6692. token = iterator.stepBackward();
  6693. } while(token && re.test(token.type));
  6694. iterator.stepForward();
  6695. }
  6696. range.start.row = iterator.getCurrentTokenRow();
  6697. range.start.column = iterator.getCurrentTokenColumn() + 2;
  6698. iterator = new TokenIterator(this, row, column);
  6699. if (dir != -1) {
  6700. do {
  6701. token = iterator.stepForward();
  6702. } while(token && re.test(token.type));
  6703. token = iterator.stepBackward();
  6704. } else
  6705. token = iterator.getCurrentToken();
  6706. range.end.row = iterator.getCurrentTokenRow();
  6707. range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 2;
  6708. return range;
  6709. }
  6710. };
  6711. this.foldAll = function(startRow, endRow, depth) {
  6712. if (depth == undefined)
  6713. depth = 100000; // JSON.stringify doesn't hanle Infinity
  6714. var foldWidgets = this.foldWidgets;
  6715. if (!foldWidgets)
  6716. return; // mode doesn't support folding
  6717. endRow = endRow || this.getLength();
  6718. startRow = startRow || 0;
  6719. for (var row = startRow; row < endRow; row++) {
  6720. if (foldWidgets[row] == null)
  6721. foldWidgets[row] = this.getFoldWidget(row);
  6722. if (foldWidgets[row] != "start")
  6723. continue;
  6724. var range = this.getFoldWidgetRange(row);
  6725. if (range && range.isMultiLine()
  6726. && range.end.row <= endRow
  6727. && range.start.row >= startRow
  6728. ) {
  6729. row = range.end.row;
  6730. try {
  6731. var fold = this.addFold("...", range);
  6732. if (fold)
  6733. fold.collapseChildren = depth;
  6734. } catch(e) {}
  6735. }
  6736. }
  6737. };
  6738. this.$foldStyles = {
  6739. "manual": 1,
  6740. "markbegin": 1,
  6741. "markbeginend": 1
  6742. };
  6743. this.$foldStyle = "markbegin";
  6744. this.setFoldStyle = function(style) {
  6745. if (!this.$foldStyles[style])
  6746. throw new Error("invalid fold style: " + style + "[" + Object.keys(this.$foldStyles).join(", ") + "]");
  6747. if (this.$foldStyle == style)
  6748. return;
  6749. this.$foldStyle = style;
  6750. if (style == "manual")
  6751. this.unfold();
  6752. var mode = this.$foldMode;
  6753. this.$setFolding(null);
  6754. this.$setFolding(mode);
  6755. };
  6756. this.$setFolding = function(foldMode) {
  6757. if (this.$foldMode == foldMode)
  6758. return;
  6759. this.$foldMode = foldMode;
  6760. this.off('change', this.$updateFoldWidgets);
  6761. this.off('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets);
  6762. this._emit("changeAnnotation");
  6763. if (!foldMode || this.$foldStyle == "manual") {
  6764. this.foldWidgets = null;
  6765. return;
  6766. }
  6767. this.foldWidgets = [];
  6768. this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this, this.$foldStyle);
  6769. this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle);
  6770. this.$updateFoldWidgets = this.updateFoldWidgets.bind(this);
  6771. this.$tokenizerUpdateFoldWidgets = this.tokenizerUpdateFoldWidgets.bind(this);
  6772. this.on('change', this.$updateFoldWidgets);
  6773. this.on('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets);
  6774. };
  6775. this.getParentFoldRangeData = function (row, ignoreCurrent) {
  6776. var fw = this.foldWidgets;
  6777. if (!fw || (ignoreCurrent && fw[row]))
  6778. return {};
  6779. var i = row - 1, firstRange;
  6780. while (i >= 0) {
  6781. var c = fw[i];
  6782. if (c == null)
  6783. c = fw[i] = this.getFoldWidget(i);
  6784. if (c == "start") {
  6785. var range = this.getFoldWidgetRange(i);
  6786. if (!firstRange)
  6787. firstRange = range;
  6788. if (range && range.end.row >= row)
  6789. break;
  6790. }
  6791. i--;
  6792. }
  6793. return {
  6794. range: i !== -1 && range,
  6795. firstRange: firstRange
  6796. };
  6797. }
  6798. this.onFoldWidgetClick = function(row, e) {
  6799. e = e.domEvent;
  6800. var options = {
  6801. children: e.shiftKey,
  6802. all: e.ctrlKey || e.metaKey,
  6803. siblings: e.altKey
  6804. };
  6805. var range = this.$toggleFoldWidget(row, options);
  6806. if (!range) {
  6807. var el = (e.target || e.srcElement)
  6808. if (el && /ace_fold-widget/.test(el.className))
  6809. el.className += " ace_invalid";
  6810. }
  6811. };
  6812. this.$toggleFoldWidget = function(row, options) {
  6813. if (!this.getFoldWidget)
  6814. return;
  6815. var type = this.getFoldWidget(row);
  6816. var line = this.getLine(row);
  6817. var dir = type === "end" ? -1 : 1;
  6818. var fold = this.getFoldAt(row, dir === -1 ? 0 : line.length, dir);
  6819. if (fold) {
  6820. if (options.children || options.all)
  6821. this.removeFold(fold);
  6822. else
  6823. this.expandFold(fold);
  6824. return;
  6825. }
  6826. var range = this.getFoldWidgetRange(row, true);
  6827. if (range && !range.isMultiLine()) {
  6828. fold = this.getFoldAt(range.start.row, range.start.column, 1);
  6829. if (fold && range.isEqual(fold.range)) {
  6830. this.removeFold(fold);
  6831. return;
  6832. }
  6833. }
  6834. if (options.siblings) {
  6835. var data = this.getParentFoldRangeData(row);
  6836. if (data.range) {
  6837. var startRow = data.range.start.row + 1;
  6838. var endRow = data.range.end.row;
  6839. }
  6840. this.foldAll(startRow, endRow, options.all ? 10000 : 0);
  6841. } else if (options.children) {
  6842. endRow = range ? range.end.row : this.getLength();
  6843. this.foldAll(row + 1, endRow, options.all ? 10000 : 0);
  6844. } else if (range) {
  6845. if (options.all)
  6846. range.collapseChildren = 10000;
  6847. this.addFold("...", range);
  6848. }
  6849. return range;
  6850. };
  6851. this.toggleFoldWidget = function(toggleParent) {
  6852. var row = this.selection.getCursor().row;
  6853. row = this.getRowFoldStart(row);
  6854. var range = this.$toggleFoldWidget(row, {});
  6855. if (range)
  6856. return;
  6857. var data = this.getParentFoldRangeData(row, true);
  6858. range = data.range || data.firstRange;
  6859. if (range) {
  6860. row = range.start.row;
  6861. var fold = this.getFoldAt(row, this.getLine(row).length, 1);
  6862. if (fold) {
  6863. this.removeFold(fold);
  6864. } else {
  6865. this.addFold("...", range);
  6866. }
  6867. }
  6868. };
  6869. this.updateFoldWidgets = function(e) {
  6870. var delta = e.data;
  6871. var range = delta.range;
  6872. var firstRow = range.start.row;
  6873. var len = range.end.row - firstRow;
  6874. if (len === 0) {
  6875. this.foldWidgets[firstRow] = null;
  6876. } else if (delta.action == "removeText" || delta.action == "removeLines") {
  6877. this.foldWidgets.splice(firstRow, len + 1, null);
  6878. } else {
  6879. var args = Array(len + 1);
  6880. args.unshift(firstRow, 1);
  6881. this.foldWidgets.splice.apply(this.foldWidgets, args);
  6882. }
  6883. };
  6884. this.tokenizerUpdateFoldWidgets = function(e) {
  6885. var rows = e.data;
  6886. if (rows.first != rows.last) {
  6887. if (this.foldWidgets.length > rows.first)
  6888. this.foldWidgets.splice(rows.first, this.foldWidgets.length);
  6889. }
  6890. }
  6891. }
  6892. exports.Folding = Folding;
  6893. });
  6894. ace.define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"], function(require, exports, module) {
  6895. "use strict";
  6896. var TokenIterator = require("../token_iterator").TokenIterator;
  6897. var Range = require("../range").Range;
  6898. function BracketMatch() {
  6899. this.findMatchingBracket = function(position, chr) {
  6900. if (position.column == 0) return null;
  6901. var charBeforeCursor = chr || this.getLine(position.row).charAt(position.column-1);
  6902. if (charBeforeCursor == "") return null;
  6903. var match = charBeforeCursor.match(/([\(\[\{])|([\)\]\}])/);
  6904. if (!match)
  6905. return null;
  6906. if (match[1])
  6907. return this.$findClosingBracket(match[1], position);
  6908. else
  6909. return this.$findOpeningBracket(match[2], position);
  6910. };
  6911. this.getBracketRange = function(pos) {
  6912. var line = this.getLine(pos.row);
  6913. var before = true, range;
  6914. var chr = line.charAt(pos.column-1);
  6915. var match = chr && chr.match(/([\(\[\{])|([\)\]\}])/);
  6916. if (!match) {
  6917. chr = line.charAt(pos.column);
  6918. pos = {row: pos.row, column: pos.column + 1};
  6919. match = chr && chr.match(/([\(\[\{])|([\)\]\}])/);
  6920. before = false;
  6921. }
  6922. if (!match)
  6923. return null;
  6924. if (match[1]) {
  6925. var bracketPos = this.$findClosingBracket(match[1], pos);
  6926. if (!bracketPos)
  6927. return null;
  6928. range = Range.fromPoints(pos, bracketPos);
  6929. if (!before) {
  6930. range.end.column++;
  6931. range.start.column--;
  6932. }
  6933. range.cursor = range.end;
  6934. } else {
  6935. var bracketPos = this.$findOpeningBracket(match[2], pos);
  6936. if (!bracketPos)
  6937. return null;
  6938. range = Range.fromPoints(bracketPos, pos);
  6939. if (!before) {
  6940. range.start.column++;
  6941. range.end.column--;
  6942. }
  6943. range.cursor = range.start;
  6944. }
  6945. return range;
  6946. };
  6947. this.$brackets = {
  6948. ")": "(",
  6949. "(": ")",
  6950. "]": "[",
  6951. "[": "]",
  6952. "{": "}",
  6953. "}": "{"
  6954. };
  6955. this.$findOpeningBracket = function(bracket, position, typeRe) {
  6956. var openBracket = this.$brackets[bracket];
  6957. var depth = 1;
  6958. var iterator = new TokenIterator(this, position.row, position.column);
  6959. var token = iterator.getCurrentToken();
  6960. if (!token)
  6961. token = iterator.stepForward();
  6962. if (!token)
  6963. return;
  6964. if (!typeRe){
  6965. typeRe = new RegExp(
  6966. "(\\.?" +
  6967. token.type.replace(".", "\\.").replace("rparen", ".paren")
  6968. .replace(/\b(?:end|start|begin)\b/, "")
  6969. + ")+"
  6970. );
  6971. }
  6972. var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2;
  6973. var value = token.value;
  6974. while (true) {
  6975. while (valueIndex >= 0) {
  6976. var chr = value.charAt(valueIndex);
  6977. if (chr == openBracket) {
  6978. depth -= 1;
  6979. if (depth == 0) {
  6980. return {row: iterator.getCurrentTokenRow(),
  6981. column: valueIndex + iterator.getCurrentTokenColumn()};
  6982. }
  6983. }
  6984. else if (chr == bracket) {
  6985. depth += 1;
  6986. }
  6987. valueIndex -= 1;
  6988. }
  6989. do {
  6990. token = iterator.stepBackward();
  6991. } while (token && !typeRe.test(token.type));
  6992. if (token == null)
  6993. break;
  6994. value = token.value;
  6995. valueIndex = value.length - 1;
  6996. }
  6997. return null;
  6998. };
  6999. this.$findClosingBracket = function(bracket, position, typeRe) {
  7000. var closingBracket = this.$brackets[bracket];
  7001. var depth = 1;
  7002. var iterator = new TokenIterator(this, position.row, position.column);
  7003. var token = iterator.getCurrentToken();
  7004. if (!token)
  7005. token = iterator.stepForward();
  7006. if (!token)
  7007. return;
  7008. if (!typeRe){
  7009. typeRe = new RegExp(
  7010. "(\\.?" +
  7011. token.type.replace(".", "\\.").replace("lparen", ".paren")
  7012. .replace(/\b(?:end|start|begin)\b/, "")
  7013. + ")+"
  7014. );
  7015. }
  7016. var valueIndex = position.column - iterator.getCurrentTokenColumn();
  7017. while (true) {
  7018. var value = token.value;
  7019. var valueLength = value.length;
  7020. while (valueIndex < valueLength) {
  7021. var chr = value.charAt(valueIndex);
  7022. if (chr == closingBracket) {
  7023. depth -= 1;
  7024. if (depth == 0) {
  7025. return {row: iterator.getCurrentTokenRow(),
  7026. column: valueIndex + iterator.getCurrentTokenColumn()};
  7027. }
  7028. }
  7029. else if (chr == bracket) {
  7030. depth += 1;
  7031. }
  7032. valueIndex += 1;
  7033. }
  7034. do {
  7035. token = iterator.stepForward();
  7036. } while (token && !typeRe.test(token.type));
  7037. if (token == null)
  7038. break;
  7039. valueIndex = 0;
  7040. }
  7041. return null;
  7042. };
  7043. }
  7044. exports.BracketMatch = BracketMatch;
  7045. });
  7046. ace.define("ace/edit_session",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/config","ace/lib/event_emitter","ace/selection","ace/mode/text","ace/range","ace/document","ace/background_tokenizer","ace/search_highlight","ace/edit_session/folding","ace/edit_session/bracket_match"], function(require, exports, module) {
  7047. "use strict";
  7048. var oop = require("./lib/oop");
  7049. var lang = require("./lib/lang");
  7050. var config = require("./config");
  7051. var EventEmitter = require("./lib/event_emitter").EventEmitter;
  7052. var Selection = require("./selection").Selection;
  7053. var TextMode = require("./mode/text").Mode;
  7054. var Range = require("./range").Range;
  7055. var Document = require("./document").Document;
  7056. var BackgroundTokenizer = require("./background_tokenizer").BackgroundTokenizer;
  7057. var SearchHighlight = require("./search_highlight").SearchHighlight;
  7058. var EditSession = function(text, mode) {
  7059. this.$breakpoints = [];
  7060. this.$decorations = [];
  7061. this.$frontMarkers = {};
  7062. this.$backMarkers = {};
  7063. this.$markerId = 1;
  7064. this.$undoSelect = true;
  7065. this.$foldData = [];
  7066. this.$foldData.toString = function() {
  7067. return this.join("\n");
  7068. }
  7069. this.on("changeFold", this.onChangeFold.bind(this));
  7070. this.$onChange = this.onChange.bind(this);
  7071. if (typeof text != "object" || !text.getLine)
  7072. text = new Document(text);
  7073. this.setDocument(text);
  7074. this.selection = new Selection(this);
  7075. config.resetOptions(this);
  7076. this.setMode(mode);
  7077. config._signal("session", this);
  7078. };
  7079. (function() {
  7080. oop.implement(this, EventEmitter);
  7081. this.setDocument = function(doc) {
  7082. if (this.doc)
  7083. this.doc.removeListener("change", this.$onChange);
  7084. this.doc = doc;
  7085. doc.on("change", this.$onChange);
  7086. if (this.bgTokenizer)
  7087. this.bgTokenizer.setDocument(this.getDocument());
  7088. this.resetCaches();
  7089. };
  7090. this.getDocument = function() {
  7091. return this.doc;
  7092. };
  7093. this.$resetRowCache = function(docRow) {
  7094. if (!docRow) {
  7095. this.$docRowCache = [];
  7096. this.$screenRowCache = [];
  7097. return;
  7098. }
  7099. var l = this.$docRowCache.length;
  7100. var i = this.$getRowCacheIndex(this.$docRowCache, docRow) + 1;
  7101. if (l > i) {
  7102. this.$docRowCache.splice(i, l);
  7103. this.$screenRowCache.splice(i, l);
  7104. }
  7105. };
  7106. this.$getRowCacheIndex = function(cacheArray, val) {
  7107. var low = 0;
  7108. var hi = cacheArray.length - 1;
  7109. while (low <= hi) {
  7110. var mid = (low + hi) >> 1;
  7111. var c = cacheArray[mid];
  7112. if (val > c)
  7113. low = mid + 1;
  7114. else if (val < c)
  7115. hi = mid - 1;
  7116. else
  7117. return mid;
  7118. }
  7119. return low -1;
  7120. };
  7121. this.resetCaches = function() {
  7122. this.$modified = true;
  7123. this.$wrapData = [];
  7124. this.$rowLengthCache = [];
  7125. this.$resetRowCache(0);
  7126. if (this.bgTokenizer)
  7127. this.bgTokenizer.start(0);
  7128. };
  7129. this.onChangeFold = function(e) {
  7130. var fold = e.data;
  7131. this.$resetRowCache(fold.start.row);
  7132. };
  7133. this.onChange = function(e) {
  7134. var delta = e.data;
  7135. this.$modified = true;
  7136. this.$resetRowCache(delta.range.start.row);
  7137. var removedFolds = this.$updateInternalDataOnChange(e);
  7138. if (!this.$fromUndo && this.$undoManager && !delta.ignore) {
  7139. this.$deltasDoc.push(delta);
  7140. if (removedFolds && removedFolds.length != 0) {
  7141. this.$deltasFold.push({
  7142. action: "removeFolds",
  7143. folds: removedFolds
  7144. });
  7145. }
  7146. this.$informUndoManager.schedule();
  7147. }
  7148. this.bgTokenizer && this.bgTokenizer.$updateOnChange(delta);
  7149. this._signal("change", e);
  7150. };
  7151. this.setValue = function(text) {
  7152. this.doc.setValue(text);
  7153. this.selection.moveTo(0, 0);
  7154. this.$resetRowCache(0);
  7155. this.$deltas = [];
  7156. this.$deltasDoc = [];
  7157. this.$deltasFold = [];
  7158. this.setUndoManager(this.$undoManager);
  7159. this.getUndoManager().reset();
  7160. };
  7161. this.getValue =
  7162. this.toString = function() {
  7163. return this.doc.getValue();
  7164. };
  7165. this.getSelection = function() {
  7166. return this.selection;
  7167. };
  7168. this.getState = function(row) {
  7169. return this.bgTokenizer.getState(row);
  7170. };
  7171. this.getTokens = function(row) {
  7172. return this.bgTokenizer.getTokens(row);
  7173. };
  7174. this.getTokenAt = function(row, column) {
  7175. var tokens = this.bgTokenizer.getTokens(row);
  7176. var token, c = 0;
  7177. if (column == null) {
  7178. i = tokens.length - 1;
  7179. c = this.getLine(row).length;
  7180. } else {
  7181. for (var i = 0; i < tokens.length; i++) {
  7182. c += tokens[i].value.length;
  7183. if (c >= column)
  7184. break;
  7185. }
  7186. }
  7187. token = tokens[i];
  7188. if (!token)
  7189. return null;
  7190. token.index = i;
  7191. token.start = c - token.value.length;
  7192. return token;
  7193. };
  7194. this.setUndoManager = function(undoManager) {
  7195. this.$undoManager = undoManager;
  7196. this.$deltas = [];
  7197. this.$deltasDoc = [];
  7198. this.$deltasFold = [];
  7199. if (this.$informUndoManager)
  7200. this.$informUndoManager.cancel();
  7201. if (undoManager) {
  7202. var self = this;
  7203. this.$syncInformUndoManager = function() {
  7204. self.$informUndoManager.cancel();
  7205. if (self.$deltasFold.length) {
  7206. self.$deltas.push({
  7207. group: "fold",
  7208. deltas: self.$deltasFold
  7209. });
  7210. self.$deltasFold = [];
  7211. }
  7212. if (self.$deltasDoc.length) {
  7213. self.$deltas.push({
  7214. group: "doc",
  7215. deltas: self.$deltasDoc
  7216. });
  7217. self.$deltasDoc = [];
  7218. }
  7219. if (self.$deltas.length > 0) {
  7220. undoManager.execute({
  7221. action: "aceupdate",
  7222. args: [self.$deltas, self],
  7223. merge: self.mergeUndoDeltas
  7224. });
  7225. }
  7226. self.mergeUndoDeltas = false;
  7227. self.$deltas = [];
  7228. };
  7229. this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager);
  7230. }
  7231. };
  7232. this.markUndoGroup = function() {
  7233. if (this.$syncInformUndoManager)
  7234. this.$syncInformUndoManager();
  7235. };
  7236. this.$defaultUndoManager = {
  7237. undo: function() {},
  7238. redo: function() {},
  7239. reset: function() {}
  7240. };
  7241. this.getUndoManager = function() {
  7242. return this.$undoManager || this.$defaultUndoManager;
  7243. };
  7244. this.getTabString = function() {
  7245. if (this.getUseSoftTabs()) {
  7246. return lang.stringRepeat(" ", this.getTabSize());
  7247. } else {
  7248. return "\t";
  7249. }
  7250. };
  7251. this.setUseSoftTabs = function(val) {
  7252. this.setOption("useSoftTabs", val);
  7253. };
  7254. this.getUseSoftTabs = function() {
  7255. return this.$useSoftTabs && !this.$mode.$indentWithTabs;
  7256. };
  7257. this.setTabSize = function(tabSize) {
  7258. this.setOption("tabSize", tabSize);
  7259. };
  7260. this.getTabSize = function() {
  7261. return this.$tabSize;
  7262. };
  7263. this.isTabStop = function(position) {
  7264. return this.$useSoftTabs && (position.column % this.$tabSize === 0);
  7265. };
  7266. this.$overwrite = false;
  7267. this.setOverwrite = function(overwrite) {
  7268. this.setOption("overwrite", overwrite);
  7269. };
  7270. this.getOverwrite = function() {
  7271. return this.$overwrite;
  7272. };
  7273. this.toggleOverwrite = function() {
  7274. this.setOverwrite(!this.$overwrite);
  7275. };
  7276. this.addGutterDecoration = function(row, className) {
  7277. if (!this.$decorations[row])
  7278. this.$decorations[row] = "";
  7279. this.$decorations[row] += " " + className;
  7280. this._signal("changeBreakpoint", {});
  7281. };
  7282. this.removeGutterDecoration = function(row, className) {
  7283. this.$decorations[row] = (this.$decorations[row] || "").replace(" " + className, "");
  7284. this._signal("changeBreakpoint", {});
  7285. };
  7286. this.getBreakpoints = function() {
  7287. return this.$breakpoints;
  7288. };
  7289. this.setBreakpoints = function(rows) {
  7290. this.$breakpoints = [];
  7291. for (var i=0; i<rows.length; i++) {
  7292. this.$breakpoints[rows[i]] = "ace_breakpoint";
  7293. }
  7294. this._signal("changeBreakpoint", {});
  7295. };
  7296. this.clearBreakpoints = function() {
  7297. this.$breakpoints = [];
  7298. this._signal("changeBreakpoint", {});
  7299. };
  7300. this.setBreakpoint = function(row, className) {
  7301. if (className === undefined)
  7302. className = "ace_breakpoint";
  7303. if (className)
  7304. this.$breakpoints[row] = className;
  7305. else
  7306. delete this.$breakpoints[row];
  7307. this._signal("changeBreakpoint", {});
  7308. };
  7309. this.clearBreakpoint = function(row) {
  7310. delete this.$breakpoints[row];
  7311. this._signal("changeBreakpoint", {});
  7312. };
  7313. this.addMarker = function(range, clazz, type, inFront) {
  7314. var id = this.$markerId++;
  7315. var marker = {
  7316. range : range,
  7317. type : type || "line",
  7318. renderer: typeof type == "function" ? type : null,
  7319. clazz : clazz,
  7320. inFront: !!inFront,
  7321. id: id
  7322. };
  7323. if (inFront) {
  7324. this.$frontMarkers[id] = marker;
  7325. this._signal("changeFrontMarker");
  7326. } else {
  7327. this.$backMarkers[id] = marker;
  7328. this._signal("changeBackMarker");
  7329. }
  7330. return id;
  7331. };
  7332. this.addDynamicMarker = function(marker, inFront) {
  7333. if (!marker.update)
  7334. return;
  7335. var id = this.$markerId++;
  7336. marker.id = id;
  7337. marker.inFront = !!inFront;
  7338. if (inFront) {
  7339. this.$frontMarkers[id] = marker;
  7340. this._signal("changeFrontMarker");
  7341. } else {
  7342. this.$backMarkers[id] = marker;
  7343. this._signal("changeBackMarker");
  7344. }
  7345. return marker;
  7346. };
  7347. this.removeMarker = function(markerId) {
  7348. var marker = this.$frontMarkers[markerId] || this.$backMarkers[markerId];
  7349. if (!marker)
  7350. return;
  7351. var markers = marker.inFront ? this.$frontMarkers : this.$backMarkers;
  7352. if (marker) {
  7353. delete (markers[markerId]);
  7354. this._signal(marker.inFront ? "changeFrontMarker" : "changeBackMarker");
  7355. }
  7356. };
  7357. this.getMarkers = function(inFront) {
  7358. return inFront ? this.$frontMarkers : this.$backMarkers;
  7359. };
  7360. this.highlight = function(re) {
  7361. if (!this.$searchHighlight) {
  7362. var highlight = new SearchHighlight(null, "ace_selected-word", "text");
  7363. this.$searchHighlight = this.addDynamicMarker(highlight);
  7364. }
  7365. this.$searchHighlight.setRegexp(re);
  7366. };
  7367. this.highlightLines = function(startRow, endRow, clazz, inFront) {
  7368. if (typeof endRow != "number") {
  7369. clazz = endRow;
  7370. endRow = startRow;
  7371. }
  7372. if (!clazz)
  7373. clazz = "ace_step";
  7374. var range = new Range(startRow, 0, endRow, Infinity);
  7375. range.id = this.addMarker(range, clazz, "fullLine", inFront);
  7376. return range;
  7377. };
  7378. this.setAnnotations = function(annotations) {
  7379. this.$annotations = annotations;
  7380. this._signal("changeAnnotation", {});
  7381. };
  7382. this.getAnnotations = function() {
  7383. return this.$annotations || [];
  7384. };
  7385. this.clearAnnotations = function() {
  7386. this.setAnnotations([]);
  7387. };
  7388. this.$detectNewLine = function(text) {
  7389. var match = text.match(/^.*?(\r?\n)/m);
  7390. if (match) {
  7391. this.$autoNewLine = match[1];
  7392. } else {
  7393. this.$autoNewLine = "\n";
  7394. }
  7395. };
  7396. this.getWordRange = function(row, column) {
  7397. var line = this.getLine(row);
  7398. var inToken = false;
  7399. if (column > 0)
  7400. inToken = !!line.charAt(column - 1).match(this.tokenRe);
  7401. if (!inToken)
  7402. inToken = !!line.charAt(column).match(this.tokenRe);
  7403. if (inToken)
  7404. var re = this.tokenRe;
  7405. else if (/^\s+$/.test(line.slice(column-1, column+1)))
  7406. var re = /\s/;
  7407. else
  7408. var re = this.nonTokenRe;
  7409. var start = column;
  7410. if (start > 0) {
  7411. do {
  7412. start--;
  7413. }
  7414. while (start >= 0 && line.charAt(start).match(re));
  7415. start++;
  7416. }
  7417. var end = column;
  7418. while (end < line.length && line.charAt(end).match(re)) {
  7419. end++;
  7420. }
  7421. return new Range(row, start, row, end);
  7422. };
  7423. this.getAWordRange = function(row, column) {
  7424. var wordRange = this.getWordRange(row, column);
  7425. var line = this.getLine(wordRange.end.row);
  7426. while (line.charAt(wordRange.end.column).match(/[ \t]/)) {
  7427. wordRange.end.column += 1;
  7428. }
  7429. return wordRange;
  7430. };
  7431. this.setNewLineMode = function(newLineMode) {
  7432. this.doc.setNewLineMode(newLineMode);
  7433. };
  7434. this.getNewLineMode = function() {
  7435. return this.doc.getNewLineMode();
  7436. };
  7437. this.setUseWorker = function(useWorker) { this.setOption("useWorker", useWorker); };
  7438. this.getUseWorker = function() { return this.$useWorker; };
  7439. this.onReloadTokenizer = function(e) {
  7440. var rows = e.data;
  7441. this.bgTokenizer.start(rows.first);
  7442. this._signal("tokenizerUpdate", e);
  7443. };
  7444. this.$modes = {};
  7445. this.$mode = null;
  7446. this.$modeId = null;
  7447. this.setMode = function(mode, cb) {
  7448. if (mode && typeof mode === "object") {
  7449. if (mode.getTokenizer)
  7450. return this.$onChangeMode(mode);
  7451. var options = mode;
  7452. var path = options.path;
  7453. } else {
  7454. path = mode || "ace/mode/text";
  7455. }
  7456. if (!this.$modes["ace/mode/text"])
  7457. this.$modes["ace/mode/text"] = new TextMode();
  7458. if (this.$modes[path] && !options) {
  7459. this.$onChangeMode(this.$modes[path]);
  7460. cb && cb();
  7461. return;
  7462. }
  7463. this.$modeId = path;
  7464. config.loadModule(["mode", path], function(m) {
  7465. if (this.$modeId !== path)
  7466. return cb && cb();
  7467. if (this.$modes[path] && !options) {
  7468. this.$onChangeMode(this.$modes[path]);
  7469. } else if (m && m.Mode) {
  7470. m = new m.Mode(options);
  7471. if (!options) {
  7472. this.$modes[path] = m;
  7473. m.$id = path;
  7474. }
  7475. this.$onChangeMode(m);
  7476. }
  7477. cb && cb();
  7478. }.bind(this));
  7479. if (!this.$mode)
  7480. this.$onChangeMode(this.$modes["ace/mode/text"], true);
  7481. };
  7482. this.$onChangeMode = function(mode, $isPlaceholder) {
  7483. if (!$isPlaceholder)
  7484. this.$modeId = mode.$id;
  7485. if (this.$mode === mode)
  7486. return;
  7487. this.$mode = mode;
  7488. this.$stopWorker();
  7489. if (this.$useWorker)
  7490. this.$startWorker();
  7491. var tokenizer = mode.getTokenizer();
  7492. if(tokenizer.addEventListener !== undefined) {
  7493. var onReloadTokenizer = this.onReloadTokenizer.bind(this);
  7494. tokenizer.addEventListener("update", onReloadTokenizer);
  7495. }
  7496. if (!this.bgTokenizer) {
  7497. this.bgTokenizer = new BackgroundTokenizer(tokenizer);
  7498. var _self = this;
  7499. this.bgTokenizer.addEventListener("update", function(e) {
  7500. _self._signal("tokenizerUpdate", e);
  7501. });
  7502. } else {
  7503. this.bgTokenizer.setTokenizer(tokenizer);
  7504. }
  7505. this.bgTokenizer.setDocument(this.getDocument());
  7506. this.tokenRe = mode.tokenRe;
  7507. this.nonTokenRe = mode.nonTokenRe;
  7508. if (!$isPlaceholder) {
  7509. if (mode.attachToSession)
  7510. mode.attachToSession(this);
  7511. this.$options.wrapMethod.set.call(this, this.$wrapMethod);
  7512. this.$setFolding(mode.foldingRules);
  7513. this.bgTokenizer.start(0);
  7514. this._emit("changeMode");
  7515. }
  7516. };
  7517. this.$stopWorker = function() {
  7518. if (this.$worker) {
  7519. this.$worker.terminate();
  7520. this.$worker = null;
  7521. }
  7522. };
  7523. this.$startWorker = function() {
  7524. try {
  7525. this.$worker = this.$mode.createWorker(this);
  7526. } catch (e) {
  7527. config.warn("Could not load worker", e);
  7528. this.$worker = null;
  7529. }
  7530. };
  7531. this.getMode = function() {
  7532. return this.$mode;
  7533. };
  7534. this.$scrollTop = 0;
  7535. this.setScrollTop = function(scrollTop) {
  7536. if (this.$scrollTop === scrollTop || isNaN(scrollTop))
  7537. return;
  7538. this.$scrollTop = scrollTop;
  7539. this._signal("changeScrollTop", scrollTop);
  7540. };
  7541. this.getScrollTop = function() {
  7542. return this.$scrollTop;
  7543. };
  7544. this.$scrollLeft = 0;
  7545. this.setScrollLeft = function(scrollLeft) {
  7546. if (this.$scrollLeft === scrollLeft || isNaN(scrollLeft))
  7547. return;
  7548. this.$scrollLeft = scrollLeft;
  7549. this._signal("changeScrollLeft", scrollLeft);
  7550. };
  7551. this.getScrollLeft = function() {
  7552. return this.$scrollLeft;
  7553. };
  7554. this.getScreenWidth = function() {
  7555. this.$computeWidth();
  7556. if (this.lineWidgets)
  7557. return Math.max(this.getLineWidgetMaxWidth(), this.screenWidth);
  7558. return this.screenWidth;
  7559. };
  7560. this.getLineWidgetMaxWidth = function() {
  7561. if (this.lineWidgetsWidth != null) return this.lineWidgetsWidth;
  7562. var width = 0;
  7563. this.lineWidgets.forEach(function(w) {
  7564. if (w && w.screenWidth > width)
  7565. width = w.screenWidth;
  7566. });
  7567. return this.lineWidgetWidth = width;
  7568. };
  7569. this.$computeWidth = function(force) {
  7570. if (this.$modified || force) {
  7571. this.$modified = false;
  7572. if (this.$useWrapMode)
  7573. return this.screenWidth = this.$wrapLimit;
  7574. var lines = this.doc.getAllLines();
  7575. var cache = this.$rowLengthCache;
  7576. var longestScreenLine = 0;
  7577. var foldIndex = 0;
  7578. var foldLine = this.$foldData[foldIndex];
  7579. var foldStart = foldLine ? foldLine.start.row : Infinity;
  7580. var len = lines.length;
  7581. for (var i = 0; i < len; i++) {
  7582. if (i > foldStart) {
  7583. i = foldLine.end.row + 1;
  7584. if (i >= len)
  7585. break;
  7586. foldLine = this.$foldData[foldIndex++];
  7587. foldStart = foldLine ? foldLine.start.row : Infinity;
  7588. }
  7589. if (cache[i] == null)
  7590. cache[i] = this.$getStringScreenWidth(lines[i])[0];
  7591. if (cache[i] > longestScreenLine)
  7592. longestScreenLine = cache[i];
  7593. }
  7594. this.screenWidth = longestScreenLine;
  7595. }
  7596. };
  7597. this.getLine = function(row) {
  7598. return this.doc.getLine(row);
  7599. };
  7600. this.getLines = function(firstRow, lastRow) {
  7601. return this.doc.getLines(firstRow, lastRow);
  7602. };
  7603. this.getLength = function() {
  7604. return this.doc.getLength();
  7605. };
  7606. this.getTextRange = function(range) {
  7607. return this.doc.getTextRange(range || this.selection.getRange());
  7608. };
  7609. this.insert = function(position, text) {
  7610. return this.doc.insert(position, text);
  7611. };
  7612. this.remove = function(range) {
  7613. return this.doc.remove(range);
  7614. };
  7615. this.undoChanges = function(deltas, dontSelect) {
  7616. if (!deltas.length)
  7617. return;
  7618. this.$fromUndo = true;
  7619. var lastUndoRange = null;
  7620. for (var i = deltas.length - 1; i != -1; i--) {
  7621. var delta = deltas[i];
  7622. if (delta.group == "doc") {
  7623. this.doc.revertDeltas(delta.deltas);
  7624. lastUndoRange =
  7625. this.$getUndoSelection(delta.deltas, true, lastUndoRange);
  7626. } else {
  7627. delta.deltas.forEach(function(foldDelta) {
  7628. this.addFolds(foldDelta.folds);
  7629. }, this);
  7630. }
  7631. }
  7632. this.$fromUndo = false;
  7633. lastUndoRange &&
  7634. this.$undoSelect &&
  7635. !dontSelect &&
  7636. this.selection.setSelectionRange(lastUndoRange);
  7637. return lastUndoRange;
  7638. };
  7639. this.redoChanges = function(deltas, dontSelect) {
  7640. if (!deltas.length)
  7641. return;
  7642. this.$fromUndo = true;
  7643. var lastUndoRange = null;
  7644. for (var i = 0; i < deltas.length; i++) {
  7645. var delta = deltas[i];
  7646. if (delta.group == "doc") {
  7647. this.doc.applyDeltas(delta.deltas);
  7648. lastUndoRange =
  7649. this.$getUndoSelection(delta.deltas, false, lastUndoRange);
  7650. }
  7651. }
  7652. this.$fromUndo = false;
  7653. lastUndoRange &&
  7654. this.$undoSelect &&
  7655. !dontSelect &&
  7656. this.selection.setSelectionRange(lastUndoRange);
  7657. return lastUndoRange;
  7658. };
  7659. this.setUndoSelect = function(enable) {
  7660. this.$undoSelect = enable;
  7661. };
  7662. this.$getUndoSelection = function(deltas, isUndo, lastUndoRange) {
  7663. function isInsert(delta) {
  7664. var insert =
  7665. delta.action === "insertText" || delta.action === "insertLines";
  7666. return isUndo ? !insert : insert;
  7667. }
  7668. var delta = deltas[0];
  7669. var range, point;
  7670. var lastDeltaIsInsert = false;
  7671. if (isInsert(delta)) {
  7672. range = Range.fromPoints(delta.range.start, delta.range.end);
  7673. lastDeltaIsInsert = true;
  7674. } else {
  7675. range = Range.fromPoints(delta.range.start, delta.range.start);
  7676. lastDeltaIsInsert = false;
  7677. }
  7678. for (var i = 1; i < deltas.length; i++) {
  7679. delta = deltas[i];
  7680. if (isInsert(delta)) {
  7681. point = delta.range.start;
  7682. if (range.compare(point.row, point.column) == -1) {
  7683. range.setStart(delta.range.start);
  7684. }
  7685. point = delta.range.end;
  7686. if (range.compare(point.row, point.column) == 1) {
  7687. range.setEnd(delta.range.end);
  7688. }
  7689. lastDeltaIsInsert = true;
  7690. } else {
  7691. point = delta.range.start;
  7692. if (range.compare(point.row, point.column) == -1) {
  7693. range =
  7694. Range.fromPoints(delta.range.start, delta.range.start);
  7695. }
  7696. lastDeltaIsInsert = false;
  7697. }
  7698. }
  7699. if (lastUndoRange != null) {
  7700. if (Range.comparePoints(lastUndoRange.start, range.start) === 0) {
  7701. lastUndoRange.start.column += range.end.column - range.start.column;
  7702. lastUndoRange.end.column += range.end.column - range.start.column;
  7703. }
  7704. var cmp = lastUndoRange.compareRange(range);
  7705. if (cmp == 1) {
  7706. range.setStart(lastUndoRange.start);
  7707. } else if (cmp == -1) {
  7708. range.setEnd(lastUndoRange.end);
  7709. }
  7710. }
  7711. return range;
  7712. };
  7713. this.replace = function(range, text) {
  7714. return this.doc.replace(range, text);
  7715. };
  7716. this.moveText = function(fromRange, toPosition, copy) {
  7717. var text = this.getTextRange(fromRange);
  7718. var folds = this.getFoldsInRange(fromRange);
  7719. var toRange = Range.fromPoints(toPosition, toPosition);
  7720. if (!copy) {
  7721. this.remove(fromRange);
  7722. var rowDiff = fromRange.start.row - fromRange.end.row;
  7723. var collDiff = rowDiff ? -fromRange.end.column : fromRange.start.column - fromRange.end.column;
  7724. if (collDiff) {
  7725. if (toRange.start.row == fromRange.end.row && toRange.start.column > fromRange.end.column)
  7726. toRange.start.column += collDiff;
  7727. if (toRange.end.row == fromRange.end.row && toRange.end.column > fromRange.end.column)
  7728. toRange.end.column += collDiff;
  7729. }
  7730. if (rowDiff && toRange.start.row >= fromRange.end.row) {
  7731. toRange.start.row += rowDiff;
  7732. toRange.end.row += rowDiff;
  7733. }
  7734. }
  7735. toRange.end = this.insert(toRange.start, text);
  7736. if (folds.length) {
  7737. var oldStart = fromRange.start;
  7738. var newStart = toRange.start;
  7739. var rowDiff = newStart.row - oldStart.row;
  7740. var collDiff = newStart.column - oldStart.column;
  7741. this.addFolds(folds.map(function(x) {
  7742. x = x.clone();
  7743. if (x.start.row == oldStart.row)
  7744. x.start.column += collDiff;
  7745. if (x.end.row == oldStart.row)
  7746. x.end.column += collDiff;
  7747. x.start.row += rowDiff;
  7748. x.end.row += rowDiff;
  7749. return x;
  7750. }));
  7751. }
  7752. return toRange;
  7753. };
  7754. this.indentRows = function(startRow, endRow, indentString) {
  7755. indentString = indentString.replace(/\t/g, this.getTabString());
  7756. for (var row=startRow; row<=endRow; row++)
  7757. this.insert({row: row, column:0}, indentString);
  7758. };
  7759. this.outdentRows = function (range) {
  7760. var rowRange = range.collapseRows();
  7761. var deleteRange = new Range(0, 0, 0, 0);
  7762. var size = this.getTabSize();
  7763. for (var i = rowRange.start.row; i <= rowRange.end.row; ++i) {
  7764. var line = this.getLine(i);
  7765. deleteRange.start.row = i;
  7766. deleteRange.end.row = i;
  7767. for (var j = 0; j < size; ++j)
  7768. if (line.charAt(j) != ' ')
  7769. break;
  7770. if (j < size && line.charAt(j) == '\t') {
  7771. deleteRange.start.column = j;
  7772. deleteRange.end.column = j + 1;
  7773. } else {
  7774. deleteRange.start.column = 0;
  7775. deleteRange.end.column = j;
  7776. }
  7777. this.remove(deleteRange);
  7778. }
  7779. };
  7780. this.$moveLines = function(firstRow, lastRow, dir) {
  7781. firstRow = this.getRowFoldStart(firstRow);
  7782. lastRow = this.getRowFoldEnd(lastRow);
  7783. if (dir < 0) {
  7784. var row = this.getRowFoldStart(firstRow + dir);
  7785. if (row < 0) return 0;
  7786. var diff = row-firstRow;
  7787. } else if (dir > 0) {
  7788. var row = this.getRowFoldEnd(lastRow + dir);
  7789. if (row > this.doc.getLength()-1) return 0;
  7790. var diff = row-lastRow;
  7791. } else {
  7792. firstRow = this.$clipRowToDocument(firstRow);
  7793. lastRow = this.$clipRowToDocument(lastRow);
  7794. var diff = lastRow - firstRow + 1;
  7795. }
  7796. var range = new Range(firstRow, 0, lastRow, Number.MAX_VALUE);
  7797. var folds = this.getFoldsInRange(range).map(function(x){
  7798. x = x.clone();
  7799. x.start.row += diff;
  7800. x.end.row += diff;
  7801. return x;
  7802. });
  7803. var lines = dir == 0
  7804. ? this.doc.getLines(firstRow, lastRow)
  7805. : this.doc.removeLines(firstRow, lastRow);
  7806. this.doc.insertLines(firstRow+diff, lines);
  7807. folds.length && this.addFolds(folds);
  7808. return diff;
  7809. };
  7810. this.moveLinesUp = function(firstRow, lastRow) {
  7811. return this.$moveLines(firstRow, lastRow, -1);
  7812. };
  7813. this.moveLinesDown = function(firstRow, lastRow) {
  7814. return this.$moveLines(firstRow, lastRow, 1);
  7815. };
  7816. this.duplicateLines = function(firstRow, lastRow) {
  7817. return this.$moveLines(firstRow, lastRow, 0);
  7818. };
  7819. this.$clipRowToDocument = function(row) {
  7820. return Math.max(0, Math.min(row, this.doc.getLength()-1));
  7821. };
  7822. this.$clipColumnToRow = function(row, column) {
  7823. if (column < 0)
  7824. return 0;
  7825. return Math.min(this.doc.getLine(row).length, column);
  7826. };
  7827. this.$clipPositionToDocument = function(row, column) {
  7828. column = Math.max(0, column);
  7829. if (row < 0) {
  7830. row = 0;
  7831. column = 0;
  7832. } else {
  7833. var len = this.doc.getLength();
  7834. if (row >= len) {
  7835. row = len - 1;
  7836. column = this.doc.getLine(len-1).length;
  7837. } else {
  7838. column = Math.min(this.doc.getLine(row).length, column);
  7839. }
  7840. }
  7841. return {
  7842. row: row,
  7843. column: column
  7844. };
  7845. };
  7846. this.$clipRangeToDocument = function(range) {
  7847. if (range.start.row < 0) {
  7848. range.start.row = 0;
  7849. range.start.column = 0;
  7850. } else {
  7851. range.start.column = this.$clipColumnToRow(
  7852. range.start.row,
  7853. range.start.column
  7854. );
  7855. }
  7856. var len = this.doc.getLength() - 1;
  7857. if (range.end.row > len) {
  7858. range.end.row = len;
  7859. range.end.column = this.doc.getLine(len).length;
  7860. } else {
  7861. range.end.column = this.$clipColumnToRow(
  7862. range.end.row,
  7863. range.end.column
  7864. );
  7865. }
  7866. return range;
  7867. };
  7868. this.$wrapLimit = 80;
  7869. this.$useWrapMode = false;
  7870. this.$wrapLimitRange = {
  7871. min : null,
  7872. max : null
  7873. };
  7874. this.setUseWrapMode = function(useWrapMode) {
  7875. if (useWrapMode != this.$useWrapMode) {
  7876. this.$useWrapMode = useWrapMode;
  7877. this.$modified = true;
  7878. this.$resetRowCache(0);
  7879. if (useWrapMode) {
  7880. var len = this.getLength();
  7881. this.$wrapData = Array(len);
  7882. this.$updateWrapData(0, len - 1);
  7883. }
  7884. this._signal("changeWrapMode");
  7885. }
  7886. };
  7887. this.getUseWrapMode = function() {
  7888. return this.$useWrapMode;
  7889. };
  7890. this.setWrapLimitRange = function(min, max) {
  7891. if (this.$wrapLimitRange.min !== min || this.$wrapLimitRange.max !== max) {
  7892. this.$wrapLimitRange = { min: min, max: max };
  7893. this.$modified = true;
  7894. if (this.$useWrapMode)
  7895. this._signal("changeWrapMode");
  7896. }
  7897. };
  7898. this.adjustWrapLimit = function(desiredLimit, $printMargin) {
  7899. var limits = this.$wrapLimitRange;
  7900. if (limits.max < 0)
  7901. limits = {min: $printMargin, max: $printMargin};
  7902. var wrapLimit = this.$constrainWrapLimit(desiredLimit, limits.min, limits.max);
  7903. if (wrapLimit != this.$wrapLimit && wrapLimit > 1) {
  7904. this.$wrapLimit = wrapLimit;
  7905. this.$modified = true;
  7906. if (this.$useWrapMode) {
  7907. this.$updateWrapData(0, this.getLength() - 1);
  7908. this.$resetRowCache(0);
  7909. this._signal("changeWrapLimit");
  7910. }
  7911. return true;
  7912. }
  7913. return false;
  7914. };
  7915. this.$constrainWrapLimit = function(wrapLimit, min, max) {
  7916. if (min)
  7917. wrapLimit = Math.max(min, wrapLimit);
  7918. if (max)
  7919. wrapLimit = Math.min(max, wrapLimit);
  7920. return wrapLimit;
  7921. };
  7922. this.getWrapLimit = function() {
  7923. return this.$wrapLimit;
  7924. };
  7925. this.setWrapLimit = function (limit) {
  7926. this.setWrapLimitRange(limit, limit);
  7927. };
  7928. this.getWrapLimitRange = function() {
  7929. return {
  7930. min : this.$wrapLimitRange.min,
  7931. max : this.$wrapLimitRange.max
  7932. };
  7933. };
  7934. this.$updateInternalDataOnChange = function(e) {
  7935. var useWrapMode = this.$useWrapMode;
  7936. var len;
  7937. var action = e.data.action;
  7938. var firstRow = e.data.range.start.row;
  7939. var lastRow = e.data.range.end.row;
  7940. var start = e.data.range.start;
  7941. var end = e.data.range.end;
  7942. var removedFolds = null;
  7943. if (action.indexOf("Lines") != -1) {
  7944. if (action == "insertLines") {
  7945. lastRow = firstRow + (e.data.lines.length);
  7946. } else {
  7947. lastRow = firstRow;
  7948. }
  7949. len = e.data.lines ? e.data.lines.length : lastRow - firstRow;
  7950. } else {
  7951. len = lastRow - firstRow;
  7952. }
  7953. this.$updating = true;
  7954. if (len != 0) {
  7955. if (action.indexOf("remove") != -1) {
  7956. this[useWrapMode ? "$wrapData" : "$rowLengthCache"].splice(firstRow, len);
  7957. var foldLines = this.$foldData;
  7958. removedFolds = this.getFoldsInRange(e.data.range);
  7959. this.removeFolds(removedFolds);
  7960. var foldLine = this.getFoldLine(end.row);
  7961. var idx = 0;
  7962. if (foldLine) {
  7963. foldLine.addRemoveChars(end.row, end.column, start.column - end.column);
  7964. foldLine.shiftRow(-len);
  7965. var foldLineBefore = this.getFoldLine(firstRow);
  7966. if (foldLineBefore && foldLineBefore !== foldLine) {
  7967. foldLineBefore.merge(foldLine);
  7968. foldLine = foldLineBefore;
  7969. }
  7970. idx = foldLines.indexOf(foldLine) + 1;
  7971. }
  7972. for (idx; idx < foldLines.length; idx++) {
  7973. var foldLine = foldLines[idx];
  7974. if (foldLine.start.row >= end.row) {
  7975. foldLine.shiftRow(-len);
  7976. }
  7977. }
  7978. lastRow = firstRow;
  7979. } else {
  7980. var args = Array(len);
  7981. args.unshift(firstRow, 0);
  7982. var arr = useWrapMode ? this.$wrapData : this.$rowLengthCache
  7983. arr.splice.apply(arr, args);
  7984. var foldLines = this.$foldData;
  7985. var foldLine = this.getFoldLine(firstRow);
  7986. var idx = 0;
  7987. if (foldLine) {
  7988. var cmp = foldLine.range.compareInside(start.row, start.column);
  7989. if (cmp == 0) {
  7990. foldLine = foldLine.split(start.row, start.column);
  7991. if (foldLine) {
  7992. foldLine.shiftRow(len);
  7993. foldLine.addRemoveChars(lastRow, 0, end.column - start.column);
  7994. }
  7995. } else
  7996. if (cmp == -1) {
  7997. foldLine.addRemoveChars(firstRow, 0, end.column - start.column);
  7998. foldLine.shiftRow(len);
  7999. }
  8000. idx = foldLines.indexOf(foldLine) + 1;
  8001. }
  8002. for (idx; idx < foldLines.length; idx++) {
  8003. var foldLine = foldLines[idx];
  8004. if (foldLine.start.row >= firstRow) {
  8005. foldLine.shiftRow(len);
  8006. }
  8007. }
  8008. }
  8009. } else {
  8010. len = Math.abs(e.data.range.start.column - e.data.range.end.column);
  8011. if (action.indexOf("remove") != -1) {
  8012. removedFolds = this.getFoldsInRange(e.data.range);
  8013. this.removeFolds(removedFolds);
  8014. len = -len;
  8015. }
  8016. var foldLine = this.getFoldLine(firstRow);
  8017. if (foldLine) {
  8018. foldLine.addRemoveChars(firstRow, start.column, len);
  8019. }
  8020. }
  8021. if (useWrapMode && this.$wrapData.length != this.doc.getLength()) {
  8022. console.error("doc.getLength() and $wrapData.length have to be the same!");
  8023. }
  8024. this.$updating = false;
  8025. if (useWrapMode)
  8026. this.$updateWrapData(firstRow, lastRow);
  8027. else
  8028. this.$updateRowLengthCache(firstRow, lastRow);
  8029. return removedFolds;
  8030. };
  8031. this.$updateRowLengthCache = function(firstRow, lastRow, b) {
  8032. this.$rowLengthCache[firstRow] = null;
  8033. this.$rowLengthCache[lastRow] = null;
  8034. };
  8035. this.$updateWrapData = function(firstRow, lastRow) {
  8036. var lines = this.doc.getAllLines();
  8037. var tabSize = this.getTabSize();
  8038. var wrapData = this.$wrapData;
  8039. var wrapLimit = this.$wrapLimit;
  8040. var tokens;
  8041. var foldLine;
  8042. var row = firstRow;
  8043. lastRow = Math.min(lastRow, lines.length - 1);
  8044. while (row <= lastRow) {
  8045. foldLine = this.getFoldLine(row, foldLine);
  8046. if (!foldLine) {
  8047. tokens = this.$getDisplayTokens(lines[row]);
  8048. wrapData[row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize);
  8049. row ++;
  8050. } else {
  8051. tokens = [];
  8052. foldLine.walk(function(placeholder, row, column, lastColumn) {
  8053. var walkTokens;
  8054. if (placeholder != null) {
  8055. walkTokens = this.$getDisplayTokens(
  8056. placeholder, tokens.length);
  8057. walkTokens[0] = PLACEHOLDER_START;
  8058. for (var i = 1; i < walkTokens.length; i++) {
  8059. walkTokens[i] = PLACEHOLDER_BODY;
  8060. }
  8061. } else {
  8062. walkTokens = this.$getDisplayTokens(
  8063. lines[row].substring(lastColumn, column),
  8064. tokens.length);
  8065. }
  8066. tokens = tokens.concat(walkTokens);
  8067. }.bind(this),
  8068. foldLine.end.row,
  8069. lines[foldLine.end.row].length + 1
  8070. );
  8071. wrapData[foldLine.start.row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize);
  8072. row = foldLine.end.row + 1;
  8073. }
  8074. }
  8075. };
  8076. var CHAR = 1,
  8077. CHAR_EXT = 2,
  8078. PLACEHOLDER_START = 3,
  8079. PLACEHOLDER_BODY = 4,
  8080. PUNCTUATION = 9,
  8081. SPACE = 10,
  8082. TAB = 11,
  8083. TAB_SPACE = 12;
  8084. this.$computeWrapSplits = function(tokens, wrapLimit) {
  8085. if (tokens.length == 0) {
  8086. return [];
  8087. }
  8088. var splits = [];
  8089. var displayLength = tokens.length;
  8090. var lastSplit = 0, lastDocSplit = 0;
  8091. var isCode = this.$wrapAsCode;
  8092. function addSplit(screenPos) {
  8093. var displayed = tokens.slice(lastSplit, screenPos);
  8094. var len = displayed.length;
  8095. displayed.join("").
  8096. replace(/12/g, function() {
  8097. len -= 1;
  8098. }).
  8099. replace(/2/g, function() {
  8100. len -= 1;
  8101. });
  8102. lastDocSplit += len;
  8103. splits.push(lastDocSplit);
  8104. lastSplit = screenPos;
  8105. }
  8106. while (displayLength - lastSplit > wrapLimit) {
  8107. var split = lastSplit + wrapLimit;
  8108. if (tokens[split - 1] >= SPACE && tokens[split] >= SPACE) {
  8109. addSplit(split);
  8110. continue;
  8111. }
  8112. if (tokens[split] == PLACEHOLDER_START || tokens[split] == PLACEHOLDER_BODY) {
  8113. for (split; split != lastSplit - 1; split--) {
  8114. if (tokens[split] == PLACEHOLDER_START) {
  8115. break;
  8116. }
  8117. }
  8118. if (split > lastSplit) {
  8119. addSplit(split);
  8120. continue;
  8121. }
  8122. split = lastSplit + wrapLimit;
  8123. for (split; split < tokens.length; split++) {
  8124. if (tokens[split] != PLACEHOLDER_BODY) {
  8125. break;
  8126. }
  8127. }
  8128. if (split == tokens.length) {
  8129. break; // Breaks the while-loop.
  8130. }
  8131. addSplit(split);
  8132. continue;
  8133. }
  8134. var minSplit = Math.max(split - (isCode ? 10 : wrapLimit-(wrapLimit>>2)), lastSplit - 1);
  8135. while (split > minSplit && tokens[split] < PLACEHOLDER_START) {
  8136. split --;
  8137. }
  8138. if (isCode) {
  8139. while (split > minSplit && tokens[split] < PLACEHOLDER_START) {
  8140. split --;
  8141. }
  8142. while (split > minSplit && tokens[split] == PUNCTUATION) {
  8143. split --;
  8144. }
  8145. } else {
  8146. while (split > minSplit && tokens[split] < SPACE) {
  8147. split --;
  8148. }
  8149. }
  8150. if (split > minSplit) {
  8151. addSplit(++split);
  8152. continue;
  8153. }
  8154. split = lastSplit + wrapLimit;
  8155. if (tokens[split] == CHAR_EXT)
  8156. split--;
  8157. addSplit(split);
  8158. }
  8159. return splits;
  8160. };
  8161. this.$getDisplayTokens = function(str, offset) {
  8162. var arr = [];
  8163. var tabSize;
  8164. offset = offset || 0;
  8165. for (var i = 0; i < str.length; i++) {
  8166. var c = str.charCodeAt(i);
  8167. if (c == 9) {
  8168. tabSize = this.getScreenTabSize(arr.length + offset);
  8169. arr.push(TAB);
  8170. for (var n = 1; n < tabSize; n++) {
  8171. arr.push(TAB_SPACE);
  8172. }
  8173. }
  8174. else if (c == 32) {
  8175. arr.push(SPACE);
  8176. } else if((c > 39 && c < 48) || (c > 57 && c < 64)) {
  8177. arr.push(PUNCTUATION);
  8178. }
  8179. else if (c >= 0x1100 && isFullWidth(c)) {
  8180. arr.push(CHAR, CHAR_EXT);
  8181. } else {
  8182. arr.push(CHAR);
  8183. }
  8184. }
  8185. return arr;
  8186. };
  8187. this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) {
  8188. if (maxScreenColumn == 0)
  8189. return [0, 0];
  8190. if (maxScreenColumn == null)
  8191. maxScreenColumn = Infinity;
  8192. screenColumn = screenColumn || 0;
  8193. var c, column;
  8194. for (column = 0; column < str.length; column++) {
  8195. c = str.charCodeAt(column);
  8196. if (c == 9) {
  8197. screenColumn += this.getScreenTabSize(screenColumn);
  8198. }
  8199. else if (c >= 0x1100 && isFullWidth(c)) {
  8200. screenColumn += 2;
  8201. } else {
  8202. screenColumn += 1;
  8203. }
  8204. if (screenColumn > maxScreenColumn) {
  8205. break;
  8206. }
  8207. }
  8208. return [screenColumn, column];
  8209. };
  8210. this.lineWidgets = null;
  8211. this.getRowLength = function(row) {
  8212. if (this.lineWidgets)
  8213. var h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;
  8214. else
  8215. h = 0
  8216. if (!this.$useWrapMode || !this.$wrapData[row]) {
  8217. return 1 + h;
  8218. } else {
  8219. return this.$wrapData[row].length + 1 + h;
  8220. }
  8221. };
  8222. this.getRowLineCount = function(row) {
  8223. if (!this.$useWrapMode || !this.$wrapData[row]) {
  8224. return 1;
  8225. } else {
  8226. return this.$wrapData[row].length + 1;
  8227. }
  8228. };
  8229. this.getScreenLastRowColumn = function(screenRow) {
  8230. var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE);
  8231. return this.documentToScreenColumn(pos.row, pos.column);
  8232. };
  8233. this.getDocumentLastRowColumn = function(docRow, docColumn) {
  8234. var screenRow = this.documentToScreenRow(docRow, docColumn);
  8235. return this.getScreenLastRowColumn(screenRow);
  8236. };
  8237. this.getDocumentLastRowColumnPosition = function(docRow, docColumn) {
  8238. var screenRow = this.documentToScreenRow(docRow, docColumn);
  8239. return this.screenToDocumentPosition(screenRow, Number.MAX_VALUE / 10);
  8240. };
  8241. this.getRowSplitData = function(row) {
  8242. if (!this.$useWrapMode) {
  8243. return undefined;
  8244. } else {
  8245. return this.$wrapData[row];
  8246. }
  8247. };
  8248. this.getScreenTabSize = function(screenColumn) {
  8249. return this.$tabSize - screenColumn % this.$tabSize;
  8250. };
  8251. this.screenToDocumentRow = function(screenRow, screenColumn) {
  8252. return this.screenToDocumentPosition(screenRow, screenColumn).row;
  8253. };
  8254. this.screenToDocumentColumn = function(screenRow, screenColumn) {
  8255. return this.screenToDocumentPosition(screenRow, screenColumn).column;
  8256. };
  8257. this.screenToDocumentPosition = function(screenRow, screenColumn) {
  8258. if (screenRow < 0)
  8259. return {row: 0, column: 0};
  8260. var line;
  8261. var docRow = 0;
  8262. var docColumn = 0;
  8263. var column;
  8264. var row = 0;
  8265. var rowLength = 0;
  8266. var rowCache = this.$screenRowCache;
  8267. var i = this.$getRowCacheIndex(rowCache, screenRow);
  8268. var l = rowCache.length;
  8269. if (l && i >= 0) {
  8270. var row = rowCache[i];
  8271. var docRow = this.$docRowCache[i];
  8272. var doCache = screenRow > rowCache[l - 1];
  8273. } else {
  8274. var doCache = !l;
  8275. }
  8276. var maxRow = this.getLength() - 1;
  8277. var foldLine = this.getNextFoldLine(docRow);
  8278. var foldStart = foldLine ? foldLine.start.row : Infinity;
  8279. while (row <= screenRow) {
  8280. rowLength = this.getRowLength(docRow);
  8281. if (row + rowLength > screenRow || docRow >= maxRow) {
  8282. break;
  8283. } else {
  8284. row += rowLength;
  8285. docRow++;
  8286. if (docRow > foldStart) {
  8287. docRow = foldLine.end.row+1;
  8288. foldLine = this.getNextFoldLine(docRow, foldLine);
  8289. foldStart = foldLine ? foldLine.start.row : Infinity;
  8290. }
  8291. }
  8292. if (doCache) {
  8293. this.$docRowCache.push(docRow);
  8294. this.$screenRowCache.push(row);
  8295. }
  8296. }
  8297. if (foldLine && foldLine.start.row <= docRow) {
  8298. line = this.getFoldDisplayLine(foldLine);
  8299. docRow = foldLine.start.row;
  8300. } else if (row + rowLength <= screenRow || docRow > maxRow) {
  8301. return {
  8302. row: maxRow,
  8303. column: this.getLine(maxRow).length
  8304. };
  8305. } else {
  8306. line = this.getLine(docRow);
  8307. foldLine = null;
  8308. }
  8309. if (this.$useWrapMode) {
  8310. var splits = this.$wrapData[docRow];
  8311. if (splits) {
  8312. var splitIndex = Math.floor(screenRow - row);
  8313. column = splits[splitIndex];
  8314. if(splitIndex > 0 && splits.length) {
  8315. docColumn = splits[splitIndex - 1] || splits[splits.length - 1];
  8316. line = line.substring(docColumn);
  8317. }
  8318. }
  8319. }
  8320. docColumn += this.$getStringScreenWidth(line, screenColumn)[1];
  8321. if (this.$useWrapMode && docColumn >= column)
  8322. docColumn = column - 1;
  8323. if (foldLine)
  8324. return foldLine.idxToPosition(docColumn);
  8325. return {row: docRow, column: docColumn};
  8326. };
  8327. this.documentToScreenPosition = function(docRow, docColumn) {
  8328. if (typeof docColumn === "undefined")
  8329. var pos = this.$clipPositionToDocument(docRow.row, docRow.column);
  8330. else
  8331. pos = this.$clipPositionToDocument(docRow, docColumn);
  8332. docRow = pos.row;
  8333. docColumn = pos.column;
  8334. var screenRow = 0;
  8335. var foldStartRow = null;
  8336. var fold = null;
  8337. fold = this.getFoldAt(docRow, docColumn, 1);
  8338. if (fold) {
  8339. docRow = fold.start.row;
  8340. docColumn = fold.start.column;
  8341. }
  8342. var rowEnd, row = 0;
  8343. var rowCache = this.$docRowCache;
  8344. var i = this.$getRowCacheIndex(rowCache, docRow);
  8345. var l = rowCache.length;
  8346. if (l && i >= 0) {
  8347. var row = rowCache[i];
  8348. var screenRow = this.$screenRowCache[i];
  8349. var doCache = docRow > rowCache[l - 1];
  8350. } else {
  8351. var doCache = !l;
  8352. }
  8353. var foldLine = this.getNextFoldLine(row);
  8354. var foldStart = foldLine ?foldLine.start.row :Infinity;
  8355. while (row < docRow) {
  8356. if (row >= foldStart) {
  8357. rowEnd = foldLine.end.row + 1;
  8358. if (rowEnd > docRow)
  8359. break;
  8360. foldLine = this.getNextFoldLine(rowEnd, foldLine);
  8361. foldStart = foldLine ?foldLine.start.row :Infinity;
  8362. }
  8363. else {
  8364. rowEnd = row + 1;
  8365. }
  8366. screenRow += this.getRowLength(row);
  8367. row = rowEnd;
  8368. if (doCache) {
  8369. this.$docRowCache.push(row);
  8370. this.$screenRowCache.push(screenRow);
  8371. }
  8372. }
  8373. var textLine = "";
  8374. if (foldLine && row >= foldStart) {
  8375. textLine = this.getFoldDisplayLine(foldLine, docRow, docColumn);
  8376. foldStartRow = foldLine.start.row;
  8377. } else {
  8378. textLine = this.getLine(docRow).substring(0, docColumn);
  8379. foldStartRow = docRow;
  8380. }
  8381. if (this.$useWrapMode) {
  8382. var wrapRow = this.$wrapData[foldStartRow];
  8383. if (wrapRow) {
  8384. var screenRowOffset = 0;
  8385. while (textLine.length >= wrapRow[screenRowOffset]) {
  8386. screenRow ++;
  8387. screenRowOffset++;
  8388. }
  8389. textLine = textLine.substring(
  8390. wrapRow[screenRowOffset - 1] || 0, textLine.length
  8391. );
  8392. }
  8393. }
  8394. return {
  8395. row: screenRow,
  8396. column: this.$getStringScreenWidth(textLine)[0]
  8397. };
  8398. };
  8399. this.documentToScreenColumn = function(row, docColumn) {
  8400. return this.documentToScreenPosition(row, docColumn).column;
  8401. };
  8402. this.documentToScreenRow = function(docRow, docColumn) {
  8403. return this.documentToScreenPosition(docRow, docColumn).row;
  8404. };
  8405. this.getScreenLength = function() {
  8406. var screenRows = 0;
  8407. var fold = null;
  8408. if (!this.$useWrapMode) {
  8409. screenRows = this.getLength();
  8410. var foldData = this.$foldData;
  8411. for (var i = 0; i < foldData.length; i++) {
  8412. fold = foldData[i];
  8413. screenRows -= fold.end.row - fold.start.row;
  8414. }
  8415. } else {
  8416. var lastRow = this.$wrapData.length;
  8417. var row = 0, i = 0;
  8418. var fold = this.$foldData[i++];
  8419. var foldStart = fold ? fold.start.row :Infinity;
  8420. while (row < lastRow) {
  8421. var splits = this.$wrapData[row];
  8422. screenRows += splits ? splits.length + 1 : 1;
  8423. row ++;
  8424. if (row > foldStart) {
  8425. row = fold.end.row+1;
  8426. fold = this.$foldData[i++];
  8427. foldStart = fold ?fold.start.row :Infinity;
  8428. }
  8429. }
  8430. }
  8431. if (this.lineWidgets)
  8432. screenRows += this.$getWidgetScreenLength();
  8433. return screenRows;
  8434. };
  8435. this.$setFontMetrics = function(fm) {
  8436. };
  8437. this.destroy = function() {
  8438. if (this.bgTokenizer) {
  8439. this.bgTokenizer.setDocument(null);
  8440. this.bgTokenizer = null;
  8441. }
  8442. this.$stopWorker();
  8443. };
  8444. function isFullWidth(c) {
  8445. if (c < 0x1100)
  8446. return false;
  8447. return c >= 0x1100 && c <= 0x115F ||
  8448. c >= 0x11A3 && c <= 0x11A7 ||
  8449. c >= 0x11FA && c <= 0x11FF ||
  8450. c >= 0x2329 && c <= 0x232A ||
  8451. c >= 0x2E80 && c <= 0x2E99 ||
  8452. c >= 0x2E9B && c <= 0x2EF3 ||
  8453. c >= 0x2F00 && c <= 0x2FD5 ||
  8454. c >= 0x2FF0 && c <= 0x2FFB ||
  8455. c >= 0x3000 && c <= 0x303E ||
  8456. c >= 0x3041 && c <= 0x3096 ||
  8457. c >= 0x3099 && c <= 0x30FF ||
  8458. c >= 0x3105 && c <= 0x312D ||
  8459. c >= 0x3131 && c <= 0x318E ||
  8460. c >= 0x3190 && c <= 0x31BA ||
  8461. c >= 0x31C0 && c <= 0x31E3 ||
  8462. c >= 0x31F0 && c <= 0x321E ||
  8463. c >= 0x3220 && c <= 0x3247 ||
  8464. c >= 0x3250 && c <= 0x32FE ||
  8465. c >= 0x3300 && c <= 0x4DBF ||
  8466. c >= 0x4E00 && c <= 0xA48C ||
  8467. c >= 0xA490 && c <= 0xA4C6 ||
  8468. c >= 0xA960 && c <= 0xA97C ||
  8469. c >= 0xAC00 && c <= 0xD7A3 ||
  8470. c >= 0xD7B0 && c <= 0xD7C6 ||
  8471. c >= 0xD7CB && c <= 0xD7FB ||
  8472. c >= 0xF900 && c <= 0xFAFF ||
  8473. c >= 0xFE10 && c <= 0xFE19 ||
  8474. c >= 0xFE30 && c <= 0xFE52 ||
  8475. c >= 0xFE54 && c <= 0xFE66 ||
  8476. c >= 0xFE68 && c <= 0xFE6B ||
  8477. c >= 0xFF01 && c <= 0xFF60 ||
  8478. c >= 0xFFE0 && c <= 0xFFE6;
  8479. };
  8480. }).call(EditSession.prototype);
  8481. require("./edit_session/folding").Folding.call(EditSession.prototype);
  8482. require("./edit_session/bracket_match").BracketMatch.call(EditSession.prototype);
  8483. config.defineOptions(EditSession.prototype, "session", {
  8484. wrap: {
  8485. set: function(value) {
  8486. if (!value || value == "off")
  8487. value = false;
  8488. else if (value == "free")
  8489. value = true;
  8490. else if (value == "printMargin")
  8491. value = -1;
  8492. else if (typeof value == "string")
  8493. value = parseInt(value, 10) || false;
  8494. if (this.$wrap == value)
  8495. return;
  8496. this.$wrap = value;
  8497. if (!value) {
  8498. this.setUseWrapMode(false);
  8499. } else {
  8500. var col = typeof value == "number" ? value : null;
  8501. this.setWrapLimitRange(col, col);
  8502. this.setUseWrapMode(true);
  8503. }
  8504. },
  8505. get: function() {
  8506. if (this.getUseWrapMode()) {
  8507. if (this.$wrap == -1)
  8508. return "printMargin";
  8509. if (!this.getWrapLimitRange().min)
  8510. return "free";
  8511. return this.$wrap;
  8512. }
  8513. return "off";
  8514. },
  8515. handlesSet: true
  8516. },
  8517. wrapMethod: {
  8518. set: function(val) {
  8519. val = val == "auto"
  8520. ? this.$mode.type != "text"
  8521. : val != "text";
  8522. if (val != this.$wrapAsCode) {
  8523. this.$wrapAsCode = val;
  8524. if (this.$useWrapMode) {
  8525. this.$modified = true;
  8526. this.$resetRowCache(0);
  8527. this.$updateWrapData(0, this.getLength() - 1);
  8528. }
  8529. }
  8530. },
  8531. initialValue: "auto"
  8532. },
  8533. firstLineNumber: {
  8534. set: function() {this._signal("changeBreakpoint");},
  8535. initialValue: 1
  8536. },
  8537. useWorker: {
  8538. set: function(useWorker) {
  8539. this.$useWorker = useWorker;
  8540. this.$stopWorker();
  8541. if (useWorker)
  8542. this.$startWorker();
  8543. },
  8544. initialValue: true
  8545. },
  8546. useSoftTabs: {initialValue: true},
  8547. tabSize: {
  8548. set: function(tabSize) {
  8549. if (isNaN(tabSize) || this.$tabSize === tabSize) return;
  8550. this.$modified = true;
  8551. this.$rowLengthCache = [];
  8552. this.$tabSize = tabSize;
  8553. this._signal("changeTabSize");
  8554. },
  8555. initialValue: 4,
  8556. handlesSet: true
  8557. },
  8558. overwrite: {
  8559. set: function(val) {this._signal("changeOverwrite");},
  8560. initialValue: false
  8561. },
  8562. newLineMode: {
  8563. set: function(val) {this.doc.setNewLineMode(val)},
  8564. get: function() {return this.doc.getNewLineMode()},
  8565. handlesSet: true
  8566. },
  8567. mode: {
  8568. set: function(val) { this.setMode(val) },
  8569. get: function() { return this.$modeId }
  8570. }
  8571. });
  8572. exports.EditSession = EditSession;
  8573. });
  8574. ace.define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"], function(require, exports, module) {
  8575. "use strict";
  8576. var lang = require("./lib/lang");
  8577. var oop = require("./lib/oop");
  8578. var Range = require("./range").Range;
  8579. var Search = function() {
  8580. this.$options = {};
  8581. };
  8582. (function() {
  8583. this.set = function(options) {
  8584. oop.mixin(this.$options, options);
  8585. return this;
  8586. };
  8587. this.getOptions = function() {
  8588. return lang.copyObject(this.$options);
  8589. };
  8590. this.setOptions = function(options) {
  8591. this.$options = options;
  8592. };
  8593. this.find = function(session) {
  8594. var options = this.$options;
  8595. var iterator = this.$matchIterator(session, options);
  8596. if (!iterator)
  8597. return false;
  8598. var firstRange = null;
  8599. iterator.forEach(function(range, row, offset) {
  8600. if (!range.start) {
  8601. var column = range.offset + (offset || 0);
  8602. firstRange = new Range(row, column, row, column + range.length);
  8603. if (!range.length && options.start && options.start.start
  8604. && options.skipCurrent != false && firstRange.isEqual(options.start)
  8605. ) {
  8606. firstRange = null;
  8607. return false;
  8608. }
  8609. } else
  8610. firstRange = range;
  8611. return true;
  8612. });
  8613. return firstRange;
  8614. };
  8615. this.findAll = function(session) {
  8616. var options = this.$options;
  8617. if (!options.needle)
  8618. return [];
  8619. this.$assembleRegExp(options);
  8620. var range = options.range;
  8621. var lines = range
  8622. ? session.getLines(range.start.row, range.end.row)
  8623. : session.doc.getAllLines();
  8624. var ranges = [];
  8625. var re = options.re;
  8626. if (options.$isMultiLine) {
  8627. var len = re.length;
  8628. var maxRow = lines.length - len;
  8629. var prevRange;
  8630. outer: for (var row = re.offset || 0; row <= maxRow; row++) {
  8631. for (var j = 0; j < len; j++)
  8632. if (lines[row + j].search(re[j]) == -1)
  8633. continue outer;
  8634. var startLine = lines[row];
  8635. var line = lines[row + len - 1];
  8636. var startIndex = startLine.length - startLine.match(re[0])[0].length;
  8637. var endIndex = line.match(re[len - 1])[0].length;
  8638. if (prevRange && prevRange.end.row === row &&
  8639. prevRange.end.column > startIndex
  8640. ) {
  8641. continue;
  8642. }
  8643. ranges.push(prevRange = new Range(
  8644. row, startIndex, row + len - 1, endIndex
  8645. ));
  8646. if (len > 2)
  8647. row = row + len - 2;
  8648. }
  8649. } else {
  8650. for (var i = 0; i < lines.length; i++) {
  8651. var matches = lang.getMatchOffsets(lines[i], re);
  8652. for (var j = 0; j < matches.length; j++) {
  8653. var match = matches[j];
  8654. ranges.push(new Range(i, match.offset, i, match.offset + match.length));
  8655. }
  8656. }
  8657. }
  8658. if (range) {
  8659. var startColumn = range.start.column;
  8660. var endColumn = range.start.column;
  8661. var i = 0, j = ranges.length - 1;
  8662. while (i < j && ranges[i].start.column < startColumn && ranges[i].start.row == range.start.row)
  8663. i++;
  8664. while (i < j && ranges[j].end.column > endColumn && ranges[j].end.row == range.end.row)
  8665. j--;
  8666. ranges = ranges.slice(i, j + 1);
  8667. for (i = 0, j = ranges.length; i < j; i++) {
  8668. ranges[i].start.row += range.start.row;
  8669. ranges[i].end.row += range.start.row;
  8670. }
  8671. }
  8672. return ranges;
  8673. };
  8674. this.replace = function(input, replacement) {
  8675. var options = this.$options;
  8676. var re = this.$assembleRegExp(options);
  8677. if (options.$isMultiLine)
  8678. return replacement;
  8679. if (!re)
  8680. return;
  8681. var match = re.exec(input);
  8682. if (!match || match[0].length != input.length)
  8683. return null;
  8684. replacement = input.replace(re, replacement);
  8685. if (options.preserveCase) {
  8686. replacement = replacement.split("");
  8687. for (var i = Math.min(input.length, input.length); i--; ) {
  8688. var ch = input[i];
  8689. if (ch && ch.toLowerCase() != ch)
  8690. replacement[i] = replacement[i].toUpperCase();
  8691. else
  8692. replacement[i] = replacement[i].toLowerCase();
  8693. }
  8694. replacement = replacement.join("");
  8695. }
  8696. return replacement;
  8697. };
  8698. this.$matchIterator = function(session, options) {
  8699. var re = this.$assembleRegExp(options);
  8700. if (!re)
  8701. return false;
  8702. var callback;
  8703. if (options.$isMultiLine) {
  8704. var len = re.length;
  8705. var matchIterator = function(line, row, offset) {
  8706. var startIndex = line.search(re[0]);
  8707. if (startIndex == -1)
  8708. return;
  8709. for (var i = 1; i < len; i++) {
  8710. line = session.getLine(row + i);
  8711. if (line.search(re[i]) == -1)
  8712. return;
  8713. }
  8714. var endIndex = line.match(re[len - 1])[0].length;
  8715. var range = new Range(row, startIndex, row + len - 1, endIndex);
  8716. if (re.offset == 1) {
  8717. range.start.row--;
  8718. range.start.column = Number.MAX_VALUE;
  8719. } else if (offset)
  8720. range.start.column += offset;
  8721. if (callback(range))
  8722. return true;
  8723. };
  8724. } else if (options.backwards) {
  8725. var matchIterator = function(line, row, startIndex) {
  8726. var matches = lang.getMatchOffsets(line, re);
  8727. for (var i = matches.length-1; i >= 0; i--)
  8728. if (callback(matches[i], row, startIndex))
  8729. return true;
  8730. };
  8731. } else {
  8732. var matchIterator = function(line, row, startIndex) {
  8733. var matches = lang.getMatchOffsets(line, re);
  8734. for (var i = 0; i < matches.length; i++)
  8735. if (callback(matches[i], row, startIndex))
  8736. return true;
  8737. };
  8738. }
  8739. var lineIterator = this.$lineIterator(session, options);
  8740. return {
  8741. forEach: function(_callback) {
  8742. callback = _callback;
  8743. lineIterator.forEach(matchIterator);
  8744. }
  8745. };
  8746. };
  8747. this.$assembleRegExp = function(options, $disableFakeMultiline) {
  8748. if (options.needle instanceof RegExp)
  8749. return options.re = options.needle;
  8750. var needle = options.needle;
  8751. if (!options.needle)
  8752. return options.re = false;
  8753. if (!options.regExp)
  8754. needle = lang.escapeRegExp(needle);
  8755. if (options.wholeWord)
  8756. needle = "\\b" + needle + "\\b";
  8757. var modifier = options.caseSensitive ? "gm" : "gmi";
  8758. options.$isMultiLine = !$disableFakeMultiline && /[\n\r]/.test(needle);
  8759. if (options.$isMultiLine)
  8760. return options.re = this.$assembleMultilineRegExp(needle, modifier);
  8761. try {
  8762. var re = new RegExp(needle, modifier);
  8763. } catch(e) {
  8764. re = false;
  8765. }
  8766. return options.re = re;
  8767. };
  8768. this.$assembleMultilineRegExp = function(needle, modifier) {
  8769. var parts = needle.replace(/\r\n|\r|\n/g, "$\n^").split("\n");
  8770. var re = [];
  8771. for (var i = 0; i < parts.length; i++) try {
  8772. re.push(new RegExp(parts[i], modifier));
  8773. } catch(e) {
  8774. return false;
  8775. }
  8776. if (parts[0] == "") {
  8777. re.shift();
  8778. re.offset = 1;
  8779. } else {
  8780. re.offset = 0;
  8781. }
  8782. return re;
  8783. };
  8784. this.$lineIterator = function(session, options) {
  8785. var backwards = options.backwards == true;
  8786. var skipCurrent = options.skipCurrent != false;
  8787. var range = options.range;
  8788. var start = options.start;
  8789. if (!start)
  8790. start = range ? range[backwards ? "end" : "start"] : session.selection.getRange();
  8791. if (start.start)
  8792. start = start[skipCurrent != backwards ? "end" : "start"];
  8793. var firstRow = range ? range.start.row : 0;
  8794. var lastRow = range ? range.end.row : session.getLength() - 1;
  8795. var forEach = backwards ? function(callback) {
  8796. var row = start.row;
  8797. var line = session.getLine(row).substring(0, start.column);
  8798. if (callback(line, row))
  8799. return;
  8800. for (row--; row >= firstRow; row--)
  8801. if (callback(session.getLine(row), row))
  8802. return;
  8803. if (options.wrap == false)
  8804. return;
  8805. for (row = lastRow, firstRow = start.row; row >= firstRow; row--)
  8806. if (callback(session.getLine(row), row))
  8807. return;
  8808. } : function(callback) {
  8809. var row = start.row;
  8810. var line = session.getLine(row).substr(start.column);
  8811. if (callback(line, row, start.column))
  8812. return;
  8813. for (row = row+1; row <= lastRow; row++)
  8814. if (callback(session.getLine(row), row))
  8815. return;
  8816. if (options.wrap == false)
  8817. return;
  8818. for (row = firstRow, lastRow = start.row; row <= lastRow; row++)
  8819. if (callback(session.getLine(row), row))
  8820. return;
  8821. };
  8822. return {forEach: forEach};
  8823. };
  8824. }).call(Search.prototype);
  8825. exports.Search = Search;
  8826. });
  8827. ace.define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"], function(require, exports, module) {
  8828. "use strict";
  8829. var keyUtil = require("../lib/keys");
  8830. var useragent = require("../lib/useragent");
  8831. var KEY_MODS = keyUtil.KEY_MODS;
  8832. function HashHandler(config, platform) {
  8833. this.platform = platform || (useragent.isMac ? "mac" : "win");
  8834. this.commands = {};
  8835. this.commandKeyBinding = {};
  8836. this.addCommands(config);
  8837. this.$singleCommand = true;
  8838. }
  8839. function MultiHashHandler(config, platform) {
  8840. HashHandler.call(this, config, platform);
  8841. this.$singleCommand = false;
  8842. }
  8843. MultiHashHandler.prototype = HashHandler.prototype;
  8844. (function() {
  8845. this.addCommand = function(command) {
  8846. if (this.commands[command.name])
  8847. this.removeCommand(command);
  8848. this.commands[command.name] = command;
  8849. if (command.bindKey)
  8850. this._buildKeyHash(command);
  8851. };
  8852. this.removeCommand = function(command, keepCommand) {
  8853. var name = command && (typeof command === 'string' ? command : command.name);
  8854. command = this.commands[name];
  8855. if (!keepCommand)
  8856. delete this.commands[name];
  8857. var ckb = this.commandKeyBinding;
  8858. for (var keyId in ckb) {
  8859. var cmdGroup = ckb[keyId];
  8860. if (cmdGroup == command) {
  8861. delete ckb[keyId];
  8862. } else if (Array.isArray(cmdGroup)) {
  8863. var i = cmdGroup.indexOf(command);
  8864. if (i != -1) {
  8865. cmdGroup.splice(i, 1);
  8866. if (cmdGroup.length == 1)
  8867. ckb[keyId] = cmdGroup[0];
  8868. }
  8869. }
  8870. }
  8871. };
  8872. this.bindKey = function(key, command, asDefault) {
  8873. if (typeof key == "object")
  8874. key = key[this.platform];
  8875. if (!key)
  8876. return;
  8877. if (typeof command == "function")
  8878. return this.addCommand({exec: command, bindKey: key, name: command.name || key});
  8879. key.split("|").forEach(function(keyPart) {
  8880. var chain = "";
  8881. if (keyPart.indexOf(" ") != -1) {
  8882. var parts = keyPart.split(/\s+/);
  8883. keyPart = parts.pop();
  8884. parts.forEach(function(keyPart) {
  8885. var binding = this.parseKeys(keyPart);
  8886. var id = KEY_MODS[binding.hashId] + binding.key;
  8887. chain += (chain ? " " : "") + id;
  8888. this._addCommandToBinding(chain, "chainKeys");
  8889. }, this);
  8890. chain += " ";
  8891. }
  8892. var binding = this.parseKeys(keyPart);
  8893. var id = KEY_MODS[binding.hashId] + binding.key;
  8894. this._addCommandToBinding(chain + id, command, asDefault);
  8895. }, this);
  8896. };
  8897. this._addCommandToBinding = function(keyId, command, asDefault) {
  8898. var ckb = this.commandKeyBinding, i;
  8899. if (!command) {
  8900. delete ckb[keyId];
  8901. } else if (!ckb[keyId] || this.$singleCommand) {
  8902. ckb[keyId] = command;
  8903. } else {
  8904. if (!Array.isArray(ckb[keyId])) {
  8905. ckb[keyId] = [ckb[keyId]];
  8906. } else if ((i = ckb[keyId].indexOf(command)) != -1) {
  8907. ckb[keyId].splice(i, 1);
  8908. }
  8909. if (asDefault || command.isDefault)
  8910. ckb[keyId].unshift(command);
  8911. else
  8912. ckb[keyId].push(command);
  8913. }
  8914. };
  8915. this.addCommands = function(commands) {
  8916. commands && Object.keys(commands).forEach(function(name) {
  8917. var command = commands[name];
  8918. if (!command)
  8919. return;
  8920. if (typeof command === "string")
  8921. return this.bindKey(command, name);
  8922. if (typeof command === "function")
  8923. command = { exec: command };
  8924. if (typeof command !== "object")
  8925. return;
  8926. if (!command.name)
  8927. command.name = name;
  8928. this.addCommand(command);
  8929. }, this);
  8930. };
  8931. this.removeCommands = function(commands) {
  8932. Object.keys(commands).forEach(function(name) {
  8933. this.removeCommand(commands[name]);
  8934. }, this);
  8935. };
  8936. this.bindKeys = function(keyList) {
  8937. Object.keys(keyList).forEach(function(key) {
  8938. this.bindKey(key, keyList[key]);
  8939. }, this);
  8940. };
  8941. this._buildKeyHash = function(command) {
  8942. this.bindKey(command.bindKey, command);
  8943. };
  8944. this.parseKeys = function(keys) {
  8945. var parts = keys.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(x){return x});
  8946. var key = parts.pop();
  8947. var keyCode = keyUtil[key];
  8948. if (keyUtil.FUNCTION_KEYS[keyCode])
  8949. key = keyUtil.FUNCTION_KEYS[keyCode].toLowerCase();
  8950. else if (!parts.length)
  8951. return {key: key, hashId: -1};
  8952. else if (parts.length == 1 && parts[0] == "shift")
  8953. return {key: key.toUpperCase(), hashId: -1};
  8954. var hashId = 0;
  8955. for (var i = parts.length; i--;) {
  8956. var modifier = keyUtil.KEY_MODS[parts[i]];
  8957. if (modifier == null) {
  8958. if (typeof console != "undefined")
  8959. console.error("invalid modifier " + parts[i] + " in " + keys);
  8960. return false;
  8961. }
  8962. hashId |= modifier;
  8963. }
  8964. return {key: key, hashId: hashId};
  8965. };
  8966. this.findKeyCommand = function findKeyCommand(hashId, keyString) {
  8967. var key = KEY_MODS[hashId] + keyString;
  8968. return this.commandKeyBinding[key];
  8969. };
  8970. this.handleKeyboard = function(data, hashId, keyString, keyCode) {
  8971. var key = KEY_MODS[hashId] + keyString;
  8972. var command = this.commandKeyBinding[key];
  8973. if (data.$keyChain) {
  8974. data.$keyChain += " " + key;
  8975. command = this.commandKeyBinding[data.$keyChain] || command;
  8976. }
  8977. if (command) {
  8978. if (command == "chainKeys" || command[command.length - 1] == "chainKeys") {
  8979. data.$keyChain = data.$keyChain || key;
  8980. return {command: "null"};
  8981. }
  8982. }
  8983. if (data.$keyChain && keyCode > 0)
  8984. data.$keyChain = "";
  8985. return {command: command};
  8986. };
  8987. }).call(HashHandler.prototype);
  8988. exports.HashHandler = HashHandler;
  8989. exports.MultiHashHandler = MultiHashHandler;
  8990. });
  8991. ace.define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"], function(require, exports, module) {
  8992. "use strict";
  8993. var oop = require("../lib/oop");
  8994. var MultiHashHandler = require("../keyboard/hash_handler").MultiHashHandler;
  8995. var EventEmitter = require("../lib/event_emitter").EventEmitter;
  8996. var CommandManager = function(platform, commands) {
  8997. MultiHashHandler.call(this, commands, platform);
  8998. this.byName = this.commands;
  8999. this.setDefaultHandler("exec", function(e) {
  9000. return e.command.exec(e.editor, e.args || {});
  9001. });
  9002. };
  9003. oop.inherits(CommandManager, MultiHashHandler);
  9004. (function() {
  9005. oop.implement(this, EventEmitter);
  9006. this.exec = function(command, editor, args) {
  9007. if (Array.isArray(command)) {
  9008. for (var i = command.length; i--; ) {
  9009. if (this.exec(command[i], editor, args)) return true;
  9010. }
  9011. return false;
  9012. }
  9013. if (typeof command === "string")
  9014. command = this.commands[command];
  9015. if (!command)
  9016. return false;
  9017. if (editor && editor.$readOnly && !command.readOnly)
  9018. return false;
  9019. var e = {editor: editor, command: command, args: args};
  9020. e.returnValue = this._emit("exec", e);
  9021. this._signal("afterExec", e);
  9022. return e.returnValue === false ? false : true;
  9023. };
  9024. this.toggleRecording = function(editor) {
  9025. if (this.$inReplay)
  9026. return;
  9027. editor && editor._emit("changeStatus");
  9028. if (this.recording) {
  9029. this.macro.pop();
  9030. this.removeEventListener("exec", this.$addCommandToMacro);
  9031. if (!this.macro.length)
  9032. this.macro = this.oldMacro;
  9033. return this.recording = false;
  9034. }
  9035. if (!this.$addCommandToMacro) {
  9036. this.$addCommandToMacro = function(e) {
  9037. this.macro.push([e.command, e.args]);
  9038. }.bind(this);
  9039. }
  9040. this.oldMacro = this.macro;
  9041. this.macro = [];
  9042. this.on("exec", this.$addCommandToMacro);
  9043. return this.recording = true;
  9044. };
  9045. this.replay = function(editor) {
  9046. if (this.$inReplay || !this.macro)
  9047. return;
  9048. if (this.recording)
  9049. return this.toggleRecording(editor);
  9050. try {
  9051. this.$inReplay = true;
  9052. this.macro.forEach(function(x) {
  9053. if (typeof x == "string")
  9054. this.exec(x, editor);
  9055. else
  9056. this.exec(x[0], editor, x[1]);
  9057. }, this);
  9058. } finally {
  9059. this.$inReplay = false;
  9060. }
  9061. };
  9062. this.trimMacro = function(m) {
  9063. return m.map(function(x){
  9064. if (typeof x[0] != "string")
  9065. x[0] = x[0].name;
  9066. if (!x[1])
  9067. x = x[0];
  9068. return x;
  9069. });
  9070. };
  9071. }).call(CommandManager.prototype);
  9072. exports.CommandManager = CommandManager;
  9073. });
  9074. ace.define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"], function(require, exports, module) {
  9075. "use strict";
  9076. var lang = require("../lib/lang");
  9077. var config = require("../config");
  9078. var Range = require("../range").Range;
  9079. function bindKey(win, mac) {
  9080. return {win: win, mac: mac};
  9081. }
  9082. exports.commands = [{
  9083. name: "showSettingsMenu",
  9084. bindKey: bindKey("Ctrl-,", "Command-,"),
  9085. exec: function(editor) {
  9086. config.loadModule("ace/ext/settings_menu", function(module) {
  9087. module.init(editor);
  9088. editor.showSettingsMenu();
  9089. });
  9090. },
  9091. readOnly: true
  9092. }, {
  9093. name: "goToNextError",
  9094. bindKey: bindKey("Alt-E", "Ctrl-E"),
  9095. exec: function(editor) {
  9096. config.loadModule("ace/ext/error_marker", function(module) {
  9097. module.showErrorMarker(editor, 1);
  9098. });
  9099. },
  9100. scrollIntoView: "animate",
  9101. readOnly: true
  9102. }, {
  9103. name: "goToPreviousError",
  9104. bindKey: bindKey("Alt-Shift-E", "Ctrl-Shift-E"),
  9105. exec: function(editor) {
  9106. config.loadModule("ace/ext/error_marker", function(module) {
  9107. module.showErrorMarker(editor, -1);
  9108. });
  9109. },
  9110. scrollIntoView: "animate",
  9111. readOnly: true
  9112. }, {
  9113. name: "selectall",
  9114. bindKey: bindKey("Ctrl-A", "Command-A"),
  9115. exec: function(editor) { editor.selectAll(); },
  9116. readOnly: true
  9117. }, {
  9118. name: "centerselection",
  9119. bindKey: bindKey(null, "Ctrl-L"),
  9120. exec: function(editor) { editor.centerSelection(); },
  9121. readOnly: true
  9122. }, {
  9123. name: "gotoline",
  9124. bindKey: bindKey("Ctrl-L", "Command-L"),
  9125. exec: function(editor) {
  9126. var line = parseInt(prompt("Enter line number:"), 10);
  9127. if (!isNaN(line)) {
  9128. editor.gotoLine(line);
  9129. }
  9130. },
  9131. readOnly: true
  9132. }, {
  9133. name: "fold",
  9134. bindKey: bindKey("Alt-L|Ctrl-F1", "Command-Alt-L|Command-F1"),
  9135. exec: function(editor) { editor.session.toggleFold(false); },
  9136. multiSelectAction: "forEach",
  9137. scrollIntoView: "center",
  9138. readOnly: true
  9139. }, {
  9140. name: "unfold",
  9141. bindKey: bindKey("Alt-Shift-L|Ctrl-Shift-F1", "Command-Alt-Shift-L|Command-Shift-F1"),
  9142. exec: function(editor) { editor.session.toggleFold(true); },
  9143. multiSelectAction: "forEach",
  9144. scrollIntoView: "center",
  9145. readOnly: true
  9146. }, {
  9147. name: "toggleFoldWidget",
  9148. bindKey: bindKey("F2", "F2"),
  9149. exec: function(editor) { editor.session.toggleFoldWidget(); },
  9150. multiSelectAction: "forEach",
  9151. scrollIntoView: "center",
  9152. readOnly: true
  9153. }, {
  9154. name: "toggleParentFoldWidget",
  9155. bindKey: bindKey("Alt-F2", "Alt-F2"),
  9156. exec: function(editor) { editor.session.toggleFoldWidget(true); },
  9157. multiSelectAction: "forEach",
  9158. scrollIntoView: "center",
  9159. readOnly: true
  9160. }, {
  9161. name: "foldall",
  9162. bindKey: bindKey(null, "Ctrl-Command-Option-0"),
  9163. exec: function(editor) { editor.session.foldAll(); },
  9164. scrollIntoView: "center",
  9165. readOnly: true
  9166. }, {
  9167. name: "foldOther",
  9168. bindKey: bindKey("Alt-0", "Command-Option-0"),
  9169. exec: function(editor) {
  9170. editor.session.foldAll();
  9171. editor.session.unfold(editor.selection.getAllRanges());
  9172. },
  9173. scrollIntoView: "center",
  9174. readOnly: true
  9175. }, {
  9176. name: "unfoldall",
  9177. bindKey: bindKey("Alt-Shift-0", "Command-Option-Shift-0"),
  9178. exec: function(editor) { editor.session.unfold(); },
  9179. scrollIntoView: "center",
  9180. readOnly: true
  9181. }, {
  9182. name: "findnext",
  9183. bindKey: bindKey("Ctrl-K", "Command-G"),
  9184. exec: function(editor) { editor.findNext(); },
  9185. multiSelectAction: "forEach",
  9186. scrollIntoView: "center",
  9187. readOnly: true
  9188. }, {
  9189. name: "findprevious",
  9190. bindKey: bindKey("Ctrl-Shift-K", "Command-Shift-G"),
  9191. exec: function(editor) { editor.findPrevious(); },
  9192. multiSelectAction: "forEach",
  9193. scrollIntoView: "center",
  9194. readOnly: true
  9195. }, {
  9196. name: "selectOrFindNext",
  9197. bindKey: bindKey("Alt-K", "Ctrl-G"),
  9198. exec: function(editor) {
  9199. if (editor.selection.isEmpty())
  9200. editor.selection.selectWord();
  9201. else
  9202. editor.findNext();
  9203. },
  9204. readOnly: true
  9205. }, {
  9206. name: "selectOrFindPrevious",
  9207. bindKey: bindKey("Alt-Shift-K", "Ctrl-Shift-G"),
  9208. exec: function(editor) {
  9209. if (editor.selection.isEmpty())
  9210. editor.selection.selectWord();
  9211. else
  9212. editor.findPrevious();
  9213. },
  9214. readOnly: true
  9215. }, {
  9216. name: "find",
  9217. bindKey: bindKey("Ctrl-F", "Command-F"),
  9218. exec: function(editor) {
  9219. config.loadModule("ace/ext/searchbox", function(e) {e.Search(editor)});
  9220. },
  9221. readOnly: true
  9222. }, {
  9223. name: "overwrite",
  9224. bindKey: "Insert",
  9225. exec: function(editor) { editor.toggleOverwrite(); },
  9226. readOnly: true
  9227. }, {
  9228. name: "selecttostart",
  9229. bindKey: bindKey("Ctrl-Shift-Home", "Command-Shift-Up"),
  9230. exec: function(editor) { editor.getSelection().selectFileStart(); },
  9231. multiSelectAction: "forEach",
  9232. readOnly: true,
  9233. scrollIntoView: "animate",
  9234. aceCommandGroup: "fileJump"
  9235. }, {
  9236. name: "gotostart",
  9237. bindKey: bindKey("Ctrl-Home", "Command-Home|Command-Up"),
  9238. exec: function(editor) { editor.navigateFileStart(); },
  9239. multiSelectAction: "forEach",
  9240. readOnly: true,
  9241. scrollIntoView: "animate",
  9242. aceCommandGroup: "fileJump"
  9243. }, {
  9244. name: "selectup",
  9245. bindKey: bindKey("Shift-Up", "Shift-Up"),
  9246. exec: function(editor) { editor.getSelection().selectUp(); },
  9247. multiSelectAction: "forEach",
  9248. scrollIntoView: "cursor",
  9249. readOnly: true
  9250. }, {
  9251. name: "golineup",
  9252. bindKey: bindKey("Up", "Up|Ctrl-P"),
  9253. exec: function(editor, args) { editor.navigateUp(args.times); },
  9254. multiSelectAction: "forEach",
  9255. scrollIntoView: "cursor",
  9256. readOnly: true
  9257. }, {
  9258. name: "selecttoend",
  9259. bindKey: bindKey("Ctrl-Shift-End", "Command-Shift-Down"),
  9260. exec: function(editor) { editor.getSelection().selectFileEnd(); },
  9261. multiSelectAction: "forEach",
  9262. readOnly: true,
  9263. scrollIntoView: "animate",
  9264. aceCommandGroup: "fileJump"
  9265. }, {
  9266. name: "gotoend",
  9267. bindKey: bindKey("Ctrl-End", "Command-End|Command-Down"),
  9268. exec: function(editor) { editor.navigateFileEnd(); },
  9269. multiSelectAction: "forEach",
  9270. readOnly: true,
  9271. scrollIntoView: "animate",
  9272. aceCommandGroup: "fileJump"
  9273. }, {
  9274. name: "selectdown",
  9275. bindKey: bindKey("Shift-Down", "Shift-Down"),
  9276. exec: function(editor) { editor.getSelection().selectDown(); },
  9277. multiSelectAction: "forEach",
  9278. scrollIntoView: "cursor",
  9279. readOnly: true
  9280. }, {
  9281. name: "golinedown",
  9282. bindKey: bindKey("Down", "Down|Ctrl-N"),
  9283. exec: function(editor, args) { editor.navigateDown(args.times); },
  9284. multiSelectAction: "forEach",
  9285. scrollIntoView: "cursor",
  9286. readOnly: true
  9287. }, {
  9288. name: "selectwordleft",
  9289. bindKey: bindKey("Ctrl-Shift-Left", "Option-Shift-Left"),
  9290. exec: function(editor) { editor.getSelection().selectWordLeft(); },
  9291. multiSelectAction: "forEach",
  9292. scrollIntoView: "cursor",
  9293. readOnly: true
  9294. }, {
  9295. name: "gotowordleft",
  9296. bindKey: bindKey("Ctrl-Left", "Option-Left"),
  9297. exec: function(editor) { editor.navigateWordLeft(); },
  9298. multiSelectAction: "forEach",
  9299. scrollIntoView: "cursor",
  9300. readOnly: true
  9301. }, {
  9302. name: "selecttolinestart",
  9303. bindKey: bindKey("Alt-Shift-Left", "Command-Shift-Left"),
  9304. exec: function(editor) { editor.getSelection().selectLineStart(); },
  9305. multiSelectAction: "forEach",
  9306. scrollIntoView: "cursor",
  9307. readOnly: true
  9308. }, {
  9309. name: "gotolinestart",
  9310. bindKey: bindKey("Alt-Left|Home", "Command-Left|Home|Ctrl-A"),
  9311. exec: function(editor) { editor.navigateLineStart(); },
  9312. multiSelectAction: "forEach",
  9313. scrollIntoView: "cursor",
  9314. readOnly: true
  9315. }, {
  9316. name: "selectleft",
  9317. bindKey: bindKey("Shift-Left", "Shift-Left"),
  9318. exec: function(editor) { editor.getSelection().selectLeft(); },
  9319. multiSelectAction: "forEach",
  9320. scrollIntoView: "cursor",
  9321. readOnly: true
  9322. }, {
  9323. name: "gotoleft",
  9324. bindKey: bindKey("Left", "Left|Ctrl-B"),
  9325. exec: function(editor, args) { editor.navigateLeft(args.times); },
  9326. multiSelectAction: "forEach",
  9327. scrollIntoView: "cursor",
  9328. readOnly: true
  9329. }, {
  9330. name: "selectwordright",
  9331. bindKey: bindKey("Ctrl-Shift-Right", "Option-Shift-Right"),
  9332. exec: function(editor) { editor.getSelection().selectWordRight(); },
  9333. multiSelectAction: "forEach",
  9334. scrollIntoView: "cursor",
  9335. readOnly: true
  9336. }, {
  9337. name: "gotowordright",
  9338. bindKey: bindKey("Ctrl-Right", "Option-Right"),
  9339. exec: function(editor) { editor.navigateWordRight(); },
  9340. multiSelectAction: "forEach",
  9341. scrollIntoView: "cursor",
  9342. readOnly: true
  9343. }, {
  9344. name: "selecttolineend",
  9345. bindKey: bindKey("Alt-Shift-Right", "Command-Shift-Right"),
  9346. exec: function(editor) { editor.getSelection().selectLineEnd(); },
  9347. multiSelectAction: "forEach",
  9348. scrollIntoView: "cursor",
  9349. readOnly: true
  9350. }, {
  9351. name: "gotolineend",
  9352. bindKey: bindKey("Alt-Right|End", "Command-Right|End|Ctrl-E"),
  9353. exec: function(editor) { editor.navigateLineEnd(); },
  9354. multiSelectAction: "forEach",
  9355. scrollIntoView: "cursor",
  9356. readOnly: true
  9357. }, {
  9358. name: "selectright",
  9359. bindKey: bindKey("Shift-Right", "Shift-Right"),
  9360. exec: function(editor) { editor.getSelection().selectRight(); },
  9361. multiSelectAction: "forEach",
  9362. scrollIntoView: "cursor",
  9363. readOnly: true
  9364. }, {
  9365. name: "gotoright",
  9366. bindKey: bindKey("Right", "Right|Ctrl-F"),
  9367. exec: function(editor, args) { editor.navigateRight(args.times); },
  9368. multiSelectAction: "forEach",
  9369. scrollIntoView: "cursor",
  9370. readOnly: true
  9371. }, {
  9372. name: "selectpagedown",
  9373. bindKey: "Shift-PageDown",
  9374. exec: function(editor) { editor.selectPageDown(); },
  9375. readOnly: true
  9376. }, {
  9377. name: "pagedown",
  9378. bindKey: bindKey(null, "Option-PageDown"),
  9379. exec: function(editor) { editor.scrollPageDown(); },
  9380. readOnly: true
  9381. }, {
  9382. name: "gotopagedown",
  9383. bindKey: bindKey("PageDown", "PageDown|Ctrl-V"),
  9384. exec: function(editor) { editor.gotoPageDown(); },
  9385. readOnly: true
  9386. }, {
  9387. name: "selectpageup",
  9388. bindKey: "Shift-PageUp",
  9389. exec: function(editor) { editor.selectPageUp(); },
  9390. readOnly: true
  9391. }, {
  9392. name: "pageup",
  9393. bindKey: bindKey(null, "Option-PageUp"),
  9394. exec: function(editor) { editor.scrollPageUp(); },
  9395. readOnly: true
  9396. }, {
  9397. name: "gotopageup",
  9398. bindKey: "PageUp",
  9399. exec: function(editor) { editor.gotoPageUp(); },
  9400. readOnly: true
  9401. }, {
  9402. name: "scrollup",
  9403. bindKey: bindKey("Ctrl-Up", null),
  9404. exec: function(e) { e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight); },
  9405. readOnly: true
  9406. }, {
  9407. name: "scrolldown",
  9408. bindKey: bindKey("Ctrl-Down", null),
  9409. exec: function(e) { e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight); },
  9410. readOnly: true
  9411. }, {
  9412. name: "selectlinestart",
  9413. bindKey: "Shift-Home",
  9414. exec: function(editor) { editor.getSelection().selectLineStart(); },
  9415. multiSelectAction: "forEach",
  9416. scrollIntoView: "cursor",
  9417. readOnly: true
  9418. }, {
  9419. name: "selectlineend",
  9420. bindKey: "Shift-End",
  9421. exec: function(editor) { editor.getSelection().selectLineEnd(); },
  9422. multiSelectAction: "forEach",
  9423. scrollIntoView: "cursor",
  9424. readOnly: true
  9425. }, {
  9426. name: "togglerecording",
  9427. bindKey: bindKey("Ctrl-Alt-E", "Command-Option-E"),
  9428. exec: function(editor) { editor.commands.toggleRecording(editor); },
  9429. readOnly: true
  9430. }, {
  9431. name: "replaymacro",
  9432. bindKey: bindKey("Ctrl-Shift-E", "Command-Shift-E"),
  9433. exec: function(editor) { editor.commands.replay(editor); },
  9434. readOnly: true
  9435. }, {
  9436. name: "jumptomatching",
  9437. bindKey: bindKey("Ctrl-P", "Ctrl-P"),
  9438. exec: function(editor) { editor.jumpToMatching(); },
  9439. multiSelectAction: "forEach",
  9440. scrollIntoView: "animate",
  9441. readOnly: true
  9442. }, {
  9443. name: "selecttomatching",
  9444. bindKey: bindKey("Ctrl-Shift-P", "Ctrl-Shift-P"),
  9445. exec: function(editor) { editor.jumpToMatching(true); },
  9446. multiSelectAction: "forEach",
  9447. scrollIntoView: "animate",
  9448. readOnly: true
  9449. }, {
  9450. name: "expandToMatching",
  9451. bindKey: bindKey("Ctrl-Shift-M", "Ctrl-Shift-M"),
  9452. exec: function(editor) { editor.jumpToMatching(true, true); },
  9453. multiSelectAction: "forEach",
  9454. scrollIntoView: "animate",
  9455. readOnly: true
  9456. }, {
  9457. name: "passKeysToBrowser",
  9458. bindKey: bindKey(null, null),
  9459. exec: function() {},
  9460. passEvent: true,
  9461. readOnly: true
  9462. },
  9463. {
  9464. name: "cut",
  9465. exec: function(editor) {
  9466. var range = editor.getSelectionRange();
  9467. editor._emit("cut", range);
  9468. if (!editor.selection.isEmpty()) {
  9469. editor.session.remove(range);
  9470. editor.clearSelection();
  9471. }
  9472. },
  9473. scrollIntoView: "cursor",
  9474. multiSelectAction: "forEach"
  9475. }, {
  9476. name: "removeline",
  9477. bindKey: bindKey("Ctrl-D", "Command-D"),
  9478. exec: function(editor) { editor.removeLines(); },
  9479. scrollIntoView: "cursor",
  9480. multiSelectAction: "forEachLine"
  9481. }, {
  9482. name: "duplicateSelection",
  9483. bindKey: bindKey("Ctrl-Shift-D", "Command-Shift-D"),
  9484. exec: function(editor) { editor.duplicateSelection(); },
  9485. scrollIntoView: "cursor",
  9486. multiSelectAction: "forEach"
  9487. }, {
  9488. name: "sortlines",
  9489. bindKey: bindKey("Ctrl-Alt-S", "Command-Alt-S"),
  9490. exec: function(editor) { editor.sortLines(); },
  9491. scrollIntoView: "selection",
  9492. multiSelectAction: "forEachLine"
  9493. }, {
  9494. name: "togglecomment",
  9495. bindKey: bindKey("Ctrl-/", "Command-/"),
  9496. exec: function(editor) { editor.toggleCommentLines(); },
  9497. multiSelectAction: "forEachLine",
  9498. scrollIntoView: "selectionPart"
  9499. }, {
  9500. name: "toggleBlockComment",
  9501. bindKey: bindKey("Ctrl-Shift-/", "Command-Shift-/"),
  9502. exec: function(editor) { editor.toggleBlockComment(); },
  9503. multiSelectAction: "forEach",
  9504. scrollIntoView: "selectionPart"
  9505. }, {
  9506. name: "modifyNumberUp",
  9507. bindKey: bindKey("Ctrl-Shift-Up", "Alt-Shift-Up"),
  9508. exec: function(editor) { editor.modifyNumber(1); },
  9509. scrollIntoView: "cursor",
  9510. multiSelectAction: "forEach"
  9511. }, {
  9512. name: "modifyNumberDown",
  9513. bindKey: bindKey("Ctrl-Shift-Down", "Alt-Shift-Down"),
  9514. exec: function(editor) { editor.modifyNumber(-1); },
  9515. scrollIntoView: "cursor",
  9516. multiSelectAction: "forEach"
  9517. }, {
  9518. name: "replace",
  9519. bindKey: bindKey("Ctrl-H", "Command-Option-F"),
  9520. exec: function(editor) {
  9521. config.loadModule("ace/ext/searchbox", function(e) {e.Search(editor, true)});
  9522. }
  9523. }, {
  9524. name: "undo",
  9525. bindKey: bindKey("Ctrl-Z", "Command-Z"),
  9526. exec: function(editor) { editor.undo(); }
  9527. }, {
  9528. name: "redo",
  9529. bindKey: bindKey("Ctrl-Shift-Z|Ctrl-Y", "Command-Shift-Z|Command-Y"),
  9530. exec: function(editor) { editor.redo(); }
  9531. }, {
  9532. name: "copylinesup",
  9533. bindKey: bindKey("Alt-Shift-Up", "Command-Option-Up"),
  9534. exec: function(editor) { editor.copyLinesUp(); },
  9535. scrollIntoView: "cursor"
  9536. }, {
  9537. name: "movelinesup",
  9538. bindKey: bindKey("Alt-Up", "Option-Up"),
  9539. exec: function(editor) { editor.moveLinesUp(); },
  9540. scrollIntoView: "cursor"
  9541. }, {
  9542. name: "copylinesdown",
  9543. bindKey: bindKey("Alt-Shift-Down", "Command-Option-Down"),
  9544. exec: function(editor) { editor.copyLinesDown(); },
  9545. scrollIntoView: "cursor"
  9546. }, {
  9547. name: "movelinesdown",
  9548. bindKey: bindKey("Alt-Down", "Option-Down"),
  9549. exec: function(editor) { editor.moveLinesDown(); },
  9550. scrollIntoView: "cursor"
  9551. }, {
  9552. name: "del",
  9553. bindKey: bindKey("Delete", "Delete|Ctrl-D|Shift-Delete"),
  9554. exec: function(editor) { editor.remove("right"); },
  9555. multiSelectAction: "forEach",
  9556. scrollIntoView: "cursor"
  9557. }, {
  9558. name: "backspace",
  9559. bindKey: bindKey(
  9560. "Shift-Backspace|Backspace",
  9561. "Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"
  9562. ),
  9563. exec: function(editor) { editor.remove("left"); },
  9564. multiSelectAction: "forEach",
  9565. scrollIntoView: "cursor"
  9566. }, {
  9567. name: "cut_or_delete",
  9568. bindKey: bindKey("Shift-Delete", null),
  9569. exec: function(editor) {
  9570. if (editor.selection.isEmpty()) {
  9571. editor.remove("left");
  9572. } else {
  9573. return false;
  9574. }
  9575. },
  9576. multiSelectAction: "forEach",
  9577. scrollIntoView: "cursor"
  9578. }, {
  9579. name: "removetolinestart",
  9580. bindKey: bindKey("Alt-Backspace", "Command-Backspace"),
  9581. exec: function(editor) { editor.removeToLineStart(); },
  9582. multiSelectAction: "forEach",
  9583. scrollIntoView: "cursor"
  9584. }, {
  9585. name: "removetolineend",
  9586. bindKey: bindKey("Alt-Delete", "Ctrl-K"),
  9587. exec: function(editor) { editor.removeToLineEnd(); },
  9588. multiSelectAction: "forEach",
  9589. scrollIntoView: "cursor"
  9590. }, {
  9591. name: "removewordleft",
  9592. bindKey: bindKey("Ctrl-Backspace", "Alt-Backspace|Ctrl-Alt-Backspace"),
  9593. exec: function(editor) { editor.removeWordLeft(); },
  9594. multiSelectAction: "forEach",
  9595. scrollIntoView: "cursor"
  9596. }, {
  9597. name: "removewordright",
  9598. bindKey: bindKey("Ctrl-Delete", "Alt-Delete"),
  9599. exec: function(editor) { editor.removeWordRight(); },
  9600. multiSelectAction: "forEach",
  9601. scrollIntoView: "cursor"
  9602. }, {
  9603. name: "outdent",
  9604. bindKey: bindKey("Shift-Tab", "Shift-Tab"),
  9605. exec: function(editor) { editor.blockOutdent(); },
  9606. multiSelectAction: "forEach",
  9607. scrollIntoView: "selectionPart"
  9608. }, {
  9609. name: "indent",
  9610. bindKey: bindKey("Tab", "Tab"),
  9611. exec: function(editor) { editor.indent(); },
  9612. multiSelectAction: "forEach",
  9613. scrollIntoView: "selectionPart"
  9614. }, {
  9615. name: "blockoutdent",
  9616. bindKey: bindKey("Ctrl-[", "Ctrl-["),
  9617. exec: function(editor) { editor.blockOutdent(); },
  9618. multiSelectAction: "forEachLine",
  9619. scrollIntoView: "selectionPart"
  9620. }, {
  9621. name: "blockindent",
  9622. bindKey: bindKey("Ctrl-]", "Ctrl-]"),
  9623. exec: function(editor) { editor.blockIndent(); },
  9624. multiSelectAction: "forEachLine",
  9625. scrollIntoView: "selectionPart"
  9626. }, {
  9627. name: "insertstring",
  9628. exec: function(editor, str) { editor.insert(str); },
  9629. multiSelectAction: "forEach",
  9630. scrollIntoView: "cursor"
  9631. }, {
  9632. name: "inserttext",
  9633. exec: function(editor, args) {
  9634. editor.insert(lang.stringRepeat(args.text || "", args.times || 1));
  9635. },
  9636. multiSelectAction: "forEach",
  9637. scrollIntoView: "cursor"
  9638. }, {
  9639. name: "splitline",
  9640. bindKey: bindKey(null, "Ctrl-O"),
  9641. exec: function(editor) { editor.splitLine(); },
  9642. multiSelectAction: "forEach",
  9643. scrollIntoView: "cursor"
  9644. }, {
  9645. name: "transposeletters",
  9646. bindKey: bindKey("Ctrl-T", "Ctrl-T"),
  9647. exec: function(editor) { editor.transposeLetters(); },
  9648. multiSelectAction: function(editor) {editor.transposeSelections(1); },
  9649. scrollIntoView: "cursor"
  9650. }, {
  9651. name: "touppercase",
  9652. bindKey: bindKey("Ctrl-U", "Ctrl-U"),
  9653. exec: function(editor) { editor.toUpperCase(); },
  9654. multiSelectAction: "forEach",
  9655. scrollIntoView: "cursor"
  9656. }, {
  9657. name: "tolowercase",
  9658. bindKey: bindKey("Ctrl-Shift-U", "Ctrl-Shift-U"),
  9659. exec: function(editor) { editor.toLowerCase(); },
  9660. multiSelectAction: "forEach",
  9661. scrollIntoView: "cursor"
  9662. }, {
  9663. name: "expandtoline",
  9664. bindKey: bindKey("Ctrl-Shift-L", "Command-Shift-L"),
  9665. exec: function(editor) {
  9666. var range = editor.selection.getRange();
  9667. range.start.column = range.end.column = 0;
  9668. range.end.row++;
  9669. editor.selection.setRange(range, false);
  9670. },
  9671. multiSelectAction: "forEach",
  9672. scrollIntoView: "cursor",
  9673. readOnly: true
  9674. }, {
  9675. name: "joinlines",
  9676. bindKey: bindKey(null, null),
  9677. exec: function(editor) {
  9678. var isBackwards = editor.selection.isBackwards();
  9679. var selectionStart = isBackwards ? editor.selection.getSelectionLead() : editor.selection.getSelectionAnchor();
  9680. var selectionEnd = isBackwards ? editor.selection.getSelectionAnchor() : editor.selection.getSelectionLead();
  9681. var firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length;
  9682. var selectedText = editor.session.doc.getTextRange(editor.selection.getRange());
  9683. var selectedCount = selectedText.replace(/\n\s*/, " ").length;
  9684. var insertLine = editor.session.doc.getLine(selectionStart.row);
  9685. for (var i = selectionStart.row + 1; i <= selectionEnd.row + 1; i++) {
  9686. var curLine = lang.stringTrimLeft(lang.stringTrimRight(editor.session.doc.getLine(i)));
  9687. if (curLine.length !== 0) {
  9688. curLine = " " + curLine;
  9689. }
  9690. insertLine += curLine;
  9691. }
  9692. if (selectionEnd.row + 1 < (editor.session.doc.getLength() - 1)) {
  9693. insertLine += editor.session.doc.getNewLineCharacter();
  9694. }
  9695. editor.clearSelection();
  9696. editor.session.doc.replace(new Range(selectionStart.row, 0, selectionEnd.row + 2, 0), insertLine);
  9697. if (selectedCount > 0) {
  9698. editor.selection.moveCursorTo(selectionStart.row, selectionStart.column);
  9699. editor.selection.selectTo(selectionStart.row, selectionStart.column + selectedCount);
  9700. } else {
  9701. firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length > firstLineEndCol ? (firstLineEndCol + 1) : firstLineEndCol;
  9702. editor.selection.moveCursorTo(selectionStart.row, firstLineEndCol);
  9703. }
  9704. },
  9705. multiSelectAction: "forEach",
  9706. readOnly: true
  9707. }, {
  9708. name: "invertSelection",
  9709. bindKey: bindKey(null, null),
  9710. exec: function(editor) {
  9711. var endRow = editor.session.doc.getLength() - 1;
  9712. var endCol = editor.session.doc.getLine(endRow).length;
  9713. var ranges = editor.selection.rangeList.ranges;
  9714. var newRanges = [];
  9715. if (ranges.length < 1) {
  9716. ranges = [editor.selection.getRange()];
  9717. }
  9718. for (var i = 0; i < ranges.length; i++) {
  9719. if (i == (ranges.length - 1)) {
  9720. if (!(ranges[i].end.row === endRow && ranges[i].end.column === endCol)) {
  9721. newRanges.push(new Range(ranges[i].end.row, ranges[i].end.column, endRow, endCol));
  9722. }
  9723. }
  9724. if (i === 0) {
  9725. if (!(ranges[i].start.row === 0 && ranges[i].start.column === 0)) {
  9726. newRanges.push(new Range(0, 0, ranges[i].start.row, ranges[i].start.column));
  9727. }
  9728. } else {
  9729. newRanges.push(new Range(ranges[i-1].end.row, ranges[i-1].end.column, ranges[i].start.row, ranges[i].start.column));
  9730. }
  9731. }
  9732. editor.exitMultiSelectMode();
  9733. editor.clearSelection();
  9734. for(var i = 0; i < newRanges.length; i++) {
  9735. editor.selection.addRange(newRanges[i], false);
  9736. }
  9737. },
  9738. readOnly: true,
  9739. scrollIntoView: "none"
  9740. }];
  9741. });
  9742. ace.define("ace/editor",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/keyboard/textinput","ace/mouse/mouse_handler","ace/mouse/fold_handler","ace/keyboard/keybinding","ace/edit_session","ace/search","ace/range","ace/lib/event_emitter","ace/commands/command_manager","ace/commands/default_commands","ace/config","ace/token_iterator"], function(require, exports, module) {
  9743. "use strict";
  9744. require("./lib/fixoldbrowsers");
  9745. var oop = require("./lib/oop");
  9746. var dom = require("./lib/dom");
  9747. var lang = require("./lib/lang");
  9748. var useragent = require("./lib/useragent");
  9749. var TextInput = require("./keyboard/textinput").TextInput;
  9750. var MouseHandler = require("./mouse/mouse_handler").MouseHandler;
  9751. var FoldHandler = require("./mouse/fold_handler").FoldHandler;
  9752. var KeyBinding = require("./keyboard/keybinding").KeyBinding;
  9753. var EditSession = require("./edit_session").EditSession;
  9754. var Search = require("./search").Search;
  9755. var Range = require("./range").Range;
  9756. var EventEmitter = require("./lib/event_emitter").EventEmitter;
  9757. var CommandManager = require("./commands/command_manager").CommandManager;
  9758. var defaultCommands = require("./commands/default_commands").commands;
  9759. var config = require("./config");
  9760. var TokenIterator = require("./token_iterator").TokenIterator;
  9761. var Editor = function(renderer, session) {
  9762. var container = renderer.getContainerElement();
  9763. this.container = container;
  9764. this.renderer = renderer;
  9765. this.commands = new CommandManager(useragent.isMac ? "mac" : "win", defaultCommands);
  9766. this.textInput = new TextInput(renderer.getTextAreaContainer(), this);
  9767. this.renderer.textarea = this.textInput.getElement();
  9768. this.keyBinding = new KeyBinding(this);
  9769. this.$mouseHandler = new MouseHandler(this);
  9770. new FoldHandler(this);
  9771. this.$blockScrolling = 0;
  9772. this.$search = new Search().set({
  9773. wrap: true
  9774. });
  9775. this.$historyTracker = this.$historyTracker.bind(this);
  9776. this.commands.on("exec", this.$historyTracker);
  9777. this.$initOperationListeners();
  9778. this._$emitInputEvent = lang.delayedCall(function() {
  9779. this._signal("input", {});
  9780. if (this.session && this.session.bgTokenizer)
  9781. this.session.bgTokenizer.scheduleStart();
  9782. }.bind(this));
  9783. this.on("change", function(_, _self) {
  9784. _self._$emitInputEvent.schedule(31);
  9785. });
  9786. this.setSession(session || new EditSession(""));
  9787. config.resetOptions(this);
  9788. config._signal("editor", this);
  9789. };
  9790. (function(){
  9791. oop.implement(this, EventEmitter);
  9792. this.$initOperationListeners = function() {
  9793. function last(a) {return a[a.length - 1]}
  9794. this.selections = [];
  9795. this.commands.on("exec", this.startOperation.bind(this), true);
  9796. this.commands.on("afterExec", this.endOperation.bind(this), true);
  9797. this.$opResetTimer = lang.delayedCall(this.endOperation.bind(this));
  9798. this.on("change", function() {
  9799. this.curOp || this.startOperation();
  9800. this.curOp.docChanged = true;
  9801. }.bind(this), true);
  9802. this.on("changeSelection", function() {
  9803. this.curOp || this.startOperation();
  9804. this.curOp.selectionChanged = true;
  9805. }.bind(this), true);
  9806. };
  9807. this.curOp = null;
  9808. this.prevOp = {};
  9809. this.startOperation = function(commadEvent) {
  9810. if (this.curOp) {
  9811. if (!commadEvent || this.curOp.command)
  9812. return;
  9813. this.prevOp = this.curOp;
  9814. }
  9815. if (!commadEvent) {
  9816. this.previousCommand = null;
  9817. commadEvent = {};
  9818. }
  9819. this.$opResetTimer.schedule();
  9820. this.curOp = {
  9821. command: commadEvent.command || {},
  9822. args: commadEvent.args,
  9823. scrollTop: this.renderer.scrollTop
  9824. };
  9825. if (this.curOp.command.name && this.curOp.command.scrollIntoView !== undefined)
  9826. this.$blockScrolling++;
  9827. };
  9828. this.endOperation = function(e) {
  9829. if (this.curOp) {
  9830. if (e && e.returnValue === false)
  9831. return this.curOp = null;
  9832. this._signal("beforeEndOperation");
  9833. var command = this.curOp.command;
  9834. if (command.name && this.$blockScrolling > 0)
  9835. this.$blockScrolling--;
  9836. if (command && command.scrollIntoView) {
  9837. switch (command.scrollIntoView) {
  9838. case "center":
  9839. this.renderer.scrollCursorIntoView(null, 0.5);
  9840. break;
  9841. case "animate":
  9842. case "cursor":
  9843. this.renderer.scrollCursorIntoView();
  9844. break;
  9845. case "selectionPart":
  9846. var range = this.selection.getRange();
  9847. var config = this.renderer.layerConfig;
  9848. if (range.start.row >= config.lastRow || range.end.row <= config.firstRow) {
  9849. this.renderer.scrollSelectionIntoView(this.selection.anchor, this.selection.lead);
  9850. }
  9851. break;
  9852. default:
  9853. break;
  9854. }
  9855. if (command.scrollIntoView == "animate")
  9856. this.renderer.animateScrolling(this.curOp.scrollTop);
  9857. }
  9858. this.prevOp = this.curOp;
  9859. this.curOp = null;
  9860. }
  9861. };
  9862. this.$mergeableCommands = ["backspace", "del", "insertstring"];
  9863. this.$historyTracker = function(e) {
  9864. if (!this.$mergeUndoDeltas)
  9865. return;
  9866. var prev = this.prevOp;
  9867. var mergeableCommands = this.$mergeableCommands;
  9868. var shouldMerge = prev.command && (e.command.name == prev.command.name);
  9869. if (e.command.name == "insertstring") {
  9870. var text = e.args;
  9871. if (this.mergeNextCommand === undefined)
  9872. this.mergeNextCommand = true;
  9873. shouldMerge = shouldMerge
  9874. && this.mergeNextCommand // previous command allows to coalesce with
  9875. && (!/\s/.test(text) || /\s/.test(prev.args)); // previous insertion was of same type
  9876. this.mergeNextCommand = true;
  9877. } else {
  9878. shouldMerge = shouldMerge
  9879. && mergeableCommands.indexOf(e.command.name) !== -1; // the command is mergeable
  9880. }
  9881. if (
  9882. this.$mergeUndoDeltas != "always"
  9883. && Date.now() - this.sequenceStartTime > 2000
  9884. ) {
  9885. shouldMerge = false; // the sequence is too long
  9886. }
  9887. if (shouldMerge)
  9888. this.session.mergeUndoDeltas = true;
  9889. else if (mergeableCommands.indexOf(e.command.name) !== -1)
  9890. this.sequenceStartTime = Date.now();
  9891. };
  9892. this.setKeyboardHandler = function(keyboardHandler, cb) {
  9893. if (keyboardHandler && typeof keyboardHandler === "string") {
  9894. this.$keybindingId = keyboardHandler;
  9895. var _self = this;
  9896. config.loadModule(["keybinding", keyboardHandler], function(module) {
  9897. if (_self.$keybindingId == keyboardHandler)
  9898. _self.keyBinding.setKeyboardHandler(module && module.handler);
  9899. cb && cb();
  9900. });
  9901. } else {
  9902. this.$keybindingId = null;
  9903. this.keyBinding.setKeyboardHandler(keyboardHandler);
  9904. cb && cb();
  9905. }
  9906. };
  9907. this.getKeyboardHandler = function() {
  9908. return this.keyBinding.getKeyboardHandler();
  9909. };
  9910. this.setSession = function(session) {
  9911. if (this.session == session)
  9912. return;
  9913. var oldSession = this.session;
  9914. if (oldSession) {
  9915. this.session.removeEventListener("change", this.$onDocumentChange);
  9916. this.session.removeEventListener("changeMode", this.$onChangeMode);
  9917. this.session.removeEventListener("tokenizerUpdate", this.$onTokenizerUpdate);
  9918. this.session.removeEventListener("changeTabSize", this.$onChangeTabSize);
  9919. this.session.removeEventListener("changeWrapLimit", this.$onChangeWrapLimit);
  9920. this.session.removeEventListener("changeWrapMode", this.$onChangeWrapMode);
  9921. this.session.removeEventListener("onChangeFold", this.$onChangeFold);
  9922. this.session.removeEventListener("changeFrontMarker", this.$onChangeFrontMarker);
  9923. this.session.removeEventListener("changeBackMarker", this.$onChangeBackMarker);
  9924. this.session.removeEventListener("changeBreakpoint", this.$onChangeBreakpoint);
  9925. this.session.removeEventListener("changeAnnotation", this.$onChangeAnnotation);
  9926. this.session.removeEventListener("changeOverwrite", this.$onCursorChange);
  9927. this.session.removeEventListener("changeScrollTop", this.$onScrollTopChange);
  9928. this.session.removeEventListener("changeScrollLeft", this.$onScrollLeftChange);
  9929. var selection = this.session.getSelection();
  9930. selection.removeEventListener("changeCursor", this.$onCursorChange);
  9931. selection.removeEventListener("changeSelection", this.$onSelectionChange);
  9932. }
  9933. this.session = session;
  9934. if (session) {
  9935. this.$onDocumentChange = this.onDocumentChange.bind(this);
  9936. session.addEventListener("change", this.$onDocumentChange);
  9937. this.renderer.setSession(session);
  9938. this.$onChangeMode = this.onChangeMode.bind(this);
  9939. session.addEventListener("changeMode", this.$onChangeMode);
  9940. this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this);
  9941. session.addEventListener("tokenizerUpdate", this.$onTokenizerUpdate);
  9942. this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer);
  9943. session.addEventListener("changeTabSize", this.$onChangeTabSize);
  9944. this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this);
  9945. session.addEventListener("changeWrapLimit", this.$onChangeWrapLimit);
  9946. this.$onChangeWrapMode = this.onChangeWrapMode.bind(this);
  9947. session.addEventListener("changeWrapMode", this.$onChangeWrapMode);
  9948. this.$onChangeFold = this.onChangeFold.bind(this);
  9949. session.addEventListener("changeFold", this.$onChangeFold);
  9950. this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this);
  9951. this.session.addEventListener("changeFrontMarker", this.$onChangeFrontMarker);
  9952. this.$onChangeBackMarker = this.onChangeBackMarker.bind(this);
  9953. this.session.addEventListener("changeBackMarker", this.$onChangeBackMarker);
  9954. this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this);
  9955. this.session.addEventListener("changeBreakpoint", this.$onChangeBreakpoint);
  9956. this.$onChangeAnnotation = this.onChangeAnnotation.bind(this);
  9957. this.session.addEventListener("changeAnnotation", this.$onChangeAnnotation);
  9958. this.$onCursorChange = this.onCursorChange.bind(this);
  9959. this.session.addEventListener("changeOverwrite", this.$onCursorChange);
  9960. this.$onScrollTopChange = this.onScrollTopChange.bind(this);
  9961. this.session.addEventListener("changeScrollTop", this.$onScrollTopChange);
  9962. this.$onScrollLeftChange = this.onScrollLeftChange.bind(this);
  9963. this.session.addEventListener("changeScrollLeft", this.$onScrollLeftChange);
  9964. this.selection = session.getSelection();
  9965. this.selection.addEventListener("changeCursor", this.$onCursorChange);
  9966. this.$onSelectionChange = this.onSelectionChange.bind(this);
  9967. this.selection.addEventListener("changeSelection", this.$onSelectionChange);
  9968. this.onChangeMode();
  9969. this.$blockScrolling += 1;
  9970. this.onCursorChange();
  9971. this.$blockScrolling -= 1;
  9972. this.onScrollTopChange();
  9973. this.onScrollLeftChange();
  9974. this.onSelectionChange();
  9975. this.onChangeFrontMarker();
  9976. this.onChangeBackMarker();
  9977. this.onChangeBreakpoint();
  9978. this.onChangeAnnotation();
  9979. this.session.getUseWrapMode() && this.renderer.adjustWrapLimit();
  9980. this.renderer.updateFull();
  9981. } else {
  9982. this.selection = null;
  9983. this.renderer.setSession(session);
  9984. }
  9985. this._signal("changeSession", {
  9986. session: session,
  9987. oldSession: oldSession
  9988. });
  9989. oldSession && oldSession._signal("changeEditor", {oldEditor: this});
  9990. session && session._signal("changeEditor", {editor: this});
  9991. };
  9992. this.getSession = function() {
  9993. return this.session;
  9994. };
  9995. this.setValue = function(val, cursorPos) {
  9996. this.session.doc.setValue(val);
  9997. if (!cursorPos)
  9998. this.selectAll();
  9999. else if (cursorPos == 1)
  10000. this.navigateFileEnd();
  10001. else if (cursorPos == -1)
  10002. this.navigateFileStart();
  10003. return val;
  10004. };
  10005. this.getValue = function() {
  10006. return this.session.getValue();
  10007. };
  10008. this.getSelection = function() {
  10009. return this.selection;
  10010. };
  10011. this.resize = function(force) {
  10012. this.renderer.onResize(force);
  10013. };
  10014. this.setTheme = function(theme, cb) {
  10015. this.renderer.setTheme(theme, cb);
  10016. };
  10017. this.getTheme = function() {
  10018. return this.renderer.getTheme();
  10019. };
  10020. this.setStyle = function(style) {
  10021. this.renderer.setStyle(style);
  10022. };
  10023. this.unsetStyle = function(style) {
  10024. this.renderer.unsetStyle(style);
  10025. };
  10026. this.getFontSize = function () {
  10027. return this.getOption("fontSize") ||
  10028. dom.computedStyle(this.container, "fontSize");
  10029. };
  10030. this.setFontSize = function(size) {
  10031. this.setOption("fontSize", size);
  10032. };
  10033. this.$highlightBrackets = function() {
  10034. if (this.session.$bracketHighlight) {
  10035. this.session.removeMarker(this.session.$bracketHighlight);
  10036. this.session.$bracketHighlight = null;
  10037. }
  10038. if (this.$highlightPending) {
  10039. return;
  10040. }
  10041. var self = this;
  10042. this.$highlightPending = true;
  10043. setTimeout(function() {
  10044. self.$highlightPending = false;
  10045. var session = self.session;
  10046. if (!session || !session.bgTokenizer) return;
  10047. var pos = session.findMatchingBracket(self.getCursorPosition());
  10048. if (pos) {
  10049. var range = new Range(pos.row, pos.column, pos.row, pos.column + 1);
  10050. } else if (session.$mode.getMatching) {
  10051. var range = session.$mode.getMatching(self.session);
  10052. }
  10053. if (range)
  10054. session.$bracketHighlight = session.addMarker(range, "ace_bracket", "text");
  10055. }, 50);
  10056. };
  10057. this.$highlightTags = function() {
  10058. if (this.$highlightTagPending)
  10059. return;
  10060. var self = this;
  10061. this.$highlightTagPending = true;
  10062. setTimeout(function() {
  10063. self.$highlightTagPending = false;
  10064. var session = self.session;
  10065. if (!session || !session.bgTokenizer) return;
  10066. var pos = self.getCursorPosition();
  10067. var iterator = new TokenIterator(self.session, pos.row, pos.column);
  10068. var token = iterator.getCurrentToken();
  10069. if (!token || !/\b(?:tag-open|tag-name)/.test(token.type)) {
  10070. session.removeMarker(session.$tagHighlight);
  10071. session.$tagHighlight = null;
  10072. return;
  10073. }
  10074. if (token.type.indexOf("tag-open") != -1) {
  10075. token = iterator.stepForward();
  10076. if (!token)
  10077. return;
  10078. }
  10079. var tag = token.value;
  10080. var depth = 0;
  10081. var prevToken = iterator.stepBackward();
  10082. if (prevToken.value == '<'){
  10083. do {
  10084. prevToken = token;
  10085. token = iterator.stepForward();
  10086. if (token && token.value === tag && token.type.indexOf('tag-name') !== -1) {
  10087. if (prevToken.value === '<'){
  10088. depth++;
  10089. } else if (prevToken.value === '</'){
  10090. depth--;
  10091. }
  10092. }
  10093. } while (token && depth >= 0);
  10094. } else {
  10095. do {
  10096. token = prevToken;
  10097. prevToken = iterator.stepBackward();
  10098. if (token && token.value === tag && token.type.indexOf('tag-name') !== -1) {
  10099. if (prevToken.value === '<') {
  10100. depth++;
  10101. } else if (prevToken.value === '</') {
  10102. depth--;
  10103. }
  10104. }
  10105. } while (prevToken && depth <= 0);
  10106. iterator.stepForward();
  10107. }
  10108. if (!token) {
  10109. session.removeMarker(session.$tagHighlight);
  10110. session.$tagHighlight = null;
  10111. return;
  10112. }
  10113. var row = iterator.getCurrentTokenRow();
  10114. var column = iterator.getCurrentTokenColumn();
  10115. var range = new Range(row, column, row, column+token.value.length);
  10116. if (session.$tagHighlight && range.compareRange(session.$backMarkers[session.$tagHighlight].range)!==0) {
  10117. session.removeMarker(session.$tagHighlight);
  10118. session.$tagHighlight = null;
  10119. }
  10120. if (range && !session.$tagHighlight)
  10121. session.$tagHighlight = session.addMarker(range, "ace_bracket", "text");
  10122. }, 50);
  10123. };
  10124. this.focus = function() {
  10125. var _self = this;
  10126. setTimeout(function() {
  10127. _self.textInput.focus();
  10128. });
  10129. this.textInput.focus();
  10130. };
  10131. this.isFocused = function() {
  10132. return this.textInput.isFocused();
  10133. };
  10134. this.blur = function() {
  10135. this.textInput.blur();
  10136. };
  10137. this.onFocus = function(e) {
  10138. if (this.$isFocused)
  10139. return;
  10140. this.$isFocused = true;
  10141. this.renderer.showCursor();
  10142. this.renderer.visualizeFocus();
  10143. this._emit("focus", e);
  10144. };
  10145. this.onBlur = function(e) {
  10146. if (!this.$isFocused)
  10147. return;
  10148. this.$isFocused = false;
  10149. this.renderer.hideCursor();
  10150. this.renderer.visualizeBlur();
  10151. this._emit("blur", e);
  10152. };
  10153. this.$cursorChange = function() {
  10154. this.renderer.updateCursor();
  10155. };
  10156. this.onDocumentChange = function(e) {
  10157. var delta = e.data;
  10158. var range = delta.range;
  10159. var lastRow;
  10160. if (range.start.row == range.end.row && delta.action != "insertLines" && delta.action != "removeLines")
  10161. lastRow = range.end.row;
  10162. else
  10163. lastRow = Infinity;
  10164. this.renderer.updateLines(range.start.row, lastRow, this.session.$useWrapMode);
  10165. this._signal("change", e);
  10166. this.$cursorChange();
  10167. this.$updateHighlightActiveLine();
  10168. };
  10169. this.onTokenizerUpdate = function(e) {
  10170. var rows = e.data;
  10171. this.renderer.updateLines(rows.first, rows.last);
  10172. };
  10173. this.onScrollTopChange = function() {
  10174. this.renderer.scrollToY(this.session.getScrollTop());
  10175. };
  10176. this.onScrollLeftChange = function() {
  10177. this.renderer.scrollToX(this.session.getScrollLeft());
  10178. };
  10179. this.onCursorChange = function() {
  10180. this.$cursorChange();
  10181. if (!this.$blockScrolling) {
  10182. config.warn("Automatically scrolling cursor into view after selection change",
  10183. "this will be disabled in the next version",
  10184. "set editor.$blockScrolling = Infinity to disable this message"
  10185. );
  10186. this.renderer.scrollCursorIntoView();
  10187. }
  10188. this.$highlightBrackets();
  10189. this.$highlightTags();
  10190. this.$updateHighlightActiveLine();
  10191. this._signal("changeSelection");
  10192. };
  10193. this.$updateHighlightActiveLine = function() {
  10194. var session = this.getSession();
  10195. var highlight;
  10196. if (this.$highlightActiveLine) {
  10197. if ((this.$selectionStyle != "line" || !this.selection.isMultiLine()))
  10198. highlight = this.getCursorPosition();
  10199. if (this.renderer.$maxLines && this.session.getLength() === 1 && !(this.renderer.$minLines > 1))
  10200. highlight = false;
  10201. }
  10202. if (session.$highlightLineMarker && !highlight) {
  10203. session.removeMarker(session.$highlightLineMarker.id);
  10204. session.$highlightLineMarker = null;
  10205. } else if (!session.$highlightLineMarker && highlight) {
  10206. var range = new Range(highlight.row, highlight.column, highlight.row, Infinity);
  10207. range.id = session.addMarker(range, "ace_active-line", "screenLine");
  10208. session.$highlightLineMarker = range;
  10209. } else if (highlight) {
  10210. session.$highlightLineMarker.start.row = highlight.row;
  10211. session.$highlightLineMarker.end.row = highlight.row;
  10212. session.$highlightLineMarker.start.column = highlight.column;
  10213. session._signal("changeBackMarker");
  10214. }
  10215. };
  10216. this.onSelectionChange = function(e) {
  10217. var session = this.session;
  10218. if (session.$selectionMarker) {
  10219. session.removeMarker(session.$selectionMarker);
  10220. }
  10221. session.$selectionMarker = null;
  10222. if (!this.selection.isEmpty()) {
  10223. var range = this.selection.getRange();
  10224. var style = this.getSelectionStyle();
  10225. session.$selectionMarker = session.addMarker(range, "ace_selection", style);
  10226. } else {
  10227. this.$updateHighlightActiveLine();
  10228. }
  10229. var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp();
  10230. this.session.highlight(re);
  10231. this._signal("changeSelection");
  10232. };
  10233. this.$getSelectionHighLightRegexp = function() {
  10234. var session = this.session;
  10235. var selection = this.getSelectionRange();
  10236. if (selection.isEmpty() || selection.isMultiLine())
  10237. return;
  10238. var startOuter = selection.start.column - 1;
  10239. var endOuter = selection.end.column + 1;
  10240. var line = session.getLine(selection.start.row);
  10241. var lineCols = line.length;
  10242. var needle = line.substring(Math.max(startOuter, 0),
  10243. Math.min(endOuter, lineCols));
  10244. if ((startOuter >= 0 && /^[\w\d]/.test(needle)) ||
  10245. (endOuter <= lineCols && /[\w\d]$/.test(needle)))
  10246. return;
  10247. needle = line.substring(selection.start.column, selection.end.column);
  10248. if (!/^[\w\d]+$/.test(needle))
  10249. return;
  10250. var re = this.$search.$assembleRegExp({
  10251. wholeWord: true,
  10252. caseSensitive: true,
  10253. needle: needle
  10254. });
  10255. return re;
  10256. };
  10257. this.onChangeFrontMarker = function() {
  10258. this.renderer.updateFrontMarkers();
  10259. };
  10260. this.onChangeBackMarker = function() {
  10261. this.renderer.updateBackMarkers();
  10262. };
  10263. this.onChangeBreakpoint = function() {
  10264. this.renderer.updateBreakpoints();
  10265. };
  10266. this.onChangeAnnotation = function() {
  10267. this.renderer.setAnnotations(this.session.getAnnotations());
  10268. };
  10269. this.onChangeMode = function(e) {
  10270. this.renderer.updateText();
  10271. this._emit("changeMode", e);
  10272. };
  10273. this.onChangeWrapLimit = function() {
  10274. this.renderer.updateFull();
  10275. };
  10276. this.onChangeWrapMode = function() {
  10277. this.renderer.onResize(true);
  10278. };
  10279. this.onChangeFold = function() {
  10280. this.$updateHighlightActiveLine();
  10281. this.renderer.updateFull();
  10282. };
  10283. this.getSelectedText = function() {
  10284. return this.session.getTextRange(this.getSelectionRange());
  10285. };
  10286. this.getCopyText = function() {
  10287. var text = this.getSelectedText();
  10288. this._signal("copy", text);
  10289. return text;
  10290. };
  10291. this.onCopy = function() {
  10292. this.commands.exec("copy", this);
  10293. };
  10294. this.onCut = function() {
  10295. this.commands.exec("cut", this);
  10296. };
  10297. this.onPaste = function(text) {
  10298. if (this.$readOnly)
  10299. return;
  10300. var e = {text: text};
  10301. this._signal("paste", e);
  10302. text = e.text;
  10303. if (!this.inMultiSelectMode || this.inVirtualSelectionMode) {
  10304. this.insert(text);
  10305. } else {
  10306. var lines = text.split(/\r\n|\r|\n/);
  10307. var ranges = this.selection.rangeList.ranges;
  10308. if (lines.length > ranges.length || lines.length < 2 || !lines[1])
  10309. return this.commands.exec("insertstring", this, text);
  10310. for (var i = ranges.length; i--;) {
  10311. var range = ranges[i];
  10312. if (!range.isEmpty())
  10313. this.session.remove(range);
  10314. this.session.insert(range.start, lines[i]);
  10315. }
  10316. }
  10317. this.renderer.scrollCursorIntoView();
  10318. };
  10319. this.execCommand = function(command, args) {
  10320. return this.commands.exec(command, this, args);
  10321. };
  10322. this.insert = function(text, pasted) {
  10323. var session = this.session;
  10324. var mode = session.getMode();
  10325. var cursor = this.getCursorPosition();
  10326. if (this.getBehavioursEnabled() && !pasted) {
  10327. var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text);
  10328. if (transform) {
  10329. if (text !== transform.text) {
  10330. this.session.mergeUndoDeltas = false;
  10331. this.$mergeNextCommand = false;
  10332. }
  10333. text = transform.text;
  10334. }
  10335. }
  10336. if (text == "\t")
  10337. text = this.session.getTabString();
  10338. if (!this.selection.isEmpty()) {
  10339. var range = this.getSelectionRange();
  10340. cursor = this.session.remove(range);
  10341. this.clearSelection();
  10342. }
  10343. else if (this.session.getOverwrite()) {
  10344. var range = new Range.fromPoints(cursor, cursor);
  10345. range.end.column += text.length;
  10346. this.session.remove(range);
  10347. }
  10348. if (text == "\n" || text == "\r\n") {
  10349. var line = session.getLine(cursor.row);
  10350. if (cursor.column > line.search(/\S|$/)) {
  10351. var d = line.substr(cursor.column).search(/\S|$/);
  10352. session.doc.removeInLine(cursor.row, cursor.column, cursor.column + d);
  10353. }
  10354. }
  10355. this.clearSelection();
  10356. var start = cursor.column;
  10357. var lineState = session.getState(cursor.row);
  10358. var line = session.getLine(cursor.row);
  10359. var shouldOutdent = mode.checkOutdent(lineState, line, text);
  10360. var end = session.insert(cursor, text);
  10361. if (transform && transform.selection) {
  10362. if (transform.selection.length == 2) { // Transform relative to the current column
  10363. this.selection.setSelectionRange(
  10364. new Range(cursor.row, start + transform.selection[0],
  10365. cursor.row, start + transform.selection[1]));
  10366. } else { // Transform relative to the current row.
  10367. this.selection.setSelectionRange(
  10368. new Range(cursor.row + transform.selection[0],
  10369. transform.selection[1],
  10370. cursor.row + transform.selection[2],
  10371. transform.selection[3]));
  10372. }
  10373. }
  10374. if (session.getDocument().isNewLine(text)) {
  10375. var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString());
  10376. session.insert({row: cursor.row+1, column: 0}, lineIndent);
  10377. }
  10378. if (shouldOutdent)
  10379. mode.autoOutdent(lineState, session, cursor.row);
  10380. };
  10381. this.onTextInput = function(text) {
  10382. this.keyBinding.onTextInput(text);
  10383. };
  10384. this.onCommandKey = function(e, hashId, keyCode) {
  10385. this.keyBinding.onCommandKey(e, hashId, keyCode);
  10386. };
  10387. this.setOverwrite = function(overwrite) {
  10388. this.session.setOverwrite(overwrite);
  10389. };
  10390. this.getOverwrite = function() {
  10391. return this.session.getOverwrite();
  10392. };
  10393. this.toggleOverwrite = function() {
  10394. this.session.toggleOverwrite();
  10395. };
  10396. this.setScrollSpeed = function(speed) {
  10397. this.setOption("scrollSpeed", speed);
  10398. };
  10399. this.getScrollSpeed = function() {
  10400. return this.getOption("scrollSpeed");
  10401. };
  10402. this.setDragDelay = function(dragDelay) {
  10403. this.setOption("dragDelay", dragDelay);
  10404. };
  10405. this.getDragDelay = function() {
  10406. return this.getOption("dragDelay");
  10407. };
  10408. this.setSelectionStyle = function(val) {
  10409. this.setOption("selectionStyle", val);
  10410. };
  10411. this.getSelectionStyle = function() {
  10412. return this.getOption("selectionStyle");
  10413. };
  10414. this.setHighlightActiveLine = function(shouldHighlight) {
  10415. this.setOption("highlightActiveLine", shouldHighlight);
  10416. };
  10417. this.getHighlightActiveLine = function() {
  10418. return this.getOption("highlightActiveLine");
  10419. };
  10420. this.setHighlightGutterLine = function(shouldHighlight) {
  10421. this.setOption("highlightGutterLine", shouldHighlight);
  10422. };
  10423. this.getHighlightGutterLine = function() {
  10424. return this.getOption("highlightGutterLine");
  10425. };
  10426. this.setHighlightSelectedWord = function(shouldHighlight) {
  10427. this.setOption("highlightSelectedWord", shouldHighlight);
  10428. };
  10429. this.getHighlightSelectedWord = function() {
  10430. return this.$highlightSelectedWord;
  10431. };
  10432. this.setAnimatedScroll = function(shouldAnimate){
  10433. this.renderer.setAnimatedScroll(shouldAnimate);
  10434. };
  10435. this.getAnimatedScroll = function(){
  10436. return this.renderer.getAnimatedScroll();
  10437. };
  10438. this.setShowInvisibles = function(showInvisibles) {
  10439. this.renderer.setShowInvisibles(showInvisibles);
  10440. };
  10441. this.getShowInvisibles = function() {
  10442. return this.renderer.getShowInvisibles();
  10443. };
  10444. this.setDisplayIndentGuides = function(display) {
  10445. this.renderer.setDisplayIndentGuides(display);
  10446. };
  10447. this.getDisplayIndentGuides = function() {
  10448. return this.renderer.getDisplayIndentGuides();
  10449. };
  10450. this.setShowPrintMargin = function(showPrintMargin) {
  10451. this.renderer.setShowPrintMargin(showPrintMargin);
  10452. };
  10453. this.getShowPrintMargin = function() {
  10454. return this.renderer.getShowPrintMargin();
  10455. };
  10456. this.setPrintMarginColumn = function(showPrintMargin) {
  10457. this.renderer.setPrintMarginColumn(showPrintMargin);
  10458. };
  10459. this.getPrintMarginColumn = function() {
  10460. return this.renderer.getPrintMarginColumn();
  10461. };
  10462. this.setReadOnly = function(readOnly) {
  10463. this.setOption("readOnly", readOnly);
  10464. };
  10465. this.getReadOnly = function() {
  10466. return this.getOption("readOnly");
  10467. };
  10468. this.setBehavioursEnabled = function (enabled) {
  10469. this.setOption("behavioursEnabled", enabled);
  10470. };
  10471. this.getBehavioursEnabled = function () {
  10472. return this.getOption("behavioursEnabled");
  10473. };
  10474. this.setWrapBehavioursEnabled = function (enabled) {
  10475. this.setOption("wrapBehavioursEnabled", enabled);
  10476. };
  10477. this.getWrapBehavioursEnabled = function () {
  10478. return this.getOption("wrapBehavioursEnabled");
  10479. };
  10480. this.setShowFoldWidgets = function(show) {
  10481. this.setOption("showFoldWidgets", show);
  10482. };
  10483. this.getShowFoldWidgets = function() {
  10484. return this.getOption("showFoldWidgets");
  10485. };
  10486. this.setFadeFoldWidgets = function(fade) {
  10487. this.setOption("fadeFoldWidgets", fade);
  10488. };
  10489. this.getFadeFoldWidgets = function() {
  10490. return this.getOption("fadeFoldWidgets");
  10491. };
  10492. this.remove = function(dir) {
  10493. if (this.selection.isEmpty()){
  10494. if (dir == "left")
  10495. this.selection.selectLeft();
  10496. else
  10497. this.selection.selectRight();
  10498. }
  10499. var range = this.getSelectionRange();
  10500. if (this.getBehavioursEnabled()) {
  10501. var session = this.session;
  10502. var state = session.getState(range.start.row);
  10503. var new_range = session.getMode().transformAction(state, 'deletion', this, session, range);
  10504. if (range.end.column === 0) {
  10505. var text = session.getTextRange(range);
  10506. if (text[text.length - 1] == "\n") {
  10507. var line = session.getLine(range.end.row);
  10508. if (/^\s+$/.test(line)) {
  10509. range.end.column = line.length;
  10510. }
  10511. }
  10512. }
  10513. if (new_range)
  10514. range = new_range;
  10515. }
  10516. this.session.remove(range);
  10517. this.clearSelection();
  10518. };
  10519. this.removeWordRight = function() {
  10520. if (this.selection.isEmpty())
  10521. this.selection.selectWordRight();
  10522. this.session.remove(this.getSelectionRange());
  10523. this.clearSelection();
  10524. };
  10525. this.removeWordLeft = function() {
  10526. if (this.selection.isEmpty())
  10527. this.selection.selectWordLeft();
  10528. this.session.remove(this.getSelectionRange());
  10529. this.clearSelection();
  10530. };
  10531. this.removeToLineStart = function() {
  10532. if (this.selection.isEmpty())
  10533. this.selection.selectLineStart();
  10534. this.session.remove(this.getSelectionRange());
  10535. this.clearSelection();
  10536. };
  10537. this.removeToLineEnd = function() {
  10538. if (this.selection.isEmpty())
  10539. this.selection.selectLineEnd();
  10540. var range = this.getSelectionRange();
  10541. if (range.start.column == range.end.column && range.start.row == range.end.row) {
  10542. range.end.column = 0;
  10543. range.end.row++;
  10544. }
  10545. this.session.remove(range);
  10546. this.clearSelection();
  10547. };
  10548. this.splitLine = function() {
  10549. if (!this.selection.isEmpty()) {
  10550. this.session.remove(this.getSelectionRange());
  10551. this.clearSelection();
  10552. }
  10553. var cursor = this.getCursorPosition();
  10554. this.insert("\n");
  10555. this.moveCursorToPosition(cursor);
  10556. };
  10557. this.transposeLetters = function() {
  10558. if (!this.selection.isEmpty()) {
  10559. return;
  10560. }
  10561. var cursor = this.getCursorPosition();
  10562. var column = cursor.column;
  10563. if (column === 0)
  10564. return;
  10565. var line = this.session.getLine(cursor.row);
  10566. var swap, range;
  10567. if (column < line.length) {
  10568. swap = line.charAt(column) + line.charAt(column-1);
  10569. range = new Range(cursor.row, column-1, cursor.row, column+1);
  10570. }
  10571. else {
  10572. swap = line.charAt(column-1) + line.charAt(column-2);
  10573. range = new Range(cursor.row, column-2, cursor.row, column);
  10574. }
  10575. this.session.replace(range, swap);
  10576. };
  10577. this.toLowerCase = function() {
  10578. var originalRange = this.getSelectionRange();
  10579. if (this.selection.isEmpty()) {
  10580. this.selection.selectWord();
  10581. }
  10582. var range = this.getSelectionRange();
  10583. var text = this.session.getTextRange(range);
  10584. this.session.replace(range, text.toLowerCase());
  10585. this.selection.setSelectionRange(originalRange);
  10586. };
  10587. this.toUpperCase = function() {
  10588. var originalRange = this.getSelectionRange();
  10589. if (this.selection.isEmpty()) {
  10590. this.selection.selectWord();
  10591. }
  10592. var range = this.getSelectionRange();
  10593. var text = this.session.getTextRange(range);
  10594. this.session.replace(range, text.toUpperCase());
  10595. this.selection.setSelectionRange(originalRange);
  10596. };
  10597. this.indent = function() {
  10598. var session = this.session;
  10599. var range = this.getSelectionRange();
  10600. if (range.start.row < range.end.row) {
  10601. var rows = this.$getSelectedRows();
  10602. session.indentRows(rows.first, rows.last, "\t");
  10603. return;
  10604. } else if (range.start.column < range.end.column) {
  10605. var text = session.getTextRange(range);
  10606. if (!/^\s+$/.test(text)) {
  10607. var rows = this.$getSelectedRows();
  10608. session.indentRows(rows.first, rows.last, "\t");
  10609. return;
  10610. }
  10611. }
  10612. var line = session.getLine(range.start.row);
  10613. var position = range.start;
  10614. var size = session.getTabSize();
  10615. var column = session.documentToScreenColumn(position.row, position.column);
  10616. if (this.session.getUseSoftTabs()) {
  10617. var count = (size - column % size);
  10618. var indentString = lang.stringRepeat(" ", count);
  10619. } else {
  10620. var count = column % size;
  10621. while (line[range.start.column] == " " && count) {
  10622. range.start.column--;
  10623. count--;
  10624. }
  10625. this.selection.setSelectionRange(range);
  10626. indentString = "\t";
  10627. }
  10628. return this.insert(indentString);
  10629. };
  10630. this.blockIndent = function() {
  10631. var rows = this.$getSelectedRows();
  10632. this.session.indentRows(rows.first, rows.last, "\t");
  10633. };
  10634. this.blockOutdent = function() {
  10635. var selection = this.session.getSelection();
  10636. this.session.outdentRows(selection.getRange());
  10637. };
  10638. this.sortLines = function() {
  10639. var rows = this.$getSelectedRows();
  10640. var session = this.session;
  10641. var lines = [];
  10642. for (i = rows.first; i <= rows.last; i++)
  10643. lines.push(session.getLine(i));
  10644. lines.sort(function(a, b) {
  10645. if (a.toLowerCase() < b.toLowerCase()) return -1;
  10646. if (a.toLowerCase() > b.toLowerCase()) return 1;
  10647. return 0;
  10648. });
  10649. var deleteRange = new Range(0, 0, 0, 0);
  10650. for (var i = rows.first; i <= rows.last; i++) {
  10651. var line = session.getLine(i);
  10652. deleteRange.start.row = i;
  10653. deleteRange.end.row = i;
  10654. deleteRange.end.column = line.length;
  10655. session.replace(deleteRange, lines[i-rows.first]);
  10656. }
  10657. };
  10658. this.toggleCommentLines = function() {
  10659. var state = this.session.getState(this.getCursorPosition().row);
  10660. var rows = this.$getSelectedRows();
  10661. this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last);
  10662. };
  10663. this.toggleBlockComment = function() {
  10664. var cursor = this.getCursorPosition();
  10665. var state = this.session.getState(cursor.row);
  10666. var range = this.getSelectionRange();
  10667. this.session.getMode().toggleBlockComment(state, this.session, range, cursor);
  10668. };
  10669. this.getNumberAt = function(row, column) {
  10670. var _numberRx = /[\-]?[0-9]+(?:\.[0-9]+)?/g;
  10671. _numberRx.lastIndex = 0;
  10672. var s = this.session.getLine(row);
  10673. while (_numberRx.lastIndex < column) {
  10674. var m = _numberRx.exec(s);
  10675. if(m.index <= column && m.index+m[0].length >= column){
  10676. var number = {
  10677. value: m[0],
  10678. start: m.index,
  10679. end: m.index+m[0].length
  10680. };
  10681. return number;
  10682. }
  10683. }
  10684. return null;
  10685. };
  10686. this.modifyNumber = function(amount) {
  10687. var row = this.selection.getCursor().row;
  10688. var column = this.selection.getCursor().column;
  10689. var charRange = new Range(row, column-1, row, column);
  10690. var c = this.session.getTextRange(charRange);
  10691. if (!isNaN(parseFloat(c)) && isFinite(c)) {
  10692. var nr = this.getNumberAt(row, column);
  10693. if (nr) {
  10694. var fp = nr.value.indexOf(".") >= 0 ? nr.start + nr.value.indexOf(".") + 1 : nr.end;
  10695. var decimals = nr.start + nr.value.length - fp;
  10696. var t = parseFloat(nr.value);
  10697. t *= Math.pow(10, decimals);
  10698. if(fp !== nr.end && column < fp){
  10699. amount *= Math.pow(10, nr.end - column - 1);
  10700. } else {
  10701. amount *= Math.pow(10, nr.end - column);
  10702. }
  10703. t += amount;
  10704. t /= Math.pow(10, decimals);
  10705. var nnr = t.toFixed(decimals);
  10706. var replaceRange = new Range(row, nr.start, row, nr.end);
  10707. this.session.replace(replaceRange, nnr);
  10708. this.moveCursorTo(row, Math.max(nr.start +1, column + nnr.length - nr.value.length));
  10709. }
  10710. }
  10711. };
  10712. this.removeLines = function() {
  10713. var rows = this.$getSelectedRows();
  10714. var range;
  10715. if (rows.first === 0 || rows.last+1 < this.session.getLength())
  10716. range = new Range(rows.first, 0, rows.last+1, 0);
  10717. else
  10718. range = new Range(
  10719. rows.first-1, this.session.getLine(rows.first-1).length,
  10720. rows.last, this.session.getLine(rows.last).length
  10721. );
  10722. this.session.remove(range);
  10723. this.clearSelection();
  10724. };
  10725. this.duplicateSelection = function() {
  10726. var sel = this.selection;
  10727. var doc = this.session;
  10728. var range = sel.getRange();
  10729. var reverse = sel.isBackwards();
  10730. if (range.isEmpty()) {
  10731. var row = range.start.row;
  10732. doc.duplicateLines(row, row);
  10733. } else {
  10734. var point = reverse ? range.start : range.end;
  10735. var endPoint = doc.insert(point, doc.getTextRange(range), false);
  10736. range.start = point;
  10737. range.end = endPoint;
  10738. sel.setSelectionRange(range, reverse);
  10739. }
  10740. };
  10741. this.moveLinesDown = function() {
  10742. this.$moveLines(1, false);
  10743. };
  10744. this.moveLinesUp = function() {
  10745. this.$moveLines(-1, false);
  10746. };
  10747. this.moveText = function(range, toPosition, copy) {
  10748. return this.session.moveText(range, toPosition, copy);
  10749. };
  10750. this.copyLinesUp = function() {
  10751. this.$moveLines(-1, true);
  10752. };
  10753. this.copyLinesDown = function() {
  10754. this.$moveLines(1, true);
  10755. };
  10756. this.$moveLines = function(dir, copy) {
  10757. var rows, moved;
  10758. var selection = this.selection;
  10759. if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) {
  10760. var range = selection.toOrientedRange();
  10761. rows = this.$getSelectedRows(range);
  10762. moved = this.session.$moveLines(rows.first, rows.last, copy ? 0 : dir);
  10763. if (copy && dir == -1) moved = 0;
  10764. range.moveBy(moved, 0);
  10765. selection.fromOrientedRange(range);
  10766. } else {
  10767. var ranges = selection.rangeList.ranges;
  10768. selection.rangeList.detach(this.session);
  10769. this.inVirtualSelectionMode = true;
  10770. var diff = 0;
  10771. var totalDiff = 0;
  10772. var l = ranges.length;
  10773. for (var i = 0; i < l; i++) {
  10774. var rangeIndex = i;
  10775. ranges[i].moveBy(diff, 0);
  10776. rows = this.$getSelectedRows(ranges[i]);
  10777. var first = rows.first;
  10778. var last = rows.last;
  10779. while (++i < l) {
  10780. if (totalDiff) ranges[i].moveBy(totalDiff, 0);
  10781. var subRows = this.$getSelectedRows(ranges[i]);
  10782. if (copy && subRows.first != last)
  10783. break;
  10784. else if (!copy && subRows.first > last + 1)
  10785. break;
  10786. last = subRows.last;
  10787. }
  10788. i--;
  10789. diff = this.session.$moveLines(first, last, copy ? 0 : dir);
  10790. if (copy && dir == -1) rangeIndex = i + 1;
  10791. while (rangeIndex <= i) {
  10792. ranges[rangeIndex].moveBy(diff, 0);
  10793. rangeIndex++;
  10794. }
  10795. if (!copy) diff = 0;
  10796. totalDiff += diff;
  10797. }
  10798. selection.fromOrientedRange(selection.ranges[0]);
  10799. selection.rangeList.attach(this.session);
  10800. this.inVirtualSelectionMode = false;
  10801. }
  10802. };
  10803. this.$getSelectedRows = function(range) {
  10804. range = (range || this.getSelectionRange()).collapseRows();
  10805. return {
  10806. first: this.session.getRowFoldStart(range.start.row),
  10807. last: this.session.getRowFoldEnd(range.end.row)
  10808. };
  10809. };
  10810. this.onCompositionStart = function(text) {
  10811. this.renderer.showComposition(this.getCursorPosition());
  10812. };
  10813. this.onCompositionUpdate = function(text) {
  10814. this.renderer.setCompositionText(text);
  10815. };
  10816. this.onCompositionEnd = function() {
  10817. this.renderer.hideComposition();
  10818. };
  10819. this.getFirstVisibleRow = function() {
  10820. return this.renderer.getFirstVisibleRow();
  10821. };
  10822. this.getLastVisibleRow = function() {
  10823. return this.renderer.getLastVisibleRow();
  10824. };
  10825. this.isRowVisible = function(row) {
  10826. return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow());
  10827. };
  10828. this.isRowFullyVisible = function(row) {
  10829. return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow());
  10830. };
  10831. this.$getVisibleRowCount = function() {
  10832. return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1;
  10833. };
  10834. this.$moveByPage = function(dir, select) {
  10835. var renderer = this.renderer;
  10836. var config = this.renderer.layerConfig;
  10837. var rows = dir * Math.floor(config.height / config.lineHeight);
  10838. this.$blockScrolling++;
  10839. if (select === true) {
  10840. this.selection.$moveSelection(function(){
  10841. this.moveCursorBy(rows, 0);
  10842. });
  10843. } else if (select === false) {
  10844. this.selection.moveCursorBy(rows, 0);
  10845. this.selection.clearSelection();
  10846. }
  10847. this.$blockScrolling--;
  10848. var scrollTop = renderer.scrollTop;
  10849. renderer.scrollBy(0, rows * config.lineHeight);
  10850. if (select != null)
  10851. renderer.scrollCursorIntoView(null, 0.5);
  10852. renderer.animateScrolling(scrollTop);
  10853. };
  10854. this.selectPageDown = function() {
  10855. this.$moveByPage(1, true);
  10856. };
  10857. this.selectPageUp = function() {
  10858. this.$moveByPage(-1, true);
  10859. };
  10860. this.gotoPageDown = function() {
  10861. this.$moveByPage(1, false);
  10862. };
  10863. this.gotoPageUp = function() {
  10864. this.$moveByPage(-1, false);
  10865. };
  10866. this.scrollPageDown = function() {
  10867. this.$moveByPage(1);
  10868. };
  10869. this.scrollPageUp = function() {
  10870. this.$moveByPage(-1);
  10871. };
  10872. this.scrollToRow = function(row) {
  10873. this.renderer.scrollToRow(row);
  10874. };
  10875. this.scrollToLine = function(line, center, animate, callback) {
  10876. this.renderer.scrollToLine(line, center, animate, callback);
  10877. };
  10878. this.centerSelection = function() {
  10879. var range = this.getSelectionRange();
  10880. var pos = {
  10881. row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2),
  10882. column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2)
  10883. };
  10884. this.renderer.alignCursor(pos, 0.5);
  10885. };
  10886. this.getCursorPosition = function() {
  10887. return this.selection.getCursor();
  10888. };
  10889. this.getCursorPositionScreen = function() {
  10890. return this.session.documentToScreenPosition(this.getCursorPosition());
  10891. };
  10892. this.getSelectionRange = function() {
  10893. return this.selection.getRange();
  10894. };
  10895. this.selectAll = function() {
  10896. this.$blockScrolling += 1;
  10897. this.selection.selectAll();
  10898. this.$blockScrolling -= 1;
  10899. };
  10900. this.clearSelection = function() {
  10901. this.selection.clearSelection();
  10902. };
  10903. this.moveCursorTo = function(row, column) {
  10904. this.selection.moveCursorTo(row, column);
  10905. };
  10906. this.moveCursorToPosition = function(pos) {
  10907. this.selection.moveCursorToPosition(pos);
  10908. };
  10909. this.jumpToMatching = function(select, expand) {
  10910. var cursor = this.getCursorPosition();
  10911. var iterator = new TokenIterator(this.session, cursor.row, cursor.column);
  10912. var prevToken = iterator.getCurrentToken();
  10913. var token = prevToken || iterator.stepForward();
  10914. if (!token) return;
  10915. var matchType;
  10916. var found = false;
  10917. var depth = {};
  10918. var i = cursor.column - token.start;
  10919. var bracketType;
  10920. var brackets = {
  10921. ")": "(",
  10922. "(": "(",
  10923. "]": "[",
  10924. "[": "[",
  10925. "{": "{",
  10926. "}": "{"
  10927. };
  10928. do {
  10929. if (token.value.match(/[{}()\[\]]/g)) {
  10930. for (; i < token.value.length && !found; i++) {
  10931. if (!brackets[token.value[i]]) {
  10932. continue;
  10933. }
  10934. bracketType = brackets[token.value[i]] + '.' + token.type.replace("rparen", "lparen");
  10935. if (isNaN(depth[bracketType])) {
  10936. depth[bracketType] = 0;
  10937. }
  10938. switch (token.value[i]) {
  10939. case '(':
  10940. case '[':
  10941. case '{':
  10942. depth[bracketType]++;
  10943. break;
  10944. case ')':
  10945. case ']':
  10946. case '}':
  10947. depth[bracketType]--;
  10948. if (depth[bracketType] === -1) {
  10949. matchType = 'bracket';
  10950. found = true;
  10951. }
  10952. break;
  10953. }
  10954. }
  10955. }
  10956. else if (token && token.type.indexOf('tag-name') !== -1) {
  10957. if (isNaN(depth[token.value])) {
  10958. depth[token.value] = 0;
  10959. }
  10960. if (prevToken.value === '<') {
  10961. depth[token.value]++;
  10962. }
  10963. else if (prevToken.value === '</') {
  10964. depth[token.value]--;
  10965. }
  10966. if (depth[token.value] === -1) {
  10967. matchType = 'tag';
  10968. found = true;
  10969. }
  10970. }
  10971. if (!found) {
  10972. prevToken = token;
  10973. token = iterator.stepForward();
  10974. i = 0;
  10975. }
  10976. } while (token && !found);
  10977. if (!matchType)
  10978. return;
  10979. var range, pos;
  10980. if (matchType === 'bracket') {
  10981. range = this.session.getBracketRange(cursor);
  10982. if (!range) {
  10983. range = new Range(
  10984. iterator.getCurrentTokenRow(),
  10985. iterator.getCurrentTokenColumn() + i - 1,
  10986. iterator.getCurrentTokenRow(),
  10987. iterator.getCurrentTokenColumn() + i - 1
  10988. );
  10989. pos = range.start;
  10990. if (expand || pos.row === cursor.row && Math.abs(pos.column - cursor.column) < 2)
  10991. range = this.session.getBracketRange(pos);
  10992. }
  10993. }
  10994. else if (matchType === 'tag') {
  10995. if (token && token.type.indexOf('tag-name') !== -1)
  10996. var tag = token.value;
  10997. else
  10998. return;
  10999. range = new Range(
  11000. iterator.getCurrentTokenRow(),
  11001. iterator.getCurrentTokenColumn() - 2,
  11002. iterator.getCurrentTokenRow(),
  11003. iterator.getCurrentTokenColumn() - 2
  11004. );
  11005. if (range.compare(cursor.row, cursor.column) === 0) {
  11006. found = false;
  11007. do {
  11008. token = prevToken;
  11009. prevToken = iterator.stepBackward();
  11010. if (prevToken) {
  11011. if (prevToken.type.indexOf('tag-close') !== -1) {
  11012. range.setEnd(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1);
  11013. }
  11014. if (token.value === tag && token.type.indexOf('tag-name') !== -1) {
  11015. if (prevToken.value === '<') {
  11016. depth[tag]++;
  11017. }
  11018. else if (prevToken.value === '</') {
  11019. depth[tag]--;
  11020. }
  11021. if (depth[tag] === 0)
  11022. found = true;
  11023. }
  11024. }
  11025. } while (prevToken && !found);
  11026. }
  11027. if (token && token.type.indexOf('tag-name')) {
  11028. pos = range.start;
  11029. if (pos.row == cursor.row && Math.abs(pos.column - cursor.column) < 2)
  11030. pos = range.end;
  11031. }
  11032. }
  11033. pos = range && range.cursor || pos;
  11034. if (pos) {
  11035. if (select) {
  11036. if (range && expand) {
  11037. this.selection.setRange(range);
  11038. } else if (range && range.isEqual(this.getSelectionRange())) {
  11039. this.clearSelection();
  11040. } else {
  11041. this.selection.selectTo(pos.row, pos.column);
  11042. }
  11043. } else {
  11044. this.selection.moveTo(pos.row, pos.column);
  11045. }
  11046. }
  11047. };
  11048. this.gotoLine = function(lineNumber, column, animate) {
  11049. this.selection.clearSelection();
  11050. this.session.unfold({row: lineNumber - 1, column: column || 0});
  11051. this.$blockScrolling += 1;
  11052. this.exitMultiSelectMode && this.exitMultiSelectMode();
  11053. this.moveCursorTo(lineNumber - 1, column || 0);
  11054. this.$blockScrolling -= 1;
  11055. if (!this.isRowFullyVisible(lineNumber - 1))
  11056. this.scrollToLine(lineNumber - 1, true, animate);
  11057. };
  11058. this.navigateTo = function(row, column) {
  11059. this.selection.moveTo(row, column);
  11060. };
  11061. this.navigateUp = function(times) {
  11062. if (this.selection.isMultiLine() && !this.selection.isBackwards()) {
  11063. var selectionStart = this.selection.anchor.getPosition();
  11064. return this.moveCursorToPosition(selectionStart);
  11065. }
  11066. this.selection.clearSelection();
  11067. this.selection.moveCursorBy(-times || -1, 0);
  11068. };
  11069. this.navigateDown = function(times) {
  11070. if (this.selection.isMultiLine() && this.selection.isBackwards()) {
  11071. var selectionEnd = this.selection.anchor.getPosition();
  11072. return this.moveCursorToPosition(selectionEnd);
  11073. }
  11074. this.selection.clearSelection();
  11075. this.selection.moveCursorBy(times || 1, 0);
  11076. };
  11077. this.navigateLeft = function(times) {
  11078. if (!this.selection.isEmpty()) {
  11079. var selectionStart = this.getSelectionRange().start;
  11080. this.moveCursorToPosition(selectionStart);
  11081. }
  11082. else {
  11083. times = times || 1;
  11084. while (times--) {
  11085. this.selection.moveCursorLeft();
  11086. }
  11087. }
  11088. this.clearSelection();
  11089. };
  11090. this.navigateRight = function(times) {
  11091. if (!this.selection.isEmpty()) {
  11092. var selectionEnd = this.getSelectionRange().end;
  11093. this.moveCursorToPosition(selectionEnd);
  11094. }
  11095. else {
  11096. times = times || 1;
  11097. while (times--) {
  11098. this.selection.moveCursorRight();
  11099. }
  11100. }
  11101. this.clearSelection();
  11102. };
  11103. this.navigateLineStart = function() {
  11104. this.selection.moveCursorLineStart();
  11105. this.clearSelection();
  11106. };
  11107. this.navigateLineEnd = function() {
  11108. this.selection.moveCursorLineEnd();
  11109. this.clearSelection();
  11110. };
  11111. this.navigateFileEnd = function() {
  11112. this.selection.moveCursorFileEnd();
  11113. this.clearSelection();
  11114. };
  11115. this.navigateFileStart = function() {
  11116. this.selection.moveCursorFileStart();
  11117. this.clearSelection();
  11118. };
  11119. this.navigateWordRight = function() {
  11120. this.selection.moveCursorWordRight();
  11121. this.clearSelection();
  11122. };
  11123. this.navigateWordLeft = function() {
  11124. this.selection.moveCursorWordLeft();
  11125. this.clearSelection();
  11126. };
  11127. this.replace = function(replacement, options) {
  11128. if (options)
  11129. this.$search.set(options);
  11130. var range = this.$search.find(this.session);
  11131. var replaced = 0;
  11132. if (!range)
  11133. return replaced;
  11134. if (this.$tryReplace(range, replacement)) {
  11135. replaced = 1;
  11136. }
  11137. if (range !== null) {
  11138. this.selection.setSelectionRange(range);
  11139. this.renderer.scrollSelectionIntoView(range.start, range.end);
  11140. }
  11141. return replaced;
  11142. };
  11143. this.replaceAll = function(replacement, options) {
  11144. if (options) {
  11145. this.$search.set(options);
  11146. }
  11147. var ranges = this.$search.findAll(this.session);
  11148. var replaced = 0;
  11149. if (!ranges.length)
  11150. return replaced;
  11151. this.$blockScrolling += 1;
  11152. var selection = this.getSelectionRange();
  11153. this.selection.moveTo(0, 0);
  11154. for (var i = ranges.length - 1; i >= 0; --i) {
  11155. if(this.$tryReplace(ranges[i], replacement)) {
  11156. replaced++;
  11157. }
  11158. }
  11159. this.selection.setSelectionRange(selection);
  11160. this.$blockScrolling -= 1;
  11161. return replaced;
  11162. };
  11163. this.$tryReplace = function(range, replacement) {
  11164. var input = this.session.getTextRange(range);
  11165. replacement = this.$search.replace(input, replacement);
  11166. if (replacement !== null) {
  11167. range.end = this.session.replace(range, replacement);
  11168. return range;
  11169. } else {
  11170. return null;
  11171. }
  11172. };
  11173. this.getLastSearchOptions = function() {
  11174. return this.$search.getOptions();
  11175. };
  11176. this.find = function(needle, options, animate) {
  11177. if (!options)
  11178. options = {};
  11179. if (typeof needle == "string" || needle instanceof RegExp)
  11180. options.needle = needle;
  11181. else if (typeof needle == "object")
  11182. oop.mixin(options, needle);
  11183. var range = this.selection.getRange();
  11184. if (options.needle == null) {
  11185. needle = this.session.getTextRange(range)
  11186. || this.$search.$options.needle;
  11187. if (!needle) {
  11188. range = this.session.getWordRange(range.start.row, range.start.column);
  11189. needle = this.session.getTextRange(range);
  11190. }
  11191. this.$search.set({needle: needle});
  11192. }
  11193. this.$search.set(options);
  11194. if (!options.start)
  11195. this.$search.set({start: range});
  11196. var newRange = this.$search.find(this.session);
  11197. if (options.preventScroll)
  11198. return newRange;
  11199. if (newRange) {
  11200. this.revealRange(newRange, animate);
  11201. return newRange;
  11202. }
  11203. if (options.backwards)
  11204. range.start = range.end;
  11205. else
  11206. range.end = range.start;
  11207. this.selection.setRange(range);
  11208. };
  11209. this.findNext = function(options, animate) {
  11210. this.find({skipCurrent: true, backwards: false}, options, animate);
  11211. };
  11212. this.findPrevious = function(options, animate) {
  11213. this.find(options, {skipCurrent: true, backwards: true}, animate);
  11214. };
  11215. this.revealRange = function(range, animate) {
  11216. this.$blockScrolling += 1;
  11217. this.session.unfold(range);
  11218. this.selection.setSelectionRange(range);
  11219. this.$blockScrolling -= 1;
  11220. var scrollTop = this.renderer.scrollTop;
  11221. this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5);
  11222. if (animate !== false)
  11223. this.renderer.animateScrolling(scrollTop);
  11224. };
  11225. this.undo = function() {
  11226. this.$blockScrolling++;
  11227. this.session.getUndoManager().undo();
  11228. this.$blockScrolling--;
  11229. this.renderer.scrollCursorIntoView(null, 0.5);
  11230. };
  11231. this.redo = function() {
  11232. this.$blockScrolling++;
  11233. this.session.getUndoManager().redo();
  11234. this.$blockScrolling--;
  11235. this.renderer.scrollCursorIntoView(null, 0.5);
  11236. };
  11237. this.destroy = function() {
  11238. this.renderer.destroy();
  11239. this._signal("destroy", this);
  11240. if (this.session) {
  11241. this.session.destroy();
  11242. }
  11243. };
  11244. this.setAutoScrollEditorIntoView = function(enable) {
  11245. if (!enable)
  11246. return;
  11247. var rect;
  11248. var self = this;
  11249. var shouldScroll = false;
  11250. if (!this.$scrollAnchor)
  11251. this.$scrollAnchor = document.createElement("div");
  11252. var scrollAnchor = this.$scrollAnchor;
  11253. scrollAnchor.style.cssText = "position:absolute";
  11254. this.container.insertBefore(scrollAnchor, this.container.firstChild);
  11255. var onChangeSelection = this.on("changeSelection", function() {
  11256. shouldScroll = true;
  11257. });
  11258. var onBeforeRender = this.renderer.on("beforeRender", function() {
  11259. if (shouldScroll)
  11260. rect = self.renderer.container.getBoundingClientRect();
  11261. });
  11262. var onAfterRender = this.renderer.on("afterRender", function() {
  11263. if (shouldScroll && rect && (self.isFocused()
  11264. || self.searchBox && self.searchBox.isFocused())
  11265. ) {
  11266. var renderer = self.renderer;
  11267. var pos = renderer.$cursorLayer.$pixelPos;
  11268. var config = renderer.layerConfig;
  11269. var top = pos.top - config.offset;
  11270. if (pos.top >= 0 && top + rect.top < 0) {
  11271. shouldScroll = true;
  11272. } else if (pos.top < config.height &&
  11273. pos.top + rect.top + config.lineHeight > window.innerHeight) {
  11274. shouldScroll = false;
  11275. } else {
  11276. shouldScroll = null;
  11277. }
  11278. if (shouldScroll != null) {
  11279. scrollAnchor.style.top = top + "px";
  11280. scrollAnchor.style.left = pos.left + "px";
  11281. scrollAnchor.style.height = config.lineHeight + "px";
  11282. scrollAnchor.scrollIntoView(shouldScroll);
  11283. }
  11284. shouldScroll = rect = null;
  11285. }
  11286. });
  11287. this.setAutoScrollEditorIntoView = function(enable) {
  11288. if (enable)
  11289. return;
  11290. delete this.setAutoScrollEditorIntoView;
  11291. this.removeEventListener("changeSelection", onChangeSelection);
  11292. this.renderer.removeEventListener("afterRender", onAfterRender);
  11293. this.renderer.removeEventListener("beforeRender", onBeforeRender);
  11294. };
  11295. };
  11296. this.$resetCursorStyle = function() {
  11297. var style = this.$cursorStyle || "ace";
  11298. var cursorLayer = this.renderer.$cursorLayer;
  11299. if (!cursorLayer)
  11300. return;
  11301. cursorLayer.setSmoothBlinking(/smooth/.test(style));
  11302. cursorLayer.isBlinking = !this.$readOnly && style != "wide";
  11303. dom.setCssClass(cursorLayer.element, "ace_slim-cursors", /slim/.test(style));
  11304. };
  11305. }).call(Editor.prototype);
  11306. config.defineOptions(Editor.prototype, "editor", {
  11307. selectionStyle: {
  11308. set: function(style) {
  11309. this.onSelectionChange();
  11310. this._signal("changeSelectionStyle", {data: style});
  11311. },
  11312. initialValue: "line"
  11313. },
  11314. highlightActiveLine: {
  11315. set: function() {this.$updateHighlightActiveLine();},
  11316. initialValue: true
  11317. },
  11318. highlightSelectedWord: {
  11319. set: function(shouldHighlight) {this.$onSelectionChange();},
  11320. initialValue: true
  11321. },
  11322. readOnly: {
  11323. set: function(readOnly) {
  11324. this.$resetCursorStyle();
  11325. },
  11326. initialValue: false
  11327. },
  11328. cursorStyle: {
  11329. set: function(val) { this.$resetCursorStyle(); },
  11330. values: ["ace", "slim", "smooth", "wide"],
  11331. initialValue: "ace"
  11332. },
  11333. mergeUndoDeltas: {
  11334. values: [false, true, "always"],
  11335. initialValue: true
  11336. },
  11337. behavioursEnabled: {initialValue: true},
  11338. wrapBehavioursEnabled: {initialValue: true},
  11339. autoScrollEditorIntoView: {
  11340. set: function(val) {this.setAutoScrollEditorIntoView(val)}
  11341. },
  11342. hScrollBarAlwaysVisible: "renderer",
  11343. vScrollBarAlwaysVisible: "renderer",
  11344. highlightGutterLine: "renderer",
  11345. animatedScroll: "renderer",
  11346. showInvisibles: "renderer",
  11347. showPrintMargin: "renderer",
  11348. printMarginColumn: "renderer",
  11349. printMargin: "renderer",
  11350. fadeFoldWidgets: "renderer",
  11351. showFoldWidgets: "renderer",
  11352. showLineNumbers: "renderer",
  11353. showGutter: "renderer",
  11354. displayIndentGuides: "renderer",
  11355. fontSize: "renderer",
  11356. fontFamily: "renderer",
  11357. maxLines: "renderer",
  11358. minLines: "renderer",
  11359. scrollPastEnd: "renderer",
  11360. fixedWidthGutter: "renderer",
  11361. theme: "renderer",
  11362. scrollSpeed: "$mouseHandler",
  11363. dragDelay: "$mouseHandler",
  11364. dragEnabled: "$mouseHandler",
  11365. focusTimout: "$mouseHandler",
  11366. tooltipFollowsMouse: "$mouseHandler",
  11367. firstLineNumber: "session",
  11368. overwrite: "session",
  11369. newLineMode: "session",
  11370. useWorker: "session",
  11371. useSoftTabs: "session",
  11372. tabSize: "session",
  11373. wrap: "session",
  11374. foldStyle: "session",
  11375. mode: "session"
  11376. });
  11377. exports.Editor = Editor;
  11378. });
  11379. ace.define("ace/undomanager",["require","exports","module"], function(require, exports, module) {
  11380. "use strict";
  11381. var UndoManager = function() {
  11382. this.reset();
  11383. };
  11384. (function() {
  11385. this.execute = function(options) {
  11386. var deltas = options.args[0];
  11387. this.$doc = options.args[1];
  11388. if (options.merge && this.hasUndo()){
  11389. this.dirtyCounter--;
  11390. deltas = this.$undoStack.pop().concat(deltas);
  11391. }
  11392. this.$undoStack.push(deltas);
  11393. this.$redoStack = [];
  11394. if (this.dirtyCounter < 0) {
  11395. this.dirtyCounter = NaN;
  11396. }
  11397. this.dirtyCounter++;
  11398. };
  11399. this.undo = function(dontSelect) {
  11400. var deltas = this.$undoStack.pop();
  11401. var undoSelectionRange = null;
  11402. if (deltas) {
  11403. undoSelectionRange =
  11404. this.$doc.undoChanges(deltas, dontSelect);
  11405. this.$redoStack.push(deltas);
  11406. this.dirtyCounter--;
  11407. }
  11408. return undoSelectionRange;
  11409. };
  11410. this.redo = function(dontSelect) {
  11411. var deltas = this.$redoStack.pop();
  11412. var redoSelectionRange = null;
  11413. if (deltas) {
  11414. redoSelectionRange =
  11415. this.$doc.redoChanges(deltas, dontSelect);
  11416. this.$undoStack.push(deltas);
  11417. this.dirtyCounter++;
  11418. }
  11419. return redoSelectionRange;
  11420. };
  11421. this.reset = function() {
  11422. this.$undoStack = [];
  11423. this.$redoStack = [];
  11424. this.dirtyCounter = 0;
  11425. };
  11426. this.hasUndo = function() {
  11427. return this.$undoStack.length > 0;
  11428. };
  11429. this.hasRedo = function() {
  11430. return this.$redoStack.length > 0;
  11431. };
  11432. this.markClean = function() {
  11433. this.dirtyCounter = 0;
  11434. };
  11435. this.isClean = function() {
  11436. return this.dirtyCounter === 0;
  11437. };
  11438. }).call(UndoManager.prototype);
  11439. exports.UndoManager = UndoManager;
  11440. });
  11441. ace.define("ace/layer/gutter",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter"], function(require, exports, module) {
  11442. "use strict";
  11443. var dom = require("../lib/dom");
  11444. var oop = require("../lib/oop");
  11445. var lang = require("../lib/lang");
  11446. var EventEmitter = require("../lib/event_emitter").EventEmitter;
  11447. var Gutter = function(parentEl) {
  11448. this.element = dom.createElement("div");
  11449. this.element.className = "ace_layer ace_gutter-layer";
  11450. parentEl.appendChild(this.element);
  11451. this.setShowFoldWidgets(this.$showFoldWidgets);
  11452. this.gutterWidth = 0;
  11453. this.$annotations = [];
  11454. this.$updateAnnotations = this.$updateAnnotations.bind(this);
  11455. this.$cells = [];
  11456. };
  11457. (function() {
  11458. oop.implement(this, EventEmitter);
  11459. this.setSession = function(session) {
  11460. if (this.session)
  11461. this.session.removeEventListener("change", this.$updateAnnotations);
  11462. this.session = session;
  11463. if (session)
  11464. session.on("change", this.$updateAnnotations);
  11465. };
  11466. this.addGutterDecoration = function(row, className){
  11467. if (window.console)
  11468. console.warn && console.warn("deprecated use session.addGutterDecoration");
  11469. this.session.addGutterDecoration(row, className);
  11470. };
  11471. this.removeGutterDecoration = function(row, className){
  11472. if (window.console)
  11473. console.warn && console.warn("deprecated use session.removeGutterDecoration");
  11474. this.session.removeGutterDecoration(row, className);
  11475. };
  11476. this.setAnnotations = function(annotations) {
  11477. this.$annotations = [];
  11478. for (var i = 0; i < annotations.length; i++) {
  11479. var annotation = annotations[i];
  11480. var row = annotation.row;
  11481. var rowInfo = this.$annotations[row];
  11482. if (!rowInfo)
  11483. rowInfo = this.$annotations[row] = {text: []};
  11484. var annoText = annotation.text;
  11485. annoText = annoText ? lang.escapeHTML(annoText) : annotation.html || "";
  11486. if (rowInfo.text.indexOf(annoText) === -1)
  11487. rowInfo.text.push(annoText);
  11488. var type = annotation.type;
  11489. if (type == "error")
  11490. rowInfo.className = " ace_error";
  11491. else if (type == "warning" && rowInfo.className != " ace_error")
  11492. rowInfo.className = " ace_warning";
  11493. else if (type == "info" && (!rowInfo.className))
  11494. rowInfo.className = " ace_info";
  11495. }
  11496. };
  11497. this.$updateAnnotations = function (e) {
  11498. if (!this.$annotations.length)
  11499. return;
  11500. var delta = e.data;
  11501. var range = delta.range;
  11502. var firstRow = range.start.row;
  11503. var len = range.end.row - firstRow;
  11504. if (len === 0) {
  11505. } else if (delta.action == "removeText" || delta.action == "removeLines") {
  11506. this.$annotations.splice(firstRow, len + 1, null);
  11507. } else {
  11508. var args = new Array(len + 1);
  11509. args.unshift(firstRow, 1);
  11510. this.$annotations.splice.apply(this.$annotations, args);
  11511. }
  11512. };
  11513. this.update = function(config) {
  11514. var session = this.session;
  11515. var firstRow = config.firstRow;
  11516. var lastRow = Math.min(config.lastRow + config.gutterOffset, // needed to compensate for hor scollbar
  11517. session.getLength() - 1);
  11518. var fold = session.getNextFoldLine(firstRow);
  11519. var foldStart = fold ? fold.start.row : Infinity;
  11520. var foldWidgets = this.$showFoldWidgets && session.foldWidgets;
  11521. var breakpoints = session.$breakpoints;
  11522. var decorations = session.$decorations;
  11523. var firstLineNumber = session.$firstLineNumber;
  11524. var lastLineNumber = 0;
  11525. var gutterRenderer = session.gutterRenderer || this.$renderer;
  11526. var cell = null;
  11527. var index = -1;
  11528. var row = firstRow;
  11529. while (true) {
  11530. if (row > foldStart) {
  11531. row = fold.end.row + 1;
  11532. fold = session.getNextFoldLine(row, fold);
  11533. foldStart = fold ? fold.start.row : Infinity;
  11534. }
  11535. if (row > lastRow) {
  11536. while (this.$cells.length > index + 1) {
  11537. cell = this.$cells.pop();
  11538. this.element.removeChild(cell.element);
  11539. }
  11540. break;
  11541. }
  11542. cell = this.$cells[++index];
  11543. if (!cell) {
  11544. cell = {element: null, textNode: null, foldWidget: null};
  11545. cell.element = dom.createElement("div");
  11546. cell.textNode = document.createTextNode('');
  11547. cell.element.appendChild(cell.textNode);
  11548. this.element.appendChild(cell.element);
  11549. this.$cells[index] = cell;
  11550. }
  11551. var className = "ace_gutter-cell ";
  11552. if (breakpoints[row])
  11553. className += breakpoints[row];
  11554. if (decorations[row])
  11555. className += decorations[row];
  11556. if (this.$annotations[row])
  11557. className += this.$annotations[row].className;
  11558. if (cell.element.className != className)
  11559. cell.element.className = className;
  11560. var height = session.getRowLength(row) * config.lineHeight + "px";
  11561. if (height != cell.element.style.height)
  11562. cell.element.style.height = height;
  11563. if (foldWidgets) {
  11564. var c = foldWidgets[row];
  11565. if (c == null)
  11566. c = foldWidgets[row] = session.getFoldWidget(row);
  11567. }
  11568. if (c) {
  11569. if (!cell.foldWidget) {
  11570. cell.foldWidget = dom.createElement("span");
  11571. cell.element.appendChild(cell.foldWidget);
  11572. }
  11573. var className = "ace_fold-widget ace_" + c;
  11574. if (c == "start" && row == foldStart && row < fold.end.row)
  11575. className += " ace_closed";
  11576. else
  11577. className += " ace_open";
  11578. if (cell.foldWidget.className != className)
  11579. cell.foldWidget.className = className;
  11580. var height = config.lineHeight + "px";
  11581. if (cell.foldWidget.style.height != height)
  11582. cell.foldWidget.style.height = height;
  11583. } else {
  11584. if (cell.foldWidget) {
  11585. cell.element.removeChild(cell.foldWidget);
  11586. cell.foldWidget = null;
  11587. }
  11588. }
  11589. var text = lastLineNumber = gutterRenderer
  11590. ? gutterRenderer.getText(session, row)
  11591. : row + firstLineNumber;
  11592. if (text != cell.textNode.data)
  11593. cell.textNode.data = text;
  11594. row++;
  11595. }
  11596. this.element.style.height = config.minHeight + "px";
  11597. if (this.$fixedWidth || session.$useWrapMode)
  11598. lastLineNumber = session.getLength() + firstLineNumber;
  11599. var gutterWidth = gutterRenderer
  11600. ? gutterRenderer.getWidth(session, lastLineNumber, config)
  11601. : lastLineNumber.toString().length * config.characterWidth;
  11602. var padding = this.$padding || this.$computePadding();
  11603. gutterWidth += padding.left + padding.right;
  11604. if (gutterWidth !== this.gutterWidth && !isNaN(gutterWidth)) {
  11605. this.gutterWidth = gutterWidth;
  11606. this.element.style.width = Math.ceil(this.gutterWidth) + "px";
  11607. this._emit("changeGutterWidth", gutterWidth);
  11608. }
  11609. };
  11610. this.$fixedWidth = false;
  11611. this.$showLineNumbers = true;
  11612. this.$renderer = "";
  11613. this.setShowLineNumbers = function(show) {
  11614. this.$renderer = !show && {
  11615. getWidth: function() {return ""},
  11616. getText: function() {return ""}
  11617. };
  11618. };
  11619. this.getShowLineNumbers = function() {
  11620. return this.$showLineNumbers;
  11621. };
  11622. this.$showFoldWidgets = true;
  11623. this.setShowFoldWidgets = function(show) {
  11624. if (show)
  11625. dom.addCssClass(this.element, "ace_folding-enabled");
  11626. else
  11627. dom.removeCssClass(this.element, "ace_folding-enabled");
  11628. this.$showFoldWidgets = show;
  11629. this.$padding = null;
  11630. };
  11631. this.getShowFoldWidgets = function() {
  11632. return this.$showFoldWidgets;
  11633. };
  11634. this.$computePadding = function() {
  11635. if (!this.element.firstChild)
  11636. return {left: 0, right: 0};
  11637. var style = dom.computedStyle(this.element.firstChild);
  11638. this.$padding = {};
  11639. this.$padding.left = parseInt(style.paddingLeft) + 1 || 0;
  11640. this.$padding.right = parseInt(style.paddingRight) || 0;
  11641. return this.$padding;
  11642. };
  11643. this.getRegion = function(point) {
  11644. var padding = this.$padding || this.$computePadding();
  11645. var rect = this.element.getBoundingClientRect();
  11646. if (point.x < padding.left + rect.left)
  11647. return "markers";
  11648. if (this.$showFoldWidgets && point.x > rect.right - padding.right)
  11649. return "foldWidgets";
  11650. };
  11651. }).call(Gutter.prototype);
  11652. exports.Gutter = Gutter;
  11653. });
  11654. ace.define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"], function(require, exports, module) {
  11655. "use strict";
  11656. var Range = require("../range").Range;
  11657. var dom = require("../lib/dom");
  11658. var Marker = function(parentEl) {
  11659. this.element = dom.createElement("div");
  11660. this.element.className = "ace_layer ace_marker-layer";
  11661. parentEl.appendChild(this.element);
  11662. };
  11663. (function() {
  11664. this.$padding = 0;
  11665. this.setPadding = function(padding) {
  11666. this.$padding = padding;
  11667. };
  11668. this.setSession = function(session) {
  11669. this.session = session;
  11670. };
  11671. this.setMarkers = function(markers) {
  11672. this.markers = markers;
  11673. };
  11674. this.update = function(config) {
  11675. var config = config || this.config;
  11676. if (!config)
  11677. return;
  11678. this.config = config;
  11679. var html = [];
  11680. for (var key in this.markers) {
  11681. var marker = this.markers[key];
  11682. if (!marker.range) {
  11683. marker.update(html, this, this.session, config);
  11684. continue;
  11685. }
  11686. var range = marker.range.clipRows(config.firstRow, config.lastRow);
  11687. if (range.isEmpty()) continue;
  11688. range = range.toScreenRange(this.session);
  11689. if (marker.renderer) {
  11690. var top = this.$getTop(range.start.row, config);
  11691. var left = this.$padding + range.start.column * config.characterWidth;
  11692. marker.renderer(html, range, left, top, config);
  11693. } else if (marker.type == "fullLine") {
  11694. this.drawFullLineMarker(html, range, marker.clazz, config);
  11695. } else if (marker.type == "screenLine") {
  11696. this.drawScreenLineMarker(html, range, marker.clazz, config);
  11697. } else if (range.isMultiLine()) {
  11698. if (marker.type == "text")
  11699. this.drawTextMarker(html, range, marker.clazz, config);
  11700. else
  11701. this.drawMultiLineMarker(html, range, marker.clazz, config);
  11702. } else {
  11703. this.drawSingleLineMarker(html, range, marker.clazz + " ace_start", config);
  11704. }
  11705. }
  11706. this.element.innerHTML = html.join("");
  11707. };
  11708. this.$getTop = function(row, layerConfig) {
  11709. return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight;
  11710. };
  11711. this.drawTextMarker = function(stringBuilder, range, clazz, layerConfig, extraStyle) {
  11712. var row = range.start.row;
  11713. var lineRange = new Range(
  11714. row, range.start.column,
  11715. row, this.session.getScreenLastRowColumn(row)
  11716. );
  11717. this.drawSingleLineMarker(stringBuilder, lineRange, clazz + " ace_start", layerConfig, 1, extraStyle);
  11718. row = range.end.row;
  11719. lineRange = new Range(row, 0, row, range.end.column);
  11720. this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig, 0, extraStyle);
  11721. for (row = range.start.row + 1; row < range.end.row; row++) {
  11722. lineRange.start.row = row;
  11723. lineRange.end.row = row;
  11724. lineRange.end.column = this.session.getScreenLastRowColumn(row);
  11725. this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig, 1, extraStyle);
  11726. }
  11727. };
  11728. this.drawMultiLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {
  11729. var padding = this.$padding;
  11730. var height = config.lineHeight;
  11731. var top = this.$getTop(range.start.row, config);
  11732. var left = padding + range.start.column * config.characterWidth;
  11733. extraStyle = extraStyle || "";
  11734. stringBuilder.push(
  11735. "<div class='", clazz, " ace_start' style='",
  11736. "height:", height, "px;",
  11737. "right:0;",
  11738. "top:", top, "px;",
  11739. "left:", left, "px;", extraStyle, "'></div>"
  11740. );
  11741. top = this.$getTop(range.end.row, config);
  11742. var width = range.end.column * config.characterWidth;
  11743. stringBuilder.push(
  11744. "<div class='", clazz, "' style='",
  11745. "height:", height, "px;",
  11746. "width:", width, "px;",
  11747. "top:", top, "px;",
  11748. "left:", padding, "px;", extraStyle, "'></div>"
  11749. );
  11750. height = (range.end.row - range.start.row - 1) * config.lineHeight;
  11751. if (height < 0)
  11752. return;
  11753. top = this.$getTop(range.start.row + 1, config);
  11754. stringBuilder.push(
  11755. "<div class='", clazz, "' style='",
  11756. "height:", height, "px;",
  11757. "right:0;",
  11758. "top:", top, "px;",
  11759. "left:", padding, "px;", extraStyle, "'></div>"
  11760. );
  11761. };
  11762. this.drawSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) {
  11763. var height = config.lineHeight;
  11764. var width = (range.end.column + (extraLength || 0) - range.start.column) * config.characterWidth;
  11765. var top = this.$getTop(range.start.row, config);
  11766. var left = this.$padding + range.start.column * config.characterWidth;
  11767. stringBuilder.push(
  11768. "<div class='", clazz, "' style='",
  11769. "height:", height, "px;",
  11770. "width:", width, "px;",
  11771. "top:", top, "px;",
  11772. "left:", left, "px;", extraStyle || "", "'></div>"
  11773. );
  11774. };
  11775. this.drawFullLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {
  11776. var top = this.$getTop(range.start.row, config);
  11777. var height = config.lineHeight;
  11778. if (range.start.row != range.end.row)
  11779. height += this.$getTop(range.end.row, config) - top;
  11780. stringBuilder.push(
  11781. "<div class='", clazz, "' style='",
  11782. "height:", height, "px;",
  11783. "top:", top, "px;",
  11784. "left:0;right:0;", extraStyle || "", "'></div>"
  11785. );
  11786. };
  11787. this.drawScreenLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {
  11788. var top = this.$getTop(range.start.row, config);
  11789. var height = config.lineHeight;
  11790. stringBuilder.push(
  11791. "<div class='", clazz, "' style='",
  11792. "height:", height, "px;",
  11793. "top:", top, "px;",
  11794. "left:0;right:0;", extraStyle || "", "'></div>"
  11795. );
  11796. };
  11797. }).call(Marker.prototype);
  11798. exports.Marker = Marker;
  11799. });
  11800. ace.define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"], function(require, exports, module) {
  11801. "use strict";
  11802. var oop = require("../lib/oop");
  11803. var dom = require("../lib/dom");
  11804. var lang = require("../lib/lang");
  11805. var useragent = require("../lib/useragent");
  11806. var EventEmitter = require("../lib/event_emitter").EventEmitter;
  11807. var Text = function(parentEl) {
  11808. this.element = dom.createElement("div");
  11809. this.element.className = "ace_layer ace_text-layer";
  11810. parentEl.appendChild(this.element);
  11811. this.$updateEolChar = this.$updateEolChar.bind(this);
  11812. };
  11813. (function() {
  11814. oop.implement(this, EventEmitter);
  11815. this.EOF_CHAR = "\xB6";
  11816. this.EOL_CHAR_LF = "\xAC";
  11817. this.EOL_CHAR_CRLF = "\xa4";
  11818. this.EOL_CHAR = this.EOL_CHAR_LF;
  11819. this.TAB_CHAR = "\u2192"; //"\u21E5";
  11820. this.SPACE_CHAR = "\xB7";
  11821. this.$padding = 0;
  11822. this.$updateEolChar = function() {
  11823. var EOL_CHAR = this.session.doc.getNewLineCharacter() == "\n"
  11824. ? this.EOL_CHAR_LF
  11825. : this.EOL_CHAR_CRLF;
  11826. if (this.EOL_CHAR != EOL_CHAR) {
  11827. this.EOL_CHAR = EOL_CHAR;
  11828. return true;
  11829. }
  11830. }
  11831. this.setPadding = function(padding) {
  11832. this.$padding = padding;
  11833. this.element.style.padding = "0 " + padding + "px";
  11834. };
  11835. this.getLineHeight = function() {
  11836. return this.$fontMetrics.$characterSize.height || 0;
  11837. };
  11838. this.getCharacterWidth = function() {
  11839. return this.$fontMetrics.$characterSize.width || 0;
  11840. };
  11841. this.$setFontMetrics = function(measure) {
  11842. this.$fontMetrics = measure;
  11843. this.$fontMetrics.on("changeCharacterSize", function(e) {
  11844. this._signal("changeCharacterSize", e);
  11845. }.bind(this));
  11846. this.$pollSizeChanges();
  11847. }
  11848. this.checkForSizeChanges = function() {
  11849. this.$fontMetrics.checkForSizeChanges();
  11850. };
  11851. this.$pollSizeChanges = function() {
  11852. return this.$pollSizeChangesTimer = this.$fontMetrics.$pollSizeChanges();
  11853. };
  11854. this.setSession = function(session) {
  11855. this.session = session;
  11856. if (session)
  11857. this.$computeTabString();
  11858. };
  11859. this.showInvisibles = false;
  11860. this.setShowInvisibles = function(showInvisibles) {
  11861. if (this.showInvisibles == showInvisibles)
  11862. return false;
  11863. this.showInvisibles = showInvisibles;
  11864. this.$computeTabString();
  11865. return true;
  11866. };
  11867. this.displayIndentGuides = true;
  11868. this.setDisplayIndentGuides = function(display) {
  11869. if (this.displayIndentGuides == display)
  11870. return false;
  11871. this.displayIndentGuides = display;
  11872. this.$computeTabString();
  11873. return true;
  11874. };
  11875. this.$tabStrings = [];
  11876. this.onChangeTabSize =
  11877. this.$computeTabString = function() {
  11878. var tabSize = this.session.getTabSize();
  11879. this.tabSize = tabSize;
  11880. var tabStr = this.$tabStrings = [0];
  11881. for (var i = 1; i < tabSize + 1; i++) {
  11882. if (this.showInvisibles) {
  11883. tabStr.push("<span class='ace_invisible ace_invisible_tab'>"
  11884. + this.TAB_CHAR
  11885. + lang.stringRepeat(" ", i - 1)
  11886. + "</span>");
  11887. } else {
  11888. tabStr.push(lang.stringRepeat(" ", i));
  11889. }
  11890. }
  11891. if (this.displayIndentGuides) {
  11892. this.$indentGuideRe = /\s\S| \t|\t |\s$/;
  11893. var className = "ace_indent-guide";
  11894. var spaceClass = "";
  11895. var tabClass = "";
  11896. if (this.showInvisibles) {
  11897. className += " ace_invisible";
  11898. spaceClass = " ace_invisible_space";
  11899. tabClass = " ace_invisible_tab";
  11900. var spaceContent = lang.stringRepeat(this.SPACE_CHAR, this.tabSize);
  11901. var tabContent = this.TAB_CHAR + lang.stringRepeat(" ", this.tabSize - 1);
  11902. } else{
  11903. var spaceContent = lang.stringRepeat(" ", this.tabSize);
  11904. var tabContent = spaceContent;
  11905. }
  11906. this.$tabStrings[" "] = "<span class='" + className + spaceClass + "'>" + spaceContent + "</span>";
  11907. this.$tabStrings["\t"] = "<span class='" + className + tabClass + "'>" + tabContent + "</span>";
  11908. }
  11909. };
  11910. this.updateLines = function(config, firstRow, lastRow) {
  11911. if (this.config.lastRow != config.lastRow ||
  11912. this.config.firstRow != config.firstRow) {
  11913. this.scrollLines(config);
  11914. }
  11915. this.config = config;
  11916. var first = Math.max(firstRow, config.firstRow);
  11917. var last = Math.min(lastRow, config.lastRow);
  11918. var lineElements = this.element.childNodes;
  11919. var lineElementsIdx = 0;
  11920. for (var row = config.firstRow; row < first; row++) {
  11921. var foldLine = this.session.getFoldLine(row);
  11922. if (foldLine) {
  11923. if (foldLine.containsRow(first)) {
  11924. first = foldLine.start.row;
  11925. break;
  11926. } else {
  11927. row = foldLine.end.row;
  11928. }
  11929. }
  11930. lineElementsIdx ++;
  11931. }
  11932. var row = first;
  11933. var foldLine = this.session.getNextFoldLine(row);
  11934. var foldStart = foldLine ? foldLine.start.row : Infinity;
  11935. while (true) {
  11936. if (row > foldStart) {
  11937. row = foldLine.end.row+1;
  11938. foldLine = this.session.getNextFoldLine(row, foldLine);
  11939. foldStart = foldLine ? foldLine.start.row :Infinity;
  11940. }
  11941. if (row > last)
  11942. break;
  11943. var lineElement = lineElements[lineElementsIdx++];
  11944. if (lineElement) {
  11945. var html = [];
  11946. this.$renderLine(
  11947. html, row, !this.$useLineGroups(), row == foldStart ? foldLine : false
  11948. );
  11949. lineElement.style.height = config.lineHeight * this.session.getRowLength(row) + "px";
  11950. lineElement.innerHTML = html.join("");
  11951. }
  11952. row++;
  11953. }
  11954. };
  11955. this.scrollLines = function(config) {
  11956. var oldConfig = this.config;
  11957. this.config = config;
  11958. if (!oldConfig || oldConfig.lastRow < config.firstRow)
  11959. return this.update(config);
  11960. if (config.lastRow < oldConfig.firstRow)
  11961. return this.update(config);
  11962. var el = this.element;
  11963. if (oldConfig.firstRow < config.firstRow)
  11964. for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--)
  11965. el.removeChild(el.firstChild);
  11966. if (oldConfig.lastRow > config.lastRow)
  11967. for (var row=this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row>0; row--)
  11968. el.removeChild(el.lastChild);
  11969. if (config.firstRow < oldConfig.firstRow) {
  11970. var fragment = this.$renderLinesFragment(config, config.firstRow, oldConfig.firstRow - 1);
  11971. if (el.firstChild)
  11972. el.insertBefore(fragment, el.firstChild);
  11973. else
  11974. el.appendChild(fragment);
  11975. }
  11976. if (config.lastRow > oldConfig.lastRow) {
  11977. var fragment = this.$renderLinesFragment(config, oldConfig.lastRow + 1, config.lastRow);
  11978. el.appendChild(fragment);
  11979. }
  11980. };
  11981. this.$renderLinesFragment = function(config, firstRow, lastRow) {
  11982. var fragment = this.element.ownerDocument.createDocumentFragment();
  11983. var row = firstRow;
  11984. var foldLine = this.session.getNextFoldLine(row);
  11985. var foldStart = foldLine ? foldLine.start.row : Infinity;
  11986. while (true) {
  11987. if (row > foldStart) {
  11988. row = foldLine.end.row+1;
  11989. foldLine = this.session.getNextFoldLine(row, foldLine);
  11990. foldStart = foldLine ? foldLine.start.row : Infinity;
  11991. }
  11992. if (row > lastRow)
  11993. break;
  11994. var container = dom.createElement("div");
  11995. var html = [];
  11996. this.$renderLine(html, row, false, row == foldStart ? foldLine : false);
  11997. container.innerHTML = html.join("");
  11998. if (this.$useLineGroups()) {
  11999. container.className = 'ace_line_group';
  12000. fragment.appendChild(container);
  12001. container.style.height = config.lineHeight * this.session.getRowLength(row) + "px";
  12002. } else {
  12003. while(container.firstChild)
  12004. fragment.appendChild(container.firstChild);
  12005. }
  12006. row++;
  12007. }
  12008. return fragment;
  12009. };
  12010. this.update = function(config) {
  12011. this.config = config;
  12012. var html = [];
  12013. var firstRow = config.firstRow, lastRow = config.lastRow;
  12014. var row = firstRow;
  12015. var foldLine = this.session.getNextFoldLine(row);
  12016. var foldStart = foldLine ? foldLine.start.row : Infinity;
  12017. while (true) {
  12018. if (row > foldStart) {
  12019. row = foldLine.end.row+1;
  12020. foldLine = this.session.getNextFoldLine(row, foldLine);
  12021. foldStart = foldLine ? foldLine.start.row :Infinity;
  12022. }
  12023. if (row > lastRow)
  12024. break;
  12025. if (this.$useLineGroups())
  12026. html.push("<div class='ace_line_group' style='height:", config.lineHeight*this.session.getRowLength(row), "px'>")
  12027. this.$renderLine(html, row, false, row == foldStart ? foldLine : false);
  12028. if (this.$useLineGroups())
  12029. html.push("</div>"); // end the line group
  12030. row++;
  12031. }
  12032. this.element.innerHTML = html.join("");
  12033. };
  12034. this.$textToken = {
  12035. "text": true,
  12036. "rparen": true,
  12037. "lparen": true
  12038. };
  12039. this.$renderToken = function(stringBuilder, screenColumn, token, value) {
  12040. var self = this;
  12041. var replaceReg = /\t|&|<|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\u3000\uFEFF])|[\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3000-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]/g;
  12042. var replaceFunc = function(c, a, b, tabIdx, idx4) {
  12043. if (a) {
  12044. return self.showInvisibles
  12045. ? "<span class='ace_invisible ace_invisible_space'>" + lang.stringRepeat(self.SPACE_CHAR, c.length) + "</span>"
  12046. : c;
  12047. } else if (c == "&") {
  12048. return "&#38;";
  12049. } else if (c == "<") {
  12050. return "&#60;";
  12051. } else if (c == "\t") {
  12052. var tabSize = self.session.getScreenTabSize(screenColumn + tabIdx);
  12053. screenColumn += tabSize - 1;
  12054. return self.$tabStrings[tabSize];
  12055. } else if (c == "\u3000") {
  12056. var classToUse = self.showInvisibles ? "ace_cjk ace_invisible ace_invisible_space" : "ace_cjk";
  12057. var space = self.showInvisibles ? self.SPACE_CHAR : "";
  12058. screenColumn += 1;
  12059. return "<span class='" + classToUse + "' style='width:" +
  12060. (self.config.characterWidth * 2) +
  12061. "px'>" + space + "</span>";
  12062. } else if (b) {
  12063. return "<span class='ace_invisible ace_invisible_space ace_invalid'>" + self.SPACE_CHAR + "</span>";
  12064. } else {
  12065. screenColumn += 1;
  12066. return "<span class='ace_cjk' style='width:" +
  12067. (self.config.characterWidth * 2) +
  12068. "px'>" + c + "</span>";
  12069. }
  12070. };
  12071. var output = value.replace(replaceReg, replaceFunc);
  12072. if (!this.$textToken[token.type]) {
  12073. var classes = "ace_" + token.type.replace(/\./g, " ace_");
  12074. var style = "";
  12075. if (token.type == "fold")
  12076. style = " style='width:" + (token.value.length * this.config.characterWidth) + "px;' ";
  12077. stringBuilder.push("<span class='", classes, "'", style, ">", output, "</span>");
  12078. }
  12079. else {
  12080. stringBuilder.push(output);
  12081. }
  12082. return screenColumn + value.length;
  12083. };
  12084. this.renderIndentGuide = function(stringBuilder, value, max) {
  12085. var cols = value.search(this.$indentGuideRe);
  12086. if (cols <= 0 || cols >= max)
  12087. return value;
  12088. if (value[0] == " ") {
  12089. cols -= cols % this.tabSize;
  12090. stringBuilder.push(lang.stringRepeat(this.$tabStrings[" "], cols/this.tabSize));
  12091. return value.substr(cols);
  12092. } else if (value[0] == "\t") {
  12093. stringBuilder.push(lang.stringRepeat(this.$tabStrings["\t"], cols));
  12094. return value.substr(cols);
  12095. }
  12096. return value;
  12097. };
  12098. this.$renderWrappedLine = function(stringBuilder, tokens, splits, onlyContents) {
  12099. var chars = 0;
  12100. var split = 0;
  12101. var splitChars = splits[0];
  12102. var screenColumn = 0;
  12103. for (var i = 0; i < tokens.length; i++) {
  12104. var token = tokens[i];
  12105. var value = token.value;
  12106. if (i == 0 && this.displayIndentGuides) {
  12107. chars = value.length;
  12108. value = this.renderIndentGuide(stringBuilder, value, splitChars);
  12109. if (!value)
  12110. continue;
  12111. chars -= value.length;
  12112. }
  12113. if (chars + value.length < splitChars) {
  12114. screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);
  12115. chars += value.length;
  12116. } else {
  12117. while (chars + value.length >= splitChars) {
  12118. screenColumn = this.$renderToken(
  12119. stringBuilder, screenColumn,
  12120. token, value.substring(0, splitChars - chars)
  12121. );
  12122. value = value.substring(splitChars - chars);
  12123. chars = splitChars;
  12124. if (!onlyContents) {
  12125. stringBuilder.push("</div>",
  12126. "<div class='ace_line' style='height:",
  12127. this.config.lineHeight, "px'>"
  12128. );
  12129. }
  12130. split ++;
  12131. screenColumn = 0;
  12132. splitChars = splits[split] || Number.MAX_VALUE;
  12133. }
  12134. if (value.length != 0) {
  12135. chars += value.length;
  12136. screenColumn = this.$renderToken(
  12137. stringBuilder, screenColumn, token, value
  12138. );
  12139. }
  12140. }
  12141. }
  12142. };
  12143. this.$renderSimpleLine = function(stringBuilder, tokens) {
  12144. var screenColumn = 0;
  12145. var token = tokens[0];
  12146. var value = token.value;
  12147. if (this.displayIndentGuides)
  12148. value = this.renderIndentGuide(stringBuilder, value);
  12149. if (value)
  12150. screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);
  12151. for (var i = 1; i < tokens.length; i++) {
  12152. token = tokens[i];
  12153. value = token.value;
  12154. screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);
  12155. }
  12156. };
  12157. this.$renderLine = function(stringBuilder, row, onlyContents, foldLine) {
  12158. if (!foldLine && foldLine != false)
  12159. foldLine = this.session.getFoldLine(row);
  12160. if (foldLine)
  12161. var tokens = this.$getFoldLineTokens(row, foldLine);
  12162. else
  12163. var tokens = this.session.getTokens(row);
  12164. if (!onlyContents) {
  12165. stringBuilder.push(
  12166. "<div class='ace_line' style='height:",
  12167. this.config.lineHeight * (
  12168. this.$useLineGroups() ? 1 :this.session.getRowLength(row)
  12169. ), "px'>"
  12170. );
  12171. }
  12172. if (tokens.length) {
  12173. var splits = this.session.getRowSplitData(row);
  12174. if (splits && splits.length)
  12175. this.$renderWrappedLine(stringBuilder, tokens, splits, onlyContents);
  12176. else
  12177. this.$renderSimpleLine(stringBuilder, tokens);
  12178. }
  12179. if (this.showInvisibles) {
  12180. if (foldLine)
  12181. row = foldLine.end.row
  12182. stringBuilder.push(
  12183. "<span class='ace_invisible ace_invisible_eol'>",
  12184. row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR,
  12185. "</span>"
  12186. );
  12187. }
  12188. if (!onlyContents)
  12189. stringBuilder.push("</div>");
  12190. };
  12191. this.$getFoldLineTokens = function(row, foldLine) {
  12192. var session = this.session;
  12193. var renderTokens = [];
  12194. function addTokens(tokens, from, to) {
  12195. var idx = 0, col = 0;
  12196. while ((col + tokens[idx].value.length) < from) {
  12197. col += tokens[idx].value.length;
  12198. idx++;
  12199. if (idx == tokens.length)
  12200. return;
  12201. }
  12202. if (col != from) {
  12203. var value = tokens[idx].value.substring(from - col);
  12204. if (value.length > (to - from))
  12205. value = value.substring(0, to - from);
  12206. renderTokens.push({
  12207. type: tokens[idx].type,
  12208. value: value
  12209. });
  12210. col = from + value.length;
  12211. idx += 1;
  12212. }
  12213. while (col < to && idx < tokens.length) {
  12214. var value = tokens[idx].value;
  12215. if (value.length + col > to) {
  12216. renderTokens.push({
  12217. type: tokens[idx].type,
  12218. value: value.substring(0, to - col)
  12219. });
  12220. } else
  12221. renderTokens.push(tokens[idx]);
  12222. col += value.length;
  12223. idx += 1;
  12224. }
  12225. }
  12226. var tokens = session.getTokens(row);
  12227. foldLine.walk(function(placeholder, row, column, lastColumn, isNewRow) {
  12228. if (placeholder != null) {
  12229. renderTokens.push({
  12230. type: "fold",
  12231. value: placeholder
  12232. });
  12233. } else {
  12234. if (isNewRow)
  12235. tokens = session.getTokens(row);
  12236. if (tokens.length)
  12237. addTokens(tokens, lastColumn, column);
  12238. }
  12239. }, foldLine.end.row, this.session.getLine(foldLine.end.row).length);
  12240. return renderTokens;
  12241. };
  12242. this.$useLineGroups = function() {
  12243. return this.session.getUseWrapMode();
  12244. };
  12245. this.destroy = function() {
  12246. clearInterval(this.$pollSizeChangesTimer);
  12247. if (this.$measureNode)
  12248. this.$measureNode.parentNode.removeChild(this.$measureNode);
  12249. delete this.$measureNode;
  12250. };
  12251. }).call(Text.prototype);
  12252. exports.Text = Text;
  12253. });
  12254. ace.define("ace/layer/cursor",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
  12255. "use strict";
  12256. var dom = require("../lib/dom");
  12257. var IE8;
  12258. var Cursor = function(parentEl) {
  12259. this.element = dom.createElement("div");
  12260. this.element.className = "ace_layer ace_cursor-layer";
  12261. parentEl.appendChild(this.element);
  12262. if (IE8 === undefined)
  12263. IE8 = "opacity" in this.element;
  12264. this.isVisible = false;
  12265. this.isBlinking = true;
  12266. this.blinkInterval = 1000;
  12267. this.smoothBlinking = false;
  12268. this.cursors = [];
  12269. this.cursor = this.addCursor();
  12270. dom.addCssClass(this.element, "ace_hidden-cursors");
  12271. this.$updateCursors = this.$updateVisibility.bind(this);
  12272. };
  12273. (function() {
  12274. this.$updateVisibility = function(val) {
  12275. var cursors = this.cursors;
  12276. for (var i = cursors.length; i--; )
  12277. cursors[i].style.visibility = val ? "" : "hidden";
  12278. };
  12279. this.$updateOpacity = function(val) {
  12280. var cursors = this.cursors;
  12281. for (var i = cursors.length; i--; )
  12282. cursors[i].style.opacity = val ? "" : "0";
  12283. };
  12284. this.$padding = 0;
  12285. this.setPadding = function(padding) {
  12286. this.$padding = padding;
  12287. };
  12288. this.setSession = function(session) {
  12289. this.session = session;
  12290. };
  12291. this.setBlinking = function(blinking) {
  12292. if (blinking != this.isBlinking){
  12293. this.isBlinking = blinking;
  12294. this.restartTimer();
  12295. }
  12296. };
  12297. this.setBlinkInterval = function(blinkInterval) {
  12298. if (blinkInterval != this.blinkInterval){
  12299. this.blinkInterval = blinkInterval;
  12300. this.restartTimer();
  12301. }
  12302. };
  12303. this.setSmoothBlinking = function(smoothBlinking) {
  12304. if (smoothBlinking != this.smoothBlinking && !IE8) {
  12305. this.smoothBlinking = smoothBlinking;
  12306. dom.setCssClass(this.element, "ace_smooth-blinking", smoothBlinking);
  12307. this.$updateCursors(true);
  12308. this.$updateCursors = (smoothBlinking
  12309. ? this.$updateOpacity
  12310. : this.$updateVisibility).bind(this);
  12311. this.restartTimer();
  12312. }
  12313. };
  12314. this.addCursor = function() {
  12315. var el = dom.createElement("div");
  12316. el.className = "ace_cursor";
  12317. this.element.appendChild(el);
  12318. this.cursors.push(el);
  12319. return el;
  12320. };
  12321. this.removeCursor = function() {
  12322. if (this.cursors.length > 1) {
  12323. var el = this.cursors.pop();
  12324. el.parentNode.removeChild(el);
  12325. return el;
  12326. }
  12327. };
  12328. this.hideCursor = function() {
  12329. this.isVisible = false;
  12330. dom.addCssClass(this.element, "ace_hidden-cursors");
  12331. this.restartTimer();
  12332. };
  12333. this.showCursor = function() {
  12334. this.isVisible = true;
  12335. dom.removeCssClass(this.element, "ace_hidden-cursors");
  12336. this.restartTimer();
  12337. };
  12338. this.restartTimer = function() {
  12339. var update = this.$updateCursors;
  12340. clearInterval(this.intervalId);
  12341. clearTimeout(this.timeoutId);
  12342. if (this.smoothBlinking) {
  12343. dom.removeCssClass(this.element, "ace_smooth-blinking");
  12344. }
  12345. update(true);
  12346. if (!this.isBlinking || !this.blinkInterval || !this.isVisible)
  12347. return;
  12348. if (this.smoothBlinking) {
  12349. setTimeout(function(){
  12350. dom.addCssClass(this.element, "ace_smooth-blinking");
  12351. }.bind(this));
  12352. }
  12353. var blink = function(){
  12354. this.timeoutId = setTimeout(function() {
  12355. update(false);
  12356. }, 0.6 * this.blinkInterval);
  12357. }.bind(this);
  12358. this.intervalId = setInterval(function() {
  12359. update(true);
  12360. blink();
  12361. }, this.blinkInterval);
  12362. blink();
  12363. };
  12364. this.getPixelPosition = function(position, onScreen) {
  12365. if (!this.config || !this.session)
  12366. return {left : 0, top : 0};
  12367. if (!position)
  12368. position = this.session.selection.getCursor();
  12369. var pos = this.session.documentToScreenPosition(position);
  12370. var cursorLeft = this.$padding + pos.column * this.config.characterWidth;
  12371. var cursorTop = (pos.row - (onScreen ? this.config.firstRowScreen : 0)) *
  12372. this.config.lineHeight;
  12373. return {left : cursorLeft, top : cursorTop};
  12374. };
  12375. this.update = function(config) {
  12376. this.config = config;
  12377. var selections = this.session.$selectionMarkers;
  12378. var i = 0, cursorIndex = 0;
  12379. if (selections === undefined || selections.length === 0){
  12380. selections = [{cursor: null}];
  12381. }
  12382. for (var i = 0, n = selections.length; i < n; i++) {
  12383. var pixelPos = this.getPixelPosition(selections[i].cursor, true);
  12384. if ((pixelPos.top > config.height + config.offset ||
  12385. pixelPos.top < 0) && i > 1) {
  12386. continue;
  12387. }
  12388. var style = (this.cursors[cursorIndex++] || this.addCursor()).style;
  12389. if (!this.drawCursor) {
  12390. style.left = pixelPos.left + "px";
  12391. style.top = pixelPos.top + "px";
  12392. style.width = config.characterWidth + "px";
  12393. style.height = config.lineHeight + "px";
  12394. } else {
  12395. this.drawCursor(style, pixelPos, config, selections[i], this.session);
  12396. }
  12397. }
  12398. while (this.cursors.length > cursorIndex)
  12399. this.removeCursor();
  12400. var overwrite = this.session.getOverwrite();
  12401. this.$setOverwrite(overwrite);
  12402. this.$pixelPos = pixelPos;
  12403. this.restartTimer();
  12404. };
  12405. this.drawCursor = null;
  12406. this.$setOverwrite = function(overwrite) {
  12407. if (overwrite != this.overwrite) {
  12408. this.overwrite = overwrite;
  12409. if (overwrite)
  12410. dom.addCssClass(this.element, "ace_overwrite-cursors");
  12411. else
  12412. dom.removeCssClass(this.element, "ace_overwrite-cursors");
  12413. }
  12414. };
  12415. this.destroy = function() {
  12416. clearInterval(this.intervalId);
  12417. clearTimeout(this.timeoutId);
  12418. };
  12419. }).call(Cursor.prototype);
  12420. exports.Cursor = Cursor;
  12421. });
  12422. ace.define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"], function(require, exports, module) {
  12423. "use strict";
  12424. var oop = require("./lib/oop");
  12425. var dom = require("./lib/dom");
  12426. var event = require("./lib/event");
  12427. var EventEmitter = require("./lib/event_emitter").EventEmitter;
  12428. var ScrollBar = function(parent) {
  12429. this.element = dom.createElement("div");
  12430. this.element.className = "ace_scrollbar ace_scrollbar" + this.classSuffix;
  12431. this.inner = dom.createElement("div");
  12432. this.inner.className = "ace_scrollbar-inner";
  12433. this.element.appendChild(this.inner);
  12434. parent.appendChild(this.element);
  12435. this.setVisible(false);
  12436. this.skipEvent = false;
  12437. event.addListener(this.element, "scroll", this.onScroll.bind(this));
  12438. event.addListener(this.element, "mousedown", event.preventDefault);
  12439. };
  12440. (function() {
  12441. oop.implement(this, EventEmitter);
  12442. this.setVisible = function(isVisible) {
  12443. this.element.style.display = isVisible ? "" : "none";
  12444. this.isVisible = isVisible;
  12445. };
  12446. }).call(ScrollBar.prototype);
  12447. var VScrollBar = function(parent, renderer) {
  12448. ScrollBar.call(this, parent);
  12449. this.scrollTop = 0;
  12450. renderer.$scrollbarWidth =
  12451. this.width = dom.scrollbarWidth(parent.ownerDocument);
  12452. this.inner.style.width =
  12453. this.element.style.width = (this.width || 15) + 5 + "px";
  12454. };
  12455. oop.inherits(VScrollBar, ScrollBar);
  12456. (function() {
  12457. this.classSuffix = '-v';
  12458. this.onScroll = function() {
  12459. if (!this.skipEvent) {
  12460. this.scrollTop = this.element.scrollTop;
  12461. this._emit("scroll", {data: this.scrollTop});
  12462. }
  12463. this.skipEvent = false;
  12464. };
  12465. this.getWidth = function() {
  12466. return this.isVisible ? this.width : 0;
  12467. };
  12468. this.setHeight = function(height) {
  12469. this.element.style.height = height + "px";
  12470. };
  12471. this.setInnerHeight = function(height) {
  12472. this.inner.style.height = height + "px";
  12473. };
  12474. this.setScrollHeight = function(height) {
  12475. this.inner.style.height = height + "px";
  12476. };
  12477. this.setScrollTop = function(scrollTop) {
  12478. if (this.scrollTop != scrollTop) {
  12479. this.skipEvent = true;
  12480. this.scrollTop = this.element.scrollTop = scrollTop;
  12481. }
  12482. };
  12483. }).call(VScrollBar.prototype);
  12484. var HScrollBar = function(parent, renderer) {
  12485. ScrollBar.call(this, parent);
  12486. this.scrollLeft = 0;
  12487. this.height = renderer.$scrollbarWidth;
  12488. this.inner.style.height =
  12489. this.element.style.height = (this.height || 15) + 5 + "px";
  12490. };
  12491. oop.inherits(HScrollBar, ScrollBar);
  12492. (function() {
  12493. this.classSuffix = '-h';
  12494. this.onScroll = function() {
  12495. if (!this.skipEvent) {
  12496. this.scrollLeft = this.element.scrollLeft;
  12497. this._emit("scroll", {data: this.scrollLeft});
  12498. }
  12499. this.skipEvent = false;
  12500. };
  12501. this.getHeight = function() {
  12502. return this.isVisible ? this.height : 0;
  12503. };
  12504. this.setWidth = function(width) {
  12505. this.element.style.width = width + "px";
  12506. };
  12507. this.setInnerWidth = function(width) {
  12508. this.inner.style.width = width + "px";
  12509. };
  12510. this.setScrollWidth = function(width) {
  12511. this.inner.style.width = width + "px";
  12512. };
  12513. this.setScrollLeft = function(scrollLeft) {
  12514. if (this.scrollLeft != scrollLeft) {
  12515. this.skipEvent = true;
  12516. this.scrollLeft = this.element.scrollLeft = scrollLeft;
  12517. }
  12518. };
  12519. }).call(HScrollBar.prototype);
  12520. exports.ScrollBar = VScrollBar; // backward compatibility
  12521. exports.ScrollBarV = VScrollBar; // backward compatibility
  12522. exports.ScrollBarH = HScrollBar; // backward compatibility
  12523. exports.VScrollBar = VScrollBar;
  12524. exports.HScrollBar = HScrollBar;
  12525. });
  12526. ace.define("ace/renderloop",["require","exports","module","ace/lib/event"], function(require, exports, module) {
  12527. "use strict";
  12528. var event = require("./lib/event");
  12529. var RenderLoop = function(onRender, win) {
  12530. this.onRender = onRender;
  12531. this.pending = false;
  12532. this.changes = 0;
  12533. this.window = win || window;
  12534. };
  12535. (function() {
  12536. this.schedule = function(change) {
  12537. this.changes = this.changes | change;
  12538. if (!this.pending && this.changes) {
  12539. this.pending = true;
  12540. var _self = this;
  12541. event.nextFrame(function() {
  12542. _self.pending = false;
  12543. var changes;
  12544. while (changes = _self.changes) {
  12545. _self.changes = 0;
  12546. _self.onRender(changes);
  12547. }
  12548. }, this.window);
  12549. }
  12550. };
  12551. }).call(RenderLoop.prototype);
  12552. exports.RenderLoop = RenderLoop;
  12553. });
  12554. ace.define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"], function(require, exports, module) {
  12555. var oop = require("../lib/oop");
  12556. var dom = require("../lib/dom");
  12557. var lang = require("../lib/lang");
  12558. var useragent = require("../lib/useragent");
  12559. var EventEmitter = require("../lib/event_emitter").EventEmitter;
  12560. var CHAR_COUNT = 0;
  12561. var FontMetrics = exports.FontMetrics = function(parentEl, interval) {
  12562. this.el = dom.createElement("div");
  12563. this.$setMeasureNodeStyles(this.el.style, true);
  12564. this.$main = dom.createElement("div");
  12565. this.$setMeasureNodeStyles(this.$main.style);
  12566. this.$measureNode = dom.createElement("div");
  12567. this.$setMeasureNodeStyles(this.$measureNode.style);
  12568. this.el.appendChild(this.$main);
  12569. this.el.appendChild(this.$measureNode);
  12570. parentEl.appendChild(this.el);
  12571. if (!CHAR_COUNT)
  12572. this.$testFractionalRect();
  12573. this.$measureNode.innerHTML = lang.stringRepeat("X", CHAR_COUNT);
  12574. this.$characterSize = {width: 0, height: 0};
  12575. this.checkForSizeChanges();
  12576. };
  12577. (function() {
  12578. oop.implement(this, EventEmitter);
  12579. this.$characterSize = {width: 0, height: 0};
  12580. this.$testFractionalRect = function() {
  12581. var el = dom.createElement("div");
  12582. this.$setMeasureNodeStyles(el.style);
  12583. el.style.width = "0.2px";
  12584. document.documentElement.appendChild(el);
  12585. var w = el.getBoundingClientRect().width;
  12586. if (w > 0 && w < 1)
  12587. CHAR_COUNT = 50;
  12588. else
  12589. CHAR_COUNT = 100;
  12590. el.parentNode.removeChild(el);
  12591. };
  12592. this.$setMeasureNodeStyles = function(style, isRoot) {
  12593. style.width = style.height = "auto";
  12594. style.left = style.top = "0px";
  12595. style.visibility = "hidden";
  12596. style.position = "absolute";
  12597. style.whiteSpace = "pre";
  12598. if (useragent.isIE < 8) {
  12599. style["font-family"] = "inherit";
  12600. } else {
  12601. style.font = "inherit";
  12602. }
  12603. style.overflow = isRoot ? "hidden" : "visible";
  12604. };
  12605. this.checkForSizeChanges = function() {
  12606. var size = this.$measureSizes();
  12607. if (size && (this.$characterSize.width !== size.width || this.$characterSize.height !== size.height)) {
  12608. this.$measureNode.style.fontWeight = "bold";
  12609. var boldSize = this.$measureSizes();
  12610. this.$measureNode.style.fontWeight = "";
  12611. this.$characterSize = size;
  12612. this.charSizes = Object.create(null);
  12613. this.allowBoldFonts = boldSize && boldSize.width === size.width && boldSize.height === size.height;
  12614. this._emit("changeCharacterSize", {data: size});
  12615. }
  12616. };
  12617. this.$pollSizeChanges = function() {
  12618. if (this.$pollSizeChangesTimer)
  12619. return this.$pollSizeChangesTimer;
  12620. var self = this;
  12621. return this.$pollSizeChangesTimer = setInterval(function() {
  12622. self.checkForSizeChanges();
  12623. }, 500);
  12624. };
  12625. this.setPolling = function(val) {
  12626. if (val) {
  12627. this.$pollSizeChanges();
  12628. } else {
  12629. if (this.$pollSizeChangesTimer)
  12630. this.$pollSizeChangesTimer;
  12631. }
  12632. };
  12633. this.$measureSizes = function() {
  12634. if (CHAR_COUNT === 50) {
  12635. var rect = null;
  12636. try {
  12637. rect = this.$measureNode.getBoundingClientRect();
  12638. } catch(e) {
  12639. rect = {width: 0, height:0 };
  12640. };
  12641. var size = {
  12642. height: rect.height,
  12643. width: rect.width / CHAR_COUNT
  12644. };
  12645. } else {
  12646. var size = {
  12647. height: this.$measureNode.clientHeight,
  12648. width: this.$measureNode.clientWidth / CHAR_COUNT
  12649. };
  12650. }
  12651. if (size.width === 0 || size.height === 0)
  12652. return null;
  12653. return size;
  12654. };
  12655. this.$measureCharWidth = function(ch) {
  12656. this.$main.innerHTML = lang.stringRepeat(ch, CHAR_COUNT);
  12657. var rect = this.$main.getBoundingClientRect();
  12658. return rect.width / CHAR_COUNT;
  12659. };
  12660. this.getCharacterWidth = function(ch) {
  12661. var w = this.charSizes[ch];
  12662. if (w === undefined) {
  12663. this.charSizes[ch] = this.$measureCharWidth(ch) / this.$characterSize.width;
  12664. }
  12665. return w;
  12666. };
  12667. this.destroy = function() {
  12668. clearInterval(this.$pollSizeChangesTimer);
  12669. if (this.el && this.el.parentNode)
  12670. this.el.parentNode.removeChild(this.el);
  12671. };
  12672. }).call(FontMetrics.prototype);
  12673. });
  12674. ace.define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/lib/useragent","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter"], function(require, exports, module) {
  12675. "use strict";
  12676. var oop = require("./lib/oop");
  12677. var dom = require("./lib/dom");
  12678. var config = require("./config");
  12679. var useragent = require("./lib/useragent");
  12680. var GutterLayer = require("./layer/gutter").Gutter;
  12681. var MarkerLayer = require("./layer/marker").Marker;
  12682. var TextLayer = require("./layer/text").Text;
  12683. var CursorLayer = require("./layer/cursor").Cursor;
  12684. var HScrollBar = require("./scrollbar").HScrollBar;
  12685. var VScrollBar = require("./scrollbar").VScrollBar;
  12686. var RenderLoop = require("./renderloop").RenderLoop;
  12687. var FontMetrics = require("./layer/font_metrics").FontMetrics;
  12688. var EventEmitter = require("./lib/event_emitter").EventEmitter;
  12689. var editorCss = ".ace_editor {\
  12690. position: relative;\
  12691. overflow: hidden;\
  12692. font: 12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\
  12693. direction: ltr;\
  12694. }\
  12695. .ace_scroller {\
  12696. position: absolute;\
  12697. overflow: hidden;\
  12698. top: 0;\
  12699. bottom: 0;\
  12700. background-color: inherit;\
  12701. -ms-user-select: none;\
  12702. -moz-user-select: none;\
  12703. -webkit-user-select: none;\
  12704. user-select: none;\
  12705. cursor: text;\
  12706. }\
  12707. .ace_content {\
  12708. position: absolute;\
  12709. -moz-box-sizing: border-box;\
  12710. -webkit-box-sizing: border-box;\
  12711. box-sizing: border-box;\
  12712. min-width: 100%;\
  12713. }\
  12714. .ace_dragging .ace_scroller:before{\
  12715. position: absolute;\
  12716. top: 0;\
  12717. left: 0;\
  12718. right: 0;\
  12719. bottom: 0;\
  12720. content: '';\
  12721. background: rgba(250, 250, 250, 0.01);\
  12722. z-index: 1000;\
  12723. }\
  12724. .ace_dragging.ace_dark .ace_scroller:before{\
  12725. background: rgba(0, 0, 0, 0.01);\
  12726. }\
  12727. .ace_selecting, .ace_selecting * {\
  12728. cursor: text !important;\
  12729. }\
  12730. .ace_gutter {\
  12731. position: absolute;\
  12732. overflow : hidden;\
  12733. width: auto;\
  12734. top: 0;\
  12735. bottom: 0;\
  12736. left: 0;\
  12737. cursor: default;\
  12738. z-index: 4;\
  12739. -ms-user-select: none;\
  12740. -moz-user-select: none;\
  12741. -webkit-user-select: none;\
  12742. user-select: none;\
  12743. }\
  12744. .ace_gutter-active-line {\
  12745. position: absolute;\
  12746. left: 0;\
  12747. right: 0;\
  12748. }\
  12749. .ace_scroller.ace_scroll-left {\
  12750. box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\
  12751. }\
  12752. .ace_gutter-cell {\
  12753. padding-left: 19px;\
  12754. padding-right: 6px;\
  12755. background-repeat: no-repeat;\
  12756. }\
  12757. .ace_gutter-cell.ace_error {\
  12758. background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==\");\
  12759. background-repeat: no-repeat;\
  12760. background-position: 2px center;\
  12761. }\
  12762. .ace_gutter-cell.ace_warning {\
  12763. background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==\");\
  12764. background-position: 2px center;\
  12765. }\
  12766. .ace_gutter-cell.ace_info {\
  12767. background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=\");\
  12768. background-position: 2px center;\
  12769. }\
  12770. .ace_dark .ace_gutter-cell.ace_info {\
  12771. background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC\");\
  12772. }\
  12773. .ace_scrollbar {\
  12774. position: absolute;\
  12775. right: 0;\
  12776. bottom: 0;\
  12777. z-index: 6;\
  12778. }\
  12779. .ace_scrollbar-inner {\
  12780. position: absolute;\
  12781. cursor: text;\
  12782. left: 0;\
  12783. top: 0;\
  12784. }\
  12785. .ace_scrollbar-v{\
  12786. overflow-x: hidden;\
  12787. overflow-y: scroll;\
  12788. top: 0;\
  12789. }\
  12790. .ace_scrollbar-h {\
  12791. overflow-x: scroll;\
  12792. overflow-y: hidden;\
  12793. left: 0;\
  12794. }\
  12795. .ace_print-margin {\
  12796. position: absolute;\
  12797. height: 100%;\
  12798. }\
  12799. .ace_text-input {\
  12800. position: absolute;\
  12801. z-index: 0;\
  12802. width: 0.5em;\
  12803. height: 1em;\
  12804. opacity: 0;\
  12805. background: transparent;\
  12806. -moz-appearance: none;\
  12807. appearance: none;\
  12808. border: none;\
  12809. resize: none;\
  12810. outline: none;\
  12811. overflow: hidden;\
  12812. font: inherit;\
  12813. padding: 0 1px;\
  12814. margin: 0 -1px;\
  12815. text-indent: -1em;\
  12816. -ms-user-select: text;\
  12817. -moz-user-select: text;\
  12818. -webkit-user-select: text;\
  12819. user-select: text;\
  12820. }\
  12821. .ace_text-input.ace_composition {\
  12822. background: inherit;\
  12823. color: inherit;\
  12824. z-index: 1000;\
  12825. opacity: 1;\
  12826. text-indent: 0;\
  12827. }\
  12828. .ace_layer {\
  12829. z-index: 1;\
  12830. position: absolute;\
  12831. overflow: hidden;\
  12832. word-wrap: normal;\
  12833. white-space: pre;\
  12834. height: 100%;\
  12835. width: 100%;\
  12836. -moz-box-sizing: border-box;\
  12837. -webkit-box-sizing: border-box;\
  12838. box-sizing: border-box;\
  12839. pointer-events: none;\
  12840. }\
  12841. .ace_gutter-layer {\
  12842. position: relative;\
  12843. width: auto;\
  12844. text-align: right;\
  12845. pointer-events: auto;\
  12846. }\
  12847. .ace_text-layer {\
  12848. font: inherit !important;\
  12849. }\
  12850. .ace_cjk {\
  12851. display: inline-block;\
  12852. text-align: center;\
  12853. }\
  12854. .ace_cursor-layer {\
  12855. z-index: 4;\
  12856. }\
  12857. .ace_cursor {\
  12858. z-index: 4;\
  12859. position: absolute;\
  12860. -moz-box-sizing: border-box;\
  12861. -webkit-box-sizing: border-box;\
  12862. box-sizing: border-box;\
  12863. border-left: 2px solid\
  12864. }\
  12865. .ace_slim-cursors .ace_cursor {\
  12866. border-left-width: 1px;\
  12867. }\
  12868. .ace_overwrite-cursors .ace_cursor {\
  12869. border-left-width: 0;\
  12870. border-bottom: 1px solid;\
  12871. }\
  12872. .ace_hidden-cursors .ace_cursor {\
  12873. opacity: 0.2;\
  12874. }\
  12875. .ace_smooth-blinking .ace_cursor {\
  12876. -webkit-transition: opacity 0.18s;\
  12877. transition: opacity 0.18s;\
  12878. }\
  12879. .ace_editor.ace_multiselect .ace_cursor {\
  12880. border-left-width: 1px;\
  12881. }\
  12882. .ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\
  12883. position: absolute;\
  12884. z-index: 3;\
  12885. }\
  12886. .ace_marker-layer .ace_selection {\
  12887. position: absolute;\
  12888. z-index: 5;\
  12889. }\
  12890. .ace_marker-layer .ace_bracket {\
  12891. position: absolute;\
  12892. z-index: 6;\
  12893. }\
  12894. .ace_marker-layer .ace_active-line {\
  12895. position: absolute;\
  12896. z-index: 2;\
  12897. }\
  12898. .ace_marker-layer .ace_selected-word {\
  12899. position: absolute;\
  12900. z-index: 4;\
  12901. -moz-box-sizing: border-box;\
  12902. -webkit-box-sizing: border-box;\
  12903. box-sizing: border-box;\
  12904. }\
  12905. .ace_line .ace_fold {\
  12906. -moz-box-sizing: border-box;\
  12907. -webkit-box-sizing: border-box;\
  12908. box-sizing: border-box;\
  12909. display: inline-block;\
  12910. height: 11px;\
  12911. margin-top: -2px;\
  12912. vertical-align: middle;\
  12913. background-image:\
  12914. url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),\
  12915. url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\");\
  12916. background-repeat: no-repeat, repeat-x;\
  12917. background-position: center center, top left;\
  12918. color: transparent;\
  12919. border: 1px solid black;\
  12920. border-radius: 2px;\
  12921. cursor: pointer;\
  12922. pointer-events: auto;\
  12923. }\
  12924. .ace_dark .ace_fold {\
  12925. }\
  12926. .ace_fold:hover{\
  12927. background-image:\
  12928. url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),\
  12929. url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\");\
  12930. }\
  12931. .ace_tooltip {\
  12932. background-color: #FFF;\
  12933. background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));\
  12934. background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));\
  12935. border: 1px solid gray;\
  12936. border-radius: 1px;\
  12937. box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\
  12938. color: black;\
  12939. max-width: 100%;\
  12940. padding: 3px 4px;\
  12941. position: fixed;\
  12942. z-index: 999999;\
  12943. -moz-box-sizing: border-box;\
  12944. -webkit-box-sizing: border-box;\
  12945. box-sizing: border-box;\
  12946. cursor: default;\
  12947. white-space: pre;\
  12948. word-wrap: break-word;\
  12949. line-height: normal;\
  12950. font-style: normal;\
  12951. font-weight: normal;\
  12952. letter-spacing: normal;\
  12953. pointer-events: none;\
  12954. }\
  12955. .ace_folding-enabled > .ace_gutter-cell {\
  12956. padding-right: 13px;\
  12957. }\
  12958. .ace_fold-widget {\
  12959. -moz-box-sizing: border-box;\
  12960. -webkit-box-sizing: border-box;\
  12961. box-sizing: border-box;\
  12962. margin: 0 -12px 0 1px;\
  12963. display: none;\
  12964. width: 11px;\
  12965. vertical-align: top;\
  12966. background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\");\
  12967. background-repeat: no-repeat;\
  12968. background-position: center;\
  12969. border-radius: 3px;\
  12970. border: 1px solid transparent;\
  12971. cursor: pointer;\
  12972. }\
  12973. .ace_folding-enabled .ace_fold-widget {\
  12974. display: inline-block; \
  12975. }\
  12976. .ace_fold-widget.ace_end {\
  12977. background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\");\
  12978. }\
  12979. .ace_fold-widget.ace_closed {\
  12980. background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\");\
  12981. }\
  12982. .ace_fold-widget:hover {\
  12983. border: 1px solid rgba(0, 0, 0, 0.3);\
  12984. background-color: rgba(255, 255, 255, 0.2);\
  12985. box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\
  12986. }\
  12987. .ace_fold-widget:active {\
  12988. border: 1px solid rgba(0, 0, 0, 0.4);\
  12989. background-color: rgba(0, 0, 0, 0.05);\
  12990. box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\
  12991. }\
  12992. .ace_dark .ace_fold-widget {\
  12993. background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\");\
  12994. }\
  12995. .ace_dark .ace_fold-widget.ace_end {\
  12996. background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\");\
  12997. }\
  12998. .ace_dark .ace_fold-widget.ace_closed {\
  12999. background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\");\
  13000. }\
  13001. .ace_dark .ace_fold-widget:hover {\
  13002. box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\
  13003. background-color: rgba(255, 255, 255, 0.1);\
  13004. }\
  13005. .ace_dark .ace_fold-widget:active {\
  13006. box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\
  13007. }\
  13008. .ace_fold-widget.ace_invalid {\
  13009. background-color: #FFB4B4;\
  13010. border-color: #DE5555;\
  13011. }\
  13012. .ace_fade-fold-widgets .ace_fold-widget {\
  13013. -webkit-transition: opacity 0.4s ease 0.05s;\
  13014. transition: opacity 0.4s ease 0.05s;\
  13015. opacity: 0;\
  13016. }\
  13017. .ace_fade-fold-widgets:hover .ace_fold-widget {\
  13018. -webkit-transition: opacity 0.05s ease 0.05s;\
  13019. transition: opacity 0.05s ease 0.05s;\
  13020. opacity:1;\
  13021. }\
  13022. .ace_underline {\
  13023. text-decoration: underline;\
  13024. }\
  13025. .ace_bold {\
  13026. font-weight: bold;\
  13027. }\
  13028. .ace_nobold .ace_bold {\
  13029. font-weight: normal;\
  13030. }\
  13031. .ace_italic {\
  13032. font-style: italic;\
  13033. }\
  13034. .ace_error-marker {\
  13035. background-color: rgba(255, 0, 0,0.2);\
  13036. position: absolute;\
  13037. z-index: 9;\
  13038. }\
  13039. .ace_highlight-marker {\
  13040. background-color: rgba(255, 255, 0,0.2);\
  13041. position: absolute;\
  13042. z-index: 8;\
  13043. }\
  13044. ";
  13045. dom.importCssString(editorCss, "ace_editor.css");
  13046. var VirtualRenderer = function(container, theme) {
  13047. var _self = this;
  13048. this.container = container || dom.createElement("div");
  13049. this.$keepTextAreaAtCursor = !useragent.isOldIE;
  13050. dom.addCssClass(this.container, "ace_editor");
  13051. this.setTheme(theme);
  13052. this.$gutter = dom.createElement("div");
  13053. this.$gutter.className = "ace_gutter";
  13054. this.container.appendChild(this.$gutter);
  13055. this.scroller = dom.createElement("div");
  13056. this.scroller.className = "ace_scroller";
  13057. this.container.appendChild(this.scroller);
  13058. this.content = dom.createElement("div");
  13059. this.content.className = "ace_content";
  13060. this.scroller.appendChild(this.content);
  13061. this.$gutterLayer = new GutterLayer(this.$gutter);
  13062. this.$gutterLayer.on("changeGutterWidth", this.onGutterResize.bind(this));
  13063. this.$markerBack = new MarkerLayer(this.content);
  13064. var textLayer = this.$textLayer = new TextLayer(this.content);
  13065. this.canvas = textLayer.element;
  13066. this.$markerFront = new MarkerLayer(this.content);
  13067. this.$cursorLayer = new CursorLayer(this.content);
  13068. this.$horizScroll = false;
  13069. this.$vScroll = false;
  13070. this.scrollBar =
  13071. this.scrollBarV = new VScrollBar(this.container, this);
  13072. this.scrollBarH = new HScrollBar(this.container, this);
  13073. this.scrollBarV.addEventListener("scroll", function(e) {
  13074. if (!_self.$scrollAnimation)
  13075. _self.session.setScrollTop(e.data - _self.scrollMargin.top);
  13076. });
  13077. this.scrollBarH.addEventListener("scroll", function(e) {
  13078. if (!_self.$scrollAnimation)
  13079. _self.session.setScrollLeft(e.data - _self.scrollMargin.left);
  13080. });
  13081. this.scrollTop = 0;
  13082. this.scrollLeft = 0;
  13083. this.cursorPos = {
  13084. row : 0,
  13085. column : 0
  13086. };
  13087. this.$fontMetrics = new FontMetrics(this.container, 500);
  13088. this.$textLayer.$setFontMetrics(this.$fontMetrics);
  13089. this.$textLayer.addEventListener("changeCharacterSize", function(e) {
  13090. _self.updateCharacterSize();
  13091. _self.onResize(true, _self.gutterWidth, _self.$size.width, _self.$size.height);
  13092. _self._signal("changeCharacterSize", e);
  13093. });
  13094. this.$size = {
  13095. width: 0,
  13096. height: 0,
  13097. scrollerHeight: 0,
  13098. scrollerWidth: 0,
  13099. $dirty: true
  13100. };
  13101. this.layerConfig = {
  13102. width : 1,
  13103. padding : 0,
  13104. firstRow : 0,
  13105. firstRowScreen: 0,
  13106. lastRow : 0,
  13107. lineHeight : 0,
  13108. characterWidth : 0,
  13109. minHeight : 1,
  13110. maxHeight : 1,
  13111. offset : 0,
  13112. height : 1,
  13113. gutterOffset: 1
  13114. };
  13115. this.scrollMargin = {
  13116. left: 0,
  13117. right: 0,
  13118. top: 0,
  13119. bottom: 0,
  13120. v: 0,
  13121. h: 0
  13122. };
  13123. this.$loop = new RenderLoop(
  13124. this.$renderChanges.bind(this),
  13125. this.container.ownerDocument.defaultView
  13126. );
  13127. this.$loop.schedule(this.CHANGE_FULL);
  13128. this.updateCharacterSize();
  13129. this.setPadding(4);
  13130. config.resetOptions(this);
  13131. config._emit("renderer", this);
  13132. };
  13133. (function() {
  13134. this.CHANGE_CURSOR = 1;
  13135. this.CHANGE_MARKER = 2;
  13136. this.CHANGE_GUTTER = 4;
  13137. this.CHANGE_SCROLL = 8;
  13138. this.CHANGE_LINES = 16;
  13139. this.CHANGE_TEXT = 32;
  13140. this.CHANGE_SIZE = 64;
  13141. this.CHANGE_MARKER_BACK = 128;
  13142. this.CHANGE_MARKER_FRONT = 256;
  13143. this.CHANGE_FULL = 512;
  13144. this.CHANGE_H_SCROLL = 1024;
  13145. oop.implement(this, EventEmitter);
  13146. this.updateCharacterSize = function() {
  13147. if (this.$textLayer.allowBoldFonts != this.$allowBoldFonts) {
  13148. this.$allowBoldFonts = this.$textLayer.allowBoldFonts;
  13149. this.setStyle("ace_nobold", !this.$allowBoldFonts);
  13150. }
  13151. this.layerConfig.characterWidth =
  13152. this.characterWidth = this.$textLayer.getCharacterWidth();
  13153. this.layerConfig.lineHeight =
  13154. this.lineHeight = this.$textLayer.getLineHeight();
  13155. this.$updatePrintMargin();
  13156. };
  13157. this.setSession = function(session) {
  13158. if (this.session)
  13159. this.session.doc.off("changeNewLineMode", this.onChangeNewLineMode);
  13160. this.session = session;
  13161. if (session && this.scrollMargin.top && session.getScrollTop() <= 0)
  13162. session.setScrollTop(-this.scrollMargin.top);
  13163. this.$cursorLayer.setSession(session);
  13164. this.$markerBack.setSession(session);
  13165. this.$markerFront.setSession(session);
  13166. this.$gutterLayer.setSession(session);
  13167. this.$textLayer.setSession(session);
  13168. if (!session)
  13169. return;
  13170. this.$loop.schedule(this.CHANGE_FULL);
  13171. this.session.$setFontMetrics(this.$fontMetrics);
  13172. this.onChangeNewLineMode = this.onChangeNewLineMode.bind(this);
  13173. this.onChangeNewLineMode()
  13174. this.session.doc.on("changeNewLineMode", this.onChangeNewLineMode);
  13175. };
  13176. this.updateLines = function(firstRow, lastRow, force) {
  13177. if (lastRow === undefined)
  13178. lastRow = Infinity;
  13179. if (!this.$changedLines) {
  13180. this.$changedLines = {
  13181. firstRow: firstRow,
  13182. lastRow: lastRow
  13183. };
  13184. }
  13185. else {
  13186. if (this.$changedLines.firstRow > firstRow)
  13187. this.$changedLines.firstRow = firstRow;
  13188. if (this.$changedLines.lastRow < lastRow)
  13189. this.$changedLines.lastRow = lastRow;
  13190. }
  13191. if (this.$changedLines.lastRow < this.layerConfig.firstRow) {
  13192. if (force)
  13193. this.$changedLines.lastRow = this.layerConfig.lastRow;
  13194. else
  13195. return;
  13196. }
  13197. if (this.$changedLines.firstRow > this.layerConfig.lastRow)
  13198. return;
  13199. this.$loop.schedule(this.CHANGE_LINES);
  13200. };
  13201. this.onChangeNewLineMode = function() {
  13202. this.$loop.schedule(this.CHANGE_TEXT);
  13203. this.$textLayer.$updateEolChar();
  13204. };
  13205. this.onChangeTabSize = function() {
  13206. this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER);
  13207. this.$textLayer.onChangeTabSize();
  13208. };
  13209. this.updateText = function() {
  13210. this.$loop.schedule(this.CHANGE_TEXT);
  13211. };
  13212. this.updateFull = function(force) {
  13213. if (force)
  13214. this.$renderChanges(this.CHANGE_FULL, true);
  13215. else
  13216. this.$loop.schedule(this.CHANGE_FULL);
  13217. };
  13218. this.updateFontSize = function() {
  13219. this.$textLayer.checkForSizeChanges();
  13220. };
  13221. this.$changes = 0;
  13222. this.$updateSizeAsync = function() {
  13223. if (this.$loop.pending)
  13224. this.$size.$dirty = true;
  13225. else
  13226. this.onResize();
  13227. };
  13228. this.onResize = function(force, gutterWidth, width, height) {
  13229. if (this.resizing > 2)
  13230. return;
  13231. else if (this.resizing > 0)
  13232. this.resizing++;
  13233. else
  13234. this.resizing = force ? 1 : 0;
  13235. var el = this.container;
  13236. if (!height)
  13237. height = el.clientHeight || el.scrollHeight;
  13238. if (!width)
  13239. width = el.clientWidth || el.scrollWidth;
  13240. var changes = this.$updateCachedSize(force, gutterWidth, width, height);
  13241. if (!this.$size.scrollerHeight || (!width && !height))
  13242. return this.resizing = 0;
  13243. if (force)
  13244. this.$gutterLayer.$padding = null;
  13245. if (force)
  13246. this.$renderChanges(changes | this.$changes, true);
  13247. else
  13248. this.$loop.schedule(changes | this.$changes);
  13249. if (this.resizing)
  13250. this.resizing = 0;
  13251. this.scrollBarV.scrollLeft = this.scrollBarV.scrollTop = null;
  13252. };
  13253. this.$updateCachedSize = function(force, gutterWidth, width, height) {
  13254. height -= (this.$extraHeight || 0);
  13255. var changes = 0;
  13256. var size = this.$size;
  13257. var oldSize = {
  13258. width: size.width,
  13259. height: size.height,
  13260. scrollerHeight: size.scrollerHeight,
  13261. scrollerWidth: size.scrollerWidth
  13262. };
  13263. if (height && (force || size.height != height)) {
  13264. size.height = height;
  13265. changes |= this.CHANGE_SIZE;
  13266. size.scrollerHeight = size.height;
  13267. if (this.$horizScroll)
  13268. size.scrollerHeight -= this.scrollBarH.getHeight();
  13269. this.scrollBarV.element.style.bottom = this.scrollBarH.getHeight() + "px";
  13270. changes = changes | this.CHANGE_SCROLL;
  13271. }
  13272. if (width && (force || size.width != width)) {
  13273. changes |= this.CHANGE_SIZE;
  13274. size.width = width;
  13275. if (gutterWidth == null)
  13276. gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;
  13277. this.gutterWidth = gutterWidth;
  13278. this.scrollBarH.element.style.left =
  13279. this.scroller.style.left = gutterWidth + "px";
  13280. size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth());
  13281. this.scrollBarH.element.style.right =
  13282. this.scroller.style.right = this.scrollBarV.getWidth() + "px";
  13283. this.scroller.style.bottom = this.scrollBarH.getHeight() + "px";
  13284. if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force)
  13285. changes |= this.CHANGE_FULL;
  13286. }
  13287. size.$dirty = !width || !height;
  13288. if (changes)
  13289. this._signal("resize", oldSize);
  13290. return changes;
  13291. };
  13292. this.onGutterResize = function() {
  13293. var gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;
  13294. if (gutterWidth != this.gutterWidth)
  13295. this.$changes |= this.$updateCachedSize(true, gutterWidth, this.$size.width, this.$size.height);
  13296. if (this.session.getUseWrapMode() && this.adjustWrapLimit()) {
  13297. this.$loop.schedule(this.CHANGE_FULL);
  13298. } else if (this.$size.$dirty) {
  13299. this.$loop.schedule(this.CHANGE_FULL);
  13300. } else {
  13301. this.$computeLayerConfig();
  13302. this.$loop.schedule(this.CHANGE_MARKER);
  13303. }
  13304. };
  13305. this.adjustWrapLimit = function() {
  13306. var availableWidth = this.$size.scrollerWidth - this.$padding * 2;
  13307. var limit = Math.floor(availableWidth / this.characterWidth);
  13308. return this.session.adjustWrapLimit(limit, this.$showPrintMargin && this.$printMarginColumn);
  13309. };
  13310. this.setAnimatedScroll = function(shouldAnimate){
  13311. this.setOption("animatedScroll", shouldAnimate);
  13312. };
  13313. this.getAnimatedScroll = function() {
  13314. return this.$animatedScroll;
  13315. };
  13316. this.setShowInvisibles = function(showInvisibles) {
  13317. this.setOption("showInvisibles", showInvisibles);
  13318. };
  13319. this.getShowInvisibles = function() {
  13320. return this.getOption("showInvisibles");
  13321. };
  13322. this.getDisplayIndentGuides = function() {
  13323. return this.getOption("displayIndentGuides");
  13324. };
  13325. this.setDisplayIndentGuides = function(display) {
  13326. this.setOption("displayIndentGuides", display);
  13327. };
  13328. this.setShowPrintMargin = function(showPrintMargin) {
  13329. this.setOption("showPrintMargin", showPrintMargin);
  13330. };
  13331. this.getShowPrintMargin = function() {
  13332. return this.getOption("showPrintMargin");
  13333. };
  13334. this.setPrintMarginColumn = function(showPrintMargin) {
  13335. this.setOption("printMarginColumn", showPrintMargin);
  13336. };
  13337. this.getPrintMarginColumn = function() {
  13338. return this.getOption("printMarginColumn");
  13339. };
  13340. this.getShowGutter = function(){
  13341. return this.getOption("showGutter");
  13342. };
  13343. this.setShowGutter = function(show){
  13344. return this.setOption("showGutter", show);
  13345. };
  13346. this.getFadeFoldWidgets = function(){
  13347. return this.getOption("fadeFoldWidgets")
  13348. };
  13349. this.setFadeFoldWidgets = function(show) {
  13350. this.setOption("fadeFoldWidgets", show);
  13351. };
  13352. this.setHighlightGutterLine = function(shouldHighlight) {
  13353. this.setOption("highlightGutterLine", shouldHighlight);
  13354. };
  13355. this.getHighlightGutterLine = function() {
  13356. return this.getOption("highlightGutterLine");
  13357. };
  13358. this.$updateGutterLineHighlight = function() {
  13359. var pos = this.$cursorLayer.$pixelPos;
  13360. var height = this.layerConfig.lineHeight;
  13361. if (this.session.getUseWrapMode()) {
  13362. var cursor = this.session.selection.getCursor();
  13363. cursor.column = 0;
  13364. pos = this.$cursorLayer.getPixelPosition(cursor, true);
  13365. height *= this.session.getRowLength(cursor.row);
  13366. }
  13367. this.$gutterLineHighlight.style.top = pos.top - this.layerConfig.offset + "px";
  13368. this.$gutterLineHighlight.style.height = height + "px";
  13369. };
  13370. this.$updatePrintMargin = function() {
  13371. if (!this.$showPrintMargin && !this.$printMarginEl)
  13372. return;
  13373. if (!this.$printMarginEl) {
  13374. var containerEl = dom.createElement("div");
  13375. containerEl.className = "ace_layer ace_print-margin-layer";
  13376. this.$printMarginEl = dom.createElement("div");
  13377. this.$printMarginEl.className = "ace_print-margin";
  13378. containerEl.appendChild(this.$printMarginEl);
  13379. this.content.insertBefore(containerEl, this.content.firstChild);
  13380. }
  13381. var style = this.$printMarginEl.style;
  13382. style.left = ((this.characterWidth * this.$printMarginColumn) + this.$padding) + "px";
  13383. style.visibility = this.$showPrintMargin ? "visible" : "hidden";
  13384. if (this.session && this.session.$wrap == -1)
  13385. this.adjustWrapLimit();
  13386. };
  13387. this.getContainerElement = function() {
  13388. return this.container;
  13389. };
  13390. this.getMouseEventTarget = function() {
  13391. return this.content;
  13392. };
  13393. this.getTextAreaContainer = function() {
  13394. return this.container;
  13395. };
  13396. this.$moveTextAreaToCursor = function() {
  13397. if (!this.$keepTextAreaAtCursor)
  13398. return;
  13399. var config = this.layerConfig;
  13400. var posTop = this.$cursorLayer.$pixelPos.top;
  13401. var posLeft = this.$cursorLayer.$pixelPos.left;
  13402. posTop -= config.offset;
  13403. var style = this.textarea.style;
  13404. var h = this.lineHeight;
  13405. if (posTop < 0 || posTop > config.height - h) {
  13406. style.top = style.left = "0";
  13407. return;
  13408. }
  13409. var w = this.characterWidth;
  13410. if (this.$composition) {
  13411. var val = this.textarea.value.replace(/^\x01+/, "");
  13412. w *= (this.session.$getStringScreenWidth(val)[0]+2);
  13413. h += 2;
  13414. }
  13415. posLeft -= this.scrollLeft;
  13416. if (posLeft > this.$size.scrollerWidth - w)
  13417. posLeft = this.$size.scrollerWidth - w;
  13418. posLeft += this.gutterWidth;
  13419. style.height = h + "px";
  13420. style.width = w + "px";
  13421. style.left = Math.min(posLeft, this.$size.scrollerWidth - w) + "px";
  13422. style.top = Math.min(posTop, this.$size.height - h) + "px";
  13423. };
  13424. this.getFirstVisibleRow = function() {
  13425. return this.layerConfig.firstRow;
  13426. };
  13427. this.getFirstFullyVisibleRow = function() {
  13428. return this.layerConfig.firstRow + (this.layerConfig.offset === 0 ? 0 : 1);
  13429. };
  13430. this.getLastFullyVisibleRow = function() {
  13431. var flint = Math.floor((this.layerConfig.height + this.layerConfig.offset) / this.layerConfig.lineHeight);
  13432. return this.layerConfig.firstRow - 1 + flint;
  13433. };
  13434. this.getLastVisibleRow = function() {
  13435. return this.layerConfig.lastRow;
  13436. };
  13437. this.$padding = null;
  13438. this.setPadding = function(padding) {
  13439. this.$padding = padding;
  13440. this.$textLayer.setPadding(padding);
  13441. this.$cursorLayer.setPadding(padding);
  13442. this.$markerFront.setPadding(padding);
  13443. this.$markerBack.setPadding(padding);
  13444. this.$loop.schedule(this.CHANGE_FULL);
  13445. this.$updatePrintMargin();
  13446. };
  13447. this.setScrollMargin = function(top, bottom, left, right) {
  13448. var sm = this.scrollMargin;
  13449. sm.top = top|0;
  13450. sm.bottom = bottom|0;
  13451. sm.right = right|0;
  13452. sm.left = left|0;
  13453. sm.v = sm.top + sm.bottom;
  13454. sm.h = sm.left + sm.right;
  13455. if (sm.top && this.scrollTop <= 0 && this.session)
  13456. this.session.setScrollTop(-sm.top);
  13457. this.updateFull();
  13458. };
  13459. this.getHScrollBarAlwaysVisible = function() {
  13460. return this.$hScrollBarAlwaysVisible;
  13461. };
  13462. this.setHScrollBarAlwaysVisible = function(alwaysVisible) {
  13463. this.setOption("hScrollBarAlwaysVisible", alwaysVisible);
  13464. };
  13465. this.getVScrollBarAlwaysVisible = function() {
  13466. return this.$vScrollBarAlwaysVisible;
  13467. };
  13468. this.setVScrollBarAlwaysVisible = function(alwaysVisible) {
  13469. this.setOption("vScrollBarAlwaysVisible", alwaysVisible);
  13470. };
  13471. this.$updateScrollBarV = function() {
  13472. var scrollHeight = this.layerConfig.maxHeight;
  13473. var scrollerHeight = this.$size.scrollerHeight;
  13474. if (!this.$maxLines && this.$scrollPastEnd) {
  13475. scrollHeight -= (scrollerHeight - this.lineHeight) * this.$scrollPastEnd;
  13476. if (this.scrollTop > scrollHeight - scrollerHeight) {
  13477. scrollHeight = this.scrollTop + scrollerHeight;
  13478. this.scrollBarV.scrollTop = null;
  13479. }
  13480. }
  13481. this.scrollBarV.setScrollHeight(scrollHeight + this.scrollMargin.v);
  13482. this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top);
  13483. };
  13484. this.$updateScrollBarH = function() {
  13485. this.scrollBarH.setScrollWidth(this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h);
  13486. this.scrollBarH.setScrollLeft(this.scrollLeft + this.scrollMargin.left);
  13487. };
  13488. this.$frozen = false;
  13489. this.freeze = function() {
  13490. this.$frozen = true;
  13491. };
  13492. this.unfreeze = function() {
  13493. this.$frozen = false;
  13494. };
  13495. this.$renderChanges = function(changes, force) {
  13496. if (this.$changes) {
  13497. changes |= this.$changes;
  13498. this.$changes = 0;
  13499. }
  13500. if ((!this.session || !this.container.offsetWidth || this.$frozen) || (!changes && !force)) {
  13501. this.$changes |= changes;
  13502. return;
  13503. }
  13504. if (this.$size.$dirty) {
  13505. this.$changes |= changes;
  13506. return this.onResize(true);
  13507. }
  13508. if (!this.lineHeight) {
  13509. this.$textLayer.checkForSizeChanges();
  13510. }
  13511. this._signal("beforeRender");
  13512. var config = this.layerConfig;
  13513. if (changes & this.CHANGE_FULL ||
  13514. changes & this.CHANGE_SIZE ||
  13515. changes & this.CHANGE_TEXT ||
  13516. changes & this.CHANGE_LINES ||
  13517. changes & this.CHANGE_SCROLL ||
  13518. changes & this.CHANGE_H_SCROLL
  13519. ) {
  13520. changes |= this.$computeLayerConfig();
  13521. if (config.firstRow != this.layerConfig.firstRow && config.firstRowScreen == this.layerConfig.firstRowScreen) {
  13522. var st = this.scrollTop + (config.firstRow - this.layerConfig.firstRow) * this.lineHeight;
  13523. if (st > 0) {
  13524. this.scrollTop = st;
  13525. changes = changes | this.CHANGE_SCROLL;
  13526. changes |= this.$computeLayerConfig();
  13527. }
  13528. }
  13529. config = this.layerConfig;
  13530. this.$updateScrollBarV();
  13531. if (changes & this.CHANGE_H_SCROLL)
  13532. this.$updateScrollBarH();
  13533. this.$gutterLayer.element.style.marginTop = (-config.offset) + "px";
  13534. this.content.style.marginTop = (-config.offset) + "px";
  13535. this.content.style.width = config.width + 2 * this.$padding + "px";
  13536. this.content.style.height = config.minHeight + "px";
  13537. }
  13538. if (changes & this.CHANGE_H_SCROLL) {
  13539. this.content.style.marginLeft = -this.scrollLeft + "px";
  13540. this.scroller.className = this.scrollLeft <= 0 ? "ace_scroller" : "ace_scroller ace_scroll-left";
  13541. }
  13542. if (changes & this.CHANGE_FULL) {
  13543. this.$textLayer.update(config);
  13544. if (this.$showGutter)
  13545. this.$gutterLayer.update(config);
  13546. this.$markerBack.update(config);
  13547. this.$markerFront.update(config);
  13548. this.$cursorLayer.update(config);
  13549. this.$moveTextAreaToCursor();
  13550. this.$highlightGutterLine && this.$updateGutterLineHighlight();
  13551. this._signal("afterRender");
  13552. return;
  13553. }
  13554. if (changes & this.CHANGE_SCROLL) {
  13555. if (changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES)
  13556. this.$textLayer.update(config);
  13557. else
  13558. this.$textLayer.scrollLines(config);
  13559. if (this.$showGutter)
  13560. this.$gutterLayer.update(config);
  13561. this.$markerBack.update(config);
  13562. this.$markerFront.update(config);
  13563. this.$cursorLayer.update(config);
  13564. this.$highlightGutterLine && this.$updateGutterLineHighlight();
  13565. this.$moveTextAreaToCursor();
  13566. this._signal("afterRender");
  13567. return;
  13568. }
  13569. if (changes & this.CHANGE_TEXT) {
  13570. this.$textLayer.update(config);
  13571. if (this.$showGutter)
  13572. this.$gutterLayer.update(config);
  13573. }
  13574. else if (changes & this.CHANGE_LINES) {
  13575. if (this.$updateLines() || (changes & this.CHANGE_GUTTER) && this.$showGutter)
  13576. this.$gutterLayer.update(config);
  13577. }
  13578. else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) {
  13579. if (this.$showGutter)
  13580. this.$gutterLayer.update(config);
  13581. }
  13582. if (changes & this.CHANGE_CURSOR) {
  13583. this.$cursorLayer.update(config);
  13584. this.$moveTextAreaToCursor();
  13585. this.$highlightGutterLine && this.$updateGutterLineHighlight();
  13586. }
  13587. if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) {
  13588. this.$markerFront.update(config);
  13589. }
  13590. if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) {
  13591. this.$markerBack.update(config);
  13592. }
  13593. this._signal("afterRender");
  13594. };
  13595. this.$autosize = function() {
  13596. var height = this.session.getScreenLength() * this.lineHeight;
  13597. var maxHeight = this.$maxLines * this.lineHeight;
  13598. var desiredHeight = Math.max(
  13599. (this.$minLines||1) * this.lineHeight,
  13600. Math.min(maxHeight, height)
  13601. ) + this.scrollMargin.v + (this.$extraHeight || 0);
  13602. var vScroll = height > maxHeight;
  13603. if (desiredHeight != this.desiredHeight ||
  13604. this.$size.height != this.desiredHeight || vScroll != this.$vScroll) {
  13605. if (vScroll != this.$vScroll) {
  13606. this.$vScroll = vScroll;
  13607. this.scrollBarV.setVisible(vScroll);
  13608. }
  13609. var w = this.container.clientWidth;
  13610. this.container.style.height = desiredHeight + "px";
  13611. this.$updateCachedSize(true, this.$gutterWidth, w, desiredHeight);
  13612. this.desiredHeight = desiredHeight;
  13613. this._signal("autosize");
  13614. }
  13615. };
  13616. this.$computeLayerConfig = function() {
  13617. if (this.$maxLines && this.lineHeight > 1)
  13618. this.$autosize();
  13619. var session = this.session;
  13620. var size = this.$size;
  13621. var hideScrollbars = size.height <= 2 * this.lineHeight;
  13622. var screenLines = this.session.getScreenLength();
  13623. var maxHeight = screenLines * this.lineHeight;
  13624. var offset = this.scrollTop % this.lineHeight;
  13625. var minHeight = size.scrollerHeight + this.lineHeight;
  13626. var longestLine = this.$getLongestLine();
  13627. var horizScroll = !hideScrollbars && (this.$hScrollBarAlwaysVisible ||
  13628. size.scrollerWidth - longestLine - 2 * this.$padding < 0);
  13629. var hScrollChanged = this.$horizScroll !== horizScroll;
  13630. if (hScrollChanged) {
  13631. this.$horizScroll = horizScroll;
  13632. this.scrollBarH.setVisible(horizScroll);
  13633. }
  13634. var scrollPastEnd = !this.$maxLines && this.$scrollPastEnd
  13635. ? (size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd
  13636. : 0;
  13637. maxHeight += scrollPastEnd;
  13638. this.session.setScrollTop(Math.max(-this.scrollMargin.top,
  13639. Math.min(this.scrollTop, maxHeight - size.scrollerHeight + this.scrollMargin.bottom)));
  13640. this.session.setScrollLeft(Math.max(-this.scrollMargin.left, Math.min(this.scrollLeft,
  13641. longestLine + 2 * this.$padding - size.scrollerWidth + this.scrollMargin.right)));
  13642. var vScroll = !hideScrollbars && (this.$vScrollBarAlwaysVisible ||
  13643. size.scrollerHeight - maxHeight + scrollPastEnd < 0 || this.scrollTop);
  13644. var vScrollChanged = this.$vScroll !== vScroll;
  13645. if (vScrollChanged) {
  13646. this.$vScroll = vScroll;
  13647. this.scrollBarV.setVisible(vScroll);
  13648. }
  13649. var lineCount = Math.ceil(minHeight / this.lineHeight) - 1;
  13650. var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight));
  13651. var lastRow = firstRow + lineCount;
  13652. var firstRowScreen, firstRowHeight;
  13653. var lineHeight = this.lineHeight;
  13654. firstRow = session.screenToDocumentRow(firstRow, 0);
  13655. var foldLine = session.getFoldLine(firstRow);
  13656. if (foldLine) {
  13657. firstRow = foldLine.start.row;
  13658. }
  13659. firstRowScreen = session.documentToScreenRow(firstRow, 0);
  13660. firstRowHeight = session.getRowLength(firstRow) * lineHeight;
  13661. lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1);
  13662. minHeight = size.scrollerHeight + session.getRowLength(lastRow) * lineHeight +
  13663. firstRowHeight;
  13664. offset = this.scrollTop - firstRowScreen * lineHeight;
  13665. var changes = 0;
  13666. if (this.layerConfig.width != longestLine)
  13667. changes = this.CHANGE_H_SCROLL;
  13668. if (hScrollChanged || vScrollChanged) {
  13669. changes = this.$updateCachedSize(true, this.gutterWidth, size.width, size.height);
  13670. this._signal("scrollbarVisibilityChanged");
  13671. if (vScrollChanged)
  13672. longestLine = this.$getLongestLine();
  13673. }
  13674. this.layerConfig = {
  13675. width : longestLine,
  13676. padding : this.$padding,
  13677. firstRow : firstRow,
  13678. firstRowScreen: firstRowScreen,
  13679. lastRow : lastRow,
  13680. lineHeight : lineHeight,
  13681. characterWidth : this.characterWidth,
  13682. minHeight : minHeight,
  13683. maxHeight : maxHeight,
  13684. offset : offset,
  13685. gutterOffset : Math.max(0, Math.ceil((offset + size.height - size.scrollerHeight) / lineHeight)),
  13686. height : this.$size.scrollerHeight
  13687. };
  13688. return changes;
  13689. };
  13690. this.$updateLines = function() {
  13691. var firstRow = this.$changedLines.firstRow;
  13692. var lastRow = this.$changedLines.lastRow;
  13693. this.$changedLines = null;
  13694. var layerConfig = this.layerConfig;
  13695. if (firstRow > layerConfig.lastRow + 1) { return; }
  13696. if (lastRow < layerConfig.firstRow) { return; }
  13697. if (lastRow === Infinity) {
  13698. if (this.$showGutter)
  13699. this.$gutterLayer.update(layerConfig);
  13700. this.$textLayer.update(layerConfig);
  13701. return;
  13702. }
  13703. this.$textLayer.updateLines(layerConfig, firstRow, lastRow);
  13704. return true;
  13705. };
  13706. this.$getLongestLine = function() {
  13707. var charCount = this.session.getScreenWidth();
  13708. if (this.showInvisibles && !this.session.$useWrapMode)
  13709. charCount += 1;
  13710. return Math.max(this.$size.scrollerWidth - 2 * this.$padding, Math.round(charCount * this.characterWidth));
  13711. };
  13712. this.updateFrontMarkers = function() {
  13713. this.$markerFront.setMarkers(this.session.getMarkers(true));
  13714. this.$loop.schedule(this.CHANGE_MARKER_FRONT);
  13715. };
  13716. this.updateBackMarkers = function() {
  13717. this.$markerBack.setMarkers(this.session.getMarkers());
  13718. this.$loop.schedule(this.CHANGE_MARKER_BACK);
  13719. };
  13720. this.addGutterDecoration = function(row, className){
  13721. this.$gutterLayer.addGutterDecoration(row, className);
  13722. };
  13723. this.removeGutterDecoration = function(row, className){
  13724. this.$gutterLayer.removeGutterDecoration(row, className);
  13725. };
  13726. this.updateBreakpoints = function(rows) {
  13727. this.$loop.schedule(this.CHANGE_GUTTER);
  13728. };
  13729. this.setAnnotations = function(annotations) {
  13730. this.$gutterLayer.setAnnotations(annotations);
  13731. this.$loop.schedule(this.CHANGE_GUTTER);
  13732. };
  13733. this.updateCursor = function() {
  13734. this.$loop.schedule(this.CHANGE_CURSOR);
  13735. };
  13736. this.hideCursor = function() {
  13737. this.$cursorLayer.hideCursor();
  13738. };
  13739. this.showCursor = function() {
  13740. this.$cursorLayer.showCursor();
  13741. };
  13742. this.scrollSelectionIntoView = function(anchor, lead, offset) {
  13743. this.scrollCursorIntoView(anchor, offset);
  13744. this.scrollCursorIntoView(lead, offset);
  13745. };
  13746. this.scrollCursorIntoView = function(cursor, offset, $viewMargin) {
  13747. if (this.$size.scrollerHeight === 0)
  13748. return;
  13749. var pos = this.$cursorLayer.getPixelPosition(cursor);
  13750. var left = pos.left;
  13751. var top = pos.top;
  13752. var topMargin = $viewMargin && $viewMargin.top || 0;
  13753. var bottomMargin = $viewMargin && $viewMargin.bottom || 0;
  13754. var scrollTop = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop;
  13755. if (scrollTop + topMargin > top) {
  13756. if (offset)
  13757. top -= offset * this.$size.scrollerHeight;
  13758. if (top === 0)
  13759. top = -this.scrollMargin.top;
  13760. this.session.setScrollTop(top);
  13761. } else if (scrollTop + this.$size.scrollerHeight - bottomMargin < top + this.lineHeight) {
  13762. if (offset)
  13763. top += offset * this.$size.scrollerHeight;
  13764. this.session.setScrollTop(top + this.lineHeight - this.$size.scrollerHeight);
  13765. }
  13766. var scrollLeft = this.scrollLeft;
  13767. if (scrollLeft > left) {
  13768. if (left < this.$padding + 2 * this.layerConfig.characterWidth)
  13769. left = -this.scrollMargin.left;
  13770. this.session.setScrollLeft(left);
  13771. } else if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) {
  13772. this.session.setScrollLeft(Math.round(left + this.characterWidth - this.$size.scrollerWidth));
  13773. } else if (scrollLeft <= this.$padding && left - scrollLeft < this.characterWidth) {
  13774. this.session.setScrollLeft(0);
  13775. }
  13776. };
  13777. this.getScrollTop = function() {
  13778. return this.session.getScrollTop();
  13779. };
  13780. this.getScrollLeft = function() {
  13781. return this.session.getScrollLeft();
  13782. };
  13783. this.getScrollTopRow = function() {
  13784. return this.scrollTop / this.lineHeight;
  13785. };
  13786. this.getScrollBottomRow = function() {
  13787. return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1);
  13788. };
  13789. this.scrollToRow = function(row) {
  13790. this.session.setScrollTop(row * this.lineHeight);
  13791. };
  13792. this.alignCursor = function(cursor, alignment) {
  13793. if (typeof cursor == "number")
  13794. cursor = {row: cursor, column: 0};
  13795. var pos = this.$cursorLayer.getPixelPosition(cursor);
  13796. var h = this.$size.scrollerHeight - this.lineHeight;
  13797. var offset = pos.top - h * (alignment || 0);
  13798. this.session.setScrollTop(offset);
  13799. return offset;
  13800. };
  13801. this.STEPS = 8;
  13802. this.$calcSteps = function(fromValue, toValue){
  13803. var i = 0;
  13804. var l = this.STEPS;
  13805. var steps = [];
  13806. var func = function(t, x_min, dx) {
  13807. return dx * (Math.pow(t - 1, 3) + 1) + x_min;
  13808. };
  13809. for (i = 0; i < l; ++i)
  13810. steps.push(func(i / this.STEPS, fromValue, toValue - fromValue));
  13811. return steps;
  13812. };
  13813. this.scrollToLine = function(line, center, animate, callback) {
  13814. var pos = this.$cursorLayer.getPixelPosition({row: line, column: 0});
  13815. var offset = pos.top;
  13816. if (center)
  13817. offset -= this.$size.scrollerHeight / 2;
  13818. var initialScroll = this.scrollTop;
  13819. this.session.setScrollTop(offset);
  13820. if (animate !== false)
  13821. this.animateScrolling(initialScroll, callback);
  13822. };
  13823. this.animateScrolling = function(fromValue, callback) {
  13824. var toValue = this.scrollTop;
  13825. if (!this.$animatedScroll)
  13826. return;
  13827. var _self = this;
  13828. if (fromValue == toValue)
  13829. return;
  13830. if (this.$scrollAnimation) {
  13831. var oldSteps = this.$scrollAnimation.steps;
  13832. if (oldSteps.length) {
  13833. fromValue = oldSteps[0];
  13834. if (fromValue == toValue)
  13835. return;
  13836. }
  13837. }
  13838. var steps = _self.$calcSteps(fromValue, toValue);
  13839. this.$scrollAnimation = {from: fromValue, to: toValue, steps: steps};
  13840. clearInterval(this.$timer);
  13841. _self.session.setScrollTop(steps.shift());
  13842. _self.session.$scrollTop = toValue;
  13843. this.$timer = setInterval(function() {
  13844. if (steps.length) {
  13845. _self.session.setScrollTop(steps.shift());
  13846. _self.session.$scrollTop = toValue;
  13847. } else if (toValue != null) {
  13848. _self.session.$scrollTop = -1;
  13849. _self.session.setScrollTop(toValue);
  13850. toValue = null;
  13851. } else {
  13852. _self.$timer = clearInterval(_self.$timer);
  13853. _self.$scrollAnimation = null;
  13854. callback && callback();
  13855. }
  13856. }, 10);
  13857. };
  13858. this.scrollToY = function(scrollTop) {
  13859. if (this.scrollTop !== scrollTop) {
  13860. this.$loop.schedule(this.CHANGE_SCROLL);
  13861. this.scrollTop = scrollTop;
  13862. }
  13863. };
  13864. this.scrollToX = function(scrollLeft) {
  13865. if (this.scrollLeft !== scrollLeft)
  13866. this.scrollLeft = scrollLeft;
  13867. this.$loop.schedule(this.CHANGE_H_SCROLL);
  13868. };
  13869. this.scrollTo = function(x, y) {
  13870. this.session.setScrollTop(y);
  13871. this.session.setScrollLeft(y);
  13872. };
  13873. this.scrollBy = function(deltaX, deltaY) {
  13874. deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY);
  13875. deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX);
  13876. };
  13877. this.isScrollableBy = function(deltaX, deltaY) {
  13878. if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top)
  13879. return true;
  13880. if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight
  13881. - this.layerConfig.maxHeight < -1 + this.scrollMargin.bottom)
  13882. return true;
  13883. if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left)
  13884. return true;
  13885. if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth
  13886. - this.layerConfig.width < -1 + this.scrollMargin.right)
  13887. return true;
  13888. };
  13889. this.pixelToScreenCoordinates = function(x, y) {
  13890. var canvasPos = this.scroller.getBoundingClientRect();
  13891. var offset = (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth;
  13892. var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight);
  13893. var col = Math.round(offset);
  13894. return {row: row, column: col, side: offset - col > 0 ? 1 : -1};
  13895. };
  13896. this.screenToTextCoordinates = function(x, y) {
  13897. var canvasPos = this.scroller.getBoundingClientRect();
  13898. var col = Math.round(
  13899. (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth
  13900. );
  13901. var row = (y + this.scrollTop - canvasPos.top) / this.lineHeight;
  13902. return this.session.screenToDocumentPosition(row, Math.max(col, 0));
  13903. };
  13904. this.textToScreenCoordinates = function(row, column) {
  13905. var canvasPos = this.scroller.getBoundingClientRect();
  13906. var pos = this.session.documentToScreenPosition(row, column);
  13907. var x = this.$padding + Math.round(pos.column * this.characterWidth);
  13908. var y = pos.row * this.lineHeight;
  13909. return {
  13910. pageX: canvasPos.left + x - this.scrollLeft,
  13911. pageY: canvasPos.top + y - this.scrollTop
  13912. };
  13913. };
  13914. this.visualizeFocus = function() {
  13915. dom.addCssClass(this.container, "ace_focus");
  13916. };
  13917. this.visualizeBlur = function() {
  13918. dom.removeCssClass(this.container, "ace_focus");
  13919. };
  13920. this.showComposition = function(position) {
  13921. if (!this.$composition)
  13922. this.$composition = {
  13923. keepTextAreaAtCursor: this.$keepTextAreaAtCursor,
  13924. cssText: this.textarea.style.cssText
  13925. };
  13926. this.$keepTextAreaAtCursor = true;
  13927. dom.addCssClass(this.textarea, "ace_composition");
  13928. this.textarea.style.cssText = "";
  13929. this.$moveTextAreaToCursor();
  13930. };
  13931. this.setCompositionText = function(text) {
  13932. this.$moveTextAreaToCursor();
  13933. };
  13934. this.hideComposition = function() {
  13935. if (!this.$composition)
  13936. return;
  13937. dom.removeCssClass(this.textarea, "ace_composition");
  13938. this.$keepTextAreaAtCursor = this.$composition.keepTextAreaAtCursor;
  13939. this.textarea.style.cssText = this.$composition.cssText;
  13940. this.$composition = null;
  13941. };
  13942. this.setTheme = function(theme, cb) {
  13943. var _self = this;
  13944. this.$themeId = theme;
  13945. _self._dispatchEvent('themeChange',{theme:theme});
  13946. if (!theme || typeof theme == "string") {
  13947. var moduleName = theme || this.$options.theme.initialValue;
  13948. config.loadModule(["theme", moduleName], afterLoad);
  13949. } else {
  13950. afterLoad(theme);
  13951. }
  13952. function afterLoad(module) {
  13953. if (_self.$themeId != theme)
  13954. return cb && cb();
  13955. if (!module.cssClass)
  13956. return;
  13957. dom.importCssString(
  13958. module.cssText,
  13959. module.cssClass,
  13960. _self.container.ownerDocument
  13961. );
  13962. if (_self.theme)
  13963. dom.removeCssClass(_self.container, _self.theme.cssClass);
  13964. var padding = "padding" in module ? module.padding
  13965. : "padding" in (_self.theme || {}) ? 4 : _self.$padding;
  13966. if (_self.$padding && padding != _self.$padding)
  13967. _self.setPadding(padding);
  13968. _self.$theme = module.cssClass;
  13969. _self.theme = module;
  13970. dom.addCssClass(_self.container, module.cssClass);
  13971. dom.setCssClass(_self.container, "ace_dark", module.isDark);
  13972. if (_self.$size) {
  13973. _self.$size.width = 0;
  13974. _self.$updateSizeAsync();
  13975. }
  13976. _self._dispatchEvent('themeLoaded', {theme:module});
  13977. cb && cb();
  13978. }
  13979. };
  13980. this.getTheme = function() {
  13981. return this.$themeId;
  13982. };
  13983. this.setStyle = function(style, include) {
  13984. dom.setCssClass(this.container, style, include !== false);
  13985. };
  13986. this.unsetStyle = function(style) {
  13987. dom.removeCssClass(this.container, style);
  13988. };
  13989. this.setCursorStyle = function(style) {
  13990. if (this.scroller.style.cursor != style)
  13991. this.scroller.style.cursor = style;
  13992. };
  13993. this.setMouseCursor = function(cursorStyle) {
  13994. this.scroller.style.cursor = cursorStyle;
  13995. };
  13996. this.destroy = function() {
  13997. this.$textLayer.destroy();
  13998. this.$cursorLayer.destroy();
  13999. };
  14000. }).call(VirtualRenderer.prototype);
  14001. config.defineOptions(VirtualRenderer.prototype, "renderer", {
  14002. animatedScroll: {initialValue: false},
  14003. showInvisibles: {
  14004. set: function(value) {
  14005. if (this.$textLayer.setShowInvisibles(value))
  14006. this.$loop.schedule(this.CHANGE_TEXT);
  14007. },
  14008. initialValue: false
  14009. },
  14010. showPrintMargin: {
  14011. set: function() { this.$updatePrintMargin(); },
  14012. initialValue: true
  14013. },
  14014. printMarginColumn: {
  14015. set: function() { this.$updatePrintMargin(); },
  14016. initialValue: 80
  14017. },
  14018. printMargin: {
  14019. set: function(val) {
  14020. if (typeof val == "number")
  14021. this.$printMarginColumn = val;
  14022. this.$showPrintMargin = !!val;
  14023. this.$updatePrintMargin();
  14024. },
  14025. get: function() {
  14026. return this.$showPrintMargin && this.$printMarginColumn;
  14027. }
  14028. },
  14029. showGutter: {
  14030. set: function(show){
  14031. this.$gutter.style.display = show ? "block" : "none";
  14032. this.$loop.schedule(this.CHANGE_FULL);
  14033. this.onGutterResize();
  14034. },
  14035. initialValue: true
  14036. },
  14037. fadeFoldWidgets: {
  14038. set: function(show) {
  14039. dom.setCssClass(this.$gutter, "ace_fade-fold-widgets", show);
  14040. },
  14041. initialValue: false
  14042. },
  14043. showFoldWidgets: {
  14044. set: function(show) {this.$gutterLayer.setShowFoldWidgets(show)},
  14045. initialValue: true
  14046. },
  14047. showLineNumbers: {
  14048. set: function(show) {
  14049. this.$gutterLayer.setShowLineNumbers(show);
  14050. this.$loop.schedule(this.CHANGE_GUTTER);
  14051. },
  14052. initialValue: true
  14053. },
  14054. displayIndentGuides: {
  14055. set: function(show) {
  14056. if (this.$textLayer.setDisplayIndentGuides(show))
  14057. this.$loop.schedule(this.CHANGE_TEXT);
  14058. },
  14059. initialValue: true
  14060. },
  14061. highlightGutterLine: {
  14062. set: function(shouldHighlight) {
  14063. if (!this.$gutterLineHighlight) {
  14064. this.$gutterLineHighlight = dom.createElement("div");
  14065. this.$gutterLineHighlight.className = "ace_gutter-active-line";
  14066. this.$gutter.appendChild(this.$gutterLineHighlight);
  14067. return;
  14068. }
  14069. this.$gutterLineHighlight.style.display = shouldHighlight ? "" : "none";
  14070. if (this.$cursorLayer.$pixelPos)
  14071. this.$updateGutterLineHighlight();
  14072. },
  14073. initialValue: false,
  14074. value: true
  14075. },
  14076. hScrollBarAlwaysVisible: {
  14077. set: function(val) {
  14078. if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll)
  14079. this.$loop.schedule(this.CHANGE_SCROLL);
  14080. },
  14081. initialValue: false
  14082. },
  14083. vScrollBarAlwaysVisible: {
  14084. set: function(val) {
  14085. if (!this.$vScrollBarAlwaysVisible || !this.$vScroll)
  14086. this.$loop.schedule(this.CHANGE_SCROLL);
  14087. },
  14088. initialValue: false
  14089. },
  14090. fontSize: {
  14091. set: function(size) {
  14092. if (typeof size == "number")
  14093. size = size + "px";
  14094. this.container.style.fontSize = size;
  14095. this.updateFontSize();
  14096. },
  14097. initialValue: 12
  14098. },
  14099. fontFamily: {
  14100. set: function(name) {
  14101. this.container.style.fontFamily = name;
  14102. this.updateFontSize();
  14103. }
  14104. },
  14105. maxLines: {
  14106. set: function(val) {
  14107. this.updateFull();
  14108. }
  14109. },
  14110. minLines: {
  14111. set: function(val) {
  14112. this.updateFull();
  14113. }
  14114. },
  14115. scrollPastEnd: {
  14116. set: function(val) {
  14117. val = +val || 0;
  14118. if (this.$scrollPastEnd == val)
  14119. return;
  14120. this.$scrollPastEnd = val;
  14121. this.$loop.schedule(this.CHANGE_SCROLL);
  14122. },
  14123. initialValue: 0,
  14124. handlesSet: true
  14125. },
  14126. fixedWidthGutter: {
  14127. set: function(val) {
  14128. this.$gutterLayer.$fixedWidth = !!val;
  14129. this.$loop.schedule(this.CHANGE_GUTTER);
  14130. }
  14131. },
  14132. theme: {
  14133. set: function(val) { this.setTheme(val) },
  14134. get: function() { return this.$themeId || this.theme; },
  14135. initialValue: "./theme/textmate",
  14136. handlesSet: true
  14137. }
  14138. });
  14139. exports.VirtualRenderer = VirtualRenderer;
  14140. });
  14141. ace.define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/net","ace/lib/event_emitter","ace/config"], function(require, exports, module) {
  14142. "use strict";
  14143. var oop = require("../lib/oop");
  14144. var net = require("../lib/net");
  14145. var EventEmitter = require("../lib/event_emitter").EventEmitter;
  14146. var config = require("../config");
  14147. var WorkerClient = function(topLevelNamespaces, mod, classname, workerUrl) {
  14148. this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);
  14149. this.changeListener = this.changeListener.bind(this);
  14150. this.onMessage = this.onMessage.bind(this);
  14151. if (require.nameToUrl && !require.toUrl)
  14152. require.toUrl = require.nameToUrl;
  14153. if (config.get("packaged") || !require.toUrl) {
  14154. workerUrl = workerUrl || config.moduleUrl(mod, "worker");
  14155. } else {
  14156. var normalizePath = this.$normalizePath;
  14157. workerUrl = workerUrl || normalizePath(require.toUrl("ace/worker/worker.js", null, "_"));
  14158. var tlns = {};
  14159. topLevelNamespaces.forEach(function(ns) {
  14160. tlns[ns] = normalizePath(require.toUrl(ns, null, "_").replace(/(\.js)?(\?.*)?$/, ""));
  14161. });
  14162. }
  14163. try {
  14164. this.$worker = new Worker(workerUrl);
  14165. } catch(e) {
  14166. if (e instanceof window.DOMException) {
  14167. var blob = this.$workerBlob(workerUrl);
  14168. var URL = window.URL || window.webkitURL;
  14169. var blobURL = URL.createObjectURL(blob);
  14170. this.$worker = new Worker(blobURL);
  14171. URL.revokeObjectURL(blobURL);
  14172. } else {
  14173. throw e;
  14174. }
  14175. }
  14176. this.$worker.postMessage({
  14177. init : true,
  14178. tlns : tlns,
  14179. module : mod,
  14180. classname : classname
  14181. });
  14182. this.callbackId = 1;
  14183. this.callbacks = {};
  14184. this.$worker.onmessage = this.onMessage;
  14185. };
  14186. (function(){
  14187. oop.implement(this, EventEmitter);
  14188. this.onMessage = function(e) {
  14189. var msg = e.data;
  14190. switch(msg.type) {
  14191. case "event":
  14192. this._signal(msg.name, {data: msg.data});
  14193. break;
  14194. case "call":
  14195. var callback = this.callbacks[msg.id];
  14196. if (callback) {
  14197. callback(msg.data);
  14198. delete this.callbacks[msg.id];
  14199. }
  14200. break;
  14201. case "error":
  14202. this.reportError(msg.data);
  14203. break;
  14204. case "log":
  14205. window.console && console.log && console.log.apply(console, msg.data);
  14206. break;
  14207. }
  14208. };
  14209. this.reportError = function(err) {
  14210. window.console && console.error && console.error(err);
  14211. };
  14212. this.$normalizePath = function(path) {
  14213. return net.qualifyURL(path);
  14214. };
  14215. this.terminate = function() {
  14216. this._signal("terminate", {});
  14217. this.deltaQueue = null;
  14218. this.$worker.terminate();
  14219. this.$worker = null;
  14220. if (this.$doc)
  14221. this.$doc.off("change", this.changeListener);
  14222. this.$doc = null;
  14223. };
  14224. this.send = function(cmd, args) {
  14225. this.$worker.postMessage({command: cmd, args: args});
  14226. };
  14227. this.call = function(cmd, args, callback) {
  14228. if (callback) {
  14229. var id = this.callbackId++;
  14230. this.callbacks[id] = callback;
  14231. args.push(id);
  14232. }
  14233. this.send(cmd, args);
  14234. };
  14235. this.emit = function(event, data) {
  14236. try {
  14237. this.$worker.postMessage({event: event, data: {data: data.data}});
  14238. }
  14239. catch(ex) {
  14240. console.error(ex.stack);
  14241. }
  14242. };
  14243. this.attachToDocument = function(doc) {
  14244. if(this.$doc)
  14245. this.terminate();
  14246. this.$doc = doc;
  14247. this.call("setValue", [doc.getValue()]);
  14248. doc.on("change", this.changeListener);
  14249. };
  14250. this.changeListener = function(e) {
  14251. if (!this.deltaQueue) {
  14252. this.deltaQueue = [e.data];
  14253. setTimeout(this.$sendDeltaQueue, 0);
  14254. } else
  14255. this.deltaQueue.push(e.data);
  14256. };
  14257. this.$sendDeltaQueue = function() {
  14258. var q = this.deltaQueue;
  14259. if (!q) return;
  14260. this.deltaQueue = null;
  14261. if (q.length > 20 && q.length > this.$doc.getLength() >> 1) {
  14262. this.call("setValue", [this.$doc.getValue()]);
  14263. } else
  14264. this.emit("change", {data: q});
  14265. };
  14266. this.$workerBlob = function(workerUrl) {
  14267. var script = "importScripts('" + net.qualifyURL(workerUrl) + "');";
  14268. try {
  14269. return new Blob([script], {"type": "application/javascript"});
  14270. } catch (e) { // Backwards-compatibility
  14271. var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;
  14272. var blobBuilder = new BlobBuilder();
  14273. blobBuilder.append(script);
  14274. return blobBuilder.getBlob("application/javascript");
  14275. }
  14276. };
  14277. }).call(WorkerClient.prototype);
  14278. var UIWorkerClient = function(topLevelNamespaces, mod, classname) {
  14279. this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);
  14280. this.changeListener = this.changeListener.bind(this);
  14281. this.callbackId = 1;
  14282. this.callbacks = {};
  14283. this.messageBuffer = [];
  14284. var main = null;
  14285. var emitSync = false;
  14286. var sender = Object.create(EventEmitter);
  14287. var _self = this;
  14288. this.$worker = {};
  14289. this.$worker.terminate = function() {};
  14290. this.$worker.postMessage = function(e) {
  14291. _self.messageBuffer.push(e);
  14292. if (main) {
  14293. if (emitSync)
  14294. setTimeout(processNext);
  14295. else
  14296. processNext();
  14297. }
  14298. };
  14299. this.setEmitSync = function(val) { emitSync = val };
  14300. var processNext = function() {
  14301. var msg = _self.messageBuffer.shift();
  14302. if (msg.command)
  14303. main[msg.command].apply(main, msg.args);
  14304. else if (msg.event)
  14305. sender._signal(msg.event, msg.data);
  14306. };
  14307. sender.postMessage = function(msg) {
  14308. _self.onMessage({data: msg});
  14309. };
  14310. sender.callback = function(data, callbackId) {
  14311. this.postMessage({type: "call", id: callbackId, data: data});
  14312. };
  14313. sender.emit = function(name, data) {
  14314. this.postMessage({type: "event", name: name, data: data});
  14315. };
  14316. config.loadModule(["worker", mod], function(Main) {
  14317. main = new Main[classname](sender);
  14318. while (_self.messageBuffer.length)
  14319. processNext();
  14320. });
  14321. };
  14322. UIWorkerClient.prototype = WorkerClient.prototype;
  14323. exports.UIWorkerClient = UIWorkerClient;
  14324. exports.WorkerClient = WorkerClient;
  14325. });
  14326. ace.define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"], function(require, exports, module) {
  14327. "use strict";
  14328. var Range = require("./range").Range;
  14329. var EventEmitter = require("./lib/event_emitter").EventEmitter;
  14330. var oop = require("./lib/oop");
  14331. var PlaceHolder = function(session, length, pos, others, mainClass, othersClass) {
  14332. var _self = this;
  14333. this.length = length;
  14334. this.session = session;
  14335. this.doc = session.getDocument();
  14336. this.mainClass = mainClass;
  14337. this.othersClass = othersClass;
  14338. this.$onUpdate = this.onUpdate.bind(this);
  14339. this.doc.on("change", this.$onUpdate);
  14340. this.$others = others;
  14341. this.$onCursorChange = function() {
  14342. setTimeout(function() {
  14343. _self.onCursorChange();
  14344. });
  14345. };
  14346. this.$pos = pos;
  14347. var undoStack = session.getUndoManager().$undoStack || session.getUndoManager().$undostack || {length: -1};
  14348. this.$undoStackDepth = undoStack.length;
  14349. this.setup();
  14350. session.selection.on("changeCursor", this.$onCursorChange);
  14351. };
  14352. (function() {
  14353. oop.implement(this, EventEmitter);
  14354. this.setup = function() {
  14355. var _self = this;
  14356. var doc = this.doc;
  14357. var session = this.session;
  14358. var pos = this.$pos;
  14359. this.selectionBefore = session.selection.toJSON();
  14360. if (session.selection.inMultiSelectMode)
  14361. session.selection.toSingleRange();
  14362. this.pos = doc.createAnchor(pos.row, pos.column);
  14363. this.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false);
  14364. this.pos.on("change", function(event) {
  14365. session.removeMarker(_self.markerId);
  14366. _self.markerId = session.addMarker(new Range(event.value.row, event.value.column, event.value.row, event.value.column+_self.length), _self.mainClass, null, false);
  14367. });
  14368. this.others = [];
  14369. this.$others.forEach(function(other) {
  14370. var anchor = doc.createAnchor(other.row, other.column);
  14371. _self.others.push(anchor);
  14372. });
  14373. session.setUndoSelect(false);
  14374. };
  14375. this.showOtherMarkers = function() {
  14376. if(this.othersActive) return;
  14377. var session = this.session;
  14378. var _self = this;
  14379. this.othersActive = true;
  14380. this.others.forEach(function(anchor) {
  14381. anchor.markerId = session.addMarker(new Range(anchor.row, anchor.column, anchor.row, anchor.column+_self.length), _self.othersClass, null, false);
  14382. anchor.on("change", function(event) {
  14383. session.removeMarker(anchor.markerId);
  14384. anchor.markerId = session.addMarker(new Range(event.value.row, event.value.column, event.value.row, event.value.column+_self.length), _self.othersClass, null, false);
  14385. });
  14386. });
  14387. };
  14388. this.hideOtherMarkers = function() {
  14389. if(!this.othersActive) return;
  14390. this.othersActive = false;
  14391. for (var i = 0; i < this.others.length; i++) {
  14392. this.session.removeMarker(this.others[i].markerId);
  14393. }
  14394. };
  14395. this.onUpdate = function(event) {
  14396. var delta = event.data;
  14397. var range = delta.range;
  14398. if(range.start.row !== range.end.row) return;
  14399. if(range.start.row !== this.pos.row) return;
  14400. if (this.$updating) return;
  14401. this.$updating = true;
  14402. var lengthDiff = delta.action === "insertText" ? range.end.column - range.start.column : range.start.column - range.end.column;
  14403. if(range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1) {
  14404. var distanceFromStart = range.start.column - this.pos.column;
  14405. this.length += lengthDiff;
  14406. if(!this.session.$fromUndo) {
  14407. if(delta.action === "insertText") {
  14408. for (var i = this.others.length - 1; i >= 0; i--) {
  14409. var otherPos = this.others[i];
  14410. var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};
  14411. if(otherPos.row === range.start.row && range.start.column < otherPos.column)
  14412. newPos.column += lengthDiff;
  14413. this.doc.insert(newPos, delta.text);
  14414. }
  14415. } else if(delta.action === "removeText") {
  14416. for (var i = this.others.length - 1; i >= 0; i--) {
  14417. var otherPos = this.others[i];
  14418. var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};
  14419. if(otherPos.row === range.start.row && range.start.column < otherPos.column)
  14420. newPos.column += lengthDiff;
  14421. this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff));
  14422. }
  14423. }
  14424. if(range.start.column === this.pos.column && delta.action === "insertText") {
  14425. setTimeout(function() {
  14426. this.pos.setPosition(this.pos.row, this.pos.column - lengthDiff);
  14427. for (var i = 0; i < this.others.length; i++) {
  14428. var other = this.others[i];
  14429. var newPos = {row: other.row, column: other.column - lengthDiff};
  14430. if(other.row === range.start.row && range.start.column < other.column)
  14431. newPos.column += lengthDiff;
  14432. other.setPosition(newPos.row, newPos.column);
  14433. }
  14434. }.bind(this), 0);
  14435. }
  14436. else if(range.start.column === this.pos.column && delta.action === "removeText") {
  14437. setTimeout(function() {
  14438. for (var i = 0; i < this.others.length; i++) {
  14439. var other = this.others[i];
  14440. if(other.row === range.start.row && range.start.column < other.column) {
  14441. other.setPosition(other.row, other.column - lengthDiff);
  14442. }
  14443. }
  14444. }.bind(this), 0);
  14445. }
  14446. }
  14447. this.pos._emit("change", {value: this.pos});
  14448. for (var i = 0; i < this.others.length; i++) {
  14449. this.others[i]._emit("change", {value: this.others[i]});
  14450. }
  14451. }
  14452. this.$updating = false;
  14453. };
  14454. this.onCursorChange = function(event) {
  14455. if (this.$updating || !this.session) return;
  14456. var pos = this.session.selection.getCursor();
  14457. if (pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) {
  14458. this.showOtherMarkers();
  14459. this._emit("cursorEnter", event);
  14460. } else {
  14461. this.hideOtherMarkers();
  14462. this._emit("cursorLeave", event);
  14463. }
  14464. };
  14465. this.detach = function() {
  14466. this.session.removeMarker(this.markerId);
  14467. this.hideOtherMarkers();
  14468. this.doc.removeEventListener("change", this.$onUpdate);
  14469. this.session.selection.removeEventListener("changeCursor", this.$onCursorChange);
  14470. this.pos.detach();
  14471. for (var i = 0; i < this.others.length; i++) {
  14472. this.others[i].detach();
  14473. }
  14474. this.session.setUndoSelect(true);
  14475. this.session = null;
  14476. };
  14477. this.cancel = function() {
  14478. if(this.$undoStackDepth === -1)
  14479. throw Error("Canceling placeholders only supported with undo manager attached to session.");
  14480. var undoManager = this.session.getUndoManager();
  14481. var undosRequired = (undoManager.$undoStack || undoManager.$undostack).length - this.$undoStackDepth;
  14482. for (var i = 0; i < undosRequired; i++) {
  14483. undoManager.undo(true);
  14484. }
  14485. if (this.selectionBefore)
  14486. this.session.selection.fromJSON(this.selectionBefore);
  14487. };
  14488. }).call(PlaceHolder.prototype);
  14489. exports.PlaceHolder = PlaceHolder;
  14490. });
  14491. ace.define("ace/mouse/multi_select_handler",["require","exports","module","ace/lib/event","ace/lib/useragent"], function(require, exports, module) {
  14492. var event = require("../lib/event");
  14493. var useragent = require("../lib/useragent");
  14494. function isSamePoint(p1, p2) {
  14495. return p1.row == p2.row && p1.column == p2.column;
  14496. }
  14497. function onMouseDown(e) {
  14498. var ev = e.domEvent;
  14499. var alt = ev.altKey;
  14500. var shift = ev.shiftKey;
  14501. var ctrl = ev.ctrlKey;
  14502. var accel = e.getAccelKey();
  14503. var button = e.getButton();
  14504. if (ctrl && useragent.isMac)
  14505. button = ev.button;
  14506. if (e.editor.inMultiSelectMode && button == 2) {
  14507. e.editor.textInput.onContextMenu(e.domEvent);
  14508. return;
  14509. }
  14510. if (!ctrl && !alt && !accel) {
  14511. if (button === 0 && e.editor.inMultiSelectMode)
  14512. e.editor.exitMultiSelectMode();
  14513. return;
  14514. }
  14515. if (button !== 0)
  14516. return;
  14517. var editor = e.editor;
  14518. var selection = editor.selection;
  14519. var isMultiSelect = editor.inMultiSelectMode;
  14520. var pos = e.getDocumentPosition();
  14521. var cursor = selection.getCursor();
  14522. var inSelection = e.inSelection() || (selection.isEmpty() && isSamePoint(pos, cursor));
  14523. var mouseX = e.x, mouseY = e.y;
  14524. var onMouseSelection = function(e) {
  14525. mouseX = e.clientX;
  14526. mouseY = e.clientY;
  14527. };
  14528. var session = editor.session;
  14529. var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);
  14530. var screenCursor = screenAnchor;
  14531. var selectionMode;
  14532. if (editor.$mouseHandler.$enableJumpToDef) {
  14533. if (ctrl && alt || accel && alt)
  14534. selectionMode = "add";
  14535. else if (alt)
  14536. selectionMode = "block";
  14537. } else {
  14538. if (accel && !alt) {
  14539. selectionMode = "add";
  14540. if (!isMultiSelect && shift)
  14541. return;
  14542. } else if (alt) {
  14543. selectionMode = "block";
  14544. }
  14545. }
  14546. if (selectionMode && useragent.isMac && ev.ctrlKey) {
  14547. editor.$mouseHandler.cancelContextMenu();
  14548. }
  14549. if (selectionMode == "add") {
  14550. if (!isMultiSelect && inSelection)
  14551. return; // dragging
  14552. if (!isMultiSelect) {
  14553. var range = selection.toOrientedRange();
  14554. editor.addSelectionMarker(range);
  14555. }
  14556. var oldRange = selection.rangeList.rangeAtPoint(pos);
  14557. editor.$blockScrolling++;
  14558. editor.inVirtualSelectionMode = true;
  14559. if (shift) {
  14560. oldRange = null;
  14561. range = selection.ranges[0];
  14562. editor.removeSelectionMarker(range);
  14563. }
  14564. editor.once("mouseup", function() {
  14565. var tmpSel = selection.toOrientedRange();
  14566. if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor))
  14567. selection.substractPoint(tmpSel.cursor);
  14568. else {
  14569. if (shift) {
  14570. selection.substractPoint(range.cursor);
  14571. } else if (range) {
  14572. editor.removeSelectionMarker(range);
  14573. selection.addRange(range);
  14574. }
  14575. selection.addRange(tmpSel);
  14576. }
  14577. editor.$blockScrolling--;
  14578. editor.inVirtualSelectionMode = false;
  14579. });
  14580. } else if (selectionMode == "block") {
  14581. e.stop();
  14582. editor.inVirtualSelectionMode = true;
  14583. var initialRange;
  14584. var rectSel = [];
  14585. var blockSelect = function() {
  14586. var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);
  14587. var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column);
  14588. if (isSamePoint(screenCursor, newCursor) && isSamePoint(cursor, selection.lead))
  14589. return;
  14590. screenCursor = newCursor;
  14591. editor.$blockScrolling++;
  14592. editor.selection.moveToPosition(cursor);
  14593. editor.renderer.scrollCursorIntoView();
  14594. editor.removeSelectionMarkers(rectSel);
  14595. rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor);
  14596. if (editor.$mouseHandler.$clickSelection && rectSel.length == 1 && rectSel[0].isEmpty())
  14597. rectSel[0] = editor.$mouseHandler.$clickSelection.clone();
  14598. rectSel.forEach(editor.addSelectionMarker, editor);
  14599. editor.updateSelectionMarkers();
  14600. editor.$blockScrolling--;
  14601. };
  14602. editor.$blockScrolling++;
  14603. if (isMultiSelect && !accel) {
  14604. selection.toSingleRange();
  14605. } else if (!isMultiSelect && accel) {
  14606. initialRange = selection.toOrientedRange();
  14607. editor.addSelectionMarker(initialRange);
  14608. }
  14609. if (shift)
  14610. screenAnchor = session.documentToScreenPosition(selection.lead);
  14611. else
  14612. selection.moveToPosition(pos);
  14613. editor.$blockScrolling--;
  14614. screenCursor = {row: -1, column: -1};
  14615. var onMouseSelectionEnd = function(e) {
  14616. clearInterval(timerId);
  14617. editor.removeSelectionMarkers(rectSel);
  14618. if (!rectSel.length)
  14619. rectSel = [selection.toOrientedRange()];
  14620. editor.$blockScrolling++;
  14621. if (initialRange) {
  14622. editor.removeSelectionMarker(initialRange);
  14623. selection.toSingleRange(initialRange);
  14624. }
  14625. for (var i = 0; i < rectSel.length; i++)
  14626. selection.addRange(rectSel[i]);
  14627. editor.inVirtualSelectionMode = false;
  14628. editor.$mouseHandler.$clickSelection = null;
  14629. editor.$blockScrolling--;
  14630. };
  14631. var onSelectionInterval = blockSelect;
  14632. event.capture(editor.container, onMouseSelection, onMouseSelectionEnd);
  14633. var timerId = setInterval(function() {onSelectionInterval();}, 20);
  14634. return e.preventDefault();
  14635. }
  14636. }
  14637. exports.onMouseDown = onMouseDown;
  14638. });
  14639. ace.define("ace/commands/multi_select_commands",["require","exports","module","ace/keyboard/hash_handler"], function(require, exports, module) {
  14640. exports.defaultCommands = [{
  14641. name: "addCursorAbove",
  14642. exec: function(editor) { editor.selectMoreLines(-1); },
  14643. bindKey: {win: "Ctrl-Alt-Up", mac: "Ctrl-Alt-Up"},
  14644. scrollIntoView: "cursor",
  14645. readonly: true
  14646. }, {
  14647. name: "addCursorBelow",
  14648. exec: function(editor) { editor.selectMoreLines(1); },
  14649. bindKey: {win: "Ctrl-Alt-Down", mac: "Ctrl-Alt-Down"},
  14650. scrollIntoView: "cursor",
  14651. readonly: true
  14652. }, {
  14653. name: "addCursorAboveSkipCurrent",
  14654. exec: function(editor) { editor.selectMoreLines(-1, true); },
  14655. bindKey: {win: "Ctrl-Alt-Shift-Up", mac: "Ctrl-Alt-Shift-Up"},
  14656. scrollIntoView: "cursor",
  14657. readonly: true
  14658. }, {
  14659. name: "addCursorBelowSkipCurrent",
  14660. exec: function(editor) { editor.selectMoreLines(1, true); },
  14661. bindKey: {win: "Ctrl-Alt-Shift-Down", mac: "Ctrl-Alt-Shift-Down"},
  14662. scrollIntoView: "cursor",
  14663. readonly: true
  14664. }, {
  14665. name: "selectMoreBefore",
  14666. exec: function(editor) { editor.selectMore(-1); },
  14667. bindKey: {win: "Ctrl-Alt-Left", mac: "Ctrl-Alt-Left"},
  14668. scrollIntoView: "cursor",
  14669. readonly: true
  14670. }, {
  14671. name: "selectMoreAfter",
  14672. exec: function(editor) { editor.selectMore(1); },
  14673. bindKey: {win: "Ctrl-Alt-Right", mac: "Ctrl-Alt-Right"},
  14674. scrollIntoView: "cursor",
  14675. readonly: true
  14676. }, {
  14677. name: "selectNextBefore",
  14678. exec: function(editor) { editor.selectMore(-1, true); },
  14679. bindKey: {win: "Ctrl-Alt-Shift-Left", mac: "Ctrl-Alt-Shift-Left"},
  14680. scrollIntoView: "cursor",
  14681. readonly: true
  14682. }, {
  14683. name: "selectNextAfter",
  14684. exec: function(editor) { editor.selectMore(1, true); },
  14685. bindKey: {win: "Ctrl-Alt-Shift-Right", mac: "Ctrl-Alt-Shift-Right"},
  14686. scrollIntoView: "cursor",
  14687. readonly: true
  14688. }, {
  14689. name: "splitIntoLines",
  14690. exec: function(editor) { editor.multiSelect.splitIntoLines(); },
  14691. bindKey: {win: "Ctrl-Alt-L", mac: "Ctrl-Alt-L"},
  14692. readonly: true
  14693. }, {
  14694. name: "alignCursors",
  14695. exec: function(editor) { editor.alignCursors(); },
  14696. bindKey: {win: "Ctrl-Alt-A", mac: "Ctrl-Alt-A"},
  14697. scrollIntoView: "cursor"
  14698. }, {
  14699. name: "findAll",
  14700. exec: function(editor) { editor.findAll(); },
  14701. bindKey: {win: "Ctrl-Alt-K", mac: "Ctrl-Alt-G"},
  14702. scrollIntoView: "cursor",
  14703. readonly: true
  14704. }];
  14705. exports.multiSelectCommands = [{
  14706. name: "singleSelection",
  14707. bindKey: "esc",
  14708. exec: function(editor) { editor.exitMultiSelectMode(); },
  14709. scrollIntoView: "cursor",
  14710. readonly: true,
  14711. isAvailable: function(editor) {return editor && editor.inMultiSelectMode}
  14712. }];
  14713. var HashHandler = require("../keyboard/hash_handler").HashHandler;
  14714. exports.keyboardHandler = new HashHandler(exports.multiSelectCommands);
  14715. });
  14716. ace.define("ace/multi_select",["require","exports","module","ace/range_list","ace/range","ace/selection","ace/mouse/multi_select_handler","ace/lib/event","ace/lib/lang","ace/commands/multi_select_commands","ace/search","ace/edit_session","ace/editor","ace/config"], function(require, exports, module) {
  14717. var RangeList = require("./range_list").RangeList;
  14718. var Range = require("./range").Range;
  14719. var Selection = require("./selection").Selection;
  14720. var onMouseDown = require("./mouse/multi_select_handler").onMouseDown;
  14721. var event = require("./lib/event");
  14722. var lang = require("./lib/lang");
  14723. var commands = require("./commands/multi_select_commands");
  14724. exports.commands = commands.defaultCommands.concat(commands.multiSelectCommands);
  14725. var Search = require("./search").Search;
  14726. var search = new Search();
  14727. function find(session, needle, dir) {
  14728. search.$options.wrap = true;
  14729. search.$options.needle = needle;
  14730. search.$options.backwards = dir == -1;
  14731. return search.find(session);
  14732. }
  14733. var EditSession = require("./edit_session").EditSession;
  14734. (function() {
  14735. this.getSelectionMarkers = function() {
  14736. return this.$selectionMarkers;
  14737. };
  14738. }).call(EditSession.prototype);
  14739. (function() {
  14740. this.ranges = null;
  14741. this.rangeList = null;
  14742. this.addRange = function(range, $blockChangeEvents) {
  14743. if (!range)
  14744. return;
  14745. if (!this.inMultiSelectMode && this.rangeCount === 0) {
  14746. var oldRange = this.toOrientedRange();
  14747. this.rangeList.add(oldRange);
  14748. this.rangeList.add(range);
  14749. if (this.rangeList.ranges.length != 2) {
  14750. this.rangeList.removeAll();
  14751. return $blockChangeEvents || this.fromOrientedRange(range);
  14752. }
  14753. this.rangeList.removeAll();
  14754. this.rangeList.add(oldRange);
  14755. this.$onAddRange(oldRange);
  14756. }
  14757. if (!range.cursor)
  14758. range.cursor = range.end;
  14759. var removed = this.rangeList.add(range);
  14760. this.$onAddRange(range);
  14761. if (removed.length)
  14762. this.$onRemoveRange(removed);
  14763. if (this.rangeCount > 1 && !this.inMultiSelectMode) {
  14764. this._signal("multiSelect");
  14765. this.inMultiSelectMode = true;
  14766. this.session.$undoSelect = false;
  14767. this.rangeList.attach(this.session);
  14768. }
  14769. return $blockChangeEvents || this.fromOrientedRange(range);
  14770. };
  14771. this.toSingleRange = function(range) {
  14772. range = range || this.ranges[0];
  14773. var removed = this.rangeList.removeAll();
  14774. if (removed.length)
  14775. this.$onRemoveRange(removed);
  14776. range && this.fromOrientedRange(range);
  14777. };
  14778. this.substractPoint = function(pos) {
  14779. var removed = this.rangeList.substractPoint(pos);
  14780. if (removed) {
  14781. this.$onRemoveRange(removed);
  14782. return removed[0];
  14783. }
  14784. };
  14785. this.mergeOverlappingRanges = function() {
  14786. var removed = this.rangeList.merge();
  14787. if (removed.length)
  14788. this.$onRemoveRange(removed);
  14789. else if(this.ranges[0])
  14790. this.fromOrientedRange(this.ranges[0]);
  14791. };
  14792. this.$onAddRange = function(range) {
  14793. this.rangeCount = this.rangeList.ranges.length;
  14794. this.ranges.unshift(range);
  14795. this._signal("addRange", {range: range});
  14796. };
  14797. this.$onRemoveRange = function(removed) {
  14798. this.rangeCount = this.rangeList.ranges.length;
  14799. if (this.rangeCount == 1 && this.inMultiSelectMode) {
  14800. var lastRange = this.rangeList.ranges.pop();
  14801. removed.push(lastRange);
  14802. this.rangeCount = 0;
  14803. }
  14804. for (var i = removed.length; i--; ) {
  14805. var index = this.ranges.indexOf(removed[i]);
  14806. this.ranges.splice(index, 1);
  14807. }
  14808. this._signal("removeRange", {ranges: removed});
  14809. if (this.rangeCount === 0 && this.inMultiSelectMode) {
  14810. this.inMultiSelectMode = false;
  14811. this._signal("singleSelect");
  14812. this.session.$undoSelect = true;
  14813. this.rangeList.detach(this.session);
  14814. }
  14815. lastRange = lastRange || this.ranges[0];
  14816. if (lastRange && !lastRange.isEqual(this.getRange()))
  14817. this.fromOrientedRange(lastRange);
  14818. };
  14819. this.$initRangeList = function() {
  14820. if (this.rangeList)
  14821. return;
  14822. this.rangeList = new RangeList();
  14823. this.ranges = [];
  14824. this.rangeCount = 0;
  14825. };
  14826. this.getAllRanges = function() {
  14827. return this.rangeCount ? this.rangeList.ranges.concat() : [this.getRange()];
  14828. };
  14829. this.splitIntoLines = function () {
  14830. if (this.rangeCount > 1) {
  14831. var ranges = this.rangeList.ranges;
  14832. var lastRange = ranges[ranges.length - 1];
  14833. var range = Range.fromPoints(ranges[0].start, lastRange.end);
  14834. this.toSingleRange();
  14835. this.setSelectionRange(range, lastRange.cursor == lastRange.start);
  14836. } else {
  14837. var range = this.getRange();
  14838. var isBackwards = this.isBackwards();
  14839. var startRow = range.start.row;
  14840. var endRow = range.end.row;
  14841. if (startRow == endRow) {
  14842. if (isBackwards)
  14843. var start = range.end, end = range.start;
  14844. else
  14845. var start = range.start, end = range.end;
  14846. this.addRange(Range.fromPoints(end, end));
  14847. this.addRange(Range.fromPoints(start, start));
  14848. return;
  14849. }
  14850. var rectSel = [];
  14851. var r = this.getLineRange(startRow, true);
  14852. r.start.column = range.start.column;
  14853. rectSel.push(r);
  14854. for (var i = startRow + 1; i < endRow; i++)
  14855. rectSel.push(this.getLineRange(i, true));
  14856. r = this.getLineRange(endRow, true);
  14857. r.end.column = range.end.column;
  14858. rectSel.push(r);
  14859. rectSel.forEach(this.addRange, this);
  14860. }
  14861. };
  14862. this.toggleBlockSelection = function () {
  14863. if (this.rangeCount > 1) {
  14864. var ranges = this.rangeList.ranges;
  14865. var lastRange = ranges[ranges.length - 1];
  14866. var range = Range.fromPoints(ranges[0].start, lastRange.end);
  14867. this.toSingleRange();
  14868. this.setSelectionRange(range, lastRange.cursor == lastRange.start);
  14869. } else {
  14870. var cursor = this.session.documentToScreenPosition(this.selectionLead);
  14871. var anchor = this.session.documentToScreenPosition(this.selectionAnchor);
  14872. var rectSel = this.rectangularRangeBlock(cursor, anchor);
  14873. rectSel.forEach(this.addRange, this);
  14874. }
  14875. };
  14876. this.rectangularRangeBlock = function(screenCursor, screenAnchor, includeEmptyLines) {
  14877. var rectSel = [];
  14878. var xBackwards = screenCursor.column < screenAnchor.column;
  14879. if (xBackwards) {
  14880. var startColumn = screenCursor.column;
  14881. var endColumn = screenAnchor.column;
  14882. } else {
  14883. var startColumn = screenAnchor.column;
  14884. var endColumn = screenCursor.column;
  14885. }
  14886. var yBackwards = screenCursor.row < screenAnchor.row;
  14887. if (yBackwards) {
  14888. var startRow = screenCursor.row;
  14889. var endRow = screenAnchor.row;
  14890. } else {
  14891. var startRow = screenAnchor.row;
  14892. var endRow = screenCursor.row;
  14893. }
  14894. if (startColumn < 0)
  14895. startColumn = 0;
  14896. if (startRow < 0)
  14897. startRow = 0;
  14898. if (startRow == endRow)
  14899. includeEmptyLines = true;
  14900. for (var row = startRow; row <= endRow; row++) {
  14901. var range = Range.fromPoints(
  14902. this.session.screenToDocumentPosition(row, startColumn),
  14903. this.session.screenToDocumentPosition(row, endColumn)
  14904. );
  14905. if (range.isEmpty()) {
  14906. if (docEnd && isSamePoint(range.end, docEnd))
  14907. break;
  14908. var docEnd = range.end;
  14909. }
  14910. range.cursor = xBackwards ? range.start : range.end;
  14911. rectSel.push(range);
  14912. }
  14913. if (yBackwards)
  14914. rectSel.reverse();
  14915. if (!includeEmptyLines) {
  14916. var end = rectSel.length - 1;
  14917. while (rectSel[end].isEmpty() && end > 0)
  14918. end--;
  14919. if (end > 0) {
  14920. var start = 0;
  14921. while (rectSel[start].isEmpty())
  14922. start++;
  14923. }
  14924. for (var i = end; i >= start; i--) {
  14925. if (rectSel[i].isEmpty())
  14926. rectSel.splice(i, 1);
  14927. }
  14928. }
  14929. return rectSel;
  14930. };
  14931. }).call(Selection.prototype);
  14932. var Editor = require("./editor").Editor;
  14933. (function() {
  14934. this.updateSelectionMarkers = function() {
  14935. this.renderer.updateCursor();
  14936. this.renderer.updateBackMarkers();
  14937. };
  14938. this.addSelectionMarker = function(orientedRange) {
  14939. if (!orientedRange.cursor)
  14940. orientedRange.cursor = orientedRange.end;
  14941. var style = this.getSelectionStyle();
  14942. orientedRange.marker = this.session.addMarker(orientedRange, "ace_selection", style);
  14943. this.session.$selectionMarkers.push(orientedRange);
  14944. this.session.selectionMarkerCount = this.session.$selectionMarkers.length;
  14945. return orientedRange;
  14946. };
  14947. this.removeSelectionMarker = function(range) {
  14948. if (!range.marker)
  14949. return;
  14950. this.session.removeMarker(range.marker);
  14951. var index = this.session.$selectionMarkers.indexOf(range);
  14952. if (index != -1)
  14953. this.session.$selectionMarkers.splice(index, 1);
  14954. this.session.selectionMarkerCount = this.session.$selectionMarkers.length;
  14955. };
  14956. this.removeSelectionMarkers = function(ranges) {
  14957. var markerList = this.session.$selectionMarkers;
  14958. for (var i = ranges.length; i--; ) {
  14959. var range = ranges[i];
  14960. if (!range.marker)
  14961. continue;
  14962. this.session.removeMarker(range.marker);
  14963. var index = markerList.indexOf(range);
  14964. if (index != -1)
  14965. markerList.splice(index, 1);
  14966. }
  14967. this.session.selectionMarkerCount = markerList.length;
  14968. };
  14969. this.$onAddRange = function(e) {
  14970. this.addSelectionMarker(e.range);
  14971. this.renderer.updateCursor();
  14972. this.renderer.updateBackMarkers();
  14973. };
  14974. this.$onRemoveRange = function(e) {
  14975. this.removeSelectionMarkers(e.ranges);
  14976. this.renderer.updateCursor();
  14977. this.renderer.updateBackMarkers();
  14978. };
  14979. this.$onMultiSelect = function(e) {
  14980. if (this.inMultiSelectMode)
  14981. return;
  14982. this.inMultiSelectMode = true;
  14983. this.setStyle("ace_multiselect");
  14984. this.keyBinding.addKeyboardHandler(commands.keyboardHandler);
  14985. this.commands.setDefaultHandler("exec", this.$onMultiSelectExec);
  14986. this.renderer.updateCursor();
  14987. this.renderer.updateBackMarkers();
  14988. };
  14989. this.$onSingleSelect = function(e) {
  14990. if (this.session.multiSelect.inVirtualMode)
  14991. return;
  14992. this.inMultiSelectMode = false;
  14993. this.unsetStyle("ace_multiselect");
  14994. this.keyBinding.removeKeyboardHandler(commands.keyboardHandler);
  14995. this.commands.removeDefaultHandler("exec", this.$onMultiSelectExec);
  14996. this.renderer.updateCursor();
  14997. this.renderer.updateBackMarkers();
  14998. this._emit("changeSelection");
  14999. };
  15000. this.$onMultiSelectExec = function(e) {
  15001. var command = e.command;
  15002. var editor = e.editor;
  15003. if (!editor.multiSelect)
  15004. return;
  15005. if (!command.multiSelectAction) {
  15006. var result = command.exec(editor, e.args || {});
  15007. editor.multiSelect.addRange(editor.multiSelect.toOrientedRange());
  15008. editor.multiSelect.mergeOverlappingRanges();
  15009. } else if (command.multiSelectAction == "forEach") {
  15010. result = editor.forEachSelection(command, e.args);
  15011. } else if (command.multiSelectAction == "forEachLine") {
  15012. result = editor.forEachSelection(command, e.args, true);
  15013. } else if (command.multiSelectAction == "single") {
  15014. editor.exitMultiSelectMode();
  15015. result = command.exec(editor, e.args || {});
  15016. } else {
  15017. result = command.multiSelectAction(editor, e.args || {});
  15018. }
  15019. return result;
  15020. };
  15021. this.forEachSelection = function(cmd, args, options) {
  15022. if (this.inVirtualSelectionMode)
  15023. return;
  15024. var keepOrder = options && options.keepOrder;
  15025. var $byLines = options == true || options && options.$byLines
  15026. var session = this.session;
  15027. var selection = this.selection;
  15028. var rangeList = selection.rangeList;
  15029. var ranges = (keepOrder ? selection : rangeList).ranges;
  15030. var result;
  15031. if (!ranges.length)
  15032. return cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});
  15033. var reg = selection._eventRegistry;
  15034. selection._eventRegistry = {};
  15035. var tmpSel = new Selection(session);
  15036. this.inVirtualSelectionMode = true;
  15037. for (var i = ranges.length; i--;) {
  15038. if ($byLines) {
  15039. while (i > 0 && ranges[i].start.row == ranges[i - 1].end.row)
  15040. i--;
  15041. }
  15042. tmpSel.fromOrientedRange(ranges[i]);
  15043. tmpSel.index = i;
  15044. this.selection = session.selection = tmpSel;
  15045. var cmdResult = cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});
  15046. if (!result && cmdResult !== undefined)
  15047. result = cmdResult;
  15048. tmpSel.toOrientedRange(ranges[i]);
  15049. }
  15050. tmpSel.detach();
  15051. this.selection = session.selection = selection;
  15052. this.inVirtualSelectionMode = false;
  15053. selection._eventRegistry = reg;
  15054. selection.mergeOverlappingRanges();
  15055. var anim = this.renderer.$scrollAnimation;
  15056. this.onCursorChange();
  15057. this.onSelectionChange();
  15058. if (anim && anim.from == anim.to)
  15059. this.renderer.animateScrolling(anim.from);
  15060. return result;
  15061. };
  15062. this.exitMultiSelectMode = function() {
  15063. if (!this.inMultiSelectMode || this.inVirtualSelectionMode)
  15064. return;
  15065. this.multiSelect.toSingleRange();
  15066. };
  15067. this.getSelectedText = function() {
  15068. var text = "";
  15069. if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {
  15070. var ranges = this.multiSelect.rangeList.ranges;
  15071. var buf = [];
  15072. for (var i = 0; i < ranges.length; i++) {
  15073. buf.push(this.session.getTextRange(ranges[i]));
  15074. }
  15075. var nl = this.session.getDocument().getNewLineCharacter();
  15076. text = buf.join(nl);
  15077. if (text.length == (buf.length - 1) * nl.length)
  15078. text = "";
  15079. } else if (!this.selection.isEmpty()) {
  15080. text = this.session.getTextRange(this.getSelectionRange());
  15081. }
  15082. return text;
  15083. };
  15084. this.$checkMultiselectChange = function(e, anchor) {
  15085. if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {
  15086. var range = this.multiSelect.ranges[0];
  15087. if (this.multiSelect.isEmpty() && anchor == this.multiSelect.anchor)
  15088. return;
  15089. var pos = anchor == this.multiSelect.anchor
  15090. ? range.cursor == range.start ? range.end : range.start
  15091. : range.cursor;
  15092. if (pos.row != anchor.row
  15093. || this.session.$clipPositionToDocument(pos.row, pos.column).column != anchor.column)
  15094. this.multiSelect.toSingleRange(this.multiSelect.toOrientedRange());
  15095. }
  15096. };
  15097. this.findAll = function(needle, options, additive) {
  15098. options = options || {};
  15099. options.needle = needle || options.needle;
  15100. if (options.needle == undefined) {
  15101. var range = this.selection.isEmpty()
  15102. ? this.selection.getWordRange()
  15103. : this.selection.getRange();
  15104. options.needle = this.session.getTextRange(range);
  15105. }
  15106. this.$search.set(options);
  15107. var ranges = this.$search.findAll(this.session);
  15108. if (!ranges.length)
  15109. return 0;
  15110. this.$blockScrolling += 1;
  15111. var selection = this.multiSelect;
  15112. if (!additive)
  15113. selection.toSingleRange(ranges[0]);
  15114. for (var i = ranges.length; i--; )
  15115. selection.addRange(ranges[i], true);
  15116. if (range && selection.rangeList.rangeAtPoint(range.start))
  15117. selection.addRange(range, true);
  15118. this.$blockScrolling -= 1;
  15119. return ranges.length;
  15120. };
  15121. this.selectMoreLines = function(dir, skip) {
  15122. var range = this.selection.toOrientedRange();
  15123. var isBackwards = range.cursor == range.end;
  15124. var screenLead = this.session.documentToScreenPosition(range.cursor);
  15125. if (this.selection.$desiredColumn)
  15126. screenLead.column = this.selection.$desiredColumn;
  15127. var lead = this.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column);
  15128. if (!range.isEmpty()) {
  15129. var screenAnchor = this.session.documentToScreenPosition(isBackwards ? range.end : range.start);
  15130. var anchor = this.session.screenToDocumentPosition(screenAnchor.row + dir, screenAnchor.column);
  15131. } else {
  15132. var anchor = lead;
  15133. }
  15134. if (isBackwards) {
  15135. var newRange = Range.fromPoints(lead, anchor);
  15136. newRange.cursor = newRange.start;
  15137. } else {
  15138. var newRange = Range.fromPoints(anchor, lead);
  15139. newRange.cursor = newRange.end;
  15140. }
  15141. newRange.desiredColumn = screenLead.column;
  15142. if (!this.selection.inMultiSelectMode) {
  15143. this.selection.addRange(range);
  15144. } else {
  15145. if (skip)
  15146. var toRemove = range.cursor;
  15147. }
  15148. this.selection.addRange(newRange);
  15149. if (toRemove)
  15150. this.selection.substractPoint(toRemove);
  15151. };
  15152. this.transposeSelections = function(dir) {
  15153. var session = this.session;
  15154. var sel = session.multiSelect;
  15155. var all = sel.ranges;
  15156. for (var i = all.length; i--; ) {
  15157. var range = all[i];
  15158. if (range.isEmpty()) {
  15159. var tmp = session.getWordRange(range.start.row, range.start.column);
  15160. range.start.row = tmp.start.row;
  15161. range.start.column = tmp.start.column;
  15162. range.end.row = tmp.end.row;
  15163. range.end.column = tmp.end.column;
  15164. }
  15165. }
  15166. sel.mergeOverlappingRanges();
  15167. var words = [];
  15168. for (var i = all.length; i--; ) {
  15169. var range = all[i];
  15170. words.unshift(session.getTextRange(range));
  15171. }
  15172. if (dir < 0)
  15173. words.unshift(words.pop());
  15174. else
  15175. words.push(words.shift());
  15176. for (var i = all.length; i--; ) {
  15177. var range = all[i];
  15178. var tmp = range.clone();
  15179. session.replace(range, words[i]);
  15180. range.start.row = tmp.start.row;
  15181. range.start.column = tmp.start.column;
  15182. }
  15183. };
  15184. this.selectMore = function(dir, skip, stopAtFirst) {
  15185. var session = this.session;
  15186. var sel = session.multiSelect;
  15187. var range = sel.toOrientedRange();
  15188. if (range.isEmpty()) {
  15189. range = session.getWordRange(range.start.row, range.start.column);
  15190. range.cursor = dir == -1 ? range.start : range.end;
  15191. this.multiSelect.addRange(range);
  15192. if (stopAtFirst)
  15193. return;
  15194. }
  15195. var needle = session.getTextRange(range);
  15196. var newRange = find(session, needle, dir);
  15197. if (newRange) {
  15198. newRange.cursor = dir == -1 ? newRange.start : newRange.end;
  15199. this.$blockScrolling += 1;
  15200. this.session.unfold(newRange);
  15201. this.multiSelect.addRange(newRange);
  15202. this.$blockScrolling -= 1;
  15203. this.renderer.scrollCursorIntoView(null, 0.5);
  15204. }
  15205. if (skip)
  15206. this.multiSelect.substractPoint(range.cursor);
  15207. };
  15208. this.alignCursors = function() {
  15209. var session = this.session;
  15210. var sel = session.multiSelect;
  15211. var ranges = sel.ranges;
  15212. var row = -1;
  15213. var sameRowRanges = ranges.filter(function(r) {
  15214. if (r.cursor.row == row)
  15215. return true;
  15216. row = r.cursor.row;
  15217. });
  15218. if (!ranges.length || sameRowRanges.length == ranges.length - 1) {
  15219. var range = this.selection.getRange();
  15220. var fr = range.start.row, lr = range.end.row;
  15221. var guessRange = fr == lr;
  15222. if (guessRange) {
  15223. var max = this.session.getLength();
  15224. var line;
  15225. do {
  15226. line = this.session.getLine(lr);
  15227. } while (/[=:]/.test(line) && ++lr < max);
  15228. do {
  15229. line = this.session.getLine(fr);
  15230. } while (/[=:]/.test(line) && --fr > 0);
  15231. if (fr < 0) fr = 0;
  15232. if (lr >= max) lr = max - 1;
  15233. }
  15234. var lines = this.session.doc.removeLines(fr, lr);
  15235. lines = this.$reAlignText(lines, guessRange);
  15236. this.session.doc.insert({row: fr, column: 0}, lines.join("\n") + "\n");
  15237. if (!guessRange) {
  15238. range.start.column = 0;
  15239. range.end.column = lines[lines.length - 1].length;
  15240. }
  15241. this.selection.setRange(range);
  15242. } else {
  15243. sameRowRanges.forEach(function(r) {
  15244. sel.substractPoint(r.cursor);
  15245. });
  15246. var maxCol = 0;
  15247. var minSpace = Infinity;
  15248. var spaceOffsets = ranges.map(function(r) {
  15249. var p = r.cursor;
  15250. var line = session.getLine(p.row);
  15251. var spaceOffset = line.substr(p.column).search(/\S/g);
  15252. if (spaceOffset == -1)
  15253. spaceOffset = 0;
  15254. if (p.column > maxCol)
  15255. maxCol = p.column;
  15256. if (spaceOffset < minSpace)
  15257. minSpace = spaceOffset;
  15258. return spaceOffset;
  15259. });
  15260. ranges.forEach(function(r, i) {
  15261. var p = r.cursor;
  15262. var l = maxCol - p.column;
  15263. var d = spaceOffsets[i] - minSpace;
  15264. if (l > d)
  15265. session.insert(p, lang.stringRepeat(" ", l - d));
  15266. else
  15267. session.remove(new Range(p.row, p.column, p.row, p.column - l + d));
  15268. r.start.column = r.end.column = maxCol;
  15269. r.start.row = r.end.row = p.row;
  15270. r.cursor = r.end;
  15271. });
  15272. sel.fromOrientedRange(ranges[0]);
  15273. this.renderer.updateCursor();
  15274. this.renderer.updateBackMarkers();
  15275. }
  15276. };
  15277. this.$reAlignText = function(lines, forceLeft) {
  15278. var isLeftAligned = true, isRightAligned = true;
  15279. var startW, textW, endW;
  15280. return lines.map(function(line) {
  15281. var m = line.match(/(\s*)(.*?)(\s*)([=:].*)/);
  15282. if (!m)
  15283. return [line];
  15284. if (startW == null) {
  15285. startW = m[1].length;
  15286. textW = m[2].length;
  15287. endW = m[3].length;
  15288. return m;
  15289. }
  15290. if (startW + textW + endW != m[1].length + m[2].length + m[3].length)
  15291. isRightAligned = false;
  15292. if (startW != m[1].length)
  15293. isLeftAligned = false;
  15294. if (startW > m[1].length)
  15295. startW = m[1].length;
  15296. if (textW < m[2].length)
  15297. textW = m[2].length;
  15298. if (endW > m[3].length)
  15299. endW = m[3].length;
  15300. return m;
  15301. }).map(forceLeft ? alignLeft :
  15302. isLeftAligned ? isRightAligned ? alignRight : alignLeft : unAlign);
  15303. function spaces(n) {
  15304. return lang.stringRepeat(" ", n);
  15305. }
  15306. function alignLeft(m) {
  15307. return !m[2] ? m[0] : spaces(startW) + m[2]
  15308. + spaces(textW - m[2].length + endW)
  15309. + m[4].replace(/^([=:])\s+/, "$1 ");
  15310. }
  15311. function alignRight(m) {
  15312. return !m[2] ? m[0] : spaces(startW + textW - m[2].length) + m[2]
  15313. + spaces(endW, " ")
  15314. + m[4].replace(/^([=:])\s+/, "$1 ");
  15315. }
  15316. function unAlign(m) {
  15317. return !m[2] ? m[0] : spaces(startW) + m[2]
  15318. + spaces(endW)
  15319. + m[4].replace(/^([=:])\s+/, "$1 ");
  15320. }
  15321. };
  15322. }).call(Editor.prototype);
  15323. function isSamePoint(p1, p2) {
  15324. return p1.row == p2.row && p1.column == p2.column;
  15325. }
  15326. exports.onSessionChange = function(e) {
  15327. var session = e.session;
  15328. if (session && !session.multiSelect) {
  15329. session.$selectionMarkers = [];
  15330. session.selection.$initRangeList();
  15331. session.multiSelect = session.selection;
  15332. }
  15333. this.multiSelect = session && session.multiSelect;
  15334. var oldSession = e.oldSession;
  15335. if (oldSession) {
  15336. oldSession.multiSelect.off("addRange", this.$onAddRange);
  15337. oldSession.multiSelect.off("removeRange", this.$onRemoveRange);
  15338. oldSession.multiSelect.off("multiSelect", this.$onMultiSelect);
  15339. oldSession.multiSelect.off("singleSelect", this.$onSingleSelect);
  15340. oldSession.multiSelect.lead.off("change", this.$checkMultiselectChange);
  15341. oldSession.multiSelect.anchor.off("change", this.$checkMultiselectChange);
  15342. }
  15343. if (session) {
  15344. session.multiSelect.on("addRange", this.$onAddRange);
  15345. session.multiSelect.on("removeRange", this.$onRemoveRange);
  15346. session.multiSelect.on("multiSelect", this.$onMultiSelect);
  15347. session.multiSelect.on("singleSelect", this.$onSingleSelect);
  15348. session.multiSelect.lead.on("change", this.$checkMultiselectChange);
  15349. session.multiSelect.anchor.on("change", this.$checkMultiselectChange);
  15350. }
  15351. if (session && this.inMultiSelectMode != session.selection.inMultiSelectMode) {
  15352. if (session.selection.inMultiSelectMode)
  15353. this.$onMultiSelect();
  15354. else
  15355. this.$onSingleSelect();
  15356. }
  15357. };
  15358. function MultiSelect(editor) {
  15359. if (editor.$multiselectOnSessionChange)
  15360. return;
  15361. editor.$onAddRange = editor.$onAddRange.bind(editor);
  15362. editor.$onRemoveRange = editor.$onRemoveRange.bind(editor);
  15363. editor.$onMultiSelect = editor.$onMultiSelect.bind(editor);
  15364. editor.$onSingleSelect = editor.$onSingleSelect.bind(editor);
  15365. editor.$multiselectOnSessionChange = exports.onSessionChange.bind(editor);
  15366. editor.$checkMultiselectChange = editor.$checkMultiselectChange.bind(editor);
  15367. editor.$multiselectOnSessionChange(editor);
  15368. editor.on("changeSession", editor.$multiselectOnSessionChange);
  15369. editor.on("mousedown", onMouseDown);
  15370. editor.commands.addCommands(commands.defaultCommands);
  15371. addAltCursorListeners(editor);
  15372. }
  15373. function addAltCursorListeners(editor){
  15374. var el = editor.textInput.getElement();
  15375. var altCursor = false;
  15376. event.addListener(el, "keydown", function(e) {
  15377. if (e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey)) {
  15378. if (!altCursor) {
  15379. editor.renderer.setMouseCursor("crosshair");
  15380. altCursor = true;
  15381. }
  15382. } else if (altCursor) {
  15383. reset();
  15384. }
  15385. });
  15386. event.addListener(el, "keyup", reset);
  15387. event.addListener(el, "blur", reset);
  15388. function reset(e) {
  15389. if (altCursor) {
  15390. editor.renderer.setMouseCursor("");
  15391. altCursor = false;
  15392. }
  15393. }
  15394. }
  15395. exports.MultiSelect = MultiSelect;
  15396. require("./config").defineOptions(Editor.prototype, "editor", {
  15397. enableMultiselect: {
  15398. set: function(val) {
  15399. MultiSelect(this);
  15400. if (val) {
  15401. this.on("changeSession", this.$multiselectOnSessionChange);
  15402. this.on("mousedown", onMouseDown);
  15403. } else {
  15404. this.off("changeSession", this.$multiselectOnSessionChange);
  15405. this.off("mousedown", onMouseDown);
  15406. }
  15407. },
  15408. value: true
  15409. }
  15410. });
  15411. });
  15412. ace.define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"], function(require, exports, module) {
  15413. "use strict";
  15414. var Range = require("../../range").Range;
  15415. var FoldMode = exports.FoldMode = function() {};
  15416. (function() {
  15417. this.foldingStartMarker = null;
  15418. this.foldingStopMarker = null;
  15419. this.getFoldWidget = function(session, foldStyle, row) {
  15420. var line = session.getLine(row);
  15421. if (this.foldingStartMarker.test(line))
  15422. return "start";
  15423. if (foldStyle == "markbeginend"
  15424. && this.foldingStopMarker
  15425. && this.foldingStopMarker.test(line))
  15426. return "end";
  15427. return "";
  15428. };
  15429. this.getFoldWidgetRange = function(session, foldStyle, row) {
  15430. return null;
  15431. };
  15432. this.indentationBlock = function(session, row, column) {
  15433. var re = /\S/;
  15434. var line = session.getLine(row);
  15435. var startLevel = line.search(re);
  15436. if (startLevel == -1)
  15437. return;
  15438. var startColumn = column || line.length;
  15439. var maxRow = session.getLength();
  15440. var startRow = row;
  15441. var endRow = row;
  15442. while (++row < maxRow) {
  15443. var level = session.getLine(row).search(re);
  15444. if (level == -1)
  15445. continue;
  15446. if (level <= startLevel)
  15447. break;
  15448. endRow = row;
  15449. }
  15450. if (endRow > startRow) {
  15451. var endColumn = session.getLine(endRow).length;
  15452. return new Range(startRow, startColumn, endRow, endColumn);
  15453. }
  15454. };
  15455. this.openingBracketBlock = function(session, bracket, row, column, typeRe) {
  15456. var start = {row: row, column: column + 1};
  15457. var end = session.$findClosingBracket(bracket, start, typeRe);
  15458. if (!end)
  15459. return;
  15460. var fw = session.foldWidgets[end.row];
  15461. if (fw == null)
  15462. fw = session.getFoldWidget(end.row);
  15463. if (fw == "start" && end.row > start.row) {
  15464. end.row --;
  15465. end.column = session.getLine(end.row).length;
  15466. }
  15467. return Range.fromPoints(start, end);
  15468. };
  15469. this.closingBracketBlock = function(session, bracket, row, column, typeRe) {
  15470. var end = {row: row, column: column};
  15471. var start = session.$findOpeningBracket(bracket, end);
  15472. if (!start)
  15473. return;
  15474. start.column++;
  15475. end.column--;
  15476. return Range.fromPoints(start, end);
  15477. };
  15478. }).call(FoldMode.prototype);
  15479. });
  15480. ace.define("ace/theme/textmate",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
  15481. "use strict";
  15482. exports.isDark = false;
  15483. exports.cssClass = "ace-tm";
  15484. exports.cssText = ".ace-tm .ace_gutter {\
  15485. background: #f0f0f0;\
  15486. color: #333;\
  15487. }\
  15488. .ace-tm .ace_print-margin {\
  15489. width: 1px;\
  15490. background: #e8e8e8;\
  15491. }\
  15492. .ace-tm .ace_fold {\
  15493. background-color: #6B72E6;\
  15494. }\
  15495. .ace-tm {\
  15496. background-color: #FFFFFF;\
  15497. color: black;\
  15498. }\
  15499. .ace-tm .ace_cursor {\
  15500. color: black;\
  15501. }\
  15502. .ace-tm .ace_invisible {\
  15503. color: rgb(191, 191, 191);\
  15504. }\
  15505. .ace-tm .ace_storage,\
  15506. .ace-tm .ace_keyword {\
  15507. color: blue;\
  15508. }\
  15509. .ace-tm .ace_constant {\
  15510. color: rgb(197, 6, 11);\
  15511. }\
  15512. .ace-tm .ace_constant.ace_buildin {\
  15513. color: rgb(88, 72, 246);\
  15514. }\
  15515. .ace-tm .ace_constant.ace_language {\
  15516. color: rgb(88, 92, 246);\
  15517. }\
  15518. .ace-tm .ace_constant.ace_library {\
  15519. color: rgb(6, 150, 14);\
  15520. }\
  15521. .ace-tm .ace_invalid {\
  15522. background-color: rgba(255, 0, 0, 0.1);\
  15523. color: red;\
  15524. }\
  15525. .ace-tm .ace_support.ace_function {\
  15526. color: rgb(60, 76, 114);\
  15527. }\
  15528. .ace-tm .ace_support.ace_constant {\
  15529. color: rgb(6, 150, 14);\
  15530. }\
  15531. .ace-tm .ace_support.ace_type,\
  15532. .ace-tm .ace_support.ace_class {\
  15533. color: rgb(109, 121, 222);\
  15534. }\
  15535. .ace-tm .ace_keyword.ace_operator {\
  15536. color: rgb(104, 118, 135);\
  15537. }\
  15538. .ace-tm .ace_string {\
  15539. color: rgb(3, 106, 7);\
  15540. }\
  15541. .ace-tm .ace_comment {\
  15542. color: rgb(76, 136, 107);\
  15543. }\
  15544. .ace-tm .ace_comment.ace_doc {\
  15545. color: rgb(0, 102, 255);\
  15546. }\
  15547. .ace-tm .ace_comment.ace_doc.ace_tag {\
  15548. color: rgb(128, 159, 191);\
  15549. }\
  15550. .ace-tm .ace_constant.ace_numeric {\
  15551. color: rgb(0, 0, 205);\
  15552. }\
  15553. .ace-tm .ace_variable {\
  15554. color: rgb(49, 132, 149);\
  15555. }\
  15556. .ace-tm .ace_xml-pe {\
  15557. color: rgb(104, 104, 91);\
  15558. }\
  15559. .ace-tm .ace_entity.ace_name.ace_function {\
  15560. color: #0000A2;\
  15561. }\
  15562. .ace-tm .ace_heading {\
  15563. color: rgb(12, 7, 255);\
  15564. }\
  15565. .ace-tm .ace_list {\
  15566. color:rgb(185, 6, 144);\
  15567. }\
  15568. .ace-tm .ace_meta.ace_tag {\
  15569. color:rgb(0, 22, 142);\
  15570. }\
  15571. .ace-tm .ace_string.ace_regex {\
  15572. color: rgb(255, 0, 0)\
  15573. }\
  15574. .ace-tm .ace_marker-layer .ace_selection {\
  15575. background: rgb(181, 213, 255);\
  15576. }\
  15577. .ace-tm.ace_multiselect .ace_selection.ace_start {\
  15578. box-shadow: 0 0 3px 0px white;\
  15579. border-radius: 2px;\
  15580. }\
  15581. .ace-tm .ace_marker-layer .ace_step {\
  15582. background: rgb(252, 255, 0);\
  15583. }\
  15584. .ace-tm .ace_marker-layer .ace_stack {\
  15585. background: rgb(164, 229, 101);\
  15586. }\
  15587. .ace-tm .ace_marker-layer .ace_bracket {\
  15588. margin: -1px 0 0 -1px;\
  15589. border: 1px solid rgb(192, 192, 192);\
  15590. }\
  15591. .ace-tm .ace_marker-layer .ace_active-line {\
  15592. background: rgba(0, 0, 0, 0.07);\
  15593. }\
  15594. .ace-tm .ace_gutter-active-line {\
  15595. background-color : #dcdcdc;\
  15596. }\
  15597. .ace-tm .ace_marker-layer .ace_selected-word {\
  15598. background: rgb(250, 250, 255);\
  15599. border: 1px solid rgb(200, 200, 250);\
  15600. }\
  15601. .ace-tm .ace_indent-guide {\
  15602. background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\
  15603. }\
  15604. ";
  15605. var dom = require("../lib/dom");
  15606. dom.importCssString(exports.cssText, exports.cssClass);
  15607. });
  15608. ace.define("ace/line_widgets",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/range"], function(require, exports, module) {
  15609. "use strict";
  15610. var oop = require("./lib/oop");
  15611. var dom = require("./lib/dom");
  15612. var Range = require("./range").Range;
  15613. function LineWidgets(session) {
  15614. this.session = session;
  15615. this.session.widgetManager = this;
  15616. this.session.getRowLength = this.getRowLength;
  15617. this.session.$getWidgetScreenLength = this.$getWidgetScreenLength;
  15618. this.updateOnChange = this.updateOnChange.bind(this);
  15619. this.renderWidgets = this.renderWidgets.bind(this);
  15620. this.measureWidgets = this.measureWidgets.bind(this);
  15621. this.session._changedWidgets = [];
  15622. this.$onChangeEditor = this.$onChangeEditor.bind(this);
  15623. this.session.on("change", this.updateOnChange);
  15624. this.session.on("changeEditor", this.$onChangeEditor);
  15625. }
  15626. (function() {
  15627. this.getRowLength = function(row) {
  15628. var h;
  15629. if (this.lineWidgets)
  15630. h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;
  15631. else
  15632. h = 0;
  15633. if (!this.$useWrapMode || !this.$wrapData[row]) {
  15634. return 1 + h;
  15635. } else {
  15636. return this.$wrapData[row].length + 1 + h;
  15637. }
  15638. };
  15639. this.$getWidgetScreenLength = function() {
  15640. var screenRows = 0;
  15641. this.lineWidgets.forEach(function(w){
  15642. if (w && w.rowCount)
  15643. screenRows +=w.rowCount;
  15644. });
  15645. return screenRows;
  15646. };
  15647. this.$onChangeEditor = function(e) {
  15648. this.attach(e.editor);
  15649. };
  15650. this.attach = function(editor) {
  15651. if (editor && editor.widgetManager && editor.widgetManager != this)
  15652. editor.widgetManager.detach();
  15653. if (this.editor == editor)
  15654. return;
  15655. this.detach();
  15656. this.editor = editor;
  15657. if (editor) {
  15658. editor.widgetManager = this;
  15659. editor.renderer.on("beforeRender", this.measureWidgets);
  15660. editor.renderer.on("afterRender", this.renderWidgets);
  15661. }
  15662. };
  15663. this.detach = function(e) {
  15664. var editor = this.editor;
  15665. if (!editor)
  15666. return;
  15667. this.editor = null;
  15668. editor.widgetManager = null;
  15669. editor.renderer.off("beforeRender", this.measureWidgets);
  15670. editor.renderer.off("afterRender", this.renderWidgets);
  15671. var lineWidgets = this.session.lineWidgets;
  15672. lineWidgets && lineWidgets.forEach(function(w) {
  15673. if (w && w.el && w.el.parentNode) {
  15674. w._inDocument = false;
  15675. w.el.parentNode.removeChild(w.el);
  15676. }
  15677. });
  15678. };
  15679. this.updateOnChange = function(e) {
  15680. var lineWidgets = this.session.lineWidgets;
  15681. if (!lineWidgets) return;
  15682. var delta = e.data;
  15683. var range = delta.range;
  15684. var startRow = range.start.row;
  15685. var len = range.end.row - startRow;
  15686. if (len === 0) {
  15687. } else if (delta.action == "removeText" || delta.action == "removeLines") {
  15688. var removed = lineWidgets.splice(startRow + 1, len);
  15689. removed.forEach(function(w) {
  15690. w && this.removeLineWidget(w);
  15691. }, this);
  15692. this.$updateRows();
  15693. } else {
  15694. var args = new Array(len);
  15695. args.unshift(startRow, 0);
  15696. lineWidgets.splice.apply(lineWidgets, args);
  15697. this.$updateRows();
  15698. }
  15699. };
  15700. this.$updateRows = function() {
  15701. var lineWidgets = this.session.lineWidgets;
  15702. if (!lineWidgets) return;
  15703. var noWidgets = true;
  15704. lineWidgets.forEach(function(w, i) {
  15705. if (w) {
  15706. noWidgets = false;
  15707. w.row = i;
  15708. }
  15709. });
  15710. if (noWidgets)
  15711. this.session.lineWidgets = null;
  15712. };
  15713. this.addLineWidget = function(w) {
  15714. if (!this.session.lineWidgets)
  15715. this.session.lineWidgets = new Array(this.session.getLength());
  15716. this.session.lineWidgets[w.row] = w;
  15717. var renderer = this.editor.renderer;
  15718. if (w.html && !w.el) {
  15719. w.el = dom.createElement("div");
  15720. w.el.innerHTML = w.html;
  15721. }
  15722. if (w.el) {
  15723. dom.addCssClass(w.el, "ace_lineWidgetContainer");
  15724. w.el.style.position = "absolute";
  15725. w.el.style.zIndex = 5;
  15726. renderer.container.appendChild(w.el);
  15727. w._inDocument = true;
  15728. }
  15729. if (!w.coverGutter) {
  15730. w.el.style.zIndex = 3;
  15731. }
  15732. if (!w.pixelHeight) {
  15733. w.pixelHeight = w.el.offsetHeight;
  15734. }
  15735. if (w.rowCount == null)
  15736. w.rowCount = w.pixelHeight / renderer.layerConfig.lineHeight;
  15737. this.session._emit("changeFold", {data:{start:{row: w.row}}});
  15738. this.$updateRows();
  15739. this.renderWidgets(null, renderer);
  15740. return w;
  15741. };
  15742. this.removeLineWidget = function(w) {
  15743. w._inDocument = false;
  15744. if (w.el && w.el.parentNode)
  15745. w.el.parentNode.removeChild(w.el);
  15746. if (w.editor && w.editor.destroy) try {
  15747. w.editor.destroy();
  15748. } catch(e){}
  15749. if (this.session.lineWidgets)
  15750. this.session.lineWidgets[w.row] = undefined;
  15751. this.session._emit("changeFold", {data:{start:{row: w.row}}});
  15752. this.$updateRows();
  15753. };
  15754. this.onWidgetChanged = function(w) {
  15755. this.session._changedWidgets.push(w);
  15756. this.editor && this.editor.renderer.updateFull();
  15757. };
  15758. this.measureWidgets = function(e, renderer) {
  15759. var changedWidgets = this.session._changedWidgets;
  15760. var config = renderer.layerConfig;
  15761. if (!changedWidgets || !changedWidgets.length) return;
  15762. var min = Infinity;
  15763. for (var i = 0; i < changedWidgets.length; i++) {
  15764. var w = changedWidgets[i];
  15765. if (!w._inDocument) {
  15766. w._inDocument = true;
  15767. renderer.container.appendChild(w.el);
  15768. }
  15769. w.h = w.el.offsetHeight;
  15770. if (!w.fixedWidth) {
  15771. w.w = w.el.offsetWidth;
  15772. w.screenWidth = Math.ceil(w.w / config.characterWidth);
  15773. }
  15774. var rowCount = w.h / config.lineHeight;
  15775. if (w.coverLine) {
  15776. rowCount -= this.session.getRowLineCount(w.row);
  15777. if (rowCount < 0)
  15778. rowCount = 0;
  15779. }
  15780. if (w.rowCount != rowCount) {
  15781. w.rowCount = rowCount;
  15782. if (w.row < min)
  15783. min = w.row;
  15784. }
  15785. }
  15786. if (min != Infinity) {
  15787. this.session._emit("changeFold", {data:{start:{row: min}}});
  15788. this.session.lineWidgetWidth = null;
  15789. }
  15790. this.session._changedWidgets = [];
  15791. };
  15792. this.renderWidgets = function(e, renderer) {
  15793. var config = renderer.layerConfig;
  15794. var lineWidgets = this.session.lineWidgets;
  15795. if (!lineWidgets)
  15796. return;
  15797. var first = Math.min(this.firstRow, config.firstRow);
  15798. var last = Math.max(this.lastRow, config.lastRow, lineWidgets.length);
  15799. while (first > 0 && !lineWidgets[first])
  15800. first--;
  15801. this.firstRow = config.firstRow;
  15802. this.lastRow = config.lastRow;
  15803. renderer.$cursorLayer.config = config;
  15804. for (var i = first; i <= last; i++) {
  15805. var w = lineWidgets[i];
  15806. if (!w || !w.el) continue;
  15807. if (!w._inDocument) {
  15808. w._inDocument = true;
  15809. renderer.container.appendChild(w.el);
  15810. }
  15811. var top = renderer.$cursorLayer.getPixelPosition({row: i, column:0}, true).top;
  15812. if (!w.coverLine)
  15813. top += config.lineHeight * this.session.getRowLineCount(w.row);
  15814. w.el.style.top = top - config.offset + "px";
  15815. var left = w.coverGutter ? 0 : renderer.gutterWidth;
  15816. if (!w.fixedWidth)
  15817. left -= renderer.scrollLeft;
  15818. w.el.style.left = left + "px";
  15819. if (w.fixedWidth) {
  15820. w.el.style.right = renderer.scrollBar.getWidth() + "px";
  15821. } else {
  15822. w.el.style.right = "";
  15823. }
  15824. }
  15825. };
  15826. }).call(LineWidgets.prototype);
  15827. exports.LineWidgets = LineWidgets;
  15828. });
  15829. ace.define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"], function(require, exports, module) {
  15830. "use strict";
  15831. var LineWidgets = require("../line_widgets").LineWidgets;
  15832. var dom = require("../lib/dom");
  15833. var Range = require("../range").Range;
  15834. function binarySearch(array, needle, comparator) {
  15835. var first = 0;
  15836. var last = array.length - 1;
  15837. while (first <= last) {
  15838. var mid = (first + last) >> 1;
  15839. var c = comparator(needle, array[mid]);
  15840. if (c > 0)
  15841. first = mid + 1;
  15842. else if (c < 0)
  15843. last = mid - 1;
  15844. else
  15845. return mid;
  15846. }
  15847. return -(first + 1);
  15848. }
  15849. function findAnnotations(session, row, dir) {
  15850. var annotations = session.getAnnotations().sort(Range.comparePoints);
  15851. if (!annotations.length)
  15852. return;
  15853. var i = binarySearch(annotations, {row: row, column: -1}, Range.comparePoints);
  15854. if (i < 0)
  15855. i = -i - 1;
  15856. if (i >= annotations.length)
  15857. i = dir > 0 ? 0 : annotations.length - 1;
  15858. else if (i === 0 && dir < 0)
  15859. i = annotations.length - 1;
  15860. var annotation = annotations[i];
  15861. if (!annotation || !dir)
  15862. return;
  15863. if (annotation.row === row) {
  15864. do {
  15865. annotation = annotations[i += dir];
  15866. } while (annotation && annotation.row === row);
  15867. if (!annotation)
  15868. return annotations.slice();
  15869. }
  15870. var matched = [];
  15871. row = annotation.row;
  15872. do {
  15873. matched[dir < 0 ? "unshift" : "push"](annotation);
  15874. annotation = annotations[i += dir];
  15875. } while (annotation && annotation.row == row);
  15876. return matched.length && matched;
  15877. }
  15878. exports.showErrorMarker = function(editor, dir) {
  15879. var session = editor.session;
  15880. if (!session.widgetManager) {
  15881. session.widgetManager = new LineWidgets(session);
  15882. session.widgetManager.attach(editor);
  15883. }
  15884. var pos = editor.getCursorPosition();
  15885. var row = pos.row;
  15886. var oldWidget = session.lineWidgets && session.lineWidgets[row];
  15887. if (oldWidget) {
  15888. oldWidget.destroy();
  15889. } else {
  15890. row -= dir;
  15891. }
  15892. var annotations = findAnnotations(session, row, dir);
  15893. var gutterAnno;
  15894. if (annotations) {
  15895. var annotation = annotations[0];
  15896. pos.column = (annotation.pos && typeof annotation.column != "number"
  15897. ? annotation.pos.sc
  15898. : annotation.column) || 0;
  15899. pos.row = annotation.row;
  15900. gutterAnno = editor.renderer.$gutterLayer.$annotations[pos.row];
  15901. } else if (oldWidget) {
  15902. return;
  15903. } else {
  15904. gutterAnno = {
  15905. text: ["Looks good!"],
  15906. className: "ace_ok"
  15907. };
  15908. }
  15909. editor.session.unfold(pos.row);
  15910. editor.selection.moveToPosition(pos);
  15911. var w = {
  15912. row: pos.row,
  15913. fixedWidth: true,
  15914. coverGutter: true,
  15915. el: dom.createElement("div")
  15916. };
  15917. var el = w.el.appendChild(dom.createElement("div"));
  15918. var arrow = w.el.appendChild(dom.createElement("div"));
  15919. arrow.className = "error_widget_arrow " + gutterAnno.className;
  15920. var left = editor.renderer.$cursorLayer
  15921. .getPixelPosition(pos).left;
  15922. arrow.style.left = left + editor.renderer.gutterWidth - 5 + "px";
  15923. w.el.className = "error_widget_wrapper";
  15924. el.className = "error_widget " + gutterAnno.className;
  15925. el.innerHTML = gutterAnno.text.join("<br>");
  15926. el.appendChild(dom.createElement("div"));
  15927. var kb = function(_, hashId, keyString) {
  15928. if (hashId === 0 && (keyString === "esc" || keyString === "return")) {
  15929. w.destroy();
  15930. return {command: "null"};
  15931. }
  15932. };
  15933. w.destroy = function() {
  15934. if (editor.$mouseHandler.isMousePressed)
  15935. return;
  15936. editor.keyBinding.removeKeyboardHandler(kb);
  15937. session.widgetManager.removeLineWidget(w);
  15938. editor.off("changeSelection", w.destroy);
  15939. editor.off("changeSession", w.destroy);
  15940. editor.off("mouseup", w.destroy);
  15941. editor.off("change", w.destroy);
  15942. };
  15943. editor.keyBinding.addKeyboardHandler(kb);
  15944. editor.on("changeSelection", w.destroy);
  15945. editor.on("changeSession", w.destroy);
  15946. editor.on("mouseup", w.destroy);
  15947. editor.on("change", w.destroy);
  15948. editor.session.widgetManager.addLineWidget(w);
  15949. w.el.onmousedown = editor.focus.bind(editor);
  15950. editor.renderer.scrollCursorIntoView(null, 0.5, {bottom: w.el.offsetHeight});
  15951. };
  15952. dom.importCssString("\
  15953. .error_widget_wrapper {\
  15954. background: inherit;\
  15955. color: inherit;\
  15956. border:none\
  15957. }\
  15958. .error_widget {\
  15959. border-top: solid 2px;\
  15960. border-bottom: solid 2px;\
  15961. margin: 5px 0;\
  15962. padding: 10px 40px;\
  15963. white-space: pre-wrap;\
  15964. }\
  15965. .error_widget.ace_error, .error_widget_arrow.ace_error{\
  15966. border-color: #ff5a5a\
  15967. }\
  15968. .error_widget.ace_warning, .error_widget_arrow.ace_warning{\
  15969. border-color: #F1D817\
  15970. }\
  15971. .error_widget.ace_info, .error_widget_arrow.ace_info{\
  15972. border-color: #5a5a5a\
  15973. }\
  15974. .error_widget.ace_ok, .error_widget_arrow.ace_ok{\
  15975. border-color: #5aaa5a\
  15976. }\
  15977. .error_widget_arrow {\
  15978. position: absolute;\
  15979. border: solid 5px;\
  15980. border-top-color: transparent!important;\
  15981. border-right-color: transparent!important;\
  15982. border-left-color: transparent!important;\
  15983. top: -5px;\
  15984. }\
  15985. ", "");
  15986. });
  15987. ace.define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"], function(require, exports, module) {
  15988. "use strict";
  15989. require("./lib/fixoldbrowsers");
  15990. var dom = require("./lib/dom");
  15991. var event = require("./lib/event");
  15992. var Editor = require("./editor").Editor;
  15993. var EditSession = require("./edit_session").EditSession;
  15994. var UndoManager = require("./undomanager").UndoManager;
  15995. var Renderer = require("./virtual_renderer").VirtualRenderer;
  15996. require("./worker/worker_client");
  15997. require("./keyboard/hash_handler");
  15998. require("./placeholder");
  15999. require("./multi_select");
  16000. require("./mode/folding/fold_mode");
  16001. require("./theme/textmate");
  16002. require("./ext/error_marker");
  16003. exports.config = require("./config");
  16004. exports.require = require;
  16005. exports.edit = function(el) {
  16006. if (typeof(el) == "string") {
  16007. var _id = el;
  16008. el = document.getElementById(_id);
  16009. if (!el)
  16010. throw new Error("ace.edit can't find div #" + _id);
  16011. }
  16012. if (el && el.env && el.env.editor instanceof Editor)
  16013. return el.env.editor;
  16014. var value = "";
  16015. if (el && /input|textarea/i.test(el.tagName)) {
  16016. var oldNode = el;
  16017. value = oldNode.value;
  16018. el = dom.createElement("pre");
  16019. oldNode.parentNode.replaceChild(el, oldNode);
  16020. } else {
  16021. value = dom.getInnerText(el);
  16022. el.innerHTML = '';
  16023. }
  16024. var doc = exports.createEditSession(value);
  16025. var editor = new Editor(new Renderer(el));
  16026. editor.setSession(doc);
  16027. var env = {
  16028. document: doc,
  16029. editor: editor,
  16030. onResize: editor.resize.bind(editor, null)
  16031. };
  16032. if (oldNode) env.textarea = oldNode;
  16033. event.addListener(window, "resize", env.onResize);
  16034. editor.on("destroy", function() {
  16035. event.removeListener(window, "resize", env.onResize);
  16036. env.editor.container.env = null; // prevent memory leak on old ie
  16037. });
  16038. editor.container.env = editor.env = env;
  16039. return editor;
  16040. };
  16041. exports.createEditSession = function(text, mode) {
  16042. var doc = new EditSession(text, mode);
  16043. doc.setUndoManager(new UndoManager());
  16044. return doc;
  16045. }
  16046. exports.EditSession = EditSession;
  16047. exports.UndoManager = UndoManager;
  16048. });
  16049. (function() {
  16050. ace.require(["ace/ace"], function(a) {
  16051. a && a.config.init(true);
  16052. if (!window.ace)
  16053. window.ace = a;
  16054. for (var key in a) if (a.hasOwnProperty(key))
  16055. window.ace[key] = a[key];
  16056. });
  16057. })();
  16058. ace.define("ace/snippets",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/anchor","ace/keyboard/hash_handler","ace/tokenizer","ace/lib/dom","ace/editor"], function(require, exports, module) {
  16059. "use strict";
  16060. var oop = require("./lib/oop");
  16061. var EventEmitter = require("./lib/event_emitter").EventEmitter;
  16062. var lang = require("./lib/lang");
  16063. var Range = require("./range").Range;
  16064. var Anchor = require("./anchor").Anchor;
  16065. var HashHandler = require("./keyboard/hash_handler").HashHandler;
  16066. var Tokenizer = require("./tokenizer").Tokenizer;
  16067. var comparePoints = Range.comparePoints;
  16068. var SnippetManager = function() {
  16069. this.snippetMap = {};
  16070. this.snippetNameMap = {};
  16071. };
  16072. (function() {
  16073. oop.implement(this, EventEmitter);
  16074. this.getTokenizer = function() {
  16075. function TabstopToken(str, _, stack) {
  16076. str = str.substr(1);
  16077. if (/^\d+$/.test(str) && !stack.inFormatString)
  16078. return [{tabstopId: parseInt(str, 10)}];
  16079. return [{text: str}];
  16080. }
  16081. function escape(ch) {
  16082. return "(?:[^\\\\" + ch + "]|\\\\.)";
  16083. }
  16084. SnippetManager.$tokenizer = new Tokenizer({
  16085. start: [
  16086. {regex: /:/, onMatch: function(val, state, stack) {
  16087. if (stack.length && stack[0].expectIf) {
  16088. stack[0].expectIf = false;
  16089. stack[0].elseBranch = stack[0];
  16090. return [stack[0]];
  16091. }
  16092. return ":";
  16093. }},
  16094. {regex: /\\./, onMatch: function(val, state, stack) {
  16095. var ch = val[1];
  16096. if (ch == "}" && stack.length) {
  16097. val = ch;
  16098. }else if ("`$\\".indexOf(ch) != -1) {
  16099. val = ch;
  16100. } else if (stack.inFormatString) {
  16101. if (ch == "n")
  16102. val = "\n";
  16103. else if (ch == "t")
  16104. val = "\n";
  16105. else if ("ulULE".indexOf(ch) != -1) {
  16106. val = {changeCase: ch, local: ch > "a"};
  16107. }
  16108. }
  16109. return [val];
  16110. }},
  16111. {regex: /}/, onMatch: function(val, state, stack) {
  16112. return [stack.length ? stack.shift() : val];
  16113. }},
  16114. {regex: /\$(?:\d+|\w+)/, onMatch: TabstopToken},
  16115. {regex: /\$\{[\dA-Z_a-z]+/, onMatch: function(str, state, stack) {
  16116. var t = TabstopToken(str.substr(1), state, stack);
  16117. stack.unshift(t[0]);
  16118. return t;
  16119. }, next: "snippetVar"},
  16120. {regex: /\n/, token: "newline", merge: false}
  16121. ],
  16122. snippetVar: [
  16123. {regex: "\\|" + escape("\\|") + "*\\|", onMatch: function(val, state, stack) {
  16124. stack[0].choices = val.slice(1, -1).split(",");
  16125. }, next: "start"},
  16126. {regex: "/(" + escape("/") + "+)/(?:(" + escape("/") + "*)/)(\\w*):?",
  16127. onMatch: function(val, state, stack) {
  16128. var ts = stack[0];
  16129. ts.fmtString = val;
  16130. val = this.splitRegex.exec(val);
  16131. ts.guard = val[1];
  16132. ts.fmt = val[2];
  16133. ts.flag = val[3];
  16134. return "";
  16135. }, next: "start"},
  16136. {regex: "`" + escape("`") + "*`", onMatch: function(val, state, stack) {
  16137. stack[0].code = val.splice(1, -1);
  16138. return "";
  16139. }, next: "start"},
  16140. {regex: "\\?", onMatch: function(val, state, stack) {
  16141. if (stack[0])
  16142. stack[0].expectIf = true;
  16143. }, next: "start"},
  16144. {regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "start"}
  16145. ],
  16146. formatString: [
  16147. {regex: "/(" + escape("/") + "+)/", token: "regex"},
  16148. {regex: "", onMatch: function(val, state, stack) {
  16149. stack.inFormatString = true;
  16150. }, next: "start"}
  16151. ]
  16152. });
  16153. SnippetManager.prototype.getTokenizer = function() {
  16154. return SnippetManager.$tokenizer;
  16155. };
  16156. return SnippetManager.$tokenizer;
  16157. };
  16158. this.tokenizeTmSnippet = function(str, startState) {
  16159. return this.getTokenizer().getLineTokens(str, startState).tokens.map(function(x) {
  16160. return x.value || x;
  16161. });
  16162. };
  16163. this.$getDefaultValue = function(editor, name) {
  16164. if (/^[A-Z]\d+$/.test(name)) {
  16165. var i = name.substr(1);
  16166. return (this.variables[name[0] + "__"] || {})[i];
  16167. }
  16168. if (/^\d+$/.test(name)) {
  16169. return (this.variables.__ || {})[name];
  16170. }
  16171. name = name.replace(/^TM_/, "");
  16172. if (!editor)
  16173. return;
  16174. var s = editor.session;
  16175. switch(name) {
  16176. case "CURRENT_WORD":
  16177. var r = s.getWordRange();
  16178. case "SELECTION":
  16179. case "SELECTED_TEXT":
  16180. return s.getTextRange(r);
  16181. case "CURRENT_LINE":
  16182. return s.getLine(editor.getCursorPosition().row);
  16183. case "PREV_LINE": // not possible in textmate
  16184. return s.getLine(editor.getCursorPosition().row - 1);
  16185. case "LINE_INDEX":
  16186. return editor.getCursorPosition().column;
  16187. case "LINE_NUMBER":
  16188. return editor.getCursorPosition().row + 1;
  16189. case "SOFT_TABS":
  16190. return s.getUseSoftTabs() ? "YES" : "NO";
  16191. case "TAB_SIZE":
  16192. return s.getTabSize();
  16193. case "FILENAME":
  16194. case "FILEPATH":
  16195. return "";
  16196. case "FULLNAME":
  16197. return "Ace";
  16198. }
  16199. };
  16200. this.variables = {};
  16201. this.getVariableValue = function(editor, varName) {
  16202. if (this.variables.hasOwnProperty(varName))
  16203. return this.variables[varName](editor, varName) || "";
  16204. return this.$getDefaultValue(editor, varName) || "";
  16205. };
  16206. this.tmStrFormat = function(str, ch, editor) {
  16207. var flag = ch.flag || "";
  16208. var re = ch.guard;
  16209. re = new RegExp(re, flag.replace(/[^gi]/, ""));
  16210. var fmtTokens = this.tokenizeTmSnippet(ch.fmt, "formatString");
  16211. var _self = this;
  16212. var formatted = str.replace(re, function() {
  16213. _self.variables.__ = arguments;
  16214. var fmtParts = _self.resolveVariables(fmtTokens, editor);
  16215. var gChangeCase = "E";
  16216. for (var i = 0; i < fmtParts.length; i++) {
  16217. var ch = fmtParts[i];
  16218. if (typeof ch == "object") {
  16219. fmtParts[i] = "";
  16220. if (ch.changeCase && ch.local) {
  16221. var next = fmtParts[i + 1];
  16222. if (next && typeof next == "string") {
  16223. if (ch.changeCase == "u")
  16224. fmtParts[i] = next[0].toUpperCase();
  16225. else
  16226. fmtParts[i] = next[0].toLowerCase();
  16227. fmtParts[i + 1] = next.substr(1);
  16228. }
  16229. } else if (ch.changeCase) {
  16230. gChangeCase = ch.changeCase;
  16231. }
  16232. } else if (gChangeCase == "U") {
  16233. fmtParts[i] = ch.toUpperCase();
  16234. } else if (gChangeCase == "L") {
  16235. fmtParts[i] = ch.toLowerCase();
  16236. }
  16237. }
  16238. return fmtParts.join("");
  16239. });
  16240. this.variables.__ = null;
  16241. return formatted;
  16242. };
  16243. this.resolveVariables = function(snippet, editor) {
  16244. var result = [];
  16245. for (var i = 0; i < snippet.length; i++) {
  16246. var ch = snippet[i];
  16247. if (typeof ch == "string") {
  16248. result.push(ch);
  16249. } else if (typeof ch != "object") {
  16250. continue;
  16251. } else if (ch.skip) {
  16252. gotoNext(ch);
  16253. } else if (ch.processed < i) {
  16254. continue;
  16255. } else if (ch.text) {
  16256. var value = this.getVariableValue(editor, ch.text);
  16257. if (value && ch.fmtString)
  16258. value = this.tmStrFormat(value, ch);
  16259. ch.processed = i;
  16260. if (ch.expectIf == null) {
  16261. if (value) {
  16262. result.push(value);
  16263. gotoNext(ch);
  16264. }
  16265. } else {
  16266. if (value) {
  16267. ch.skip = ch.elseBranch;
  16268. } else
  16269. gotoNext(ch);
  16270. }
  16271. } else if (ch.tabstopId != null) {
  16272. result.push(ch);
  16273. } else if (ch.changeCase != null) {
  16274. result.push(ch);
  16275. }
  16276. }
  16277. function gotoNext(ch) {
  16278. var i1 = snippet.indexOf(ch, i + 1);
  16279. if (i1 != -1)
  16280. i = i1;
  16281. }
  16282. return result;
  16283. };
  16284. this.insertSnippetForSelection = function(editor, snippetText) {
  16285. var cursor = editor.getCursorPosition();
  16286. var line = editor.session.getLine(cursor.row);
  16287. var tabString = editor.session.getTabString();
  16288. var indentString = line.match(/^\s*/)[0];
  16289. if (cursor.column < indentString.length)
  16290. indentString = indentString.slice(0, cursor.column);
  16291. var tokens = this.tokenizeTmSnippet(snippetText);
  16292. tokens = this.resolveVariables(tokens, editor);
  16293. tokens = tokens.map(function(x) {
  16294. if (x == "\n")
  16295. return x + indentString;
  16296. if (typeof x == "string")
  16297. return x.replace(/\t/g, tabString);
  16298. return x;
  16299. });
  16300. var tabstops = [];
  16301. tokens.forEach(function(p, i) {
  16302. if (typeof p != "object")
  16303. return;
  16304. var id = p.tabstopId;
  16305. var ts = tabstops[id];
  16306. if (!ts) {
  16307. ts = tabstops[id] = [];
  16308. ts.index = id;
  16309. ts.value = "";
  16310. }
  16311. if (ts.indexOf(p) !== -1)
  16312. return;
  16313. ts.push(p);
  16314. var i1 = tokens.indexOf(p, i + 1);
  16315. if (i1 === -1)
  16316. return;
  16317. var value = tokens.slice(i + 1, i1);
  16318. var isNested = value.some(function(t) {return typeof t === "object"});
  16319. if (isNested && !ts.value) {
  16320. ts.value = value;
  16321. } else if (value.length && (!ts.value || typeof ts.value !== "string")) {
  16322. ts.value = value.join("");
  16323. }
  16324. });
  16325. tabstops.forEach(function(ts) {ts.length = 0});
  16326. var expanding = {};
  16327. function copyValue(val) {
  16328. var copy = [];
  16329. for (var i = 0; i < val.length; i++) {
  16330. var p = val[i];
  16331. if (typeof p == "object") {
  16332. if (expanding[p.tabstopId])
  16333. continue;
  16334. var j = val.lastIndexOf(p, i - 1);
  16335. p = copy[j] || {tabstopId: p.tabstopId};
  16336. }
  16337. copy[i] = p;
  16338. }
  16339. return copy;
  16340. }
  16341. for (var i = 0; i < tokens.length; i++) {
  16342. var p = tokens[i];
  16343. if (typeof p != "object")
  16344. continue;
  16345. var id = p.tabstopId;
  16346. var i1 = tokens.indexOf(p, i + 1);
  16347. if (expanding[id]) {
  16348. if (expanding[id] === p)
  16349. expanding[id] = null;
  16350. continue;
  16351. }
  16352. var ts = tabstops[id];
  16353. var arg = typeof ts.value == "string" ? [ts.value] : copyValue(ts.value);
  16354. arg.unshift(i + 1, Math.max(0, i1 - i));
  16355. arg.push(p);
  16356. expanding[id] = p;
  16357. tokens.splice.apply(tokens, arg);
  16358. if (ts.indexOf(p) === -1)
  16359. ts.push(p);
  16360. }
  16361. var row = 0, column = 0;
  16362. var text = "";
  16363. tokens.forEach(function(t) {
  16364. if (typeof t === "string") {
  16365. if (t[0] === "\n"){
  16366. column = t.length - 1;
  16367. row ++;
  16368. } else
  16369. column += t.length;
  16370. text += t;
  16371. } else {
  16372. if (!t.start)
  16373. t.start = {row: row, column: column};
  16374. else
  16375. t.end = {row: row, column: column};
  16376. }
  16377. });
  16378. var range = editor.getSelectionRange();
  16379. var end = editor.session.replace(range, text);
  16380. var tabstopManager = new TabstopManager(editor);
  16381. var selectionId = editor.inVirtualSelectionMode && editor.selection.index;
  16382. tabstopManager.addTabstops(tabstops, range.start, end, selectionId);
  16383. };
  16384. this.insertSnippet = function(editor, snippetText) {
  16385. var self = this;
  16386. if (editor.inVirtualSelectionMode)
  16387. return self.insertSnippetForSelection(editor, snippetText);
  16388. editor.forEachSelection(function() {
  16389. self.insertSnippetForSelection(editor, snippetText);
  16390. }, null, {keepOrder: true});
  16391. if (editor.tabstopManager)
  16392. editor.tabstopManager.tabNext();
  16393. };
  16394. this.$getScope = function(editor) {
  16395. var scope = editor.session.$mode.$id || "";
  16396. scope = scope.split("/").pop();
  16397. if (scope === "html" || scope === "php") {
  16398. if (scope === "php" && !editor.session.$mode.inlinePhp)
  16399. scope = "html";
  16400. var c = editor.getCursorPosition();
  16401. var state = editor.session.getState(c.row);
  16402. if (typeof state === "object") {
  16403. state = state[0];
  16404. }
  16405. if (state.substring) {
  16406. if (state.substring(0, 3) == "js-")
  16407. scope = "javascript";
  16408. else if (state.substring(0, 4) == "css-")
  16409. scope = "css";
  16410. else if (state.substring(0, 4) == "php-")
  16411. scope = "php";
  16412. }
  16413. }
  16414. return scope;
  16415. };
  16416. this.getActiveScopes = function(editor) {
  16417. var scope = this.$getScope(editor);
  16418. var scopes = [scope];
  16419. var snippetMap = this.snippetMap;
  16420. if (snippetMap[scope] && snippetMap[scope].includeScopes) {
  16421. scopes.push.apply(scopes, snippetMap[scope].includeScopes);
  16422. }
  16423. scopes.push("_");
  16424. return scopes;
  16425. };
  16426. this.expandWithTab = function(editor, options) {
  16427. var self = this;
  16428. var result = editor.forEachSelection(function() {
  16429. return self.expandSnippetForSelection(editor, options);
  16430. }, null, {keepOrder: true});
  16431. if (result && editor.tabstopManager)
  16432. editor.tabstopManager.tabNext();
  16433. return result;
  16434. };
  16435. this.expandSnippetForSelection = function(editor, options) {
  16436. var cursor = editor.getCursorPosition();
  16437. var line = editor.session.getLine(cursor.row);
  16438. var before = line.substring(0, cursor.column);
  16439. var after = line.substr(cursor.column);
  16440. var snippetMap = this.snippetMap;
  16441. var snippet;
  16442. this.getActiveScopes(editor).some(function(scope) {
  16443. var snippets = snippetMap[scope];
  16444. if (snippets)
  16445. snippet = this.findMatchingSnippet(snippets, before, after);
  16446. return !!snippet;
  16447. }, this);
  16448. if (!snippet)
  16449. return false;
  16450. if (options && options.dryRun)
  16451. return true;
  16452. editor.session.doc.removeInLine(cursor.row,
  16453. cursor.column - snippet.replaceBefore.length,
  16454. cursor.column + snippet.replaceAfter.length
  16455. );
  16456. this.variables.M__ = snippet.matchBefore;
  16457. this.variables.T__ = snippet.matchAfter;
  16458. this.insertSnippetForSelection(editor, snippet.content);
  16459. this.variables.M__ = this.variables.T__ = null;
  16460. return true;
  16461. };
  16462. this.findMatchingSnippet = function(snippetList, before, after) {
  16463. for (var i = snippetList.length; i--;) {
  16464. var s = snippetList[i];
  16465. if (s.startRe && !s.startRe.test(before))
  16466. continue;
  16467. if (s.endRe && !s.endRe.test(after))
  16468. continue;
  16469. if (!s.startRe && !s.endRe)
  16470. continue;
  16471. s.matchBefore = s.startRe ? s.startRe.exec(before) : [""];
  16472. s.matchAfter = s.endRe ? s.endRe.exec(after) : [""];
  16473. s.replaceBefore = s.triggerRe ? s.triggerRe.exec(before)[0] : "";
  16474. s.replaceAfter = s.endTriggerRe ? s.endTriggerRe.exec(after)[0] : "";
  16475. return s;
  16476. }
  16477. };
  16478. this.snippetMap = {};
  16479. this.snippetNameMap = {};
  16480. this.register = function(snippets, scope) {
  16481. var snippetMap = this.snippetMap;
  16482. var snippetNameMap = this.snippetNameMap;
  16483. var self = this;
  16484. if (!snippets)
  16485. snippets = [];
  16486. function wrapRegexp(src) {
  16487. if (src && !/^\^?\(.*\)\$?$|^\\b$/.test(src))
  16488. src = "(?:" + src + ")";
  16489. return src || "";
  16490. }
  16491. function guardedRegexp(re, guard, opening) {
  16492. re = wrapRegexp(re);
  16493. guard = wrapRegexp(guard);
  16494. if (opening) {
  16495. re = guard + re;
  16496. if (re && re[re.length - 1] != "$")
  16497. re = re + "$";
  16498. } else {
  16499. re = re + guard;
  16500. if (re && re[0] != "^")
  16501. re = "^" + re;
  16502. }
  16503. return new RegExp(re);
  16504. }
  16505. function addSnippet(s) {
  16506. if (!s.scope)
  16507. s.scope = scope || "_";
  16508. scope = s.scope;
  16509. if (!snippetMap[scope]) {
  16510. snippetMap[scope] = [];
  16511. snippetNameMap[scope] = {};
  16512. }
  16513. var map = snippetNameMap[scope];
  16514. if (s.name) {
  16515. var old = map[s.name];
  16516. if (old)
  16517. self.unregister(old);
  16518. map[s.name] = s;
  16519. }
  16520. snippetMap[scope].push(s);
  16521. if (s.tabTrigger && !s.trigger) {
  16522. if (!s.guard && /^\w/.test(s.tabTrigger))
  16523. s.guard = "\\b";
  16524. s.trigger = lang.escapeRegExp(s.tabTrigger);
  16525. }
  16526. s.startRe = guardedRegexp(s.trigger, s.guard, true);
  16527. s.triggerRe = new RegExp(s.trigger, "", true);
  16528. s.endRe = guardedRegexp(s.endTrigger, s.endGuard, true);
  16529. s.endTriggerRe = new RegExp(s.endTrigger, "", true);
  16530. }
  16531. if (snippets && snippets.content)
  16532. addSnippet(snippets);
  16533. else if (Array.isArray(snippets))
  16534. snippets.forEach(addSnippet);
  16535. this._signal("registerSnippets", {scope: scope});
  16536. };
  16537. this.unregister = function(snippets, scope) {
  16538. var snippetMap = this.snippetMap;
  16539. var snippetNameMap = this.snippetNameMap;
  16540. function removeSnippet(s) {
  16541. var nameMap = snippetNameMap[s.scope||scope];
  16542. if (nameMap && nameMap[s.name]) {
  16543. delete nameMap[s.name];
  16544. var map = snippetMap[s.scope||scope];
  16545. var i = map && map.indexOf(s);
  16546. if (i >= 0)
  16547. map.splice(i, 1);
  16548. }
  16549. }
  16550. if (snippets.content)
  16551. removeSnippet(snippets);
  16552. else if (Array.isArray(snippets))
  16553. snippets.forEach(removeSnippet);
  16554. };
  16555. this.parseSnippetFile = function(str) {
  16556. str = str.replace(/\r/g, "");
  16557. var list = [], snippet = {};
  16558. var re = /^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm;
  16559. var m;
  16560. while (m = re.exec(str)) {
  16561. if (m[1]) {
  16562. try {
  16563. snippet = JSON.parse(m[1]);
  16564. list.push(snippet);
  16565. } catch (e) {}
  16566. } if (m[4]) {
  16567. snippet.content = m[4].replace(/^\t/gm, "");
  16568. list.push(snippet);
  16569. snippet = {};
  16570. } else {
  16571. var key = m[2], val = m[3];
  16572. if (key == "regex") {
  16573. var guardRe = /\/((?:[^\/\\]|\\.)*)|$/g;
  16574. snippet.guard = guardRe.exec(val)[1];
  16575. snippet.trigger = guardRe.exec(val)[1];
  16576. snippet.endTrigger = guardRe.exec(val)[1];
  16577. snippet.endGuard = guardRe.exec(val)[1];
  16578. } else if (key == "snippet") {
  16579. snippet.tabTrigger = val.match(/^\S*/)[0];
  16580. if (!snippet.name)
  16581. snippet.name = val;
  16582. } else {
  16583. snippet[key] = val;
  16584. }
  16585. }
  16586. }
  16587. return list;
  16588. };
  16589. this.getSnippetByName = function(name, editor) {
  16590. var snippetMap = this.snippetNameMap;
  16591. var snippet;
  16592. this.getActiveScopes(editor).some(function(scope) {
  16593. var snippets = snippetMap[scope];
  16594. if (snippets)
  16595. snippet = snippets[name];
  16596. return !!snippet;
  16597. }, this);
  16598. return snippet;
  16599. };
  16600. }).call(SnippetManager.prototype);
  16601. var TabstopManager = function(editor) {
  16602. if (editor.tabstopManager)
  16603. return editor.tabstopManager;
  16604. editor.tabstopManager = this;
  16605. this.$onChange = this.onChange.bind(this);
  16606. this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule;
  16607. this.$onChangeSession = this.onChangeSession.bind(this);
  16608. this.$onAfterExec = this.onAfterExec.bind(this);
  16609. this.attach(editor);
  16610. };
  16611. (function() {
  16612. this.attach = function(editor) {
  16613. this.index = 0;
  16614. this.ranges = [];
  16615. this.tabstops = [];
  16616. this.$openTabstops = null;
  16617. this.selectedTabstop = null;
  16618. this.editor = editor;
  16619. this.editor.on("change", this.$onChange);
  16620. this.editor.on("changeSelection", this.$onChangeSelection);
  16621. this.editor.on("changeSession", this.$onChangeSession);
  16622. this.editor.commands.on("afterExec", this.$onAfterExec);
  16623. this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler);
  16624. };
  16625. this.detach = function() {
  16626. this.tabstops.forEach(this.removeTabstopMarkers, this);
  16627. this.ranges = null;
  16628. this.tabstops = null;
  16629. this.selectedTabstop = null;
  16630. this.editor.removeListener("change", this.$onChange);
  16631. this.editor.removeListener("changeSelection", this.$onChangeSelection);
  16632. this.editor.removeListener("changeSession", this.$onChangeSession);
  16633. this.editor.commands.removeListener("afterExec", this.$onAfterExec);
  16634. this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler);
  16635. this.editor.tabstopManager = null;
  16636. this.editor = null;
  16637. };
  16638. this.onChange = function(e) {
  16639. var changeRange = e.data.range;
  16640. var isRemove = e.data.action[0] == "r";
  16641. var start = changeRange.start;
  16642. var end = changeRange.end;
  16643. var startRow = start.row;
  16644. var endRow = end.row;
  16645. var lineDif = endRow - startRow;
  16646. var colDiff = end.column - start.column;
  16647. if (isRemove) {
  16648. lineDif = -lineDif;
  16649. colDiff = -colDiff;
  16650. }
  16651. if (!this.$inChange && isRemove) {
  16652. var ts = this.selectedTabstop;
  16653. var changedOutside = ts && !ts.some(function(r) {
  16654. return comparePoints(r.start, start) <= 0 && comparePoints(r.end, end) >= 0;
  16655. });
  16656. if (changedOutside)
  16657. return this.detach();
  16658. }
  16659. var ranges = this.ranges;
  16660. for (var i = 0; i < ranges.length; i++) {
  16661. var r = ranges[i];
  16662. if (r.end.row < start.row)
  16663. continue;
  16664. if (isRemove && comparePoints(start, r.start) < 0 && comparePoints(end, r.end) > 0) {
  16665. this.removeRange(r);
  16666. i--;
  16667. continue;
  16668. }
  16669. if (r.start.row == startRow && r.start.column > start.column)
  16670. r.start.column += colDiff;
  16671. if (r.end.row == startRow && r.end.column >= start.column)
  16672. r.end.column += colDiff;
  16673. if (r.start.row >= startRow)
  16674. r.start.row += lineDif;
  16675. if (r.end.row >= startRow)
  16676. r.end.row += lineDif;
  16677. if (comparePoints(r.start, r.end) > 0)
  16678. this.removeRange(r);
  16679. }
  16680. if (!ranges.length)
  16681. this.detach();
  16682. };
  16683. this.updateLinkedFields = function() {
  16684. var ts = this.selectedTabstop;
  16685. if (!ts || !ts.hasLinkedRanges)
  16686. return;
  16687. this.$inChange = true;
  16688. var session = this.editor.session;
  16689. var text = session.getTextRange(ts.firstNonLinked);
  16690. for (var i = ts.length; i--;) {
  16691. var range = ts[i];
  16692. if (!range.linked)
  16693. continue;
  16694. var fmt = exports.snippetManager.tmStrFormat(text, range.original);
  16695. session.replace(range, fmt);
  16696. }
  16697. this.$inChange = false;
  16698. };
  16699. this.onAfterExec = function(e) {
  16700. if (e.command && !e.command.readOnly)
  16701. this.updateLinkedFields();
  16702. };
  16703. this.onChangeSelection = function() {
  16704. if (!this.editor)
  16705. return;
  16706. var lead = this.editor.selection.lead;
  16707. var anchor = this.editor.selection.anchor;
  16708. var isEmpty = this.editor.selection.isEmpty();
  16709. for (var i = this.ranges.length; i--;) {
  16710. if (this.ranges[i].linked)
  16711. continue;
  16712. var containsLead = this.ranges[i].contains(lead.row, lead.column);
  16713. var containsAnchor = isEmpty || this.ranges[i].contains(anchor.row, anchor.column);
  16714. if (containsLead && containsAnchor)
  16715. return;
  16716. }
  16717. this.detach();
  16718. };
  16719. this.onChangeSession = function() {
  16720. this.detach();
  16721. };
  16722. this.tabNext = function(dir) {
  16723. var max = this.tabstops.length;
  16724. var index = this.index + (dir || 1);
  16725. index = Math.min(Math.max(index, 1), max);
  16726. if (index == max)
  16727. index = 0;
  16728. this.selectTabstop(index);
  16729. if (index === 0)
  16730. this.detach();
  16731. };
  16732. this.selectTabstop = function(index) {
  16733. this.$openTabstops = null;
  16734. var ts = this.tabstops[this.index];
  16735. if (ts)
  16736. this.addTabstopMarkers(ts);
  16737. this.index = index;
  16738. ts = this.tabstops[this.index];
  16739. if (!ts || !ts.length)
  16740. return;
  16741. this.selectedTabstop = ts;
  16742. if (!this.editor.inVirtualSelectionMode) {
  16743. var sel = this.editor.multiSelect;
  16744. sel.toSingleRange(ts.firstNonLinked.clone());
  16745. for (var i = ts.length; i--;) {
  16746. if (ts.hasLinkedRanges && ts[i].linked)
  16747. continue;
  16748. sel.addRange(ts[i].clone(), true);
  16749. }
  16750. if (sel.ranges[0])
  16751. sel.addRange(sel.ranges[0].clone());
  16752. } else {
  16753. this.editor.selection.setRange(ts.firstNonLinked);
  16754. }
  16755. this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler);
  16756. };
  16757. this.addTabstops = function(tabstops, start, end) {
  16758. if (!this.$openTabstops)
  16759. this.$openTabstops = [];
  16760. if (!tabstops[0]) {
  16761. var p = Range.fromPoints(end, end);
  16762. moveRelative(p.start, start);
  16763. moveRelative(p.end, start);
  16764. tabstops[0] = [p];
  16765. tabstops[0].index = 0;
  16766. }
  16767. var i = this.index;
  16768. var arg = [i + 1, 0];
  16769. var ranges = this.ranges;
  16770. tabstops.forEach(function(ts, index) {
  16771. var dest = this.$openTabstops[index] || ts;
  16772. for (var i = ts.length; i--;) {
  16773. var p = ts[i];
  16774. var range = Range.fromPoints(p.start, p.end || p.start);
  16775. movePoint(range.start, start);
  16776. movePoint(range.end, start);
  16777. range.original = p;
  16778. range.tabstop = dest;
  16779. ranges.push(range);
  16780. if (dest != ts)
  16781. dest.unshift(range);
  16782. else
  16783. dest[i] = range;
  16784. if (p.fmtString) {
  16785. range.linked = true;
  16786. dest.hasLinkedRanges = true;
  16787. } else if (!dest.firstNonLinked)
  16788. dest.firstNonLinked = range;
  16789. }
  16790. if (!dest.firstNonLinked)
  16791. dest.hasLinkedRanges = false;
  16792. if (dest === ts) {
  16793. arg.push(dest);
  16794. this.$openTabstops[index] = dest;
  16795. }
  16796. this.addTabstopMarkers(dest);
  16797. }, this);
  16798. if (arg.length > 2) {
  16799. if (this.tabstops.length)
  16800. arg.push(arg.splice(2, 1)[0]);
  16801. this.tabstops.splice.apply(this.tabstops, arg);
  16802. }
  16803. };
  16804. this.addTabstopMarkers = function(ts) {
  16805. var session = this.editor.session;
  16806. ts.forEach(function(range) {
  16807. if (!range.markerId)
  16808. range.markerId = session.addMarker(range, "ace_snippet-marker", "text");
  16809. });
  16810. };
  16811. this.removeTabstopMarkers = function(ts) {
  16812. var session = this.editor.session;
  16813. ts.forEach(function(range) {
  16814. session.removeMarker(range.markerId);
  16815. range.markerId = null;
  16816. });
  16817. };
  16818. this.removeRange = function(range) {
  16819. var i = range.tabstop.indexOf(range);
  16820. range.tabstop.splice(i, 1);
  16821. i = this.ranges.indexOf(range);
  16822. this.ranges.splice(i, 1);
  16823. this.editor.session.removeMarker(range.markerId);
  16824. if (!range.tabstop.length) {
  16825. i = this.tabstops.indexOf(range.tabstop);
  16826. if (i != -1)
  16827. this.tabstops.splice(i, 1);
  16828. if (!this.tabstops.length)
  16829. this.detach();
  16830. }
  16831. };
  16832. this.keyboardHandler = new HashHandler();
  16833. this.keyboardHandler.bindKeys({
  16834. "Tab": function(ed) {
  16835. if (exports.snippetManager && exports.snippetManager.expandWithTab(ed)) {
  16836. return;
  16837. }
  16838. ed.tabstopManager.tabNext(1);
  16839. },
  16840. "Shift-Tab": function(ed) {
  16841. ed.tabstopManager.tabNext(-1);
  16842. },
  16843. "Esc": function(ed) {
  16844. ed.tabstopManager.detach();
  16845. },
  16846. "Return": function(ed) {
  16847. return false;
  16848. }
  16849. });
  16850. }).call(TabstopManager.prototype);
  16851. var changeTracker = {};
  16852. changeTracker.onChange = Anchor.prototype.onChange;
  16853. changeTracker.setPosition = function(row, column) {
  16854. this.pos.row = row;
  16855. this.pos.column = column;
  16856. };
  16857. changeTracker.update = function(pos, delta, $insertRight) {
  16858. this.$insertRight = $insertRight;
  16859. this.pos = pos;
  16860. this.onChange(delta);
  16861. };
  16862. var movePoint = function(point, diff) {
  16863. if (point.row == 0)
  16864. point.column += diff.column;
  16865. point.row += diff.row;
  16866. };
  16867. var moveRelative = function(point, start) {
  16868. if (point.row == start.row)
  16869. point.column -= start.column;
  16870. point.row -= start.row;
  16871. };
  16872. require("./lib/dom").importCssString("\
  16873. .ace_snippet-marker {\
  16874. -moz-box-sizing: border-box;\
  16875. box-sizing: border-box;\
  16876. background: rgba(194, 193, 208, 0.09);\
  16877. border: 1px dotted rgba(211, 208, 235, 0.62);\
  16878. position: absolute;\
  16879. }");
  16880. exports.snippetManager = new SnippetManager();
  16881. var Editor = require("./editor").Editor;
  16882. (function() {
  16883. this.insertSnippet = function(content, options) {
  16884. return exports.snippetManager.insertSnippet(this, content, options);
  16885. };
  16886. this.expandSnippet = function(options) {
  16887. return exports.snippetManager.expandWithTab(this, options);
  16888. };
  16889. }).call(Editor.prototype);
  16890. });
  16891. ace.define("ace/autocomplete/popup",["require","exports","module","ace/edit_session","ace/virtual_renderer","ace/editor","ace/range","ace/lib/event","ace/lib/lang","ace/lib/dom"], function(require, exports, module) {
  16892. "use strict";
  16893. var EditSession = require("../edit_session").EditSession;
  16894. var Renderer = require("../virtual_renderer").VirtualRenderer;
  16895. var Editor = require("../editor").Editor;
  16896. var Range = require("../range").Range;
  16897. var event = require("../lib/event");
  16898. var lang = require("../lib/lang");
  16899. var dom = require("../lib/dom");
  16900. var $singleLineEditor = function(el) {
  16901. var renderer = new Renderer(el);
  16902. renderer.$maxLines = 4;
  16903. var editor = new Editor(renderer);
  16904. editor.setHighlightActiveLine(false);
  16905. editor.setShowPrintMargin(false);
  16906. editor.renderer.setShowGutter(false);
  16907. editor.renderer.setHighlightGutterLine(false);
  16908. editor.$mouseHandler.$focusWaitTimout = 0;
  16909. editor.$highlightTagPending = true;
  16910. return editor;
  16911. };
  16912. var AcePopup = function(parentNode) {
  16913. var el = dom.createElement("div");
  16914. var popup = new $singleLineEditor(el);
  16915. if (parentNode)
  16916. parentNode.appendChild(el);
  16917. el.style.display = "none";
  16918. popup.renderer.content.style.cursor = "default";
  16919. popup.renderer.setStyle("ace_autocomplete");
  16920. popup.setOption("displayIndentGuides", false);
  16921. popup.setOption("dragDelay", 150);
  16922. var noop = function(){};
  16923. popup.focus = noop;
  16924. popup.$isFocused = true;
  16925. popup.renderer.$cursorLayer.restartTimer = noop;
  16926. popup.renderer.$cursorLayer.element.style.opacity = 0;
  16927. popup.renderer.$maxLines = 8;
  16928. popup.renderer.$keepTextAreaAtCursor = false;
  16929. popup.setHighlightActiveLine(false);
  16930. popup.session.highlight("");
  16931. popup.session.$searchHighlight.clazz = "ace_highlight-marker";
  16932. popup.on("mousedown", function(e) {
  16933. var pos = e.getDocumentPosition();
  16934. popup.selection.moveToPosition(pos);
  16935. selectionMarker.start.row = selectionMarker.end.row = pos.row;
  16936. e.stop();
  16937. });
  16938. var lastMouseEvent;
  16939. var hoverMarker = new Range(-1,0,-1,Infinity);
  16940. var selectionMarker = new Range(-1,0,-1,Infinity);
  16941. selectionMarker.id = popup.session.addMarker(selectionMarker, "ace_active-line", "fullLine");
  16942. popup.setSelectOnHover = function(val) {
  16943. if (!val) {
  16944. hoverMarker.id = popup.session.addMarker(hoverMarker, "ace_line-hover", "fullLine");
  16945. } else if (hoverMarker.id) {
  16946. popup.session.removeMarker(hoverMarker.id);
  16947. hoverMarker.id = null;
  16948. }
  16949. };
  16950. popup.setSelectOnHover(false);
  16951. popup.on("mousemove", function(e) {
  16952. if (!lastMouseEvent) {
  16953. lastMouseEvent = e;
  16954. return;
  16955. }
  16956. if (lastMouseEvent.x == e.x && lastMouseEvent.y == e.y) {
  16957. return;
  16958. }
  16959. lastMouseEvent = e;
  16960. lastMouseEvent.scrollTop = popup.renderer.scrollTop;
  16961. var row = lastMouseEvent.getDocumentPosition().row;
  16962. if (hoverMarker.start.row != row) {
  16963. if (!hoverMarker.id)
  16964. popup.setRow(row);
  16965. setHoverMarker(row);
  16966. }
  16967. });
  16968. popup.renderer.on("beforeRender", function() {
  16969. if (lastMouseEvent && hoverMarker.start.row != -1) {
  16970. lastMouseEvent.$pos = null;
  16971. var row = lastMouseEvent.getDocumentPosition().row;
  16972. if (!hoverMarker.id)
  16973. popup.setRow(row);
  16974. setHoverMarker(row, true);
  16975. }
  16976. });
  16977. popup.renderer.on("afterRender", function() {
  16978. var row = popup.getRow();
  16979. var t = popup.renderer.$textLayer;
  16980. var selected = t.element.childNodes[row - t.config.firstRow];
  16981. if (selected == t.selectedNode)
  16982. return;
  16983. if (t.selectedNode)
  16984. dom.removeCssClass(t.selectedNode, "ace_selected");
  16985. t.selectedNode = selected;
  16986. if (selected)
  16987. dom.addCssClass(selected, "ace_selected");
  16988. });
  16989. var hideHoverMarker = function() { setHoverMarker(-1) };
  16990. var setHoverMarker = function(row, suppressRedraw) {
  16991. if (row !== hoverMarker.start.row) {
  16992. hoverMarker.start.row = hoverMarker.end.row = row;
  16993. if (!suppressRedraw)
  16994. popup.session._emit("changeBackMarker");
  16995. popup._emit("changeHoverMarker");
  16996. }
  16997. };
  16998. popup.getHoveredRow = function() {
  16999. return hoverMarker.start.row;
  17000. };
  17001. event.addListener(popup.container, "mouseout", hideHoverMarker);
  17002. popup.on("hide", hideHoverMarker);
  17003. popup.on("changeSelection", hideHoverMarker);
  17004. popup.session.doc.getLength = function() {
  17005. return popup.data.length;
  17006. };
  17007. popup.session.doc.getLine = function(i) {
  17008. var data = popup.data[i];
  17009. if (typeof data == "string")
  17010. return data;
  17011. return (data && data.value) || "";
  17012. };
  17013. var bgTokenizer = popup.session.bgTokenizer;
  17014. bgTokenizer.$tokenizeRow = function(row) {
  17015. var data = popup.data[row];
  17016. var tokens = [];
  17017. if (!data)
  17018. return tokens;
  17019. if (typeof data == "string")
  17020. data = {value: data};
  17021. if (!data.caption)
  17022. data.caption = data.value || data.name;
  17023. var last = -1;
  17024. var flag, c;
  17025. for (var i = 0; i < data.caption.length; i++) {
  17026. c = data.caption[i];
  17027. flag = data.matchMask & (1 << i) ? 1 : 0;
  17028. if (last !== flag) {
  17029. tokens.push({type: data.className || "" + ( flag ? "completion-highlight" : ""), value: c});
  17030. last = flag;
  17031. } else {
  17032. tokens[tokens.length - 1].value += c;
  17033. }
  17034. }
  17035. if (data.meta) {
  17036. var maxW = popup.renderer.$size.scrollerWidth / popup.renderer.layerConfig.characterWidth;
  17037. var metaData = data.meta;
  17038. if (metaData.length + data.caption.length > maxW - 2) {
  17039. metaData = metaData.substr(0, maxW - data.caption.length - 3) + "\u2026"
  17040. }
  17041. tokens.push({type: "rightAlignedText", value: metaData});
  17042. }
  17043. return tokens;
  17044. };
  17045. bgTokenizer.$updateOnChange = noop;
  17046. bgTokenizer.start = noop;
  17047. popup.session.$computeWidth = function() {
  17048. return this.screenWidth = 0;
  17049. };
  17050. popup.$blockScrolling = Infinity;
  17051. popup.isOpen = false;
  17052. popup.isTopdown = false;
  17053. popup.data = [];
  17054. popup.setData = function(list) {
  17055. popup.data = list || [];
  17056. popup.setValue(lang.stringRepeat("\n", list.length), -1);
  17057. popup.setRow(0);
  17058. };
  17059. popup.getData = function(row) {
  17060. return popup.data[row];
  17061. };
  17062. popup.getRow = function() {
  17063. return selectionMarker.start.row;
  17064. };
  17065. popup.setRow = function(line) {
  17066. line = Math.max(-1, Math.min(this.data.length, line));
  17067. if (selectionMarker.start.row != line) {
  17068. popup.selection.clearSelection();
  17069. selectionMarker.start.row = selectionMarker.end.row = line || 0;
  17070. popup.session._emit("changeBackMarker");
  17071. popup.moveCursorTo(line || 0, 0);
  17072. if (popup.isOpen)
  17073. popup._signal("select");
  17074. }
  17075. };
  17076. popup.on("changeSelection", function() {
  17077. if (popup.isOpen)
  17078. popup.setRow(popup.selection.lead.row);
  17079. popup.renderer.scrollCursorIntoView();
  17080. });
  17081. popup.hide = function() {
  17082. this.container.style.display = "none";
  17083. this._signal("hide");
  17084. popup.isOpen = false;
  17085. };
  17086. popup.show = function(pos, lineHeight, topdownOnly) {
  17087. var el = this.container;
  17088. var screenHeight = window.innerHeight;
  17089. var screenWidth = window.innerWidth;
  17090. var renderer = this.renderer;
  17091. var maxH = renderer.$maxLines * lineHeight * 1.4;
  17092. var top = pos.top + this.$borderSize;
  17093. if (top + maxH > screenHeight - lineHeight && !topdownOnly) {
  17094. el.style.top = "";
  17095. el.style.bottom = screenHeight - top + "px";
  17096. popup.isTopdown = false;
  17097. } else {
  17098. top += lineHeight;
  17099. el.style.top = top + "px";
  17100. el.style.bottom = "";
  17101. popup.isTopdown = true;
  17102. }
  17103. el.style.display = "";
  17104. this.renderer.$textLayer.checkForSizeChanges();
  17105. var left = pos.left;
  17106. if (left + el.offsetWidth > screenWidth)
  17107. left = screenWidth - el.offsetWidth;
  17108. el.style.left = left + "px";
  17109. this._signal("show");
  17110. lastMouseEvent = null;
  17111. popup.isOpen = true;
  17112. };
  17113. popup.getTextLeftOffset = function() {
  17114. return this.$borderSize + this.renderer.$padding + this.$imageSize;
  17115. };
  17116. popup.$imageSize = 0;
  17117. popup.$borderSize = 1;
  17118. return popup;
  17119. };
  17120. dom.importCssString("\
  17121. .ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\
  17122. background-color: #CAD6FA;\
  17123. z-index: 1;\
  17124. }\
  17125. .ace_editor.ace_autocomplete .ace_line-hover {\
  17126. border: 1px solid #abbffe;\
  17127. margin-top: -1px;\
  17128. background: rgba(233,233,253,0.4);\
  17129. }\
  17130. .ace_editor.ace_autocomplete .ace_line-hover {\
  17131. position: absolute;\
  17132. z-index: 2;\
  17133. }\
  17134. .ace_editor.ace_autocomplete .ace_scroller {\
  17135. background: none;\
  17136. border: none;\
  17137. box-shadow: none;\
  17138. }\
  17139. .ace_rightAlignedText {\
  17140. color: gray;\
  17141. display: inline-block;\
  17142. position: absolute;\
  17143. right: 4px;\
  17144. text-align: right;\
  17145. z-index: -1;\
  17146. }\
  17147. .ace_editor.ace_autocomplete .ace_completion-highlight{\
  17148. color: #000;\
  17149. text-shadow: 0 0 0.01em;\
  17150. }\
  17151. .ace_editor.ace_autocomplete {\
  17152. width: 280px;\
  17153. z-index: 200000;\
  17154. background: #fbfbfb;\
  17155. color: #444;\
  17156. border: 1px lightgray solid;\
  17157. position: fixed;\
  17158. box-shadow: 2px 3px 5px rgba(0,0,0,.2);\
  17159. line-height: 1.4;\
  17160. }");
  17161. exports.AcePopup = AcePopup;
  17162. });
  17163. ace.define("ace/autocomplete/util",["require","exports","module"], function(require, exports, module) {
  17164. "use strict";
  17165. exports.parForEach = function(array, fn, callback) {
  17166. var completed = 0;
  17167. var arLength = array.length;
  17168. if (arLength === 0)
  17169. callback();
  17170. for (var i = 0; i < arLength; i++) {
  17171. fn(array[i], function(result, err) {
  17172. completed++;
  17173. if (completed === arLength)
  17174. callback(result, err);
  17175. });
  17176. }
  17177. };
  17178. var ID_REGEX = /[a-zA-Z_0-9\$\-\u00A2-\uFFFF]/;
  17179. exports.retrievePrecedingIdentifier = function(text, pos, regex) {
  17180. regex = regex || ID_REGEX;
  17181. var buf = [];
  17182. for (var i = pos-1; i >= 0; i--) {
  17183. if (regex.test(text[i]))
  17184. buf.push(text[i]);
  17185. else
  17186. break;
  17187. }
  17188. return buf.reverse().join("");
  17189. };
  17190. exports.retrieveFollowingIdentifier = function(text, pos, regex) {
  17191. regex = regex || ID_REGEX;
  17192. var buf = [];
  17193. for (var i = pos; i < text.length; i++) {
  17194. if (regex.test(text[i]))
  17195. buf.push(text[i]);
  17196. else
  17197. break;
  17198. }
  17199. return buf;
  17200. };
  17201. });
  17202. ace.define("ace/autocomplete",["require","exports","module","ace/keyboard/hash_handler","ace/autocomplete/popup","ace/autocomplete/util","ace/lib/event","ace/lib/lang","ace/lib/dom","ace/snippets"], function(require, exports, module) {
  17203. "use strict";
  17204. var HashHandler = require("./keyboard/hash_handler").HashHandler;
  17205. var AcePopup = require("./autocomplete/popup").AcePopup;
  17206. var util = require("./autocomplete/util");
  17207. var event = require("./lib/event");
  17208. var lang = require("./lib/lang");
  17209. var dom = require("./lib/dom");
  17210. var snippetManager = require("./snippets").snippetManager;
  17211. var Autocomplete = function() {
  17212. this.autoInsert = false;
  17213. this.autoSelect = true;
  17214. this.exactMatch = false;
  17215. this.gatherCompletionsId = 0;
  17216. this.keyboardHandler = new HashHandler();
  17217. this.keyboardHandler.bindKeys(this.commands);
  17218. this.blurListener = this.blurListener.bind(this);
  17219. this.changeListener = this.changeListener.bind(this);
  17220. this.mousedownListener = this.mousedownListener.bind(this);
  17221. this.mousewheelListener = this.mousewheelListener.bind(this);
  17222. this.changeTimer = lang.delayedCall(function() {
  17223. this.updateCompletions(true);
  17224. }.bind(this));
  17225. this.tooltipTimer = lang.delayedCall(this.updateDocTooltip.bind(this), 50);
  17226. };
  17227. (function() {
  17228. this.$init = function() {
  17229. this.popup = new AcePopup(document.body || document.documentElement);
  17230. this.popup.on("click", function(e) {
  17231. this.insertMatch();
  17232. e.stop();
  17233. }.bind(this));
  17234. this.popup.focus = this.editor.focus.bind(this.editor);
  17235. this.popup.on("show", this.tooltipTimer.bind(null, null));
  17236. this.popup.on("select", this.tooltipTimer.bind(null, null));
  17237. this.popup.on("changeHoverMarker", this.tooltipTimer.bind(null, null));
  17238. return this.popup;
  17239. };
  17240. this.getPopup = function() {
  17241. return this.popup || this.$init();
  17242. };
  17243. this.openPopup = function(editor, prefix, keepPopupPosition) {
  17244. if (!this.popup)
  17245. this.$init();
  17246. this.popup.setData(this.completions.filtered);
  17247. editor.keyBinding.addKeyboardHandler(this.keyboardHandler);
  17248. var renderer = editor.renderer;
  17249. this.popup.setRow(this.autoSelect ? 0 : -1);
  17250. if (!keepPopupPosition) {
  17251. this.popup.setTheme(editor.getTheme());
  17252. this.popup.setFontSize(editor.getFontSize());
  17253. var lineHeight = renderer.layerConfig.lineHeight;
  17254. var pos = renderer.$cursorLayer.getPixelPosition(this.base, true);
  17255. pos.left -= this.popup.getTextLeftOffset();
  17256. var rect = editor.container.getBoundingClientRect();
  17257. pos.top += rect.top - renderer.layerConfig.offset;
  17258. pos.left += rect.left - editor.renderer.scrollLeft;
  17259. pos.left += renderer.$gutterLayer.gutterWidth;
  17260. this.popup.show(pos, lineHeight);
  17261. } else if (keepPopupPosition && !prefix) {
  17262. this.detach();
  17263. }
  17264. };
  17265. this.detach = function() {
  17266. this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler);
  17267. this.editor.off("changeSelection", this.changeListener);
  17268. this.editor.off("blur", this.blurListener);
  17269. this.editor.off("mousedown", this.mousedownListener);
  17270. this.editor.off("mousewheel", this.mousewheelListener);
  17271. this.changeTimer.cancel();
  17272. this.hideDocTooltip();
  17273. this.gatherCompletionsId += 1;
  17274. if (this.popup && this.popup.isOpen)
  17275. this.popup.hide();
  17276. if (this.base)
  17277. this.base.detach();
  17278. this.activated = false;
  17279. this.completions = this.base = null;
  17280. };
  17281. this.changeListener = function(e) {
  17282. var cursor = this.editor.selection.lead;
  17283. if (cursor.row != this.base.row || cursor.column < this.base.column) {
  17284. this.detach();
  17285. }
  17286. if (this.activated)
  17287. this.changeTimer.schedule();
  17288. else
  17289. this.detach();
  17290. };
  17291. this.blurListener = function(e) {
  17292. var el = document.activeElement;
  17293. var text = this.editor.textInput.getElement()
  17294. if (el != text && ( !this.popup || el.parentNode != this.popup.container )
  17295. && el != this.tooltipNode && e.relatedTarget != this.tooltipNode
  17296. && e.relatedTarget != text
  17297. ) {
  17298. this.detach();
  17299. }
  17300. };
  17301. this.mousedownListener = function(e) {
  17302. this.detach();
  17303. };
  17304. this.mousewheelListener = function(e) {
  17305. this.detach();
  17306. };
  17307. this.goTo = function(where) {
  17308. var row = this.popup.getRow();
  17309. var max = this.popup.session.getLength() - 1;
  17310. switch(where) {
  17311. case "up": row = row <= 0 ? max : row - 1; break;
  17312. case "down": row = row >= max ? -1 : row + 1; break;
  17313. case "start": row = 0; break;
  17314. case "end": row = max; break;
  17315. }
  17316. this.popup.setRow(row);
  17317. };
  17318. this.insertMatch = function(data) {
  17319. if (!data)
  17320. data = this.popup.getData(this.popup.getRow());
  17321. if (!data)
  17322. return false;
  17323. if (data.completer && data.completer.insertMatch) {
  17324. data.completer.insertMatch(this.editor, data);
  17325. } else {
  17326. if (this.completions.filterText) {
  17327. var ranges = this.editor.selection.getAllRanges();
  17328. for (var i = 0, range; range = ranges[i]; i++) {
  17329. range.start.column -= this.completions.filterText.length;
  17330. this.editor.session.remove(range);
  17331. }
  17332. }
  17333. if (data.snippet)
  17334. snippetManager.insertSnippet(this.editor, data.snippet);
  17335. else
  17336. this.editor.execCommand("insertstring", data.value || data);
  17337. }
  17338. this.detach();
  17339. };
  17340. this.commands = {
  17341. "Up": function(editor) { editor.completer.goTo("up"); },
  17342. "Down": function(editor) { editor.completer.goTo("down"); },
  17343. "Ctrl-Up|Ctrl-Home": function(editor) { editor.completer.goTo("start"); },
  17344. "Ctrl-Down|Ctrl-End": function(editor) { editor.completer.goTo("end"); },
  17345. "Esc": function(editor) { editor.completer.detach(); },
  17346. "Return": function(editor) { return editor.completer.insertMatch(); },
  17347. "Shift-Return": function(editor) { editor.completer.insertMatch(true); },
  17348. "Tab": function(editor) {
  17349. var result = editor.completer.insertMatch();
  17350. if (!result && !editor.tabstopManager)
  17351. editor.completer.goTo("down");
  17352. else
  17353. return result;
  17354. },
  17355. "PageUp": function(editor) { editor.completer.popup.gotoPageUp(); },
  17356. "PageDown": function(editor) { editor.completer.popup.gotoPageDown(); }
  17357. };
  17358. this.gatherCompletions = function(editor, callback) {
  17359. var session = editor.getSession();
  17360. var pos = editor.getCursorPosition();
  17361. var line = session.getLine(pos.row);
  17362. var prefix = util.retrievePrecedingIdentifier(line, pos.column);
  17363. this.base = session.doc.createAnchor(pos.row, pos.column - prefix.length);
  17364. this.base.$insertRight = true;
  17365. var matches = [];
  17366. var total = editor.completers.length;
  17367. editor.completers.forEach(function(completer, i) {
  17368. completer.getCompletions(editor, session, pos, prefix, function(err, results) {
  17369. if (!err)
  17370. matches = matches.concat(results);
  17371. var pos = editor.getCursorPosition();
  17372. var line = session.getLine(pos.row);
  17373. callback(null, {
  17374. prefix: util.retrievePrecedingIdentifier(line, pos.column, results[0] && results[0].identifierRegex),
  17375. matches: matches,
  17376. finished: (--total === 0)
  17377. });
  17378. });
  17379. });
  17380. return true;
  17381. };
  17382. this.showPopup = function(editor) {
  17383. if (this.editor)
  17384. this.detach();
  17385. this.activated = true;
  17386. this.editor = editor;
  17387. if (editor.completer != this) {
  17388. if (editor.completer)
  17389. editor.completer.detach();
  17390. editor.completer = this;
  17391. }
  17392. editor.on("changeSelection", this.changeListener);
  17393. editor.on("blur", this.blurListener);
  17394. editor.on("mousedown", this.mousedownListener);
  17395. editor.on("mousewheel", this.mousewheelListener);
  17396. this.updateCompletions();
  17397. };
  17398. this.updateCompletions = function(keepPopupPosition) {
  17399. if (keepPopupPosition && this.base && this.completions) {
  17400. var pos = this.editor.getCursorPosition();
  17401. var prefix = this.editor.session.getTextRange({start: this.base, end: pos});
  17402. if (prefix == this.completions.filterText)
  17403. return;
  17404. this.completions.setFilter(prefix);
  17405. if (!this.completions.filtered.length)
  17406. return this.detach();
  17407. if (this.completions.filtered.length == 1
  17408. && this.completions.filtered[0].value == prefix
  17409. && !this.completions.filtered[0].snippet)
  17410. return this.detach();
  17411. this.openPopup(this.editor, prefix, keepPopupPosition);
  17412. return;
  17413. }
  17414. var _id = this.gatherCompletionsId;
  17415. this.gatherCompletions(this.editor, function(err, results) {
  17416. var detachIfFinished = function() {
  17417. if (!results.finished) return;
  17418. return this.detach();
  17419. }.bind(this);
  17420. var prefix = results.prefix;
  17421. var matches = results && results.matches;
  17422. if (!matches || !matches.length)
  17423. return detachIfFinished();
  17424. if (prefix.indexOf(results.prefix) !== 0 || _id != this.gatherCompletionsId)
  17425. return;
  17426. this.completions = new FilteredList(matches);
  17427. if (this.exactMatch)
  17428. this.completions.exactMatch = true;
  17429. this.completions.setFilter(prefix);
  17430. var filtered = this.completions.filtered;
  17431. if (!filtered.length)
  17432. return detachIfFinished();
  17433. if (filtered.length == 1 && filtered[0].value == prefix && !filtered[0].snippet)
  17434. return detachIfFinished();
  17435. if (this.autoInsert && filtered.length == 1 && results.finished)
  17436. return this.insertMatch(filtered[0]);
  17437. this.openPopup(this.editor, prefix, keepPopupPosition);
  17438. }.bind(this));
  17439. };
  17440. this.cancelContextMenu = function() {
  17441. this.editor.$mouseHandler.cancelContextMenu();
  17442. };
  17443. this.updateDocTooltip = function() {
  17444. var popup = this.popup;
  17445. var all = popup.data;
  17446. var selected = all && (all[popup.getHoveredRow()] || all[popup.getRow()]);
  17447. var doc = null;
  17448. if (!selected || !this.editor || !this.popup.isOpen)
  17449. return this.hideDocTooltip();
  17450. this.editor.completers.some(function(completer) {
  17451. if (completer.getDocTooltip)
  17452. doc = completer.getDocTooltip(selected);
  17453. return doc;
  17454. });
  17455. if (!doc)
  17456. doc = selected;
  17457. if (typeof doc == "string")
  17458. doc = {docText: doc}
  17459. if (!doc || !(doc.docHTML || doc.docText))
  17460. return this.hideDocTooltip();
  17461. this.showDocTooltip(doc);
  17462. };
  17463. this.showDocTooltip = function(item) {
  17464. if (!this.tooltipNode) {
  17465. this.tooltipNode = dom.createElement("div");
  17466. this.tooltipNode.className = "ace_tooltip ace_doc-tooltip";
  17467. this.tooltipNode.style.margin = 0;
  17468. this.tooltipNode.style.pointerEvents = "auto";
  17469. this.tooltipNode.tabIndex = -1;
  17470. this.tooltipNode.onblur = this.blurListener.bind(this);
  17471. }
  17472. var tooltipNode = this.tooltipNode;
  17473. if (item.docHTML) {
  17474. tooltipNode.innerHTML = item.docHTML;
  17475. } else if (item.docText) {
  17476. tooltipNode.textContent = item.docText;
  17477. }
  17478. if (!tooltipNode.parentNode)
  17479. document.body.appendChild(tooltipNode);
  17480. var popup = this.popup;
  17481. var rect = popup.container.getBoundingClientRect();
  17482. tooltipNode.style.top = popup.container.style.top;
  17483. tooltipNode.style.bottom = popup.container.style.bottom;
  17484. if (window.innerWidth - rect.right < 320) {
  17485. tooltipNode.style.right = window.innerWidth - rect.left + "px";
  17486. tooltipNode.style.left = "";
  17487. } else {
  17488. tooltipNode.style.left = (rect.right + 1) + "px";
  17489. tooltipNode.style.right = "";
  17490. }
  17491. tooltipNode.style.display = "block";
  17492. };
  17493. this.hideDocTooltip = function() {
  17494. this.tooltipTimer.cancel();
  17495. if (!this.tooltipNode) return;
  17496. var el = this.tooltipNode;
  17497. if (!this.editor.isFocused() && document.activeElement == el)
  17498. this.editor.focus();
  17499. this.tooltipNode = null;
  17500. if (el.parentNode)
  17501. el.parentNode.removeChild(el);
  17502. };
  17503. }).call(Autocomplete.prototype);
  17504. Autocomplete.startCommand = {
  17505. name: "startAutocomplete",
  17506. exec: function(editor) {
  17507. if (!editor.completer)
  17508. editor.completer = new Autocomplete();
  17509. editor.completer.autoInsert = false;
  17510. editor.completer.autoSelect = true;
  17511. editor.completer.showPopup(editor);
  17512. editor.completer.cancelContextMenu();
  17513. },
  17514. bindKey: "Ctrl-Space|Ctrl-Shift-Space|Alt-Space"
  17515. };
  17516. var FilteredList = function(array, filterText, mutateData) {
  17517. this.all = array;
  17518. this.filtered = array;
  17519. this.filterText = filterText || "";
  17520. this.exactMatch = false;
  17521. };
  17522. (function(){
  17523. this.setFilter = function(str) {
  17524. if (str.length > this.filterText && str.lastIndexOf(this.filterText, 0) === 0)
  17525. var matches = this.filtered;
  17526. else
  17527. var matches = this.all;
  17528. this.filterText = str;
  17529. matches = this.filterCompletions(matches, this.filterText);
  17530. matches = matches.sort(function(a, b) {
  17531. return b.exactMatch - a.exactMatch || b.score - a.score;
  17532. });
  17533. var prev = null;
  17534. matches = matches.filter(function(item){
  17535. var caption = item.snippet || item.caption || item.value;
  17536. if (caption === prev) return false;
  17537. prev = caption;
  17538. return true;
  17539. });
  17540. this.filtered = matches;
  17541. };
  17542. this.filterCompletions = function(items, needle) {
  17543. var results = [];
  17544. var upper = needle.toUpperCase();
  17545. var lower = needle.toLowerCase();
  17546. loop: for (var i = 0, item; item = items[i]; i++) {
  17547. var caption = item.value || item.caption || item.snippet;
  17548. if (!caption) continue;
  17549. var lastIndex = -1;
  17550. var matchMask = 0;
  17551. var penalty = 0;
  17552. var index, distance;
  17553. if (this.exactMatch) {
  17554. if (needle !== caption.substr(0, needle.length))
  17555. continue loop;
  17556. }else{
  17557. for (var j = 0; j < needle.length; j++) {
  17558. var i1 = caption.indexOf(lower[j], lastIndex + 1);
  17559. var i2 = caption.indexOf(upper[j], lastIndex + 1);
  17560. index = (i1 >= 0) ? ((i2 < 0 || i1 < i2) ? i1 : i2) : i2;
  17561. if (index < 0)
  17562. continue loop;
  17563. distance = index - lastIndex - 1;
  17564. if (distance > 0) {
  17565. if (lastIndex === -1)
  17566. penalty += 10;
  17567. penalty += distance;
  17568. }
  17569. matchMask = matchMask | (1 << index);
  17570. lastIndex = index;
  17571. }
  17572. }
  17573. item.matchMask = matchMask;
  17574. item.exactMatch = penalty ? 0 : 1;
  17575. item.score = (item.score || 0) - penalty;
  17576. results.push(item);
  17577. }
  17578. return results;
  17579. };
  17580. }).call(FilteredList.prototype);
  17581. exports.Autocomplete = Autocomplete;
  17582. exports.FilteredList = FilteredList;
  17583. });
  17584. ace.define("ace/autocomplete/text_completer",["require","exports","module","ace/range"], function(require, exports, module) {
  17585. var Range = require("../range").Range;
  17586. var splitRegex = /[^a-zA-Z_0-9\$\-\u00C0-\u1FFF\u2C00-\uD7FF\w]+/;
  17587. function getWordIndex(doc, pos) {
  17588. var textBefore = doc.getTextRange(Range.fromPoints({row: 0, column:0}, pos));
  17589. return textBefore.split(splitRegex).length - 1;
  17590. }
  17591. function wordDistance(doc, pos) {
  17592. var prefixPos = getWordIndex(doc, pos);
  17593. var words = doc.getValue().split(splitRegex);
  17594. var wordScores = Object.create(null);
  17595. var currentWord = words[prefixPos];
  17596. words.forEach(function(word, idx) {
  17597. if (!word || word === currentWord) return;
  17598. var distance = Math.abs(prefixPos - idx);
  17599. var score = words.length - distance;
  17600. if (wordScores[word]) {
  17601. wordScores[word] = Math.max(score, wordScores[word]);
  17602. } else {
  17603. wordScores[word] = score;
  17604. }
  17605. });
  17606. return wordScores;
  17607. }
  17608. exports.getCompletions = function(editor, session, pos, prefix, callback) {
  17609. var wordScore = wordDistance(session, pos, prefix);
  17610. var wordList = Object.keys(wordScore);
  17611. callback(null, wordList.map(function(word) {
  17612. return {
  17613. caption: word,
  17614. value: word,
  17615. score: wordScore[word],
  17616. meta: "local"
  17617. };
  17618. }));
  17619. };
  17620. });
  17621. ace.define("ace/ext/language_tools",["require","exports","module","ace/snippets","ace/autocomplete","ace/config","ace/lib/lang","ace/autocomplete/util","ace/autocomplete/text_completer","ace/editor","ace/config"], function(require, exports, module) {
  17622. "use strict";
  17623. var snippetManager = require("../snippets").snippetManager;
  17624. var Autocomplete = require("../autocomplete").Autocomplete;
  17625. var config = require("../config");
  17626. var lang = require("../lib/lang");
  17627. var util = require("../autocomplete/util");
  17628. var textCompleter = require("../autocomplete/text_completer");
  17629. var keyWordCompleter = {
  17630. getCompletions: function(editor, session, pos, prefix, callback) {
  17631. if (session.$mode.completer) {
  17632. return session.$mode.completer.getCompletions(editor, session, pos, prefix, callback);
  17633. }
  17634. var state = editor.session.getState(pos.row);
  17635. var completions = session.$mode.getCompletions(state, session, pos, prefix);
  17636. callback(null, completions);
  17637. }
  17638. };
  17639. var snippetCompleter = {
  17640. getCompletions: function(editor, session, pos, prefix, callback) {
  17641. var snippetMap = snippetManager.snippetMap;
  17642. var completions = [];
  17643. snippetManager.getActiveScopes(editor).forEach(function(scope) {
  17644. var snippets = snippetMap[scope] || [];
  17645. for (var i = snippets.length; i--;) {
  17646. var s = snippets[i];
  17647. var caption = s.name || s.tabTrigger;
  17648. if (!caption)
  17649. continue;
  17650. completions.push({
  17651. caption: caption,
  17652. snippet: s.content,
  17653. meta: s.tabTrigger && !s.name ? s.tabTrigger + "\u21E5 " : "snippet",
  17654. type: "snippet"
  17655. });
  17656. }
  17657. }, this);
  17658. callback(null, completions);
  17659. },
  17660. getDocTooltip: function(item) {
  17661. if (item.type == "snippet" && !item.docHTML) {
  17662. item.docHTML = [
  17663. "<b>", lang.escapeHTML(item.caption), "</b>", "<hr></hr>",
  17664. lang.escapeHTML(item.snippet)
  17665. ].join("");
  17666. }
  17667. }
  17668. };
  17669. var completers = [snippetCompleter, textCompleter, keyWordCompleter];
  17670. exports.setCompleters = function(val) {
  17671. completers = val || [];
  17672. };
  17673. exports.addCompleter = function(completer) {
  17674. completers.push(completer);
  17675. };
  17676. exports.textCompleter = textCompleter;
  17677. exports.keyWordCompleter = keyWordCompleter;
  17678. exports.snippetCompleter = snippetCompleter;
  17679. var expandSnippet = {
  17680. name: "expandSnippet",
  17681. exec: function(editor) {
  17682. return snippetManager.expandWithTab(editor);
  17683. },
  17684. bindKey: "Tab"
  17685. };
  17686. var onChangeMode = function(e, editor) {
  17687. loadSnippetsForMode(editor.session.$mode);
  17688. };
  17689. var loadSnippetsForMode = function(mode) {
  17690. var id = mode.$id;
  17691. if (!snippetManager.files)
  17692. snippetManager.files = {};
  17693. loadSnippetFile(id);
  17694. if (mode.modes)
  17695. mode.modes.forEach(loadSnippetsForMode);
  17696. };
  17697. var loadSnippetFile = function(id) {
  17698. if (!id || snippetManager.files[id])
  17699. return;
  17700. var snippetFilePath = id.replace("mode", "snippets");
  17701. snippetManager.files[id] = {};
  17702. config.loadModule(snippetFilePath, function(m) {
  17703. if (m) {
  17704. snippetManager.files[id] = m;
  17705. if (!m.snippets && m.snippetText)
  17706. m.snippets = snippetManager.parseSnippetFile(m.snippetText);
  17707. snippetManager.register(m.snippets || [], m.scope);
  17708. if (m.includeScopes) {
  17709. snippetManager.snippetMap[m.scope].includeScopes = m.includeScopes;
  17710. m.includeScopes.forEach(function(x) {
  17711. loadSnippetFile("ace/mode/" + x);
  17712. });
  17713. }
  17714. }
  17715. });
  17716. };
  17717. function getCompletionPrefix(editor) {
  17718. var pos = editor.getCursorPosition();
  17719. var line = editor.session.getLine(pos.row);
  17720. var prefix;
  17721. editor.completers.forEach(function(completer) {
  17722. if (completer.identifierRegexps) {
  17723. completer.identifierRegexps.forEach(function(identifierRegex) {
  17724. if (!prefix && identifierRegex)
  17725. prefix = util.retrievePrecedingIdentifier(line, pos.column, identifierRegex);
  17726. });
  17727. }
  17728. });
  17729. return prefix || util.retrievePrecedingIdentifier(line, pos.column);
  17730. }
  17731. var doLiveAutocomplete = function(e) {
  17732. var editor = e.editor;
  17733. var text = e.args || "";
  17734. var hasCompleter = editor.completer && editor.completer.activated;
  17735. if (e.command.name === "backspace") {
  17736. if (hasCompleter && !getCompletionPrefix(editor))
  17737. editor.completer.detach();
  17738. }
  17739. else if (e.command.name === "insertstring") {
  17740. var prefix = getCompletionPrefix(editor);
  17741. if (prefix && !hasCompleter) {
  17742. if (!editor.completer) {
  17743. editor.completer = new Autocomplete();
  17744. }
  17745. editor.completer.autoInsert = false;
  17746. editor.completer.showPopup(editor);
  17747. }
  17748. }
  17749. };
  17750. var Editor = require("../editor").Editor;
  17751. require("../config").defineOptions(Editor.prototype, "editor", {
  17752. enableBasicAutocompletion: {
  17753. set: function(val) {
  17754. if (val) {
  17755. if (!this.completers)
  17756. this.completers = Array.isArray(val)? val: completers;
  17757. this.commands.addCommand(Autocomplete.startCommand);
  17758. } else {
  17759. this.commands.removeCommand(Autocomplete.startCommand);
  17760. }
  17761. },
  17762. value: false
  17763. },
  17764. enableLiveAutocompletion: {
  17765. set: function(val) {
  17766. if (val) {
  17767. if (!this.completers)
  17768. this.completers = Array.isArray(val)? val: completers;
  17769. this.commands.on('afterExec', doLiveAutocomplete);
  17770. } else {
  17771. this.commands.removeListener('afterExec', doLiveAutocomplete);
  17772. }
  17773. },
  17774. value: false
  17775. },
  17776. enableSnippets: {
  17777. set: function(val) {
  17778. if (val) {
  17779. this.commands.addCommand(expandSnippet);
  17780. this.on("changeMode", onChangeMode);
  17781. onChangeMode(null, this);
  17782. } else {
  17783. this.commands.removeCommand(expandSnippet);
  17784. this.off("changeMode", onChangeMode);
  17785. }
  17786. },
  17787. value: false
  17788. }
  17789. });
  17790. });
  17791. (function() {
  17792. ace.require(["ace/ext/language_tools"], function() {});
  17793. })();
  17794. ace.define("ace/ext/statusbar",["require","exports","module","ace/lib/dom","ace/lib/lang"], function(require, exports, module) {
  17795. "use strict";
  17796. var dom = require("ace/lib/dom");
  17797. var lang = require("ace/lib/lang");
  17798. var StatusBar = function(editor, parentNode) {
  17799. this.element = dom.createElement("div");
  17800. this.element.className = "ace_status-indicator";
  17801. this.element.style.cssText = "display: inline-block;";
  17802. parentNode.appendChild(this.element);
  17803. var statusUpdate = lang.delayedCall(function(){
  17804. this.updateStatus(editor)
  17805. }.bind(this));
  17806. editor.on("changeStatus", function() {
  17807. statusUpdate.schedule(100);
  17808. });
  17809. editor.on("changeSelection", function() {
  17810. statusUpdate.schedule(100);
  17811. });
  17812. };
  17813. (function(){
  17814. this.updateStatus = function(editor) {
  17815. var status = [];
  17816. function add(str, separator) {
  17817. str && status.push(str, separator || "|");
  17818. }
  17819. add(editor.keyBinding.getStatusText(editor));
  17820. if (editor.commands.recording)
  17821. add("REC");
  17822. var c = editor.selection.lead;
  17823. add(c.row + ":" + c.column, " ");
  17824. if (!editor.selection.isEmpty()) {
  17825. var r = editor.getSelectionRange();
  17826. add("(" + (r.end.row - r.start.row) + ":" +(r.end.column - r.start.column) + ")");
  17827. }
  17828. status.pop();
  17829. this.element.textContent = status.join("");
  17830. };
  17831. }).call(StatusBar.prototype);
  17832. exports.StatusBar = StatusBar;
  17833. });
  17834. (function() {
  17835. ace.require(["ace/ext/statusbar"], function() {});
  17836. })();
  17837. ace.define("ace/theme/tomorrow_night",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
  17838. exports.isDark = true;
  17839. exports.cssClass = "ace-tomorrow-night";
  17840. exports.cssText = ".ace-tomorrow-night .ace_gutter {\
  17841. background: #25282c;\
  17842. color: #C5C8C6\
  17843. }\
  17844. .ace-tomorrow-night .ace_print-margin {\
  17845. width: 1px;\
  17846. background: #25282c\
  17847. }\
  17848. .ace-tomorrow-night {\
  17849. background-color: #1D1F21;\
  17850. color: #C5C8C6\
  17851. }\
  17852. .ace-tomorrow-night .ace_cursor {\
  17853. color: #AEAFAD\
  17854. }\
  17855. .ace-tomorrow-night .ace_marker-layer .ace_selection {\
  17856. background: #373B41\
  17857. }\
  17858. .ace-tomorrow-night.ace_multiselect .ace_selection.ace_start {\
  17859. box-shadow: 0 0 3px 0px #1D1F21;\
  17860. border-radius: 2px\
  17861. }\
  17862. .ace-tomorrow-night .ace_marker-layer .ace_step {\
  17863. background: rgb(102, 82, 0)\
  17864. }\
  17865. .ace-tomorrow-night .ace_marker-layer .ace_bracket {\
  17866. margin: -1px 0 0 -1px;\
  17867. border: 1px solid #4B4E55\
  17868. }\
  17869. .ace-tomorrow-night .ace_marker-layer .ace_active-line {\
  17870. background: #282A2E\
  17871. }\
  17872. .ace-tomorrow-night .ace_gutter-active-line {\
  17873. background-color: #282A2E\
  17874. }\
  17875. .ace-tomorrow-night .ace_marker-layer .ace_selected-word {\
  17876. border: 1px solid #373B41\
  17877. }\
  17878. .ace-tomorrow-night .ace_invisible {\
  17879. color: #4B4E55\
  17880. }\
  17881. .ace-tomorrow-night .ace_keyword,\
  17882. .ace-tomorrow-night .ace_meta,\
  17883. .ace-tomorrow-night .ace_storage,\
  17884. .ace-tomorrow-night .ace_storage.ace_type,\
  17885. .ace-tomorrow-night .ace_support.ace_type {\
  17886. color: #B294BB\
  17887. }\
  17888. .ace-tomorrow-night .ace_keyword.ace_operator {\
  17889. color: #8ABEB7\
  17890. }\
  17891. .ace-tomorrow-night .ace_constant.ace_character,\
  17892. .ace-tomorrow-night .ace_constant.ace_language,\
  17893. .ace-tomorrow-night .ace_constant.ace_numeric,\
  17894. .ace-tomorrow-night .ace_keyword.ace_other.ace_unit,\
  17895. .ace-tomorrow-night .ace_support.ace_constant,\
  17896. .ace-tomorrow-night .ace_variable.ace_parameter {\
  17897. color: #DE935F\
  17898. }\
  17899. .ace-tomorrow-night .ace_constant.ace_other {\
  17900. color: #CED1CF\
  17901. }\
  17902. .ace-tomorrow-night .ace_invalid {\
  17903. color: #CED2CF;\
  17904. background-color: #DF5F5F\
  17905. }\
  17906. .ace-tomorrow-night .ace_invalid.ace_deprecated {\
  17907. color: #CED2CF;\
  17908. background-color: #B798BF\
  17909. }\
  17910. .ace-tomorrow-night .ace_fold {\
  17911. background-color: #81A2BE;\
  17912. border-color: #C5C8C6\
  17913. }\
  17914. .ace-tomorrow-night .ace_entity.ace_name.ace_function,\
  17915. .ace-tomorrow-night .ace_support.ace_function,\
  17916. .ace-tomorrow-night .ace_variable {\
  17917. color: #81A2BE\
  17918. }\
  17919. .ace-tomorrow-night .ace_support.ace_class,\
  17920. .ace-tomorrow-night .ace_support.ace_type {\
  17921. color: #F0C674\
  17922. }\
  17923. .ace-tomorrow-night .ace_heading,\
  17924. .ace-tomorrow-night .ace_markup.ace_heading,\
  17925. .ace-tomorrow-night .ace_string {\
  17926. color: #B5BD68\
  17927. }\
  17928. .ace-tomorrow-night .ace_entity.ace_name.ace_tag,\
  17929. .ace-tomorrow-night .ace_entity.ace_other.ace_attribute-name,\
  17930. .ace-tomorrow-night .ace_meta.ace_tag,\
  17931. .ace-tomorrow-night .ace_string.ace_regexp,\
  17932. .ace-tomorrow-night .ace_variable {\
  17933. color: #CC6666\
  17934. }\
  17935. .ace-tomorrow-night .ace_comment {\
  17936. color: #969896\
  17937. }\
  17938. .ace-tomorrow-night .ace_indent-guide {\
  17939. background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\
  17940. }";
  17941. var dom = require("../lib/dom");
  17942. dom.importCssString(exports.cssText, exports.cssClass);
  17943. });
  17944. /* ***** BEGIN LICENSE BLOCK *****
  17945. * Distributed under the BSD license:
  17946. *
  17947. * Copyright (c) 2010, Ajax.org B.V.
  17948. * All rights reserved.
  17949. *
  17950. * Redistribution and use in source and binary forms, with or without
  17951. * modification, are permitted provided that the following conditions are met:
  17952. * * Redistributions of source code must retain the above copyright
  17953. * notice, this list of conditions and the following disclaimer.
  17954. * * Redistributions in binary form must reproduce the above copyright
  17955. * notice, this list of conditions and the following disclaimer in the
  17956. * documentation and/or other materials provided with the distribution.
  17957. * * Neither the name of Ajax.org B.V. nor the
  17958. * names of its contributors may be used to endorse or promote products
  17959. * derived from this software without specific prior written permission.
  17960. *
  17961. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  17962. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  17963. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  17964. * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
  17965. * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  17966. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  17967. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  17968. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  17969. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  17970. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  17971. *
  17972. * ***** END LICENSE BLOCK ***** */
  17973. /*global ace*/
  17974. ace.define("ace/token_tooltip",
  17975. ["require", "exports", "module", "ace/lib/oop", "ace/range", "ace/tooltip"],
  17976. function(require, exports, module) {
  17977. "use strict";
  17978. // var dom = require("ace/lib/dom");
  17979. var oop = require("ace/lib/oop");
  17980. var event = require("ace/lib/event");
  17981. var Range = require("ace/range").Range;
  17982. var Tooltip = require("ace/tooltip").Tooltip;
  17983. function TokenTooltip(editor) {
  17984. if (editor.tokenTooltip)
  17985. return;
  17986. Tooltip.call(this, editor.container);
  17987. editor.tokenTooltip = this;
  17988. this.editor = editor;
  17989. this.update = this.update.bind(this);
  17990. this.onMouseMove = this.onMouseMove.bind(this);
  17991. this.onMouseOut = this.onMouseOut.bind(this);
  17992. event.addListener(editor.renderer.scroller, "mousemove", this.onMouseMove);
  17993. event.addListener(editor.renderer.content, "mouseout", this.onMouseOut);
  17994. }
  17995. oop.inherits(TokenTooltip, Tooltip);
  17996. (function() {
  17997. this.token = {};
  17998. this.range = new Range();
  17999. this.update = function() {
  18000. this.$timer = null;
  18001. var r = this.editor.renderer;
  18002. if (this.lastT - (r.timeStamp || 0) > 1000) {
  18003. r.rect = null;
  18004. r.timeStamp = this.lastT;
  18005. this.maxHeight = window.innerHeight;
  18006. this.maxWidth = window.innerWidth;
  18007. }
  18008. var canvasPos = r.rect || (r.rect = r.scroller.getBoundingClientRect());
  18009. var offset = (this.x + r.scrollLeft - canvasPos.left - r.$padding) / r.characterWidth;
  18010. var row = Math.floor((this.y + r.scrollTop - canvasPos.top) / r.lineHeight);
  18011. var col = Math.round(offset);
  18012. var screenPos = {row: row, column: col, side: offset - col > 0 ? 1 : -1};
  18013. var session = this.editor.session;
  18014. var docPos = session.screenToDocumentPosition(screenPos.row, screenPos.column);
  18015. var token = session.getTokenAt(docPos.row, docPos.column);
  18016. if (!token && !session.getLine(docPos.row)) {
  18017. token = {
  18018. type: "",
  18019. value: "",
  18020. state: session.bgTokenizer.getState(0),
  18021. };
  18022. }
  18023. if (!token) {
  18024. session.removeMarker(this.marker);
  18025. this.hide();
  18026. return;
  18027. }
  18028. var tokenText = token.type;
  18029. if (token.state)
  18030. tokenText += "|" + token.state;
  18031. if (token.merge)
  18032. tokenText += "\n merge";
  18033. if (token.stateTransitions)
  18034. tokenText += "\n " + token.stateTransitions.join("\n ");
  18035. if (this.tokenText !== tokenText) {
  18036. this.setText(tokenText);
  18037. this.width = this.getWidth();
  18038. this.height = this.getHeight();
  18039. this.tokenText = tokenText;
  18040. }
  18041. this.show(null, this.x, this.y);
  18042. this.token = token;
  18043. session.removeMarker(this.marker);
  18044. this.range = new Range(docPos.row, token.start, docPos.row, token.start + token.value.length);
  18045. this.marker = session.addMarker(this.range, "ace_bracket", "text");
  18046. };
  18047. this.onMouseMove = function(e) {
  18048. this.x = e.clientX;
  18049. this.y = e.clientY;
  18050. if (this.isOpen) {
  18051. this.lastT = e.timeStamp;
  18052. this.setPosition(this.x, this.y);
  18053. }
  18054. if (!this.$timer)
  18055. this.$timer = setTimeout(this.update, 100);
  18056. };
  18057. this.onMouseOut = function(e) {
  18058. if (e && e.currentTarget.contains(e.relatedTarget))
  18059. return;
  18060. this.hide();
  18061. this.editor.session.removeMarker(this.marker);
  18062. this.$timer = clearTimeout(this.$timer);
  18063. };
  18064. this.setPosition = function(x, y) {
  18065. if (x + 10 + this.width > this.maxWidth)
  18066. x = window.innerWidth - this.width - 10;
  18067. if (y > window.innerHeight * 0.75 || y + 20 + this.height > this.maxHeight)
  18068. y = y - this.height - 30;
  18069. Tooltip.prototype.setPosition.call(this, x + 10, y + 20);
  18070. };
  18071. this.destroy = function() {
  18072. this.onMouseOut();
  18073. event.removeListener(this.editor.renderer.scroller, "mousemove", this.onMouseMove);
  18074. event.removeListener(this.editor.renderer.content, "mouseout", this.onMouseOut);
  18075. delete this.editor.tokenTooltip;
  18076. };
  18077. }).call(TokenTooltip.prototype);
  18078. exports.TokenTooltip = TokenTooltip;
  18079. });
  18080. /*global ace*/
  18081. ace.define("ace/mode/modellang_highlight_rules",
  18082. ["require", "exports", "module", "ace/lib/oop"],
  18083. function(require, exports, module) {
  18084. "use strict";
  18085. var oop = require("../lib/oop");
  18086. var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
  18087. var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;
  18088. var ModellangHighlightRules = function() {
  18089. this.$rules = {
  18090. start: [
  18091. {
  18092. token: "comment.line.double-slash",
  18093. regex: /\/\/.*/,
  18094. },
  18095. {
  18096. token: "comment.block",
  18097. regex: /\/\*/,
  18098. next: "comment",
  18099. },
  18100. {
  18101. token: [
  18102. "keyword",
  18103. "text",
  18104. "variable.other",
  18105. "text",
  18106. "punctuation.operator",
  18107. ],
  18108. regex: /(\bSYSTEM\b:)(\s*)(\w+)(\s*)(=)/,
  18109. push: "behaviorPattern",
  18110. },
  18111. {
  18112. token: [
  18113. "keyword",
  18114. "text",
  18115. "support.constant",
  18116. "text",
  18117. "punctuation.operator",
  18118. ],
  18119. regex: /(\bBEHAVIOR\b:)(\s*)(\w+)(\s*)(=)/,
  18120. push: "behaviorPattern",
  18121. },
  18122. {
  18123. token: "keyword.control",
  18124. regex: /(\bINTERACTION\b:)/,
  18125. push: "behaviorPattern",
  18126. },
  18127. {
  18128. token: [
  18129. "keyword.control",
  18130. "text",
  18131. "variable",
  18132. "support.constant",
  18133. "support.constant",
  18134. "text",
  18135. "text",
  18136. ],
  18137. regex: /(\bWHEN\b:)(\s*)(\w+)(:)(\w+)(\s+)({)/,
  18138. next: "javascript-start",
  18139. },
  18140. {
  18141. token: [
  18142. "keyword.control",
  18143. "text",
  18144. "variable",
  18145. "text",
  18146. "text",
  18147. ],
  18148. regex: /(\bINIT\b:)(\s*)(\w+)(\s*)({)/,
  18149. next: "javascript-start",
  18150. },
  18151. {
  18152. token: "text",
  18153. regex: /\s+/,
  18154. },
  18155. {
  18156. defaultToken: "text"
  18157. },
  18158. ],
  18159. behaviorPattern: [
  18160. {
  18161. token: "punctuation.operator",
  18162. regex: /;/,
  18163. next: "pop",
  18164. },
  18165. { // identifiers
  18166. token: "text",
  18167. regex: /./,
  18168. },
  18169. ],
  18170. comment: [
  18171. // multi-line comment terminator
  18172. {
  18173. token: "comment.block",
  18174. regex: /.*?\*\//,
  18175. next: "start",
  18176. },
  18177. // stuff
  18178. {
  18179. regex: /.*/,
  18180. token: "comment.block",
  18181. },
  18182. ],
  18183. meta: {
  18184. dontIndentStates: ["comment"],
  18185. lineComment: "//",
  18186. },
  18187. };
  18188. this.embedRules(JavaScriptHighlightRules, "javascript-", [
  18189. {
  18190. token: "text",
  18191. regex: /(};)/, // the js parser won't be in a state where this would be valid,
  18192. next: "start", // so it's relatively safe to use to escape
  18193. }
  18194. ]);
  18195. this.normalizeRules();
  18196. };
  18197. oop.inherits(ModellangHighlightRules, TextHighlightRules);
  18198. exports.ModellangHighlightRules = ModellangHighlightRules;
  18199. });
  18200. /* jshint ignore:start */
  18201. // jscs: disable
  18202. ace.define("ace/mode/modellang",
  18203. ["require", "exports", "module", "ace/lib/oop", "ace/mode/text", "ace/mode/modellang_highlight_rules"],
  18204. function(require, exports, module) {
  18205. "use strict";
  18206. var oop = require("../lib/oop");
  18207. var TextMode = require("./text").Mode;
  18208. var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
  18209. var CstyleFoldMode = require("./folding/cstyle").FoldMode;
  18210. var ModellangHighlightRules = require("./modellang_highlight_rules").ModellangHighlightRules;
  18211. var Mode = function() {
  18212. this.HighlightRules = ModellangHighlightRules;
  18213. this.$behaviour = new CstyleBehaviour();
  18214. this.foldingRules = new CstyleFoldMode();
  18215. };
  18216. oop.inherits(Mode, TextMode);
  18217. (function() {
  18218. this.lineCommentStart = "//";
  18219. this.blockComment = {start:"/*", end:"*/"};
  18220. this.$id = "ace/mode/modellang";
  18221. this.getNextLineIndent = function(state, line, tab) {
  18222. var indent = this.$getIndent(line);
  18223. var tokenizedLine = this.getTokenizer().getLineTokens(line, state);
  18224. var tokens = tokenizedLine.tokens;
  18225. if (tokens.length && tokens[tokens.length - 1].type === "comment") {
  18226. return indent;
  18227. }
  18228. var match;
  18229. if (state === "eventPatternList") {
  18230. match = line.match(/^.*(?:[:]).*$/);
  18231. if (match) {
  18232. indent += tab;
  18233. }
  18234. } else if (state[0] === "coordinate" || state[0] === "doBlock") {
  18235. match = line.match(/^.*(?:\bDO)\s*$/);
  18236. if (match) {
  18237. indent += tab;
  18238. }
  18239. }
  18240. return indent;
  18241. };
  18242. }).call(Mode.prototype);
  18243. exports.Mode = Mode;
  18244. });
  18245. ace.define("ace/mode/behaviour/cstyle",
  18246. ["require", "exports", "module", "ace/lib/oop", "ace/mode/behaviour", "ace/token_iterator", "ace/lib/lang"],
  18247. function(require, exports, module) {
  18248. "use strict";
  18249. var oop = require("../../lib/oop");
  18250. var Behaviour = require("../behaviour").Behaviour;
  18251. var TokenIterator = require("../../token_iterator").TokenIterator;
  18252. var lang = require("../../lib/lang");
  18253. var SAFE_INSERT_IN_TOKENS =
  18254. ["text", "paren.rparen", "punctuation.operator"];
  18255. var SAFE_INSERT_BEFORE_TOKENS =
  18256. ["text", "paren.rparen", "punctuation.operator", "comment"];
  18257. var context;
  18258. var contextCache = {};
  18259. var initContext = function(editor) {
  18260. var id = -1;
  18261. if (editor.multiSelect) {
  18262. id = editor.selection.index;
  18263. if (contextCache.rangeCount !== editor.multiSelect.rangeCount)
  18264. contextCache = {rangeCount: editor.multiSelect.rangeCount};
  18265. }
  18266. if (contextCache[id])
  18267. return context = contextCache[id];
  18268. context = contextCache[id] = {
  18269. autoInsertedBrackets: 0,
  18270. autoInsertedRow: -1,
  18271. autoInsertedLineEnd: "",
  18272. maybeInsertedBrackets: 0,
  18273. maybeInsertedRow: -1,
  18274. maybeInsertedLineStart: "",
  18275. maybeInsertedLineEnd: "",
  18276. };
  18277. };
  18278. var getWrapped = function(selection, selected, opening, closing) {
  18279. var rowDiff = selection.end.row - selection.start.row;
  18280. return {
  18281. text: opening + selected + closing,
  18282. selection: [
  18283. 0,
  18284. selection.start.column + 1,
  18285. rowDiff,
  18286. selection.end.column + (rowDiff ? 0 : 1),
  18287. ],
  18288. };
  18289. };
  18290. var CstyleBehaviour = function() {
  18291. this.add("braces", "insertion", function(state, action, editor, session, text) {
  18292. var cursor = editor.getCursorPosition();
  18293. var line = session.doc.getLine(cursor.row);
  18294. if (text === "{") {
  18295. initContext(editor);
  18296. var selection = editor.getSelectionRange();
  18297. var selected = session.doc.getTextRange(selection);
  18298. if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) {
  18299. return getWrapped(selection, selected, "{", "}");
  18300. } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {
  18301. if (/[\]\}\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {
  18302. CstyleBehaviour.recordAutoInsert(editor, session, "}");
  18303. return {
  18304. text: "{}",
  18305. selection: [1, 1],
  18306. };
  18307. } else {
  18308. CstyleBehaviour.recordMaybeInsert(editor, session, "{");
  18309. return {
  18310. text: "{",
  18311. selection: [1, 1],
  18312. };
  18313. }
  18314. }
  18315. } else if (text === "}") {
  18316. initContext(editor);
  18317. var rightChar = line.substring(cursor.column, cursor.column + 1);
  18318. if (rightChar === "}") {
  18319. var matching = session.$findOpeningBracket("}", {column: cursor.column + 1, row: cursor.row});
  18320. if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {
  18321. CstyleBehaviour.popAutoInsertedClosing();
  18322. return {
  18323. text: "",
  18324. selection: [1, 1],
  18325. };
  18326. }
  18327. }
  18328. } else if (text === "\n" || text === "\r\n") {
  18329. initContext(editor);
  18330. var closing = "";
  18331. if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {
  18332. closing = lang.stringRepeat("}", context.maybeInsertedBrackets);
  18333. CstyleBehaviour.clearMaybeInsertedClosing();
  18334. }
  18335. var rightChar = line.substring(cursor.column, cursor.column + 1);
  18336. if (rightChar === "}") {
  18337. var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column + 1}, "}");
  18338. if (!openBracePos)
  18339. return null;
  18340. var next_indent = this.$getIndent(session.getLine(openBracePos.row));
  18341. } else if (closing) {
  18342. var next_indent = this.$getIndent(line);
  18343. } else {
  18344. CstyleBehaviour.clearMaybeInsertedClosing();
  18345. return;
  18346. }
  18347. var indent = next_indent + session.getTabString();
  18348. return {
  18349. text: "\n" + indent + "\n" + next_indent + closing,
  18350. selection: [1, indent.length, 1, indent.length],
  18351. };
  18352. } else {
  18353. CstyleBehaviour.clearMaybeInsertedClosing();
  18354. }
  18355. });
  18356. this.add("braces", "deletion", function(state, action, editor, session, range) {
  18357. var selected = session.doc.getTextRange(range);
  18358. if (!range.isMultiLine() && selected === "{") {
  18359. initContext(editor);
  18360. var line = session.doc.getLine(range.start.row);
  18361. var rightChar = line.substring(range.end.column, range.end.column + 1);
  18362. if (rightChar === "}") {
  18363. range.end.column++;
  18364. return range;
  18365. } else {
  18366. context.maybeInsertedBrackets--;
  18367. }
  18368. }
  18369. });
  18370. this.add("parens", "insertion", function(state, action, editor, session, text) {
  18371. if (text === "(") {
  18372. initContext(editor);
  18373. var selection = editor.getSelectionRange();
  18374. var selected = session.doc.getTextRange(selection);
  18375. if (selected !== "" && editor.getWrapBehavioursEnabled()) {
  18376. return getWrapped(selection, selected, "(", ")");
  18377. } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {
  18378. CstyleBehaviour.recordAutoInsert(editor, session, ")");
  18379. return {
  18380. text: "()",
  18381. selection: [1, 1],
  18382. };
  18383. }
  18384. } else if (text === ")") {
  18385. initContext(editor);
  18386. var cursor = editor.getCursorPosition();
  18387. var line = session.doc.getLine(cursor.row);
  18388. var rightChar = line.substring(cursor.column, cursor.column + 1);
  18389. if (rightChar === ")") {
  18390. var matching = session.$findOpeningBracket(")", {column: cursor.column + 1, row: cursor.row});
  18391. if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {
  18392. CstyleBehaviour.popAutoInsertedClosing();
  18393. return {
  18394. text: "",
  18395. selection: [1, 1],
  18396. };
  18397. }
  18398. }
  18399. }
  18400. });
  18401. this.add("parens", "deletion", function(state, action, editor, session, range) {
  18402. var selected = session.doc.getTextRange(range);
  18403. if (!range.isMultiLine() && selected === "(") {
  18404. initContext(editor);
  18405. var line = session.doc.getLine(range.start.row);
  18406. var rightChar = line.substring(range.start.column + 1, range.start.column + 2);
  18407. if (rightChar === ")") {
  18408. range.end.column++;
  18409. return range;
  18410. }
  18411. }
  18412. });
  18413. this.add("brackets", "insertion", function(state, action, editor, session, text) {
  18414. if (text == "[") {
  18415. initContext(editor);
  18416. var selection = editor.getSelectionRange();
  18417. var selected = session.doc.getTextRange(selection);
  18418. if (selected !== "" && editor.getWrapBehavioursEnabled()) {
  18419. return getWrapped(selection, selected, "[", "]");
  18420. } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {
  18421. CstyleBehaviour.recordAutoInsert(editor, session, "]");
  18422. return {
  18423. text: "[]",
  18424. selection: [1, 1],
  18425. };
  18426. }
  18427. } else if (text == "]") {
  18428. initContext(editor);
  18429. var cursor = editor.getCursorPosition();
  18430. var line = session.doc.getLine(cursor.row);
  18431. var rightChar = line.substring(cursor.column, cursor.column + 1);
  18432. if (rightChar == "]") {
  18433. var matching = session.$findOpeningBracket("]", {column: cursor.column + 1, row: cursor.row});
  18434. if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {
  18435. CstyleBehaviour.popAutoInsertedClosing();
  18436. return {
  18437. text: "",
  18438. selection: [1, 1],
  18439. };
  18440. }
  18441. }
  18442. }
  18443. });
  18444. this.add("brackets", "deletion", function(state, action, editor, session, range) {
  18445. var selected = session.doc.getTextRange(range);
  18446. if (!range.isMultiLine() && selected == "[") {
  18447. initContext(editor);
  18448. var line = session.doc.getLine(range.start.row);
  18449. var rightChar = line.substring(range.start.column + 1, range.start.column + 2);
  18450. if (rightChar == "]") {
  18451. range.end.column++;
  18452. return range;
  18453. }
  18454. }
  18455. });
  18456. this.add("string_dquotes", "insertion", function(state, action, editor, session, text) {
  18457. if (text === '"' || text === "'") {
  18458. initContext(editor);
  18459. var quote = text;
  18460. var selection = editor.getSelectionRange();
  18461. var selected = session.doc.getTextRange(selection);
  18462. if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) {
  18463. return getWrapped(selection, selected, quote, quote);
  18464. } else if (!selected) {
  18465. var cursor = editor.getCursorPosition();
  18466. var line = session.doc.getLine(cursor.row);
  18467. var leftChar = line.substring(cursor.column - 1, cursor.column);
  18468. var rightChar = line.substring(cursor.column, cursor.column + 1);
  18469. var token = session.getTokenAt(cursor.row, cursor.column);
  18470. var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);
  18471. if (leftChar === "\\" && token && /escape/.test(token.type))
  18472. return null;
  18473. var stringBefore = token && /string/.test(token.type);
  18474. var stringAfter = !rightToken || /string/.test(rightToken.type);
  18475. var pair;
  18476. if (rightChar === quote) {
  18477. pair = stringBefore !== stringAfter;
  18478. } else {
  18479. if (stringBefore && !stringAfter)
  18480. return null; // wrap string with different quote
  18481. if (stringBefore && stringAfter)
  18482. return null; // do not pair quotes inside strings
  18483. var wordRe = session.$mode.tokenRe;
  18484. wordRe.lastIndex = 0;
  18485. var isWordBefore = wordRe.test(leftChar);
  18486. wordRe.lastIndex = 0;
  18487. var isWordAfter = wordRe.test(leftChar);
  18488. if (isWordBefore || isWordAfter)
  18489. return null; // before or after alphanumeric
  18490. if (rightChar && !/[\s;,.})\]\\]/.test(rightChar))
  18491. return null; // there is rightChar and it isn't closing
  18492. pair = true;
  18493. }
  18494. return {
  18495. text: pair ? quote + quote : "",
  18496. selection: [1, 1],
  18497. };
  18498. }
  18499. }
  18500. });
  18501. this.add("string_dquotes", "deletion", function(state, action, editor, session, range) {
  18502. var selected = session.doc.getTextRange(range);
  18503. if (!range.isMultiLine() && (selected === '"' || selected === "'")) {
  18504. initContext(editor);
  18505. var line = session.doc.getLine(range.start.row);
  18506. var rightChar = line.substring(range.start.column + 1, range.start.column + 2);
  18507. if (rightChar === selected) {
  18508. range.end.column++;
  18509. return range;
  18510. }
  18511. }
  18512. });
  18513. };
  18514. CstyleBehaviour.isSaneInsertion = function(editor, session) {
  18515. var cursor = editor.getCursorPosition();
  18516. var iterator = new TokenIterator(session, cursor.row, cursor.column);
  18517. if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) {
  18518. var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);
  18519. if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS))
  18520. return false;
  18521. }
  18522. iterator.stepForward();
  18523. return iterator.getCurrentTokenRow() !== cursor.row ||
  18524. this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS);
  18525. };
  18526. CstyleBehaviour.$matchTokenType = function(token, types) {
  18527. return types.indexOf(token.type || token) > -1;
  18528. };
  18529. CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {
  18530. var cursor = editor.getCursorPosition();
  18531. var line = session.doc.getLine(cursor.row);
  18532. if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))
  18533. context.autoInsertedBrackets = 0;
  18534. context.autoInsertedRow = cursor.row;
  18535. context.autoInsertedLineEnd = bracket + line.substr(cursor.column);
  18536. context.autoInsertedBrackets++;
  18537. };
  18538. CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {
  18539. var cursor = editor.getCursorPosition();
  18540. var line = session.doc.getLine(cursor.row);
  18541. if (!this.isMaybeInsertedClosing(cursor, line))
  18542. context.maybeInsertedBrackets = 0;
  18543. context.maybeInsertedRow = cursor.row;
  18544. context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;
  18545. context.maybeInsertedLineEnd = line.substr(cursor.column);
  18546. context.maybeInsertedBrackets++;
  18547. };
  18548. CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {
  18549. return context.autoInsertedBrackets > 0 &&
  18550. cursor.row === context.autoInsertedRow &&
  18551. bracket === context.autoInsertedLineEnd[0] &&
  18552. line.substr(cursor.column) === context.autoInsertedLineEnd;
  18553. };
  18554. CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {
  18555. return context.maybeInsertedBrackets > 0 &&
  18556. cursor.row === context.maybeInsertedRow &&
  18557. line.substr(cursor.column) === context.maybeInsertedLineEnd &&
  18558. line.substr(0, cursor.column) === context.maybeInsertedLineStart;
  18559. };
  18560. CstyleBehaviour.popAutoInsertedClosing = function() {
  18561. context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);
  18562. context.autoInsertedBrackets--;
  18563. };
  18564. CstyleBehaviour.clearMaybeInsertedClosing = function() {
  18565. if (context) {
  18566. context.maybeInsertedBrackets = 0;
  18567. context.maybeInsertedRow = -1;
  18568. }
  18569. };
  18570. oop.inherits(CstyleBehaviour, Behaviour);
  18571. exports.CstyleBehaviour = CstyleBehaviour;
  18572. });
  18573. ace.define("ace/mode/folding/cstyle",
  18574. ["require", "exports", "module", "ace/lib/oop", "ace/range", "ace/mode/folding/fold_mode"],
  18575. function(require, exports, module) {
  18576. "use strict";
  18577. var oop = require("../../lib/oop");
  18578. var Range = require("../../range").Range;
  18579. var BaseFoldMode = require("./fold_mode").FoldMode;
  18580. var FoldMode = exports.FoldMode = function(commentRegex) {
  18581. if (commentRegex) {
  18582. this.foldingStartMarker = new RegExp(
  18583. this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start)
  18584. );
  18585. this.foldingStopMarker = new RegExp(
  18586. this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end)
  18587. );
  18588. }
  18589. };
  18590. oop.inherits(FoldMode, BaseFoldMode);
  18591. (function() {
  18592. this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/;
  18593. this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/;
  18594. this.singleLineBlockCommentRe = /^\s*(\/\*).*\*\/\s*$/;
  18595. this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/;
  18596. this.startRegionRe = /^\s*(\/\*|\/\/)#region\b/;
  18597. this._getFoldWidgetBase = this.getFoldWidget;
  18598. this.getFoldWidget = function(session, foldStyle, row) {
  18599. var line = session.getLine(row);
  18600. if (this.singleLineBlockCommentRe.test(line)) {
  18601. if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))
  18602. return "";
  18603. }
  18604. var fw = this._getFoldWidgetBase(session, foldStyle, row);
  18605. if (!fw && this.startRegionRe.test(line))
  18606. return "start"; // lineCommentRegionStart
  18607. return fw;
  18608. };
  18609. this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {
  18610. var line = session.getLine(row);
  18611. if (this.startRegionRe.test(line))
  18612. return this.getCommentRegionBlock(session, line, row);
  18613. var match = line.match(this.foldingStartMarker);
  18614. if (match) {
  18615. var i = match.index;
  18616. if (match[1])
  18617. return this.openingBracketBlock(session, match[1], row, i);
  18618. var range = session.getCommentFoldRange(row, i + match[0].length, 1);
  18619. if (range && !range.isMultiLine()) {
  18620. if (forceMultiline) {
  18621. range = this.getSectionRange(session, row);
  18622. } else if (foldStyle !== "all")
  18623. range = null;
  18624. }
  18625. return range;
  18626. }
  18627. if (foldStyle === "markbegin")
  18628. return;
  18629. match = line.match(this.foldingStopMarker);
  18630. if (match) {
  18631. var i = match.index + match[0].length;
  18632. if (match[1])
  18633. return this.closingBracketBlock(session, match[1], row, i);
  18634. return session.getCommentFoldRange(row, i, -1);
  18635. }
  18636. };
  18637. this.getSectionRange = function(session, row) {
  18638. var line = session.getLine(row);
  18639. var startIndent = line.search(/\S/);
  18640. var startRow = row;
  18641. var startColumn = line.length;
  18642. row = row + 1;
  18643. var endRow = row;
  18644. var maxRow = session.getLength();
  18645. while (++row < maxRow) {
  18646. line = session.getLine(row);
  18647. var indent = line.search(/\S/);
  18648. if (indent === -1)
  18649. continue;
  18650. if (startIndent > indent)
  18651. break;
  18652. var subRange = this.getFoldWidgetRange(session, "all", row);
  18653. if (subRange) {
  18654. if (subRange.start.row <= startRow) {
  18655. break;
  18656. } else if (subRange.isMultiLine()) {
  18657. row = subRange.end.row;
  18658. } else if (startIndent === indent) {
  18659. break;
  18660. }
  18661. }
  18662. endRow = row;
  18663. }
  18664. return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);
  18665. };
  18666. this.getCommentRegionBlock = function(session, line, row) {
  18667. var startColumn = line.search(/\s*$/);
  18668. var maxRow = session.getLength();
  18669. var startRow = row;
  18670. var re = /^\s*(?:\/\*|\/\/)#(end)?region\b/;
  18671. var depth = 1;
  18672. while (++row < maxRow) {
  18673. line = session.getLine(row);
  18674. var m = re.exec(line);
  18675. if (!m) continue;
  18676. if (m[1]) depth--;
  18677. else depth++;
  18678. if (!depth) break;
  18679. }
  18680. var endRow = row;
  18681. if (endRow > startRow) {
  18682. return new Range(startRow, startColumn, endRow, line.length);
  18683. }
  18684. };
  18685. }).call(FoldMode.prototype);
  18686. });
  18687. ace.define("ace/mode/javascript_highlight_rules",
  18688. ["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],
  18689. function(require, exports, module) {
  18690. "use strict";
  18691. var oop = require("../lib/oop");
  18692. var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules;
  18693. var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
  18694. var JavaScriptHighlightRules = function(options) {
  18695. var keywordMapper = this.createKeywordMapper({
  18696. "variable.language":
  18697. "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors
  18698. "Namespace|QName|XML|XMLList|" + // E4X
  18699. "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" +
  18700. "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" +
  18701. "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors
  18702. "SyntaxError|TypeError|URIError|" +
  18703. "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions
  18704. "isNaN|parseFloat|parseInt|" +
  18705. "JSON|Math|" + // Other
  18706. "this|arguments|prototype|window|document" , // Pseudo
  18707. "keyword":
  18708. "const|yield|import|get|set|" +
  18709. "break|case|catch|continue|default|delete|do|else|finally|for|function|" +
  18710. "if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" +
  18711. "__parent__|__count__|escape|unescape|with|__proto__|" +
  18712. "class|enum|extends|super|export|implements|private|public|interface|package|protected|static",
  18713. "storage.type":
  18714. "const|let|var|function",
  18715. "constant.language":
  18716. "null|Infinity|NaN|undefined",
  18717. "support.function":
  18718. "alert",
  18719. "constant.language.boolean": "true|false"
  18720. }, "identifier");
  18721. var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void";
  18722. var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b";
  18723. var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex
  18724. "u[0-9a-fA-F]{4}|" + // unicode
  18725. "[0-2][0-7]{0,2}|" + // oct
  18726. "3[0-6][0-7]?|" + // oct
  18727. "37[0-7]?|" + // oct
  18728. "[4-7][0-7]?|" + //oct
  18729. ".)";
  18730. this.$rules = {
  18731. "no_regex" : [
  18732. {
  18733. token : "comment",
  18734. regex : "\\/\\/",
  18735. next : "line_comment"
  18736. },
  18737. DocCommentHighlightRules.getStartRule("doc-start"),
  18738. {
  18739. token : "comment", // multi line comment
  18740. regex : /\/\*/,
  18741. next : "comment"
  18742. }, {
  18743. token : "string",
  18744. regex : "'(?=.)",
  18745. next : "qstring"
  18746. }, {
  18747. token : "string",
  18748. regex : '"(?=.)',
  18749. next : "qqstring"
  18750. }, {
  18751. token : "constant.numeric", // hex
  18752. regex : /0[xX][0-9a-fA-F]+\b/
  18753. }, {
  18754. token : "constant.numeric", // float
  18755. regex : /[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/
  18756. }, {
  18757. token : [
  18758. "storage.type", "punctuation.operator", "support.function",
  18759. "punctuation.operator", "entity.name.function", "text","keyword.operator"
  18760. ],
  18761. regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)",
  18762. next: "function_arguments"
  18763. }, {
  18764. token : [
  18765. "storage.type", "punctuation.operator", "entity.name.function", "text",
  18766. "keyword.operator", "text", "storage.type", "text", "paren.lparen"
  18767. ],
  18768. regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",
  18769. next: "function_arguments"
  18770. }, {
  18771. token : [
  18772. "entity.name.function", "text", "keyword.operator", "text", "storage.type",
  18773. "text", "paren.lparen"
  18774. ],
  18775. regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",
  18776. next: "function_arguments"
  18777. }, {
  18778. token : [
  18779. "storage.type", "punctuation.operator", "entity.name.function", "text",
  18780. "keyword.operator", "text",
  18781. "storage.type", "text", "entity.name.function", "text", "paren.lparen"
  18782. ],
  18783. regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",
  18784. next: "function_arguments"
  18785. }, {
  18786. token : [
  18787. "storage.type", "text", "entity.name.function", "text", "paren.lparen"
  18788. ],
  18789. regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()",
  18790. next: "function_arguments"
  18791. }, {
  18792. token : [
  18793. "entity.name.function", "text", "punctuation.operator",
  18794. "text", "storage.type", "text", "paren.lparen"
  18795. ],
  18796. regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",
  18797. next: "function_arguments"
  18798. }, {
  18799. token : [
  18800. "text", "text", "storage.type", "text", "paren.lparen"
  18801. ],
  18802. regex : "(:)(\\s*)(function)(\\s*)(\\()",
  18803. next: "function_arguments"
  18804. }, {
  18805. token : "keyword",
  18806. regex : "(?:" + kwBeforeRe + ")\\b",
  18807. next : "start"
  18808. }, {
  18809. token : ["punctuation.operator", "support.function"],
  18810. regex : /(\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/
  18811. }, {
  18812. token : ["punctuation.operator", "support.function.dom"],
  18813. regex : /(\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/
  18814. }, {
  18815. token : ["punctuation.operator", "support.constant"],
  18816. regex : /(\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/
  18817. }, {
  18818. token : ["support.constant"],
  18819. regex : /that\b/
  18820. }, {
  18821. token : ["storage.type", "punctuation.operator", "support.function.firebug"],
  18822. regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/
  18823. }, {
  18824. token : keywordMapper,
  18825. regex : identifierRe
  18826. }, {
  18827. token : "keyword.operator",
  18828. regex : /--|\+\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|[!$%&*+\-~\/^]=?/,
  18829. next : "start"
  18830. }, {
  18831. token : "punctuation.operator",
  18832. regex : /[?:,;.]/,
  18833. next : "start"
  18834. }, {
  18835. token : "paren.lparen",
  18836. regex : /[\[({]/,
  18837. next : "start"
  18838. }, {
  18839. token : "paren.rparen",
  18840. regex : /[\])}]/
  18841. }, {
  18842. token: "comment",
  18843. regex: /^#!.*$/
  18844. }
  18845. ],
  18846. "start": [
  18847. DocCommentHighlightRules.getStartRule("doc-start"),
  18848. {
  18849. token : "comment", // multi line comment
  18850. regex : "\\/\\*",
  18851. next : "comment_regex_allowed"
  18852. }, {
  18853. token : "comment",
  18854. regex : "\\/\\/",
  18855. next : "line_comment_regex_allowed"
  18856. }, {
  18857. token: "string.regexp",
  18858. regex: "\\/",
  18859. next: "regex"
  18860. }, {
  18861. token : "text",
  18862. regex : "\\s+|^$",
  18863. next : "start"
  18864. }, {
  18865. token: "empty",
  18866. regex: "",
  18867. next: "no_regex"
  18868. }
  18869. ],
  18870. "regex": [
  18871. {
  18872. token: "regexp.keyword.operator",
  18873. regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"
  18874. }, {
  18875. token: "string.regexp",
  18876. regex: "/[sxngimy]*",
  18877. next: "no_regex"
  18878. }, {
  18879. token : "invalid",
  18880. regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/
  18881. }, {
  18882. token : "constant.language.escape",
  18883. regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/
  18884. }, {
  18885. token : "constant.language.delimiter",
  18886. regex: /\|/
  18887. }, {
  18888. token: "constant.language.escape",
  18889. regex: /\[\^?/,
  18890. next: "regex_character_class"
  18891. }, {
  18892. token: "empty",
  18893. regex: "$",
  18894. next: "no_regex"
  18895. }, {
  18896. defaultToken: "string.regexp"
  18897. }
  18898. ],
  18899. "regex_character_class": [
  18900. {
  18901. token: "regexp.charclass.keyword.operator",
  18902. regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"
  18903. }, {
  18904. token: "constant.language.escape",
  18905. regex: "]",
  18906. next: "regex"
  18907. }, {
  18908. token: "constant.language.escape",
  18909. regex: "-"
  18910. }, {
  18911. token: "empty",
  18912. regex: "$",
  18913. next: "no_regex"
  18914. }, {
  18915. defaultToken: "string.regexp.charachterclass"
  18916. }
  18917. ],
  18918. "function_arguments": [
  18919. {
  18920. token: "variable.parameter",
  18921. regex: identifierRe
  18922. }, {
  18923. token: "punctuation.operator",
  18924. regex: "[, ]+"
  18925. }, {
  18926. token: "punctuation.operator",
  18927. regex: "$"
  18928. }, {
  18929. token: "empty",
  18930. regex: "",
  18931. next: "no_regex"
  18932. }
  18933. ],
  18934. "comment_regex_allowed" : [
  18935. DocCommentHighlightRules.getTagRule(),
  18936. {token : "comment", regex : "\\*\\/", next : "start"},
  18937. {defaultToken : "comment", caseInsensitive: true}
  18938. ],
  18939. "comment" : [
  18940. DocCommentHighlightRules.getTagRule(),
  18941. {token : "comment", regex : "\\*\\/", next : "no_regex"},
  18942. {defaultToken : "comment", caseInsensitive: true}
  18943. ],
  18944. "line_comment_regex_allowed" : [
  18945. DocCommentHighlightRules.getTagRule(),
  18946. {token : "comment", regex : "$|^", next : "start"},
  18947. {defaultToken : "comment", caseInsensitive: true}
  18948. ],
  18949. "line_comment" : [
  18950. DocCommentHighlightRules.getTagRule(),
  18951. {token : "comment", regex : "$|^", next : "no_regex"},
  18952. {defaultToken : "comment", caseInsensitive: true}
  18953. ],
  18954. "qqstring" : [
  18955. {
  18956. token : "constant.language.escape",
  18957. regex : escapedRe
  18958. }, {
  18959. token : "string",
  18960. regex : "\\\\$",
  18961. next : "qqstring"
  18962. }, {
  18963. token : "string",
  18964. regex : '"|$',
  18965. next : "no_regex"
  18966. }, {
  18967. defaultToken: "string"
  18968. }
  18969. ],
  18970. "qstring" : [
  18971. {
  18972. token : "constant.language.escape",
  18973. regex : escapedRe
  18974. }, {
  18975. token : "string",
  18976. regex : "\\\\$",
  18977. next : "qstring"
  18978. }, {
  18979. token : "string",
  18980. regex : "'|$",
  18981. next : "no_regex"
  18982. }, {
  18983. defaultToken: "string"
  18984. }
  18985. ]
  18986. };
  18987. if (!options || !options.noES6) {
  18988. this.$rules.no_regex.unshift({
  18989. regex: "[{}]", onMatch: function(val, state, stack) {
  18990. this.next = val == "{" ? this.nextState : "";
  18991. if (val == "{" && stack.length) {
  18992. stack.unshift("start", state);
  18993. return "paren";
  18994. }
  18995. if (val == "}" && stack.length) {
  18996. stack.shift();
  18997. this.next = stack.shift();
  18998. if (this.next.indexOf("string") != -1)
  18999. return "paren.quasi.end";
  19000. }
  19001. return val == "{" ? "paren.lparen" : "paren.rparen";
  19002. },
  19003. nextState: "start"
  19004. }, {
  19005. token : "string.quasi.start",
  19006. regex : /`/,
  19007. push : [{
  19008. token : "constant.language.escape",
  19009. regex : escapedRe
  19010. }, {
  19011. token : "paren.quasi.start",
  19012. regex : /\${/,
  19013. push : "start"
  19014. }, {
  19015. token : "string.quasi.end",
  19016. regex : /`/,
  19017. next : "pop"
  19018. }, {
  19019. defaultToken: "string.quasi"
  19020. }]
  19021. });
  19022. }
  19023. this.embedRules(DocCommentHighlightRules, "doc-",
  19024. [ DocCommentHighlightRules.getEndRule("no_regex") ]);
  19025. this.normalizeRules();
  19026. };
  19027. oop.inherits(JavaScriptHighlightRules, TextHighlightRules);
  19028. exports.JavaScriptHighlightRules = JavaScriptHighlightRules;
  19029. });
  19030. ace.define("ace/mode/doc_comment_highlight_rules",
  19031. ["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],
  19032. function(require, exports, module) {
  19033. "use strict";
  19034. var oop = require("../lib/oop");
  19035. var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
  19036. var DocCommentHighlightRules = function() {
  19037. this.$rules = {
  19038. "start" : [ {
  19039. token : "comment.doc.tag",
  19040. regex : "@[\\w\\d_]+" // TODO: fix email addresses
  19041. },
  19042. DocCommentHighlightRules.getTagRule(),
  19043. {
  19044. defaultToken : "comment.doc",
  19045. caseInsensitive: true
  19046. }]
  19047. };
  19048. };
  19049. oop.inherits(DocCommentHighlightRules, TextHighlightRules);
  19050. DocCommentHighlightRules.getTagRule = function(start) {
  19051. return {
  19052. token : "comment.doc.tag.storage.type",
  19053. regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b"
  19054. };
  19055. }
  19056. DocCommentHighlightRules.getStartRule = function(start) {
  19057. return {
  19058. token : "comment.doc", // doc comment
  19059. regex : "\\/\\*(?=\\*)",
  19060. next : start
  19061. };
  19062. };
  19063. DocCommentHighlightRules.getEndRule = function (start) {
  19064. return {
  19065. token : "comment.doc", // closing comment
  19066. regex : "\\*\\/",
  19067. next : start
  19068. };
  19069. };
  19070. exports.DocCommentHighlightRules = DocCommentHighlightRules;
  19071. });
  19072. /*global ace*/
  19073. ace.define("ace/snippets/modellang",
  19074. ["require", "exports", "module"],
  19075. function(require, exports, module) {
  19076. "use strict";
  19077. exports.snippetText =
  19078. "snippet system\n" +
  19079. " SYSTEM: ${1:system_name} = ${2:next_events_expression};\n" +
  19080. "snippet behavior\n" +
  19081. " BEHAVIOR: ${1:behavior_name} = ${2:next_events_expression};\n" +
  19082. "snippet interaction\n" +
  19083. " INTERACTION: ${1:system_id}:${2:behavior_pattern} ${3:operator} ${4:system_id}:${5:behavior_pattern};\n" +
  19084. "snippet then\n" +
  19085. " INTERACTION: ${1:system_id}:${2:behavior_pattern} -> ${4:system_id}:${5:behavior_pattern};\n" +
  19086. "snippet join\n" +
  19087. " INTERACTION: ${1:system_id}:${2:behavior_pattern} == ${4:system_id}:${5:behavior_pattern};\n" +
  19088. "snippet ->\n" +
  19089. " -> ${1:system_id}:${2:behavior_pattern}\n" +
  19090. "snippet ==\n" +
  19091. " == ${1:system_id}:${2:behavior_pattern}\n" +
  19092. "snippet when\n" +
  19093. " WHEN: ${1:system_id}:${2:behavior_pattern} { ${3:javascript} };\n" +
  19094. "snippet init\n" +
  19095. " INIT: ${1:system_id} { ${3:javascript} };\n"
  19096. ;
  19097. exports.scope = "modellang";
  19098. });