From d8bdcb8dc8ee0f4c64e8582e1c59a4755de97973 Mon Sep 17 00:00:00 2001 From: eCode Date: Fri, 8 Mar 2024 10:57:07 -0300 Subject: [PATCH] feat: added /v8 --- source/v8/CNAME | 1 + source/v8/android-chrome-192x192.png | Bin 0 -> 26626 bytes source/v8/android-chrome-512x512.png | Bin 0 -> 132395 bytes source/v8/apple-touch-icon.png | Bin 0 -> 23709 bytes source/v8/favicon-16x16.png | Bin 0 -> 644 bytes source/v8/favicon-32x32.png | Bin 0 -> 1549 bytes source/v8/favicon.ico | Bin 0 -> 15406 bytes source/v8/fonts/slate.eot | Bin 0 -> 1876 bytes source/v8/fonts/slate.svg | 14 + source/v8/fonts/slate.ttf | Bin 0 -> 1720 bytes source/v8/fonts/slate.woff | Bin 0 -> 1796 bytes source/v8/fonts/slate.woff2 | Bin 0 -> 796 bytes source/v8/images/logo.png | Bin 0 -> 41086 bytes source/v8/images/navbar.png | Bin 0 -> 96 bytes source/v8/includes/_00-WIP.md | 3 + source/v8/index.html.md | 19 + source/v8/javascripts/all.js | 2 + source/v8/javascripts/all_nosearch.js | 27 + source/v8/javascripts/app/_copy.js | 15 + source/v8/javascripts/app/_lang.js | 171 + source/v8/javascripts/app/_search.js | 102 + source/v8/javascripts/app/_toc.js | 122 + source/v8/javascripts/lib/_energize.js | 169 + .../v8/javascripts/lib/_imagesloaded.min.js | 7 + .../v8/javascripts/lib/_jquery.highlight.js | 108 + source/v8/javascripts/lib/_jquery.js | 10881 ++++++++++++++++ source/v8/javascripts/lib/_lunr.js | 3475 +++++ source/v8/layouts/layout.erb | 149 + source/v8/robots.txt | 2 + source/v8/site.webmanifest | 1 + source/v8/stylesheets/_icon-font.scss | 38 + source/v8/stylesheets/_normalize.scss | 427 + source/v8/stylesheets/_rtl.scss | 140 + source/v8/stylesheets/_variables.scss | 103 + source/v8/stylesheets/print.css.scss | 153 + source/v8/stylesheets/screen.css.scss | 637 + 36 files changed, 16766 insertions(+) create mode 100644 source/v8/CNAME create mode 100644 source/v8/android-chrome-192x192.png create mode 100644 source/v8/android-chrome-512x512.png create mode 100644 source/v8/apple-touch-icon.png create mode 100644 source/v8/favicon-16x16.png create mode 100644 source/v8/favicon-32x32.png create mode 100644 source/v8/favicon.ico create mode 100644 source/v8/fonts/slate.eot create mode 100644 source/v8/fonts/slate.svg create mode 100644 source/v8/fonts/slate.ttf create mode 100644 source/v8/fonts/slate.woff create mode 100644 source/v8/fonts/slate.woff2 create mode 100644 source/v8/images/logo.png create mode 100644 source/v8/images/navbar.png create mode 100644 source/v8/includes/_00-WIP.md create mode 100644 source/v8/index.html.md create mode 100644 source/v8/javascripts/all.js create mode 100644 source/v8/javascripts/all_nosearch.js create mode 100644 source/v8/javascripts/app/_copy.js create mode 100644 source/v8/javascripts/app/_lang.js create mode 100644 source/v8/javascripts/app/_search.js create mode 100644 source/v8/javascripts/app/_toc.js create mode 100644 source/v8/javascripts/lib/_energize.js create mode 100644 source/v8/javascripts/lib/_imagesloaded.min.js create mode 100644 source/v8/javascripts/lib/_jquery.highlight.js create mode 100644 source/v8/javascripts/lib/_jquery.js create mode 100644 source/v8/javascripts/lib/_lunr.js create mode 100644 source/v8/layouts/layout.erb create mode 100644 source/v8/robots.txt create mode 100644 source/v8/site.webmanifest create mode 100644 source/v8/stylesheets/_icon-font.scss create mode 100644 source/v8/stylesheets/_normalize.scss create mode 100644 source/v8/stylesheets/_rtl.scss create mode 100644 source/v8/stylesheets/_variables.scss create mode 100644 source/v8/stylesheets/print.css.scss create mode 100644 source/v8/stylesheets/screen.css.scss diff --git a/source/v8/CNAME b/source/v8/CNAME new file mode 100644 index 0000000..e873526 --- /dev/null +++ b/source/v8/CNAME @@ -0,0 +1 @@ +www.pixijselementals.com \ No newline at end of file diff --git a/source/v8/android-chrome-192x192.png b/source/v8/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..589a7314c03c41e539e15a69901b1b9aedb0bcd2 GIT binary patch literal 26626 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 bj!dFBxs!s&Z?$pGk zi?7c(Z%ObNo~wLgp{&?NCf=p$j{}__QA;J7kT2}&Z|QrSIAudYJTu7f?&&R&dcUF9 zs+`1jQI%Q#30u(+5mt`9S#8(|f~S61)YDY15ZCUJ+yM$Y$?DczARiSQf65R&5`mMU zE2H*CrKG%xhHo6V(tFli=XErO;YD|Y@0$UtfDdfHeZ`et{V)@7W~KrzC0*0&4Lf;# zMe(8;CdNvJ(iI;hB6g735dpEP^6mGTg1<8O zmzvk>c|pB`!Ax`sA~$dv+GB#BFw(v&oiD`KlDP~2mT3M&KE2CyJZ_QSY76K=bTuUiqVfH)V!r)T?$#rv9469GNUEeS$_k(M%zdz~ zmwK#p(p-rO-Y5W;8_=n;(Iy*mYUp`0x}>RyOAX9vVO8X@Y(<_cwB~UM4rt9$yt8zv$fB!zm6CTT0{Hl!C9L<85zWBa^TF z44++m+v%6U?^!uIX4RgR`UOKsP$@B@cc&qgxe-uAEZEq$fBJGv;OYaa$9u|>lrS$q zwLFCuG3sN_jLM2a(6uZxzuMs~S&JZTYh3~1-)QpU%nM2~Gsa*93*^sUW0FtX+8e&+ zzxUQ-hD9`8C+jSfvA1T!=W;PcgnID4J`t(Ma4AGwMJ7ZVWA6m4I*>qOS~708!Zr+d zxAtwIEjt0wUS!G$Wuqk<3zG^YvIQNOQ8;TV*rV#T3%@-iC4j9^5?md-0@kY2J4s)a z1m|X(p9D>)j6pF;Gm)aUY7O$z9QlMV1|RdWo^y$PqHmBwV=)Qt8QqX@whYv=L2`Ye z*3gn19FRf;@A|I##FSIei|!L)F!VpPNB_=x&Wq6;QA|x$F zGWagxFv0T!7p_XCX(Bp&Iw_0myd?hDpCi+DSnQHZNkZB!F)2eyt?}G|HR(1RP8+qB z1tm?%c5(r%!s6CmAQiS zBT9cV#%}c+!;24MVTJ97t<)b5Z$PkNyD@j&&TxIs7Q^|9&8Jz^N`42!2FR>LXWi{k z5nw3caB#!1ODjxLp?jGbB%_ulRK#Cy-z?)iu#;%`^SePEPsOOvtu``n9_a_CqQq9v zT@8Ld+`xr9Bd;_kwhZ9*wlyB+?;oxl;|4z@Piq1PdFuzX3|BjttiCJ>!Ap?C9I{RS z|F($(_nStruxtQ%q+RTH=7z^uAPmO-JOoT!evQ|9()RC&k0rW{)J~jc3%)&AcGGE} zb3OAOJ4BEn&{^HG8ZObW_+k2x|6|I`*;>8x_qPXr0qqY-bwAo$F5mZB{}jPou&LW; zZw+mwYC>S^o(+-*RHRMGdZD_wS?EA6pJc#LiRdnXG1)Q=Cqc_I5nv*{hcrE6!5cCZ z+-lQt*1(%z4@6-J49qM~ypa1SzeE0s&h(#~!C6Y}l8 z>wzVBW0UKPo7^5enVh^{KjAj0X!=SjDRFB#ON)N36c`!rbt`sU(Au5UKS>n!`f`?z z<7Q8TYr>GeOo=R@YGp$IQrQjRR07R~j)Uj5_x6;#o5=jYi^HW&hhu;S&BFz2qi_N1 z=<;^IZ(m6nYlX=WQFt(@4uFGVI`?@zQL4kQFE9C#jE1;+XB;pCZ8I>~S-_ZTd! z1tF>RZGYC^zay;?<*rlD0@JsJ(JnItxqK(&EaTq{C3a@=0WIQV`u)1cjuZq&aBX)2 zJ`No_JbRoDnMu^ZSf$@JsNi+CIHzMyrVhy@`xNaWWyG=6!Ymq_QSz?YyPglK>z#gG zQZi1K!Pyj;mm6!KGbTkC>N~3c9N!vw9?pQ-kawUvlRSzv>zme4#^7N8g%RlATZ~jY zK`c3)P7ljJ0^h$yJOC*FE~K_thEz(#9I!)0?4KS0qRgI3#4Y!SOm zpJqYVhUTVImiQ+}F})oow>d7Mfk%GLEf z6l=^t_fh_r-%@%0BOEq%E~PR)dQs4~FN-ffO%1f^T5m49b_z$=JlcOA-pewmjD_dX zx@|~TLUuH&heLDqJg7%e5>!e-HuLCAc{XaD`olVt+)%=&XRm{;bF0XTaYR`nS`~!{ zzOQjp7l`B_|NM(vgtLV72G7vT_&CsVP4!bKEvmb8r|U7&uH+DpFq=XqA((wzONSIN z1n72XXzs@yC3-lWaZ7o5WuUy+Vb->HZE=W2v@b{vv``ceHiuQ*W0Xa@{coSjt)sq@ zYH!<0<9ot|Qz<5Ub^ANT^e4-b^*8QD$X!NnKFTmQg9%q;9iilGFJRd&C!uAa5d>EohjQ@gMlRa}b)?sRl9Xi~_kOnLw2WXS2{ zCud?yC2&aFn>ayv1za&@Qz;e1wnn@XgkB&Z;&Hmez&rZh6HgIH`;Ya}!IO<%xkb&p zHZj4!_~~Ge^I&HS27!!v$Z@gVlnQ-?)A@?lMnm@`8B*4pe@DMigCGlH z%|&MV!V9QmWFi55kS#I!nhPm;vsv)hG%>?u8(ntzfMl;30|J+yzg`WvbNk(U&ZVNT zQpYqoYL<+>=a$FjEqL|2^Z4t9q;h+!Ob3gB!scg=FC6yJG>3YD7!}cs^EPU4#omVj zdZFdh#f0xU8CG#R%&ns47@z$VLu2hh+CWqwn-yc?lfVam@F4iUAj}3W&6|pfYWdMY zFf9Td=2+c$roE03xfg}-UCRWFbPAAk9?o-K9MPVb(+0C*=CQl=@>TQ@juJe91@JQ* zTkA0)67PY_Gl5a6Km+w6&KA?2WkCm-8Bg?F%=W?O^UssxgAH2G9RDpxINTmH|78F+ z#1G+)@hA{0chH)Ck0gT*?iD_^UZYPKJL_IreD*py{5>U=w<)9{@P&1hi}>Q91nN)# zrF%-V!jMS{VU1df-dE&ko`X5(VoET7@k>m`@xAL2)=@osCLD5p(Fs{~OYbQw1Yr~3 zh{*I>FVmeBd+#TH{(VAaGdvwMgjwC5)T*6X4uLA2CYyzfa=sDs*3IZ)Y$h9U^kZxg zWkWlw1)5gtUOQvr7Z+I@IDN-|d!%)y<;(UJ%hP-rLLM(B8+9ER9yIFy2=PAJ`ut82_le;U(V8&q!gr!d*R zd&E=fDkYlE?aIQ&HAB4jF)c;CltR9j6qT<&2tDZQmeLwX+m%~v^I%#U|I|?WDK=Dh zld9McL)v6UI3H+4b7t{%)@0AOp4Hl@n4o;&t@srO@@Z1(8#VI;Cd>DgJ--6>$8kar z|FCASyCyMbkK4~oS5*N5x9+T-H|_Y_5GH1M>J`qza_J>m#3x5*0xJ@5e0tEstnnr< z?y0&aw5I$+wMFVE9cBw>zPb}nxK9UHgemK04=htlO+u+Dhm$k8JJk9g#+Ilj2xrB7 zvoDz1Xc>PfO}Jn=(ezzev*%2QUEYg1_HekCM3vo}BOf?bogmLs!qzKQVxIJ^oqlZ< z&1%ZW{-Mi0a49DA9V*1z>AQXGDyk&E7NgThel@n=%RS;z$uf=GSDQQD=DjK4?Jxsw z@n=!A-Hq1xyC&yG$?5z)urRf$}a;Q=S3z*c2@ zLmu&QH!{5(@FEI!jzjFD;>wv{>%5`#Jb<*dzTay;#0y2d>8)2-7Qaw#OgW?u^m#Yn ze(wH!>xVf5<V0KhL#v23B!Yv474*`Gs2$vERV#Ip*|W^6(1IrNOpJ zvFU^@36;~+{0=US8+O)2E4JpzL~4xJ?{|B{l0&sr?QsT#$~Pmo*{p&sq@nKF2NUN- zKS>mKUr= zc%Z&}IMB+1i~`|g4K(g~^Ep!T03#AQ44z%Eo)m|)7|?W1e2M(UIaoY&>%!xXc$Yi( zf9u-*VQ%V%-aoltOQuM&Y6I^mcPTYq#q=@`+aM$saIB$WGIFaM zujOVhcllkq_+md~qq}Ks>$DV#V4EX;tPp+u7hRCzl>jK51V{Qk^k@p2pvq4E40B%t zq!>=C$nolMY2C=Qq8wBqne}@oSto7J=5#| z)f7}3l zgf1-1rCz6P;KMZ6do2xk!pfgFGLw@|HE2=@q{KWW`HUf{pps3|UgnVzyJ3Hh#2|bL zcb#J%uTHknnu<&aQsv4>>7~tHNz_mNLWrb zQh(CojB{ip8FqZotnINjU$H|0>3Y;@IojN{QVpFDn)C?_HzO}jzIc9Iq$Bd#i+J61 zj8b6akg9s9)@5S#mv;5X73dW%JrrO7&B}pv9WkpDufyV)jO=AKOd;j%Su_8YDi+4z zp^Veav{8#>zi^;#wA;7d;wXk$JbmPu#3$y7A}$Z0>1e-KFzj?#k_K&i)e+q;mwnDQ z8DFOZyjZ);P25#E#h9tKW05(}Nq26%iZ>3H_?d@FaW>~xJ9W~M;)Xk{C)QZy_|us8 zzV}1DRn}p?FM@R71!&`WIqB!{aX|TlP0l@WRQNk^D2UP*5Oz|;j}TQI4rtDcV)Wl>FHzE@z?L0dB;_bzs_Fn6CRFymGT3@NB7u~$dQ2Hlo_-^W;9&xzK zYIU`>Q=vS^;9>aQ2i2KKD1yw1S8jvKaj6{Dnz7r=cO9usDP$T`f`{I2tB0fuOMzsu z9&AZjsZPzA?wen1RF@1U4-HPs__4Vs3Fm81@^Y)bjOBWG(m01PjXZ{P2XPw5i50cS zS|f6aegiz{+d0o1*Kl|TE?Bv+w*1-M4!wJ~t%WkK>={M^;cukZWQT}6hwG3Vg^)! z=5IT4mEcTh)rXs}c3dlU{81Ny`_>0xChGQy%XH|%_(bRVl`q3oRdHs%cZuv@D{obn zzqPGUEYM0c`@#elDB(wIom7rT8=rg;nP~edpZ$tb?ERC#FgSm^xoKP@AomM3Gt4qt z`yzP#hgl6C1OJZQoa7%IcaQNtXTf(GexlrGp#uE9Mty@D5%qO%_u8(A-moWgZoP;x;(>tBw0;R-wZanFq@K9- zw6uqwX(%od%IyW>s4WAE^$DWWO><<3yumY&Cj8bL!XF|c{KomXtl4{ZVW z+nUUYs>e&jKAh^>IleXvPsVSSxCn~2Z8{GmTIIN1=#YLUDVRWip)42F`aIcq90y#W zt|c!navjtQ5W8{sG1+5AVSn;1I}?#&zxKQ#C==HIs=W)k#!4t~_xnPR05HC3Xy;R( zCaBlK5DB+ja;~M6vb`P180dql&=L9?dcq60gnWLodc2dI=!s^+vu|_?P2B#28{7P; z^^j$&>hOAdt*KniQ`lrXUv1!zd1>Xf@hg<9EGXPy>6z`D(KW(7Wq#iA9$M~Ne2tT% z9)4>Py`3uyd`=bC`IisgHGkl%pqaW9t(SIX^5fO7q$(~DF&Y+FVFFpX_k?ZUu08We zVBU7;jfEvx)JL-LIHuJ#k2H0FeI_er=%kIY;>W@PW51?$j^4f4X_dSt%rN~J$a>1Y zvlrT*IqD6bf~LLCS|0bzTk4~xDo`JpT%3!ZZ0zl^X)iWCEsryjQon%mc228pJY#OI zolq1Pv^3{v%lVC@?RuW*l-}tq52a_>DTSDi4XE%gGiQ&vSzj`MmQ7-5NNiZH3$jZo zN)$}gF0O3-K`kP@A{JdEpOZ7>`_8Jmt&x9uAn1g?20ooZH*=RIT$9hzw3a`3E zy^IPgx#6DB>HHEc|X&Nl{veIzDDfD)$XdJ-p{cV*H$Bzl)BlV@Ht>qd>wU6!#Z?FDNSh2N)IZ#;^b z9!cY@54p7S-SrO74I~{pmw|WrCG0vwV&C~>_^hXfPDwDPoBcu0ha8dUnYWhR0(j&N<|r9dF02GMp!ek5)*&nZThPM8dqt*P*oyEzmN*H=Rn z8-7KNUIv(ZY|njaHaDK+&E)ibas1=sam;n>mp%vmFxP?YMn-S>NPce-O^OA~xtE8& zclY((w{ZRkyCC)B8kRL~myjILzDKd@G^9(&a~Xb}(Kc9;)a2(pB5>Tx_oh1joWjY6 zr}`S%qF05r12pxgOH=pWQPc>9N_jjF6J2(U4Z<+ESzuNVEjUP3Wo!ptSG>-mc`Iy> zyja5p+dFc>5^F;{Q3YV;kBr&73*+TTkyZQ?jXnx_Sw(2{$I0N;ahn}>w(AWVVLNrw z?|KdmjQj6lY9v;C+itzMZ~=NI*t{$}p+Px2;)KWYpjoqZ2eYSnpWs z7l;3`Lg8R9>P7O1!uM>3gC84Scxp;5o%+FmrN~r5nr2z7>2t&b(gz+femyW%a4Z)0axs06J7w$Q< zt_p4T_p7!7L5?$@rrLcykK?GWo?`hLYI=%N)cK9uK#lBM*K&_<7Cc}#5g(W- zA}tJIY%X&fnPwk~zb^T)RJ0*6ehx$Eri<=x?~!pTc{{mY?L-G09(Bs2Vx@M})O5|S z*sn{q*Ajw41;g_F>)zATxKYEI?aK;VJ#Lpz5Hq)@SxkXanVvAn^yakkdCCi-#WZaklGW;EKRC(wSh;435Xv1@3v;2)_6Fm<3V*B>V= z3b(H>8K4j*DiEeDvOA<5^9Y0pfajlW2cadQd-NyO&FNp3GZAPgKO8sN*>oO66Z_m+ z&*J|;@VT3e8F`d9HO1Q8K2qJ(Pr2ZkfW>o=e%}f8gpVev@jojS9l62pMDW7VAV#|) zj{zfMjeNQ1N#8l51!Mj*%$W9Z9*;qTEGg|vR)w;^)-hWQ%~J*> zV=H|_To!L#Z(h7G>%zug8_Nr3pZPEI{Uv%SRbKR9xK`};BY8UuV7L#UU)rB~MrDhnJ{fD2b zz@MADtLx(bFREL}?hhLqViLLO?(eP-zAM2`QCskWw0@YY>ob zq`L%3>E_P6?z;CE{(xDW^F4d-=kx3aQK*mt+_F=I6qE4S=7gepOtb&gmgn933$qIJ zkQ1;p0t$P@`6LGdaw+u+GvR2vZ&iiH-wixCjOhS*<uziH zs}I}yiE?zbLP${^(y`RAf87pyXEQL{QD0~BSh}fa=xyj2!#|N%XF%$3Iz$R{n>y%54@TLnLQHs5^|d&ft*Eq(4Klh~i02#Ft|2%;9P-nN z=$sA$EGv`E-VSda_jJ9fd%|jI{<^*;dR24jY*F@zQe8Hv=!8@I{Y!Zt?5>sjT0mBd z?uHeajHaEI%~*koPbw$1SbIzDOmGAJK^*iOD=@3ltNjPzGm0%)gViW;R%#xYvJw_&QQs z>*@hMLGJ*i3a{;`=n2=}Ta>?iV%oBbz1CXrdtxZq2?$5g(jNyE5Bjy* z4Vnceefl0~cN+(@MBTjgpQ=XPO;jHx2=A1GG-F{~yY|NZ)ACBDG_V8!H4}nX0 z?(y-%;E*hCFn59((E*KmB%s<{-tnmOQ(Ad1&RB5xY9_frIt+12KQ)@^hdsnps326! z8)h(LOt)|rZDeO7D)SEl?m^HPYlWqRl~E5C3K4640ZeXR7I3426ampL1rw0!v|W9M zIL?X8Ut%gR|Fj;abVpW42H4!(5`F|EC`E@4#Gn|zx6$iUaTxOJBkp|DA9xr`!-jO9 zV%Y!Vn`UOvA~L{G=v+E3!Ag!2+}5&SgOS?byLHM$aez4^7WQu>6w_f;Vtj%v&)+~b zsS1s;HC!r>AjH-K>jop=jzonrB+I)mnk#$XRiBcSlt!RB&8dq zTG9lDqN6(p_;abdA^S?K5HW(VA|!J_6q<<&F=j->^(ilM*@hc#DdP*Qk{Gi7D}Hrr zopq*h!0XDrPkcQTsGK^Kk~o4gD8~p$LCUowTt-(V`G6Opr}&5Y5xero%a$z-RZ*m5 zw~eK*=nrh&EbR+(5kg6FX3t2U*~VhnKyD53=Mx6PjfbQ-s5C~qhwwlXcJVp=lW6t2 ziPXb*vio=B&6O1iYVQ~FCf$#vK5WV5h?-y_PkbBl(|fQmqtUJeF5`E*6WU z&Bw|5`bFDN4&XyDS%@%T`2><-#s)>%tvFRNlOa!QhDF0#^Bm=Yc~-S=pei~% zvEmSWFvWs4o6U3P#Tc?73beWyR>vAkf;b^3ELv1_O}-Is=Q9{(Pzdm1h1%wGk1c!kRI}Mwe{yEb%F4p z(?$V=U8j2{f%1Zzc*Y4~Y5gP^3;gM9IU8sHsuki8=cHm{IAwkO+bj2`9O zDG(BKjt)A1739Z4+~Lj4{@f_3_)bx*cWEs7qLX)UK9JGU0|}fWFJn=S#6T5D2S1F) zpRU$~;GBJ-5u*(pq|0*goNIfBzLr~2cc_>2F;0C|*Y_ADjjexz^hbDC31pQgF{1Us zw~+08%uj{|1PlSyq#_TzF4gk0cNnEXyVTLp}0+b?~3mM^s&}hUQD%H&UI? zkmd47fsHQ*jIK;JOh6dfE(4nHckaFZuSxxy@=yKU>deRD$cfU|YC96-$vq8w2B%9c z12$r3(G295M19&fYZxukt^CTInK&WAUz&A_t32`^t+Xl(uqrv4xVzB7SxRd-{%4=x zU#6xBvd9ZZ_gB$x*z%88e2_}dazQjlx{kH}HfNl9WAN>f=0W_Q#|r76VuiYTaZvpl zY%v&`R->%>t@!nB5U=)!-y?L><8(G|FH};dt0lDt`re4d_jSQ?`zQq158X&6KgOIA z)6kQ9{IJ8H5Xd_(a(8&O6fvKukGJ^3bwgduJt4U@H||XQ{<)# zlI%M#hfXTXrIi+5J3VPtu2-Gs!zum>6J;0{{`7I?>DC%9>NtwBn56t{T2M|RRz~K7 zE6$j0I0;nbdTxeuq;$sylGRcXOl$z}aOS|0YLdhHBMlGxZ@fBD$ZsL*%WjtUAS6iu z1R62#ciPf3#XA|kXBttKyY*Ze={XhTD@{`}`WtF3nnp1^d~!^m@V=vC!Sm0KbIo2a zzFxRCkG2eP_=g6vZz(OaW%(AnQ89vMxu78Cj<{RC9Sa+J=)Yd4ea^1r7unp{0L2ME zzfQvfRHHUszUG_W&Ntk?Lt80&3w3^0m(;RNEADR>8h5_WJpXlS)1FQ78_MtSh5Eo= zD}_8NvW8T5*55K^-K4@gYom_RPMlD{ee{#!_{d!0-UDX@79yN1W93}l;gM!)Rm2}p zs;QO-DfyzJPnR#H((m%B>5mwy{pr^9-R^@j;Qi3$H9O5untS_p+8slen_=$_Z!3}A?;NmBkXCl*$fXxt-e=hn2c>(K8vv@xVhB9l^%) zlh8vK)7tu#(0zKX+pc+7C2<=CzY(eht3{{0ddSZIm6X|+`ezIB zm#Q~iPXdyE<0X(cx!A_3kQo#-%^NYA_@A78WE(6qnD=~WimAhCN*gb`cLEBKx144c zdz|~;?FLA zagkbUMY4M!AknLk1gDHIphf4%BR_3cN+n-bH(%E#?iMiz!8qW8n$w8KaPQypzh4LdRg2(2#V zQM}%ob8ubt5dm{UP$TT^(8sPMRw2@}%CXDA&BG78E#80rj^MkP8>ci_)p>8?q9$fa zKjl}4mc?|_T_Taq%&en7UXo6T%>^kD>IqC7EvGG|6|%is3p+D?KA@}qY?Q}WWr3f~ zgyJf3)%(IiR>p1hcIUvmeFtMdm{vI@W67f{!(zoQx%-6w8Z68)rh_lLo1y)GK|RyytF?e^Od{!?GA6n%VWHwvp(tnww} zFNxQb2k4Slyh~O7obx^$epe@h;h@oUiOtCAwfGsL=Okg^q_0&ZTWaTVur8$^Ka;_) zE$4!OnVsLNDSJ#>Sv=PoHgfy&GWwLNGgPJ$W@iNf2`|r&o<49`<;vf6+O;D? z(#axTUWB%y$K2U*2;71#lMDC#zBA`~U=$ooEr*^G?!h>yTaiEv|I2wvkYhfsMW}G9 zd07Tavi)kxaXPWw&h6Z0nV)Q8{N(X)T*c3#p3Zr!c*~cN>ipIEUJdJjR9WbBa&I;q zb&bG$8{-3yu@-8ClU~#-19M+|IBMs39QTJ{T+6i&ORnN{#^_*?^(v99U8R1Pf>HHX z?W)=5%?Zkq+kUSWUEGGM6ExTIeW!xrISZBE0sVy(!rP)uQvWvmsY)n8Fc{MsI7c!* zJns(sK%IcCQ6CIEAoc1&`{j?FK9{N_V-m;~v;7#tAlS@G0C_V7`20?>u}xo^x^bAB z7(5kuPM_9GGOfmlp^+>yq{>H$ThfLQZ&TZ1OlZW2gNe)_1j6pjnK+Zd;|!T+SKDull2LC)$Wj^P$#WV5~MR-Rk!PMMH4G zSofYv2nRi+IQLc=gNS&RK9;&X;AHw`E%=Q{oxsZDHS9L${G#+ri(?Zm9Qa&J;G!PC z=RxTYDTWg8Yve5w24^Y2delSnVMAXs{r5m*-}X_kl;{3KtqHg9JzYXiCx#9ht9{nx zy2$|ymmVeFq%PGRw3b5!h7CUCI}8>#3Kx`Z>Pl%sW?S_D29rq-$%%eZSOkHQ12^TM z)8r)YB>2!(vHg4a)rZxK=HUMQx(bb%<%w4rP|vj4I*T5+S6_Tf6CGNTtWS=Wnn1fP z&(Eq-1F$7b6X=xI{h@{`sEOv{iD2PKSC^zEbC>^gglarJ*;70&&Do41Lh z?9-ZEr|EaXI==W7oZwBnX-OWome+Q><gnnqBIXG#^p!^p}c% zJRvt6r_lqYEivdpjHqDjnslza{QFs>UaT@`Ho!od`3ug2 zQJoA*FUFuxhqDMgJ=1o(GZzb(>eT~!J1r0vcJYY?Xc;5Y+B)ykOXZwM^l(Z@pO46TL4+MO|1&K-YT4{sj z%?w}p$!b@Y^*amWf^{poiGP3Abq*ZQ=jR(D6PT-+xKkH<`|mVETV>(GOX7M-!|LAS zillbUHWh;|;?3z!bf)ye`EyEEzB}sS2Ucx&SQO>o5VU_J8Z>Epm;IF{yzPFM|9hUG z<1^oOp+FH-Kp-v(cvm+Ho#D#~zcL!um6#v?DBz?Xyn?DwV40@0)apI5Z&gnGZ5Z$C`bzX4@B?DU~;}%Kfi>7eCPr47?4`x|+7+l4rFMqMmYvMRt`_UC4 za`85XMqGGSAHO9x9nlJDEar9LCnvgsxvD61n=;SBIPK5>1kYSQ+62T&P z;y%T_PaKhv8)UrRa6JQK@bB3H7^|V~Khfv@3h=Du*@AA^RqF0jx4mKV?FvXCQKGQ@ zfowVf^uNQ=2E~NZy+|I%n)TNWI;t5MFfe^k-t7WElh&Ps@(7)_?llz12yIojAz*6b^S^$AKT_1pB_mch*`j=U1!_n6qr2Kab3s`r!m? zlBr?;DB;L9QgDFx-$fM92ZRVv{W_BG-#&&f!B)24% zx+y!D=8h8Tc6Y+%lRO9nmi28oz;tt8>U0XvQ;oQ7v^Z*%sqsEbJf{D(cdA3(xEA)>NP4U&l z26g*sG6fDN+44a5W{q-c-RL4Fu!43cy@aD>@7t7~lo2&>3_|-R@0NF?gt>M7W}>9S z2|BEFbBjeYv;1k`Xhjj$1&nJnm&NqnxF#T2ZAiXsFsO3bKZUHlJ&qI0g!TK3D9c#f zvhHkIdHlo1fNzEJYY(Pw=|2X@YUsoW75tiXFY*->k zN<4p^=fSB3K>5RqftBNg;db(ee6#tVXa}`c8Zg#@@6I5XURMj%R7OaE=FD- zN50~J*u;#ba>!W(^Tbo2<;0G+1lwz}>zK$P&Y)N~^<8v+6l z^7aaHom}qnln!Oq@KsaG&0|MmQ_ZV_mTulnTOr8cGx9xy>fe~n4BDc2zFZbTIU zxS`oD+xk3Qd_UneNyz0vwWF^1uOId_ZYE?R_~?mdlr75EPL7s~V#8x-%`n9XTW%jl zP3-gpx>$Ue)AThVDsZgFh3*3?g-A;sIF&1UzVTm$Jdq{3x{o{5?mL~(tYmHZD9f4` zToao zmjS$rfC~5e6@*z1l;7=s>!&{vbo9`Q5egKB^-@3O=-m7&R;1O%MyR%+jdGx zsbWvi*WClXSVA@=9W2OlkQCo_O#1r8#PMmRg>35Pv-PLEfpJgK@uR;WzFZ@Z&=AXy?h%ia^{d-9a|3`%R7T}*Tv6*WFjoAV{qk{AqGsRfFtuHc`Pue zEstGY+<+ZeG=btt0|B~)KtR~lFv-m0xkLiSHZuE| z4anU8C8{-U)oaPlL|h6T$9s1%Be7h`$XLaK?9h z&3HtqSl5VgvG9OXyiM-WJF}7MVA5j`7wi))7RZ-{Wn8fRxbgZ1TVFY+g;n*WfP|_5 z4imtmhINb%ly)U+H@|XSR;VlXfwjL%BA%9y-j1gluoKrcM!Oo`2RD;tudvC%fh1}T zbY$6q+oDw_lU3tI5RW^`to1)F=hk`<80&iPjFE?#Y( zTHk>UG%Khyu$+@nS-Vn+;#`8F64LMsclOF3BFzE3e==MGF2m^>L&k4GjrQFS;rN9K z5GKleNIKrz`+Oktl6bS)rzJt_iW%|&c=hy=1C*?Q|1UTy`a3%&!3f6u9K!oe;e4|34N0(A7lD zOb^y)IuGOT|N80!UflnxFfaqUf{W8KUo4>%4E6VYC7I?lI8TP3Nr%PAw3gH7NF_TiF8V4)qbqRZ3bB$?)oUvQ_f)y^ZE@5Z z_|kXjBVh>y7hPN;Nx&B(G7}4RCyXd%ajuOMQ~HE95MJ}*pe;LM6#QOhJG!(?-Izew4#8$Df~gGvT~E+-)A&K50xi@Ma^!RoH&G z%7|Gxpn(kK`2(+{b54xC?nvYWB1A5W0|EtnflxPLtUeQP*AE8m8tJ}Z-Y0<{a1uX# z3dw5c3fII}WeC0_@khD-4?oD6`mim514KNWRZ>^%SXXgKZfy8X1ZCt%re#^UQ&%@r z89;KErGyd=_zR8kx8KraT<=zwKb?9TtXOWw4+^nxfWYA>vMDUH>rp!h;DO~cBE@1k zm{{BS9;~@NI#{;p{)0U!DZiE#T&shw0dV9L(cjmBKm70DU!Q#BZ6t90h=XGAGUaL^ z19*bLWXq7YA#NxK2@4*%b=A$jE&2p!QsaABz2eXSH zUigZO|IzT~{43UWH;5kjG#z#L37?Tr7%tB$nY8ZWK>Y2yOTi9!=A4bT*7cuT2m2075<`g(&rL zsU~pi&($}jW(Vn~HcjIH1Kqk)fb!31k>>xbF*&md3wN6~r@FkhTp zTT~^UWqA74Bn*>fN($nL5kryug`z^gWcKlrTVh0kx*k(JD5YYkrOyK*_f~gyunKcs zeJiWO83qhfUA5dLDJCtkktD!hpqJjO*<3B=N2>Wzs@CZXh-Ii+(&(nRh`s%Vya2_B z2qWq`MPeo#mTiAFRQ#&qJTnmz(SkMpa6iRg4EOP*qX-rt3%qS-A=bdTr^GDegJmpb z_J-izxA0oADd>(>5uJ^s8GHP+&LY5Zdw1Z@^i3>rg9o>Lv=T+I?}MC>x`%&<(c^}U zzgu5LeoZ!n*)g-mf!|Bu_En1r6z%uO`y>CK`)bn+V+LWxA5jPL3C&!Ho3yn2%>@VZ zfp6lp5ae!RDPMr^_V&Td9)pEX+znl8J)u)G+wXG}}2Me1?N z%M5j$>}BLQe(FYL%Mi2TSxRy66i%V7P`#)E1tlXHj;ggKg2kMm_a&64)*m3myT9MQ zS&@rarpsCv7LR=vqMT<95^hPlFZcXRa6nLt^Eod};?9{3Ei?qsVckG7yV@Z}Zj zwRo*y_|m;wViHjcBKi&YxMzG@UO!D5?woMj#;1t_z)iY45aF@k8pQ>6AF&=&kYE znX%n}@RwcS_@}K@FiF-d=<99g4d9Cj&i(8&$o&@cM_y1AoBodV;vjSB(^9H=pC*Sv zA*!$h>mdtuRx}^M&yjMEwQvHSgaQIBrQ5}`w3oD#ZW0ofCR7PUO(Jv;2D{z;HPy#V z1v{)_QHYe4`<6WCS*bbUMcU&-&E~rab{w3>wHWDl(#zYv%>2{}(%6MwCgwp!mGJ{M zHv3!rU|%;X5GeHqs&A)Ff{h_pp1@ZW305op07hi%%faAv_-`8qN*v0T*sL z_K<)xB?=wdZN4l-Vx@iOk{$gw>i`x84R-$4p%}-{1)i`mC?B*uSQEFyO^Q zzkj3OH+NGTNC3T9+4tG=yj_UU9OG%2fx4cu-8daF8d{FexLzMp7)?L-5Xj5V|8RNu zYBZzqCpy`fcmVd9Jd)Q#@4VNtBaDwpATxNtIypdtj_hFdof>{ntfuT@+n=9Xi!RUj z(|&i>=vW(-cvi_x^fc{7V~>`c`hAFo-9)5nL(p3sx_mtU2tsv$0iMwQeRL5dDPxL5 z9>@BRQkVg^s_RwLpON93%&ZdBrr08DrMioao(M1$OkjuQHB=VkJCG2X;-EBTx+w7Y zxF+3d1gMFHGJdm|R%O}*cdv>3T+ZH9C%2dVl{E zde)C?OGe;`dM#z>w2iZruTZC%!2kzlMh)M^I*P37GJlAeu21XP3!IyboNt9o>$&?%jwRJ`Z|?o51p6 zUr(1_U%}k_?Z@>5-44r}%OC4(s-#W9+h3s@y{BeN|+63$@-7-K&+9PGuC;M^9W7(7&{- z9TMIUr{(bnOX8pc?=|yo8enbBshx-4w85ipgx>K~1kY0NH=_gCOYySk&)g*vV%EcD zV={~}By6=YFuh-YW6d7|bz`;p51rk|IOlszs{I2n*Nm*u!@My$aFDf)Elgjyd3hR+ zsXbkvQbWs)U(vtH!z~}L7*K5{Ao(3^i)Sgk!$yXxGoz<2QPm1kWgMF`M0;&yC3brM zcJobX=9Aee_1wZi33}D+7m?y4@Udx@8<^wE37<=#^2Ujpqffee$I)FPk~kq%FYp>q zF&;)J#)PUe&dUCpBB&Kg1)7e&0*WwoFOD0sp`UocN!_Qb*n+v%ieP~8x+J{$izp^D z^V$1y>ER^~m)b!)&UsR@d5`Iw#3ZP3U;K1naJB6jDx2Cu-5cFKSyQp~f}%@mBmGQ$ zVvPz*O>XMnzxFY!Bqr4XjTx>}wVj45(TrCNuc;NZ;Cn;{!+rHTL3M}=#z}SR&tHm} zhrSb!3ASGHpZy|(qGHstuWYaRTQsP?^=f={*&@D7Ex`Lxe1?mml5Y7~F(KhWhDZ1u zUrDe%BX@oG_LrCegW#0J946VJ{cih{CN`w&`S0mXU#fr-c-Fsbr`jn>g3CAs+w!qi z7Gm`(5uvahwnJF~P0S`3hAS_zk)IC;Nj%@nbp#a?&`Nkh2+Zi7^cU8-QDWaEw6g4Q zXsG#ud&OI+I7Kt`jl&Qkl#W^VR2owC=~c6SpfI|ZoP}^1$>r0p5%pTaLZ{Y*1t0t; za8y;s+TMAqMU+9XZ)s-0;(6%us@znqK*sZ4y64_kj}vQlP~^cy%t7#%hpn3ESu@kR z|3&{@gg@EQPC8tpJ|C9#kAR;-UMl=N@j; zia>_$E!I2EjXgSBn+Pnz83wIUi0=>V&?c2?AnaRDgo(s-}5s1A*n11e7^wkQSua3 zn69Jk0(n}1R zoCZGNGD*%@Hdq$_>-3c!sfa?^fW&k-=Q#nc6B}!++ZOp515WoN>{qWt{$X%vg)*SjvV zn)GCot*Tvi5J}>{C%;tbd+!iV{);jr_{ZPN^x6V(U2UekBSj!Cq&6=bh8Re4dV-Yw z-RzuRWr%NY#MV)v5FLw1p`k*F5?R=iq5X`z6PgAyq-H4a=GgF&7xVNkn2mH4nwURv zHr#WYo14uBkTcd3^Ui>X4Dr>)4AY^>aO7V_NPvPhqHrH&$iJ7A z^NAD?q*acaBUDf%idGu%Ys*;{`W`Gxdplg$I|RF$-oYZ<4J#io-WWs~RLBt*6_7Um zFJ=^a<1n3v;2e?T5Zk5px$b>fs!rl+oJEE@5Ak9LiZmNCdn^Dd|1oAn1~4_s(L?-D zE2yt0t{nQht)hKr&)-zn3&(<=n^RAC_!5pP5Jec+6yIb^9^v`^!EG#|iBufO^3t_n z(<@G%Pz4W{Ke_{)JGdPcUoxFLKM)2agsUySdmn8F97xDy@WHiwt*ZH-7{=5=TBLYk zEZ}KZpyS$8y7)sDPmAgcy(~O_mQrFMzrVj^cB@P4C`rOl!u$8x3{CG}>`l)5@SB+~ zQW7;}zEi*5WA>C=zQ9|e`bdI%$?)XXd6+LQdZwX=UV@w38k+TNHT9xQn>#BrB{K-r z#)6qwq<+caX~r*m9Pf(XtJB+x#;nF0-V8aqzP9!T3 zY^H*v37>3TU@qSJi0>(evhb{VkOW2ZptfE?w-M;MZ{zT*qHu_9F*z(#xrylH^cx(| zRzBxsDjS|!c+O*25?>X!O!6Kw^MinqS1fQ@w*xMRO___q5mxn%Ypd(oXc@!Ivg^Bh zd<-vlLi!`Sg+~vBTpwl7lHAMsYsop?vK?*5@r-e!O4n`jQ(W)E!X=oihyTRisu(^{ zGk<#QG0NEmMdxHm;aq(s9$`Eh)#uC&BBiI38NfkH1dLqZK3F?aHM$3;h91hl7)Gfy zC&bGGxC}-$A)A{HbQo_4MY|$W_?$l2JALh?D;X!A_Lx6J?ZRST$+01HQKsN(s^^Ov zw5xZx9%}fUrF;#Q|KR&)`kDfqUJ=7sY$sUchpK0DQ94?<^7&k5PTKqj?$M#OgH)ty zqwAx|ymB8pMGsi_p*YKFV4I@rZg|H1*iHA*##c<1(i+;3KO?dd;ADscL0gik3d-OTp1XQ7WysyFpTrdi zWD=K{FK%)FkN&*3%#mGW26SWeiSg8sUvjZr0(|6!yw%p#)z|y0^4>c^yqm{ulQ=l% zj>Hp!lA=G0nLKMS3K(T%%q<5FiU@n_2GjeUQ!*yoRssjidp-Mgn8jAd(B`t`V^mA@ zikJDPmHM}g0f(quI!m*-N`lxl;LM4Rs4ye{bocjENhGIgZ{NFEy?b6ozqDXE1oc?u z*J%x$AfY*lo&mz8q@=84o44#_i&Z zeY?ep|HDeT%1Vltv|jVs0t~QE26DrL^ZZ?xriIO*`!ifIwDsr*uK9t6cNLX2DD0Ad zW?dV8>%pyM8gh|wOBP7WbPYUcvvr2mX=;v0s)g_7*XJ}B#xO*BoUQtLuPv03;MVd` zu}!EX>Hi~SX?T+l>%P2~^66qeCL`Jpr2I-huBC=sO6N|pNBzb@lAp09FBC+f%4v0< z;-j!j9>g_SKrNRD3io&9bURn2_MDfBRXw8v@l>FD8SIDmi+(pZ#DAK+BS6eC)C{%( zHUo{*kS#f<2?WkXdzG!kdI#XG&?0#3Jd<933NbZ{|78 zr~W1NE5s6~HjskFW%UsY_;&3BMN@$)_^NZrlUQXsPk(y4JM1q~gm6$^8+#J_4sYPI zK3jXZ5Okv~DT+a|I&a70<6I^#7=QpU_?h_?7&>v*(}W*%2MnFzesql@rHe`pWrVAq zr?c$c>M`ALq|4qs43ym|E`y`BBW%R)n{cJHIQ&$`*q1%&8Gb*^)|$Wt;Eo=gnPh$8 z*}5+f(DAeP!ROAqWp;6HV|W2s{Eda9lYDCtXwZ0f+)bd@W&ipvCLw6>a}p2*Ae)754{mE z6F#JQoS}R|aEp`C&p6y-l33|}n)2D|K#;{W+VmlgS`{j>+9xuwq3cNYH(1zxW;qRB zzmXC9sIEOhk=mvYaaSCDcXg`PAM_kNee4uldP9;)KqC}wu*6m zC^xDUj%+)@U)IVyVcyN0kdzllAaar^hCFnflE@M^EHWBAKuT96ii?ohR|u!o#=QIH z`T2u#kgKG9)@()kdhU~z<-jM{bOb%nq;xpI1vEk^$m&+;wGBQ%|Fqe}vw@@6H*C!x zGjs@@Ii%$C-sbj%qWq4sZ453;xK zIABD`*)oV(YVP|o5j3{T;=~RjTbEqK>(^136uz^+sNr=>k$xU%Sx}=U)pZDjdy!v}ZeI6guj1pAIsppxz`AoR+hat$+wwyr0 zP^A)yID>fV{~UEh7O4&lyx>?Ui>T_0uCai zD1w`O0Z%CMGzkp-eg-k*#0b+5EQ?oE@~D~(^XCjvQeA-n+_h~MNOhZntJ5x}%2B{R zzN;Nf44_X%yV%!?bnVP>YhW*J*jPHkQB|rcpzkqSozo1#yd1~rg?~?%EZfVN!7ZJH zDM(6$wi-HVDwOak{0ogxds>y}7hyI)&@OSnvzUzipvT#<@je7NKrzAQ*rm32S?6DE z+rsZ=GTU#hKe9l<5Oy3OLDWvLP~tish5dW`}@rxYxM1YTuY zq>tCw&6&Y?R&IUCejZGkBtg&aNh~H9Mow1$Q%XuLjA$tCD_xDveR6Pb&D{*wbTUxy zPdST*Atb3$jy%uBFcOe7CNNnRy1hFQ9P9`MPu?5!hu$Q8W|~_F_p*oTM`M?V)S>Y3 zqI<4?@`*gA6d;!TM>_fL4q7p~7StVj+;PFoSdFvFgdnc&OS1tVlp}A@Kqad-sx)0O zSWcCu@vBtv=9g=3qP@$qPU;|Z9(%K)Q%&%hA7frO91R}t8c|ob$w&$(MMYo%V+^iQ z`DPo_V-gaud0$HGz?LN%&6isvlfvoNqM3S!|GVk)LiXpX%VKU`M61zcvr34fIgdx@ z?U-$cmX=(YhlOR%jwzNd-YvdSVY;C%)o$r}o$0DQJ%bWEZM3q!I;V2ZY`*1=HRE!)Si#C~_ zT2FE}+qCj9HD$>QUF5BHd454~!$Y#lPDLnvg$QB?VF=|D&*xC)MCX|SkP8o5E371m z{V0rENJ~3%Zp8tt%q)3PDSm`fB~gZNjzYIT3i3kwpg-Mf3d<6-{#uVyRMy8{<=^Yn zp_YWaSb3Hia0elxO__}G(EX+#RxHF%G%27y$bgLd+uMjB=mNVSM3l?*-F>C!BCZP+ z{(+n+)q&!vk=c**{DMJY463Is`b5d3yxR_d$w_dL5YR3-5Uy%Y;H`eToLMKR0Rp_?=>#4 z*A%4BJgu-ysy~6;x<;!i%Y#RX<2L}RgF4e~5+pA_ywAY3 z2oI}A`YhB%t?H~9b5y>omh|=xM+dMp9sYxMdnT6vX4TJk$GBfmkTmqh;^#e(RCvw7 z3%YmjRVMlFEo9(xA{}avZ$0QQCu9q#@;CSa!{Xq9(7(jz0CI-eQkvWF@~;#=vZ69T zjmo#AeKR3?kKkB{VUW)miwhxxy{=3~GKfN9GcpJ|&F)j-&XVJ!DL#X%lUL4`RW1l? z1S4&i^X>ydn7$A-KJwmEZ~6GGud;adw7MJ9Z>oEHE&DNrO@2ZRc7VHwyg5O{QBYv$ z8Zr3z{Qp>hC*uY)aql7W=GnTAzzD(B+tU6>6PfGqN6OJ@dxe-d07xaAEy>d+;5@qt zIGHc*{Ip#^B9i$>T#6N2SUl{LI!^@a6tq4Qk0;Ccn)spuh1mubu9|hLRD{nZM;rph zv(I|MLuljH)0f2Nn=x0WQsT1H)W1Ey-=&F1`Z4@yYgO&E_W7Ib$qM&DV;@FCPDYsg zat)6;p##%9SFGB@XdlNyGZ+V$3`w5kVl){vu}y6=JvcCx%VieIcH8sir}@5f?3E@i z(Eo8F%-8`t$z|r_HRGo%xp&~qSB3N*>9+v#JpK4nT;$wmg)~{gMW`y_Xxk{>x=H#E^|U z791;TA92!s)*_Z5t*UE-9G7EUeSyMs#AV_*;WGFZ!Ja;53wL79gH-Z_I}Ys#Gt}OY zwR&@qDQ~*S2)@&Gj9SQ_Cc(Sw^NAvP7OT~#QPf_>-}U#^#c=%2t={NFHUk9&dD&L) zTFG&IU(l`Gk{r1TIdfUzLfwe8jJI^c7pt`YxMHqzZTQi086HmPU|7lbTX%8@P3yZv zWhw7QtSNedtDNSG^wYtna6mw4vkEV@&2$Xcaj`D;R|#;(`xN^CutNADS%NNU=`X(L zQsV$w=V*|5KL=u|pizR3TFmsDICL$06s5APA`#SKa+qG_6@M|C$_!j$V=|$`!lYw= zuu>wA*!TCM3f4)>zavm)^V88o!9QO8^D5g-KjSX;3eS-ZzWRs_!uh`4VAU4Xfy%6P zD_;+w6#Ju`j*1~n`&G(Jdp--Q$Tz|xjV*^6e z+~rEUjO*o>S<{m7@tEKH1|isIr=r7e$hQb{oA$Z@o@+zhfDw)NYth7aJM~N%b#ywf zNgu)ZbJukn0vmn(fq5=;S4b>(SxBe+E!EV<=fszqa&WS*lAK-hX%xEg7qUdQH0A-j z7awwD11=guEff?ByG$fo{H$X4ilUEOr3@|Jwk=KkzD&IBb1^L2OZiM=Bpnd_y=K7q zA#<>{rSUXum;T{-tTx1SJo&*rhx)>OwJ^D+&^O`jLT52-NK=!nhL2KmE=o&IMojZLHOW^0`1Sd7;hihCa` zB@+9G=mPwO>}7n^@r{MA?pO8-5y?De1lO2_pfWd}riAk zYZ^mJBx8A$52;eE1|g;M9)p_qj7QObEz+OT|Bw^QtjY-ax9=6-qjgx~Bgh1eX{g~) zZj~CVzgHbw>P~i$1C3%eIM#gd2D?-Y!PnK2}8%(5`%1a z8h$-((ZONSrb{nx{4$@se@~@#ZfC{?=jbOUJj1!TP5i#?dM!vqH_hO>##WPiXpwAZ z6>c4}$8W;k=?=;qHH=f9me?KBMPH72T6Hhe&@A~Dj{Flvt3X2`SA_N?(HCDGrEkBA z|8xH%o^WxvXY5k(YkOexvdVo)blR_FnSld$+b{IOxb)(K?1Ke6}#ZPM25$uzl{tr!O;TF~Rb@4mHP|_gXFoJ*xNOwzzv`7ll2#9nI4bmXpB_$v& zJ&F=aceivm1I)bh{XNh7FPwAlIs5Fr)@Mn1^k6j6wxjwp2X3G89%va<6j}Aep!8aV zhs=dFhxcSSg!aGJLngjUB`(lJG2r}qnK^UU?6xtxvr$H*BY0eQ>iO$8uEi|0j?6uv zIq>LV_PY`u`|lwHgz0@owhLj=6JRcK2g48r1`XN3g`8MR$kRTxKU zOxMGXGw)muugl7(7f<|qO%aY`BY%tseZFp=^2Pwy{g^XH4AFoDZ3g5*7epEAussrh z(kACGk&dt3$V-x(8wMtc!K_Q?%27L0p)`wMpwds+f$ue^)% zU%aha;q}w%rLm6xPXUe;nVfOC^Y0JPFsVX8?6CQnm6FFiN3QY5cqi*H`{M zHJoM4Rv;M698QMvQ^<($90B^gn&w%d7=y}K5MnQBO#rPr6_`5VW< z`>m|Rk3H>+mT@!||Au)Ys}1T0f3%#>W-qXS4wHwjAI7&I9M5je&E7nuN_I$v-24l# z;Gkl$;&AR|q3LSYs{91Ks{LI!S{QjFxM{)^-sf)(X2_utEgzu|N=T5&B6vCzbB<26 zWRo?eti1O=8CznW_HCg+95+a=$k3AdcjA==YwCpB22SO!`Z{t(;Aq$vyl^ZU#vSNX zD){g`VC2tqI`rw862u}sUqeDeLT_+Qp}}3m4jn$Xnl;OCCEw!0vZ8WKfQs|Ixn=LB z&IWwV<7N=s89>MMF5MA6xFAkQ5K#9Z+PxR--#tFe3PQ-*0cI+IS(EPK37v2f42kFR zLd*GAQ&t?^jp_gI=4+ge{N1VK<_kJ)vhN(FCfyF zk8XI+yXr|la(^+98^9ovaf^yK178uhxi1-eI(xMW^_>UduBM5ka8 z`>I}}-5YP%to%ZdFsm2>ky4J+UksPxOb-I7l-tUS9ZDMi?O)HtP3JVa28BdHn_7hE@?Y7Fq*~$5K~ER{Uhzc1E}SCMHaGPB)<-_F(ZavEU|Fr%9W`^ zVQ)#v=Ah@#vgVG;*FSc7&Mq;I*1kumz?%TbrmD9+Pr!2UKzTe_PtZ?49VIoLf9{KG z@ryl{F7>-*V%>u>f|QHxd*+kkYaA?EieEYOcBhYS0>ZHaD)tAe8M{EQ41<%wg9+zK zpYMV~d^RPYYTYy8rrIZQ98vbKM_f3{Z8r6a#YRPq6aKD>K2{F!^0WrusJ8+PQIMPV zwA$K$@LR$T8}yXomjaNLA0%-Fx|wnMYrdB?cD$e7X6HYio{dJPumRi-j= EQ+NE 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 literal 0 HcmV?d00001 diff --git a/source/v8/apple-touch-icon.png b/source/v8/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..452c2e2f359087effc181aaf4f34d5c1a56825c1 GIT binary patch literal 23709 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�A_CYTeJ;N@{)F+)*^I0nAV|^=HF5nqP zEzs?}sA5vSmkLrL0Hf)OiCDYCrCbnkY^E-8XHla=lw%_U13B6zbo*EBo(G{B^A2-tex%3Y*^*AsB0BFnp;qH}iTLwA6X{f(mwhpwv}D-F(@*}{v?`TE%7P-2>X@{^dmTd)PU#>6VRA8z z(-=mL0Eg7=)>ctX74hmwHK$7jb3Q>!T<=?_y98&`OO7x#* zFb41|dMF2xlvwh%H7Jvb)Pb))UANFT1F)4|2S5*!ZI?cnp?^U)ppnYaPNIGz$d=Vq z7mSP&fy85_O~a8dkyfd~*iMq`x1&~Ef3UFchR=ufL^9I^i`^0H1jN3;s@Rhpg$Q7^Nx8$!t5P$J~|P%(3r4;jcP|A zxeJ>lKsUfWWC6uJRq;U~lY^oIZTK`!)&gK}$71fn!Ba1oqFU@C)hT8n>#FJ&QX#y7 zO9|jkBB5>R(1a{hjleTn*zPnIRB~Jf=TFj}B8(G~>;Uf7dBWGI57M(W)kI%&(R%p& z0-w`mz`?t%bAd=7$wXLKS^klQu+BZ*1;X`AMuchKOlSTP*6AbHdOhif`RB_60|;r0nGhxIf$7Gf;3q9~+?|JLO+lj!l5xf9P->&~F0hCwJ|^DfFq4#V-}L zW3CjeuF@?-w2a#?U=d%|?b@qXNbD(rM9F3AnnRNomHX?q9#S)d#Z-=m0No}hPZRX8 ztsK@;8G51zi|QpUo-3}c-SPB52!91qQ4Xb#Dmc@KGO-0`bPCF$$$V7nx3wc@{h0dm zvuWqg+LpR}^%CZmh1PL25;)1RpH3V=Np(YL){P`wHLL9}$ESTw;!Mu5FLC!K=*9p8 zb%}LG37NY?Og?m-a=Z!9>=t_OK1#4?G^4IWTt2A{-Q+@uBL^2SIApP+AZJQeQ(Tqe-tSmvaEVU0dH4Cg8LXdiy=}euH6HbC;+rc z1#eiUO_58!n=0bAvSaDlA+Q+0>0$E7*%L*PPn(WH+}fwU)4l|1&q?tE3H_pD)y0>y z@_{4IK3%U^c@tndxd#gkd`R%u3|3(dm3C4;70hrndXX$Z!pV|qpo{Ol=aA?$;f}1Z ztgEIOc4Y!6s)>x0kuc#yfJBDvl#u}yo=$Tcm$I?2l<_H#o1`X0gifKm=PM9`Ge>j=;(wl6>n z{)$3Qv(K&!6Zi0Uw8(5&3}W>9p}O~l2Tf!G}tVbY8%zi4S)jdd)Lm3IAGgIsGpnxSWPGf zq-sv1B1~i2q+BRKL2Ks_+@McJ8`d_5dT|wJP>!JFx{%E#*$#kVY3Be{C;OEBoX1M% z7(KGi0<di3^pH(i0!qJBH-lFzlShht?JTE|^ z7mJF>0%iaho$p-9kmj7lDlf6kV1X$nP|rMowZ!+%qa_uJT<~7pcM)J~U^EiFYi1o$ zcZH<|PO%cL=hQ;~0rcPx$hs=~57mYNG?53Kth=X^`B(A{gxytjqjRS5IV#8|&U=jG zmmWTkda`ZHBx7z9k+bKl?00EdhPdB#w zPeBz~RDn$Ibx& zd1bbg1({5bB@3j%EmPsDKGO`c!l0;v8qWkc#;Qm7`JzonAG?GRX&_-czD+&D%GCi9 zyL^$D;>QuU{0bIb`P`y8V(+?RD0Hu5gsLFjsVB({12X6!0J^SnyczI}Q;2K_6Fn$S z+w6_-Q8;k;ls6#|OV`CUa~)dq4JNRJOvXxgQuVGNsYfJPATQHDL*Nty0CQ!D;w@Sd zIAED1ldzoA7^4w+S(Vz#a)z^()l)-V{RM6sm0ttNput5FUo`i)6b)?$>s+Q+w99oV z!jZzXCw2q~60VjA9wa}8U{gvncZ;?_lcc!tuC0N3NmiWW^@bLlSTybl2I(fEk~3KE z^H2^i%1Ig=x*qy|Gax#-Z||PRkeK;> zfD`5#ny3pXQuc-ZxV3c)%;zck;T5R7kR7fG)w2=U8PcAkM<+$2h+%A@MTS`J865pe4dV?HjhNL_VKyhrf2$p`==%rRtJdh$O zWJutoo}l1xF%vu#XFOg^;S?7o_SEGK~kJyRUch>C#LfelYafnCX3D9yP6(ADTlHVXs z?TUxb)fkeWG+P0~Rw@dCmAX^7#&m)yJWQ2<>zs62}-7h2#=l2EKjS*YL+dC|Tw zunxW8qOi9U*GQ#Mm9{ix z>S$cKU`4m*k%iS~UIgn(M-7Z?oW^)hQF(80`yyvF_AccP#?ea#O5G`ZGoV?h*oVr& zVk8B{RmBGUPF1wYb_P@`UHf zMAMWKNd#QCgcUoKD5Zb+$dN-MYvJU-Z~r}g#Zto)48i?C9h!uL8c`Zgh+-i1Hsk=l z?h+w{F8peGXyu5gug7ejX_*P3qx{s1WY@w)y^do5&?G07E7TOyzJN$s#uJp`%cNb3 zXL`>So+bF}M1iQ8)CG9+0*M?_8`K;z;u41{jR5-4+5vQ_lmXDG{SxQq$)ZvaC`(_E z0BBW#FVYoCcZI0JoimY>D2k<`0ZsQzMzmBEICMQycpZ3J^+li@dp#do$^!ZCP9bE4 zv))}uNkLI*5>{AN%o95?$9Wnkdpc2^vuTw>m4?ik0rdX;`}#`7^b?G~{bdGYzQ`2I z9Di04j&o}g{B>)C^lF08i(v&z2|xZ!l`9D3EEdVL3w-1jI>VOb5& zLwH!1TGcBG1qblPZc-#v`1{aC*MlZnO|8zN3hw z-%*qYq9~z4`btaHNAa0Bg%4*YZe0iT^?_+EES22%Frjbf(6Y86XINDp9msgfSJtgr zxk@u|XjPMhJc-adE=1vS4vbPIdnkj2KD0(ChX9={mY={8-7keCM>iR9oRDbi$MwV<>}Es5z=3lYVBD#52nah+95CE5lP%{lOFy)Vagz-jdt zNj|!7kLPkIUw9pzRwkKpxQNuYv9Ul(Clgs>-FgVLj8K`n!1TmPqJ9;^&#F|>Exai~ zslTGmsnnrlV(kF>hoy2xq5%-)raeMJ^}!}0}Gu!m|`LlNp=fMw7ks}Pyh<#AZKY> zPHqPkB00?Vw9f#m5VpD(A&6nA)yG3T6ZPZJQhM!hXvucW4EqETzx_D?JzF7xDUc;3 z8|DFrN;ET2d&yxLXW%X()roE;pjaJL%&0JUlI%MV;V>md-9mq7Fs+3pk`F&jk*sA7 zmPzIjFAhyvf;Q`sIPaDeoF@57p&3ia2#tAXV4nawlUP$KM+M4}u9WweXh2DqItR3J zLUiyxCnI!2IUI{oUPtW(3Dt`3DJq0t4}Gr%v|h(CBp-hC?H*W3;tX{*(3%ClsR|ES zUL_|fmm~Q9k;>s9SB4$$y$2cA}ak>tZ~-B0>xid-gT`Uq% zhc2nyDxu^kUQ3?Tw9g8~i;AddHmL8R`@f2SL&$xJ-gb2kz3OPajsr+O`qsBT4$mY~ zsP07tBswO}fk!u_as-T(@Xm!N=fMHZWfv96FD?LTQZgw*?0{b@*P~d;9I{MlO{pA} z($W(&LEpcqLIf&y(~T`;(viW39G75j#0_*~>H^Sn06NS0d#P8H+p&bkH%VVIHL$@{ zA9(igtM&BJ>j2bhFOq!A!~1@c%IV)E-80dSRc;|#HiI*mO=&&`^^vngHxk}-p}`ip z;3_;_Di$hCgjvosq?cL|53t)R&iiJnSoyK99zIOH^y)tze)!>a4GpEw;0iuQkB`Iz z{mLpxa7|EYZxGCUbG<|gJ2VY4cOn(vCZSF~{j&-Zpd9nGF>o~}mHzlQzIo(##8OuO z%x>QiER(O>x6RewQsTh}AG{ZF<88@gI@#V(N+pw-1Q#{go+)PL@|kolS<3X%n|4YG z{5Vg_#aFkxQlUV*yHtU;yGrID$EQ5HxLEkJBS((V({uG7Otq2i?rwjKY`*StIg^^r zm()1HQsl*==HTaL5-Q8;fKE+wN6MrMq=6GAlF#U+=;Z%V)}sESq>nQ1=5uGntXKcc zZr>5yiGa3`ee7eYXPX;;lts-qHoEuYBzfVLtRtNN5c+v0VQ?3L0PQJQ#;knfTeHUKzJNcCBfWDKj m?p=6pbwJ;R7yV8?<^LZ)>YaA=7a_C&0000 z-%C?r7{|ZoY&%D7TW;9=0Wni@Yia5%hv!f!dSemNg@Pq);vWk|b8YrrcmB|W~hVwe`imAztnzeQwOwynR* z7O-1QwZ2mpy1L2$)nJCIQAkUBKS8N)swVDZC%&HRi^P(NzW@iy(l(ooyV6&?aL!{# zqicWwjM!QWVR(0)zgzcD%-4sOtE5ia(fhNbNqvbikMUzZRGyuo5j z<72UCc@dkOPR@6d6?~m7V2)pcEbpTreL*4|z~?QU4~N6$0j;gAoX5!s%?(Gu)Okn? zK<4`Br`p84k_-AoC=_~8RJ*sQYm_z^ALbQpl=v!s erbB*sY4;CUFd(F=Ho2535Vv6agv)O%b=DmHt z&-)$UHw^ygi}?rk@1?mVH_bmqeb4p#a%vlI8oNsU6U$k9xd2aW-IU+jTxZGSHEe3# z!^g+^+fN5JEBy!Ww0^gxIluA`gFSkV9gQe@!1N%{2_Xx!K5wz`T!H$nE3pDh;ssOt`K7sV?V$2PEgJ+)I zegokCdP`T^!2>8;zXgf8Asl>T)4vNa=Kd1fo_i7Pos%gK{AU1+YqUU)2jLxyLTI}xL?RKj0kW3NDOm<&`bkpDYZwgq<9PFPpAZU%)d!fGO<*Jt zMRi%aVigh@Rlfbc1z62Iax!@gjVJKVpPy$WK#P zyUK*sMFtE{#If(_s1TT$RS)20(t(ZDW<=u>7Ge?%S`H%lJgHDH48jo!oCZkOaTuBu z@xiePVI~l`EdWK?EEyQy3JP{J5_+BjpXc zMQ~oi(T?CJBa`wW`a5E>JUulw*1uE&{hbnSs4h+a%%JD0S%$^B)#=z+l}Wo@jJEOOy5O z(tHC&7tm{2*eqITc{XK0@j!yyZ!Wrn+|FTapc5h)SH4sPh*EVb)xfeWVj?g|N$I+@ zu*dzYclWXYOeT}fnyLAMyx;}hyvN!S+6x!rR}xbbg<{?$uI+3t`#hA z1ViqK6F^{Q2C?u0rWYh~e-hmTkzG9l-hJ2CQXENmf4!D<8d|MZ$6afTPJ5mXr3HFe zate^SYBSih0M5C;88xUR$nkH>RcRd540H#gU@zQX7%&f`%` zc~M^5jCe*P#h=AoC=8>4$L!o362t8nymA%3$s{g%lY-}Rzd8Umo6S*QZg8%!@+h(C zkzdgSKBp0pSdlTXm!Ohx56ePtZ?8H41%-uCjUkB5Q z2FPh^k(p(N-|t77NrzB43SHv5dway%~25X9RU@f&U z%5kHzzwAY)(CR zlLdjvX_zyNnD7sSnI1rJE=r-1;R{NF%cT-Pd3l**MUK{)o58_s7u4}UMMb$|rImM@3>?x4fF~V@CS=5t3_@{wOQtF} zaEdT7Fz^h+a#4vrqk2OWX77Qp6Qy-WT_-m(_>=dd~@z2q{%|53I3*Qd{u{c|M%{F z=R5bFd*6NMJ2*K_aeB~c?p!B2`#R-3Ew_@F9@PwvHhDM2&rQVInkUVnymjq*Tk`F6P>kMt&OuqfVWs)q51=Y zzzs-}@QP#$gCt3|iQ0`_S1Oe@eb`d)acjUuB|uyh34wl_!(ym?@GaX11O(XBk;@^i z&d2(Komih&gvj(Ph|w#+-G+W|?}au6)s5ZRi1yZIG&Iy>+pcQx%T|NqxLfLXb#=7` z#HJ&mrVAGa`f=vWDeOGZ218ONv}D_uofDiNm^W`;h~KjH5Q{rd+oR!lda}lYV`0B>2$95JIEClZ}J}yugDakt81UK7z?4lI~ELLYG1^ zn+f5lB>OdFvoUQeBDd{D zaaA?;H`SxKWIOiO)*vG{7xwf#h;eHnL?^>2Nt0&3x3_mmkUa)!ws*;?$HrX^=xA%j zzM8$Lsj5V6eGTgO*CI9}4?RDBf2wL76(@)*?0ph?s3;^I=`9h!iklzixEzqF*T7e_B###2L2 zNgF!TBCK}J%y#657qb~@jhvvDslzW9GAuz2Fx`JjI zLqz=m;+h7r?7-t#THgn2aVw3@0q8cAK~3|}N1-bpYfoqPtlK_j&YbBs+ui4xxt@ME zoJriRv0ntPDTQ`>2lORf(C_S|ePc6pMJ>=19(f zbda#LLYIFCy4*(S^5{%+M4x*AM)DQo);efbX2M6UufARVRL?TYPxt0rjTz2bD}0jk zV5l0Py>lN7m1k-1dq&3biV(P#KW&MFrx~_>I;P9yuAPRTCxUadk8EfJ~8R^T|j$j)<-lx+O3W7 z(D0q^uC8`>cXzv+n=^aX4>?MFQn$lcdkK2#1GaBBRGy>p=mGntU}K^!Y=d^^5g2y$ zLbIh7E-v$asQ-`0OZs=vcf*qi+ENeK;5hnzxCmp-AdGBWs82i=B|wp}2S)lfQRg&b z&ODd9qF-Cmjev~m(QlYq_8l{dgZZdt#}OHmX4^r`nltCF=x2TKEs=3tl675gpv$yfT>x7_IW+$g5V<{=1;SD`8Fz{3weJn8!L242Lq_dda6$De^R z_b{eE>irxOR%X}Oz5GkBK~>O!2OfA}()IuA2mb|j4F2{%WFI64W#4a{vk-~%uU?by z{o#`vQ0BL@Z_2x-|I$03U_p2a)8SD4|L~`e@yVxOpzrq|e_g*Ag`StM$@kv+;M2Qd zf0}#D+IO{OJ+$`r$ui#>_ZHb7$b^;0uCudGdg;4#J&j~Ck8pZe#yANY_i$Doe=mI8 zz5B%ImWy>j?z!mes5#6FSv_}%f9$w^IOeT}| zR-g=~5QUNF8+e{S!rP)`(F^7x2lvGkP83H(3&pNj{7MojPQ$-X_@i!xUvCPDqIlc; ztc^r*C&{`9yd;e{8o!a_Mg)tUVm#rHOlHC$yw970Z;7AP;RWG+7Mrq|M{S_^pu_R& z42BVdH5|M>8Un@UM8WVOVM??EDQeNR~8F6h5?2Oii#wLL{N_a5#Rg z!8oF~Mu1zi7<>rvPxi3SX$-FMyx|Q|~93 zg)V_;vN#;SPNy9)n1TsE#Vv{JVzD~WPX0u3Ldk5RI2ns&in2&_HkkxSA`dh9jhXu1 zWVOLW_{|}U>7L{JU#ZcKXe^O1gfD}U;yQfd7K%Yq{4pjK`p9G$7A=L5u<;b1BN`7z zIvYZ$Zb%%(Yl+{pErOZ2K2uBzL`$&4`(LS2jcClFgmpQLk?|D2rTEdN zW^n1H;8ODFyd9>*bqG$`jNpxh2+k~pEvF8)_+(fp#w${+PfW^!M0QIQPc>1zo%jWZ z_doH@BMK=5nwVthD6VEqS`RL58>EafBo|d6yQm0d^|i<^E5nw&tthUnM0$2U*|r)| zaxTT=*FcI*qu4z8n&kNP$KT&~L?KuR|4L}dSB$CI;MW#lT|pTtD2BdgcR4CacI+rZ zKH)DaDnM@jR-|vrf@Q@9!cH7R6!pEG-XXlv;r;LJ<2@26SfN_Fmg1T;XSX(ir&wcS z%Q2ii(}Tvw1~gFYy^c75T9WFjGPE6OLs@k#@d2A5uGk21X)3rS>EJou@%TMGM*?^Y zRK#7VmQ(zG(;mWKi;DUtv@{<^V|_hw35T(l#-Ode6*c?oQL?iDJ1c7tx}|)SPe|NI zYgZC#-fdQ zk>-|z*mJNI;e~ay)~16?&Z4y|1qRxSIC}r)w$N?FhYyBg`FbdcztC^m3$d^f4aa+M z@?H`>o%#3jOhyz3bH&h?_d|18d(?Ze@w{pcY7uc&WC*!F|q))fA~@#Ut(}@5W_$J8HS%3M(^q4xH@zN zSAX^s^qoJ8#-4seR8g+TCW?Efy|eYat%0;4s9>UW6X{TiEyY zBV_-Rqe8hwrc&Y|C@y1znoJwU0x9;i}XC!Vo}a_eUOKm#6}K7D$N zv&Q_k2k~y6vZTsqzm!5KHWB|u+=jliTjt(a&X&I9_$cp1Ib;UL`;bj~#>2^WP@gj% zj`nl<+$QLA=r?hL+BHSA24_Q=m?3l7D&p#ctl@9_1qHP@rQ8`u`3-xg5>NK}d_Eij z>vogu8s!e@tY$f9gxj#2css@)k{F1$GL%!frYHZB z`NaIgWD}LQHb9?8zC_#}U)~L#a`1TKAGy2+sN&bdS7&@?(rPi(F^@9ii202lE-4x(I@bm-~JA-zW(>v*wROS zMPtB(cxoNZ5!uJ`XbkciX)GF`SziM6>LRFD6+%PnYG7FGJ3d}s9i)FU=D}Ke&Mdk!bh^dgS(64l!X=gy-t$E;^Q zM`K|iUQ~c>BNX z=H})~ob3E@!gSuPgT+2a=3D7|oVZ(=tE?V`o;Yll!^ya89pTi`TxR^bmgR$zZ?pN$ z=DS>`c_P+71%JvZaiw<&J&!%pQHPA*mGH})XYG@Oy$=gx)<8)dtC4Im)?A=7alm79 zgyxAdyB^-O-fL-&8g`w5cwmU|Z-BG2%e}=<{Hd0y?>N8s4902SbNqVZ{atPG2+F2hA9~kvW8AZB$0!%B%x=WOuobdz zvAJ$){S{d5^Xxfu?m7NZKO)@Yd35qC*^aR}vTxj6r*Sd0{~EsWnUtqI`^SNQJoayu zDJMa;gKVHRiz8diM_+^w;eX_jNA4+pmOo%=yaIvNld=A1dEkaBme)f5Pvx=e0_8DS z8ZJX_)AcI6muF$dj2ZV7fAE1T=zHa#v9fFUE1WF%fUU1gSa}RTtHbKr4qk=z_-pW7 zmI=z`zi0SUPCSF|=l>D^^Vt^|dh-uR===qgw5M^F7Qa1Z`iy!etjw;ld#nztd-BD9 z!n(`X;2ygXQ>IM0XZXvXd=>xw+2?YO1^bhK@iq9S6|)?O%OrEZl*``91z>q1W5=Iw z+(h+@@4i=i}=)aO39x%2GU0|36lUT=Ji> zdY^oH6IDL~|5IYao^v8SY{{^!( zmgl@y=D~k`CHyz+{Yn-t*}!smHj|9~Kg?!!ZG4@vvWscSb5yT@#F6_?QYRma>2L3M cNY?1>ul;4$zN;>K#{J`d58Us8|A#&Be>w(|Hvj+t literal 0 HcmV?d00001 diff --git a/source/v8/fonts/slate.eot b/source/v8/fonts/slate.eot new file mode 100644 index 0000000000000000000000000000000000000000..13c4839a1975d4c92d66753d75553f922743c6ef GIT binary patch literal 1876 zcmaJ?&2Jl35TEDWeRg&sP8)xqh$Kr)Yzaiu#`dnNaHtS!Xx9i53LF}#nAmmP`Xfq= z;s{Zte*qCEK;i~h4hYFPaA-x4sD#vVrBXQ{MIaD@1Ke8kn|8tnQ^fdI9N^x@? zd<=RUJW{D`U;b-v<0kYSA}zO8E|&DaCqF0BzlPme0}$TUZbAP8`m<~GR{K~75*dg= zcCEQu4DE@ZpmS=+>&5muJwb0nf0^x#V!izR7X1vpggLV7&CM3_1j&!tPMS_)mkgrN zC!rsJe5kniow8zt{RT+zltXle=pd}!=-!|+8X9a|iyqm&z#GOh#?Z4hMmoI$K1va6 zrUYgm&_U=R+`ZrJ0!LQ9E`42ef0@uHvC8U zo}w4%B?O&MCX$JGEG)w^HIqqa()pb0xK4IFpUb457c*fwDPqaQf|z%md}h1{#>ac0 zD>_@{@&c$_-fEYWRBE3yj7U8q4MTz%hA^cOxdwei%19MlXpM(P_)+e=@Rm}B>tXap zwoqO*DogaoKF+^`!zvX>{f10 zq*F6dk@0&Ok4=k2cHR|EKKaOn+_Q3KG-~~J-9n!;&D+d{W9=SQ|IqlDm9?y2uUl{( zi(0o$Q@Cby<g+B7U zE7gMM6{=S}Ps}C~lhg72%h#4X&vB-0d)je4Z)w>(?>M%-xE~jH;l@L}Lcyy(n4O9z z65lS`w&R>XbW_^$2bKN!lz(S%N3N!tcP>R={D&-^3rjyfS-aWi!AkH>sk+00G5&qW zC1%n(1Gmpd;5$IPUF_Lw@K%&WbbxEX?LgKcF9x!K$J`8LiMQ^#KsG5yOZ=|rBS1K&l2uG4tC&hwF_o-hDp_Le zTrgI}?0+pse + + +Generated by IcoMoon + + + + + + + + + + diff --git a/source/v8/fonts/slate.ttf b/source/v8/fonts/slate.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ace9a46a7e1ed6b6ab3de2f30ef3e27c572f88d3 GIT binary patch literal 1720 zcmaJ>-D_KA7=PaL@t*V?ZMro%kz(6pV-rwZyCyk@Q7?wb>UJv9`gO6wj7^qiCTUqB zO%X@;7dX69!8^V6LWJzXiw!F%45qgVdLa}=5xvm6E&iVKo-9$jJ@CHI_viaTf`}a2 zC!H2wcyVDVd0amU$>&(FZ8pn0bm7yth{U7dH)`ef4)6r{E^wmO*t_`0^~*QG?-S|8 zt!lYq{5ky*k?|Sy{uTt*p8hrX-@re<)$DYS^+1t{800m!H_O^}@g4X@@W-3w?hZXf zuY!M;^{sNV`qeJ|2)=?Gg`Mqo2XzAEd#oqjAaRXMBJF+c79{T|EPkbe7-PE;5S;Q~ zaGL1Q(r@%{&}khDI-bPX!~GUGz-0@x9Aaiik?BxrHq?#(PnWnI%nYaReOv*$ZSm>?)ctla|1hAG;T1^YPnfOv{N&_J8ekcvoG^Cm?MLpzb znO-8ASEU{s)D{<<&JKz%JjTWAM|EWWzjHMajT;ECdZ?bsKw&|^tZONrkvOuIkI%De zUYTtG_26}0jYK0>4*B1QgBuPLXU?}t^*TiboK|r`R>P0_HD+(cdi{Ze{FKYDLBs0R~?v6B%Rx~Edo2aasT@IJ-vtfG(iE^ z$Awv_E5l{^C4s84a|;3+->t#z!u^V-9Nj!@+Ph(RslFP9tMyA^DCS*vdNzG<@yc2l z`u?ov&H8>AuC0gXeBbj{4$|U#n6XQ^x*FE+&d;P>_lp(J^Zj%8%oMl&cI_ZN6TKO{ zkvFp2-&{yO{TDd~50<`txN&oc<4*8TskuV~pXj~g5i{t$k=GYVU^@bQTx>a5uvcK? zADE$i`dge4A3((KH9;?{zv*7K*f>Jt^humckR5yQeHf=xv0R7Ti)jP&N=%#Ng5wPM z_VCv|5z{smX^sCCV+<0Gsc02b(JH2*RZK;zn2MJ0U5I^E%r-TsOdYDyD_EDQO?BF) z7OFc*Cuk9TtZz5Uo$8RKb(q)a%}C8|gD__z_YMNoV9|<#sst6tUZ*|mXK52w&tq|_ J6Wq-M;U6NW`v(93 literal 0 HcmV?d00001 diff --git a/source/v8/fonts/slate.woff b/source/v8/fonts/slate.woff new file mode 100644 index 0000000000000000000000000000000000000000..1e72e0ee0018119d7c814c2097cc60c0bcd05d84 GIT binary patch literal 1796 zcmaJ>&2Jl35TCanZ=GF;-Nqj%Qj#SmwgjS~vAs(b4i$%lc7v*fuR|jhlemtH?Nqf< z5&;$c3y8RZ#0{p83^QtGf$~^ZU#vdPL3b z4fcBr_DN>rKz!G#?&4f~pM4ZRM6a}~ts1aTadwIM%N_dh>UO7#K7YRFXF@YA68l_? z@xFm7>0K?wZ&VUvut!OxMlIIQ5*<0_&Hha~Yl49Y@PK@!7+CqFG*;eClSR)#j$=Xw zNnrjF9T`VX|4zRT99<||DqHk_nzSa(NzO5voBad{L?lOWoE4r?ZbRP(V_X@TZL>{} z(3A8mk}l-3xojrwNJr*pi-lsLQVxSKC{0w##ljO}){#>poy#tYg)pcTCk9|L<3To?f*omEO$b9ODUa}gVj!a zAvUB1l6OCpmTg;7PgnO)phbF-Xik@UVo+OLa3((}zVs*;Zywi?{r}GOL=0{q1ou!q ztD%;HAbGE?Z5HC#RzAMSTXWiN9ioS*i+Usm@#fI}eK@$`F!8DQHtAj`iEnm!UKH}P zNl{d*%%o>TwzLq6ppv_9BR_a$H<|Q)z2RXkyY6k4BJlQ)o4+xU@=Bif%MA~%sib$? zbw%hV*Y96nzi0MvpHdWZeO#D>x^i4rP!XsqKRYk5@ZB2RF5E9QWp(qg81F^VmBvaG ztu(Ggk(kS7r)DyTm#?ozQ4q}d{!9==(dt@sJ_vk&`7k5ChZ~1PD=Sgs?%Z@HoBe#* z_k-a4JvVKwyWWZ=q2@1#9uk~9EfrHBtA=!8%MC` zIGu@c6SyDi7WCym@ z2-w*rE$c_UfviKEL=Vy>={0bo+(i5#P1q3$6VB``hVMrCzU@B6vbqKcPy}m-BtQn- zkylU>byNe6DE>18g5d9bm%bZqa|qF=7&3(|U!AY)%Yg-vOsqKIq$w0D$r*3}ks4=+ z>U6?w2xMd=B$;zQ9v)F1K7KwfQ9|)<9nl&i?6-rchs{I8LC1eK^@#(|^QwB-{VeQz zoHLn@cwG?Yo(X!F(Q8iBOqSNs${h}C*?qJYLuZAnVXqx{ww|}Ux0`ca^V#hz?c7{r z7ldYbmk!M1m3G+IYC6(!VcCzqp&pJkZ#1@kw2W<^EJMqOM;^&dq6ELC*|pK!(cC0< zbZtF%BzLsuTw5O*+eg;dX0a+hcfI=gj8a~qWYJoMamHAo)!Qq|6&~9S8`{d0T?L&% z@$R=P6H0rTp6V+-Dlb>EB67JEMQ>kk%`y}{hvBC(RNEw)*%|U|4>SL+B=3rE@y*rw zR_bLZr&~XN?C;+yx2IilcDnrb?M)}An;DsTe@^rq$9L-UWNqY_oTyWyYisN3CMIh; z*C)b12exYgK^2c4S}J#2YJ+00rUlj%+LqQ7E%lldEc`K|1Bky)iLkwF{Wltvj!{A+PBEzhE3BX) zFBgqmj@&z?N1*=OK?z54T7is8FiA(N66oe`X+cKl>`n&&000000HC;3 zk^ug-#56-JW5JAtMV6Rgj#+|9A(7;@^`+^dWy@Alt7D86w|;R>QMs>d+47HJVfKhH aD;vc&%m&dlj4($-ipx}q&#}A+00017%3vV? literal 0 HcmV?d00001 diff --git a/source/v8/images/logo.png b/source/v8/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..dfad9d954edbd6a6e852a3d5d87fc4291006ae2f GIT binary patch literal 41086 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 literal 0 HcmV?d00001 diff --git a/source/v8/images/navbar.png b/source/v8/images/navbar.png new file mode 100644 index 0000000000000000000000000000000000000000..df38e90d87e1a215371b4977e18cde90f8832537 GIT binary patch literal 96 zcmeAS@N?(olHy`uVBq!ia0vp^3Lwk@BpAX3RW*PVQ%R6tFatx` + +includes: + - 00-WIP + + +search: true + +code_clipboard: true +--- + + + diff --git a/source/v8/javascripts/all.js b/source/v8/javascripts/all.js new file mode 100644 index 0000000..daf4f01 --- /dev/null +++ b/source/v8/javascripts/all.js @@ -0,0 +1,2 @@ +//= require ./all_nosearch +//= require ./app/_search diff --git a/source/v8/javascripts/all_nosearch.js b/source/v8/javascripts/all_nosearch.js new file mode 100644 index 0000000..402730e --- /dev/null +++ b/source/v8/javascripts/all_nosearch.js @@ -0,0 +1,27 @@ +//= require ./lib/_energize +//= require ./app/_copy +//= require ./app/_toc +//= require ./app/_lang + +function adjustLanguageSelectorWidth() { + const elem = $('.dark-box > .lang-selector'); + elem.width(elem.parent().width()); +} + +$(function() { + loadToc($('#toc'), '.toc-link', '.toc-list-h2', 10); + setupLanguages($('body').data('languages')); + $('.content').imagesLoaded( function() { + window.recacheHeights(); + window.refreshToc(); + }); + + $(window).resize(function() { + adjustLanguageSelectorWidth(); + }); + adjustLanguageSelectorWidth(); +}); + +window.onpopstate = function() { + activateLanguage(getLanguageFromQueryString()); +}; diff --git a/source/v8/javascripts/app/_copy.js b/source/v8/javascripts/app/_copy.js new file mode 100644 index 0000000..2cdadf9 --- /dev/null +++ b/source/v8/javascripts/app/_copy.js @@ -0,0 +1,15 @@ +function copyToClipboard(container) { + const el = document.createElement('textarea'); + el.value = container.textContent.replace(/\n$/, ''); + document.body.appendChild(el); + el.select(); + document.execCommand('copy'); + document.body.removeChild(el); +} + +function setupCodeCopy() { + $('pre.highlight').prepend('
Copy to Clipboard
'); + $('.copy-clipboard').on('click', function() { + copyToClipboard(this.parentNode.children[1]); + }); +} diff --git a/source/v8/javascripts/app/_lang.js b/source/v8/javascripts/app/_lang.js new file mode 100644 index 0000000..c1bd6b2 --- /dev/null +++ b/source/v8/javascripts/app/_lang.js @@ -0,0 +1,171 @@ +//= require ../lib/_jquery + +/* +Copyright 2008-2013 Concur Technologies, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); you may +not use this file except in compliance with the License. You may obtain +a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +License for the specific language governing permissions and limitations +under the License. +*/ +;(function () { + 'use strict'; + + var languages = []; + + window.setupLanguages = setupLanguages; + window.activateLanguage = activateLanguage; + window.getLanguageFromQueryString = getLanguageFromQueryString; + + function activateLanguage(language) { + if (!language) return; + if (language === "") return; + + $(".lang-selector a").removeClass('active'); + $(".lang-selector a[data-language-name='" + language + "']").addClass('active'); + for (var i=0; i < languages.length; i++) { + $(".highlight.tab-" + languages[i]).hide(); + $(".lang-specific." + languages[i]).hide(); + } + $(".highlight.tab-" + language).show(); + $(".lang-specific." + language).show(); + + window.recacheHeights(); + + // scroll to the new location of the position + if ($(window.location.hash).get(0)) { + $(window.location.hash).get(0).scrollIntoView(true); + } + } + + // parseURL and stringifyURL are from https://github.com/sindresorhus/query-string + // MIT licensed + // https://github.com/sindresorhus/query-string/blob/7bee64c16f2da1a326579e96977b9227bf6da9e6/license + function parseURL(str) { + if (typeof str !== 'string') { + return {}; + } + + str = str.trim().replace(/^(\?|#|&)/, ''); + + if (!str) { + return {}; + } + + return str.split('&').reduce(function (ret, param) { + var parts = param.replace(/\+/g, ' ').split('='); + var key = parts[0]; + var val = parts[1]; + + key = decodeURIComponent(key); + // missing `=` should be `null`: + // http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters + val = val === undefined ? null : decodeURIComponent(val); + + if (!ret.hasOwnProperty(key)) { + ret[key] = val; + } else if (Array.isArray(ret[key])) { + ret[key].push(val); + } else { + ret[key] = [ret[key], val]; + } + + return ret; + }, {}); + }; + + function stringifyURL(obj) { + return obj ? Object.keys(obj).sort().map(function (key) { + var val = obj[key]; + + if (Array.isArray(val)) { + return val.sort().map(function (val2) { + return encodeURIComponent(key) + '=' + encodeURIComponent(val2); + }).join('&'); + } + + return encodeURIComponent(key) + '=' + encodeURIComponent(val); + }).join('&') : ''; + }; + + // gets the language set in the query string + function getLanguageFromQueryString() { + if (location.search.length >= 1) { + var language = parseURL(location.search).language; + if (language) { + return language; + } else if (jQuery.inArray(location.search.substr(1), languages) != -1) { + return location.search.substr(1); + } + } + + return false; + } + + // returns a new query string with the new language in it + function generateNewQueryString(language) { + var url = parseURL(location.search); + if (url.language) { + url.language = language; + return stringifyURL(url); + } + return language; + } + + // if a button is clicked, add the state to the history + function pushURL(language) { + if (!history) { return; } + var hash = window.location.hash; + if (hash) { + hash = hash.replace(/^#+/, ''); + } + history.pushState({}, '', '?' + generateNewQueryString(language) + '#' + hash); + + // save language as next default + if (localStorage) { + localStorage.setItem("language", language); + } + } + + function setupLanguages(l) { + var defaultLanguage = null; + if (localStorage) { + defaultLanguage = localStorage.getItem("language"); + } + + languages = l; + + var presetLanguage = getLanguageFromQueryString(); + if (presetLanguage && languages.includes(presetLanguage)) { + // the language is in the URL, so use that language! + activateLanguage(presetLanguage); + + if (localStorage) { + localStorage.setItem("language", presetLanguage); + } + } else if ((defaultLanguage !== null) && (jQuery.inArray(defaultLanguage, languages) != -1)) { + // the language was the last selected one saved in localstorage, so use that language! + activateLanguage(defaultLanguage); + } else { + // no language selected, so use the default + activateLanguage(languages[0]); + } + } + + // if we click on a language tab, activate that language + $(function() { + $(".lang-selector a").on("click", function() { + var language = $(this).data("language-name"); + pushURL(language); + activateLanguage(language); + return false; + }); + }); +})(); diff --git a/source/v8/javascripts/app/_search.js b/source/v8/javascripts/app/_search.js new file mode 100644 index 0000000..622aea6 --- /dev/null +++ b/source/v8/javascripts/app/_search.js @@ -0,0 +1,102 @@ +//= require ../lib/_lunr +//= require ../lib/_jquery +//= require ../lib/_jquery.highlight +;(function () { + 'use strict'; + + var content, searchResults; + var highlightOpts = { element: 'span', className: 'search-highlight' }; + var searchDelay = 0; + var timeoutHandle = 0; + var index; + + function populate() { + index = lunr(function(){ + + this.ref('id'); + this.field('title', { boost: 10 }); + this.field('body'); + this.pipeline.add(lunr.trimmer, lunr.stopWordFilter); + var lunrConfig = this; + + $('h1, h2').each(function() { + var title = $(this); + var body = title.nextUntil('h1, h2'); + lunrConfig.add({ + id: title.prop('id'), + title: title.text(), + body: body.text() + }); + }); + + }); + determineSearchDelay(); + } + + $(populate); + $(bind); + + function determineSearchDelay() { + if (index.tokenSet.toArray().length>5000) { + searchDelay = 300; + } + } + + function bind() { + content = $('.content'); + searchResults = $('.search-results'); + + $('#input-search').on('keyup',function(e) { + var wait = function() { + return function(executingFunction, waitTime){ + clearTimeout(timeoutHandle); + timeoutHandle = setTimeout(executingFunction, waitTime); + }; + }(); + wait(function(){ + search(e); + }, searchDelay); + }); + } + + function search(event) { + + var searchInput = $('#input-search')[0]; + + unhighlight(); + searchResults.addClass('visible'); + + // ESC clears the field + if (event.keyCode === 27) searchInput.value = ''; + + if (searchInput.value) { + var results = index.search(searchInput.value).filter(function(r) { + return r.score > 0.0001; + }); + + if (results.length) { + searchResults.empty(); + $.each(results, function (index, result) { + var elem = document.getElementById(result.ref); + searchResults.append("
"); + }); + highlight.call(searchInput); + } else { + searchResults.html('
  • '); + $('.search-results li').text('No Results Found for "' + searchInput.value + '"'); + } + } else { + unhighlight(); + searchResults.removeClass('visible'); + } + } + + function highlight() { + if (this.value) content.highlight(this.value, highlightOpts); + } + + function unhighlight() { + content.unhighlight(highlightOpts); + } +})(); + diff --git a/source/v8/javascripts/app/_toc.js b/source/v8/javascripts/app/_toc.js new file mode 100644 index 0000000..350280e --- /dev/null +++ b/source/v8/javascripts/app/_toc.js @@ -0,0 +1,122 @@ +//= require ../lib/_jquery +//= require ../lib/_imagesloaded.min +;(function () { + 'use strict'; + + var htmlPattern = /<[^>]*>/g; + var loaded = false; + + var debounce = function(func, waitTime) { + var timeout = false; + return function() { + if (timeout === false) { + setTimeout(function() { + func(); + timeout = false; + }, waitTime); + timeout = true; + } + }; + }; + + var closeToc = function() { + $(".toc-wrapper").removeClass('open'); + $("#nav-button").removeClass('open'); + }; + + function loadToc($toc, tocLinkSelector, tocListSelector, scrollOffset) { + var headerHeights = {}; + var pageHeight = 0; + var windowHeight = 0; + var originalTitle = document.title; + + var recacheHeights = function() { + headerHeights = {}; + pageHeight = $(document).height(); + windowHeight = $(window).height(); + + $toc.find(tocLinkSelector).each(function() { + var targetId = $(this).attr('href'); + if (targetId[0] === "#") { + headerHeights[targetId] = $("#" + $.escapeSelector(targetId.substring(1))).offset().top; + } + }); + }; + + var refreshToc = function() { + var currentTop = $(document).scrollTop() + scrollOffset; + + if (currentTop + windowHeight >= pageHeight) { + // at bottom of page, so just select last header by making currentTop very large + // this fixes the problem where the last header won't ever show as active if its content + // is shorter than the window height + currentTop = pageHeight + 1000; + } + + var best = null; + for (var name in headerHeights) { + if ((headerHeights[name] < currentTop && headerHeights[name] > headerHeights[best]) || best === null) { + best = name; + } + } + + // Catch the initial load case + if (currentTop == scrollOffset && !loaded) { + best = window.location.hash; + loaded = true; + } + + var $best = $toc.find("[href='" + best + "']").first(); + if (!$best.hasClass("active")) { + // .active is applied to the ToC link we're currently on, and its parent
      s selected by tocListSelector + // .active-expanded is applied to the ToC links that are parents of this one + $toc.find(".active").removeClass("active"); + $toc.find(".active-parent").removeClass("active-parent"); + $best.addClass("active"); + $best.parents(tocListSelector).addClass("active").siblings(tocLinkSelector).addClass('active-parent'); + $best.siblings(tocListSelector).addClass("active"); + $toc.find(tocListSelector).filter(":not(.active)").slideUp(150); + $toc.find(tocListSelector).filter(".active").slideDown(150); + if (window.history.replaceState) { + window.history.replaceState(null, "", best); + } + var thisTitle = $best.data("title"); + if (thisTitle !== undefined && thisTitle.length > 0) { + document.title = thisTitle.replace(htmlPattern, "") + " – " + originalTitle; + } else { + document.title = originalTitle; + } + } + }; + + var makeToc = function() { + recacheHeights(); + refreshToc(); + + $("#nav-button").click(function() { + $(".toc-wrapper").toggleClass('open'); + $("#nav-button").toggleClass('open'); + return false; + }); + $(".page-wrapper").click(closeToc); + $(".toc-link").click(closeToc); + + // reload immediately after scrolling on toc click + $toc.find(tocLinkSelector).click(function() { + setTimeout(function() { + refreshToc(); + }, 0); + }); + + $(window).scroll(debounce(refreshToc, 200)); + $(window).resize(debounce(recacheHeights, 200)); + }; + + makeToc(); + + window.recacheHeights = recacheHeights; + window.refreshToc = refreshToc; + } + + window.loadToc = loadToc; +})(); diff --git a/source/v8/javascripts/lib/_energize.js b/source/v8/javascripts/lib/_energize.js new file mode 100644 index 0000000..c6eb95e --- /dev/null +++ b/source/v8/javascripts/lib/_energize.js @@ -0,0 +1,169 @@ +/** + * energize.js v0.1.0 + * + * Speeds up click events on mobile devices. + * https://github.com/davidcalhoun/energize.js + */ + +(function() { // Sandbox + /** + * Don't add to non-touch devices, which don't need to be sped up + */ + if(!('ontouchstart' in window)) return; + + var lastClick = {}, + isThresholdReached, touchstart, touchmove, touchend, + click, closest; + + /** + * isThresholdReached + * + * Compare touchstart with touchend xy coordinates, + * and only fire simulated click event if the coordinates + * are nearby. (don't want clicking to be confused with a swipe) + */ + isThresholdReached = function(startXY, xy) { + return Math.abs(startXY[0] - xy[0]) > 5 || Math.abs(startXY[1] - xy[1]) > 5; + }; + + /** + * touchstart + * + * Save xy coordinates when the user starts touching the screen + */ + touchstart = function(e) { + this.startXY = [e.touches[0].clientX, e.touches[0].clientY]; + this.threshold = false; + }; + + /** + * touchmove + * + * Check if the user is scrolling past the threshold. + * Have to check here because touchend will not always fire + * on some tested devices (Kindle Fire?) + */ + touchmove = function(e) { + // NOOP if the threshold has already been reached + if(this.threshold) return false; + + this.threshold = isThresholdReached(this.startXY, [e.touches[0].clientX, e.touches[0].clientY]); + }; + + /** + * touchend + * + * If the user didn't scroll past the threshold between + * touchstart and touchend, fire a simulated click. + * + * (This will fire before a native click) + */ + touchend = function(e) { + // Don't fire a click if the user scrolled past the threshold + if(this.threshold || isThresholdReached(this.startXY, [e.changedTouches[0].clientX, e.changedTouches[0].clientY])) { + return; + } + + /** + * Create and fire a click event on the target element + * https://developer.mozilla.org/en/DOM/event.initMouseEvent + */ + var touch = e.changedTouches[0], + evt = document.createEvent('MouseEvents'); + evt.initMouseEvent('click', true, true, window, 0, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null); + evt.simulated = true; // distinguish from a normal (nonsimulated) click + e.target.dispatchEvent(evt); + }; + + /** + * click + * + * Because we've already fired a click event in touchend, + * we need to listed for all native click events here + * and suppress them as necessary. + */ + click = function(e) { + /** + * Prevent ghost clicks by only allowing clicks we created + * in the click event we fired (look for e.simulated) + */ + var time = Date.now(), + timeDiff = time - lastClick.time, + x = e.clientX, + y = e.clientY, + xyDiff = [Math.abs(lastClick.x - x), Math.abs(lastClick.y - y)], + target = closest(e.target, 'A') || e.target, // needed for standalone apps + nodeName = target.nodeName, + isLink = nodeName === 'A', + standAlone = window.navigator.standalone && isLink && e.target.getAttribute("href"); + + lastClick.time = time; + lastClick.x = x; + lastClick.y = y; + + /** + * Unfortunately Android sometimes fires click events without touch events (seen on Kindle Fire), + * so we have to add more logic to determine the time of the last click. Not perfect... + * + * Older, simpler check: if((!e.simulated) || standAlone) + */ + if((!e.simulated && (timeDiff < 500 || (timeDiff < 1500 && xyDiff[0] < 50 && xyDiff[1] < 50))) || standAlone) { + e.preventDefault(); + e.stopPropagation(); + if(!standAlone) return false; + } + + /** + * Special logic for standalone web apps + * See http://stackoverflow.com/questions/2898740/iphone-safari-web-app-opens-links-in-new-window + */ + if(standAlone) { + window.location = target.getAttribute("href"); + } + + /** + * Add an energize-focus class to the targeted link (mimics :focus behavior) + * TODO: test and/or remove? Does this work? + */ + if(!target || !target.classList) return; + target.classList.add("energize-focus"); + window.setTimeout(function(){ + target.classList.remove("energize-focus"); + }, 150); + }; + + /** + * closest + * @param {HTMLElement} node current node to start searching from. + * @param {string} tagName the (uppercase) name of the tag you're looking for. + * + * Find the closest ancestor tag of a given node. + * + * Starts at node and goes up the DOM tree looking for a + * matching nodeName, continuing until hitting document.body + */ + closest = function(node, tagName){ + var curNode = node; + + while(curNode !== document.body) { // go up the dom until we find the tag we're after + if(!curNode || curNode.nodeName === tagName) { return curNode; } // found + curNode = curNode.parentNode; // not found, so keep going up + } + + return null; // not found + }; + + /** + * Add all delegated event listeners + * + * All the events we care about bubble up to document, + * so we can take advantage of event delegation. + * + * Note: no need to wait for DOMContentLoaded here + */ + document.addEventListener('touchstart', touchstart, false); + document.addEventListener('touchmove', touchmove, false); + document.addEventListener('touchend', touchend, false); + document.addEventListener('click', click, true); // TODO: why does this use capture? + +})(); \ No newline at end of file diff --git a/source/v8/javascripts/lib/_imagesloaded.min.js b/source/v8/javascripts/lib/_imagesloaded.min.js new file mode 100644 index 0000000..65a0e86 --- /dev/null +++ b/source/v8/javascripts/lib/_imagesloaded.min.js @@ -0,0 +1,7 @@ +/*! + * imagesLoaded PACKAGED v4.1.4 + * JavaScript is all like "You images are done yet or what?" + * MIT License + */ + +!function(e,t){"function"==typeof define&&define.amd?define("ev-emitter/ev-emitter",t):"object"==typeof module&&module.exports?module.exports=t():e.EvEmitter=t()}("undefined"!=typeof window?window:this,function(){function e(){}var t=e.prototype;return t.on=function(e,t){if(e&&t){var i=this._events=this._events||{},n=i[e]=i[e]||[];return n.indexOf(t)==-1&&n.push(t),this}},t.once=function(e,t){if(e&&t){this.on(e,t);var i=this._onceEvents=this._onceEvents||{},n=i[e]=i[e]||{};return n[t]=!0,this}},t.off=function(e,t){var i=this._events&&this._events[e];if(i&&i.length){var n=i.indexOf(t);return n!=-1&&i.splice(n,1),this}},t.emitEvent=function(e,t){var i=this._events&&this._events[e];if(i&&i.length){i=i.slice(0),t=t||[];for(var n=this._onceEvents&&this._onceEvents[e],o=0;o (default options) + * $('#content').highlight('lorem'); + * + * // search for and highlight more terms at once + * // so you can save some time on traversing DOM + * $('#content').highlight(['lorem', 'ipsum']); + * $('#content').highlight('lorem ipsum'); + * + * // search only for entire word 'lorem' + * $('#content').highlight('lorem', { wordsOnly: true }); + * + * // don't ignore case during search of term 'lorem' + * $('#content').highlight('lorem', { caseSensitive: true }); + * + * // wrap every occurrance of term 'ipsum' in content + * // with + * $('#content').highlight('ipsum', { element: 'em', className: 'important' }); + * + * // remove default highlight + * $('#content').unhighlight(); + * + * // remove custom highlight + * $('#content').unhighlight({ element: 'em', className: 'important' }); + * + * + * Copyright (c) 2009 Bartek Szopka + * + * Licensed under MIT license. + * + */ + +jQuery.extend({ + highlight: function (node, re, nodeName, className) { + if (node.nodeType === 3) { + var match = node.data.match(re); + if (match) { + var highlight = document.createElement(nodeName || 'span'); + highlight.className = className || 'highlight'; + var wordNode = node.splitText(match.index); + wordNode.splitText(match[0].length); + var wordClone = wordNode.cloneNode(true); + highlight.appendChild(wordClone); + wordNode.parentNode.replaceChild(highlight, wordNode); + return 1; //skip added node in parent + } + } else if ((node.nodeType === 1 && node.childNodes) && // only element nodes that have children + !/(script|style)/i.test(node.tagName) && // ignore script and style nodes + !(node.tagName === nodeName.toUpperCase() && node.className === className)) { // skip if already highlighted + for (var i = 0; i < node.childNodes.length; i++) { + i += jQuery.highlight(node.childNodes[i], re, nodeName, className); + } + } + return 0; + } +}); + +jQuery.fn.unhighlight = function (options) { + var settings = { className: 'highlight', element: 'span' }; + jQuery.extend(settings, options); + + return this.find(settings.element + "." + settings.className).each(function () { + var parent = this.parentNode; + parent.replaceChild(this.firstChild, this); + parent.normalize(); + }).end(); +}; + +jQuery.fn.highlight = function (words, options) { + var settings = { className: 'highlight', element: 'span', caseSensitive: false, wordsOnly: false }; + jQuery.extend(settings, options); + + if (words.constructor === String) { + words = [words]; + } + words = jQuery.grep(words, function(word, i){ + return word != ''; + }); + words = jQuery.map(words, function(word, i) { + return word.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); + }); + if (words.length == 0) { return this; }; + + var flag = settings.caseSensitive ? "" : "i"; + var pattern = "(" + words.join("|") + ")"; + if (settings.wordsOnly) { + pattern = "\\b" + pattern + "\\b"; + } + var re = new RegExp(pattern, flag); + + return this.each(function () { + jQuery.highlight(this, re, settings.element, settings.className); + }); +}; + diff --git a/source/v8/javascripts/lib/_jquery.js b/source/v8/javascripts/lib/_jquery.js new file mode 100644 index 0000000..fc6c299 --- /dev/null +++ b/source/v8/javascripts/lib/_jquery.js @@ -0,0 +1,10881 @@ +/*! + * jQuery JavaScript Library v3.6.0 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2021-03-02T17:08Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"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.6.0", + + // 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; + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return 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; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.6 + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://js.foundation/ + * + * Date: 2021-02-16 + */ +( function( window ) { +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + nonnativeSelectorCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ( {} ).hasOwnProperty, + arr = [], + pop = arr.pop, + pushNative = arr.push, + push = arr.push, + slice = arr.slice, + + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[ i ] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + + "ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // 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: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + + // "Attribute values must be CSS identifiers [capture 5] + // or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + + whitespace + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + + "*" ), + 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" ) + }, + + rhtml = /HTML$/i, + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), + funescape = function( escape, nonHex ) { + var high = "0x" + escape.slice( 1 ) - 0x10000; + + return nonHex ? + + // Strip the backslash prefix from a non-hex escape sequence + 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 + high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + ( arr = slice.call( preferredDoc.childNodes ) ), + preferredDoc.childNodes + ); + + // Support: Android<4.0 + // Detect silently failing push.apply + // eslint-disable-next-line no-unused-expressions + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + pushNative.apply( target, slice.call( els ) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + + // Can't trust NodeList.length + while ( ( target[ j++ ] = els[ i++ ] ) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + setDocument( context ); + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { + + // ID selector + if ( ( m = match[ 1 ] ) ) { + + // Document context + if ( nodeType === 9 ) { + if ( ( elem = context.getElementById( m ) ) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && ( elem = newContext.getElementById( m ) ) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[ 2 ] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && + + // Support: IE 8 only + // Exclude object elements + ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { + + 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 ) || rcombinators.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. + if ( newContext !== context || !support.scope ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( "id" ) ) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", ( nid = expando ) ); + } + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[ i ] = ( nid ? "#" + 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( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return ( cache[ key + " " ] = value ); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement( "fieldset" ); + + try { + return !!fn( el ); + } catch ( e ) { + return false; + } finally { + + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split( "|" ), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[ i ] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( ( cur = cur.nextSibling ) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return ( name === "input" || name === "button" ) && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + 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 Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + var namespace = elem && elem.namespaceURI, + docElem = elem && ( elem.ownerDocument || elem ).documentElement; + + // Support: IE <=8 + // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes + // https://bugs.jquery.com/ticket/4833 + return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + // 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; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9 - 11+, Edge 12 - 18+ + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + // 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 ( preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, + // Safari 4 - 5 only, Opera <=11.6 - 12.x only + // IE/Edge & older browsers don't support the :scope pseudo-class. + // Support: Safari 6.0 only + // Safari 6.0 supports :scope but it's an alias of :root there. + support.scope = assert( function( el ) { + docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); + return typeof el.querySelectorAll !== "undefined" && + !el.querySelectorAll( ":scope fieldset div" ).length; + } ); + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert( function( el ) { + el.className = "i"; + return !el.getAttribute( "className" ); + } ); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert( function( el ) { + el.appendChild( document.createComment( "" ) ); + return !el.getElementsByTagName( "*" ).length; + } ); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert( function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + } ); + + // ID filter and find + if ( support.getById ) { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute( "id" ) === attrId; + }; + }; + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode( "id" ); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( ( elem = elems[ i++ ] ) ) { + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find[ "TAG" ] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { + + var input; + + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } + + // 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 + "*(?:''|\"\")" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push( ".#.+[+~]" ); + } + + // Support: Firefox <=3.6 - 5 only + // Old Firefox doesn't throw on a badly-escaped identifier. + el.querySelectorAll( "\\\f" ); + rbuggyQSA.push( "[\\r\\n\\f]" ); + } ); + + assert( function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll( "[name=d]" ).length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: Opera 10 - 11 only + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll( "*,:x" ); + rbuggyQSA.push( ",.*:" ); + } ); + } + + if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector ) ) ) ) { + + assert( function( el ) { + + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + } ); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); + } : + function( a, b ) { + if ( b ) { + while ( ( b = b.parentNode ) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + // 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 && + 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 && + contains( preferredDoc, b ) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + return a == document ? -1 : + b == document ? 1 : + /* eslint-enable eqeqeq */ + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( ( cur = cur.parentNode ) ) { + ap.unshift( cur ); + } + cur = b; + while ( ( cur = cur.parentNode ) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[ i ] === bp[ i ] ) { + i++; + } + + return i ? + + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[ i ], bp[ i ] ) : + + // Otherwise nodes in our document sort first + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + ap[ i ] == preferredDoc ? -1 : + bp[ i ] == preferredDoc ? 1 : + /* eslint-enable eqeqeq */ + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + setDocument( elem ); + + if ( support.matchesSelector && documentIsHTML && + !nonnativeSelectorCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch ( e ) { + nonnativeSelectorCache( expr, true ); + } + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.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 contains( context, elem ); +}; + +Sizzle.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 (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + + // If no nodeType, this is expected to be an array + while ( ( node = elem[ i++ ] ) ) { + + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[ 1 ] = match[ 1 ].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[ 3 ] = ( match[ 3 ] || match[ 4 ] || + match[ 5 ] || "" ).replace( runescape, funescape ); + + if ( match[ 2 ] === "~=" ) { + match[ 3 ] = " " + match[ 3 ] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[ 1 ] = match[ 1 ].toLowerCase(); + + if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { + + // nth-* requires argument + if ( !match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[ 4 ] = +( match[ 4 ] ? + match[ 5 ] + ( match[ 6 ] || 1 ) : + 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); + match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); + + // other types prohibit arguments + } else if ( match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[ 6 ] && match[ 2 ]; + + if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[ 3 ] ) { + match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + + // Get excess from tokenize (recursively) + ( excess = tokenize( unquoted, true ) ) && + + // advance to the next closing parenthesis + ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { + + // excess is a negative index + match[ 0 ] = match[ 0 ].slice( 0, excess ); + match[ 2 ] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { + return true; + } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + ( pattern = new RegExp( "(^|" + whitespace + + ")" + className + "(" + whitespace + "|$)" ) ) && classCache( + className, function( elem ) { + return pattern.test( + typeof elem.className === "string" && elem.className || + typeof elem.getAttribute !== "undefined" && + elem.getAttribute( "class" ) || + "" + ); + } ); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + /* eslint-disable max-len */ + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + /* eslint-enable max-len */ + + }; + }, + + "CHILD": function( type, what, _argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, _context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( ( node = node[ dir ] ) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( ( node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + + // Use previously-cached element index if available + if ( useCache ) { + + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + + // Use the same loop as above to seek `elem` from the start + while ( ( node = ++nodeIndex && node && node[ dir ] || + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || + ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction( function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[ i ] ); + seed[ idx ] = !( matches[ idx ] = matched[ i ] ); + } + } ) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + + // Potentially complex pseudos + "not": markFunction( function( selector ) { + + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction( function( seed, matches, _context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( ( elem = unmatched[ i ] ) ) { + seed[ i ] = !( matches[ i ] = elem ); + } + } + } ) : + function( elem, _context, xml ) { + input[ 0 ] = elem; + matcher( input, null, xml, results ); + + // Don't keep the element (issue #299) + input[ 0 ] = null; + return !results.pop(); + }; + } ), + + "has": markFunction( function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + } ), + + "contains": markFunction( function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; + }; + } ), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + + // lang value must be a valid identifier + if ( !ridentifier.test( lang || "" ) ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( ( elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); + return false; + }; + } ), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && + ( !document.hasFocus || document.hasFocus() ) && + !!( elem.type || elem.href || ~elem.tabIndex ); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return ( nodeName === "input" && !!elem.checked ) || + ( nodeName === "option" && !!elem.selected ); + }, + + "selected": function( elem ) { + + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + // eslint-disable-next-line no-unused-expressions + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos[ "empty" ]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( ( attr = elem.getAttribute( "type" ) ) == null || + attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo( function() { + return [ 0 ]; + } ), + + "last": createPositionalPseudo( function( _matchIndexes, length ) { + return [ length - 1 ]; + } ), + + "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + } ), + + "even": createPositionalPseudo( function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "odd": createPositionalPseudo( function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? + argument + length : + argument > length ? + length : + argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ) + } +}; + +Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || ( match = rcomma.exec( soFar ) ) ) { + if ( match ) { + + // Don't consume trailing commas as valid + soFar = soFar.slice( match[ 0 ].length ) || soFar; + } + groups.push( ( tokens = [] ) ); + } + + matched = false; + + // Combinators + if ( ( match = rcombinators.exec( soFar ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + + // Cast descendant combinators to space + type: match[ 0 ].replace( rtrim, " " ) + } ); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || + ( match = preFilters[ type ]( match ) ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + type: type, + matches: match + } ); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[ i ].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || + ( outerCache[ elem.uniqueID ] = {} ); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( ( oldCache = uniqueCache[ key ] ) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return ( newCache[ 2 ] = oldCache[ 2 ] ); + } else { + + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[ i ]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[ 0 ]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[ i ], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( ( elem = unmatched[ i ] ) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction( function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( + selector || "*", + context.nodeType ? [ context ] : context, + [] + ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( ( elem = temp[ i ] ) ) { + matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) ) { + + // Restore matcherIn since elem is not yet a final match + temp.push( ( matcherIn[ i ] = elem ) ); + } + } + postFinder( null, ( matcherOut = [] ), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) && + ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { + + seed[ temp ] = !( results[ temp ] = elem ); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + } ); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[ 0 ].type ], + implicitRelative = leadingRelative || Expr.relative[ " " ], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + ( checkContext = context ).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { + matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; + } else { + matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[ j ].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens + .slice( 0, i - 1 ) + .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), + + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), + len = elems.length; + + if ( outermost ) { + + // 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: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + + // 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 ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + + // They will have gone through all possible matchers + if ( ( elem = !matcher && elem ) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( ( matcher = setMatchers[ j++ ] ) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !( unmatched[ i ] || setMatched[ i ] ) ) { + setMatched[ i ] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[ i ] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( + selector, + matcherFromGroupMatchers( elementMatchers, setMatchers ) + ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( ( selector = compiled.selector || selector ) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[ 0 ] = match[ 0 ].slice( 0 ); + if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { + + context = ( Expr.find[ "ID" ]( token.matches[ 0 ] + .replace( runescape, funescape ), context ) || [] )[ 0 ]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[ i ]; + + // Abort if we hit a combinator + if ( Expr.relative[ ( type = token.type ) ] ) { + break; + } + if ( ( find = Expr.find[ type ] ) ) { + + // Search, expanding context for leading sibling combinators + if ( ( seed = find( + token.matches[ 0 ].replace( runescape, funescape ), + rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || + context + ) ) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert( function( el ) { + + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; +} ); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert( function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute( "href" ) === "#"; +} ) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + } ); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert( function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +} ) ) { + addHandle( "value", function( elem, _name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + } ); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert( function( el ) { + return el.getAttribute( "disabled" ) == null; +} ) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; + } + } ); +} + +return Sizzle; + +} )( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +} +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, _i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, _i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, _i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( 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.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the 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$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( toType( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, _key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( _all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (#9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var 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 (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // Support: IE <=9 only + // IE <=9 replaces "; + support.option = !!div.lastChild; +} )(); + + +// We have to close these tags to support XHTML (#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 (#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 (#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; +} + +// Support: IE <=9 - 11+ +// focus() and blur() are asynchronous, except when they are no-op. +// So expect focus to be synchronous when the element is already active, +// and blur to be synchronous when the element is not already active. +// (focus and blur are always synchronous in other supported browsers, +// this just defines when we can count on it). +function expectSync( elem, type ) { + return ( elem === safeActiveElement() ) === ( type === "focus" ); +} + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // 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 (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + 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", returnTrue ); + } + + // 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, expectSync ) { + + // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add + if ( !expectSync ) { + 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 notAsync, result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + // Saved data should be false in such cases, but might be a leftover capture object + // from an async native handler (gh-4350) + if ( !saved.length ) { + + // 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 + // Support: IE <=9 - 11+ + // focus() and blur() are asynchronous + notAsync = expectSync( this, type ); + this[ type ](); + result = dataPriv.get( this, type ); + if ( saved !== result || notAsync ) { + dataPriv.set( this, type, false ); + } else { + result = {}; + } + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + + // Support: Chrome 86+ + // In Chrome, if an element having a focusout handler is blurred by + // clicking outside of it, it invokes the handler synchronously. If + // that handler calls `.remove()` on the element, the data is cleared, + // leaving `result` undefined. We need to guard against this. + return result && result.value; + } + + // 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.length ) { + + // ...and capture the result + dataPriv.set( this, type, { + value: jQuery.event.trigger( + + // Support: IE <=9 - 11+ + // Extend with the prototype to reset the above stopImmediatePropagation() + jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), + saved.slice( 1 ), + this + ) + } ); + + // Abort handling of the native event + event.stopImmediatePropagation(); + } + } + } ); +} + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || Date.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + 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 ) { + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, expectSync ); + + // 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; + }, + + // Suppress native focus or blur as it's already being fired + // in leverageNative. + _default: function() { + return true; + }, + + delegateType: delegateType + }; +} ); + +// 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 (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce || node.getAttribute( "nonce" ) + }, doc ); + } + } else { + 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 Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + +var 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 (#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 = "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, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !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]).+)/, + rcustomProp = /^--/, + 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; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + if ( box === "margin" ) { + delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + + // 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; +} + +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, + "columnCount": true, + "fillOpacity": 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, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: {}, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + // 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 )` (#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. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( isValidValue ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = classesToArray( value ); + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, valueIsFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + valueIsFunction = isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( valueIsFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +support.focusin = "onfocusin" in window; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = lastElement = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + lastElement = cur; + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || 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 (#6170) + if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = { 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 + 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, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + +originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() + " " ] = + ( 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 (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 15 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.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 (#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 + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.ontimeout = + xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain or forced-by-attrs requests + if ( s.crossDomain || s.scriptAttrs ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " + <% end %> + + + + + + NAV + <%= image_tag('navbar.png') %> + + +
      + <%= image_tag "logo.png", class: 'logo' %> + <% if language_tabs.any? %> +
      + <% language_tabs.each do |lang| %> + <% if lang.is_a? Hash %> + <%= lang.values.first %> + <% else %> + <%= lang %> + <% end %> + <% end %> +
      + <% end %> + <% if current_page.data.search %> + +
        + <% end %> +
          + <% toc_data(page_content).each do |h1| %> +
        • + <%= h1[:content] %> + <% if h1[:children].length > 0 %> + + <% end %> +
        • + <% end %> +
        + <% if current_page.data.toc_footers %> + + <% end %> +
        +
        +
        +
        + <%= page_content %> +
        +
        + <% if language_tabs.any? %> +
        + <% language_tabs.each do |lang| %> + <% if lang.is_a? Hash %> + <%= lang.values.first %> + <% else %> + <%= lang %> + <% end %> + <% end %> +
        + <% end %> +
        +
        + + diff --git a/source/v8/robots.txt b/source/v8/robots.txt new file mode 100644 index 0000000..26b4d70 --- /dev/null +++ b/source/v8/robots.txt @@ -0,0 +1,2 @@ +User-Agent: * +Allow: / \ No newline at end of file diff --git a/source/v8/site.webmanifest b/source/v8/site.webmanifest new file mode 100644 index 0000000..9d8329f --- /dev/null +++ b/source/v8/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#2e3336","background_color":"#2e3336","display":"standalone"} \ No newline at end of file diff --git a/source/v8/stylesheets/_icon-font.scss b/source/v8/stylesheets/_icon-font.scss new file mode 100644 index 0000000..b785420 --- /dev/null +++ b/source/v8/stylesheets/_icon-font.scss @@ -0,0 +1,38 @@ +@font-face { + font-family: 'slate'; + src:font-url('slate.eot?-syv14m'); + src:font-url('slate.eot?#iefix-syv14m') format('embedded-opentype'), + font-url('slate.woff2?-syv14m') format('woff2'), + font-url('slate.woff?-syv14m') format('woff'), + font-url('slate.ttf?-syv14m') format('truetype'), + font-url('slate.svg?-syv14m#slate') format('svg'); + font-weight: normal; + font-style: normal; +} + +%icon { + font-family: 'slate'; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; +} + +%icon-exclamation-sign { + @extend %icon; + content: "\e600"; +} +%icon-info-sign { + @extend %icon; + content: "\e602"; +} +%icon-ok-sign { + @extend %icon; + content: "\e606"; +} +%icon-search { + @extend %icon; + content: "\e607"; +} diff --git a/source/v8/stylesheets/_normalize.scss b/source/v8/stylesheets/_normalize.scss new file mode 100644 index 0000000..a38db2a --- /dev/null +++ b/source/v8/stylesheets/_normalize.scss @@ -0,0 +1,427 @@ +/*! normalize.css v3.0.2 | MIT License | github.com/necolas/normalize.css */ + +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + */ + +html { + font-family: sans-serif; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/** + * Remove default margin. + */ + +body { + margin: 0; +} + +/* HTML5 display definitions + ========================================================================== */ + +/** + * Correct `block` display not defined for any HTML5 element in IE 8/9. + * Correct `block` display not defined for `details` or `summary` in IE 10/11 + * and Firefox. + * Correct `block` display not defined for `main` in IE 11. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} + +/** + * 1. Correct `inline-block` display not defined in IE 8/9. + * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. + */ + +audio, +canvas, +progress, +video { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address `[hidden]` styling not present in IE 8/9/10. + * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. + */ + +[hidden], +template { + display: none; +} + +/* Links + ========================================================================== */ + +/** + * Remove the gray background color from active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * Improve readability when focused and also mouse hovered in all browsers. + */ + +a:active, +a:hover { + outline: 0; +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Address styling not present in IE 8/9/10/11, Safari, and Chrome. + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/** + * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. + */ + +b, +strong { + font-weight: bold; +} + +/** + * Address styling not present in Safari and Chrome. + */ + +dfn { + font-style: italic; +} + +/** + * Address variable `h1` font-size and margin within `section` and `article` + * contexts in Firefox 4+, Safari, and Chrome. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/** + * Address styling not present in IE 8/9. + */ + +mark { + background: #ff0; + color: #000; +} + +/** + * Address inconsistent and variable font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove border when inside `a` element in IE 8/9/10. + */ + +img { + border: 0; +} + +/** + * Correct overflow not hidden in IE 9/10/11. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Grouping content + ========================================================================== */ + +/** + * Address margin not present in IE 8/9 and Safari. + */ + +figure { + margin: 1em 40px; +} + +/** + * Address differences between Firefox and other browsers. + */ + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} + +/** + * Contain overflow in all browsers. + */ + +pre { + overflow: auto; +} + +/** + * Address odd `em`-unit font size rendering in all browsers. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +/* Forms + ========================================================================== */ + +/** + * Known limitation: by default, Chrome and Safari on OS X allow very limited + * styling of `select`, unless a `border` property is set. + */ + +/** + * 1. Correct color not being inherited. + * Known issue: affects color of disabled elements. + * 2. Correct font properties not being inherited. + * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. + */ + +button, +input, +optgroup, +select, +textarea { + color: inherit; /* 1 */ + font: inherit; /* 2 */ + margin: 0; /* 3 */ +} + +/** + * Address `overflow` set to `hidden` in IE 8/9/10/11. + */ + +button { + overflow: visible; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. + * Correct `select` style inheritance in Firefox. + */ + +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ +} + +/** + * Re-set default cursor for disabled elements. + */ + +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * Remove inner padding and border in Firefox 4+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +input { + line-height: normal; +} + +/** + * It's recommended that you don't attempt to style these elements. + * Firefox's implementation doesn't respect box-sizing, padding, or width. + * + * 1. Address box sizing set to `content-box` in IE 8/9/10. + * 2. Remove excess padding in IE 8/9/10. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Fix the cursor style for Chrome's increment/decrement buttons. For certain + * `font-size` values of the `input`, it causes the cursor style of the + * decrement button to change from `default` to `text`. + */ + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari and Chrome + * (include `-moz` to future-proof). + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; /* 2 */ + box-sizing: content-box; +} + +/** + * Remove inner padding and search cancel button in Safari and Chrome on OS X. + * Safari (but not Chrome) clips the cancel button when the search input has + * padding (and `textfield` appearance). + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Define consistent border, margin, and padding. + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct `color` not being inherited in IE 8/9/10/11. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ + +legend { + border: 0; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Remove default vertical scrollbar in IE 8/9/10/11. + */ + +textarea { + overflow: auto; +} + +/** + * Don't inherit the `font-weight` (applied by a rule above). + * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. + */ + +optgroup { + font-weight: bold; +} + +/* Tables + ========================================================================== */ + +/** + * Remove most spacing between table cells. + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} diff --git a/source/v8/stylesheets/_rtl.scss b/source/v8/stylesheets/_rtl.scss new file mode 100644 index 0000000..44db300 --- /dev/null +++ b/source/v8/stylesheets/_rtl.scss @@ -0,0 +1,140 @@ +//////////////////////////////////////////////////////////////////////////////// +// RTL Styles Variables +//////////////////////////////////////////////////////////////////////////////// + +$default: auto; + +//////////////////////////////////////////////////////////////////////////////// +// TABLE OF CONTENTS +//////////////////////////////////////////////////////////////////////////////// + +#toc>ul>li>a>span { + float: left; +} + +.toc-wrapper { + transition: right 0.3s ease-in-out !important; + left: $default !important; + #{right}: 0; +} + +.toc-h2 { + padding-#{right}: $nav-padding + $nav-indent; +} + +#nav-button { + #{right}: 0; + transition: right 0.3s ease-in-out; + &.open { + right: $nav-width + } +} + +//////////////////////////////////////////////////////////////////////////////// +// PAGE LAYOUT AND CODE SAMPLE BACKGROUND +//////////////////////////////////////////////////////////////////////////////// +.page-wrapper { + margin-#{left}: $default !important; + margin-#{right}: $nav-width; + .dark-box { + #{right}: $default; + #{left}: 0; + } +} + +.lang-selector { + width: $default !important; + a { + float: right; + } +} + +//////////////////////////////////////////////////////////////////////////////// +// CODE SAMPLE STYLES +//////////////////////////////////////////////////////////////////////////////// +.content { + &>h1, + &>h2, + &>h3, + &>h4, + &>h5, + &>h6, + &>p, + &>table, + &>ul, + &>ol, + &>aside, + &>dl { + margin-#{left}: $examples-width; + margin-#{right}: $default !important; + } + &>ul, + &>ol { + padding-#{right}: $main-padding + 15px; + } + table { + th, + td { + text-align: right; + } + } + dd { + margin-#{right}: 15px; + } + aside { + aside:before { + padding-#{left}: 0.5em; + } + .search-highlight { + background: linear-gradient(to top right, #F7E633 0%, #F1D32F 100%); + } + } + pre, + blockquote { + float: left !important; + clear: left !important; + } +} + +//////////////////////////////////////////////////////////////////////////////// +// TYPOGRAPHY +//////////////////////////////////////////////////////////////////////////////// +h1, +h2, +h3, +h4, +h5, +h6, +p, +aside { + text-align: right; + direction: rtl; +} + +.toc-wrapper { + text-align: right; + direction: rtl; + font-weight: 100 !important; +} + + +//////////////////////////////////////////////////////////////////////////////// +// RESPONSIVE DESIGN +//////////////////////////////////////////////////////////////////////////////// +@media (max-width: $tablet-width) { + .toc-wrapper { + #{right}: -$nav-width; + &.open { + #{right}: 0; + } + } + .page-wrapper { + margin-#{right}: 0; + } +} + +@media (max-width: $phone-width) { + %left-col { + margin-#{left}: 0; + } +} diff --git a/source/v8/stylesheets/_variables.scss b/source/v8/stylesheets/_variables.scss new file mode 100644 index 0000000..3dbadd4 --- /dev/null +++ b/source/v8/stylesheets/_variables.scss @@ -0,0 +1,103 @@ +/* +Copyright 2008-2013 Concur Technologies, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); you may +not use this file except in compliance with the License. You may obtain +a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +License for the specific language governing permissions and limitations +under the License. +*/ + + +//////////////////////////////////////////////////////////////////////////////// +// CUSTOMIZE SLATE +//////////////////////////////////////////////////////////////////////////////// +// Use these settings to help adjust the appearance of Slate + + +// BACKGROUND COLORS +//////////////////// +$nav-bg: #2E3336 !default; +$examples-bg: #2E3336 !default; +$code-bg: #1E2224 !default; +$code-annotation-bg: #191D1F !default; +$nav-subitem-bg: #1E2224 !default; +$nav-active-bg: #0F75D4 !default; +$nav-active-parent-bg: #1E2224 !default; // parent links of the current section +$lang-select-border: #000 !default; +$lang-select-bg: #1E2224 !default; +$lang-select-active-bg: $examples-bg !default; // feel free to change this to blue or something +$lang-select-pressed-bg: #111 !default; // color of language tab bg when mouse is pressed +$main-bg: #F3F7F9 !default; +$aside-notice-bg: #8fbcd4 !default; +$aside-warning-bg: #c97a7e !default; +$aside-success-bg: #6ac174 !default; +$search-notice-bg: #c97a7e !default; + + +// TEXT COLORS +//////////////////// +$main-text: #333 !default; // main content text color +$nav-text: #fff !default; +$nav-active-text: #fff !default; +$nav-active-parent-text: #fff !default; // parent links of the current section +$lang-select-text: #fff !default; // color of unselected language tab text +$lang-select-active-text: #fff !default; // color of selected language tab text +$lang-select-pressed-text: #fff !default; // color of language tab text when mouse is pressed + + +// SIZES +//////////////////// +$nav-width: 230px !default; // width of the navbar +$examples-width: 50% !default; // portion of the screen taken up by code examples +$logo-margin: 0px !default; // margin below logo +$main-padding: 28px !default; // padding to left and right of content & examples +$nav-padding: 15px !default; // padding to left and right of navbar +$nav-v-padding: 10px !default; // padding used vertically around search boxes and results +$nav-indent: 10px !default; // extra padding for ToC subitems +$code-annotation-padding: 13px !default; // padding inside code annotations +$h1-margin-bottom: 21px !default; // padding under the largest header tags +$tablet-width: 930px !default; // min width before reverting to tablet size +$phone-width: $tablet-width - $nav-width !default; // min width before reverting to mobile size + + +// FONTS +//////////////////// +%default-font { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; +} + +%header-font { + @extend %default-font; + font-weight: bold; +} + +%code-font { + font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, serif; + font-size: 12px; + line-height: 1.5; +} + + +// OTHER +//////////////////// +$nav-footer-border-color: #666 !default; +$search-box-border-color: #666 !default; + + +//////////////////////////////////////////////////////////////////////////////// +// INTERNAL +//////////////////////////////////////////////////////////////////////////////// +// These settings are probably best left alone. + +%break-words { + word-break: break-all; + hyphens: auto; +} diff --git a/source/v8/stylesheets/print.css.scss b/source/v8/stylesheets/print.css.scss new file mode 100644 index 0000000..1c3cedd --- /dev/null +++ b/source/v8/stylesheets/print.css.scss @@ -0,0 +1,153 @@ +@charset "utf-8"; +@import 'normalize'; +@import 'variables'; +@import 'icon-font'; + +/* +Copyright 2008-2013 Concur Technologies, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); you may +not use this file except in compliance with the License. You may obtain +a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +License for the specific language governing permissions and limitations +under the License. +*/ + +$print-color: #999; +$print-color-light: #ccc; +$print-font-size: 12px; + +body { + @extend %default-font; +} + +.tocify, .toc-footer, .lang-selector, .search, #nav-button { + display: none; +} + +.tocify-wrapper>img { + margin: 0 auto; + display: block; +} + +.content { + font-size: 12px; + + pre, code { + @extend %code-font; + @extend %break-words; + border: 1px solid $print-color; + border-radius: 5px; + font-size: 0.8em; + } + + pre { + code { + border: 0; + } + } + + pre { + padding: 1.3em; + } + + code { + padding: 0.2em; + } + + table { + border: 1px solid $print-color; + tr { + border-bottom: 1px solid $print-color; + } + td,th { + padding: 0.7em; + } + } + + p { + line-height: 1.5; + } + + a { + text-decoration: none; + color: #000; + } + + h1 { + @extend %header-font; + font-size: 2.5em; + padding-top: 0.5em; + padding-bottom: 0.5em; + margin-top: 1em; + margin-bottom: $h1-margin-bottom; + border: 2px solid $print-color-light; + border-width: 2px 0; + text-align: center; + } + + h2 { + @extend %header-font; + font-size: 1.8em; + margin-top: 2em; + border-top: 2px solid $print-color-light; + padding-top: 0.8em; + } + + h1+h2, h1+div+h2 { + border-top: none; + padding-top: 0; + margin-top: 0; + } + + h3, h4 { + @extend %header-font; + font-size: 0.8em; + margin-top: 1.5em; + margin-bottom: 0.8em; + text-transform: uppercase; + } + + h5, h6 { + text-transform: uppercase; + } + + aside { + padding: 1em; + border: 1px solid $print-color-light; + border-radius: 5px; + margin-top: 1.5em; + margin-bottom: 1.5em; + line-height: 1.6; + } + + aside:before { + vertical-align: middle; + padding-right: 0.5em; + font-size: 14px; + } + + aside.notice:before { + @extend %icon-info-sign; + } + + aside.warning:before { + @extend %icon-exclamation-sign; + } + + aside.success:before { + @extend %icon-ok-sign; + } +} + +.copy-clipboard { + @media print { + display: none + } +} diff --git a/source/v8/stylesheets/screen.css.scss b/source/v8/stylesheets/screen.css.scss new file mode 100644 index 0000000..0ce124e --- /dev/null +++ b/source/v8/stylesheets/screen.css.scss @@ -0,0 +1,637 @@ +@charset "utf-8"; +@import 'normalize'; +@import 'variables'; +@import 'icon-font'; +// @import 'rtl'; // uncomment to switch to RTL format + +/* +Copyright 2008-2013 Concur Technologies, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); you may +not use this file except in compliance with the License. You may obtain +a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +License for the specific language governing permissions and limitations +under the License. +*/ + +//////////////////////////////////////////////////////////////////////////////// +// GENERAL STUFF +//////////////////////////////////////////////////////////////////////////////// + +html, body { + color: $main-text; + padding: 0; + margin: 0; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + @extend %default-font; + background-color: $main-bg; + height: 100%; + -webkit-text-size-adjust: none; /* Never autoresize text */ +} + +//////////////////////////////////////////////////////////////////////////////// +// TABLE OF CONTENTS +//////////////////////////////////////////////////////////////////////////////// + +#toc > ul > li > a > span { + float: right; + background-color: #2484FF; + border-radius: 40px; + width: 20px; +} + +.toc-wrapper { + transition: left 0.3s ease-in-out; + + overflow-y: auto; + overflow-x: hidden; + position: fixed; + z-index: 30; + top: 0; + left: 0; + bottom: 0; + width: $nav-width; + background-color: $nav-bg; + font-size: 13px; + font-weight: bold; + + // language selector for mobile devices + .lang-selector { + display: none; + a { + padding-top: 0.5em; + padding-bottom: 0.5em; + } + } + + // This is the logo at the top of the ToC + .logo { + display: block; + max-width: 100%; + margin-bottom: $logo-margin; + } + + &>.search { + position: relative; + + input { + background: $nav-bg; + border-width: 0 0 1px 0; + border-color: $search-box-border-color; + padding: 6px 0 6px 20px; + box-sizing: border-box; + margin: $nav-v-padding $nav-padding; + width: $nav-width - ($nav-padding*2); + outline: none; + color: $nav-text; + border-radius: 0; /* ios has a default border radius */ + } + + &:before { + position: absolute; + top: 17px; + left: $nav-padding; + color: $nav-text; + @extend %icon-search; + } + } + + .search-results { + margin-top: 0; + box-sizing: border-box; + height: 0; + overflow-y: auto; + overflow-x: hidden; + transition-property: height, margin; + transition-duration: 180ms; + transition-timing-function: ease-in-out; + background: $nav-subitem-bg; + &.visible { + height: 30%; + margin-bottom: 1em; + } + + li { + margin: 1em $nav-padding; + line-height: 1; + } + + a { + color: $nav-text; + text-decoration: none; + + &:hover { + text-decoration: underline; + } + } + } + + + // The Table of Contents is composed of multiple nested + // unordered lists. These styles remove the default + // styling of an unordered list because it is ugly. + ul, li { + list-style: none; + margin: 0; + padding: 0; + line-height: 28px; + } + + li { + color: $nav-text; + transition-property: background; + transition-timing-function: linear; + transition-duration: 200ms; + } + + // This is the currently selected ToC entry + .toc-link.active { + background-color: $nav-active-bg; + color: $nav-active-text; + } + + // this is parent links of the currently selected ToC entry + .toc-link.active-parent { + background-color: $nav-active-parent-bg; + color: $nav-active-parent-text; + } + + .toc-list-h2 { + display: none; + background-color: $nav-subitem-bg; + font-weight: 500; + } + + .toc-h2 { + padding-left: $nav-padding + $nav-indent; + font-size: 12px; + } + + .toc-footer { + padding: 1em 0; + margin-top: 1em; + border-top: 1px dashed $nav-footer-border-color; + + li,a { + color: $nav-text; + text-decoration: none; + } + + a:hover { + text-decoration: underline; + } + + li { + font-size: 0.8em; + line-height: 1.7; + text-decoration: none; + } + } +} + +.toc-link, .toc-footer li { + padding: 0 $nav-padding 0 $nav-padding; + display: block; + overflow-x: hidden; + white-space: nowrap; + text-overflow: ellipsis; + text-decoration: none; + color: $nav-text; + transition-property: background; + transition-timing-function: linear; + transition-duration: 130ms; +} + +// button to show navigation on mobile devices +#nav-button { + span { + display: block; + $side-pad: $main-padding / 2 - 8px; + padding: $side-pad $side-pad $side-pad; + background-color: rgba($main-bg, 0.7); + transform-origin: 0 0; + transform: rotate(-90deg) translate(-100%, 0); + border-radius: 0 0 0 5px; + } + padding: 0 1.5em 5em 0; // increase touch size area + display: none; + position: fixed; + top: 0; + left: 0; + z-index: 100; + color: #000; + text-decoration: none; + font-weight: bold; + opacity: 0.7; + line-height: 16px; + img { + height: 16px; + vertical-align: bottom; + } + + transition: left 0.3s ease-in-out; + + &:hover { opacity: 1; } + &.open {left: $nav-width} +} + + +//////////////////////////////////////////////////////////////////////////////// +// PAGE LAYOUT AND CODE SAMPLE BACKGROUND +//////////////////////////////////////////////////////////////////////////////// + +.page-wrapper { + margin-left: $nav-width; + position: relative; + z-index: 10; + background-color: $main-bg; + min-height: 100%; + + padding-bottom: 1px; // prevent margin overflow + + // The dark box is what gives the code samples their dark background. + // It sits essentially under the actual content block, which has a + // transparent background. + // I know, it's hackish, but it's the simplist way to make the left + // half of the content always this background color. + .dark-box { + width: $examples-width; + background-color: $examples-bg; + position: absolute; + right: 0; + top: 0; + bottom: 0; + } + + .lang-selector { + position: fixed; + z-index: 50; + border-bottom: 5px solid $lang-select-active-bg; + } +} + +.lang-selector { + display: flex; + background-color: $lang-select-bg; + width: 100%; + font-weight: bold; + overflow-x: auto; + a { + display: inline; + color: $lang-select-text; + text-decoration: none; + padding: 0 10px; + line-height: 30px; + outline: 0; + + &:active, &:focus { + background-color: $lang-select-pressed-bg; + color: $lang-select-pressed-text; + } + + &.active { + background-color: $lang-select-active-bg; + color: $lang-select-active-text; + } + } + + &:after { + content: ''; + clear: both; + display: block; + } +} + +//////////////////////////////////////////////////////////////////////////////// +// CONTENT STYLES +//////////////////////////////////////////////////////////////////////////////// +// This is all the stuff with the light background in the left half of the page + +.content { + // fixes webkit rendering bug for some: see #538 + -webkit-transform: translateZ(0); + // to place content above the dark box + position: relative; + z-index: 30; + + &:after { + content: ''; + display: block; + clear: both; + } + + &>h1, &>h2, &>h3, &>h4, &>h5, &>h6, &>p, &>table, &>ul, &>ol, &>aside, &>dl { + margin-right: $examples-width; + padding: 0 $main-padding; + box-sizing: border-box; + display: block; + + @extend %left-col; + } + + &>ul, &>ol { + padding-left: $main-padding + 15px; + } + + // the div is the tocify hidden div for placeholding stuff + &>h1, &>h2, &>div { + clear:both; + } + + h1 { + @extend %header-font; + font-size: 25px; + padding-top: 0.5em; + padding-bottom: 0.5em; + margin-bottom: $h1-margin-bottom; + margin-top: 2em; + border-top: 1px solid #ccc; + border-bottom: 1px solid #ccc; + background-color: #fdfdfd; + } + + h1:first-child, div:first-child + h1 { + border-top-width: 0; + margin-top: 0; + } + + h2 { + @extend %header-font; + font-size: 19px; + margin-top: 4em; + margin-bottom: 0; + border-top: 1px solid #ccc; + padding-top: 1.2em; + padding-bottom: 1.2em; + background-image: linear-gradient(to bottom, rgba(#fff, 0.2), rgba(#fff, 0)); + } + + // h2s right after h1s should bump right up + // against the h1s. + h1 + h2, h1 + div + h2 { + margin-top: $h1-margin-bottom * -1; + border-top: none; + } + + h3, h4, h5, h6 { + @extend %header-font; + font-size: 15px; + margin-top: 2.5em; + margin-bottom: 0.8em; + } + + h4, h5, h6 { + font-size: 10px; + } + + hr { + margin: 2em 0; + border-top: 2px solid $examples-bg; + border-bottom: 2px solid $main-bg; + } + + table { + margin-bottom: 1em; + overflow: auto; + th,td { + text-align: left; + vertical-align: top; + line-height: 1.6; + code { + white-space: nowrap; + } + } + + th { + padding: 5px 10px; + border-bottom: 1px solid #ccc; + vertical-align: bottom; + } + + td { + padding: 10px; + } + + tr:last-child { + border-bottom: 1px solid #ccc; + } + + tr:nth-child(odd)>td { + background-color: lighten($main-bg,4.2%); + } + + tr:nth-child(even)>td { + background-color: lighten($main-bg,2.4%); + } + } + + dt { + font-weight: bold; + } + + dd { + margin-left: 15px; + } + + p, li, dt, dd { + line-height: 1.6; + margin-top: 0; + } + + img { + max-width: 100%; + } + + code { + background-color: rgba(0,0,0,0.05); + padding: 3px; + border-radius: 3px; + @extend %break-words; + @extend %code-font; + } + + pre>code { + background-color: transparent; + padding: 0; + } + + aside { + padding-top: 1em; + padding-bottom: 1em; + margin-top: 1.5em; + margin-bottom: 1.5em; + background: $aside-notice-bg; + line-height: 1.6; + + &.warning { + background-color: $aside-warning-bg; + } + + &.success { + background-color: $aside-success-bg; + } + } + + aside:before { + vertical-align: middle; + padding-right: 0.5em; + font-size: 14px; + } + + aside.notice:before { + @extend %icon-info-sign; + } + + aside.warning:before { + @extend %icon-exclamation-sign; + } + + aside.success:before { + @extend %icon-ok-sign; + } + + .search-highlight { + padding: 2px; + margin: -3px; + border-radius: 4px; + border: 1px solid #F7E633; + background: linear-gradient(to top left, #F7E633 0%, #F1D32F 100%); + } +} + +//////////////////////////////////////////////////////////////////////////////// +// CODE SAMPLE STYLES +//////////////////////////////////////////////////////////////////////////////// +// This is all the stuff that appears in the right half of the page + +.content { + &>div.highlight { + clear:none; + } + + pre, blockquote { + background-color: $code-bg; + color: #fff; + + margin: 0; + width: $examples-width; + + float:right; + clear:right; + + box-sizing: border-box; + + @extend %right-col; + + &>p { margin: 0; } + + a { + color: #fff; + text-decoration: none; + border-bottom: dashed 1px #ccc; + } + } + + pre { + @extend %code-font; + padding-top: 2em; + padding-bottom: 2em; + padding: 2em $main-padding; + } + + blockquote { + &>p { + background-color: $code-annotation-bg; + padding: $code-annotation-padding 2em; + color: #eee; + } + } +} + +//////////////////////////////////////////////////////////////////////////////// +// RESPONSIVE DESIGN +//////////////////////////////////////////////////////////////////////////////// +// These are the styles for phones and tablets +// There are also a couple styles disperesed + +@media (max-width: $tablet-width) { + .toc-wrapper { + left: -$nav-width; + + &.open { + left: 0; + } + } + + .page-wrapper { + margin-left: 0; + } + + #nav-button { + display: block; + } + + .toc-link { + padding-top: 0.3em; + padding-bottom: 0.3em; + } +} + +@media (max-width: $phone-width) { + .dark-box { + display: none; + } + + %left-col { + margin-right: 0; + } + + .toc-wrapper .lang-selector { + display: block; + } + + .page-wrapper .lang-selector { + display: none; + } + + %right-col { + width: auto; + float: none; + } + + %right-col + %left-col { + margin-top: $main-padding; + } + + .highlight + p { + margin-top: 20px; + } +} + +.highlight .c, .highlight .cm, .highlight .c1, .highlight .cs { + color: #909090; +} + +.highlight, .highlight .w { + background-color: $code-bg; +} + +.copy-clipboard { + float: right; + fill: #9DAAB6; + cursor: pointer; + opacity: 0.4; + height: 18px; + width: 18px; +} + +.copy-clipboard:hover { + opacity: 0.8; +}
    • " + $(elem).text() + "