From 96b44f1c23c224b20a18adc4dbec6ab06461e56f Mon Sep 17 00:00:00 2001 From: kamolgks Date: Mon, 11 Mar 2024 22:43:22 +0500 Subject: [PATCH] a few changes and optimizations --- assets/css/info.css | 5 + assets/css/mods.css | 2 +- assets/css/style.css | 7 +- assets/images/background.jpg | Bin 0 -> 133605 bytes assets/images/icon.png | Bin 0 -> 10124 bytes assets/js/index.js | 16 + assets/js/jquery-3.7.1.js | 10713 +++++++++++++++++++++++++++++++++ assets/js/script.js | 45 - index.html | 51 +- info.html => info/index.html | 21 +- mods.html => mods/index.html | 75 +- 11 files changed, 10841 insertions(+), 94 deletions(-) create mode 100644 assets/images/background.jpg create mode 100644 assets/images/icon.png create mode 100644 assets/js/index.js create mode 100644 assets/js/jquery-3.7.1.js delete mode 100644 assets/js/script.js rename info.html => info/index.html (70%) rename mods.html => mods/index.html (84%) diff --git a/assets/css/info.css b/assets/css/info.css index 1086a29..98ceae7 100644 --- a/assets/css/info.css +++ b/assets/css/info.css @@ -4,8 +4,11 @@ body { width: 100%; min-height: 100%; margin: 0; + margin-top: 46vb; + background: rgb(54, 53, 53); color:#ffffff; font-family: "Hubballi"; font-size: 18px; + text-align: center; } .typed-cursor { @@ -18,6 +21,8 @@ body { animation: typedjsBlink 0.7s infinite; } +/* .h3 { margin-top: 46vh; text-align: center; } */ + @keyframes typedjsBlink { 50% { opacity: 0.0; diff --git a/assets/css/mods.css b/assets/css/mods.css index 292ebfa..501a1d2 100644 --- a/assets/css/mods.css +++ b/assets/css/mods.css @@ -55,7 +55,7 @@ body { border-color: rgb(0, 123, 255); } -.huy { +.ava_h { font-size: 22px; max-width: 800px; margin: 0 auto; diff --git a/assets/css/style.css b/assets/css/style.css index e5ddd89..cbbcd4a 100644 --- a/assets/css/style.css +++ b/assets/css/style.css @@ -3,7 +3,6 @@ :root { --back-color: #fff3; --text-color: #fff; - /* --over-color: #fefefe; */ --popup-text-color: #000000; --border: none; } @@ -48,7 +47,6 @@ body { border-radius: 16px; backdrop-filter: blur(20px); border: 2px solid rgb(115, 6, 155); - /*rgb(217, 26, 26)*/ box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2); } @@ -87,10 +85,9 @@ a.link { height: 10em; border-radius: 5.6em; border: 2px solid rgb(115, 6, 155); - /*rgb(217, 26, 26)*/ } -.pizdec { +.c { position: relative; display: inline-flex; padding: 0.3em; @@ -153,4 +150,4 @@ a.nolink { .avatar { margin: 0; } -} +} \ No newline at end of file diff --git a/assets/images/background.jpg b/assets/images/background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..11a4ade37f87830a03422bd6ac38463b2a3871f2 GIT binary patch literal 133605 zcmb4q1yCf*wr%4!K;sPVGS~o(ySuv&Hn_X{Fu1$B4ekssgS)%CyTj+4`|f-9#=Ad$ z{Oaz=uF8nY%&OdLuf2BW`@;JM04OOcAqoHk0|SVEd;ssu03iS*1jJuoNC-$MNJuDX zco^u90}&1$79JT92t-CiMnXZuMn^%#LPbKxz{9}${23P)7l@8eh>t^vjf0Ex*G<46 zp`f6lpg+ODe8NFNM#1_2KHfV4D6rrYPyh%p5&$>~7z7H~doKVV004vf=q(uFzYj3* zkA6bKz`}i0s{#RFkYEttkPuK%kkBxYP>5gva0nDgC{$ub0cbP@eG)rA7<8tX98y8W z>PZZPt_xUZ``D>XOfry=lK-V)Ty8fOd0>1^&oqUwh_Z@aNKPXi~vVj7u_R zMIn0w|Je5>z$b{04x&Jy0Qdk87_fo>pt|`pG5z+`!x@iaCA6Aclj>ZvvB# z9ORV%C=%MPoO&1l1#^XJkN6eYuah&Bi-GDA&lhpKGAV5D_f!>=OdWv8*WDp4fh5-ii|k2A01}{G)1*q@M`z0UClg-B_7|8dxXZ5JQ%``@(sHh z+J5_?tC7Bz)9zJm4%?nL_rIVv=;#V5RF4o83caeZY+d-+)4gCl5xoPV!=9@xZ?hmD z5@m2%xoJbbz_enMwc|(-!qJ>E)bQcLN!txvAn@nv%onx1tQxgUeltnzSE$laAC?pmNl}Y{QkiBX zMEHwcgLb4p(ln!q9VvLxGvh76$HaP~{ugqc4k0$)=Kx!7p-(`Ks}M3{&LA!RCGG7O zfQydYqRW%)gV-1Ln{%|$giVe$u!yBSj=qRLzSYEBUtYE0@9~8Qg`b5k3azn+`ez+= z43We?E!47#N}w%iN@>#)w7F^1IsERf4;{Gk@f+%PHf4eDTX^Zb)D6esK0r=^9JwZS z-Qmbr=ZirYW|3AC-e2HRn`-F@WNKwDJ=QZ>x=~_g6OYxXOWCu+8)dVzRD^i$FJ|fQ z7Bk*@qnyl&q75)BjGJ{I%NxGbA#=hwd(I5@5&LPDFnb*^vTufop`L!?lG-Th9SLOa|ztIfR>8N#INh|R6V5_1M*}Km&8|Ol7)3#c&-oEj36jDy82Igk+y!tor zbehJNKOP8p8yiBY;zV~E^Qzml6`v&s>N`rn#M1>OmGeVKgbUJAU3Y0TX*KW1s|aDd z(p-~ZG?Pwgv~YB#8GoNucaTR1!{bHt#JO}TDhRcxZzPs_9vZT9rwId(G%Zt&{K})7 z2GQ=q7)lW-C*A=pqq_nW^g>%H1(o_l0Y~gwOEa$SCO=uQ>$HPqf{>IW`r~7)zu6&j zdjJ%V7Pi&Gp)x&~F~sAZ_hJ@!wxyaR;iy0mmr@A4Y^@FpczsUe-j ztJ#^s{=$zyA{f-@H1T*GsTliy!FK??c-9L&lsoi>XUMV>t^P_S&+kna9EXu7R<7ZY z#fz5~AC*a0x~!FW!b0!xg^T8TYOy`DuNQE_7i{F^NE`Lbe)8SV@IAU8YyRjHgQqlfN8Pgd7@T=&lgrYE>N z>iWlZnYV8=dQ3E^OmA2abpea|$3U@|T$n-h>0~3zaw8on-wLm0o$snNe~>7Iw!Wqi zMT#+Yhe?={7wt}3mE4$95^D2x&L8!Sx^G``hv@_lXKYU-^qX6*qL;sIC*`{4;W3%S zjBWd*Zm>XW*ggggy3Tq?xTo)jstxuw{(Q@)(wUW+7?^&p_`+7Fd8I+%`anV*#Ive| z-(7LhKw^oO3}$iuAVVC}!Y_p*jxS>iq|fBKLesQ}!Cm-;8t6HZP2}-66vOiW?;+8#L8tjDHKL=khUrQtb_022#MnTbfE={Rj{&@4bVF%{eKr(fhsKTn-qd z+Iwbu2_iRROX|i)uWcG>#<`#Q2FViat)iA=u~FlS4%#HoBI-Rds5J!@i5J*uB~}@g;&&i$c_6r@`wwOIYr}r-2!Ho$Lu4*J9a@(HYi}0F zYS@>%moU^z@k`j3vFL|59A0xZf*E#MUQj5d5GzQr_6tmKA5o65BO!S|cj_*)9Rj^B zW2vVU6xJ4J@XC`z*ZQGAftk9G{UvVzeMtxn1k*PM^@kliz0Pf60&jx!iZ_Ov_-Fj@ zsstv1-!A7D*F0rWdFkMiFAk@NIC(7v7!og!FEjuML<}LEw*t8w@D+Kz^s^F@ql<_w z%Qmsj+*#IMMPBu;Ca2(ZxV`KxYf*7q>qtKa_gN{o@J>kIYVl9w5y#EQJ7E;)osd+q z!oPynfrk%E{lQn&SJl^c%P|eqX~cm|8WGR#JdMKcmC>48>}pjk7B<^?MjS3tqZPvM+=4Ty5|4j9ix1z(UTdyV}j{r+aa|P@}NF4}Sjc zyb|+bO-Q)EeiVI#z3B5}+wSB^>8QR%#wfki^`1#bv{J4lQNOYI9q?7fD6&7HMs#bw z${&^oK8)VPXs6u-I+*WLzKpk219y;^Uj`%WyWRA{NLCKmj-o}Xpxe$xsuxcJ2mP+| z&wF>u21OXisL}{{-ohqqE~hjaF^QRs01h(ikRFT0#m-x(@06f<;iHNKCB>fygI&8= zEEzmaaUqO@?9+&s>tx{WgtoP;2@~H&MujjQK9j{-cAtyQBJgIGVY=q~tBH{!=uQb> ztdP&l#a$Ekyzn?&qaOS!=?Q)S62mHocK&5~btKV%mP&*HqyB-wSgi+N?e@-wRu;av ztm-j3iv=;=0&`c(mo{bG^TwIB+$531m&i~ol_()8N!F^(w%zRJ8YGWd!h@Ps%jD;T zl8DQ1JILqAJ8E7(awzPvPM*YRP^P(-2ntkhHy{rn{Is%L>b|N{v z+1E}h&31qu48`69putv!JBZ><6M-UT8rk8YNbIWO22N84%?-Gs7iY1iTUAdB4LZb` z<;A)blipiCAM6v+_)V)P5w^Vc{HA>S;HONxC0X0T%wCx#mkHkgMcT za2Bg*?}jPIKom#}G9`xPN3zj6JxCaDL`_D77i6x2isktC_(0L>HRE|ILUu#+Yx`Np zBrgqh^(2uXFd6hOE&qc#{1eFk-)B&e0pBL&62*ozjXg3oCnlR#0aVD*@E{_n<%_rj zGZMQ04pPJ%llo^lTgdr&3fS#ap)%2fa*6^LJTbh+>qjriyg4aeAATFnai%iZK*h}Rq04pEROyK$XAn| zr5_>O(dMpk1|vOkM!)EYt{0*V+M-@R^Uiwm+-Yr-mOM1daQ9ZE$FQRuFWO+;{0WvVn#%!f$IF5fFeJA0L4^9K4oESj2}qD=3A}{vXgNft8O~V z!mkTDjyxNpG$p}9x-7`*>Ix|v^gQuFm#DDvBDF95iWX##a*m>klw5(cXd0y70*OVs zaAl%GmCz$>xdRr>%~9R~X4`D^Xbz%ZRHNj!-T_dt7_E4FQ;KJMwsY+FzXi-oZT6uQHv7 zIrw$xO*Jx^GY};cGg0H5*a|MD7o+YV`&j51+thYO-W%uK$k3iVscm?l)H8j#?x4DC zcBPN)wfpkWn(?c<$7nB#Sa*6&54{{_bGiBZmN=8+gS-9Erq0xQE! zcaezjHQBtqsSG$5xZp%zoJIGj$+k<*u2#^DYDK0F9S&%)&|NQ}M%pa~$d5^rd3@q? zqn`EYkN`Br=y)fJBh zhub1Lp~^Vr_XFg5oX!$fJeIzJYWGwOew;zrXqBouIF5|ctEUwk%7h-~SWbo*(yrrn zAoN9QdZ2WvxM04aNsMPoq<^Y(7%(-ZXXAI4k#TIjV&(#Nv{<;mqNS&@%h!oTbis;M z4ifnWI)B6>zI6FH|4<~-b0@&_TBIa_-~mFbln;T#4B!4U1pWhh05lx@jM08GRTz*~ zYj=JtLA)+#i3GpU3nC}t2pYnSjfmlieg6}c1i#ch1fn&}D<^{$3!?gdpyU5$>;IRF zxBPIPMSrH;Dt|mu$LCvCTHyU@`q6X+c9Z}g?7}i#V|$c3t^XyJHi1b?r1&1)M$yPc zfrj5BK--jnj*kn!$qgx#BPDu*-Ge@A5A2n*%-&3)FGs8-{6%fxB@V0ynb(8=n@h5m zO4TA@UEWp0nkY;p3;_|cCJ~3!PKFyDHDLartOg(`d#D8Yx46Tw6#cI%&%a|j6&|i2 z5F#*rp(?&LGyhdtwGjIXoBOqBXtmbGYSuBm=1wS4G-(0PHf@#NA6NIV_#c`PjrrpZ zKSFJo04#J%_D$W!2kL;p;P}P;n!$ZP0>?OU=qZTb{_*hq@E;GC;+D)l3~UIJSSnw= zp^5f)d@o~Pcc|hoiYmGEpLKQAn_&teDOODsyxN(anH^iTigk(6V)E9LaE}g(e{8>a z(J}og4;`U>`AOpZupM1raUyb21~IfS`_dZjNn1RcVt|;I_1rb{rd-`@Msz1PBOo|G z-Gg8dzlKQb68_7@P}+3uVEn#CZP0kAU-YWqe;z^@gH%_2Ltty)zDpOJ zt4_ilZMq(n0}>u~_jw$!g86EYG4lT{~r-sZmgFd<V0*XrAIu1vUh+3iK|Th zy?tse*^nZ(lE8!CjpWYc%uBo>*kH-nQK}N|ip7U@LWhbVJ1*Ci;F$GK9^f0-Z{D?VPa*nR)CqB+a`VZ#+0 z;a&ts+BGrZ8oczK=t`2C&C1r6Hcio&si-$zuXjKWFJEnz&w+vx4|0i6AUMqY3>3GWa zOn9E{45?w%noz zZ^q^@q$eo4vSzCwC4ssW!st)Q(qC{n7pEABTJGzySlh%$HdC-pwnjf)Lsfx}rWj|2 z3LyR>oB}4X9~ig(+Is?<0Gs?lv!|aF4uHerZQh zk3nh?u(rHnxFDF?J}R1$VW=|Mx(UPG)JPY5rkLu^+fScl7kK3x3stS%A=um~%LEK* z^id{s%INQY%n3o!kKsVAG6`X73p=gAs2nCYsZWScrp1%SJ#hbC^1^r0E4>92LQ zV?*4tSG(o4-iRP4IAYZGz+v5#51NwOaN*w^`t{02!hOHZMA`NnIe{Z{eWeqaHxqxn z*^18`>28AbnVxyzaMtmSU@i=`1C9;_ zLr^ti0qJPU&h4u5d4c1d4rZ84$&w@&E~hzz91pvgMnW_*s2_Mu^mW0d5?{^tA$(4{ zXtK{^4PbF|=T}u-ZH22P*iZ>|spR~97jzfXbNi+77R_#|55;xaJSZS_+%4-9$|x>h z>=4E5A$|*-)~yQm>IMVZOb1i%I7joX1QQl`GL(HAWf!5bdw(QJ#u6`c5%6o)`P-H1L$Qf;X_)9Es zMa}%v{Y7F{KYlXOK=R{R00}T~GCL5xzAqc{-<_uK%3E@+i7~^gmWqGJ%sFE zA<*mHj#EBFU8@y#T;{%>)RKpip4;4z3IdB0{QhGUg+CDpX3ZLs?V$6pIB*Z2vr$4E z-AAg;kvDJ)?>WHT$Z}F1i#U3Br&K?WSJ9j0&T;dF7*-y||F102f0G#)`~L)7|BhzR zBTKo^@zb-6kQ|j;lg?GfbX*!4%LbwCCQe+>uC* z3Q4GQv7FJc2n2^T-lRimqh9#$QVspH?6z*wQlz$QW_J>GB?=ODRZS#I ziYStrG7gsco%)|XoWR%r!7nh5Trgs)e@jbo6xGl!Vs&k@NdKvyZ1TR?p%iu$|Ct{u zwe`FBDJO@JDDq>RZJcCeIk4!cQN1t@lO&QmC^JN&ToX6jhxryfkb zWSrRBpFeNTE=LKoJLq$|W<=3!M=Pa@lTH*aa1)>_s#`IZL((%gq0G&O@73?d_QFDC z^G!QBJl?9bI4KEGL00c?*p|Kn(5uZVevnvT8!JzV#}9e|Ac zXTodt9e`XrG%LmjJ{Re&b2;95lou*w@xT z;b~Q&50;qm-b{<2;)5JR`Msl7a>=EOS>_x9=R1}CVf(HrgM9k6()z}Heu+fB7f zT9Mklt?R2f7AZ;6Y_?{S>Sq5$!7{LVPxUAAh4-www>AK z=D6Ep0!3{dC4E7;v{$=9WluU;gcAM(vz7B5&>1Dt>l&svIDd;5KGJxeXp+?Q6l-OK zm3i3c{7YvGOG_<&t@rMjwgJB3?lXU2`HR(KUiD)xP=^_Jp@}xXW-_zUfPH%PTAD|B zQ5wZaveS~KS3?09tM%1`@gpJd32A#Trq`NV5lnn@NE?vzg+GC+1e_X95DH!n5Ti|2 zKx^B429_Q-$;)W9p@R89vTT;G*b(E$N(@0B8PN+--yPvz8f9ghLB+mLnvUm2A_&YT zfv>ALO2}(5W0lnH{74x53&8x%*l5rCQeyk-nt%M+^Jmym(xbS?0@6Og!-L3&|3D4@ z0sA6czEju^-HurKiSVr|`bmKD9T51-P41NNZBnxx&v|4pDxb-RJoZiZ`b;&b@*RL# zf9{iGJ$m5(5b*(!7y=&vDX&PH>!G#hjY~PnVaq@Y^rwc){dc|x&}6s%EZ>1C*EgKU zdpl`D*+U#E+Lj*-T2P#&PqFEIkSaLujI!`TsyJV#zf{^u0*=W^@l%*-awJLhYzfbk-P& zQ#?&4>R5I1E)+PlHFjx*I+k2EpHLH@T#pvWSp*UT7s)`1h`$55|4P<7Psyt*J!xWn zGDl5}IfyM`1OFJPFPx@XXTG5Qg6$RcnfQkP*&!QoYs7%Mc;Mcjdr#*{;5WC>eLC7J)$44Ljh5b$Gro3)o_asg^xL+QL*0vk*aZ>6*@0Xk5fez1uYv> zUyhEgQA~SCVio5mE;Z89SE!|Ih_LedzYzS%%glq)nEI zL%I|ls)`Hovo4l@Q#f+av&4`cnO>bnky>0s$BJ<@H^)Lh8D5Z@m^x479}XW3Mudxu z)Ik8mzr899y#~*a24`^bxvL)8g~+EQr%F2ziPzM{`wd);;7aB9 z_)vzlk(DpzWfmV4Zz(IHX^cHyDwh4-Y-9$TtUJ!m0wPR@Kkk60 z_HDc`f*TewcVD9ayBoCUrWs8#yxM(ZNc+Kn_Q+45Br25Jvb1wKd*oTmIZ5tx7$=MN#>5&w*Cf#`|}`d!67VicBX4q@5Q0zK41qqzwq49CEv= zi&cuU9{OrAW{vgs#Xmf(9H}=Tb8g;c)R9IX+2P&6>-^{r+?L~?KAFl5ExU*EJuJEu3~-P`L>W=4XxQ5wn#)Lp@fm7RBs@LXsnO*QJcayRX1m(T z>&S0I%^i0mQFr6lDxpavf{*!b=-OM7foaOS_bD1zojFioU%!1Q&;%ulzVXWBit_1* zIxd^6hctqrfr*(oCJw9+?KSnW-n$u z3F1V_t1aABuj3l+^v0ok%vc-`&Dp7@!>Jkz-k>9LoNA*)uin%`qm&dTDcZ<{-m86F znlD1%O0=)96}X~HbPUteL+1uZ8wR2SbChW!D+3}AgJc-G|FA91P+u+UtAB{jAA$1U zY3#oWg7(dSaAWdg3Dm$SKSJn=pbwQhvExGTB|%&IGqe3maTob`j&4KIq+Wv?+y`HA zxl%lMO1g9Q_->^|w#LU&E*UthP`zoK%2F)(RdM5(WxU1)<$#lxv!bZb$WVU_EK;p| z&mXpWkRWWl(9CdHPQKmua{fuoJd@?Z87ug@`qD4}Kf?N9K`2wmdGR6i0&aaza^F4n zmuosG;ii=5v1i>wl(qQBT6EI(QutESn5uE#2Po(Db( z@z&2#pIXP$Ol`G$7@kPxU?SkwrSNH9_uWbv_z31Zte5pD96?S?li5CCZqE!Gu?l$7{bUlgN)Y_h+`> zq@vuXzv^W3BGD@2C#R3%?Sai$WZ?(tscUHQgPXA; zx%`{_}iB8zXGI(=%!|SmnSF2QD zvM&_&%dEBmhD)CrNS4>fUWf1)T~~22*yJ?Z@>sd8bD`VVv$s8~dvNUnn)-IEgIVYt zml8mj1|sXmZyYu09i4T=W2b07sx`HyS9eyUl0sEyDuBWIL5$JwnAt&2R>_1*oc#`P z%Jw10iKt)rE&%&si(oLqo1}L!O_L|7?A-SLmPK?yJ^Wdpye<8*{k&F8De4P)p~EP% zHEqoxCkO0o+-;N()M&^9gGEu}xyp=0JYBUQSZj+~nz~fZ8jpgd z75^Zb=S(H`R$oAG0q_S4tl6pnB2A7B{^vW{5q`4vfm*CZ599V(d4n(9brG3^{$?KF8XnhKm6y9<(M1mp(eKHpEy--xk8k z(nj#MBq7Ah6$2Y}_UssSPvU}yX1|^rX#1Wo-v+)+7g&~Lt)>onU-wrtGhODzL>o(? z+u-Wq8WC3z1Uk}W|G8x4=np1ToVXcjsHsqZ3sr=dJCs$x4yl-)S0T2eP{K4>=QpBmlh32BZWp@PE#XwMK0rN(tbxziocRt9l2 z1&9`uhIkZ4j{~F_e63m9gK>-ALG+#El8Qi_fh$N!*_2U2 zFf8mRufhLCx5Iv$bJPaYgH1Q{LYxt4h?FwTUA2ne6~1J%@D5-;YO=($3_qz3B}=G* zZmok+>jfk7j<2o9F~?C48@_*ok}59I&%b9Pn{qJRl6J%KT2L`#{H|XleEANDFWDU( zvPl1QwZJkw6!eJN`eM)hvZ9KSsb(}%aznXd5`RHk-RTjS%e>l&oT~2;rPlPSWd4+( zXMpm|zxNIxOKX|t7Z3EMdWfRJpV9#DuIA;7U&vpX-e-0NtlEnZ4$?CPd}ih5h(k12 zck^i2({EwFdk1X!&of`sRdDPYV4jjuc5x?9i-C|9$*hqq+F)7HYLfRxBn*@1Uu2Nb zO>a~=)5|38D36Z(b^W(?xX>u5Q)VNfqkN2B9&jP=aRZX?g28!al?F7yvOK4?FGreQ zVqV9f-mGDR>tT?yg{K{imbBWnp@~QsMIMK~`&%FF zD1*ZE2AVPB2$B=Z08#0r>>hAyAMI`G@Tyg*)ZA|TQ;S8uKfgB$9G6`A^?1w9ZqHyp zw8Z6ZNYD&ID*roR*2;WVdHfylxe?Fh^!zcE?a?;t4%cG6foC%yivr2RBxqR=FXxnU z1}Ju=yISBHCO2OP_kD(7L5Ivb)ETQjJCCvPcUWsIqx^3?|m+_IeBJ+`V zuvx!_rOwL9Q8(m7r35(?4A$d$4#jTlbVC&St1r1@eT~{HL;3FC!fXUMNttm!$5-;c zvDva@_~09U-&qJo@~2MvdS|a~NjzOsl=%B2DlP4Scsz&%Ds1e{yJKXr?(vUgFmI<> zkFMgZF~hp(_VJmcJ4QtmRf`De+7i4as7+u~Z^h{D(Y)pqq9DkUzB)c!`i4ug zmKw$DYJ>3D%`KEj=NbuAfid$n;qV<`l8P1ZwWhk}#V(F^ zLB^J;FY?YUp`ZVZ&RNgQ$C4L5?sJRY;&{+yT`TQ3z(6AF<29F+wVl}`4*qjRXyvEU zy3Aa4852vZv&R=!*5iw(%@7@KirNO&cYt^BIGO=3xE76B=j3)v#Rhm5o4mKtl>~!Y zQ%kU{3Z;Y;>b#~E|6rPboWh13NHsIy*Kf(umCfG-@`fqFzmfGy2Ua9yx@S~YzZ4e0 zw0y=T*N)G9V7YyP*8h$c`H`6A9vHac+p0C{^|bqQ?~8M3wO=~d6Vnn2nOw_T7`l#P zcf=QD#CuY|DiXw+BhbM_WAYfQop(RA_~tc=~+7o1nJ4FEOn6-`X}mm!h9BJ-;wDS;&ZmwkE%epqL7wx4Vn1S%rvMg#a;}d@@nF zEnMePRIdD!>_9X5itmQ9M<~Qk*@2TNa!{rs7THQnH7->ia#l1ONY|1@I0sI}uVf zk%e@WV}?a&7wzTH?OG$MLruZ>^T(wYJiHhTOE2C5KMkg@8CO$)arpT#0P0!K$y=TK zB?u5+IG&7N*Hc`rekKuvEQs z5I9KexUc~Zy#*twI2f_Z5{RlT)?3(J$TQjTgI#mts--Q3u7hM>R2SzRAd2@@g63yP z(2hGoL47cir81?f0}q}A=}v7y(8az40f!e1koCfRZjZ+Jsz1Z!NYSkHZp|U#A)>Iu z>^Y3iOz97Ye8W+HX)1l00qk^$J?7FvZ&b7w_)tHB3p~>n05Ww0P+xaBJeZ?6SY9M} z&KPNChlH-R6igH~vOeiFaX5K|U8}#7)Ih!EC`WsQvnkra5>(I*6w+em?y<6PUaaE4 z7b9(YIRL6z750+&^iJREkh6&NAUoKX#&6ko7|S>#VHV_%GiSvWes5<*Ahk5fvAUy2 z=DVh$(Yjc916C4md? zAgM#p{UWQ)Zn(tmZiOp(Tti$`?y|r$3>$ zdUdNz%s~;!)6dT0hPG#W(K4?zyO&Nh!|AJYf;+c$k1n8Z=H>_Wxgc^nA}>YStwJzZ zscz^U*%j)(L1e<_H=jQK3bRXAGijTI=(>h`?u#t^HQ>Ru|3~^m#0N(pcCLr3803k> zcJb_)!2NR>Z`=ZpV8WE$1@?y+<2wLRV>{Q8Q2L_3?`9Y(eMO_%n3Mz!B10B&xlZAX zM=VD)E8fo7wZq@p&4!>i;H6V7$LH>M3UprF?f~?HksBFOSK$-eBkf76gl!R{?9@D{ zOfewfI2f`5iJ=52hnp93>SCa5{${uu2k9^YR*$khVe3OKSfY|Dsf99VQjGGKGD#bictCjUZG#-t=a9@eWB` zx-8r26GCYnHRhqGA8O3YGn9_Px-1mue%LxN+1i%3!jS|I+wne&6DHGu+fQv7Lb4UZ z)YL{Fd!&1$Dd%%1q!iaEr5&vlIi?pRinW5^|j=84O&Ir3nN&D%?O`HwaQQhY$dO zGXeJSRtGDP<@|}c@^Gng)$aOZmkI@NZ1m(qOOVCyDpi__`{J7*cQdOShKb5OAGyh{Rwege5+48pY0Rl+{} zmYe40N<+K(rN9tVWi&{zrPqZn=b#sRogv2Z^uuToHI2cIWx-+6hFv9RszimiM7{mz ztZk)~q-~-x`Hjx}NUj7oC1WCD5ldPN^&$#>xq&FE>8Sh>G3{evTNXrAP5my)SzgL- z1D8Qwl>)4InjdJ)38OqY)7+Wyy5Ve1U(e9A zS0m|o1oHRqMNUXQviM+hWKyOmiC;VB31d{o>Ay%jDC*VxjFgON?L+o)!X?0&D7>U- z^efonD9@t*F5JB>0~yW1n_g-1toh-iM$T)_5w|Qpa~85H886INM{;wF+C8}LAQoNg zVg+RIX2oHu;zj;&&BW`k?gfew`D3YVb=2FSKTN|ABJ{d9h<>L9xY@Ps`GNbD?aVtB z6xB+=ll{_2d5%vOq4@(UySL{y6--ywN`z9Z>v{M@sLu z37pBE0wi;`P(up^3rS{^xk#Cdu!f*7ZPcA4#SDi$72^|sVX~sjS)@R+@?&)q5RXrj zwu<=~NKAy22Cb+VpL!6nzsS(}wV#Y-ZQ3P%LsA>TuK}FR1O2JJcp)6A3+LnA z_y$s@@COfnvOZmIyg!_zLPVtJCO2DhQ*&GuHoKA{y|k<8jh2A5JXyifotn72?n(3T zJK;Yn;ftGUmvEM%4r?^bop06SZOb>)bX;J^9+}R)TBPS?HjEV*XRzJv&n$3g*I3f& z^PE;wDST+BFefn+5M9;rp~&aC%(uXuzcgF5{MAW>$}&r-zV z>2Y?Est=`#d;F@mgmL)L1bBDt19FdV79k(xV`czT_1qlP>hqphb!HrOy)oqwiDzH< z=zgaTzUvB(s){VEAhkr}BtlQob#L*oCLwBpPKF(du6OG5Ka~>|` z$@(-`CWeJ|=YbP@^87|I7ZVq>mGNo!@CwFYxY5jTkt_zk+_oJL=PvfkNia*1e?t~- zI$h`dS!6amxZkmE=1gnANx$4YH_X-!WVEpNS4_kE#`wvu&I=UH27d~P%&0K?r)}=Z#TU)?S^a7 ztT8P_YUD|KEo~jnbB0W33Vr~lEb-9jV70W2DR@dYJv@$gxuQ9UV-wfj>5#s)_3BsQ zLh;L&-VbsAK}@%dX_Py!RT3>%!A*L19mM7CY~Ey;=xrRHz3W6Oi~Jq%p!Ha> zB+YB;&vB!k%qW$((%8aSdrohpmCgqN(0{VA_)z>)#}iXFN)KE)kWn^767o!#iFigV zk(}pJ>FF?G_IT!_jvicXyTW)uHb0HT+H$5~2(}x;$T_6WptWxq}^^jva>Oyf1=XipVcJL z#-2XPBYUdgRgB6RlQg?S?IcuAj0_R`LNSSpARBe*pUhRzl8Z{0Oc(a~Q#Kwt-Nsdg z7Wp4Y-P6`mp~^23wA@h^j)Rpg(@`YcD<&eT5*fa3Oazw5E0o9GBP6NQM|4y>p3SQI z^vTa5Xq^vQmlB`C$;Z$qU|36=3o7VHeuC;!7}jzPwdZPFA1$7+kh)Yx!i;?5tZi4s zY`xHxek=+ZaLvo<|bB0RJE69*#=Esu_AUR=CZv>6oA};Z)lr?4|mzTK6 zm+_^>(orVz=<^IZK#=fiTU$oKY{3Ok!d>d=WUa>5f{h0KbiceX6G9eU?K*T0d!~PoZ`ma-?`t)mdk389g($v3jo1>Q^dso$USg{K ztT7xMHIj*CPXk^p)&Y6EW|wlbN)_Yoeq&~r*;&hZ4~%7+ureY@EFqIT7cbBjCZf9S z#Mb9c+H2t1OZMOzS?`@;7%s}d?>qFW`Ur}Ps_HBsA`@zeuFxF`}_=%#&B}Z z*N;=-jfs>LeooIS#b_DFXX*s9Bw7vKufEacD1l9hAvHLFdr7RF;{0+HpTyo@xVUa8 zb~2Xi#M;~?9W7WHGa_3lca*6&Lq+K&{0@j6uaW4=&4^VuhM{?ofsq@vdjs+*ykdGh z(1>A0P|`j{^NC~>>CO+niNIquydi&V(NF{isYLsKEI0Wl7yH;ekmuZAzZOV2hCm?o z`$aG73xW0jVeBoV;)=d)&mwrx;O-hMxVw8GxF!@N6z;CUt#G&C7Tn$4-L-IchrIgV z`$pe>V|4fEZ*|7`bgF8fz4lyl{#N2x*8x(#U17@?#Mz+F8x6v?Sh-j+u~IUP(E0$! z>1P%r`l~eRb~knBr>7zj_)`WuIrD^2r7ph&6h=Y%`oJOzlKa`FBf0CfbHB>3m-NdG zY+*8ZD$OZeuZRlNNk)*^Upa?pZ}{%_ArbfbTWxZeZL|+jzi6wi_rZOiFG*CIT@T2=_#Z;Xe{`PxmL_EhK-*#~2O2n!#$@$aHaB0I>|35Y z&>ut5z)D+zheCYn_%lE7-02X6yG&!9`uC z3rQM>mTrbF6d6e+Kj=f~2MtQV|NMskrHcKJ!P0*oNeqv@+H5?v%4Fck%)PKWcUT1a z)4mon{oE+Hu`1748z(E$EET5vx*wh52IH9-$ zGQ|w#_~)_}iyw}W+8dKwdb!0*5ZqB;e;*Q5%D|!b3wM}%Bjw*KM@Eh7%4FzV-wC!Y zO%aPp;~ml-**B>>(EMV(CvztTeDcbqAaGGZf2PZ<-?ZgL*;Hxajm%a}tvkZ=|KucJ zvsk!C1>H&^7n&*(dd+Os$)R}mxaKVVHEGb(4%%@ z$?OR?$7Iri@PJQlrtlzB8IN5RF5YQPYwww zs)>Ty!Z-EPi9CYDIJY;KZO+0_cNLu=F?|}ZyTdh!fa3_rA6!jIn@_YlZ{cou)$Fb{ zvzee|0{45~NG`%LT?GwGcC*$0J;VudR&OKBZ&a`)EVrL#x zcV_>mqx^-n+l4Ktu8^-TS%L=gGU)nPUWu4c%d-g7?$tkuw|t7vpR2PK6jYkq>5ryz z+b4MX(G?#XLBYaoR~eRbZk2G3Fym2?0j!JnY~Ee2eaht8LwHqf z@~lP(Y5xGHe+h5y82lTg2 zHeJcU+?d({iI^Sa-!pD?)GRv4MpLV6b^4s*h6v!?)#47~#Srd0_&NlfbqS4sh%jFX z)rt;ev4{9P2>%W3q~M<5IR-5)c%?CDczpoy9BuL=1MRyLrnuIypuOtf1Z-eqH3$6?m&R+z z_uD+cWT-_X_tc5p;%Rc^(ua=!J7$NKyIp>q_`WLmaD$K%&nnFYViIM?3t+HtPV@Ew z58{T=ww$ZYS%4NmMGSwrnuILXdI_q&x7s-thK%LBbYcgQ4>1p-Yb!$-3`3Fw!kC1b zDZ2bCai#d`_yR6$m{RTb+!u1m48eQ@qNetZvV{YI`6u#nnnRK`P3%UmpI9e@Dgd4P z82GoMam61ls;Ru*F+*TtLzlUtGq01>+$|Z)5j%Os9_;S4xjby^M$~SlGlfN5)gMTL zQGHwlmxeZu^iBlzomSpUGoqMdyOyY{4cP*2{sF3m#0X=0_7%{Drej@Z#HdjKD zA_AiSHm_J360np29mUYR(*fv!d#$YKO6mI`mYvH*2iL;mS@)9jEFyk4@MDDP4yY>s zi*StlK!c#8c*hp(?8)mJ_U%$`oP=3owe_ye8|1LX+Ol^LQ6_>)XiO<3mUh<6)_K9dd*dh)68(U4UpX0QFaG+b7KM6bR1I} zZi80w?T+b=JGPtzXNFO3%F^E{ZAT#es|ytoBC`H)ev}Y(j?y_?P`U@PvXHmLiSAaI z0~a4RDq|$Hjc^_bUhwcyOk_`4+i&xdI3JYu{FXNdN-(ps%dg2UF*y@%amF|4v1ACJ z%8(`3n3wuHjw;`AL8I z=6BtW(XBT@ZN$~)Mk-fBwHYghloqgWt1 z`4;ym+H1mm3UW*%lk~qHsuKC(ylMW7m&%mWH){y1i&K8XLA21227@l-(vivHu9Z_^ zk>WlXHOY4^PDzed-}PJ8s6EL>t1Pv+y<%b{oucm2)ZLyuZP|yZVD_k>AWHXcV)JzF z#V0FMs1C~i*@kx4e0NA~gqh@KFP#eAV|p&VHp(fu{Md5n9m6VZoyU%K?JZM$EJa9~ z^rZ`%%@6!H6ULbg`Er()tqBRhTOlZwi7$-TTy5@IYvrH4D>{2r$?8v@N>?Hd{sx=e zkkHN^1x1BF7_z93=?#pMrRXf}?!vcgSPQXadVC!KLcCW=!9c~f!!*f!#Dz%;RZ9mE5J=5GjzPnDBOmrF}_OLLC8-wC%5kQTSc=-{pI$%*%|XTvPhlbqSK?3^)FEjJS|gBBGb*A=0EkGA-sG4^-;MSIVy)W{aOV1(7Qr- zYp@}!h!kMf{?j%YP69q{DarT|zPOe?G^l>J=o9 z>81G|HBQ=-V?e7e;f=xI5FarjJShEQ9-w#`Y!s32W~`jJ_YN8z3hgjot>X>(z~Fk& z%rxRWiMe~?PG=Q7Fey`=E{0cT{)7S6{S!Jp8rtO}6@3NsH3qM(?v8}TP&L$ot$~8H@G;%i9oMsJ@egLnO$r)FKj-pg-6(dA4KxPc*G!U>8yMnVtEB{U-Jdspamp|!LHZu^58(EpuI`=Odfe;>K4?Z| z@$mcBVXE%nR@As{nSa3|hz$Ank|T}dn(8)U^lqI!ksM5}-;rWYS7_U6sQH88V2B$} z8i$HyNv29f&!Ot7?k~Tl)vyo#G*hRsNJct#(A5EeN0NXWfTAJb@n&%TKg!|%{tjVx zB1f61zc&hR&TYBi&9roX{J6zQ{SgvGk(enQUZ8nBO0$39(S+J_4b{* z$+8Rk6iE#B!$@E%@^+(seISH{>x$sZoX}wOZ9sC3zbNP(K7orJmo1!B1eV9!uYxvh zZ;kpRw3%ogPAw#pA2O?fW7>V= zj-%hJC{w|7pQOG0+5`TFfwO}-z4d9mGoQ^HFQPP1^BXk#e*q5+!AT9e02-_L*|hs8 zg0CV)o#%3Gc64{6@|@3hZ*QO2qpxHAdv8>O9KY&z``Bh zNiJOJ)>Jk1)ooL8)NZkq1~!YB%mfaK(kcw)f8BN$zBYfOHE4;uxHYd@>eq|uZ3!if zx^6fF(I~uz?qo2^@<9(Zd#gt>ey1&v?CHMY(_ce;;Oj42m z)T-$PZmbls=~iWGXD+)G@^kH;mV!Os2{NId-qrsw7Y{cx$; z0(}zvc{sJ)GII&c+CGVYZB&+96H23buiqiNyv=+K<+u&BSzJ@C?!6m=1MmbaC8kWh z88t)v6sE(Hro59_;?~B~5&8!;E*KRCUbzY^dF^n231RZ%WP+#o$#W}y4cch0MP4;B z4DLS>ce$ILtv8nIet453)#^doevTKKSIIHg_sc+oFvuDfguntF_xq_)4Tkz@x` zdldM#RUj49bM?ME#OS@jL4Vt zq^1+WYUmc}wKgn_9Szmawr^*ksjk&A`^v$5ei3E1qvuua?_;BJG_e}XOK?PPhR&E( zg&{RhGT$;QWk}PjC^tua>9a9h>Ei745~Ooxvb*WA>WJ*~fO#|(NMtVt0PEUwP?bg! z1M5$7yCMMJ<7Oe>W(%zqV2|{Y*RMOy%1K=K&+U`XPc2FA1&dcz0lrm$!}h#4Hlqda z%p-O(qc_8XPD)fiC6A=-DQRQ*WU@pS^k~HKKz;x+(aJF`o99 zo$N3^-^e86gJ+U|0EMI$H3RPC>&;uC)iVxlRmdi0NXu)vg!!sZlsoJbt5i6x?!;KS zATK>V<9QM&-znNNDw!{xCQ;WxAnd7O#HYNoZ@)Y{6_{N1-A^3{-XIJtGP)wfk7Bs} zMkUK0tn;0tPHFY~clSoJE#0%b!!|D&o7W zqj;A2na^I*jj&Bh9piOZ@Ax~hQtj#=%<7U9p1k&($X=SMN}Cb)UN0U4$f-5DhZaZ) zO{LG=w{DtjUY~s|sdeI%Ufr@F%~P+`?VPXh+4GizrL}C`y=bce5YMm*D}<}fO3|1z zgBGj`En{S>{F)A`B0`lV-oRP&gWFJh4w^XTK@na)pW(Ao%gTrL#I@ek0-N8m&6jQ8 z43JqoZOc@BGPP7N*t|VhysSD<`IWGH#7V9X2OTz5-?XfW=VyEG-bOUJr@^QXpxI8G zy$1Y9>s7^3Wkk*STaA#uv$DK7=jEN5iP)(4{i6-rtOae#d4rcll+-m3@W%j+vIqqX zk#Cj7McFh*Xtq^x93B4*@ zx{@yH>Xj4XbI~zoHjhxouhpMIziq;VF>20OuHefqo78BsRYf{N%V4NnYM+YDu|&&%uLyr2&Cvd5Mf-x~(>-Y^Oh#`o}Bg zE`KA9ffME8dD}z!Gi$a?W?EKsdV!go-oBBHsAvbg_4CTUBB;Nx8zFpVk#CvX%Pnnk zGT3;oo}UT$Zk%m@#yzjsJLyA{)Z>zsqXxQDVJ%R>;}hyDL2hcx)7G|hs9qLw+S$l= zL4mu|BX~05Q5fdsj|N#|XiE2%({%KkwzO6?7^;@dsbJvCW01zqBW9I01O7}YOn)!@ zkTomz2adi*%6Sio1o@Pt5S|OTbC9d?d9Aq+lqyhYptHm-0NS-f1;Wt8nZw*M%?L@} zE2eLi^Dsx_8KG-THRxPr_8vyyAwhCJ9xU;sMwL8Pk}+p2)lD4%(MLT4ypodZ@L^Z{ z>5o=RH~s8FeiiZEaM*i`mRaSo&vLe>|%dUhpQNs&6}CcyE*N(=82!Iz`mTU=QaBQxW3Je+>k#CQbS7f6OAgy(oku9fV1(Oq* z4sJEKF@L#4XKwEOvfBzp7*(LI*2yp0HkR(Ed-`=?DHfp=?8@_<&0Gu9gxsq>(b}Oo zrlI-mz}zXvzkO>5v7aSyUyellB;!K%efRwb_&h+0*Y@ilpqLi+AAtN7yRP!Wiy+NA z{gIO*2TFX~`ag@vf&ri5^q*-y_+ANeq~CHcXK|rva9+zOkA!~a3UoAT=)ce_0NS;N zgQFy!0t7yUqdnB5BtXk7F>+LJxXe(m3eX>MT|SBUplR??l~Sz0GXV1A7Dpr2r&n@z z#2hNeM}GfLNv^2!Vdhk12qq~)b;&!n>V*cTA@D3@nHZx6V1eC0ZfYemEM}qj-}fjG za*)J6!sme`J&Fpt(9mdwVj!}`a_Jh7YlT212{*Zn-MPPRb$&C6Yj9hbeliX5B}{s% z+i+!{Aova^AEog&dLeil{l3Yc-Rz-Jrg;ZGg6^Tt+)OZF*4nUAc|GZe`d-?%qv^>Y zgm3pv;ZdueF{~q2Xkap;E|Ku_Se#ULQ(yyc$BMy#pEBR)tF51M58Np;_^?AO+S0rH zGCUF_6~pb*wYz78GHeb%75F-EQwjm=(1`W2UbJ!Z==+f>kx{i@P)YNheCZlWtW+#ZgGFblFR_`R3;8)pA@NITr`wIlZD;N260c79;e zz%}f)KP?|MTAUeqhv#b8{Ku(!gK!RZgi~}ex2yst%`qO~1=`)JZ?#fJ%1AYrJLsf* zP|!*(EjldcMTQMy-Syu^sXJe|m{rT(G6Zwu2?vCd+)c^*Uy61;%VPFd?W^f%l2m2} zT~<7eYtD?;lrmYWCy955u|KJxU5_$kd7iI%JhK8tC_;%I(lV;!b@hyTQl^WK z-*M)}Bb2L?iLy4Vr?;O*5xAn?!PIxn%`2S!TkD*}wf5bo43jIq=SEnXHNs5)bb{=7 zT}z=;24s%vdY^#pbBci_SScoP=dCW}{(edU^tW`C{}m#bC9zW{jQhA^P%|+@KlB3) z-~@sO6{HuoTPM2v-CQn~xv(z`-pi&si;fbx1Wt`TeP^$`m))dQN;4h*>w=o4;zKp2 zke)183Be4$K9W;yZlp4aco)FgkSG0dMbNK#jFl&G*2IhThpouTpTf4m;^k68S=SsG zrM&T=Lk~$`v}ZPfDN^MhOjAzoL}&SAR?KG}Zj8sX-7{T$l;+)!V!D@EAKS70V0WAK z@sv-4}t=&6Vf->PW zSwpI=ceS>HmxGcweVeLtI+oP8U!yfkLJh2FY>q=`{#v^PdmCICBgDD=AgDOIJN(in z!OYC86A_WAF#wqEwJkY>&zdW>I8e7}$x?W@l`huqY zWdQzdkZtaXa(dLm5YE6At%D_B9$X?1ZsU#M`&m+HH8Bx-MK{=J-*74Ig|_Q+M4Fr{ zes30#^ABM2miJcw6VfW8YZ${WHSS1EK=wWCw-~S7j!@NJiYwE()4nAbz6KR783+~Kn zyr_`ooaDG(u*qNxa}mBXG`4Sisli_42~6UFqTJ;V+8xr2e`teNt_xZg_6y%(|E3=+ zRsXh-jW)9z0a^z5x~csGh)QQizQq|A7l0<<9I}<#BT>HfeHp1CEgV#pT5Kq7`g}`J zk40qQtO(da^G!+&$TW> z>kA(vKC?*3ozTfia%A~l(C%+|j|YvlhTwt!%=lCm=+Yx5Jdzg=rmSp7s{F`JOU%94 zEvElnx|Bt@j#?fIW^q*hjeSktp?+!A8GoaBB>IZet{W})+V-6-(NlG%=1w+gtLsT_ zH--;(?OsD?=1FIIstKx&ms%n!_y0^T;FDV5siBRU-|x)XCDR}LxRBMdn{nnAe!H8M zqIJE0FN5Gi(uCcC>PO6khKV*)J|v1sk>xHG*CC5Pvh#pFOgF1I%;UZjR2pyZ;4Or^ zJL@wEI1j7;b(oN@Ft8fZi5!3sE6qp_|58#z@n!6Abm@9l8ru4P4OJsTtGEY~!FC`x zD`4^=3*eyRFs9BG`>CSmm;KP{fAu=5hIwhLjBE|4@AIWatrgHtmOJZv_>4CEp?ZJ3 zU%EX^Xc`oXPC5mCSiI4| zdCGQu8SAvaLEy8$e(gbN*u;}Y(aiF}zSb-VZ4kR3*00v9BAzZJe^Gl)Qq%j|_77mH zw6XCE_AtE=oe*n{~09SL~;m-j{uEK0Kj zBKBdM|L@i+PELLxpz>|X*Gb(%o0uWLJi;F{TtXa%Kf4XXE-hoDQ>yI8*Fbe?rqmz2 zCRzcoE(I&!8Vd5if8i*rJdBUnc`uciOIP!^;{-9f#DVa|>2?wT;mBD30cq{usmQ_8 z(1jxew9pmM&Cme;H{;a1K&_}TSK~uo)`;Ae=cMEllTx=iaVE7i%E?F?*MtGqKoP5g zH84Z^!{5OuV6#a0nmSMn#>ysk%Yg)8Rd#b@#;dSFL=fJA$W8V_u9hf|OqZ24m1zj| zyII6z)3#BF9LV(z_?e)1ac9p=kQJml@IXZ3IL)0OKN{YN{EftukYzw~@YTUdX<&x^ z{^V&AlJ^J-KcToB}Vb;byRKM>1~PjTJVjxU(baZ zdPt%99<#__j>f$aRc#)%1??$Eas@E0EWD6uF5L}R?ZgQolkoC1@~wL%+`9b(NccGUWW47mJhoP{ z&O?2-zjAhe^@kC<9Mi)gXAOnR5MJCRpSNvRC*DK#94;D|TQv?MdyQ zjMy>DUfYXvO8g%#wPijsbc%-Gx~{DVudV3lTSvZuhE$7 zAE0?cS8?Xp46Z%Zrt=$H|D*r2mpe?+cD&8`In{)MO`F73Ei(hH0h@GOt&RNu! z*}3iIH1(C})JIy)EHK?^8z`ZoCrcPF-S!>y1hV~1@!PlW=KIdm;fvkRTX#xLdZbo3 zGkgWwa#Vy4_9OyLqXef!Zk3Zy73tr?Ccz|b+kt$+O?W8u0h^T~nfSaVl03{~X;^u8R`d{$fMxHZsIwvC%$!|ge;Q`v8LfuGpkgj$KC{&-*yGg+!8Ab!CpU7f9; z4bY4HesbHEO?!raxwOlABR7h-Vh86_HfHbO)u^@$Ygs3%OwS6 z6@`hWbnSSQGvovOKJM17OQgUSV>mQ!rF=lj+bo4tlnf}7tS8nF7p~=Uq$3BL2(|A6 zA7QF^?oQ@z4{;abv`ig;v$ZtiH1kkP+qIcYwGLlqm;KIJ* zn=S;anjMf)zL@v=r(!;GDo0Cq z=95|o2sIg_=h^1SB=q9bASRas2Sbxhk%I?H;kEl!WH1k7#(@hG5#F7;2NDHw5wLXAfhlf0*mAl^V7(k9KYva?~@?3>H)?QqoG z-%+%F|Kx?FD9Cd4bD{pD-`+6o%GvBXPxRf6orN@sbTqTnd91XKc7!Gk|9!0 ziX|BFBTG~#ci*sFW4#zsm=ewwk}!~*jB7j)mnV2qvr7d?P0VwGuJ~XXVOqgcqWunf z?_72k?w`8uhly$IEYqj_lrc*rxng}j=zYt8Q2Rl3bLYyRrTCycSrwv-W8<2~Whu*n z!@uIfQFLecQrC^ns_4fpB0NIRNjQ(tm$d-B2*=cxES!$6IzrM1#C|6&jiXH4RUHO} zX6fy}xN9ST=fY148~egRm7om_IPz)E5jF~dYB|FiIRh{Zo(zDenyV5V6|m;P2pd7R zh_O!bu3%N1xgQ4Wme~6EaGaLcAd^2Z$QTVSXRMVWWTXhuS?`&~lxL0Z9Eyqr8{Z{J zt^*4mJ{F259FTL_*VSRn;R^lPi8GyzkT)$%F#a0QA5QV|2Up*8YB;y*fifP0U>e-tAxN^aLW?(O>QkK-fKd~#^}GAy(BP{b1a>02HPu?SKrq%xm!(Qtg=4#Y8{ssJ~tRDC_5B832WsC z;}x&SP<9#Tw5-S9EPE|4xqdMHF69iZ+Y)SMf|FgzwE;18bursgxOo9VB;#zunXyu{ zqpoNZPw+$$wy;>oZVY(*f3Wz3XVjasV~Il}2>(b;1UHN9mde-2E5gvuT=FjvtXzy( zq-lL3ktyv7!qPF}4n~4>B1xG0{cmMVU7PW%ADrGNIRHrsX|H9oJTZ%aB5S48Z3A$c zV7oKdFh2`>rAH!u^gK}tN1tLvy+QD}qBs1>5=e4k$EWA!Lz>Or#pQ?bWBBv9hoZGx z_^=Q|W?Y|IAk|TSS?o>{r{juZvK#{|4v5QfGwNqx0Pzps7qClabwZk_G)x|}MkR2BKl2yWw z9Ve)2NdoCoN8oZ%T|eqc<35O!8x)GPqVSJSW0W>(yJYPan_YHTR71Gh1Jg4?9Pj6$M=% z;jRRbjj{g$uu1eJLWdT>26&s1Rhf7t55-;K%=@TG_3Z%XG=mrF55st>LdErVPKKYa zdf$Brs5{Wh%rImhJz`C{XNORTz0?@Tx?0$ry%NqSp)i~7JB>t8TMazUa^ONT5ve-u zot&07f*bW>ngk;&04qR>Y->d-u&@fh1vBu^f4etX#jt+MO2`gVLC*xgAGFR@uW$?g zn)4H}t&7}T z-2l|q`+t)ApjR?>lqK6|Qb!&YLJLr?LS^1d1B>SuJ4d~J%zeHO7{$W)0lWdf8kv^c z_!A%2iP7$nt$qYYUBk0Uy+_ZBv~pcQ6;2=3V;A4qw2;Nm#{ER)hZ(Gow~~M@Ce}gJ z@(K+2Mr&T9evjX}vR+AYSG{oMH@2gl(YAUQ@~O`*DBK3kT%A0IB6ilP$~M=KmpQ&x zRkVD3I(=!Ey4~8}f{Z~a#|FNlS%viBTnK_PFB>VZ-a!@qkIJ5rQ7fBweq_lvciV0+ zHjJxYR^IPr8-{~Sqiyc_oGARwe1BP>^ht@}6W(`}iO!N&mU-N=BGYE0^s|7lt20Ci zz3@ka%B5Q?{`VXIXhHvVW^30*O0A*rHFsSjo_V=FcJkvLKWoEJeTCNSV8=ZMuQ}+? z#-O(E*Kbadi=sYs-zwZf;NEXMjK{yt>fJWDbG%eWyEauSy-)s1c=YnwY@FH%=NHOj z(t%(b)^#*>Dr&PAQq(PIf)v ze&rw}aKF@gugyH7XnCdXuZKGcv#CHx$7uCYo+a);X~# zU(x(|_m zcmR3jL2#$#%o3xoMJqO&nr@zJO=(#cmH$hFVcrrSrbxIjlaM@hx7+Ky@u$70EAGN~ z;x~m7BBIv(N<-hZZV6pTZ^USKxR6`=bnF1Z6w?$d@fr5u-%H=%YtDRcvmsJ+COw&p zFLg1H$!*-p*M)N%AZ57w&lp)8C05ThH}em}OuO0j*?7B;*?kz6ONU>oR~rezaQK6! z4H6i5TjJF#@j}L$7--XtxM#vKn^<$Ql0^>2?w5AUPw~fu@q1=NW@+xI|J7)Xlc!%8 zsqD^i{#E%$vSOyUPGOQ~>_@M&hpUm;?g4Xyd#!cD64>0b7<2m=+i>3en1DGDxq7_? z---A8^Ssm9_iMJ}T4Z?!J|T7}Y*izNiZx#50FX6Lz}S_xO|>LG3Fo10>oiigb=C_y z7NFY{rQvOAUd!M~K^FF&AwrJwjxKf8e_|q4L@|-N3_`E{`Ce*H)JsvbWt)aq*3bx- z9_rd72brhJRvc>X9TkM~g4|xdUTK9D9ti}FV;)uWF!*525KW17sFs`xRES^Uakp}q z`0QW99Nlbxy+PCFN^koOQgx}&9xb)>Js3(Fm#p76NHQexyWH~bA%`Xqt~Us!q9e@L z1RhQdN>4qTAEWov4#?BW86m$BDYqBrFor!Qm(LOWOO8DA2Ev{P1V{6Iz6GRFSNM>n zGp|omfOGqwh{Lw6-GKV(lJh^Zcw?bWsb4YO(^v6Vu(xkw!b!y~*DIVuJ_rH9;ZRHHFS6{shfG>7bFA0r zo0y|~79Nx^#Ci9&1Ovy+3Ch2N8&+<{eGYEF)cC7_-B6no%XIMAc<&Cb^KmVQ*-e(Q zrgx%KYk2HBzqr=MQ0yu_Jo=DYx7>MK3DwT1AH}`ocdtsju!1#gF++GfjxS-PGqLg? zWT_%H`^xMkF;+cWOOGGf-Z{KOf&b9_7bWB#rBZ! zy%^+{C`r|)ZyCjrvIg)4qxZoW;*HDJ=1b$K@s#71qvBS;F+hm@xO0wA?(jLxM}_Tu zc`7;a2_4RLk|wOAwl8u-0+^S~I!7i?PXUJ#rcYSABS-Y^vFAJn2UzmYCH46H%QdMa z1`w(E;iKa+fU49HJu+X8kw=CYMZ?I( zZN<{gDyT~1Jc3%UM)6lSXQBP?bbXFSAtv=b>AeAJ|8hrtm0Hhep?BHbQa1)?ZG^Ws z91BCnN_D)eIN=KSEnPZ46iWnzT9u69$3~1I@^N*3Ea6E1I03O4J^qHqx7gK#b&H;^ zaRDuKIqD}S0fC+U)mz_Kkt`;*tud0|_v!VgV;oN&uJc#fKdLFgBXawh7Eo4CU)G6; zr+jXn=N{T=0@?7j#9;u+AwJLX6S?TYH6>43v>6#fx{gQfty}MMbQFI!+GV!LCkk`# z-}{@g=z}!_2&XS){9x7)9HPPj#A9`6$fF-6H%0CtpxHm)T9n&jk?|}umU$I2RUDWH z?kILBmG#HW7({3<7{@Rds(X-yOT#^lMB+wf!SlmKs{5k{kfONEApQYRj&6L2@+@!} z6rPjk?RQc`SS*dr4NvvJl0GnzTb=3Y3=4nSMGN{pSz3ZmgWZhz2oH~hb8QDIB4$Ui}oYyOfiDoyWTUExix6X{sGNL zA_1?-2|v{q?bwl;-y0NWb73a6y-HT+hZe{9Do7YQ#hF4 z86~^KjpL;g5zQ417~8t9>lS8#vtQ-tIh!vRpJ_o;kotF;d0HQ3hcy99S(TukH%}%X zrhfq0N;o%PscbrBeJ1!TnS=V-U0HQL*nVrcbtjY&A>H>R5y~;(cJENnObWA2AYNyu z1H@Q*JL~g{-N@W7>-^o{cD0@R2Kh1nP9`Dd&&OAqCXL#qU*#{WvzLYgxu?>y3h!_a zt6xazD)E@H#>QO3sL?4aAlaTq_7F5zVr<;Y`f;a;tq2ll190Pgd~y=Wm|{?Hf57nb z$_~dJa?P$|VeF*+v0}OEj`5tvK%*vc<668vM3X__cymKBIdQ*zmw4~1XZe?QF4EBn z=K2ZUU$}w-S<_&tQ*c2eT}jc6`!R5e zAeT+4ec4|LP1Xn;0!R@Ld|XL&x*}mY`PpHXPe5#0)`p8T6P||^MB~K7B;`aKO{X6s zidetHb%}_G=lL9`DfdV}n8-<0@iR#$tg3Tf!85Cq#RRJ5Lk$)8uV%#94U$2&cv$s8 z>v2v(1(q9&A7-V9ku~CQxfo$O1;u>-ykX0?vhv99!E|{RHb2A0oU5v5Frb$TuFv$? zfjX4)M}fR1Pkv6s9dd8b0AS!Bm??EnkD_QrnrD}Eo`OU?9!{_2Jv$)rv3#leaI_Hi zD0YfsbvKs1r};Fwv=O~LaX=1j1u2rkPe&y%8%5i-Cx&;g;FM-~duE9a7b9MyUn1+B&9TgH|i6`t6- zrM51i1-0gst^=67-}*864tbqG7dPXtX!yk~g{AmOPdw-y`-z31YNs#63mS-Y{pO7; z?|>R-^L+{NLsNm4hQRijgZSsyg5+U;&Rj?8Yn^>Q-uu8NOyw-G3cjxaa&@i2bU}lKTgrj)(sLd+xdp*pnW{^w|C;ffTuA~42vyLNkOEMCxbXKG zmZP{vddjo=ed;`JAIH8mv)p|3iB-_}@}$c5gm2t826AO% zt@a*atG%TKve2poxjqmjKWg0Gm5E%RJ1#*%hXmKK4J}9OXdW+Y>X$;TRW$LV-z{rM zBw<1IgSdxneIF3H@GIPmkgDqp=$gT6k9}ZA&rQ*T-Fn{wCSw~LCNuoUG!Ymh?o`9% zV~ZynpM&ZmOOF>ula%@jb5YnPS5jHy%a5eHHkR^$JG@NGg>S-WToI~Sl(Cl7aCxD6>CZdz|5Y=6eYH~{~9dGIFC2u=Cz@wpPNB6xTbBK`?0Fg z9%MDsI^7ojI%Mzwo~Yk$D0z@!ix^>&Hu0XGcr*bCiI&zdcYocJm>D$u=#1%Zlyu=d zA}AYebUBfAKj*FnY#edBkPOZ?6Ah_v93d?_&KsTx+5Rrtfk^tCIO!%`bGb(<-01+~ z>sURXeG^vlMN6MHDHAzeFnO_UHM+2GEr!mC1Og$doVx)epRkd)+wKkaokTIy$bXwp z+&9_Zii~<#IRE`yn10y6Jzvu6sHh3gcOJ&|CZAg6B{`Z}nE&JMj%-wdUlEDomMK2n zi<8I8LF(_ZAfE?reZg_n-`7AH|0Xp zk`$mjyXx0P^s%VAI`&#n7ryqqDw?EfoSWY4?)jBbZ^BqcWLS-9WIQ&R7?|^z zNFZy$leH32qiOw0Gu#LmRZR3~=)9EJ8j^KE6LX$7Z>~*rYJhhVNz)|ECO#)N1W3o7 zOSIG|5uJk8uvpfA!aNHUxgVa;laN2rAw>oNy$J z6{KPwc0}gUVV-5`Jgm7R#Wg&I9*Q#(&JUwH1}>h41tIZ+y0brk!c*ocHJ=jWKT%&` z@xC9DiT~oUonnJ|`7zsZR$;=|bLchpqhYntQE~%@Z1flnpPpPf1Y5=Q%lGZ-ieKsN zwZx8zXNp{|c>W_FBRzM50QzSmC=>VRAYPWDGL5Cx)Oo`4ZaPiAWkbs> z8E4gcZPg4sKVq#H(}d-6+rjc7?6IOf!TOged-;GJcFGK-i+kq8 zuV5HRKmUqe{9tT!

uQr8ZXrPNwfC`|cGrhfQ`bGxuSv~1`wrMOSP3v7 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 literal 0 HcmV?d00001 diff --git a/assets/images/icon.png b/assets/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b5ae4e8f7d99610c0792c204c58e57b561164230 GIT binary patch literal 10124 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 Ljd{7L=f(d3S0A+I literal 0 HcmV?d00001 diff --git a/assets/js/index.js b/assets/js/index.js new file mode 100644 index 0000000..3b38ecf --- /dev/null +++ b/assets/js/index.js @@ -0,0 +1,16 @@ +/*! +devtools-detect +https://github.com/sindresorhus/devtools-detect +By Sindre Sorhus +MIT License +*/ + +const devtools = { isOpen: false, orientation: undefined, }; const threshold = 170; const emitEvent = (isOpen, orientation) => { globalThis.dispatchEvent(new globalThis.CustomEvent('devtoolschange', { detail: { isOpen, orientation, }, })); }; const main = ({ emitEvents = true } = {}) => { + const widthThreshold = globalThis.outerWidth - globalThis.innerWidth > threshold; const heightThreshold = globalThis.outerHeight - globalThis.innerHeight > threshold; const orientation = widthThreshold ? 'vertical' : 'horizontal'; if (!(heightThreshold && widthThreshold) && ((globalThis.Firebug && globalThis.Firebug.chrome && globalThis.Firebug.chrome.isInitialized) || widthThreshold || heightThreshold)) { + if ((!devtools.isOpen || devtools.orientation !== orientation) && emitEvents) { emitEvent(true, orientation); } + devtools.isOpen = true; devtools.orientation = orientation; + } else { + if (devtools.isOpen && emitEvents) { emitEvent(false, undefined); } + devtools.isOpen = false; devtools.orientation = undefined; + } +}; main({ emitEvents: false }); setInterval(main, 500); export default devtools; \ No newline at end of file diff --git a/assets/js/jquery-3.7.1.js b/assets/js/jquery-3.7.1.js new file mode 100644 index 0000000..622fd0d --- /dev/null +++ b/assets/js/jquery-3.7.1.js @@ -0,0 +1,10713 @@ +/*! + * jQuery JavaScript Library v3.7.1 + * https://jquery.com/ + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2023-08-28T13:37Z + */ +(function (global, factory) { + + "use strict"; + + if (typeof module === "object" && typeof module.exports === "object") { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket trac-14549 for more info. + module.exports = global.document ? + factory(global, true) : + function (w) { + if (!w.document) { + throw new Error("jQuery requires a window with a document"); + } + return factory(w); + }; + } else { + factory(global); + } + + // Pass this if window is not defined yet +})(typeof window !== "undefined" ? window : this, function (window, noGlobal) { + + // Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 + // throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode + // arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common + // enough that all such attempts are guarded in a try block. + "use strict"; + + var arr = []; + + var getProto = Object.getPrototypeOf; + + var slice = arr.slice; + + var flat = arr.flat ? function (array) { + return arr.flat.call(array); + } : function (array) { + return arr.concat.apply([], array); + }; + + + var push = arr.push; + + var indexOf = arr.indexOf; + + var class2type = {}; + + var toString = class2type.toString; + + var hasOwn = class2type.hasOwnProperty; + + var fnToString = hasOwn.toString; + + var ObjectFunctionString = fnToString.call(Object); + + var support = {}; + + var isFunction = function isFunction(obj) { + + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + // 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(" - + + + + + + - +
-
+
- +

Kamoliddin Tukhtaboev


- About me (click) + About me (click)

Links for u

+ + +
- Donate -
-
-

Hikka

+ Donate
+ +

Hikka

+
- + \ No newline at end of file diff --git a/info.html b/info/index.html similarity index 70% rename from info.html rename to info/index.html index 047f8c2..c419b50 100644 --- a/info.html +++ b/info/index.html @@ -1,22 +1,26 @@ - + FFF + + - + + - -

- + + +

+

@@ -26,11 +30,9 @@

"From Uzbekistan (Tashkent)", "age: 0x10 (16 y.o)", "Kamoliddin Tukhtaboev", - "Python developer", - "Backend developer", + "I'm junior full-stack developer", "Telegram Bot developer", - "telegram channel (bio): t.me/kamolgks_bio", - "I make custom projects", + "My bio channel: t.me/kamolgks_bio", ], typeSpeed: 20, backSpeed: 0, @@ -40,6 +42,7 @@

loop: true }); + \ No newline at end of file diff --git a/mods.html b/mods/index.html similarity index 84% rename from mods.html rename to mods/index.html index 85968e8..97adb7c 100644 --- a/mods.html +++ b/mods/index.html @@ -4,14 +4,18 @@ + ShitModules </> + + - + +
@@ -24,8 +28,8 @@ +
-

© 2023 ShitModules, developed by Kamolgks

+

© 2023-2024 ShitModules, developed by Kamolgks

- -
+ + + + + \ No newline at end of file