From 40b8e10d8e60004dd1ce75046574cdf9205d0f78 Mon Sep 17 00:00:00 2001 From: Phuoc Cao Date: Wed, 29 Jul 2026 15:27:19 +0200 Subject: [PATCH] add lightbox gallery --- tcs_site.sqlite | Bin 6631424 -> 6631424 bytes tcs_site/.DS_Store | Bin 10244 -> 10244 bytes tcs_site/static/.DS_Store | Bin 10244 -> 10244 bytes .../home/{home_art.jpg => home_artworks.jpg} | Bin .../static/img/home/home_friends_artworks.jpg | Bin 0 -> 166922 bytes .../static/img/home/home_tcs_artworks.jpg | Bin 0 -> 26234 bytes tcs_site/static/lightbox2/css/lightbox.css | 199 + .../static/lightbox2/css/lightbox.min.css | 1 + tcs_site/static/lightbox2/images/close.png | Bin 0 -> 280 bytes tcs_site/static/lightbox2/images/loading.gif | Bin 0 -> 8476 bytes tcs_site/static/lightbox2/images/next.png | Bin 0 -> 1350 bytes tcs_site/static/lightbox2/images/prev.png | Bin 0 -> 1360 bytes .../lightbox2/js/lightbox-plus-jquery.js | 11443 ++++++++++++++++ .../lightbox2/js/lightbox-plus-jquery.min.js | 1 + .../js/lightbox-plus-jquery.min.js.map | 1 + .../lightbox2/js/lightbox-plus-jquery.min.map | 1 + tcs_site/static/lightbox2/js/lightbox.js | 727 + tcs_site/static/lightbox2/js/lightbox.min.js | 1 + .../static/lightbox2/js/lightbox.min.js.map | 1 + tcs_site/static/lightbox2/js/lightbox.min.map | 1 + tcs_site/static/theme.css | 14 +- tcs_site/templates/home.jinja2 | 57 +- tcs_site/templates/layout.jinja2 | 10 +- 23 files changed, 12427 insertions(+), 30 deletions(-) rename tcs_site/static/img/home/{home_art.jpg => home_artworks.jpg} (100%) create mode 100644 tcs_site/static/img/home/home_friends_artworks.jpg create mode 100644 tcs_site/static/img/home/home_tcs_artworks.jpg create mode 100644 tcs_site/static/lightbox2/css/lightbox.css create mode 100644 tcs_site/static/lightbox2/css/lightbox.min.css create mode 100644 tcs_site/static/lightbox2/images/close.png create mode 100644 tcs_site/static/lightbox2/images/loading.gif create mode 100644 tcs_site/static/lightbox2/images/next.png create mode 100644 tcs_site/static/lightbox2/images/prev.png create mode 100644 tcs_site/static/lightbox2/js/lightbox-plus-jquery.js create mode 100644 tcs_site/static/lightbox2/js/lightbox-plus-jquery.min.js create mode 100644 tcs_site/static/lightbox2/js/lightbox-plus-jquery.min.js.map create mode 100644 tcs_site/static/lightbox2/js/lightbox-plus-jquery.min.map create mode 100644 tcs_site/static/lightbox2/js/lightbox.js create mode 100644 tcs_site/static/lightbox2/js/lightbox.min.js create mode 100644 tcs_site/static/lightbox2/js/lightbox.min.js.map create mode 100644 tcs_site/static/lightbox2/js/lightbox.min.map diff --git a/tcs_site.sqlite b/tcs_site.sqlite index ddd7ec1a7e5412426aa6ea59aeca9d9882886c54..179266ce69d38e654930c80377ba818e9a0eb35b 100644 GIT binary patch delta 56045 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 Wc|^fWgGI6ZvyYwf?Bm9;75@g_`v{}} diff --git a/tcs_site/.DS_Store b/tcs_site/.DS_Store index 6b80a7f404d3ddce6d96c89e62f56027d6a73d22..348d13a6ed829998a7f03e7bef095a4d3ac577f1 100644 GIT binary patch delta 33 mcmZn(XbIRbM?l2L!azsC*utz&=AD7*t|g?L>vI8QVB`` delta 16 XcmZn(XbIRbM_{tMxclbE0*c}QIUWWZ diff --git a/tcs_site/static/.DS_Store b/tcs_site/static/.DS_Store index 8af407cdd14294fea90729e6da0f2c9d0833507a..cb7aefe5c20639eb413f13b042a11ec9e4f1a223 100644 GIT binary patch delta 1487 zcmb7^T}&KR6vxkhpm1m8<1S?v2D=4|Al-$s1qxfJ7R1uh7QsU0qbTmOBaB^Umz`lj z3E9?SViUjWnwn^+(fZm(B=TT~Xe=T7CXV$qlUENI#q11p)uH;Sw+k4 z-L(~s!C?A=t1-AqLexxlIy;r6hT~D)v;u)^kg~G3Xe5pZO-b~ zpV89OMXjkkw|7UiKd`5D|3lq9kF4hx6mnOQqKxPf&9L+*buDpxR*zVd!y$8AGa|Y% zF__d%Jsi~rjL?+Emt=X}Q&O6*mZ{rry}3Pu@k%x{6V|6^bnEGLUQn2?l&km1`~x{4S>c&QDgVMx! zL_Qu3g|(b8hbqR@uMNr z>Wyp0t+u+$mT0Qq3RyEI|B5kI+3pjj5X0VGxw1XrNMfYYE^4PkG)fx9 z=?uLh-QHwe>BZyYCVIL0QAi8a^ z19%ie7{&<31=R^mLKjpm%pi%>h=6;>hWip;#yPx-*RX`Q@HXDTMH}<`SaJCLjqUJ% dvEd`3H=&kZE4{dqTk(7Lirf8-Wd9xS`wRZ)UAzDQ delta 417 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
>~QUzI8qD*GCY#TV`>0~X3;nh^Qts1!-M71c< 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 literal 0 HcmV?d00001 diff --git a/tcs_site/static/img/home/home_tcs_artworks.jpg b/tcs_site/static/img/home/home_tcs_artworks.jpg new file mode 100644 index 0000000000000000000000000000000000000000..423ccae75ca9fef36a0e1f6a4d547164e0eacd2d GIT binary patch literal 26234 zcmbTdbx<5#^esBL1PK+!6CtAa3>7zF2UVpaCeu-_q(s& zt9pOEdr#MNb#?bloi(R>owL^7`*r?x9q?XOQbrO02L}May={QkC4e{p2>}ri5drCK zhlGTLjDmrR^4755y+gym!N$eK!N$SC`#?sBhfhL)gF{3`L_$su1Oo90scESxXvrvm z6#xAQ+}l@CkWsKuQL!lSaqubrx7%w600$M02c7`|jv4@u1BZYE_u2yhzV#Cc?tdEK z|88*b2#9aJL`6e?_jUvHJpdjK0RjH4|8D@^?)H7V4nV{~!lhytL&j4!M4@)X=Lm?) zL8bXx-ASM_aYoB&lJp&^X7dOurUOs;DZxWJH(lWBDYU&!AT0gXn zO-#+qEiA2^U0mJVJv_aFfX!hc1?CnP2%r~Lktnwtm7FDNW3E~)uj3$3efXl&~0 z?&TJ( zoHtzXZ^MF!@*gfZc=xvt0uCY)6+1Gnm@h|lSZML zg|bfHfBUR!Rwq3WO|14|)B($y@k!O*7Q$2MYUq|sy}oq%wM_jcw3B!rd|g;;5al2? zcKAY|_%&KFz?6=oxDu;%Fd!6rTQ23d7%YPB1H`Ftz=d@!MmUcpisRg)`^>r-J0vVng#YGMk@PKbp($*2VDpigRNI6p z%&=B@u3%b-pTFyxG-R3isZ!43_c9R+helj<^3@NWb3Z|-dV?3La zb2<-}gXIroNCYw#tRKqznJ@bj2b*ZIA<>xNgKAxXBVcI#{6Q_E1#gT#KmncaUQR8% z#k}5*0oupLxXg>Nuc+MrkMR)bJk=^UjYrz?g!B>~P=2tbb535sPP`yHf?KV$-mm*(OP(If)UN?Uq@6fV#SM%Ri15o0zZqQfo-n$>^TGC22zZ6BnDFNE znf*Ijk!T~bD;;$5WgYwRL&Q>r*WC(^4d+o2k*)+)*4N*Q0A=0a$T?3HlmPu!M#Rwz zhz73!e!WIwM3q>$&c|tt-B<>AMtl@W<^cmHgBG}C!RuUCVPz&^gN_I{j(`9f@bnR) z39dXd!~Vt7iq%($^P#i{xdb6R&Cum+EIbOq$EnpQw`^pj^_y&@ffMJ{Bu^NAn&hM+ z{t;EiAf%rdp`DvjvR}5+-P_zU$ki38DKpbJWaTP%4<%5#^C}-k(O+(`ayQ)lq5aU+ zf&*?q-+LDGwpZkx&bCqfCX8ILVT`MSIb#X*)uNKQ>8>HV`G|yIxd)-P=@oEYRD2W8 zGR7GWKjfIyYav0aB>vdfDTrNZs0JgKxhk#8+ZIyrZSvCmhULit*GlBivC{hR3W!!c zo8Y(;Pzrv^=Pn`&noo)a$+qEffCz_X6uSa`cI#7ju54Smfw7;^#h$Io%?O+Lo)smg zRev@$b&Xg%m0s9w%YtX7Ef&3W=DYDHN)zH2_bBzXBIB@=yroVW<5T~g1^(&|8EhsPQQCsT-CO~m3P6~0{fRQ6Tj z2=BHOI?7M&5Ig~|t?Oc9XC^7|)2zmU-c>bg8EVFRW76t?{(NU3Zi}Mj#t5}_m_UZ) zS1h@72PD^el%YDKMw?GZaML#gm!Q6KGw&E&`GTxJhV@AJWU)t1Alac-b%iwZ;>7ir zzj_i!j@ok(PckL?GMnwd6~9R=2~lfyogc?2LQj zj#ImB)-Z7MR!)xL#K_ZjAcZclS_SpUsi1N}5^3(M2SO(A6O#yLE?q@z5gQV8;1w`% ztX#<*>y&0-95mI+s4t0ZB_BjYbLv_MKt{bTZ5WslrM)er?A%I?m2{`r3B@0zS>#Ng zj_kaCvaIXidUVW6tFR{Qxg~tBrRT{}BaN&EZndOUAK9UD?Bn29i|kDnq8gyAE6ALf(ZAT z>Ee}lU6gqPRf%v>y99P31b2TVO~yB4-52Okbq7xR6e$hHH7Rk%S{>u=hE))5S4kUa zo|B6=&;Oyo`_d=}-%@B;RBKA<4D>mEPfS|+oYVQB$E7hRXcoP&EDwUyRgO^N8+M_h=ijILRK8P+uoX9)=!p6II;;Qj zxG&lKj6k2Rh8vY2^NV08=KDlIbJhl#>Zn$Lv;!N&S+wtRGD))l%d%He2w94+FfQsn zn>U%V0m*Pcyc7XR%vD(b+4v+ine0#tEP1o|6=12=H#+7He+kxAnj)Xbo+lRC&nw)} zy7Y*V3KOWzqkm3F%@K)qNqPmSng8+MtERAANcacN1McECB6=A$?3_bJ*Y+MTmxE>k z2uM95d#22f9$1tf?t`bcf&2oR0-N?q*pBkyCs8=l5$k3x=TTdwx{HgI^&&$h+@Wpv zk5b_ul@zH^WZg`h^Clsw+(5zb68`OK_4ZmD_b(5+h@ZX~{*BtL+}1ax4~rXo)X4W{ z7cS!~KgF_4PEP$$Q$=GK&vDdGe@c-EeV380(#yo$&){ma9#bv@A7&i4TIIv@gX?#P z5nKQLoLFI2hJ$l}LU-e*E)LR@DcMS~h8VBvFRQ{(3M@$rVj_g8)Ew`Pa?+m-4gAn} zU7|!LTxsT5FF*ByY71rs%f4EwvX`pb&dkzhObg~t-H z$WR1}u!-{kvYPs##N)!im~4^10hwc_wd6FssLQ-fnj?J0tbQ~gCe&^vjPMy6<@m3Y z__X`LBRkG3$rX1{J~K)g*wot-)4I_*YU5;U&DpEYEf#k)qUuaVwEYU7&MYif?~_3l zyu6tBuvQ;u`!!cBKvO)&&-)6vAE<{x}u{rSxeXXzDC8F4?{v#7G{BQpnSR3Sz` zGU6rHXWqA-9~S+yr&;KAh8^Q}>!ndjQEhu6?ui{I5B8!JJT{C!D z$9&HrYCZk~8)sm2GP(0&ZCTl@4v3Wwn-XarU=t!K2g05@644+dbx9YCs1npewvRR%DU`hrG();m9K@4 zJ^P0OK#38BC7}SoOur&nF&=6V&6#HB(08WfT=%zDKzo;3&k&vY`A+4*5h47z z1I~nF8SqYeb`W^wP#%@6#FIL;JLph>vbX?Oh6}Kydk+(a2EaZi6Zabco~?6&3DU{j z_qFu70a6YSA4rf4Tn3Cit=XyYMR(&BFmC;6q8`wa1=5~9H?c@@TL+D$i#%XDyBkS{ zZj?hVcGT`^U-k!f$scB8=SROUMKS6%0(J{!t4aVcs8hsZkA=ExuoH){N5F_?mhSA; zp4OmHVt}UOYOv#px4QPwk#2wXx3+%a8K-4jl+{}p_ho3|qx7O>YI>b@fw*5ac{vNN zKjhK8T)XDE$Va4w_=L z_^5ElkaTI|%FyZ%6tP!3wkWdE+Y?dl?n%nthw(9`R?U z2)c}W8X!-k>qw-WKKMzw@a|X25&N<&yJz!OjKxwqf*zYGnd9u=#4_GIVwXc9VcR+- z7HL)5Po6s|L`3~G#n+|o%cCO8FHksy)S$0|>_j((4D|8+`Fst;*;vyS><2->*&J8e zGu~1vKk?L%%RmNW3AaIBm_?p_`}PQ50*2#c2nz4MJSB&qgn4OQihGgeL+aAKtgO^F zJTC>bTl*DYzgGVs*~nyGYaMf_pH*byVXpd9daM8WQkO8y?cPf3GGK(?>Qt3+IexBd z^U$)nwK@HPn75orkSe$E-)w>S%XIK;QdIUA1Hc&hv(;Hv&Ti(+#86zyzpmgQanKn|Ip32N?7GWdD)<9lY&p6^DbhzL|v za(*ayQe6MjdlIikxFxZDddX^DdOG~H+n-W?DYkI~0M~raElm9w5w$vS2w7}rAH^2e zykZd!DMuJPQ7wGzf3p5Cv?=$@B=ARxDw(ZUZ3{ui4?o5(rZk7|AG(uYZQ&MenTV+K z4c#li<4rXjxCC#RXEG<9ogvR--^5&2{FNadtAh07_P`QG*swVFRpkGL9m)$S<})W! z8wAAYUmMFK{7czupUv*WKiA-T`Iz-~oO49e$L)%s(MTk6n07yBZE9+^ND+Q&YEN5g zCTt$gj&S~D4L%1fl<9kaUmI;j?!@=dk+ORc)qPaU;b;(}Aiz;GkIu8d$SrVy-@3t9 zN4;OA8dan`*XH@j*ta^P42OZnI$O(%e>%!s@{y&S12OT;;w(O<#$#XLIq<_%p=|2@ z&k-0@pv!UF$0GwAPv(ae_Mn;~>VFu*GKB9Sx|5IErnL+Zp2p`Onl}$2o8IIcfPriC za#-VaqTsGJEBljUQggFDO)W{n`$n^`g${na&yBjNfL4!cHn)a-pW2!JEF0Vzjxb^=IWYdq z2(c`@0*yQz(J!JU@84288^xi0&Xyc!qqQLBu z)|qhWuMmnqJ2{gyY)h7wOM{KDLw1qb0t`0;GK|SZ%&Y|~ujkD5SHPB-7SxhPv)Th* zN;Zj&w}19GKbF<^5P*9*i|qTLOwR&dn(Q42Y1qfuW5MYFGOKSz_nXx|PH3TG;~YUc zCWeW#nqYP9HLGH(_+bB@^GKr?0BCmzxUI!BG}>`_@d{9WA*hF`h}7l)uePx-%6PHp z2m9Eyrxu6@KHKj6r5r#RefPPl^4)VDv|ORTyXwdM37E7|y79Mb$6kB1w_E8Z9-6#> zLbdmTiD0rm;dup0Uz1A;4@+uWmM!aF>37{=HIVnALhg=+7@?WZuY|aOSOqvf+RSUa zzP_6qF@pTsTP(*5>SU38-yiESA^Pu{)0Ao(Cyh9l8RF*~X(drRg?t@AB-e^)cckCW zD&k`owSI7&BgxQ(vfuulOWkoyy8fd2{Vqu5OeBh{Xx(}Z`=|I#2qy4E@gFmjwZNl_ z{7mg^j|&HtzV%hZlDVv;Xna%M@!11(;gy-~ChhPCZJ5(fG9UA} zRM3vzf9%eTnmKyl?);McbZtuDa&qd-NH@Okitu=xS21>|BrSP?B=7x3s~%TT!0A^& z$XCZCSn{4Fja=ZFvjWk;PAUX1!b3ka8d;jNE-wMD#B@tdCFZ9#iW71N?Rx5W3@_EC zouQx+E}sR%fdax0$Icro5>g(J|0epeCrmPTLXFvrP(~U+$20bwW={Q6z~``^EA1~q z`p##s00hmNvD^QyOojgX%V_8L6W_Jf`|Ym-!?({5AZ!5P6wW)8^Vp=RS3h#DHV@BOLv_hUsi8Qro85dwv7g;$mKL zryOB(lQ5}lEh&oW002T(tcLAua6E7&kj+m!b*cBk=Mpt^oAN^TjM;C#tV5<#a?7ZI zGwQ~)Sl-TYByT9XP7mUSz*qJ->|SrCiC`#bo_bQT&h)sHvnQp!?b`W=?Bujp2pnPi zH*bOf`Iik`$2@cHS?8L02_qS)C`fy!R@g<7PcU$2?;h(sh~=yYPAs&O!sjrOUfG zHCd)FwVkt&zpntTSAf{FC7Ymk&v3NU9caqz#dS>!_JSisMsbe4tt%BNDJbsy3eeMT zP9s>^z@)sQ=6+F&pHG%x;AK9Q5Y{!xva8i7kpH_oty_oXr4f=zB8rl){!7fht5Umw z7AQMQ%U)kvr{b7wmzaqmsnbsKb&ZoJfRXpcw3ION7yPj**iw+F{aol=*7)?!Z&&1Y zC~IGxExgVO!puj*B$8yoLY3w=u6A8=gM-Gh0a8>U822W$Vdg zQF-&FWoW_vXI5(a_4d>u1>IG76n3IQ?21u5XPW8b#O}s|u+(I3#LzLCRzeBtX~%$z zdK$6_uf^z96Faq_j$C0qw8Pa3rcVfr>(ha5%w_R3SwepL|M;g5x8l*v47@X;pOfOC zRgThzDjfVbkV$J5=t>mMS7}oWp?w5%_Y`7`)`3wWt7*}aV4CxM9P(WRlveYj@zX6S zdmP6{>%U zVvU3$8U^#1`20xb^~1L6@!u+wmgIor>>t~GDlJK1ZGiC+9WJA9ztHLYX?yPh78-zP zwfqsPGYmU`j_<2H7k-CkDEREr_^vhr5+0^>YP?Z@U6OYvs4Nw8Sb|ZWnibgJUN-_b z0aJm$$s(+JF{k?w_lR{6Y_le%Cz_w5L!-0slc?%4i3%1LqcmN3pXVE!lX3iT9;dKG z?d&Lg1q^?kKVU@p?p6%Xs1`64uv+tErFf$iTfvb#Z8U*uo{!! zIZ+3Qc%Xbf)Ln}vhD>EHyaHyIu~~&77a;USlWCbtmfF9ZRqI3RNDtGtkRjTLn^yqt zGLtQ`NaK6@s#158-isQc4|vukmMU^Ih@Al)2Tm>K=L9SJcF8xB3(Erp1&Oxw1!5Jl z5A)v}e?@S7+!DGqr<@@Yrn+MrA>;4+OOUbk$vBnpacHx;q`Wv^$VEu9>tNfif+|iq zhYqYrUG?;XrW}F}$1D(wEWqllP2U>>Z$%PlxoFmkrz^dx{R^1@>^OI*O~Es5kkS*Y zB}Qpd`%7%z=^f4}6C;#yPi-nZ6RE9zXyI6vXaa7TcSLMg32YkQwMDk(xXr)qCKeCKmnRnMe~!QN zMDF%p0qDLHYSEAr6uwdl=4jA{;GdyP+t}Sp;AD~2l&6M@aSBcAHy{)LY#nb5@D6Ot zG(%G>;dw$jtRz)#SkZK@J^W$(yEK}Qb80n=l6EF1LacE^@5w8*vnfy}yU9hPQ@%m@ zQ2!IPowMDpDSjS)nWAYa{^XW>2>OTnG_p*uIped#AC@~jxc`9BLo&zvy4>;dmK(pQ zEz}07i0EVa4z=~)MYH-yS#@A$!>|5%(D6aV@=56fQgm788bnX@pPSXgHy^tAARPD#zG3y7+d)jbCZWZrKH2 zIy~a3I?t97$e!bOVKGp1vpxVo>vZU>P)=?6FU~cgMNr*e7I;c{E$wP{@Wgeu`+mYL=wmxkwR7(q&$2^Hvvn4?JpS zk7E4ge6NwB^5!&NZOTy;`j;#lr-q(ftPT-2G-nt`^LY|&NQnEoB0=y*1cD>*&7IT9 z;1VM4VZA?zYFovX&yfI#jmbZj)5<=tV zL5`cEdGyFdBH-EuZj-62-IsB6snm0vI&MB<+Q%r(fi{M_$W2VMVTJ0}MoGOd)F|P$ zCRFe+nu@P6qm8G>OH*zaI)ii#zu_2g-xI~;TNO#Ao`~;U2;ZHpMY@!m(n!F2UyXGs;hi>;EZOL4<~#Qc6n!_tN{u4QmCmDB%x#sv8ld17f`x8m>MHC-Lh{GGV- zo%1UoCxS*vh6sj#O_>Id@ACFUot4qHZds4lNsR=IPx(`Nk4s9T>?*=0%i;jE<|4AX zJ}oK%7w2~>S;~{KIJ~@r#AR>e5AT9Hs#8n=fguPTWJRdG#g2t8ZVV+l)7`-xdipHR zFJXk&Z{#yDk;`$QEZIR|oS^+82smU1Z%%$b{Gm;1Gh@gHb11hwirTW_E`HvE_!oI1 z7r|R*L zQZCov^gaH>Sp)8&#l||LdD5FFNao5RtehID{TxB2RPVIW@*STDyE#hw!`!4F>DkFE z0BSMYRFTgUZ}M+a{?m^%psQlx-Q2%d!28;J7a+v}&o~}#w^J9P;z>}ilVYky0zZ|h zN6rgPZ9ViH;bVeef+QU>Bd!nx*U3RB+Lv`bG~?r6!m?xb+5xkJC-=%sVd4eF(!1PQ zLQHDr6Pxt839tN?x-UGMB|5i18HEC2sk0IFE#?}>5U;}SKOdAgk^49;I7AS%DTsmR z+_n9;ozK?qHawBBarkR$(j+Kj?g;PRR+lEPfM5C5{cvFy`LhyIx%`K5FKJZ&GqbFS z6`v5^p7^SRD(|Mn>#Q_-mzAf^^2uQM1c*)oD%t(`p}&krnfS1IZ;KPaOnijtn*m7! z#0CC*#X7TT>1L4u+_^6&j&BBI&s>U!An;C_RWZKbmA_b zKs)+~5B)ddp#zQ0lcNDK+E_UF>@?Yi`l>Vs`_-yZ2{(PB&=r@zf&*xuYA(v zLWez)iELY>%$=zjH2T)8<}i^)zwe&R?;n$YH&jF+2-@^krZtlwVp^U}m2cir1$#|v zH~gSX#Jj}NPfv;}9v%Cd8TEK%%);SGFms0qnmpB*oM4~b zLs7Cz1sWE=+HAE{xWmaT`NzzT3S_L*@4R8IdK_YCUGKVr`O0ZRg&CFq%xOI;Am z?$-+(P&Tc9pZ~Ld1)#A`2$w#ExMI#MOJKv74hv$xM=m9U8%^z+O_NLc$dJ}x(M|NtK}V7 zPrI!aW#aU$qVL%X?l9r*O060mZ}2K#zFNg!A^#$}D)bQn_~=chH0yj9Iq%CY=njRs z(9ui(RlN-sg}WMfNwWLuzh2#6u0DZEV%oqu@D+Q<3YKk3L#~M5UA!&=MF}?zT_k0e z`yH0RE(4RK3O70MZJHaY66d<;C9_OUda4Du(gR`oG3WaQEq7V&g`Kn)x$@i8RrdkB zyia3?YJ%>C!U49%Bswf#;(k&2d}gjk5IJ?-X;v4uSa^R>RNM5IvnLa+b)t4jUUYR{ zzx-c0c9K1>r-}q1$%HJTJTH8yYn4(JzBY1;qmEB;)i`D>wRB?wWLv6zz=K_5p({s< z(_n`p_-t(ondN4+)=ZV>(}$@>|CvQSgIgwL5~`L_PMGbLb(?68o^`P{JNp<{@wFsg z#+AD)qP5Gv}CkuOeQ2)zio15wH`W9e{qx&V~?EKU#tyYRN z6}6MjW;WH90{o{b*hXtVUKg}o2*RZPB>&l~Mq+7ygh7Q*$bvR5K^BcV7Q->_P+jnA zZMnK?#Ma~9 z{~U{r^TxvQUXy><@9X+|CrDJpWahxAPRiCfMH)|U^0~M?eKLxCtH(1Ft5p~CFGQwc zN6ZeQPyEhWO=d}S`9~?jUdx;^JBZ0_8k}Q_qqP+#ZD|I{J8WuEJ}nv%+BOmiES>fQ z>0cM|=dt+o@w0wz>)W44Zj|ZMghtS z=L1Jj0o>vJoZLo8U%CA<=(-ej<>NvjM^p9eGH^{qq>Bkp^}Avg{kSRzXM~*55!z%r z|CB~1;|E!$FMxQ?AeGOu)^N?M{*;th_XSZ?)yHyCDphz|*PyPJDT%0xwzj#SkKA5* zSsG8w{!=t)I+tu5@6|vDV{Xs1C)zW}}e$tBF#+{M&$?@_rfM8{+;Z9|>PR z@_fe7i)KO(xoR$>KR?E_-KT)A_b$lrQfK07DD&3Q$uJ-H1&UJNvX zzPo_clVdTTB6^E4*)kTsjPX+0fynNMz+s|LbviM!uvml)3L6d3%OS8#2JE1~i9^a!D{YzpfMIf|xbigpCLq zFqL{{x8Gq}y#2m?UMC_&yQ~Pt{%u`eO9cIy@3d$X1N{g3Wy)Jovkc0uocv`I8vgbe zXGADmH59YxI`#?+m%kiyMPV_Xg9{h)<2}Q`Z=SDd6UqcA_HFgGUuz*T7Ra?tLq+t3 z;-7We`73~err}ooMZM8r&hqSL;VAqvSpn`uuscqcWd2X>OtXU+=8_OoQ{}L~z|3#w_{NSgf)YGdJ-BTQ3~X6NxR=w- zlPE7UG^rQf>BsCHB>Eg~!eE)7ktA?rm^B#B>g|0IS?^Ho#B<@f2IMf}nt`_y>Iq~?_plD41_h6Gt-Z6gvGp5sWyH?1|_G8miRTEFpEf^V?~y(>2^a_=(-oz z2hJ`c`@hfP77MKISbpl-&m;Zm}g_GGXi z?6giytR#J_UA;EPHIy2j_!Par>n}fM0ayEd)FxsQBkHS}dMcbrw$=#>7%`m-kIArW zv1dSi5L3+ethWwUykie`Sts=<*V@}}wwD(P0zw<3q<4hmE|kwniaYOpUYyKQgmUj^ zD^adXrGs^z0A4;OWRP|i89Mla%F&cNhn6J>5j@T9`1fBM^$=mt>Dq_!0Pq^C^Qxl~ zYQ>vtdL~g7cpb1V_zZTszvpa=3) zU7ly=as=r(i_?a*Aad_JuoH7pOb1WE-L$>qep9|MV%;dx@!Srhl>k|b51SBnWw~qH z`!v6D`0CExdsV3bR_UFWBjbGyn-(havOz(T@=e(&^s4@R%sn)L44dDad@wTSH)sD+ zX`!D*DZtTTYB*jl36M3EfBM6PhYSf}GHTpwl336uBKl!E?u?1gYnG=c`Q=4&zCD3F$0!WRLOI`n#P?O+!XBG#L=*veP;d1EU8zy zpEGl=Gx)sURj^|$4YPw{}U%(ugVe3IH{@fmQE!DrTJN(^vk#m}4 z_73Dkd;Xm{vzY#(V692k-Rvf#ck5*`eNGeQebG&Yrh&2t^{Bf*trJE;_sdeq>oCqx^o7fc3;@ebaqWpY*Vj-Z-Oc9vzCv zZ?xCzCm4B>1fHu5czasM9rj89f0Y}YrE4og<2{qo+$rG(DPN!@kTTlljHJKx@%ge< z{Y1G9AO0A08uPiaw*N9r z6#Gx|J+1?xa0_s#vNH<2duN^dQDXo6Mik3y280>gj`zgtJSz#*$JF^FR(nlULh?a# zQ!`ZS>QNE}7WZs9eWxYmG#i_Dv;{Yisr(9vslU@mM8O=>&WHH4TPPg5vc07RMr+;_ zJIE9ePNy4S4)NpZJHkNl`$tX#tTV#T|t-t^QD>B`WGYga6dfB zF_{N#zL>@EHjUeIAG(v|*9<^>&M7jVG%~gY=zZR z_@W29jqg(fr7j6i!IFHX?am*{KBh0JaQnn&e?mLfX2J)|ue+A%=p;sHD)ONnUScJA zEgB5B(k>H&Q3Xk)-K?FBzlZF${qjX!xf*d3bK;Oh6Jq|{bwi<7zi6iNF%g6Dh}oSu zHp-hlX{U6%Ok1y2H4!{p9YYXr9WtlIcoXM)c_+3-5LWSU@<9eXK9TXGT0}86JcTIn5+Up?kIZN z4`YH+jHD)t@yx@A z$$K`=ZZUSU5x0^n$G5RqvuHCD-(<#_{l|NT`}?axe}0C z`RBYR(v6)g`AJ+~yE9}d3oUBKSAbWGNY76wFve~Rt<O4`3Y?wmg4JUv6+HmCL1c z;yWA0N0Ed-GU6k?F}9f1U&r#RC_l86=zyFj;V$B)Jq%b23TjbzB+o3&`0$_rNHqH* zJo2?DbI&Iu#(}k$k{4DkhB3^+5hdPpUk-TR;FME)t0FK}=R(~9k`?8}O@(q9ntKZ%mIFuOp^ zw`m>q*1%${g)+}?Zr*@q#*=i0YPV)gOTf1AId@`K1FmMIAioS6LM(c$M|m`7Pg84@ zbnKcOk@9#wK~U^JhhZ_lyH14c3OQ#xj}oWQf6LR?BXTMN74{~HuK<@!5vJo8BzdZH z?n#6YYo#9VotCb(VnMP8P1iGbCGb)oLr4{UNUV4IxwgurRbOJk%D1gCr|H~Bi3Fx= z73m7TPR;pcfM>-hGFDl6ES7c5Tv&qFlLI!{ob8_j^*cM0LwEge;mvjNh2?s8rhca9 z8L6K&E)hU$^iRym=e-NyP2_>^#l^z!^-u186;Ronc%r=UzM0h8Gz^?`SD~PKU4*ey zzKSN1>vvZbstS|`b8-{Gjdn9L{cnrZ!>fGOxEdP#Gv34R4~ z3GyL!Dt()0F3j*-5y?j=Sx?_>+h`KvIdNYBOxxr^7}#R{lXZf6j%5dnwJD(aFV#6p zInskf6f?nRRzqtSNNrCvTsgUT7DP8)6Uu_xsX-YZZqK786t`q__=pgbU|0L961NR7 z8g2w!Y{jm^fEpC?YCX%}B%&Xnv^QnP3^sQ`8&ROK&6s~N=jGgQZ1-iCAjxFO$8p1b zO#Uky=rl)NBv^TQvU+IQ3YEY7xugFXYJXnN5STQ|$DL*x2P%OZ##GqyQ%N1KTWJX` zK#E0O*TTq9%MA9K zb4&ujD{^O4(zVP6uX~1bu#bY!KP(34{c}k9ut&G?4&L*@OZ`y5=lvZz9I2X1u{utN z5E=oC6@EsBD9Rq=7b8usjF@keyK<#kTe{{3%R)>?KF?Ee%kC8vW5+zzkz@Q?k^b{VELz1-|=a#s%`4Q_y$TIpGj=$Dw-UO17_l`cel> z6=pN_l)t2HfVxv>q_pFz*s*fhR;YB+WWas-s;XvbCC|bhw@UGZ$vB7cEr0|coA5c! zWUfTck#|t4Qb&|qfn(B^`C`VXWns=|ryr>AD}6{L;av4-R++P&lS4%)5#1pTd~;lm zS@*`SuYej*w5f1tr13Yri>VmIDFnwQFO4d=sI`9P~dU$x|e*9CQcd&u$wP4VVTEu#8|1i~FZX4=d!a1lflfNZZ zUR*78aU^XE8ZgvXI&Yvk3#$7Z1dSo|;jVw_sf$0cv!v6^%yzwYuU z*TI;{Ey)g*um7^bvtZk3^C(naz-1Y3H^!^Xguan}dU7E9ywQR}>!ACrpnSg24gDWK zNj1{H>UzPbU2>6Ubv>W#`(<`T_waQ)Vy-Kr`CDK>7CH1SJy>67{~>?sfP~SY5+ls{ zTU(L!@hbq!n%}QIPsb`%cb~hw3q?}(XKFiE3%l>;n++~rpq0l4`)4?fZS{JC-qD+A(2gELXk6e9VNUQcLRPbX8erI zk7t)(h^CEz;B$qasL4CfOyu&iGcl6#ImL%PYf19*fx{oOwi!RQiC+P~|0@RRAF&AO zQ4uY$WBtd~e3PaXeRrkI9L8ZNHm za9^W#o_q`Y)2tDP^S-(Pm}s0R)ceDJYEAsHO(mJ}S@z@#Sl@8_r!J-O#lSj9HvS6( zXXodDDJaKd61I~Y-B6Ez*u@r01*(BUvp?If|S+>X}4tvnFcquAvxZgXf~PH8BM z5QvU^nXSo=wHg|j{UO*^G~MRYUQ@YDczma_fVXTBmGRiwdsGCVe_=fQ`ZdG=ZcM&5 zIC??&Po5|(-@;?BZqOW5oCj3z@)mm=V{U(rhtMO$_GI$zE45S5PA0tk(R&3PB_-BN zhIa76-l`6PR%V@p#RzZ|iusll zFtg`Jb{18~$kOB)7id!LBv#JLWvvsls@r3dfLJ_8pYJ4Z`DsPPTBmV6T>1lB*jC5k z!%oZXk3l=H>h8YJM%S}(*~>qDvlJ$#a`S{B=Rhi7j32_Y)bYx9Gqihk8E3* zHrI|nT*{z%Tr7!1QDo0?!ZO}>QF)ttEF^}7lR?7jEV~L@p!mfVnmN`tX6Lo~ICn|r zbXyW-c54G>OBrQ~M3ocFKU6I8QhBhzIZ0s-5abEz&VILxpbR@B*jGx+SdvQ6X8JTRUkh0FmonCM|Mf?*-Ic<@3GD%=*Nun% zi_8`GfJYfjr_shF9gBS&i`n&@>|*}SCsMgpg$B-k1TPr(|Mp7eJv`R^P`Ms{O`71$ zz4?pu^nHfB8!31q3O4zty=Vk0N`Fhp#XM8~Y!TUE(_x^m$w{?EN$cm z4Jm2n5!Ls#^wmdfQhOxQ{}3FsqJkHNO_E`0S zfSH(lJ{KlL-~E;15}|zy1_v%OvsjhloyY*?qaaz6OH%r|RO`hkimW8v5tMTIFsHY& z;*?$3zJwlqfW!we=UvxjJYxHfsay;)lK^@8dae?;w>nJM`7Q2EMD4-Dh|Xz+75i_F zoqAtsvV7l)w8tev>tnBpD(p4+W?a%;2`93iJV9Nx@oqTvrWXfIdt_BJC!j0N7j9n& z3)V)&aE&R+TKJ6OQ}5eZ{zm3FJfOl=?1>c7<*s=`qH>gqB1^n9W)&qvH_mFFjBH6C z))&`egGKN}Hg@|-+|q19{nzokT~{cW%pY=ns)@g?`vHX}N}UF+Pf^stuU(efe)U*& zOi@#E@b-u3jHJk+v>-o1CMI4X)>L>4#3uNS434@ zvbn3LFt?Pe0upXl+|*ZvQg&GJjL^@%%}V{`ZNoJM-h9mCsLd&>Gh937LI|-Yanq$v z8B{KDl6j~tdyxH7L$7 zI#!nM1CWh_j+Cb)aZEgMp7iYJgGdJeG4Jb6QSVF{=h~c|1pr8c-kdSe9%+l$y*ywa zdO$lg?lDabo|F^Xiva%sdQfsROwSadusNjA5(A0>=Azxr8@Z#D2eBE)YL6iF#VLN> z>4zQq_MspWO`v4;_OBBCs%~`W@Xd{str@y|jKrjT#CONFds~dJw>>N4KidA^#nzt? zZ8d4#4xFQHme&3b{C`@?yjjQ$nxQ;JYNeot1|+m*iZi&$Jo1i+jZUBmLOQ&8~szdg&`NvuOG zulKT;9V@br0RTL4+NkQ6Z*MF?F^0}YDzsXO>T%EE{{Rw<=I+(A(-{>T=$~zGTW(NfcEwL;H`-jORRwzk%{0^MM=Lls(!5f*&8@lmJwYXpiB~z&RlnSE zUYgNw{s2CM6xN6Pqo1W$Di)`bTwC~n96p0_$M;Azlc-wi#~buZ<^KS-S^l-|2^U-n zQx*pBPZYUqJx`hSO)CAjgQwod&r<_`g>%<>9m{>?ku%qHOh2W4bYfnNp}wjOA7+WV z#~J#dqm=@=@wn0^M#C~3dgOmGTfPsolH0`kRNJEgZ(wd*XYZ|jNhX)4N=cH!*|_ft zpXpE^4d`zo$aH%!%5n&VXE~^GFPN1{{TmG?UE{mixc8M6LFvTo6Y*- zuQ&}8s`A@$ij)Os;HJ^IpSzlp+9@NsbGQUQGHp4*@0zV=bP=#s7>udi{3flcrsXJ3 z(mBU|D0`Zs#IiAb%Brp#B&oZy9M#m-9C&xjGPG=b zfTV3NjMRWKv}}^@_2;EkSwPH0m3992aaJv4JBw~w=e^HOB6*k>U8MWgg`Ainzl%SW zWQGpPiP2l;HK%9>(g#Yovnqz7mX(1~mK_)#D%?^_AI^`70LV3!Z@v%;vjy%d$D9Z% z`?7lbRU;WIoi>}OMR)*pRJcKgL*A~10G_x9lU#$4NM)C6_HOm9qH6`FTTAc(VT3-W zpEq+JPR86tH{%)4y;QuA4;N^P2mGB0;QbPm z)!GE~Iu&Ijk=mRX;BM#ImrZa9&_JN^l6p~K9uL22cJ2pS zi*O_mdJdGOxg(yQv{(rNZd>N$V-)h^J!&K%44i&+xz0}%SY*oIHxw4t`2O#&TOXHF2PV)#%j=q#wS09twjnxxAMoGZOHJjo+drR=r5OLHkzQ9iiw_w5(q4Fd8@ zEh-sxo2bDBqakAlKBujG&G9qGTF;O5nRQKGKmtV3!3rOeB|U)k_pdvY?_7pB&re=! zQU>9Wp2Txq^sv#6tmc(g*}r9Sg4QQiAQb_-J%ybGsGb1bCw+D&74OHrG{x|r3pa*1;r z?p9^UZ(NT`ZSR?PrbtLthdWRc)Q+`DSIUe=xWFBaeGWx~O-iJZ;paGq7Z^nPTfl#` zrkQbZ6^Dwn&#^W_n~QUp)xE*#UiG2tI&QUQmwHw77jU}eOil^>tMi8RZk(@0$T`Jr z_;18I=Z9`m=SJ1;tt4JX*$zJ{^{U`g_)j7jhPOXP7v>n)+4@#)tpu`36Gs~mxy^j> z@XPj*pU#6!@r|I7O9U6O92L)Y_OGQZXNKw+?yclmVU+`;smNe@SDR9cj*RSuMJ8AQ?fS_I-15XK-_n#R$9hrCIY9%OR|^eQ=A|8Z zrqDWOkw|z0Ii)8f6xB4Ud7uRxQAJ(puNbA& zo0&Ipn|tPUA1eY$KDDJ|zH3bMD0%J1Y7JR8MkE6zMo9LiSx8nPAnMJ5>57wEnvnp~ zD;4CNx3y(z3Lr+!xN>5!*ZtfZ0;Tc1aI3RJ_ zwJa?Sq$xC~a}a)9@+t1YCq^C459LS$F%7rB2D#y*XH9yp$rb|w;0`(OR^gBdA@dbV zmSs8b#b+sX$=jS7w{PXVKr?*6oDBD?lhEa+z2UcZsVcVhQd1Zs(xQ&UU;tYlp0#v3 zk;4;}8K=PDs3$5@Nl1iF8?;EArnG7+`^j>xo@&SDyo|2|a1Szziw?K^&ZYX+{Tn)sl(BDF9Gd zo)1ch5!#n6$E7Qka!~wmIi|C2{pam5!E$s0d(a(dwR_OFir z0Be7U6L^Eg4dGiE%IVrnfgCGwEV$(T7qxv|;(b~@8^fB8t22aKJ831!^$KzQEAyXM zyqfb;xxKh-%QUSc{aEu|SZZo=yE3aQDkX zmn{%(FvqQQCKy%XK3P&h-dm-4sCi>;@EoW)2D8t>Yv#&$I{+gN#MOsaPq{P?H!LSKZsY!j!)as6QBW&bzcuP zd%YjV`bE`@o>ao+dH(=qk0QA-RFt7}dUJ7S=zw9IjGA~o4lz|NWoCsPv6nzk;wo^> z#%soBVr0Xm0FrvtCGbZ)3RPedixqNgo@u$~CYY>namn-@OV7> zQrUKAsL9FC=}yQe8Rm;HB^-)Cc)_GX0QKUPTRfU9RmW$XQ-@lQKQX5R z#}t5Z$nAkw1~;D3cn7sD?PGX|RLQkx&&xX1DpmFIV%OP0r3cdckKM&5R_Vlp}z z1#@fS&ktE{L#xEgoZ|%ItlIoH@PtHXNojG(GEV3E*1fNS{3Q=C_u@6#s)$O!&* z>G781=WJr7Rp+l6`u_krUsrv>)aJ3~DgOWq2H@f^4M7;~=1imd)!Pj>;!rF^8a=k| zzGH^x@D=F80hb*9H7Or9KmZPaQ&bmHdG$CI(7bA+3 zNC7<}xBmd^*LVpa9&?{sco{wV=9;4b=VuKM!(=KA$B8vbJ$98`{{T9&pA9rD542rs zvw{8VlU|4?qXju0PO_gm4-?gvUu-GU4}vQsMO~p-kb<0 zpGvC=!<7198gb45?NP3GWPzF)ixHELr4|d4W|w)zL%Y(KJpMGSBg;Q(y>RJ22`+78 zlVrM$!ds7Z>i+zWvK2arWJ-M@53 zY3q4Y==|?l6|^WdDxrY;ER^X z`|13p7(v(E(Y&I0U@0eo?NdaX5Chj4KIV&shlXDY6eQC>_ zcI!&TTzTe#-SN_!k)EQE9L90$MTs6yKGZR$gN3BrXs{040OpEjK|Ik+51XU)siDCj zb5)hT>kc^0JsjmoIIU66T}*Jj4J%I+ZV|E+gNzQQq78)%c|NrT)Bf==z-3KTy|a%yyZWMFjks_IWT z6*3YRn&=>~r-AgT6^1eS)G=p*dQ_;O^Zrd7!$_DAI0q)CjPOGmi2!0qAZM|ssXS*C zuc1~ZLIZm7QXW)ugP&TB6aX{UrCxhbA=r87a8F$06(Ky2L-(o# zEEr|FikCV0v)h^ge+oJSN=e2z9OvbxDH~5Y%_49*8jvM81QXQup|hSkQvuFM?M^L$ zNCe6B0-4V2Q;#RDM#P5eMTc?uJHP{sXEgJTymj@c$qm%vjo=PCQwxq6&UwuNvN@#O zaZTDt;LsvPJY&5lIRhM)!1ti?Fnapb7ndt%XK{BUfR^zzq@VUwll-aJE__k@PwOkJ z{9o0?a&LyrEv$d=5zp#Pc@w!wz;+q_V!96z-N~uzclw;Im%6x;Y@ha>3+Vr zsguwnt0uHNpQk~zR+onqzO@UJ!b%70SvC#?K$Fj0*0z9F7lvGrOu>)mSya{*E;=*x zQ^TkJBo-iZi)hAw;3Bkl5}=C4@Qmwm;e9e#&kt;eKG+}OTIxqRuNFsgBnLPnrYHv_ z5mA=y+Z6RU6)d7aeF(wnMlt@?G?Ca2deRJmz{lfC+k+?P%}El{#cC2S14rrx$J4S5ziHrQCwX;)T%ytoB&wo&~zSx zmryQ)#V=9!svt<}X+a%9q`;J9XXRbJ=|RGS=xK!DU~*4dQg8(;fc9a}7{vhbk?Tyz zG-m?>m=dw+O*{%tw5M($!P!|GH(28>^oFoa537d#=v`WYE>*pYNV~OT)h)@se=Lms!=}x z9;U2D{a39Zv1uD54B&RDQLsR&s`$X}I#kHRpHtqQ##&N3W14!L6S(nJgJH4OrH#9K z(Q=DOTO1md4h}aGYM^|vWjXp(%O-J-n53=+oa3p*OA#FN*R56#xgPZ-Z?(Ci;7%9; z#%fe!ims2z_Ulq3essW{80YKOl}ICwl?u7R#VRoVBTC~fDPK{Hbj2d?%9kJ=-0i5r zQp3;+a401Y@ly+Rv338g0_1JBZihhk0JNj;BRaXDP@YAo}Dc+M$9 zU|<1?n+SUzht`-+_ksG;TN}FP(;caWj(%L@-kpGvMouy*N!#~&R9la7KMHo>QkB4v zFeDbG7|$8SMlpcCwBp`}@TXuGb#fmWHDBzHg?jzyV61HnYo57tkLz7we1dvot#E&| z4w(AS!S4{;L{FO)xVb_)lisYp2Gt*(R7WyS7=SV{R$0eG*0qbV4H9G? z_^8VRo_o}COP&oeomT<6=AFcA%Pz=QavTxHDx&6D4hs%D)bci9RRcI2W~-?RGn2`x zxhS?K3aY1Rz~-ciM3sVr&s-5yzyqc;-jzWN3X{;)U5djlq(q&GDtYZxwW-0LI04~T zKZ&a<6u+2z44TK0nrq@n@5N;|rHv^ovhAA|VGuty>gXccp;dSQ3dYgmQszQFZ{e+Y z`C);@3*por=iOffwI$U48EH2G_cFufA7Z=_UAQNm+#h=JU)eWO7e5c~EXxwsw+92z z5-Zu&vw%)dTJfhFO2=v?1nmThaOf%)WAhHem!>j#s4SQ@I1{%u8Ez;HG7qI7BtuRN zLsUVqPU=ubMIw}u{|V(ev@6*&aesMwQ?3eQOZIO|s8Vmh9*?jqtj;-*JA z6;dL10kr*UWo^V$Om;3t*<2q(RuJV*4>_uFwpj6so-CE)In6tTi;*$LTdsJiQa}L$ zszZhTB6HLll^AjL#RD!02HuA_sbhRD4>eU=E&5c;jD0EH1&dLg%no>|LvnfIs;eFw z6*NosHBLQ8I3hVNBTh&=ErMPf+F zIX!5w7Le{32L$!01B0A*?^RWa%8GvC7y;6z;bO|*jtw~&sP(GpijpQ^*y9xLGQv5< zIXL8;4#J=e3CJ|{AU98&(3)2Q#`1HKiZ^fuY7Ag?{LX2^2P;L#a%F6Rk6KXRHak^t zaNAF6c=@}1Y1~A-bU6l^NGBOMrf$bMZ2thYP2Ag$9cThoIH6eX#a9HEJpL6b@=khs z(3lejStyM(GG3GjhyMOyw$K_rU>dXrAxEyA^3Nq$LEY+EqS>u#RA^@Q9Dp>9# zn4S3_N=wCUxMPrOEU|`Q%1^yqrONI&$DLf#mTPrvGs#iMb8F_HB1Yz#@GZ!Q>Z3J!Z`nrfjOjDDj2R37cvR(+?< zC^^AX%{uY&Fiz4l#&b!fu~Nh+B>L7)NzTU6k1QFii*XU%9?%b3xoJD@`NL&L2enp! zN={^Cxsmjz>~VDC`(n_!+EpJF^lW8|C_H2ymGejJbdC0%YD4!5 zBG=NujPh`Bb6!nfiJg%6Nfhys-`1CQMtkO>C$ThVAa3IW^Q>AlxnWLmnpR~5j@1$p zbLmUFE6Bx2>^WPeDo|IGP%9Cf4s%PKjwl_ADBNbA7@nOfzDR82zA932-xRDePPGlNVCG6BZ!)a}6M2BFS+bx$+ zgp-lT?}O0NF|lqgSaLd4;PL^gOP$ypaaLe)x9ifK$71Y605EyYPZN?z$6Bi!41?-8 zsgbb99GYUWXgMVI6+BK?81K`XsTl`6)apjiM>OsQv|vMaAa|)%h&cD+s;go$Gm>~U zFl^*>!QzXBi$U@^XR@l=tpdE|Q4h?{mYds14ITT;b9sbXT;BZ{aP6OeeRRlwsp zs?ZCOoE|Dc$tN{Y9F9BGpzsegCIzKqoRSIpRLb0rIr>#N*yAUWo_(rSbGz?Ra7CTl zvyPPg*aMn?G45&T-#0waGGKC~gHov&Iqy~S2SZLmdvx`r1(Vls=}!di>-p3ny8}uH z_55jpGcdu&T6sU->rjVNjtxCq9Q8D=1cxN&xu@i zLEDqg2%wyN_{KX5MLSdidxK40a0uzvg!_TPe17n-@n6GDLI{vG?U4Ijwnug9KM|fQ z;%KZVntw0Lk#aMaQaW|(?_Z*a11pfgob%t*eKDHxkJ@*_maX9HZFf$!j^155Z{PWG zg$)z>}UT6?UWYRmcOO6TYRz4f}79D?6xw+KhVWveM z6~V{Nk^VJmSq%1tTd?Wcy#wIIxRb*&5(vfH1CG51_*a#K#?_pgo4M-a@RaGnI%>x~ zuY4T34vpd4g`O5TFiQNVrYZ}6fu1Una%I!ifFuTU*XxS+y*k02qJujN9P!)Iwl-hd zpDsi)rVc%8)mYhD$B?k=bLPEU;Wvz|78Q*x?*noBmd4ZXnoS$vmyC5Qf3)01X<|-x z$26Ha`U?7P3vqcM^Os;=ey85FVDjM@Bq%xHj`crYsoXxT9>>kmd;ryBNS^0ewFhz; zV_3;J{vZ!(sjYkqzdDS~r|PQ>mj3|U$07!iN4d>?5v*QH83Yj*k2z%^a(^nv)ghYd zF}g>!Bxh=zAEB(?Hlx{>>=Hh1)_xKV9@6gW_gr%&yhWS@ALCplovJE<+;#0=Mf^h1 zZ?#Ph{tYY^b&D;#mXjStcob2X^BV#j5*RS&BdGlIUWQ*d$+s=eY(yGML8td<6cd7Z zscqqAl@SoL5PtJ0r@lY!e+*9+G8KtWNWMQ0;2^A*b&5{V> zpon+$r6e)r4w$8=T%0!smpF5pfn9*wc^IeXu01K}1fcryN>3nXAk;vX!1SOVPtDCC z5@#wX=zkhuKQPZ8l%8Up!#w7l$8pMeG*cggjP;_CEv32g{7z1LU{#2S8-M_F+t!LG zB%N51fyWhQC)tG^sG^V)qm@7a9@RRr+yLOwMODDCj7a=(QlY{(wG>lClPh=pYC$7p zeQ2VSD4AR2RjUy>zypkmD4}iyv7D&`wMvKO2fk>cm=c53_o-3K9Co6L5E4dC*7VIu zxHlZ_Zr+qpRs@l;F4?J2cp0z1FXY`_q097Q8wDFwv z#S~Bi=jOpQ7dR&w`q4!N2JGW1qdt_N@@S%hMIAu(IH#!Gr+2Td6i@?)Kz*nrXBeW2 z5E8Kpql!j39Q8eDqNoIuqQmeVYHd=V>P0#doG;d$>REonNQT%d1y&b@KC#h#%0t*na_oP<^dhvF!r zy|p .nav { + left: 0; +} + +.lb-nav a { + outline: none; + background-image: url('data:image/gif;base64,R0lGODlhAQABAPAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='); +} + +.lb-prev, .lb-next { + height: 100%; + cursor: pointer; + display: block; +} + +.lb-nav a.lb-prev { + width: 34%; + left: 0; + float: left; + background: url(../images/prev.png) left 48% no-repeat; + opacity: 0; + transition: opacity var(--lb-nav-transition-speed); +} + +.lb-nav a.lb-prev:hover { + opacity: 1; +} + +.lb-nav a.lb-next { + width: 64%; + right: 0; + float: right; + background: url(../images/next.png) right 48% no-repeat; + opacity: 0; + transition: opacity var(--lb-nav-transition-speed); +} + +.lb-nav a.lb-next:hover { + opacity: 1; +} + +.lb-dataContainer { + margin: 0 auto; + padding-top: 5px; + width: 100%; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} + +.lb-dataContainer:after { + content: ""; + display: table; + clear: both; +} + +.lb-data { + padding: 0 4px; + color: var(--lb-text-color); +} + +.lb-data .lb-details { + width: 85%; + float: left; + text-align: left; + line-height: 1.1em; +} + +.lb-data .lb-caption { + font-size: 13px; + font-weight: bold; + line-height: 1em; +} + +.lb-data .lb-caption a { + color: var(--lb-caption-link-color); +} + +.lb-data .lb-number { + display: block; + clear: left; + padding-bottom: 1em; + font-size: 12px; + color: var(--lb-number-color); +} + +.lb-data .lb-close { + display: block; + float: right; + width: 30px; + height: 30px; + background: url(../images/close.png) top right no-repeat; + text-align: right; + outline: none; + opacity: 0.7; + transition: opacity var(--lb-close-transition-speed); +} + +.lb-data .lb-close:hover { + cursor: pointer; + opacity: 1; +} diff --git a/tcs_site/static/lightbox2/css/lightbox.min.css b/tcs_site/static/lightbox2/css/lightbox.min.css new file mode 100644 index 0000000..4b58818 --- /dev/null +++ b/tcs_site/static/lightbox2/css/lightbox.min.css @@ -0,0 +1 @@ +:root{--lb-overlay-opacity:0.8;--lb-overlay-bg:black;--lb-border-radius:3px;--lb-image-border-width:4px;--lb-image-border-color:white;--lb-container-bg:white;--lb-text-color:#ccc;--lb-caption-link-color:#4ae;--lb-number-color:#999999;--lb-nav-transition-speed:0.6s;--lb-close-transition-speed:0.2s}body.lb-disable-scrolling{overflow:hidden}.lightboxOverlay{position:fixed;inset:0;z-index:9999;background-color:var(--lb-overlay-bg);opacity:var(--lb-overlay-opacity);display:none}.lightbox{position:fixed;left:0;width:100%;z-index:10000;text-align:center;line-height:0;font-weight:400;outline:0}.lightbox .lb-image{display:block;height:auto;max-width:inherit;max-height:none;border-radius:var(--lb-border-radius);border:var(--lb-image-border-width) solid var(--lb-image-border-color)}.lightbox a img{border:none}.lb-outerContainer{position:relative;width:250px;height:250px;margin:0 auto;border-radius:4px;background-color:var(--lb-container-bg)}.lb-outerContainer:after{content:"";display:table;clear:both}.lb-loader{position:absolute;top:43%;left:0;height:25%;width:100%;text-align:center;line-height:0}.lb-cancel{display:block;width:32px;height:32px;margin:0 auto;background:url(../images/loading.gif) no-repeat}.lb-nav{position:absolute;top:0;left:0;height:100%;width:100%;z-index:10}.lb-container>.nav{left:0}.lb-nav a{outline:0;background-image:url('data:image/gif;base64,R0lGODlhAQABAPAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==')}.lb-next,.lb-prev{height:100%;cursor:pointer;display:block}.lb-nav a.lb-prev{width:34%;left:0;float:left;background:url(../images/prev.png) left 48% no-repeat;opacity:0;transition:opacity var(--lb-nav-transition-speed)}.lb-nav a.lb-prev:hover{opacity:1}.lb-nav a.lb-next{width:64%;right:0;float:right;background:url(../images/next.png) right 48% no-repeat;opacity:0;transition:opacity var(--lb-nav-transition-speed)}.lb-nav a.lb-next:hover{opacity:1}.lb-dataContainer{margin:0 auto;padding-top:5px;width:100%;border-bottom-left-radius:4px;border-bottom-right-radius:4px}.lb-dataContainer:after{content:"";display:table;clear:both}.lb-data{padding:0 4px;color:var(--lb-text-color)}.lb-data .lb-details{width:85%;float:left;text-align:left;line-height:1.1em}.lb-data .lb-caption{font-size:13px;font-weight:700;line-height:1em}.lb-data .lb-caption a{color:var(--lb-caption-link-color)}.lb-data .lb-number{display:block;clear:left;padding-bottom:1em;font-size:12px;color:var(--lb-number-color)}.lb-data .lb-close{display:block;float:right;width:30px;height:30px;background:url(../images/close.png) top right no-repeat;text-align:right;outline:0;opacity:.7;transition:opacity var(--lb-close-transition-speed)}.lb-data .lb-close:hover{cursor:pointer;opacity:1} \ No newline at end of file diff --git a/tcs_site/static/lightbox2/images/close.png b/tcs_site/static/lightbox2/images/close.png new file mode 100644 index 0000000000000000000000000000000000000000..20baa1db5fdf9e22655a0f851c4401d36b9e7ef9 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^(jd&i3?z4Pv7`ejn*g5>*Z=?j1DSvS{%vY%YG`Nx zvLV3R+Z)1I1qQoz?eg;S^6>Bg3hv&$d*{xbK#iaC4$A=f!X-g|!3vbDHnnh5Xg#OL;K8su!;fw4MC7hH<+BPou~5EnOggc)I$z JtaD0e0ssdsYEA$E literal 0 HcmV?d00001 diff --git a/tcs_site/static/lightbox2/images/loading.gif b/tcs_site/static/lightbox2/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..5087c2a644223a95984baefdb74f39a287fdfd9a GIT binary patch literal 8476 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 S-YhKu0000 elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 + // Plus for old WebKit, typeof returns "function" for HTML collections + // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) + return typeof obj === "function" && typeof obj.nodeType !== "number" && + typeof obj.item !== "function"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + +var document = window.document; + + + + var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true + }; + + function DOMEval( code, node, doc ) { + doc = doc || document; + + var i, val, + script = doc.createElement( "script" ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + + // Support: Firefox 64+, Edge 18+ + // Some browsers don't support the "nonce" property on scripts. + // On the other hand, just using `getAttribute` is not enough as + // the `nonce` attribute is reset to an empty string whenever it + // becomes browsing-context connected. + // See https://github.com/whatwg/html/issues/2369 + // See https://html.spec.whatwg.org/#nonce-attributes + // The `node.getAttribute` check was added for the sake of + // `jQuery.globalEval` so that it can fake a nonce-containing node + // via an object. + val = node[ i ] || node.getAttribute && node.getAttribute( i ); + if ( val ) { + script.setAttribute( i, val ); + } + } + } + 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.7.1", + + rhtmlSuffix = /HTML$/i, + + // 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 ); + }; + +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 ); + }, + + even: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return ( i + 1 ) % 2; + } ) ); + }, + + odd: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return i % 2; + } ) ); + }, + + 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 ) { + 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 ) ) ) ) { + src = target[ name ]; + + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; + } else { + clone = src; + } + copyIsArray = false; + + // 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 ) { + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a provided context; falls back to the global one + // if not specified. + globalEval: function( code, options, doc ) { + DOMEval( code, { nonce: options && options.nonce }, doc ); + }, + + 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; + }, + + + // Retrieve the text value of an array of DOM nodes + text: 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 += jQuery.text( node ); + } + } + if ( nodeType === 1 || nodeType === 11 ) { + return elem.textContent; + } + if ( nodeType === 9 ) { + return elem.documentElement.textContent; + } + if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; + }, + + // 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 ); + }, + + isXMLDoc: function( elem ) { + var namespace = elem && elem.namespaceURI, + docElem = elem && ( elem.ownerDocument || elem ).documentElement; + + // Assume HTML when documentElement doesn't yet exist, such as inside + // document fragments. + return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" ); + }, + + // 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 flat( 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; +} + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +} +var pop = arr.pop; + + +var sort = arr.sort; + + +var splice = arr.splice; + + +var whitespace = "[\\x20\\t\\r\\n\\f]"; + + +var rtrimCSS = new RegExp( + "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", + "g" +); + + + + +// Note: an element does not contain itself +jQuery.contains = function( a, b ) { + var bup = b && b.parentNode; + + return a === bup || !!( bup && bup.nodeType === 1 && ( + + // Support: IE 9 - 11+ + // IE doesn't have `contains` on SVG. + a.contains ? + a.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); +}; + + + + +// CSS string/identifier serialization +// https://drafts.csswg.org/cssom/#common-serializing-idioms +var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; + +function fcssescape( 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; +} + +jQuery.escapeSelector = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + + + + +var preferredDoc = document, + pushNative = push; + +( function() { + +var i, + Expr, + outermostContext, + sortInput, + hasDuplicate, + push = pushNative, + + // Local document vars + document, + documentElement, + documentIsHTML, + rbuggyQSA, + matches, + + // Instance-specific data + expando = jQuery.expando, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + nonnativeSelectorCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" + + "loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram + identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", + + // Attribute selectors: https://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" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + + whitespace + "*" ), + rdescend = new RegExp( whitespace + "|>" ), + + 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, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // https://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\([^\\r\\n\\f])", "g" ), + funescape = function( escape, nonHex ) { + var high = "0x" + escape.slice( 1 ) - 0x10000; + + if ( nonHex ) { + + // Strip the backslash prefix from a non-hex escape sequence + return nonHex; + } + + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + return high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes; see `setDocument`. + // Support: IE 9 - 11+, Edge 12 - 18+ + // Removing the function wrapper causes a "Permission Denied" + // error in IE/Edge. + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && nodeName( elem, "fieldset" ); + }, + { dir: "parentNode", next: "legend" } + ); + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + ( arr = slice.call( preferredDoc.childNodes ) ), + preferredDoc.childNodes + ); + + // Support: Android <=4.0 + // Detect silently failing push.apply + // eslint-disable-next-line no-unused-expressions + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { + apply: function( target, els ) { + pushNative.apply( target, slice.call( els ) ); + }, + call: function( target ) { + pushNative.apply( target, slice.call( arguments, 1 ) ); + } + }; +} + +function find( 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 ) { + 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 9 only + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + push.call( results, elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE 9 only + // getElementById can match elements by name instead of ID + if ( newContext && ( elem = newContext.getElementById( m ) ) && + find.contains( context, elem ) && + elem.id === m ) { + + push.call( results, elem ); + return results; + } + } + + // Type selector + } else if ( match[ 2 ] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // The technique has to be used as well when a leading combinator is used + // as such selectors are not recognized by querySelectorAll. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && + ( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) { + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + + // We can use :scope instead of the ID hack if the browser + // supports it & if we're not changing the context. + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when + // strict-comparing two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( newContext != context || !support.scope ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( "id" ) ) ) { + nid = jQuery.escapeSelector( nid ); + } else { + context.setAttribute( "id", ( nid = expando ) ); + } + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + + toSelector( groups[ i ] ); + } + newSelector = groups.join( "," ); + } + + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + + // All others + return select( selector.replace( rtrimCSS, "$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 https://github.com/jquery/sizzle/issues/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 jQuery selector module + * @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; + } +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + return nodeName( elem, "input" ) && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + return ( nodeName( elem, "input" ) || nodeName( elem, "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 + elem.isDisabled !== !disabled && + inDisabledFieldset( 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 jQuery selector 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; +} + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [node] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +function setDocument( node ) { + var subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + documentElement = document.documentElement; + documentIsHTML = !jQuery.isXMLDoc( document ); + + // Support: iOS 7 only, IE 9 - 11+ + // Older browsers didn't support unprefixed `matches`. + matches = documentElement.matches || + documentElement.webkitMatchesSelector || + documentElement.msMatchesSelector; + + // Support: IE 9 - 11+, Edge 12 - 18+ + // Accessing iframe documents after unload throws "permission denied" errors + // (see trac-13936). + // Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`, + // all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well. + if ( documentElement.msMatchesSelector && + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + + // Support: IE 9 - 11+, Edge 12 - 18+ + subWindow.addEventListener( "unload", unloadHandler ); + } + + // 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 ) { + documentElement.appendChild( el ).id = jQuery.expando; + return !document.getElementsByName || + !document.getElementsByName( jQuery.expando ).length; + } ); + + // Support: IE 9 only + // Check to see if it's possible to do matchesSelector + // on a disconnected node. + support.disconnectedMatch = assert( function( el ) { + return matches.call( el, "*" ); + } ); + + // Support: IE 9 - 11+, Edge 12 - 18+ + // IE/Edge don't support the :scope pseudo-class. + support.scope = assert( function() { + return document.querySelectorAll( ":scope" ); + } ); + + // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only + // Make sure the `:has()` argument is parsed unforgivingly. + // We include `*` in the test to detect buggy implementations that are + // _selectively_ forgiving (specifically when the list includes at least + // one valid selector). + // Note that we treat complete lack of support for `:has()` as if it were + // spec-compliant support, which is fine because use of `:has()` in such + // environments will fail in the qSA path and fall back to jQuery traversal + // anyway. + support.cssHas = assert( function() { + try { + document.querySelector( ":has(*,:jqfake)" ); + return false; + } catch ( e ) { + return true; + } + } ); + + // 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 = function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else { + return context.querySelectorAll( tag ); + } + }; + + // Class + Expr.find.CLASS = function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + rbuggyQSA = []; + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { + + var input; + + documentElement.appendChild( el ).innerHTML = + "" + + ""; + + // Support: iOS <=7 - 8 only + // Boolean attributes and "value" are not treated correctly in some XML documents + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: iOS <=7 - 8 only + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } + + // Support: iOS 8 only + // 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( ".#.+[+~]" ); + } + + // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ + // In some of the document kinds, these selectors wouldn't work natively. + // This is probably OK but for backwards compatibility we want to maintain + // handling them through jQuery traversal in jQuery 3.x. + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE 9 - 11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ + // In some of the document kinds, these selectors wouldn't work natively. + // This is probably OK but for backwards compatibility we want to maintain + // handling them through jQuery traversal in jQuery 3.x. + documentElement.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement( "input" ); + input.setAttribute( "name", "" ); + el.appendChild( input ); + if ( !el.querySelectorAll( "[name='']" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" ); + } + } ); + + if ( !support.cssHas ) { + + // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+ + // Our regular `try-catch` mechanism fails to detect natively-unsupported + // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`) + // in browsers that parse the `:has()` argument as a forgiving selector list. + // https://drafts.csswg.org/selectors/#relational now requires the argument + // to be parsed unforgivingly, but browsers have not yet fully adjusted. + rbuggyQSA.push( ":has" ); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = 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 + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + 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 + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( a === document || a.ownerDocument == preferredDoc && + find.contains( preferredDoc, a ) ) { + return -1; + } + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( b === document || b.ownerDocument == preferredDoc && + find.contains( preferredDoc, b ) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + }; + + return document; +} + +find.matches = function( expr, elements ) { + return find( expr, null, null, elements ); +}; + +find.matchesSelector = function( elem, expr ) { + setDocument( elem ); + + if ( documentIsHTML && + !nonnativeSelectorCache[ 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 ) { + nonnativeSelectorCache( expr, true ); + } + } + + return find( expr, document, null, [ elem ] ).length > 0; +}; + +find.contains = function( context, elem ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( context.ownerDocument || context ) != document ) { + setDocument( context ); + } + return jQuery.contains( context, elem ); +}; + + +find.attr = function( elem, name ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( elem.ownerDocument || elem ) != document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + + // Don't get fooled by Object.prototype properties (see trac-13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + if ( val !== undefined ) { + return val; + } + + return elem.getAttribute( name ); +}; + +find.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +jQuery.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + // + // Support: Android <=4.0+ + // Testing for detecting duplicates is unpredictable so instead assume we can't + // depend on duplicate detection in all browsers without a stable sort. + hasDuplicate = !support.sortStable; + sortInput = !support.sortStable && slice.call( results, 0 ); + sort.call( results, sortOrder ); + + if ( hasDuplicate ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + splice.call( results, duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +jQuery.fn.uniqueSort = function() { + return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) ); +}; + +Expr = jQuery.expr = { + + // 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 ] ) { + find.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 ] ) { + find.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 expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { + return true; + } : + function( elem ) { + return nodeName( elem, expectedNodeName ); + }; + }, + + 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 = find.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + if ( operator === "=" ) { + return result === check; + } + if ( operator === "!=" ) { + return result !== check; + } + if ( operator === "^=" ) { + return check && result.indexOf( check ) === 0; + } + if ( operator === "*=" ) { + return check && result.indexOf( check ) > -1; + } + if ( operator === "$=" ) { + return check && result.slice( -check.length ) === check; + } + if ( operator === "~=" ) { + return ( " " + result.replace( rwhitespace, " " ) + " " ) + .indexOf( check ) > -1; + } + if ( operator === "|=" ) { + return result === check || result.slice( 0, check.length + 1 ) === check + "-"; + } + + return 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, 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 ? + nodeName( node, 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 + outerCache = parent[ expando ] || ( parent[ expando ] = {} ); + cache = outerCache[ 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 ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + + // Use previously-cached element index if available + if ( useCache ) { + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + cache = outerCache[ 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 ? + nodeName( node, name ) : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || + ( node[ expando ] = {} ); + outerCache[ 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 + // https://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() ] || + find.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as jQuery 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.call( 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( rtrimCSS, "$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 + // (see https://github.com/jquery/sizzle/issues/299) + input[ 0 ] = null; + return !results.pop(); + }; + } ), + + has: markFunction( function( selector ) { + return function( elem ) { + return find( selector, elem ).length > 0; + }; + } ), + + contains: markFunction( function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || jQuery.text( 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." + // https://www.w3.org/TR/selectors/#lang-pseudo + lang: markFunction( function( lang ) { + + // lang value must be a valid identifier + if ( !ridentifier.test( lang || "" ) ) { + find.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 === documentElement; + }, + + focus: function( elem ) { + return elem === safeActiveElement() && + 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 + // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + return ( nodeName( elem, "input" ) && !!elem.checked ) || + ( nodeName( elem, "option" ) && !!elem.selected ); + }, + + selected: function( elem ) { + + // Support: IE <=11+ + // Accessing the selectedIndex property + // forces the browser to treat the default option as + // selected when in an optgroup. + if ( elem.parentNode ) { + // eslint-disable-next-line no-unused-expressions + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + empty: function( elem ) { + + // https://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 ) { + return nodeName( elem, "input" ) && elem.type === "button" || + nodeName( elem, "button" ); + }, + + text: function( elem ) { + var attr; + return nodeName( elem, "input" ) && elem.type === "text" && + + // Support: IE <10 only + // 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; + + if ( argument < 0 ) { + i = argument + length; + } else if ( argument > length ) { + i = length; + } else { + i = 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(); + +function tokenize( 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 = rleadingCombinator.exec( soFar ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + + // Cast descendant combinators to space + type: match[ 0 ].replace( rtrimCSS, " " ) + } ); + 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 + if ( parseOnly ) { + return soFar.length; + } + + return soFar ? + find.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, 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 ] = {} ); + + if ( skip && nodeName( elem, skip ) ) { + elem = elem[ dir ] || elem; + } else if ( ( oldCache = outerCache[ 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 + outerCache[ 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++ ) { + find( 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, matcherOut, + 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; + + if ( matcher ) { + + // If we have a postFinder, or filtered seed, or non-seed postFilter + // or preexisting results, + matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results; + + // Find primary matches + matcher( matcherIn, matcherOut, context, xml ); + } else { + matcherOut = matcherIn; + } + + // 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.call( 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.call( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || ( + ( checkContext = context ).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + + // Avoid hanging onto element + // (see https://github.com/jquery/sizzle/issues/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( rtrimCSS, "$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 ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + outermostContext = context == document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: iOS <=7 - 9 only + // Tolerate NodeList properties (IE: "length"; Safari: ) matching + // elements by id. (see trac-14142) + for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( !context && elem.ownerDocument != document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( ( matcher = elementMatchers[ j++ ] ) ) { + if ( matcher( elem, context || document, xml ) ) { + push.call( results, 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 ) { + + jQuery.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +function compile( 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 jQuery's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with jQuery selector compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +function select( 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 + +// Support: Android <=4.0 - 4.1+ +// Sort stability +support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; + +// Initialize against the default document +setDocument(); + +// Support: Android <=4.0 - 4.1+ +// 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; +} ); + +jQuery.find = find; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.unique = jQuery.uniqueSort; + +// These have always been private, but they used to be documented as part of +// Sizzle so let's maintain them for now for backwards compatibility purposes. +find.compile = compile; +find.select = select; +find.setDocument = setDocument; +find.tokenize = tokenize; + +find.escape = jQuery.escapeSelector; +find.getText = jQuery.text; +find.isXML = jQuery.isXMLDoc; +find.selectors = jQuery.expr; +find.support = jQuery.support; +find.uniqueSort = jQuery.uniqueSort; + + /* eslint-enable */ + +} )(); + + +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; + +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 (trac-9521) + // Strict HTML recognition (trac-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 jQuery#find + 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 ( elem.contentDocument != null && + + // Support: IE 11+ + // elements with no `data` attribute has an object + // `contentDocument` with a `null` prototype. + getProto( elem.contentDocument ) ) { + + 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.error ); + } + + // 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 error, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getErrorHook ) { + process.error = jQuery.Deferred.getErrorHook(); + + // The deprecated alias of the above. While the name suggests + // returning the stack, not an error instance, jQuery just passes + // it directly to `console.warn` so both will work; an instance + // just better cooperates with source maps. + } else if ( jQuery.Deferred.getStackHook ) { + process.error = 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 primary Deferred + primary = 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 ) ) { + primary.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( primary.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return primary.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); + } + + return primary.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$/; + +// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error +// captured before the async barrier to get the original error cause +// which may otherwise be hidden. +jQuery.Deferred.exceptionHook = function( error, asyncError ) { + + // 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, asyncError ); + } +}; + + + + +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 trac-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 (trac-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 trac-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 (trac-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 documentElement = document.documentElement; + + + + var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }, + composed = { composed: true }; + + // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only + // Check attachment across shadow DOM boundaries when possible (gh-3504) + // Support: iOS 10.0-10.2 only + // Early iOS 10 versions support `attachShadow` but not `getRootNode`, + // leading to errors. We need to check for `getRootNode`. + if ( documentElement.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }; + } +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. + isAttached( elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + + + +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 = elem.nodeType && + ( 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 ); + + + +( 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 (trac-11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (trac-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; + + // Support: IE <=9 only + // IE <=9 replaces "; + support.option = !!div.lastChild; +} )(); + + +// We have to close these tags to support XHTML (trac-13200) +var wrapMap = { + + // 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, "", "" ] +}; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// Support: IE <=9 only +if ( !support.option ) { + wrapMap.optgroup = wrapMap.option = [ 1, "" ]; +} + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (trac-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, attached, 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 (trac-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; + } + + attached = isAttached( elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( attached ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +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 ); + + // Only attach events to objects that accept data + if ( !acceptData( elem ) ) { + 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 = Object.create( null ); + } + 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 ) { + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( nativeEvent ), + + handlers = ( + dataPriv.get( this, "events" ) || Object.create( null ) + )[ 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() ) { + + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + 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 (trac-13208) + // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-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 (trac-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 + }, + click: { + + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, "click", true ); + } + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + leverageNative( el, "click" ); + } + + // Return non-false to allow normal event-path propagation + return true; + }, + + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack + _default: function( event ) { + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, "input" ) && + dataPriv.get( target, "click" ) || + nodeName( 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; + } + } + } + } +}; + +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, isSetup ) { + + // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add + if ( !isSetup ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + if ( !saved ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + this[ type ](); + result = dataPriv.get( this, type ); + dataPriv.set( this, type, false ); + + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + + return result; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering + // the native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if ( saved ) { + + // ...and capture the result + dataPriv.set( this, type, jQuery.event.trigger( + saved[ 0 ], + saved.slice( 1 ), + this + ) ); + + // Abort handling of the native event by all jQuery handlers while allowing + // native handlers on the same element to run. On target, this is achieved + // by stopping immediate propagation just on the jQuery event. However, + // the native event is re-wrapped by a jQuery one on each level of the + // propagation so the only way to stop it for jQuery is to stop it for + // everyone via native `stopPropagation()`. This is not a problem for + // focus/blur which don't bubble, but it does also stop click on checkboxes + // and radios. We accept this limitation. + event.stopPropagation(); + event.isImmediatePropagationStopped = returnTrue; + } + } + } ); +} + +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 (trac-504, trac-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, + code: 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: true +}, jQuery.event.addProp ); + +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + + function focusMappedHandler( nativeEvent ) { + if ( document.documentMode ) { + + // Support: IE 11+ + // Attach a single focusin/focusout handler on the document while someone wants + // focus/blur. This is because the former are synchronous in IE while the latter + // are async. In other browsers, all those handlers are invoked synchronously. + + // `handle` from private data would already wrap the event, but we need + // to change the `type` here. + var handle = dataPriv.get( this, "handle" ), + event = jQuery.event.fix( nativeEvent ); + event.type = nativeEvent.type === "focusin" ? "focus" : "blur"; + event.isSimulated = true; + + // First, handle focusin/focusout + handle( nativeEvent ); + + // ...then, handle focus/blur + // + // focus/blur don't bubble while focusin/focusout do; simulate the former by only + // invoking the handler at the lower level. + if ( event.target === event.currentTarget ) { + + // The setup part calls `leverageNative`, which, in turn, calls + // `jQuery.event.add`, so event handle will already have been set + // by this point. + handle( event ); + } + } else { + + // For non-IE browsers, attach a single capturing handler on the document + // while someone wants focusin/focusout. + jQuery.event.simulate( delegateType, nativeEvent.target, + jQuery.event.fix( nativeEvent ) ); + } + } + + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + var attaches; + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, true ); + + if ( document.documentMode ) { + + // Support: IE 9 - 11+ + // We use the same native handler for focusin & focus (and focusout & blur) + // so we need to coordinate setup & teardown parts between those events. + // Use `delegateType` as the key as `type` is already used by `leverageNative`. + attaches = dataPriv.get( this, delegateType ); + if ( !attaches ) { + this.addEventListener( delegateType, focusMappedHandler ); + } + dataPriv.set( this, delegateType, ( attaches || 0 ) + 1 ); + } else { + + // Return false to allow normal processing in the caller + return false; + } + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + teardown: function() { + var attaches; + + if ( document.documentMode ) { + attaches = dataPriv.get( this, delegateType ) - 1; + if ( !attaches ) { + this.removeEventListener( delegateType, focusMappedHandler ); + dataPriv.remove( this, delegateType ); + } else { + dataPriv.set( this, delegateType, attaches ); + } + } else { + + // Return false to indicate standard teardown should be applied + return false; + } + }, + + // Suppress native focus or blur if we're currently inside + // a leveraged native-event stack + _default: function( event ) { + return dataPriv.get( event.target, type ); + }, + + delegateType: delegateType + }; + + // 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 + // + // Support: IE 9 - 11+ + // To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch, + // attach a single handler for both events in IE. + jQuery.event.special[ delegateType ] = { + setup: function() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, + dataHolder = document.documentMode ? this : doc, + attaches = dataPriv.get( dataHolder, delegateType ); + + // Support: IE 9 - 11+ + // We use the same native handler for focusin & focus (and focusout & blur) + // so we need to coordinate setup & teardown parts between those events. + // Use `delegateType` as the key as `type` is already used by `leverageNative`. + if ( !attaches ) { + if ( document.documentMode ) { + this.addEventListener( delegateType, focusMappedHandler ); + } else { + doc.addEventListener( type, focusMappedHandler, true ); + } + } + dataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, + dataHolder = document.documentMode ? this : doc, + attaches = dataPriv.get( dataHolder, delegateType ) - 1; + + if ( !attaches ) { + if ( document.documentMode ) { + this.removeEventListener( delegateType, focusMappedHandler ); + } else { + doc.removeEventListener( type, focusMappedHandler, true ); + } + dataPriv.remove( dataHolder, delegateType ); + } else { + dataPriv.set( dataHolder, delegateType, attaches ); + } + } + }; +} ); + +// 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 + + // 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, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.get( src ); + events = pdataOld.events; + + if ( events ) { + dataPriv.remove( dest, "handle 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 = flat( 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 (trac-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; + + // Re-enable 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 && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce || node.getAttribute( "nonce" ) + }, doc ); + } + } else { + + // Unwrap a CDATA section containing script contents. This shouldn't be + // needed as in XML documents they're already not visible when + // inspecting element contents and in HTML documents they have no + // meaning but we're preserving that logic for backwards compatibility. + // This will be removed completely in 4.0. See gh-4904. + DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); + } + } + } + } + } + } + + 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 && isAttached( node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html; + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = isAttached( elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew jQuery#find 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 rcustomProp = /^--/; + + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (trac-15098, trac-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 swap = function( elem, options, callback ) { + 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.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + +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) + // Support: Chrome <=64 + // Don't get tricked when zoom affects offsetWidth (gh-4029) + div.style.position = "absolute"; + scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; + + 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, + reliableTrDimensionsVal, 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 (trac-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; + }, + + // Support: IE 9 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Behavior in IE 9 is more subtle than in newer versions & it passes + // some versions of this test; make sure not to make it pass there! + // + // Support: Firefox 70+ + // Only Firefox includes border widths + // in computed dimensions. (gh-4529) + reliableTrDimensions: function() { + var table, tr, trChild, trStyle; + if ( reliableTrDimensionsVal == null ) { + table = document.createElement( "table" ); + tr = document.createElement( "tr" ); + trChild = document.createElement( "div" ); + + table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; + tr.style.cssText = "box-sizing:content-box;border:1px solid"; + + // Support: Chrome 86+ + // Height set through cssText does not get applied. + // Computed height then comes back as 0. + tr.style.height = "1px"; + trChild.style.height = "9px"; + + // Support: Android 8 Chrome 86+ + // In our bodyBackground.html iframe, + // display for all div elements is set to "inline", + // which causes a problem only in Android 8 Chrome 86. + // Ensuring the div is `display: block` + // gets around this issue. + trChild.style.display = "block"; + + documentElement + .appendChild( table ) + .appendChild( tr ) + .appendChild( trChild ); + + trStyle = window.getComputedStyle( tr ); + reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + + parseInt( trStyle.borderTopWidth, 10 ) + + parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; + + documentElement.removeChild( table ); + } + return reliableTrDimensionsVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + isCustomProp = rcustomProp.test( name ), + + // 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, trac-12537) + // .css('--customProperty) (gh-3144) + if ( computed ) { + + // Support: IE <=9 - 11+ + // IE only supports `"float"` in `getPropertyValue`; in computed styles + // it's only available as `"cssFloat"`. We no longer modify properties + // sent to `.css()` apart from camelCasing, so we need to check both. + // Normally, this would create difference in behavior: if + // `getPropertyValue` returns an empty string, the value returned + // by `.css()` would be `undefined`. This is usually the case for + // disconnected elements. However, in IE even disconnected elements + // with no styles return `"none"` for `getPropertyValue( "float" )` + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( isCustomProp && ret ) { + + // Support: Firefox 105+, Chrome <=105+ + // Spec requires trimming whitespace for custom properties (gh-4926). + // Firefox only trims leading whitespace. Chrome just collapses + // both leading & trailing whitespace to a single space. + // + // Fall back to `undefined` if empty string returned. + // This collapses a missing definition with property defined + // and set to an empty string but there's no standard API + // allowing us to differentiate them without a performance penalty + // and returning `undefined` aligns with older jQuery. + // + // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED + // as whitespace while CSS does not, but this is not a problem + // because CSS preprocessing replaces them with U+000A LINE FEED + // (which *is* CSS whitespace) + // https://www.w3.org/TR/css-syntax-3/#input-preprocessing + ret = ret.replace( rtrimCSS, "$1" ) || undefined; + } + + if ( ret === "" && !isAttached( 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 cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style, + vendorProps = {}; + +// Return a vendor-prefixed property or undefined +function vendorPropName( 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 potentially-mapped jQuery.cssProps or vendor prefixed property +function finalPropName( name ) { + var final = jQuery.cssProps[ name ] || vendorProps[ name ]; + + if ( final ) { + return final; + } + if ( name in emptyStyle ) { + return name; + } + return vendorProps[ name ] = vendorPropName( name ) || name; +} + + +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]).+)/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }; + +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, + marginDelta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + // Count margin delta separately to only add it after scroll gutter adjustment. + // This is needed to make negative margins work with `outerHeight( true )` (gh-3982). + if ( box === "margin" ) { + marginDelta += 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 + + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + ) ) || 0; + } + + return delta + marginDelta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). + // Fake content-box until we know it's needed to know the true value. + boxSizingNeeded = !support.boxSizingReliable() || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox, + + val = curCSS( elem, dimension, styles ), + offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); + + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = "auto"; + } + + + // Support: IE 9 - 11 only + // Use offsetWidth/offsetHeight for when box sizing is unreliable. + // In those cases, the computed value can be trusted to be border-box. + if ( ( !support.boxSizingReliable() && isBorderBox || + + // Support: IE 10 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Interestingly, in some cases IE 9 doesn't suffer from this issue. + !support.reliableTrDimensions() && nodeName( elem, "tr" ) || + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + val === "auto" || + + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && + + // Make sure the element is visible & connected + elem.getClientRects().length ) { + + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Where available, offsetWidth/offsetHeight approximate border box dimensions. + // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the + // retrieved value as a content box dimension. + valueIsBorderBox = offsetProp in elem; + if ( valueIsBorderBox ) { + val = elem[ offsetProp ]; + } + } + + // 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, + aspectRatio: true, + borderImageSlice: true, + columnCount: true, + flexGrow: true, + flexShrink: true, + fontWeight: true, + gridArea: true, + gridColumn: true, + gridColumnEnd: true, + gridColumnStart: true, + gridRow: true, + gridRowEnd: true, + gridRowStart: true, + lineHeight: true, + opacity: true, + order: true, + orphans: true, + scale: true, + widows: true, + zIndex: true, + zoom: true, + + // SVG-related + fillOpacity: true, + floodOpacity: true, + stopOpacity: true, + strokeMiterlimit: true, + strokeOpacity: 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 (trac-7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug trac-9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (trac-7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append + // "px" to a few hardcoded values. + if ( type === "number" && !isCustomProp ) { + 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 ), + + // Only read styles.position if the test has a chance to fail + // to avoid forcing a reflow. + scrollboxSizeBuggy = !support.scrollboxSize() && + styles.position === "absolute", + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) + boxSizingNeeded = scrollboxSizeBuggy || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra ? + boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ) : + 0; + + // 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 && scrollboxSizeBuggy ) { + 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 && ( + jQuery.cssHooks[ tween.prop ] || + tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { + 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 )` (trac-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 ) { + 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. +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 + // Use proper attribute retrieval (trac-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 classNames, cur, curValue, className, i, finalValue; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classNames = classesToArray( value ); + + if ( classNames.length ) { + return this.each( function() { + curValue = getClass( this ); + cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; + if ( cur.indexOf( " " + className + " " ) < 0 ) { + cur += className + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + this.setAttribute( "class", finalValue ); + } + } + } ); + } + + return this; + }, + + removeClass: function( value ) { + var classNames, cur, curValue, className, i, finalValue; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classNames = classesToArray( value ); + + if ( classNames.length ) { + return this.each( function() { + curValue = getClass( this ); + + // This expression is here for better compressibility (see addClass) + cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; + + // Remove *all* instances + while ( cur.indexOf( " " + className + " " ) > -1 ) { + cur = cur.replace( " " + className + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + this.setAttribute( "class", finalValue ); + } + } + } ); + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var classNames, className, i, self, + type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + classNames = classesToArray( value ); + + return this.each( function() { + if ( isValidValue ) { + + // Toggle individual class names + self = jQuery( this ); + + for ( i = 0; i < classNames.length; i++ ) { + 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 (trac-14686, trac-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 (trac-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 +var location = window.location; + +var nonce = { guid: Date.now() }; + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml, parserErrorElem; + 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 ) {} + + parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; + if ( !xml || parserErrorElem ) { + jQuery.error( "Invalid XML: " + ( + parserErrorElem ? + jQuery.map( parserErrorElem.childNodes, function( el ) { + return el.textContent; + } ).join( "\n" ) : + data + ) ); + } + return xml; +}; + + +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 (trac-9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (trac-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" ) || Object.create( null ) )[ 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 (trac-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 ); + } + } +} ); + + +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 ( a == null ) { + return ""; + } + + // 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, + + // trac-7653, trac-8125, trac-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 (trac-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 trac-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() + " " ] = + ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) + .concat( match[ 2 ] ); + } + } + match = responseHeaders[ key.toLowerCase() + " " ]; + } + return match == null ? null : match.join( ", " ); + }, + + // 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 (trac-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 trac-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 (trac-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; + + // trac-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.guid++ ) + + 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 ); + } + + // Use a noop converter for missing script but not if jsonp + if ( !isSuccess && + jQuery.inArray( "script", s.dataTypes ) > -1 && + jQuery.inArray( "json", s.dataTypes ) < 0 ) { + s.converters[ "text script" ] = function() {}; + } + + // 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.ajaxPrefilter( function( s ) { + var i; + for ( i in s.headers ) { + if ( i.toLowerCase() === "content-type" ) { + s.contentType = s.headers[ i ] || ""; + } + } +} ); + + +jQuery._evalUrl = function( url, options, doc ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (trac-11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + + // Only evaluate the response if it is successful (gh-4126) + // dataFilter is not invoked for failure responses, so using it instead + // of the default converter is kludgy but it works. + converters: { + "text script": function() {} + }, + dataFilter: function( response ) { + jQuery.globalEval( response, options, doc ); + } + } ); +}; + + +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 + // trac-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 trac-8605, trac-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 ) { + + // trac-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 or forced-by-attrs requests + if ( s.crossDomain || s.scriptAttrs ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " + @@ -57,11 +60,6 @@ CD và K7 -