From 8ff88681467da84deac922cec7661ac2579094bb Mon Sep 17 00:00:00 2001 From: Fabrice LE FESSANT Date: Wed, 5 Aug 2020 12:30:36 +0200 Subject: [PATCH] version 0.9.3: updated doc and small fixes --- docs/.buildinfo | 2 +- docs/.doctrees/about-and-thanks.doctree | Bin 9354 -> 9463 bytes docs/.doctrees/basic-concepts.doctree | Bin 46396 -> 46474 bytes docs/.doctrees/commands.doctree | Bin 10435 -> 50604 bytes docs/.doctrees/environment.pickle | Bin 27795 -> 28154 bytes docs/.doctrees/f-a-q.doctree | Bin 8261 -> 8295 bytes docs/.doctrees/index.doctree | Bin 5998 -> 6037 bytes docs/.doctrees/installation.doctree | Bin 9176 -> 9213 bytes docs/.doctrees/introduction.doctree | Bin 9300 -> 9350 bytes docs/.doctrees/local-usage.doctree | Bin 27938 -> 27978 bytes docs/.doctrees/repositories.doctree | Bin 5078 -> 5162 bytes docs/.doctrees/sharing-packages.doctree | Bin 21323 -> 21357 bytes docs/_sources/commands.rst.txt | 212 +- docs/_static/documentation_options.js | 2 +- docs/_static/jquery.js | 10369 +--------------------- docs/_static/underscore.js | 1723 +--- docs/about-and-thanks.html | 6 +- docs/basic-concepts.html | 6 +- docs/commands.html | 210 +- docs/f-a-q.html | 6 +- docs/genindex.html | 6 +- docs/index.html | 8 +- docs/installation.html | 6 +- docs/introduction.html | 6 +- docs/local-usage.html | 6 +- docs/objects.inv | Bin 457 -> 457 bytes docs/repositories.html | 6 +- docs/search.html | 6 +- docs/searchindex.js | 2 +- docs/sharing-packages.html | 6 +- rtd/commands.rst | 212 +- src/opambinCommandClean.ml | 10 + src/opambinCommandConfig.ml | 4 + src/opambinCommandInstall.ml | 17 +- src/opambinGlobals.ml | 2 +- 35 files changed, 687 insertions(+), 12146 deletions(-) diff --git a/docs/.buildinfo b/docs/.buildinfo index d6723bd..05874f8 100644 --- a/docs/.buildinfo +++ b/docs/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: ae1fa97c61482e1a1fe2befb76680b8e +config: 8b7f9ed7b13b61a4a1f847b624a3c393 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/.doctrees/about-and-thanks.doctree b/docs/.doctrees/about-and-thanks.doctree index 4b068d6b047feaa823ecb449e92ebb804cfac3f6..cacf56fc32140ab12c348d083731cc2eaf8e7f7b 100644 GIT binary patch literal 9463 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 HRLuQ9RNwQa literal 9354 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 CYvEA< literal 46396 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 diff --git a/docs/.doctrees/environment.pickle b/docs/.doctrees/environment.pickle index b5e1be1e9e08c604f54663068f7a8035d47f33a5..bec9249f61359e90e2637f2ddaf70a2952be5b63 100644 GIT binary patch literal 28154 zcmcJ22XtJ;^}f4oxyhAgV1*6HfFv8!LQF9(Ky1qf`(Y7S)~nT%-mX`>diU+x63(Lq zj1>rkkVZPBS5iq238B{{)Pz715=wePdjEgloj0qku{gi;_c@++=gz(J&CH$hW=EGz zNCkslIycne=60qfpBr#1^-XvIKwp(#!n`p+B+BY3j}PrL%6}PqLiFLOR>L zCci6}%_n=;k=E=_M*bO(e6slEZ;NEtN?0KujT>OC*{D zx6tf2$FDlqpYBX4qzf#6M(EFM>z+Jr+_-eE*B$a_rF!!z$_hGi`CbUoe9iuBh-wM_ zIc?4~N$v{rMM=5-TxXoqoGcV1-BT=}uz8_Bzs;H2TO7{Fz!q? zsr$v9iRs?J-#_k5?MbF~h}#$V2gHlc)RYHA#Lf8!#{Gk;71`4ZI~zKOc_iT(ar&j)9&Sb5r zzqr`bJryEQ{y;JZHJ5m-`{AK~1WIRgmV2$<;n347sdp^Yo1v{06q4C&vXIW_{1vL=aiM>FNyQV| zyajP@Vcgp^iQVr8se*=!EvgAM`VoXg5-OPDHXj^ zMV}J-rY#IsBr+)Sj7^KiEUN(7)pw*E9QDpHUC2B6A%51sL%h- znSf&5ql!&OvDthonQboyz{cOMIweEDr=(M=u1>wsiOd_w9CMV}g%*9G-%l;7X&&Sz zN9E1}Yfmyrr`l8bT*@6R1b$jYXF`8RNp!ZZ=mCf({~6?ut+xC*NY9781Xn6_j+&~_! z&Y9s-XZql9yNx>I_Bd1f-JGFa=3T~wDS?}ml;>aWU5;qcY0CFx+!XM>B6Oyu(gn3v zLFi1e0$$(dRTpdLJMAfMb7HF`bAhpQn@A$%(P%6IQfM@ zR`UJ%L2cNu2&^#dU_IPI=)bwmBS%w|1nT%y=-=4pT@jK{bS4ZAhyGg_cbd>Ts9@l~ z)zUI(#kXl*n>0}Zl=}8j{)wrPvYIA0%gLBVw|g1v0D zo$cQjcV<|wRni~$@9%P^mlu0;7ZybMlup#Qps;i=hQub>H0XbztJtIXn6(AanKY0r zc%lD61!Sg|3=$YYQOEN?)aK0^@s^BuD@MGPBi`B(uWQ8HHsWm`@zNunj1(189U!TK zxNdJ+{10~@g@M@VVZG6rb^F{PNai}vJbP%{wM zLY+?~`qKTm;y@2Nmw#*Mf5w?cBojKcKO6d=Ls!e^kSBo&zfcVP v-4Oa;XmjR9 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 literal 5998 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 KUW(tSI`nUXQWIJL diff --git a/docs/.doctrees/installation.doctree b/docs/.doctrees/installation.doctree index 546624bb5abf3aad1c8543d31265f6f0451e829e..fdd6d118a22fc2d8fb8cc928568d4736e34eb89f 100644 GIT binary patch literal 9213 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 PL~q4|rnljWBH&j63Jvy3 literal 9176 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 diff --git a/docs/.doctrees/introduction.doctree b/docs/.doctrees/introduction.doctree index bf4966e1b60677da6746ea5407b66221fabcf4f7..58c928f93b26a398b83c5722946e8b36870c063a 100644 GIT binary patch literal 9350 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 diff --git a/docs/.doctrees/local-usage.doctree b/docs/.doctrees/local-usage.doctree index 3257e938f4b9155218901d0641abda1411274173..b5b079597223433fa9e0bfc42b07493f08738a0d 100644 GIT binary patch literal 27978 zcmeHQcbpr=^*07Lx!aiT++qwq`z+l_*K`+BD1i`@O9B=s<)T~du5NW!+u4=RN3sNx z5X>(Lq>$c2LPB~^ehKM4r1wU8@4c7b_q~~wcBK`Z9rFu(KKyZ-y_q*}UYj>>+U^xg z4YO`Ey>i7()#|3@Cg|U)Rr3uIiMHC$);RDLtEin?1iG^1WCm1mnm_saE}vtla04n=Oc+NfBXbwH=oSvkcxDs@Az zXiZn2wVYK`&D=(}S#-U!2ZHLgf@zgpC*eD*bBVH9FzU^kX9;JGVbm)X%ODUpagNMQ zIBWf@E^^l8)-`nDT7|0R5>nS$KkaPDtuvZJfTx06ZwkY5HcsUdre)L>iJPW!oAjnv zFV*W_t?pR`*VBdPY~FKJZUu2(HeKgf-`Ub{FVC%Jwv&?WG{tu*X%#RO^2Nz=~BovLsplL_Y(Xkx4H+yj~r`n+PIFSjJO z9NdC0N3)mamaF_z^MjE0pk1$8gB7bpf~XCif5G0tdPA=!i{;v&@XWywAt~t5*_K=3 z>9fSGb6ReNYT4PIOX!{_%EhJ!S)T4YXY}V*n#~5mxz3L1+zO+jyDpylr*kWdy0K4? z&UQ}cjwYe)nsx^46ZPCO3BP;VN!qLQX6~3uxn?=3Jx2qXGB;hMjO80Lu3G&V@wTtuU`i z1I}V{CNQZPZN6NoXr8{$(hQiSM%}3j2Y~KfSc8ca|Z3yB7-g}SJw z*G#woD)DTq3QV3|Z^E-Q8NTM9Yyw=UH?^8&nF+71nRTt~YIq2` zprwVVo1v1X8_AorR&E=*3gC7oN z`_4lNbGQIpJOpY*msp{wa2^I*&E~H~?K_vgoQH#lNBGV(@o?uOFVa=^K!&8uNBT~I z$Xydv<_sxvCQzhq$ElE%aEwx+V}NzjcPzpcWI}b1WYyVHW2Dx=j-3)J%=(TU=sPHg zrLycha|GDSSTtai(pq*S< z&0?pUQr2B4VockYa6Bld={x%awgVEiat-5pr4s7hYa>;idD7hh46+BRl}Q)=$#NEQ zD;vUc;fO5fG8#iLlE@)N4kl}ZuKy@ViiF(Rn)7I|>if>+Acx0>Cc9dj9O`3y=L(`S zje6{ijC!?7-jJOs{2KhBRzk2-pC_kRt()Z%JSqo1lg^cGMr`&?kB#$9>jMHG2LcbT zp~r)Rt9<7PAl1GyqL0TgFP-`*HW8kAg-Y4QXnHmHJm@>u1njFJEVnuY<@^r`{)zp$ zvu_~x)&ax zXgHkF^om5L$FR5C@teyvCcM=5;$DgKclM`#qD8ypM ziEXk{80j{RX2Tjdq^XToY+?lQiS=bzV z*gAv^?QqCJlP<&|tTBWqJXuOX|7w)7d1(5$GRn||Ma`1oDL>KAW793Z^GPz1cfio@ zswM)yKN=pUJ{80Fo-H&ye42)-6>V0X&!9Vf)^|QfA_(OJ<1K1H`n>OaA?R$Op3ifN zF9yB-OP#&`7HaLwXe^jMIA1|aU-g}@5w0K;&3r!G+qY7052nmU?w zqWvHF&X1}6JE)D2^nT(yKc$wA12-LmzH(YL2K+3L;m>1b_zTF8R$Zg+&iN%c`IYbd zn(%iQgNUDmfAO8aLNPoW{kW3-`Yol{}%+m|47mKy(^w`Xk(xA@2jp9OAzPy;wbz= zXg1OQH{+JCBPlPvBa(p?m%X~+`6%2O)R}iwu zm3jcoU@btP$0)Br1M=kH;O)mFE*h~0sXbl{Eh2m>Vk^e016L4Qb+nJQR$4Trc*|*8 zn8$-X4EIy^X*}ACW0QC5Arb_f%^z}Gt5FY%U4z6IYq^EKIYj`mA-f6|G{iavSua7TAB72|#SF25%X+V4 zoJNFh1Q6TGCdRi};>#a|kd%%)bbsVDzi7RKmt&c(PGM_vBn4t)3#Fv%i`2ngsWLc)XdGN538AhyZsr*ZY|s(Py!RjF|q zV2aZj=nMsP&o(=U<4lP09gK>_DEjf-i}9UQmdy{N#lvVy>_T;jXaI>XcH@^sbePB> z5fVdKm}4YNOm{-AagiNFBqe1jrfg7AcKG;O>Y|x7d0Tcm_=koS>SIIPP+B!~4$`wq z*kYpToXeZ>yMytez3j+SIzw1GrinVu{6j;H444x%*XC&bOkii%zbnKUg178jd?hE31&b{P*ekyY)1J#zsweO}{7ldbK=U_Vhg&$d`vur!$s zwpJ)&4iA_%n@Nc zVDV7(a0Y&a1kRTr;HmmNyZY`SicVq#u6wtJ?ZX|e)^ajD5=qa`0|k#~>OcujY(&O0 zmyU0QIcJAH%|vu_J`@P|kqjUsvlf-2fLw4rgTxm)gUHCN1rjj%48HXDgA%J_{ja-t$^?MrKjI{6eDn(>Y?6hV6M8@+Zg~!A+^z5j6rr3S4 zOIEtT@mPpvG77#f<0t-~jXg&V3jo*pwwnIUVSm>C-_W`;+?^>F@|+Md;g&=*ql zAJaEtrb~vA9UmxV3}a*>+g-=AY0l!dtCaL&c63BHdsk`J$_Lu;6Pe6#Iz6n%!W(+E za#^{NN~h98Oi*cTC^L#9x&xVPaV$M*jfR<^t%W2V+N6inP%15X$XI%MqG-f7Kvia| zXn|pkl4*kBc;Xp-bwq)VjT`z%dbHFVElz$`6mW4|9~w$$hHe9R->f=*4Q8cr4C~f- zNgqr1uEg_4)kIb=TA2};MVzXb^vlSOB%hgpNIuEn>7n|GZrAWMvPH?EIW`M zFOH5F!{cF*`Jb=|ix?ne4Y%rL zk|j~c4Fj|^6!@6z=tQE_w#El0#>X-f`bdO}%XEQr(14v#JX@Jj16~U{oESIts6UC04?L7T znO$)FPAT%D51V(p>AT&uilF4EKn78s4Mx7Z-SmIvrp0yew+ObM zg2We3We+W92oyHAX9!Q@@~6x4ynzV*LS7INmWMrJS_sE2H5-fmayfiApQGcsAJ*i% zmbr1wP2eI~rL{QDGmVZ3V(hBP^-Mwc9OI$E`0)$|$npVIkjM)Oiy~4y6Ez`;XCd*$ zvl&fae&EnJjZ8yGW@_!_IgIqV3Tdykm*;W0Tzh#wo;%lG2qCS#ynxb+#9*(@ju>;KEywzfKAzmW!zm)Ocpzt38f*8pJ>m@H^oG({6-wvX- zYrGuNY?#;|N~r(TMhnf8llp$WT%jWaiI`APEvayb)fFmsU<lnYPD4$_ zuhrbhT*b#cj|gn`6##-h@4}pmSAqqY-%Ut-@hWCox)D-t+l{=M%U>hQdAIbez;Dzm ze8W~I z4~Z|{&jj=x$p#{pMj~xn+6TDJ52`ll7D2ENttsiks|^OrTv2)PeC|VBHQs*8fy_P( zAjs_Y(2I`%4ube75?_3bF-xl;GTT=1aW4OaEawaUbUBS|K(0>0eL%stpgc-2JBUwm zwQdFP3yA#`)sq)_y3vYHqZA~528k~|%edr?o^IHP*oo%0*gwbBKd-8v3$X_x4z2DL z$Fu272CFm{=HS_3D>KPQRIofaHa0Sm&P)nxcJg-A^961qUOm--<1YdT93Lq%#Fu~% zGWs$SUwnlrkZL5hSqL=h(_Z9P8RTnikl?yJUr`rd=Yo)~#5a&*AJ2P{-=xPCycgLB zIJuQ8&|c)X@Z^hc^Z$KpBWLqVAkN{LgL(;s_zvOF=7@~&hU9m-TBu#MA=zr@dsHFY z6Ycj=3<3NAi7$T0$ol5Et?;fSk=QosA2INcC2;=UFbNr4%VQ*31s6u-ZVB1Boc|~; z=o))xbPfCe2~b6OWBdOpx6sX-2xRy(2FT`9k^~N(7e|EnIjVy1Um)?tFBwlCpLaYI zRwCVoq@u#-UoqBSE3Cc3=ihKSvnPIw=g#n%5K{R3J4!pk=ieg_hN zg==8QYUns8X1OYJw(Q*(e|EE&!V>r7gU-SF_=80qXQJs8CJ~oZ6;Rcx(OkzwYo2Hl zE*S+Dy7F=QtsnzM?B2DYgL_?*S{ilRa#%uuzcUfBRwu?XW0@Iav31c0F1 zyT!aXF^koZ7Yuz35*+Sk3CmtdX4~$S>$rTqEYIJ7o`XP`&zoTCq?u*cXu4{vmfy{i zX&E=)>!w$q@Zm@to-Z{kbY2oi6cddK=2bXf>e>WA153y93-WL)oK7J-*b`Tqxjcy0=xWI@uQN8S4hRw|&7dku^i7&P= zbA5Bndw94f6}A<690MOOf%7}ymDCU(@(?pT4~AB97hOndA_*%fc#WCRRgDDPlBbtz z0+BicN(MHuF&-WjtqrFri!0V z=gMcO%0x@ZmWbsYTqHxMemwVLc_)=+^G5>%%uwvYzhHF$3C_UdmsnMWV3C>)vv>)y z*w*+Fv|N#tl%$xFK}E?O*Iq9{4{`fx)jmZ~J^BsZpA{K~lTshXb1$inP+9!DT*N5K zpn@?Zz8J?ZsemHnR#d4LgrEkz|&$wRKrBS?h0I6CMY9k zEg6KgNeZ3SrJL>jjd^n?pMRtS3Y|)Z%0fP$gVFmlwei8|lLNnh0f1mXcS4TD13((g zb`KI?T*%DGxQ~+1n%DKQG;z7Pj z+2MC)wAo6%i0Q#XqF)us3Nt(T`b;+ho?_73Ah5*H5gI0V(iFXj<7!d71vy2T*%`Ty z9SIERO?hfL+t4vJieJ5@$R~1{2lTYwwSiYvcnJ!FDN-Ov74hID60TJ##fA(IVu^N# z3{MM8=fMmhZ)+Zk$i+iY5sJMCi7zf@EOHIxP_RTgE7^b=!}l`QoWj~`4dfCom+tja zJa@WRLP)Vop3;srkcT1<BIpEGh;)@b~iMw_={0y}p=IsHf zeB^qEn3V+BOh8!?aAe!)CD}P{bDwH+OQ&RmzDfeFFpv~*70iw4OgTq~BX=ryKB-D!`)tr1&|C$Y8TYebrh8NTP4*!bc5*?|u}03evx zosS{00LozBmm$Gb0p>-H-lU55=>2Fe_hothQYhv;oI1z&iy_dXc^+Q1;Fje}4`@x_ z6ZHzc;y_*^ZLiUFywo;tF7Z z6s|;qiv^6X@9@z@44fpV#=OTd`o}Buy~ez&xLmrdC*Zl$Wf4Le^RA|}W6V2NBUAgblgLtCE^d!dgWQ8dfG=|%tJ73GSuT!-rV!Lx|$u`-tk{!w2 z@@RF^6~^ve1Nhw$wF?fMpTcr(znt;ksPG>Gf?kq&1tWZ=LP#&!RGJJ~00lQUF@%)OtMJ@Q zHm|0#EWZx1jX}Hyxsc9lk@(_u_$BGkD-+u=Fd3pHET1y~usG`zua^zHfg5Z$jRfE{sq$w`EKs9zSeGfO<-Q{l#y8L??Ae-;IeX7L!01M{dkHi-r;EH{V zsTdIr2}8Mr4>F<;DMY@#tK~ABGG@6(SJ&zUwr)-xdcP$ry1pE6v}ZZCol$egaXS^SUE_7#`Zv( zY(HX5-9_g*;|9{tGS>Kk^rpZrJ_jI3^FL@=d>$wu{4XH!#TU6zIgAo>kT}1C1q|!- z>a^TyPvFHRkb4!cqOagLw-Oor2@LU7&ioo>Zg3Z>#d@U> z)N;kwkv%QGL4_M5-y>ms-{jI;sr1;6ss#r476W{n09F}gkN34*@g2_nE`CW?xi!J3 zQ0NmJ;(N%($4^?kw7#1nzR%TufM24%Q5V=453zeO2Tg$>!+CcZv_ugaK~ z_#HBHORbvtJw2>~I1GzFX7UI8e-Pi4u^PmYg>S7GmMi|qIM%uNFiHams`R-WSNw@{ z*WwCgh?GAQ!euBI3*s;IyhfC$T%KqUf2FKbY|m@Bc$J%1uj4a3Wy>q2>SA`#_NtXZ z@izilMQ5{dOt;z)f5-n*K*KsIRPesbiuece_AJe9cB}N=nkG&exCP$-1F`=^*|hi< zVOaxF;OjaywhZxaMwGB|B2J-Mg59J&%W`WKWAe)`;wa=!*`rgrQ~1TRI0pflL0bj+ zFAijw6+A8lSZ)JJ%|%6AZN;XyVTq$Ddzon!o3r8=!j#)!Rf}{4!dt*AfNcwR8kQmd zn%q`-{-qcG<%DQCk!E;e1^u&@zEXork%a@)4aG|2LF?{&E&aRE zI#9-Eh0xiW5IHMj9id*9TP|nyVm+f|V}bS4_e}6QKCyvww_xpG-&e4zIACAUO?(K5 zzNI5JqVQmDD_E_zyhGdm3jAdPu?axeHf@eI66MaMaS}Zz6e`G3oGdYwYq;0mQnEOOz*cb;T-lrzTj~Gx1r=JLchLnTaSyJ$3SWW3 z*BDCW1EP<>mgKhLJPG29*x*3HF3;K({9y~2vX8-j z(X1Gt$5W!h?C6oZ0W!xuWgU6!LR)%Cs=TypiWEJpL)Qpf!5}iP$(<~{fK{>By+MGU zT~J?p5<>t%pHk}KzT%2BGN*ILamT?vs3quNRd8%dWKeoAw;JECYGn;03q5u%%d#~F zj1cZ-F}J02kmG9#Vw5T^v3KFkT6pTWkC*et6#3`IW3323=cIA~%ZD&{KGs*IU zBqWd!5>iPoq>)~K>AjKOd+)vX{`6ZR3iud-Kq_K^d*zPesB-KD1K*hhKxs)78v6)RShE5dO# z$2FUdy?Q3U4OvCqsg$%*qh7Aew}kFi8g+ZkOnxJZoJy@(H8t~qPN}_ihH+FICB3S( z9DUxj`(|3XEl#WGxD^)!HR=V!EIW3>v)AP|Hg(~cg_`LQsAI36wKwE8mRdr9(t^`y ziIQn=oXI5&v(!)xZ<@(%)mv_(+-SJ-A^om5OID?7fHeEqS^K!CfE}|$ z+$HSeA>R```$WiB=!=Sp{@jY(YH$m_>>bw1+-jA7Qhpdx9JU%YbGT}jNf7nn^Do>x z+-T~xWU*2o7OpWIAS4Ct*eB=KxcWSCYiqeRs%86>TtatUQ7N`u$nsRrK5Zbk)@U^e z&arpS=GK&|y5r#a^x53nqF&l3NE2tw=8hzx?V7a*tYh@tDha=P);`nf(_6Wts+GEF z5AHb<$dnP;L)JWWefYgSdzdBF6@iwsu%2SSML0TUu@v z!`m4P)Q%2VJ7=xaXRR}4tzEO$?%9@wMlIFUShS_R<^dRUwhR6E)mPaQo;``Ct+aL0 zj5RpJICfaWt)kv4TBM&T&z=TAZbgR{>l7m5ZXqJ+r^j&m`0oU?&^N5eLLwuaYd_?5| zO0Y$|arvj$AA)o8(Aw3?>aUvba_Qrce2)Eaf5 zaxDT}YP7VvX&MQ)p&1RW;%IpAyP&BBsGFmbmJ`aOPB2F}QLo}8T270pG#YhND=tk> zcO;$bYs@&%QqiaC3|R3HbvQa{Ga~qe#B? zgY@9MVDBksIV`Et!DGrqxKz3Uv?fm zJlL}zLOk5@$P0Cq3m`*M=4GD!P$GAISebLA$XQ>J53}M_Sb!3aQYy6Pz`E|)MZ)E0 zLUot1>MW@-Qmb#rb_o>>&o+I1`vtL7mOXo(0DGC7Mc(zAWrcsZbQK?a@kvC*#3cm(_sFfSlYGaX{UaetN%J8TZ z6FAfM6&*$__D%m2=bJY91YQXO53QlAz`-Lu`%xg(x+0{HM=&o@eH2^Os_7Q06$hi~ zqrvCZp8Xh~eKmyT)&-#K$CBW$8OW`cnfA5$BOsD9W8}TXXXkM-uGVo2aJRLD{dhEb zoo7FRg!^h>x=?Cf(=kRgc{mD;5Ih=ax|2|OR}7~}iNnomYaS-k37dS?rpyE8+z=02 zx`s$*A1td^WeT_adUM)H|rLn}n48)%fyvwq7`{f|?X3u^FQM2q?;N+$t z+a%^_x3OOd%&+q7R}Pp8Zxr6)p7B7W zy(?grRL6cd8hwvvzn5_OW=RET@@+v{DUt~~BKv))_64!Q zDH1^-9~f^@1Jb8G`!jxL3-o-RQ+(F%^`DFO`dg^A&!aJa`e1(nEq&3mzeKqFOf>W9 zU~k_+z1^QO$8}2k%fRv#&;BZ5xlQN*7hm)2uTz~~!|FGDPQDq-$+rUji@bsTZP4)@ z&;Bmq^!*nVpvkWVIl7oQI{co){vO)@zGwe{+P|IJ2uSaTp8X?g=@@Vm8T6IYqA}pd zz6^g7E5n~chP0L%c6avAz{$@&`xk`2yBI|LFep!g2s=pomq73<&;GTKAY3fDz?fjs z9PBrq{ab>&8EAt3FW^+kr5=JqJvE5#VBP7hJ5#XWcW<5z{%*k9Z^cdgj;Buddx-f? z#h(2KDDaP-{U<1fXQRK7131k_|Loa+A$_^f*MDO~vHuznK2HJu7Ux?}Cc*z5g5Q6* z==|Q5&pf!X&;AFb_)pLN7sO=|)qiFwlHpS%^lwkBKoCT-d?#o;+c0(ckqT$e#X*xkQYZVTU|@){uETK93I1*2uI7*3O z=pe-)R-q!={&!%c6{{IpSL1t5fkB8hR3V!`=!Vv!-qlx$J|vz6PxEWS2gRU3TE*I_ zf0NHNx>`+X7rMN*pw&#hj+sAJLFII_fte>Nx)CyI9tgAt~SI+@CAp zOo(^@o;>kD{$I}AFP4X-?jsLLi3d^j9ScN(ih1aWh`5+*1e#Q*MA}X4r3!MXAc8T6 z5{UE?B%ZjG@$@fnGlBCj3q%+XSUgnGuAL_yEP?Z72zaKk$gaM7h@ztxzUv;+uwS^# z(b`UiMsch8 zco>7o$gB+#G67;(Iq(8knNwAI8M)5o(#VT=jv6^3BnMuiG~&PwjsAuKD21#WnsYM3Hg8sPmvL75Ov ztGTp9sEwsYCQ|7HgZL4iUUieEm~UvwrLg7DijSx==J-XQQQvxM0D^x0!`4L|XrR&t z5>GU_VP2M5ASOHg%I0z*%kx>Vd?_8Xs%s_7EbWsWEYc}tkW@5H0C5~>Oiv337{VNL zUvU|6cV8LzxouIsY<}zz8y5RfA8aln@x%dct^bg*g-nAaBjrSC^x1y|fWUqiKH;GNd|iRW6aT}gr22@Ej{2_T@~dPy?;y@s_S5cH z=yV5;yfs@cwDd>-hDl{DJ&NmhYiZgi^U+irZR)D?m=^Od^A03nuGe} z$mm#k$|S|6a8frle|Z}|S*;WUbxM&40J zm~Qm0(yCVubl|5lnbCB5RF8!(>9y+Rm1ZiPN{=u>RDC5 z#R+|6B%K+#72tjI>by0WmBulun-gVyJl(qz&mUD2lX}t2jKM78RK=uUPIe^u%w|jF z^yI`;EU?k4o3NX4AF(-B%If2jgXxK4cC0iy5fnMj%3BqY%8aBZ)6gOd5ms3m)l2EY zQZbz#PmhF*y56dRK?!J%PmYaDjf@WJqiKCoFPDOtaTK~%P06v2(H6(ek%=j^5yv1y zC)tYC_|x;%#1=4Mk&Mt*X6xvvYAXuTAEQTXQvF9J_I|ONso6|Y3qy0 z%Z`tfih6cpaAdqZUYwW;bxUrdT&Wx2eNxGF%$zbuO!R#tJ32BpR*Z1pgtn6Mxcvdp zHO7r(%&GAy-9R1Pm@vnS<3Wivotm3TmPMoPVj%-{l#iLrPED4_M+dW`nTgU!xDPv~ z9q5W9Msaj}Dnpvq&9U@k5WC|VOp#ToIV2|~reY>NRZ5!^gHsdZnJIlN#Kq;hz`)>w@Y(D{sC$47?EoTT6Hg{$SPvr6^$?|*&5&T8GARIQtaW#OB=hu91d75M;GFG694lV z{|glUgFp}?8GpUxg^cq>3g=ru)J~0;Lt0G(`$Gx!pW0}ld2&+UuUD#cSRfG-Dyk(F z4zapI#R#_GYK$ZTmuZ`Ba}*5Fw*v(|K%lxxBI!z)lf9AEPK z!z&qWw{Ix=a()%n%jPq%u!C<_yc)H^;%kt2;Q-1d-=Bc25uzYHVt29Zv+rzcK8SpZvsZh@y$p)@xM%iG!4kBWO<3EYY*(6(8pEkH~Vq zr%$)h$Oh!I;wO-J;**R^Ug7D6 z4T+s-?uh+UT>aCk`n@4`U&Mjcz2d}VI+MXFjfpw<p+ zICx$j5#lGP3ci1e#1lVbJpFvw@nBd9bsLh33ZH+@Sbw3g_6nbW$>q$R_!XX`;WHtm z@cGx2M#AUcAP?mK7KtZ*hu@g+nW%u$+Tk<)T``SHzvoJSP?b10h7mv7{UbyFNkMM{ zj<(yCstqfSJ?)af>4W0%BJp@x+n% zB~{!?g^;X?1<4QvQ%5n5RSL&Wl$|SIvx4~r-%-{EIK+&+iloQwTB)AhbkmBKrVA~B zdtuse$T&#~j zKs0a~noeO7aY(OjzYIF@X-=DzYAVT4dDR~F~{>@ zXeIZci%3l*VFd-RF&DU`k$_ur^-7(bvqC@>YV@L;_JLF7Rmh9*Iai!*f;r$d4i=7I zkU7L%a`lft&C#{iNR;81`Ay1ustI*Zl~3i8=`8AXSciPQ4c~y~7_zq5S0-mFB1nH0Bh!ZK5?=T8zPV^%iCb0tv&d%eP#xFXi7XU)fI2I+aiFPzW z1jQ&_oGj64jP4YLt_N^vC?qmf{B$Z;K2237S^~C2EbrtZ89JSg=UyzIL1o$ek-z{m z6ua;*SRFuuGw}E&R#hQbq-KLGUP3H(G=3N@SDYy+8DvU^6eYJ`d%Xmm9)%7{f2AfFk5}RH+t(pbw%hs1Le$%U9O3 z63I9tnNUdl(q6nyGW3*!)_U{W_7TMMG{Z}t?}q1IJl~zlvN8x&Z-tBc9B~i8fcJYM z@x)p9CEht~?NI|VAgY5hpsftPBYOM#E^#kO>)A}}If~Z*r^aJ6=+8#ZWqR(d=y@W9 zfqt!(s`RP?JS{gwEg9(7U4d)c1ZCu`CH;^#Nujg4bhC4yxoGU>^N(~uA*y7kEa3Aw z7`+cu8y}25!T0;;0SNYU2jobc57J<^7a;M(h0KhM`$!qEO*n13R&!r2-y_TOqX-lB zA_%DC4S;@>rBUd{<2Z&`ITsj4Jjjw)822_!(Ft?kp&vYZ;DF(g% z0ZR;#&@jQ1rtn1^M+@UE$SKO)?$8D7P+&l>##77LB^^_v_|;pAd_tFbKu`PS8hAH_ zo1ie5A_am}5f9!P;h5EOY{+mCOSC&=c(QLg_hSHgRr6p(E@n^>ioHJ)PdtFJ$Tg6I z!4m4MWCLmpe;{Lhkiyz)4dh}jm+o~ho}=!S5K`=tqcpMxatZQ4{-sDfk;gB&)5!fB zq9W)%`T9Y}w8VoYj)yRg%M^|XP%jQ2%9UnSCA!-mwp1EE9>%4TzXG0n@i#|h+5BoC zk#;V0J%yOWbwJ;b*A*AaD0Y<-^xIgdqtqnSin);PAH5OS1Farls249+j-$ zS4qGX29g3^z;iDF@1rt#W|-oNp%#d*F%KegRT^OQo7pkMT2A#t`*Bx^xo1^!|sg2?Gamz zC$Y8TYlNDM8NOX6Hh%cN(f7eE0KvTOcnpdCpbYlChy+&!m=`&ElPWr+_Y#+1F3aKx_K0XjJLt2J#YVXN@lM7TW|b{NPfslrrv2geAJ3d^`pT?i%1XX3Qfhf{u!=+;{0gTq7}E%a|UgFvWt# zaO-#H$8+uLRPCwQ?%ZCoO}4FMS8_-mtxh_kG<4=5es_iKf&=F#Fy8o{_d?$`t_KjL z^dGe?o(Lom>ywap;s$P3b`oN+(@CDpJ87OG}0TMhdfaDd?cQD0e)k815pv|4SWV{d1?_al=xr7_-|794+23i$-I~m zzCBgE=M_ji@k;!Xbm$$49T=Dl z(Grx;830(G^@&%>242k#yhb&!{QAA5^IFFDI)#ryv5=jUU|!FKQZR48b1%WXk;<}p zdX)!v67eQvKqhZSg2O!cC7HB~Ar5LhC=N_xSENwmEnMTRss`uA&`*Bxe9VR4#?Wt9 z(6p|Hmo>ms@L8bXNa{NW#i1Vz@f(Ul{U6IcC9{cl3u0%Jrnv9|wb;S*9o%Slmw&0> z<=@Ew+5E}3O_g{TV8Q&mk$B=gT(N&S6+@ySVJMgIUPkmjg{YTHct4j*?S25yQSA~! zatR-#G~yCIggj9EVI-dT2!3N+0#OmvF`F#S$b$|yR^Z|miTmH6j+YJ%0Ut|b_UX9=MiJ-nRKo*ZXo?6V~rn3Z}#otQviZA|AUsr zr-1^({|pjOe3l!P!zeKaiSs*Hz_3p5O3STt1zubNx!3Ui&Cda1Cbyye!4UfDh4?%p z`T~A)Ymvd$ zGr%_pps!SM<%_|^H#zrP_$688*8AT+p>J-8ZzCIDJ8ARM{!ohe4p;jweu?^KLttY_ ze2>A`RHhV~l5z~^B)ud5NiMj3R69oqR8zCTf*Ie_>LGIJ}TD|FpNuGB;fS0< z^DjcPDz`x~Cco_>{!MUJW+vCqub#!h2*?cDD#(9vLc^%yaRv6Ka+^tN4l3fVD|W$4 zrZ|GKR~crpH7{1;c_z2ntQF}@gu8^709z(5IUI@nYjZo~ftX(Sk0L~?iL{a{R?$Bj z=sPvIC0RH?{Zgz(9<;v6Xw{m9wuw7p4f3IJd}^jrFEK5-A3PDh$55^u5IYELMQ#TU2%)orGbwy< zNsg|7ez33A6ej`dTJ&eVSXitWxPW~!GWOu(OkqnF8evfGTCbN?`)onf(yz%XLq^ud9GRhhS{_;bYoWgmqNqjP%Ge0kXh7Wg~g) zLPvUoRC#5^5JU8^5nUr_1xaLHn>$f@0kdkddxHR7tDwI3BvJrDpHk}KzT${sWX|S} z;f{liQB%-KEB_po7(wYZxpnx0RXZzCicw!vCI2kZRvH1j}K=j7n_V7QVg)d3r lt5NvGN3PEwT^un9&{;8s-`r}lLBkQ#_y=#(!Y@vm{U1dgUs3=7 diff --git a/docs/.doctrees/repositories.doctree b/docs/.doctrees/repositories.doctree index 90f9af18af7776fdbb6ab519332911609b722d50..b213817d9709afd7b9bde401eaf9842e7145194d 100644 GIT binary patch literal 5162 zcmeHL`Ewjc6_#b|*tIRob{rF1!sEmVN|1Kt;KTe-{-%;zrxouyV6P)Rg^156~_-M?e0v!e(!tVd;PwCa?tf+ zH`9KgYEkS7RW)Bj5$P&zy8SW@=CpZ=RU#e=-ARO^EjbNcJTNdY;Kq?o{br_xXEptZ zryVO5NvwPwr#@aBZYZ`>Wlg1h4f}EAc%r3fB&ShU^*zUpvq+1SDy|y`fpE<$s(P~g zwMy0e%6Zz##uAI7;(W)A-ybHev$tJw-cn+9ikCfxaka$|z>mM6p}3QCIqbhyCaVoA#`SOO>8i z=|-TnH>YO-t&}fzJ-dkwuwjG%XK9}tWW(Lx_g|a^gmoE*q8^Bri7u)?c;-SqPIzb> zsi)ej_j^)Hm8JkU^c*?NGqxr0BSBMhn_;ZW3A$YlN}zDZ)Or|@ zD=e5I|pW%bc%qoSx;kHwj#WSj+_ z8jyBO607tgB>BFa?#E&_(1+UAzPIS4!R>)5HeCKlFTS`5e7M7K6^t#ZTavcY!|~L5 zVwvq6gsQ~Wd5nnwHI@Y4EWv?Js$ZldOR$E7E zaA$TJ|7VZa4o_F{|5)vCQ33dPw05{=ok2kaDlRJQTKl0$5o{Z;1cvZRRQtWJRguU0 zx^1Sif;+v$WN~f-_Lm(2jqV|7YW{3a4U?LO|DT#?JT=J7=`u62Xh!EYNXJ~o96AqQ zbLik0GkkP$@H~PvozLl|CQXD={I^$-q0)sZw#6Kx7w>`x*Hyx77%^q3Ppq(UUG;oT z6WS-w8vGtbBfoCP=w;}s7jt^d0DRq6knHp5z&PwHE4ibWXH9tacR==E-i7ED!0?qh z*#^V^fq0SavsqIVM=l1dqLn_LlVid^g>;{3Ssjc+iyS8kKBT<^Vx@I=EFD`sNd!+V zoQA~-WxDrtc?!51BhEp(gnha*WZ6RaMlEE#cMcn}J%hWu$f=i;Kv441npxxVB5)JF znIza&o$^TG%)?nltp?k^B2S8Gyq%L|qxe`(;eJl9V&ke4HsiqQy{Ty4rhx5SBW{Y- zp-mCHVcqLa@hG+_VHMZcg*Z|~Hl+p&wyme4iaB3FG_82Js<*UFnQ_ZZr0{zIe)sRL zXwjx6w!LS*+_IC?tJ%08d47s1)q(nI3$5riHocaOVn{H^h8ciPO)9R;2k4e;Oe}h%TRK=VLDDdh{^=(a0nR9`Fgk)@Ti?(n1;ag1igU` zLb$z=RS=sij0w7O6{=Ds#?|ulQ1qq-8&gnF2^NJ${3?1gOzGI|+x03N!jrT^%WPZP zGEX2(voxT$u!&xy)^Q9W?F-$){MD{Y9R_uJE30^13#iaAp|>@#x`5LO#DWOu?Q?@{ zw+f9y%^+5l6T~hL5X?JldMDe40HL6xQrW%>LRaztqiV7A-E%{1d)M!-!h26c)*Ea> zq-mTwKqdBowNrkTP!s`@_+B<{fKXT>;Yt8t=zVMmb79t|_cz$M2%Ex#YVN=dDTJmE zEVIct(@CcPnavME+5$jV(^GH>S&y>NSu$*=44YtRms^td-)DEU)_^SndjE&;K%&oIWJo-4>DVBWP27uxj@GG$S z1h5&#Fxv9l^vP~|!Nmo?xS*gzKn>qqZ$ubc>GP;9g9&a!3XR*1_zTNyYk404 z=@HG-7vZKMRv$6Hge}$qPfxRV>=wr zSG)-*ySRM4!78|kNwA^6MBhM@nsg=Pt_#OY7!ic&4i4x!pC$CoWfT%`I*Y!iC4Fmd zl#Q)r8hx7$u?wf*+;`YW?|SCDa)MRbA~G^IPU(Aaw4lQ(K;K7E6eZx4H9$YO%C?!r zuhiHNnboT?BW{w8mT^?nm?swMcvaQuN2XyyeJnZBZ_5CGntqIHj5uo3PuRp-aMsnt zPvui=%yc$q6_B5?LEodF!`m3QQ@G#g=Is~DY=2pGA`nHl03cdAy<3)Fg4%VU+Pm(|6^hY^~j*kKLPsPbth}7Oy6s}%y%>u2;D!opt=+8F&r5Huc N{m@@?`dikl{R4`0JtP1C literal 5078 zcmeHL`I8$*6<)8shh%%bzK_`Pm|$2ZUTF;*$1x#5oH(&J$VqSqhcJv=GcEP7bG_-F z)e0Dhfq>0@hWoz5ec$(e{15yqd_5y+wdnBECFLpES z2dWmuo={cu7>Y<&X~VHAG@8@K8CHpSD0DXwiZiP$qKTX)*;K+)C7e(w#oHKLv8l?Y+$>G8v7_QF zbp>s1u&O8AIOS$GZE3I_JkxP2j&&4k;V8{hOunA+H?1Bx-r|4#zO}GJ93cnBAY_iGS#nj+y*=(bM;)qSplGB`xmE&)*>Dh9eXKYj8 zM}m$nY{X){NYiuVs00enommS5LKlcC%>aaBIo&!V_Y|Q&GZgxJ%FsVD9QxbjUb#!| zll$cXHdd@b$0aid)tY zoz|mz&3Y`(EG6SC@GMsfcd^=$Tw4iZV(4vYDY}+ePU2KsJo3!56(_@;&BFJ~=^dd}VBSWZd9vVe2Hn_cHhK-kh z(mj_pfDgACu7a^8bxYD#`Z%6hODwaUgE)p&x)*!im(y88tcS7E--c;6b z!kBOupL<2q=aF?{t~PJQk;OyrCt$L#s@zhd;PPl_jyP;rrA z*RLOn6wbCWBrt?mqB?ASt%^9_-77Pd0q%6aiQ)t6u)nMbD0Jtf$@%j+Ett?e^#9O2 zTPI^kHTm_z5K*Bv@I#ta`_96Sw#=|WBqnJ^Jj@!y_7hDs05uubL= zy>vS)xSy?7({(0(vY|r5C zml0E*Qxi@}dsWZyc;UEl-*g0Qvrc)WaCYI$A-BP{4rE5rReL!JHi@5QH{Hsq&8Ag1 zY{r4pAE`*%M*F& zHCFMs7SNVqLT_teb^)#vh$Ruw+ZRUJP8Ay6nL&aoCx~4hz?pa0^iH+~4npllrCxm( z*=_J$tY|RfsumV6=(^D`BQIE3FSvK6K z48tDzJP8LmxIz?1p(7RanQLsLh?eNHjhKl9nm3(}?`cWjTEMN#YNpY**%-Tc7RG&tP4q8azAN{$N?SxmoW?1A z4~71r8AMUHu5sg9wlPCqi`6PjY# zk$zhS_-OhuE+^usO+R4=SA(-ACw?lQVpFEFIV*ttjE(vp{T$ZDxVgctMK5l@xW;ZO zvrYt}s1^W3OQ(N#@=I{L2XVn%MZdDyo`S=WJ0dMEu0&)a;nA!LSB{6zcD4Y zfM-xBf7{5KZ1>tyUtU%HZec_o$?5lUTJBO{+3?+1d9M5+r$5RAsQ+j?|5Tilh4k!S iFyTT4mnTr5tkSQvivDcVUy26P-1_`Ar@v**+CKp6xE#>{ diff --git a/docs/.doctrees/sharing-packages.doctree b/docs/.doctrees/sharing-packages.doctree index b6b779f6d19cf6c7b78789ba25e9b65c715074af..ff7b9919d6f454a130ac58ce35da07851d1e3f95 100644 GIT binary patch literal 21357 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 i!|skM$nu=&UU diff --git a/docs/_sources/commands.rst.txt b/docs/_sources/commands.rst.txt index 532683d..13c334b 100644 --- a/docs/_sources/commands.rst.txt +++ b/docs/_sources/commands.rst.txt @@ -7,45 +7,229 @@ You can use :code:`opam-bin` to list all available commands, and opam-bin clean -------------- -clear all packages and archives from the cache and store + +Clear the log, remove all packages and archives from the cache and +store (internal repository), and call :code:`opam update` to +synchronize :code:`opam`:: + + $ opam bin clean + +You can limit the cleaning by adding these arguments: + +* :code:`all`: clean everything as described above +* :code:`log`: clean only the internal log + (:code:`$OPAMROOT/plugins/opam-bin/opam-bin.log`) +* :code:`store`: clean only the store (packages and archives) and call + :code:`opam update` + +For example:: + + $ opam bin clean log + opam-bin config --------------- -configure options + +Configure options from the command line. :code:`opam-bin` options are stored in +:code:`$OPAMROOT/plugins/opam-bin/config`. + +To display most options:: + + $ opam bin config + opam-bin 0.9.2 by OCamlPro SAS + Current options (from /home/user/.opam/plugins/opam-bin/config): + base_url : /change-this-option + rsync_url : None + patches_url : file:///home/user/GIT/relocation-patches + title : Repository of Binary Packages + enabled : true + create_enabled : false + all_switches : true + version : 1 + switches : + protected_switches : + +To display arguments that can be used to change the options:: + + $ opam bin config --help + +Here are some common arguments: + +* :code:`--enable`/:code:`--disable`: when disabled, :code:`opam-bin` + will neither patch sources, nor create new binary archives, nor + re-use cached ones. +* :code:`--enable-create`/:code:`--disable-create`: can be used to + enable/disable creation of new binary archives. When disabled, + existing binary archives will still be used when possible +* :code:`--base-url URL`: the base url that will be used when creating + opam files to specify from where the binary archive should be + downloaded. For example, if you specify :code:`https://x/y`, the + urls in the opam files will look like + :code:`https://x/y/archives/package.version.tar.gz` + + Note that, when this argument is used, :code:`opam-bin` will + automatically modify all the existing opam files in + :code:`$OPAMROOT/plugins/opam-bin/store/repo` to use the new URLs, + so this argument can be used after creating the packages to relocate + them. +* :code:`--patches-url URL`: the URL specifying the location of the + patches to make packages relocatable. It can be an archive over + https (:code:`https://`), a Git repository (:code:`git@`) or a local + directory (:code:`file://`). + + Default is + :code:`https://www.typerex.org/opam-bin/relocation-patches.tar.gz`. opam-bin help ------------- -display help about opam-bin and opam-bin commands + +Display help about :code:`opam-bin` and its sub-commands:: + + $ opam bin --help opam-bin install ---------------- -install in opam + +Install :code:`opam-bin` in opam. It performs the following steps: + +* Install the binary of :code:`opam bin` in opam to be used as a + plugin and for hooks + (:code:`$OPAMROOT/plugins/opam-bin/opam-bin.exe` with a link from + :code:`$OPAMROOT/plugins/bin/opam-bin`) +* Install hooks to call :code:`opam-bin` while building, installing + and removing packages (modify :code:`$OPAMROOT/config`) +* Install the internal repository of :code:`opam-bin` as a repository, + called :code:`local-bin`, where :code:`opam` can lookup packages. + The internal repo is :code:`$OPAMROOT/plugins/opam-bin/store/repo` +* Download and extract the set of relocation patches + +All these actions can be called indiviually using the following +arguments, respectivelly: :code:`exe`, :code:`hooks`, :code:`repos`, +:code:`patches`. + +For example, to install a newly built version of `opam-bin`, you can +just use:: + + $ ./opam-bin install exe + +If you want :code:`opam-bin` to re-download its set of patches because +a new version is available:: + + $ opam bin install patches opam-bin list ------------- -List binary packages created on this computer +List binary packages created on this computer:: -opam-bin push + $ opam bin list + +opam-bin pull ------------- -pull binary packages from the remote server + +Pull binary packages from the remote server specified by the +:code:`rsync_url` option (set by :code:`opam bin config --rsync-url +URL`). + +This command will copy all files from the URL specified in option +:code:`rsync_url` to the :code:`opam-bin` store +(:code:`$OPAMROOT/plugins/opam-bin/store/`). Since no :code:`--delete` +option is given to :code:`rsync`, the new content will be added over +the existing content. It may be useful to use :code:`opam bin clean +store` before to get rid of existing content if you don't want a +merge. opam-bin push ------------- -push binary packages to the remote server + +Push binary packages to the remote server, specified by the +:code:`rsync_url` option (set by :code:`opam bin config --rsync-url +URL`):: + + $ opam bin push + +It will perform the following actions: + +* Generate an HTML index (:code:`index.html`) and an opam index + (:code:`index.tar.gz`) in every repository present in the store + (:code:`$OPAMROOT/plugins/opam-bin/store/*` where a sub-dir + :code:`packages` exists) + +* Copy the files from the store to the remote server, adding the + :code:`--delete` option to :code:`rsync` to get rid of former files if + necessary. + +If the :code:`--merge` argument is provided:: + + $ opam bin push --merge + +the index files are not generated and the :code:`--delete` option is +not passed to :code:`rsync`, resulting in a merge of the stores. You +may have to call :code:`opam admin index` on the remote server for the +opam index to take into account the new packages. + +The :code:`--local-only` argument can be provided to only generate the +index and not copy the files:: + + $ opam bin push --local-only + +Finally, you can extract a set of packages from the current repository +(:code:`$OPAMROOT/plugins/opam-bin/store/repo`) that are compatible +with a binary package (i.e. not conflicting with it or its +dependencies), using :code:`--extract NAME:PACKAGE.VERSION`:: + + $ opam bin push --extract 4.07.1:ocaml-base-compiler.4.07.1 + +will generate a new repository +:code:`$OPAMROOT/plugins/opam-bin/store/4.07.1` containing only the +packages compatible with the binary packages with prefix +:code:`ocaml-base-compiler.4.07.1` (resulting in this example in a +repository containing only 4.07.1 packages). Index files will be +generated too. A later call to :code:`opam bin push` will push all the +store, including the archives and all the repositories. + opam-bin search --------------- -Search binary packages + +Search binary packages for information. + +For example, to locate which package installs a particular file:: + + $ opam bin search :bin/opam-user + user-setup.0.7+bin+2952509c+02303a0a:file:003390664:reg:bin/opam-user-setup + +To locate which package depends on another package:: + + $ opam bin search :depend:alt-ergo-lib + alt-ergo.2.3.2+bin+0de601c3+b837d4ad:depend:alt-ergo-lib:2.3.2+bin+46bc9b0d+e15bd9c3 + alt-ergo-lib+bin.2.3.2:depend:alt-ergo-lib:2.3.2+bin+46bc9b0d+e15bd9c3 + alt-ergo-parsers.2.3.2+bin+e7404faa+00c3ebc6:depend:alt-ergo-lib:2.3.2+bin+46bc9b0d+e15bd9c3 + +To locate the installed size of an archive:: + + $ opam bin search nbytes | grep alt-ergo + alt-ergo.2.3.2+bin+0de601c3+b837d4ad:total:013055077:nbytes + alt-ergo-lib.2.3.2+bin+46bc9b0d+e15bd9c3:total:033822968:nbytes + alt-ergo-parsers.2.3.2+bin+e7404faa+00c3ebc6:total:009382175:nbytes + + opam-bin uninstall ------------------ -un-install from opam config + +Un-install :code:`opam-bin` hooks from :code:`opam` config. Note that +it does not currently remove the :code:`local-bin` directory, so you +may have to do it yourself if you want to:: + + $ opam bin uninstall + $ opam remote remove --all --set-default local-bin + OPAM Hooks ---------- -* opam-bin pre-build: - Backup the sources before building the package +* opam-bin pre-build: Check the sources before building the package to + decide whether to use an existing binary package * opam-bin wrap-build: Exec or not build commands @@ -56,6 +240,8 @@ OPAM Hooks * opam-bin wrap-install Exec or not install commands +* opam-bin post-install: + Create a binary archive from installed built artefacts + * opam-bin pre-remove: Remove binary install artefacts - diff --git a/docs/_static/documentation_options.js b/docs/_static/documentation_options.js index 2ba2f05..e611d71 100644 --- a/docs/_static/documentation_options.js +++ b/docs/_static/documentation_options.js @@ -1,6 +1,6 @@ var DOCUMENTATION_OPTIONS = { URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: 'z-2020-08-01-use-patches-only (2d2e3f1) (2020/08/04 21:39)', + VERSION: 'z-2020-08-01-use-patches-only (78ed6f0) (2020/08/05 12:28)', LANGUAGE: 'None', COLLAPSE_INDEX: false, FILE_SUFFIX: '.html', diff --git a/docs/_static/jquery.js b/docs/_static/jquery.js index 7e32910..644d35e 100644 --- a/docs/_static/jquery.js +++ b/docs/_static/jquery.js @@ -1,10365 +1,4 @@ -/*! - * jQuery JavaScript Library v3.3.1-dfsg - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2019-04-19T06:52Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. - - -var arr = []; - -var document = window.document; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var concat = arr.concat; - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - -var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - return typeof obj === "function" && typeof obj.nodeType !== "number"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - - - - var preservedScriptAttributes = { - type: true, - src: true, - noModule: true - }; - - function DOMEval( code, doc, node ) { - doc = doc || document; - - var i, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - if ( node[ i ] ) { - script[ i ] = node[ i ]; - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; -} -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.3.1", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }, - - // Support: Android <=4.0 only - // Make sure we trim BOM and NBSP - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - - if ( copyIsArray ) { - copyIsArray = false; - clone = src && Array.isArray( src ) ? src : []; - - } else { - clone = src && jQuery.isPlainObject( src ) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - - /* eslint-disable no-unused-vars */ - // See https://github.com/eslint/eslint/issues/6125 - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a global context - globalEval: function( code ) { - DOMEval( code ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // Support: Android <=4.0 only - trim: function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.3 - * https://sizzlejs.com/ - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2016-08-08 - */ -(function( window ) { - -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + - "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox<24 - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - high < 0 ? - // BMP codepoint - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - disabledAncestor = addCombinator( - function( elem ) { - return elem.disabled === true && ("form" in elem || "label" in elem); - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { - - // ID selector - if ( (m = match[1]) ) { - - // Document context - if ( nodeType === 9 ) { - if ( (elem = context.getElementById( m )) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && (elem = newContext.getElementById( m )) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( (m = match[3]) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !compilerCache[ selector + " " ] && - (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - - if ( nodeType !== 1 ) { - newContext = context; - newSelector = selector; - - // qSA looks outside Element context, which is not what we want - // Thanks to Andrew Dupont for this workaround technique - // Support: IE <=8 - // Exclude object elements - } else if ( context.nodeName.toLowerCase() !== "object" ) { - - // Capture the context ID, setting it first if necessary - if ( (nid = context.getAttribute( "id" )) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", (nid = expando) ); - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[i] = "#" + nid + " " + toSelector( groups[i] ); - } - newSelector = groups.join( "," ); - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key + " " ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement("fieldset"); - - try { - return !!fn( el ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - disabledAncestor( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9-11, Edge - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - if ( preferredDoc !== document && - (subWindow = document.defaultView) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert(function( el ) { - el.className = "i"; - return !el.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( el ) { - el.appendChild( document.createComment("") ); - return !el.getElementsByTagName("*").length; - }); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - }); - - // ID filter and find - if ( support.getById ) { - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute("id") === attrId; - }; - }; - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode("id"); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( (elem = elems[i++]) ) { - node = elem.getAttributeNode("id"); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( (elem = results[i++]) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( el ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll("[msallowcapture^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push("~="); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push(".#.+[+~]"); - } - }); - - assert(function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement("input"); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll("[name=d]").length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll(":enabled").length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll(":disabled").length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( el ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { - return -1; - } - if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - return a === document ? -1 : - b === document ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - if ( support.matchesSelector && documentIsHTML && - !compilerCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch (e) {} - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return (sel + "").replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - while ( (node = elem[i++]) ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[6] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] ) { - match[2] = match[4] || match[5] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - // Use previously-cached element index if available - if ( useCache ) { - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - // Don't keep the element (issue #299) - input[0] = null; - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( (tokens = []) ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( (oldCache = uniqueCache[ key ]) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return (newCache[ 2 ] = oldCache[ 2 ]); - } else { - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), - len = elems.length; - - if ( outermost ) { - outermostContext = context === document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - if ( !context && elem.ownerDocument !== document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context || document, xml) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( (selector = compiled.selector || selector) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( el ) { - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; -}); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute("href") === "#" ; -}) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( el ) { - return el.getAttribute("disabled") == null; -}) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - null; - } - }); -} - -return Sizzle; - -})( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -}; -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( nodeName( elem, "iframe" ) ) { - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - jQuery.contains( elem.ownerDocument, elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - -var swap = function( elem, options, callback, args ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.apply( elem, args || [] ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); - -var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // Support: IE <=9 only - option: [ 1, "" ], - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] -}; - -// Support: IE <=9 only -wrapMap.optgroup = wrapMap.option; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, contains, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; -} )(); -var documentElement = document.documentElement; - - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 only -// See #13393 for more info -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = {}; - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - // Make a writable jQuery.Event from the native event object - var event = jQuery.event.fix( nativeEvent ); - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or 2) have namespace(s) - // a subset or equal to those in the bound event (both can have no namespace). - if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - this.focus(); - return false; - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function( event ) { - return nodeName( event.target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } -}, jQuery.event.addProp ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - /* eslint-disable max-len */ - - // See https://github.com/eslint/eslint/issues/3229 - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, - - /* eslint-enable */ - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.access( src ); - pdataCur = dataPriv.set( dest, pdataOld ); - events = pdataOld.events; - - if ( events ) { - delete pdataCur.handle; - pdataCur.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = concat.apply( [], args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl ) { - jQuery._evalUrl( node.src ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), doc, node ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html.replace( rxhtmlTag, "<$1>" ); - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = jQuery.contains( elem.ownerDocument, elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - div.style.position = "absolute"; - scrollboxSizeVal = div.offsetWidth === 36 || "absolute"; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }, - - cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style; - -// Return a css property mapped to a potentially vendor prefixed property -function vendorPropName( name ) { - - // Shortcut for names that are not vendor prefixed - if ( name in emptyStyle ) { - return name; - } - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a property mapped along what jQuery.cssProps suggests or to -// a vendor prefixed property. -function finalPropName( name ) { - var ret = jQuery.cssProps[ name ]; - if ( !ret ) { - ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; - } - return ret; -} - -function setPositiveNumber( elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - ) ); - } - - return delta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - val = curCSS( elem, dimension, styles ), - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox; - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - // Check for style in case a browser which returns unreliable values - // for getComputedStyle silently falls back to the reliable elem.style - valueIsBorderBox = valueIsBorderBox && - ( support.boxSizingReliable() || val === elem.style[ dimension ] ); - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - if ( val === "auto" || - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) { - - val = elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ]; - - // offsetWidth/offsetHeight provide border-box values - valueIsBorderBox = true; - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - if ( type === "number" ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra && boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ); - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && support.scrollboxSize() === styles.position ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && - ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || - jQuery.cssHooks[ tween.prop ] ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue && type !== false ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -support.focusin = "onfocusin" in window; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - var doc = this.ownerDocument || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = Date.now(); - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; - } - } - match = responseHeaders[ key.toLowerCase() ]; - } - return match == null ? null : match; - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - - -jQuery._evalUrl = function( url ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - "throws": true - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain requests - if ( s.crossDomain ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( "