set_parentage( $parent_file ); ?>
render_screen_meta(); if ( is_network_admin() ) { /** * Prints network admin screen notices. * * @since 3.1.0 */ do_action( 'network_admin_notices' ); } elseif ( is_user_admin() ) { /** * Prints user admin screen notices. * * @since 3.1.0 */ do_action( 'user_admin_notices' ); } else { /** * Prints admin screen notices. * * @since 3.1.0 */ do_action( 'admin_notices' ); } /** * Prints generic admin screen notices. * * @since 3.1.0 */ do_action( 'all_admin_notices' ); if ( 'options-general.php' === $parent_file ) { require ABSPATH . 'wp-admin/options-head.php'; } PKZ@ˑ""images/contribute-no-code.svgnu[ PKZ(ѣyyimages/align-none-2x.pngnu[PNG  IHDR*J@IDATHc?aPX`YO~(YO 4j֏Z?TrF֏ԖP29<*[(IENDB`PKZlKimages/menu.pngnu[PNG  IHDR@) PLTELiq" <58sssqpm ttt tsqxxv0?bsrnxxx);R.=Qlll<ooo<3$nnnttt~x`)*m5KXm*RRGUӕda枵Vٖet IDATxkPI'HAAD彀< yJYj Tx@2V . (. "( <뺷wIPu}R̯wa|o/a˗hOkk>!уmj_4]Z_5,㿇mB P.Rr bXI _"f -ӵ E4pzLLz84w뛺S\37dB7:^?DmQ-*հjH$5g%D4\j/-psssKVb.%%.ƄHp.ӓYvvMz+zhbMH3ݒ٤Cx>=H _|qT ]HXd| k H^HE.cNB7P&dKBZII ,4X^/!) QXx#oEuըT5]Q *BF^tص)ECl Ww0~%iqkHu]T +ǯHp M$EgH\/ˤex7"/y84I)![rB˴&' 1 =Q5TZ]mhh8&zf؝iǁZ %/~v:Ǻ3uu` yPK k&?4FOQhwRt)jzzj(Da-wڎCSP4yø/Be%qUpyy}nB ۅHa >ϻO/qM^)'4XXX>{zvg%s^OkJC0PS#71 44w4P/Kp4;0>(H O"=+U`A٨C< .XC: ;` "/I]i5 V'/,Z?ݺ.`YvBYeoQD;'t3; kb ,X-4|WBg?iPPVA|%*ְR԰O%%0ux3wdн{CmtUsny: LVJ'IC+%1?.TU `[/J}EhPQ8~Je%d- TWAjPI)u6yAXﵢkFie2|Z'a!iS-,Q5Mӕ=}#JRY9hS4Pa WA4T\%5,;EzhhGjj` }8W[[[}-B'|&0Z IZu%Z&&drU=[Fo_4^fx(k'''_kĮOIRկ4$ @jx@F9K)T_j r9Bqq?~Ci  "^Q+%NCFQk򿎠+++|O#jk1a!d;iY{Y ]0!ꜜ[r` C̝Ljˋ phhOLAHɸ WJh ӧ OCeÍJ$Om<;Sr,W,?j ]]Y@lmq%.*P Tii QWU4Jo8 Nv ( |Pd|Ǎ'N/T mmmC(;;ՌjNgJhw8z),*,-*x *q22\gBuؼ`{[5"o t{fp83T_p/p\ng<К +˞(ZK K[y@)ˀ fȌ :a759sw&ޗt90Y}f+=.9:lϐOps+T=l. P9uu h{d ]Ot8ΏHi4,AHR?]=n3yX綁oMkaJ$! պ4>~]j iZ-ܼl١~c+{ɒlftSrR}}?77?K zЍKV%mi+7&F}ô$Sbgh\!qkڂǫ]k !,۾}ͬS.;33՚xqFN1M+w W$%''Q!obaEhs2fQΊH 8TĠExFCxVZf$ ))"6d) Q'`,CfA߾ՠ͛73J5 3FRAJRRV~0Ay@DRRFV/oRo2U+JLLܟai|`!RfdR %mٶmKNC2 *lmת[;VyeE;G׾Da\M"wWko55iZK e!C!ДRh #YXH ¶߅O[wFJ[8!aC4Vyߛes ڼɅUh:2*_܎!ˋS㶀aTU!0ձe&"8a2((/Xwqv'I&L[[_A}U"3'2?L{Ic`0k&oTJDMIt/2դLsc8H,XR/$`=ϲ](0LF6e\G00 L א`QYStjl)$[Eh<کyr'Z ޙ6;SW+/b I1 6>]ăd2}m\ ZN044sFX cF{.b@nc/MD CǬ8ܐN$%X}bÐK0([ӡL`A $ڣli˦n^ ޢ.z/M E}XfG(|ԉ2Mق{4(ZS):,9Z1 n,)axBfP+vzu[Ym?D$18̈́D7kO(N] Ľ!0eg%b8u3u^lpIVĐ2o`I118$@>{V0.7geJ,:%\-ʦ-% nfҼ $K~8" {0@ e'#ǀUW>or똿)b(n) ^ }=loVT`<(L`uG9B749*Uܐ|<ɍo*ۺa(UeJr @َ]0yвHp1lPǰm5-_Jh]apտ{uHkX刱?pĠ^JĠ_Ua;90t5B=\njX˲{M^ ,t? CD'ՔOB7%AZ5IJ,,(TXUo8Ʊa/?PJ)E۷O_~t%RIV`pPC,t',f<{Fй*/tW7|T uwS4gǏO.{R>>@>>???噙ﱱ쐐󩨨䉉㾽Ѧtttتݥã֌ϧyyyİͻkkkἻXtRNS ,L =%*!.@' -KhՇv:`>1UJHE3K%S[Y_54}A܀j@~SSw'1f{.Nj2ߐhH$9?C?xwy޻ѭ)Xɑ#G)N14'&He2~d2)%Z\^&ZɰT6y IR6&tjYH:Z%u : 7MЂȮƱH4tQBeġqH* Tc]JZ2MTy F2$1'HK%'CA %)x0B -KpH!o`>VFQh&z^b)S5|ZZ3mm3a_L|_,0GY`d!YY`gaܳpᅭ㎻GyGC.'w̑#엯[J*x/ъeirhxȡecT!;noՒWl 9Y4XyRV#"I-")ؤ uI #IET!>SM; A07tLӄ2j~o]~x*m7=NVCSml~?Mv\bdQ϶odEM7Y~_ KIΛ B5Sm5JXGK:Jԁ>Tb!J()QIA5eb`Ael[JZq8{A?,\jՅ [^(`[/\X Fr1>؆K{Y5k-Eˢ zM_] j@+RoA %Pa\zA Oh>2!Ea>0@@X8 nD=KCQji†Z#jR]s2]IG>b#4\lAP- [d6xW;mX)+5Vu1vQhTm )tiX[a6 @oT72ve8ROh@,#uj2-To^"1:)ŏ2H5񮫂WD-L/\?cQZT]qv^mTmff&rnsyC ?ۖ,7/X_]dW6ȑc^8!#;wmiF, Ҽ<&-Am'^=<  "[ʷY^WRUʝK aRƗVVRːp$*tU)TLbi!||j7ס!}H VŋW. _0|*q ^m %C#%?yGQ|j5X͏Dm=qf&bxlbUP5*_F@Qc#}b,mB%xSe*nnA6ªnqRN Q)EQ!,mEO!܇L} EM<;I s@n"ȑ#Ǘ@BATZ(#,0* tGT[[[wuCۦT[&[;B#,APPُ"\´\ղw mE35~%D;:ʾަ`.1ј ۏ~0kb րT6sl@~%dbláBK!0(|C\.f"0[Pb`Ŋh+* L.Q8= &}%Ti1`|A!*("L(—!Z>1mzmFGz'[`ؖaJ>D,ևDhA$&1Iu2:\ܤP@ws5*ęK׵<%ȑ#=Y+;So bF=;W8;<L48W⡆D|y={"y2ú+\Nrw5g_tA*^DP+H5^S 0{|kbFOf,0rKVKXsLg6@ߣ.5a IeDӥϞFH['Se:mm=Y3/cH浩njvdS^lXqX*/;")wPs.q?;ݨI#[Ay.+µ ;rR_k+UUACr"{Tx;-!t2`EWԗ;6IXH.IjUN?OϨ<'aH7xuK)ڷ_x嗿 . /kk9rbYKk׾lCOwK,X\t1u<5!X(\6cە^pz|V>oc7u^뫇Y;ק*N/^@|5y!cis1W},M^?;;~l,҄J[h6+!Kڀ7t;Lq`]/U-dgbl,}<(c/gEM:2_\20Ym=L?fbbkL78>8d)XWX#gyYa_ӹf D:nh2wS1wΪ??hr*(Ύ/&W]K/WP|V{Μ;Upz]WWY<`bSEMz7@("7,ESyRDe*q淉K?ː>m}+_|~ԩC=p۶m?\#mnIENDB`PKZ^8images/imgedit-icons-2x.pngnu[PNG  IHDRY^aPLTELiq`&nnn:^SssspppIT{nnnnnn74Wsssooorrr_&mmm`&ppprrrlllJ_$N]%d([$WWWMrrrlllgggsss^%MgggL\"b&Z a&LsssgggM`%_%LLLLMLLŶ|||^#LLeeesssc'Loooߟ߾魭jjj{{{sssNǎTԢLE޶ܽj޴Ǡˣuuuܵiii^^^fffͦ҂LʌȊ~KpppllltEٳȴxװѪⷽɢSڰ®pԭԬӆOQ̳rrrbbbΧлǢο]]]f(ϻ}sDĆȺe|´~~~ةSrʹͲ]JCB7o *Ij'"$_RG Bb %cDpE !RcI!{I&-Zz BP|z$8đAZӖt=\*Sɥ @2#A6\ .fdkaW9 ˃~@V)],ë.%: _ bAf`O<#sJ^DIWSe8. KJ[v֎|2dkKeϴz<3@ysssvWpZ`IqL@H!B 19g GmK6ݷXqҿrN qp7ev0܆Jp+pj8‹&T6K @%bw+\)!ܯȆRehJ >ۘ4xN:)8[.\S"+b̑ y:*Ţ/֎3Zս%@o?MBJ'P:G LvN78%/C @6l3_+T ﵽoG,W'_3yMҺa]>`ppʕ`p250^_Pc D<}Y;.\^4@Kszv}x/?J*թ^Br`u6-r;CC,'kQ;4!\ntG- hT4 -Dž ~ OAlr@%JyA C{tu,Vj` O׆%1Hئ^>|شcB!j| l~2s?jۋZ_u~*Zzmc{}Ub4 @/@ 1b8ɻ!l:t'| %nG!̓z; 6~ʆ PRyS*ew:m(͌8Yt#lsC}`tm1oJyi4C]\R52UMX1HF't^+*_,@@gּ:T3ObQIhsi)A9vk0zf{<O;7nܻ7_|p\eisޫcD%:)D^L˙-$hxI]D-_T6mn-}0)w@G/f p`g_>"kCxpҁ޺4&Um J*Rk>/wR. EwLK}pxA#S`SW$ʭꇋQ,n585Xd"' +`wC @+ Ov/acB۸86UXB6hmч6PC 6]0^>^ ʖm>\IA$vyS0 a RC`-fbp҇M[XB }sg4IsgFfy̜9u~swfyI_ Y\_9xRAЖ/6l<lhe/,!C:cë YdAP, p"z* 7䂸3 0?^@_e`I,Q0J|1 L jt"ɏkgߞ}`8Wq (?{jc|qWu .J/< @x~g ~KdtGZ-_Wޖp^B.M@0\~I>AH ›Fn4uW _"e 4Ei'?'~w qq k}qF;5//3$on4umTPL~{^m׹s.o:]67K'@h:?[:\pï~/zӯŴ>|}@_ zkzͯz~߫I_pSW§K$G(NL.p.]tҥK.]tҥK.]tjM..^ZW޽rE0M?vkj=&DR45VWs|ZνB4(-t4Uk1PI̶k/{R-xK2vkch?Ddr[fQ=j;4rzV=Lfe܋pԕrTRIB`yi(trB- {U=ͪ]n M9`4֠s 4R.vvԑ` ..Fdؚa6eT x d5ٟf3'{A,Bd@P4:l-A(z;4aj[>[t'~B_͜ԉ=cSua-! ׆pmh K3HKPr\Ƃ%8:8I V@08vXEX'v)8S_ RX9=ҝI[LsVɁ ~(~Y| 6 HۚAI~h_6iqtt?_Hg䔧4Zh g' Q*90E0{A-B_qh_u+49Gqz6=-mtwY/14N(RmhJ 3/)حP ̓Ԇ $bmhE>ldZ,'Π]M&=T;0sԶЏ=S%u&nԁ 09)8$GArm $f.NDiġ>NRbM{fN& HJ}p8|gylQ B6t 6h\zOU~f\ˑJuYvԹZ2Qєԁ\p _9MRvޯY93ֆ@ֆPR/-U:ħH@`i) ,Phi)4L :xuw {m_% 3ss TkCSpĮz2ъS6̀INX!=xPǁ?=zU<:h(H$ *6^#\ U/DKR*u2Bk e@zۉ ΃,8ej[WwQ dǴ,XxZqfN8aQV 4Z`xٌA$&!ƎG@z3Rlu؋*O8(U>pf"+[shrT aj.S(?0hEMdT P_0wZk8Z8kRm*׆P[y-jC\y<(s A$/)/a’a{##{a%ꇌ ~` -~]HbJ@DTJ8x7(jCՆ8YBQh7^RrmG5 G. 8:<<0O"p\?0RQ{:Nw%p |ɂfm& TkCNB-\r(NN" lH-!O]E{p mU XK!0׆lFӮ Z$ g@Xd LcD L φk ]k ,h1Y&y^u ܗ wI JR  Bcmh IkC'\mdQqmhj-D8(lg'vg @B"Q"ڱSk9wTf8!ǚ]±(WnJ` wK)nD5 M-1[7|jCvҮWf4+H/WB;Dz4K&V݄dNy #O(1ǜɗ UkCA`'Ba< L(ЙWϴl7XΊ|~;&;*SV)XϙyqM$x+/ x!PuKv0SRL*kCֵ'l6C^ed?ٹӝ\EnXXoKк@EZZCZ@S66_흜y$tAfnD!(c­(p (GƯXsH| ɗR>޹p w1>#{Y(iLV-k,3q5?O1aB ~\ εɩ&&,HL.sƁO'+p_a1?LAB\9kE03f:)⹡pIo)+>i+jnhGOcQO#9SRZVZJs!rvIKuI$UۃϺ:>lXT ڊ`rC Wiy^!;J!:ebEzq.yKC) .ЋSxƽEP*o3*BP,zV @)"5}hEPEG4rtrx,z.7^.D.[>46.S;kQ'f[K" B2q|~.,b;{+=]#^uGIk< $B`8篮L1QGS$caZ#cP8C̤TI9 :p0&5rC'2(qAAAAAx vIENDB`PKZUaaimages/sort-2x.gifnu[GIF89a%/2$.1#-0!,@&H20ʨy BXXbل–ȼ$;PKZ8j__images/arrows-2x.pngnu[PNG  IHDR&PLTErrrsssjjjooo___|||MMMQQQyyyqqqXXX~~~xxx|||[[[bbbqqqoooxxxzzz{[StRNS\AY V@+FX-/1POZRϧ#ܴ KţL 쫂9ϧ򥌶Q78%[$ޣg9=IDATx^r@n)e0If%e9NYdV{_Sw@}CXOy)ڟ 5b FQBW!m}nOxҏ K F̧Q7_R$}Ă( !no}&'2\w»0Uu LYg~ J w\WpJuPֲ寧򴟖ڞֿsB!N(\ͽ4$ ͫ #3=?M|)'/x[өrbX43 gf /!r-3y7rzoSȃA^*) T7sE])$36?vu ]]^]pQ~HIENDB`PKZ1_images/stars-2x.pngnu[PNG  IHDR*J7IDATxmh[UDž? 8ND0( Dt*Y B6B,"臵qMnNeuM%m}N-ɖܛI5<'{zs# ڢmQE- 颤ѵӐo@嗑_~E%1.x]'Dv$? %+?Q灛{1V}f, 6o@|EvȌ+*%_7۬hᖕ@M9KRoJB(8G4{ԯzX~]VX՟_9@z[L3XzE9O hS ^l8[S?[ IAyфǁwsuC9=-Ɏ({n(GZI/K;'<sN4=i@0glݠpDgAG`y?L]3OB'l#N[#!Kӏ&(NDJFJmW{Y8X0:n&rsJSmE#n;#SЫM}1Ia/k_ƹ=J9vMz(h'9U1edmhdl-Zt j"@."PSF2~ӫ@vS/.x$H߲D؈bAH2Et K1p䖝,:>uI>hˬgpwdƢDuC }0EdQpNt4"F(fP+2ܮ::x_ pV/42uaIdcY)8+KUog|lj4-OwkvjQ'!ZE͂?Y_7 ikM'|\_GYkf44}/< %AEk-;%A7ɲF-EqMUvj%@$J b=?F1e.B섪 fm> Ynץ&(+F(s21(IU}Q[D qZBNtۻzj-#cࠛlRSTlDN 9[ef?1SB4e<Ğ:lV MϮ۸cUH.j% cB= ,kUb1 J4YA[IENDB`PKZimages/align-right-2x.pngnu[PNG  IHDR,*X4 PLTEN!ñ=IDATWc` V6k(`a#Afz aNBgԀ:ZqCaS+&GIENDB`PKZgoimages/arrows.pngnu[PNG  IHDR{YKǮ$PLTE" tRNS*CQ}7n5sIDAT8Oc` Ttu޻w;lAfO*2 f ~,|!Cxyw(BΆ0Wޅ*P5  m Pɵ{bT.=m4vwIENDB`PKZ{images/media-button-other.gifnu[GIF89a řNNNqqqXXX󔔔!, @u'1ChCj@$_hEUEaCC0`SP6l6ðx$il"LtCp<˅H   bM# #!;PKZs0images/post-formats32-vs.pngnu[PNG  IHDR `cPLTELiqf9FGL MKF)]2 '] ܯ; "-T UJ..?3LKi׀t쀿}߲6A;ƭ@؋̀˹j:7Ey|%fSS~1 fjNߕc:IDATxy|ם-ŶR߷c;vb;nӍvqI4mMm>8!I@ mm~y {#x,Z4K^._4sj 3T.n/k Ōgju"/00i4fyT8P a /!rQno+] W&T3uF$+{y!ZkjeTSW_[SBg?'i@ "=LFAQ83@OLZP ?A=!ӂ#U+R~ʟ \IkS^*T24_// ̩Խ#EyGԔI!eP~V1>\s 9 ϗYҪ3\(cs.3SfU5;~5knu-w-(QT$22F @m9b'#dAQhQ?WW.Nt3B`nE8H$:F@ƚclrt鐁 QT#AO c6X-ITj'pG uΩ)'U  ssK9W= ȡZ.?JP\,H4, oREn  daѦɆ.`&hyB{PVh(+TE`30;+woZumvۚ5w5;1mn|˪Mw~ K(G׍ յbH 1Ų~gdSgK\.V(犆Y`+ X`*4ȃ4B>W$3BaD --@"*)PiS9Baa0F c%J30#o'm<[s}jRޫ8GώzP:&Y8'+0@M"Wr C%WhNPScùBҏqgu惄 +KcQ=F QLWyQZbz ̘4 Ii&8q[ocJm`lXc` `7Sn=d0촀&@[Qth"2&@K@7%)E >X,8-xmT&°8 ?6I(V k2A|6rZ!=-E=#A/U&΂6b _ #)FbRYTF$DIP.Wȿn߲…4еY{Þ`a/]j[6[}+_տqo|k7o pM7Ƃ7)6(QbVϻg;o>']|{3{VR6)]VC4@55nw{Ww G]Cj kuu]yp/^# sj{I@X"vjr9ŒR k>>T"Up$N@^P+ؒ~?1 R_V#"X&i4dJ0X!3 SHjCEICISĞ GLɐS[ըWEW+tAv3,G"v0EMTQ %!8펇Ԋz"Y_WnNu &Y9 P(}U۳g^ ¼=Ӳ~_'v-;c;gk۳+[<ĀOcDE & #."Ժ ] SMrn#1bds3W~""9,Bk' ~=3kZg OA*,\&UT1]gNv{ wv?G :aOts&9@d)BbFb{#{Y i#umm& ;y0F*%Z8Z1ndQ&p:VuQndGժ?@[=Ȳp7H-2<fJ͠[Ȫr p#k'!R2d[!Cllޭ$(59EUa'2F  p#`M>Ƭz| Hڝl_ ͕͏)<ηyW?ż(zZ%ZVkݺV(2HT8rn |'ʡyQ-<(4_U|J.§ӗp\lƊg:(;x6$SQxW*6c+腺 {zR\AƸr׫# 7&b=ۃW<< 6Љ7%Ē6+4 NCbKT#Kq膹)ǯ_毨{RKw9գ{=fOkl~?޺mF K>˯?~cT DSU4'I)t: ȟeiw]  (0W"3wao*^;9 5]h 0f4u%?C뇨|Ȃ $=[QvxxNhOԗC)i[ٯ@P)oP5 U".ƥ[/*@Ӆ.򍇟=[[7߬8tȑ3>u7)/_X<~ZIENDB`PKZ_nhhimages/marker.pngnu[PNG  IHDRdq/IDAT+qzzB$Vf$RppM.njR;-4r$nB]W&=OOpҿ( oQ`9T)n1Tan 'VvX9-ךV,ժZ闇.jJg(.uUivש<$0)w\YRy#O:R2kOlnjd>{ S}h@&Q6iFi'B<Y!0(qwFIENDB`PKZӇimages/date-button.gifnu[GIF89a;lll[[[~~~ssspppmmmyyyccc|||iii^^^vvveee]]]fff```uuuˎ!;,@pg( 2j!PCQ4"nπ.(BbrPzDN ~-B-P41-B-J; W  BG-"2P0/6Q-I;n$P+P"-B-,(*5(#-B)-3%8#-)B;A;PKZ7^n images/post-formats-vs.pngnu[PNG  IHDR0PLTELiqeHFCFKff;odNffLeNR{MLNNJNLNNbNfNQFNbtÁ=sEK`fHffNcTGEFFJxYŁɁǀɂIJEb2`w9nLqea7haNbNLMNNJީDE`MEF?EFFsSy 7j9lb1]uf9lbf>vd3ax7gfk@k<`z5s~$h-k6$yo*9M=;~1A.W>"2 ТV[.AӪ V6:$:F#\ڏ;(WHH/4sFˣ1"5U{ /p >k13%̓ WkL*%4}t\)NϵhGV.:Dڊ4CwPUgq՝wkq~Sd"nvQLIDATx \[םﱍmԮ7I4{I7lMi:t˴3iHBruj%$!$ab f68$Nuf4;JtEf5܋bE+ZъVhE+ZъVhE+ZъVhE+ZъVhE+ZъVhE+ZъVhE+ZъVhE+ZъHT lBnr 5+gcE+Zъj{htWhE+*>e[*{4S`0\6˰7Uza~YK7J(BX` >v;O-55 lYkZ d~p={֞={v xJ ϷјtճKcFAzǞjymg˿UTB>|=ue0$72^{ݦ-klt2L @~n>~{u 8/?ױi[W;|rV;^KC}`+a 8O,'XRpr!Wu:Mi0yKq.Z~>pwnl'd e}VePT^5A YPyWz/&:p[M4\Ǐ >ҁWi/Ζ1Sn"́녗%o_̜_N_IzP;\8aߐ~vK{LX "x I677?n^QvGzy|E%٩] xhl&W@e'|)OMs>o7o/}+ AܸoUQ-;ۮ !0z]. ;z xb(ł7,9eЍSVȪF7$Waryr QX J`rWa_{u hjo^)/7Nq\:y0rbL HP K%a敘/o?/_yJ;ضroq+Zy2O]*dҜSbf u9zRIzScs . NynX3 \SxPlv_%eY*\bo{IY(EqqTj벗LgO% ːZ8- s$7 2jmTT:(*D%H-nt&Oͤ-GGI蛚>Q̢.vZ()#klq^l9k+=,0x^m-{$OFTrۖ\g9o),D" Țz'.XDžJ<ظ٣kÇ#`- AxGBa`d<ݨMy} Nd:Mtߝ 7uL:FgP9\gO98  qrrWo \Q 6KjX(ytз@a cؗ5ly/µsrp1'`MSݭg4Y d/t,\Koz)< Jڷ#>"UTQy'iDzɐ~_T`E}~YU 'v2q>(=uNAKRˡ"s߳߫ zzD\6JƠڟg z6CR,:3)UK P$`zhKtp?WynlQV"Q tW&l^m 3|L*h|twXOXs(6xH:}'Gyg}K 5 ɔI9jA_QoM&ӑȡ1:gi[G,Oo|p)7wYIXڼoSJhtIs,VbPS7jZRހ w Ł{Y8DfSD1Y Oxitݚ0gT_2ΛhllF\֮@I'FDT7/|DsjFZZc;4XkV\ACP7D}}3u-c%cA.^VW{:W&k8i!L"Jhvqh.ͱl?{KoScol\_y%bz>7 RpA^wR-onIzQɠyoyIϭN4&}?- %<nX d< ?&r"^7J$⇮#|e <̀9PK}%HxMY9oˍ]'9ҏ :zveD~?;Y JsP)3:3֢B5 :E.Ovf7XJGP4Q y>c. H=ĄdЯ;JPDeWzMdž)dLC&dˑX4\ƉC} bGFWcC} H"Z@ң*}a#Hd⽑Լ70sM^?iޑ1+6 FQz AFͥv@vv7khu78&Gt"I-^IRU>?z=&Jxv%|==&ѦRdb ^ .0rko.}NI"}:`_y$-5Ғʕή5ɹ%n C%H];=<*LƝ#=tܓ udtDIcb9(MG?u(mB`kޛ9|X L2\י9sftzQ`.7ˮt*UZ aN\z=S1b{u&:݆)ғ掘>*J5z.5lg z{xwsck0^AG/x*r4R(`ji.]uK5͹I *CdͫMzwΝ.  \ͬ'lcF\&Ƈ&'x!XM[11Anjmu.X&w9Vˡ))y88ruab"#XdW$8 tL<[qcCf \fi)fM2CVzh^lr!qt}p=*waʉIƁJ.5DqD褁1b1x$;f$ G^kXHORޛM8߹P;7q88ҼrA ]7cfZ3@[Vߺ afyVmE~Z/w- o{, Kg3gTŮ\7ghu4ӥvF2:1L GqR(Tّ4N4<]&ptN2@[0c2@YPQ{):rq>p}|H ɠ£f6!|hy) J%R9ݶL[9γ뇻 6Ip=;Gz ~;weAfHY_6]wpzoRýjұ#֪ j(q% _!z (p[!,`gS'+"J8951L؏`8@oZ6}nMimb)7uIjc؞E~{"5tXfk8fE2^9 *5;\4d,Ƹ" t& wtc kϽ1YFFnͨL._zRaԨiE vc8oZf۷/3>nϑ~ɠF "T"7F9׃~"Oz1WbV١hQ.. J(|{v>E<(Љ@%3ihK!th> ,zω0)jqԦ1&1IiWmQ3) }lW>EzWk3D>%s9x} k6}*R0@'4&M&j Vxg{m\N49_?0.>M2o9Zݸ%6&9>2W\CO;\779Y"7¬Xn-Z0#C8E  "+85.xHdiSh'lr[qI`1o Hcb@! & 1lA:=~2cSdzYu>MqŤFLBAgp=[} "{&AQu:w(\n9@&%7vd=SoVZ !=nPي+L(+[餈xmgCU, }pJcwCZ7vYus{WK9j@kΤoUR1{8Z0\PjM:i)INl9ɑ3T꙱\q;bf3+U,˖lf`): KTQ"f!_oGݥKepTh^@,CK`h%/:]Ǒq<nAAt989q8r!}l?X:Ñ95 IuΣ(&lzW̯L.h~Uo0 2BdL&ކG<](p J%J̆H܈Nry~fWq?qj&oġQye{Sq1pDo~on_C!!baGx968B„Cą$k$$Ϫ Yopʃ7:bζ7\+oin,$)`RjԽ]EI͘,+Jj\XJcPmOP@.mW4*zVRQj~eY",yD:.2!9ƆyC,Ԅx㉏_ bI_yT(14U_%32`1DV_QA2軙sRk5}7xHcGHfl+fr ÉL/Ar ԝ- qƙ3!CGZP$O}7_K|Ts桹/CF/*fwIoiWZu`Nwp#冘/4%'1!SM:>\zV7oⱅ՘x˥z%p^ -Oڥp%ޞhb`}` ' 02wvTj+Ba׀I= #j=H=ZςW{C3 zļsm_? A?xl@닦Sj.(:;'=5WJ>o8`yl}㇡WTt3s]J}SI &WB펴9Hf)Vu9Dx{'-N9BKD>088p77:$iL2pt!• 1iC:M'G`y0#ґLQ72yp`T2Wmf<_qʽZJ݄éK@_A8ͤ5E2S8sCd^C?3:tFw v p M~DEbiTWE6)H:36#̒#}}^~BvqC-6  N7_#mHZҋWU?6أvؼlؙιK 6\`~E'8 ~л.Ԍ}`nˀ#ed6_Ybj>{L̶md9BPSM~X.M4". 9ٜw54tNFGM>@ZʑΆWi_FGԑ㺋8?tt 7+)Q=V(atF,銏2:S7 cpR\sO&}:L'}h7ޞPI\._鹶_}ե__X6Ũ RQi̓@BA~=l"k}EDa `嶶a( P/)G# ~Px{})809qa,[sDŽ " %i&WRVeH\J;ܬ+ky[s0q9q<q':.un!^KwlsM$NsUZ啊$o{TV܁%tcHj."7iCݤ\96(w|}z-FM!j.~bO6Vo恘w:9_$2N{gx[7"[>lTZ[?l~;yColeܾ[l$ݞ'Ht{`7M6d'MO7JpXefp޸Ep-DS_u0;pm['?< p7ׇA\;Qpm7adp0j8F@AX6DqAt1#FGcm0:\RY P9qgq^8/n%8p4!5Vx}b퓪4&AOb- kOO'O^PǑPߚm0:^;ጶ" G O@a_qrLMѢ7]~&Gm&劐+Vnaa|pW|} g.ȧ4QͳDF>q8Ds=iJF=3 ijw1\fbt>r@ƛ.Rmۚ$Tx&08)`󨁱ap=7r&=T,XA&xXV3ta QLkǕKD8=yǰ8/ s$΄Me`\qL %^4mD&w"k^$$RT Ag}1Tpj3dH=HdCyobV;! _~Y9@d+e\9szz}]&z>Ow@혥|`=MmwHs }Mc`J 8%Eno}?#=,8_omvǶʡTS֡m;ȯ%ٽ*60t231'2|QȚ\hW\/dfb秋=#@w4*QɅGyBMFd yl$jPԏuE]czO):6w$O !MOqXгG+B@ft3/jbPrHq{jmj rdxN7j$X,R˭zE/ɥzI ؜Z2m~iƄŦ\e[%A׍cQ=oGWŀ>O`VTC8:yE6xwI&JAg#AT۰۩༶`}W&a@ Zs6 a2q~ȉji@5WHCqYWWZ鞛A!>7IX0.J:q%ɠ{J\.G4@Oӥ3|_偃% 7x铧 a5JKQsAlTiDܤfEaMx{Ͽ,Vӓ Cy"C| Mz|-/oאOaOֶXƩWٞ0`!%~~rHsYOn['BkIr?qVͷ*Ni.7|G}1ӓ6馑U :,MQ C)T$#&]͍Pz(12REb }2ƿyop+a2c'I|ѰݡQ *W_Elɠdx uju'jn+eRXN 1Ov[" 떚,n F$HHF#?~P+v?x $@Aʑ|9y]@(f\A{pefŔ)@8v/a b;0,!%OS{NSRZ'U׎pE`pM4:};c=s#u;̘;rmUY@Nyޤ5Ky^Ì[KJScLN9 =n`O~@?3ߠ4/lWzC=KHd,=.u7ԖXW[4ˁ"z.o %\RJ>蟛ğFz7,4U2p>Kqʁ>Z_T"HY6ɱs8dQre\ zHY[-v 2 D a\TH\HD-5zbB8J%OKwg?b(~eӕUaǃGA_}XM>˟$z9H5{Z7[hЯQЁIo)rRĊYTW"306K=[cc3a?Xb`䀾jq)'; ) b_0wT%4%Ss~%&UɨsKJsM@_ɴH}V_Bɣ)$hTBqbhm-dv&:n7HFM kk/h>l^$f:^tz=9 1X:LNu^U3`䁾T}lo;c%ׇ m3Oꛞa5H0.xA櫯'`! ש`heo:ݜ#Hf]|eQ7/Y2PU`BFgru /U*!fX 1Baf^4үY8-l[߄Db˕><ρ^,}!P.^"跺R=Kb'r~|6HdL:\wZE:+3LS9 j;bqfOe*Efp %)dɖ1B1C 63kkϕwS>LQL8jja:0@h3W~Pf |@_X:~/&{< ?笕LFTȟ_zny^"6#ϯ 6]o?ڸ!uFSZM!;Ә;BEn GbM;DӅ:7>G'zY6&T$sGmJ=kV-ҼSYf~*t] WҬJ2wNZBƴD^br~Ve⵮@&w)Fۄ5C+F)-dlO*S2ˌ26/e|#<.$aY@z`Abe|Q_:~̠7p. tTe ([F`|H3dp'[z**CojrJ[2믾p{7_yu'`[pze+-x8ˋv+IN%Ә\R 2R`R'g '|y&MxEɠ7ݖYV;ܠfAO~/ɕ{- 4=ZA-Ћ`ќf>ߌcRA@uD.}mk;w|@o^[zu˜ПSpf1`;2g}DW<WK&.O ҠϪxwJ>P.MzVpbxZehTT^ a^DžFHD>sXR ]gp7_x{}x^`#]z8 zbUřI&n]Q-|*LţȦk>`ܪ-# Qכ6v(%.}.4Y[NrЪ F Y}A%FƒA\[sO2tCg߻Ygz jzFƎ˖h !r2'Of1ettLTRJ}O#=@=|8w7ir^,K0\Y5\.3 A"XL!.{ow_3߻?F秴F1ǯW|Sy&xϣ~W?& c~Rg=b'~6?8WEIx,K˙ M94תfRAZA_)noa L&5ԖdG[#pl.Fc 4.]FW"[@ԑ6g(Bz8 5wI̠yRάIzy`@"FPeGOzBJ4}z_za[ %Lz^Jv~3;F u0ї*J崻a>4z3ۦNdWTf5v ~|1BD/%X}|l,A/%G|li&J"$.y@6ϊN@ r ,}Rj1)C(xN>-Y..5nP&8| ɎH)m-3 r!J5e&QxЁf8+'8`0HuU۲/L7~4ؑ6{W_}Лorfb$Bx tjE usļ :N})lzbuGy)+J\f}P=iDt&32r=!*VBm? AkeO-1 &WS?UpʵωZA!#)L8{`] dhLѝt{rZm&4{t΋tܟFr#|e@P/afG`..!YO;;by@@o8ؙ*F*+֥I x+Aο|^dZ׽丛O$a^x; MzpbEc9E#9U!Mj#0?rfMoMztsƤ/' 9?}&_"wddràA$;S'Qe`=}ygI_Jpߗy)=Oq7s8ihohii8 //$Ng X+*p/'J[ ~gnYMV;s'`O(:l;<1<1p9~; A,/.2h4RA)1䂞h ca~Li{\?t'p/yr@+f {ꁵŌά翁sЁ5` ! |eUfWJ|\5$70ǎ^o90~I@_e P~W\gmCc{XaY@I&V_bS 0e -{mW/Xxڥ~N :nƟAO@8 cϻ䟴c.M~<%Ѹ\XDU z ٫z6S@N5V.`9K=pã6\( 3pR(LTe* U2uLj: LiPc`#M;V?t)E"7Nq>;~ ؁ɝ2ʎ:GFflK z\?@^J gCR<,!O)~h#v{P˹@z>cX+ eĵn>=h%@sJ z2x2yc1xdpj'i'p{w.˔Ӥ#/אzTtm٠٣KaJwi,NH8_q?dI2 A?O9ϳb< hu0=ؑƵِo<&-#︮lg*Ͽw`0 4+)ZyD=:m<̖EϮzvynU oO{Aoť zʿduu"!tsT D4N6zYoM&aI"yM䮳g=jaE|^A?%w+oQVhֱ0>ghҋ,|&KUM&V P,G78fݽ>գv8'nyHw>~GXj.ϓA_._(>~_3 HW.@R8_QΛؠ/|y'ZG~* 66u_"/f{`Y  b*huY u>Y@ ` 8v[FXa:nJ+11W&㊅JKzJ->2UmΆӪ18]Јѩ;u+ХMg6?#Um L5=pXes(YIs]9K*2>H߳eWm 2էa7>Lsp)/Xo0r@O78Ʃ7 8o|VoڋL\ +^we_җs8.>{<ȗE[*l8g2,NHtXh'ܭK;Zq~Cz.gCrM/4(̊.yuw:r ]TP'\f+\\׶tuT]?$mسl|Χa/)o{i:̏Az@ bσ wygHU s oԱ+ 2q߸n)9crg,aF0C j-uDV\` !DWoy#}}l"ohiUI J_\oSY`)oܧu8[٨QG"KA_5Gzr@>3_/"ͷ_z~ػ_}gȗp%ş}'/~xf^S}U_ ~v=v鋏|+_|ַ>誫)w=/sabrKI/s֒@1ߤs?=x`!ß- Џ ;67%}nuBOUĹERy=\#n/ϾI?|Jf=pC߱/C?}H_$UhEK13rXxݔp:{/ݺd;̜#^ qMپC2#.Ѩ7`(#uL/~ע"yڲj}:68>KDOdT~JzȰW&;tS}ҭKЗ #_"8UWOfwg??=Wr}IX2k]  H)P@h ) %ppPxdYAK` CC:Dߐ{`xw? Smy]kϾu/CWqĽ<ЭVrSÙ?T~ajU72,jdpŇbd;ӫUL7rqvoFL6MVdePkklqYFz=&њ^Ͽ$I_,uajר,z &Ľ=`-d:@/~(l&5gwK3ꔬG<KTƨSim۟]a ;ӥ$P>|LIENDB`PKZDⲞimages/browser.pngnu[PNG  IHDRl,QoyIDATx콋%]&`'6&vwfc؀ag,bo0`-, ^lղ%[~ec#ze=֣9̬s61=ܖԒZ{e:">*+++~g<mmmST2[g\p?QU ǍqZr]aT2B޻w?~ @/ccbST2P!`'~#STlST=SGLe*S`m;Ne*STeLe*S{*ST2T2L=Le*SyJv4T2L]&T2 2Le*`Oe*S2Le*O2T2L=Le*S{*ST23Ne*STeLe*S{*ST2Tv,˩Li_SGLVXb1~_.=c}h*SyZ k;^r%y7~K_8qkָuxxnL9pPu>oldxqhK|nC8!\A[;p,͸O϶^mй:u-֙^֖r~}\u辷n¹[ZC:66m֮Cj:v@C u{jg3Sʉ,|>۷o+Ǐ?75<X7OSlSIo͍tqscLd?۟~߿:o[3}E[z[uvcS{ؠ>֑ڿ-}ks?=M?յn[&a{}s=m /q&tV} }~uln~6ԏ[_w;>o-?>3lamBnlf~ זn8:q}bq~~|w ǜ(q~[٧^6>gX7sw?\3_e?7 >;c/rre6 TO7RYO~5vqխ8~\vt0.S}K.XϨkJ7?tjX l~[.t0vtl:c1.Q~Km~舘!mXnOOx:u7Tܥ{o#aHu Czy>!]KV2k, qq GľfouGhGDϫ%4tѣ^>un{mR]8w5{<y+ׇqϹgC?|tސq#}^/t, =:;`/ni2>ܟ^q|ٯ8ossPqٓ>K8~j|N7cqj߼n|h/g?tώ3o8fkf}n\%6'qIȉ Zo$8c.x&i&@Iu)MЉH&}`a:T8&2< ߧkuG qS]s^xN@E͊='5 h =nk.?%u{sp]+߯hÐc6>@>vz->&\uᢐ~'=/}6|ohےhIB]/+/3(7CT ؋}d|E??~^2q<G)-cquw.r3戅cp,ݾ38{O>sw4{~aw~18;^ 6=q&Y\pbHd)`3L"}p`8'" &ձN `P"Ť .f[dFK(#\0 o (UQ ^y?1Myt>=$Pb ="О- q`F"^ɞA@ چgkXzKq .YX8hɅwx~q-JXF+18"`cvqP~o:v}k2./o~(P_(098uV3Wo߷:X98ugEj0k ַƏ~t<]l+(ufL'mIiBa 2m=t>&#l˞&/`A[ibF| xs₅W Y6AmYg'6#l'Ydo`=1_O&s:E6މ 5[A[G/- 8G ;i(7ytfauK%U0MPb}hpbWd@%e`1 .\:,'S{ht.A;յ{K~(P80ƹu=/W]u5=p|8!hZi2uլ)tb/˕eKA$sX/@2RrDgPc]^i- 8;i>5N2N`Y,nEs,s%!PaRj2= , צ=4Y3ekϽBѓ! ,,s`KNt`2c`vM)ːwY;, !w%J-,t| HcQb}Gh{~t&Y?8Á;@]skљ~8Pکԅ:w}|z:ɬ_##6@]Ʈa?dJRm̎(}zRle')$$+0{ F3*J*fXGbyQBK=u"ueNSY<KXb.`xø>XZ Q'>f5o<|Lc6BXw7?(ݏַ>@n9"Q'>рot4~+_ebÝ̦8r2mx2),MDv;rq `I9:_ie_ANi>J : b4ma3&<f'+ZA5xCnh:N#: #\rH=332|@#l"&.g(_/lW pH ''4Yl0E;5s,#(1\r`s"# ϐ#piYC8]NNB=]?X?heN}̀}gv`}3U ͲQ'>I5>~ ,u 뮻s9g\D)9w%AK UfSQ˴V,R9%. js^J/)K" uV7RQL,}pJNN86apԟm0fͶ* .;f]0TLh6^:XpL̶! (-Zƈ } #[5(ћG.l8ˑ,Ð(~t9ElƣGprT?] X?heNԽkh`$\yN`K)).=Xn6QQyHId)gn;;-)9Ԧ ̵9E9mh#Rs8'2٥ȨH kJL ȩ+qWi[~ v۱͌ KHx{e`vn-qNRJgK GL(owҡsB CV:(, 5rJ NNnPІqjHa{^X1+i myˡ3vDG뇁uNH}8Nucm̖Ĭ}S̈6`s1uv4~H;}|{Pt㖙 -,oOnz[)ܽӲer^(Yae)1a%ӼL@*T%>氻n;E| N W+htB (ӧWbY2enŒI3T99bzЙw^Z9b) e*sR!x/öT3XnY:U~iЌTb}GduW }uePy?rwfy-x#Y}'ht$}̀5Iuky$OXg)5K=쳹{Mei@DƆ1h'a:C3D[02jLv~B阍̲>3ޱN 7D\<>o-fA(nJKZP0zms`eOȾGѫVYZ?κ@gr *ov3AW\=S" 8R6qK&(i%;4ٯgc4u,zHNFW)2q܎yqNc]v:kvx5&_Fp=JXUtB&c7rp9 dS bh1<(L[cpX38%@m+9h&N<,Ȁku!jc(˾POQ(2[&ILQ\k: g )G[ xe2[о.c;fQQOvXiKԟWN`S̃@7g{vYD`E? S5o.h[#|v{v-us] Cھx[v-usY_WƳ:kܗ4mDh'N [:܋ihx/ ?Zdо^p&)}$ĬFH vCf;Z/FcOpbr)mw . ~ ㋃"b` ^(*8z', d0㚳< brͭRÎ 0vqp3YG,@'9;Pgsî)]sJ=UQ"M+Oeώb*`?xݵ8@%ΰcl]KAUW]5rlJME4c"Ɖd^hDc̔;m כUH ! (xå5f׊ӹ 9Ȟ+`%V %av wٱ6~F<8]5zbTߠ>^ dArN윅hSqb9Iq׷zl1d}qIwrq;Ἇ2oH ۦ?جTT \9sp)l8/:3BE` 8oIW/*}&;mI4^L'Yo^2 W ˥iŀYt>P `8t`ly#:-aqCtT &5tyt:3%R$o,iԝ`p_3;h )Np#rk( |UьTwl{UԵm^ut}{wl{UuqF)lkS/ ߒSpa㐑}ZzӦ, /F@ pc@ ֦:A{S潗Ԫ[e䌄OL@ZK Gco]03 q:25Zѽd!gdPt ͛!8#9Hɞ"~&.eXk4R?+&9/o<8:.'᱾uڢr_ PnNc}8`=Cv=KQ# ^!v̉#6/{y̼\|*H"rJ)~د{w\9h0cwr󶩒 0潘re N>q )ʃy!7g NxXR{bR @Ґ5 w!t5yyW 5J6SU㈱ $AFm`s{We}X0.:R\(٧S::q\6Yw~ܗ9nmL|?%8ǦsWW\qO.} /8Du]{Xߑf$9ۡ1홧4kM! +vx(n'Tsn ߁9 +:=q΁rC&2+VGd A3Y݆vQlA'18l4-&)XOn̳k2 z/eޅ{Ncщ:(-&tm[rȦ^H:}X/l[֍_ O9%pAtv%K1Li{8:w^f->g0ߥp M)2k >;cNT>+ƿ/d-,9Q`#C]tM={P foV֓1'xa,:YO8lKN9++.]gɀیvJ އ@z6XY6`:ݷ~G%Ү 2K;cm#g%r|v.GqL'ɹG=* AԮ}o=W ?}.AuS#vQ!;⎍#J3r{$qAoFX!*ig$JP(H_@LQj/5p"C&KCwzG38ĚTvd)$.hTnDfcb!-($ F+L3䗦@v[20W&_01BMfg .9$8@)$!aXK'~}/:JY:#/Ĝ>}N\T(9(#oîKi\7's.w:OU| Woia7R ϋ#pG<8(B79(ceo鴠)P{6@9\ ڽvS4Ԧ8,[wK8{*`wywRھ>痩L%v&TX!x ر0 mU\KdtF7#$Z v2[|ߊ]]N*Ҧ>j;%N2bG͘h.i>LmhIёȃ⬕( 5K: Q8E%4;0ݶזNU)僞6t{@ANG@O6=NکqzP ( BgN7m/Ei1u93h`<;q4Tv ׮?ϧ~(!)Q&9{^} usi9 Z\7tn[v/Y:کqԱ.'[G|6wmIE"=9ϲmo.uq$_^'N5]]p ߒUOGh !'zOֻEG(6yS OiՎ;n(0luH0H6; !H vŭu6B %t 17mއ' mu3#aȼ ήϡB)UxZ7Ba Ժ{-_>)+ģ vv(mEޏw8eɠdD %uO=]cЮ/x鸙zc$/mXͨ3WGM8N18$d3C'Km+=@B\;! m( | `6e,`Ӌd2{=.]p8ZJ24 WBc1/,, d?\O Zm 01y.zNL紝g8RZ JAt.8 {xض3sB!ɷz;V@k-<8tq$KD"02*]vmם6Vї'bRQ{!$aG)8NN.'~N&v4jZm@o:B( @wF$xAdKp.*BKͦ t / >%ޡhQZ6&,]zVY,VB^)Ը)ԋg7tCf;=,iji6j@6~n t9VJ?2#}q4Tv@ 9]cϐ}2e7fZLALiO3߷zxbA3Zx v QK ;u9P>Q]_jG"eWmo&'w&f}/Hׯ"9RaE{R+db W$J6)0Rc0|7ifh@e ܼ VGQ4_@ b9FxXn@ótKKb.4|{b|fM=gYs9g[R'Xk3LzoOMdp-'>F,Z+tM:̍!kvL{MA'[0PWfO?RFMhz:o7rlZAψޗ=0N0aJ9X'5~ %pZʉ Z߸C:|1dǜ"aΏ6(B~M[KY1$|ț{Gtr$ XMm>u:"XTr%K! A5ވwq3 6 uHiK,gNKTX jN6}n  66HnZ`]mj_cm&m fr`o#@]b,6+ 34lMԯ`q6ySȭm׎kXCsomH|f7EsnbAB{x!w5f&98d:*UMcCo+bѧMۯ_B-i=إu(Z968{*;`x;^z)zS{A05QPCj%051N(  ح#P s95pJhE[Eӹnڰo ,;:; G7J N7f8qͮ>t* /6ؙ(`n"pkL:ƭ;G_16kݚ Q c` )w=r-ޕMI4`4I1Z٣SS&HV  - PAc}6}N4VA cp]/4.Dgv:lg# v wMhǍuF*؊yva ^Z*z96%i40ԦsaFI1k |A,U︿I~>S9vȐ;cFDpY:u+V%@ip 5*d5uGS'&H[kT_\ZGRϵC+6"rn5Φ_kҥibvr Z~gq76ĭXE_t@mV؄m5 55VK{yQ:4 EĶ&h5$vkš{g-4Q l$qtvFrAhmYojji!M8jΔLX!HC;?2_mh5L)uǨZ5rpz $pP3(]-EfV-pnjO19kJٙ8&icRŘȜA4#DQk4eטvb8<[)!GcM['2ȴ[:`\ylj?"֖KjdoK/Yk[xmiqd Fsf k(q"Qٶfz6y A/*%[]W{県ҨOw-oBȣu~7# Fh7|xYgQ\A\2+5LMvMp}')3'}cS], k퐓IJ\P[I =5N>H Di6ҌFRuk-j9.&9@L2o/9 @E6ITEQ fv\6GnF)5(X%tt9P9u.7&8B%pЍ#$:3Y2e? XP X8SkPF= 5BFOxLćV(1 %yi~:Z+omm>x iun9-~?swHnQ}]m7x ֝Aqh:Kd!Dpb-40@¤3 J'Xb2 OuT vPg# 5+m-&K fjW3\1tZ}W[S05ൣ쨫Ull&>ʓ=ȩGu^{*kBRDB(~IZR@>Fd**kdSQ dۡ F Аe9䰿JUkq`QPYBP2,hAc#6hխR*#+4B8H h)npj0]**A/.z _5z+Gd ̞蕩bj6``kij;Aj^+ RuV&UˁNW+:/heSF!7|8:+lTŨU{̃všIwL:TQ\m}ZC+N!WbL rL.ʹ] HL$,Z&:#d̤瞃>{嶁a=iMhG:yM ;|1 Wsi VF&0ʋ;1馦SZ3eUkPT1Y v|-3z(6pNS$s9j j{SŴN+oxu#vDNzQmx/o8ݸcj̢=+pAm-G%`ֵZ#Ï/Npucx9U>h 15l)`CiMhG;@+jSgrZd3տ`{hëVRJ+ 6"Q"3?\`vǕbծ8I̔'IRinKUtՊY;Y]v05vЄ _.*veyֶf8qDk&a]E1ieʙiA q4i8"`7y-*u@Y˔+˖MRYf*}˱JJWӠGFf3 J&X]ʌH7W\jU M8(y+aunڄM4%ͶTY'68)uN[N/X'r/ G'^gjR!zP+8Y:RN*7MmdV@'H72Vi*< gNR+R:kA0RfS6r/q4i8"`쌲+2#蹶g4HjwVŒDf_SjH#'VƲkih)KL1K{J2pR7Zr@)u6Ѱ"⺸'NFN J 4t͗WjԕVT6b1ԧjM nx>)h3̼J;^5%·T::ګ~UA6 R}W[1&X'!gA IgS*"Nd#miqG8#1l9h\Tt\a u'VW8neOw`@`5`|0JKCm80KA߫SD}SqumO<枮_zIw@VHI:W+%}KfkU!@'F-vfPBA^0TZ߯uZGt >d_h⑉͚dO8tiP`Q d0puZIkfnW+4jG'fWoy3Wqz9wċeXcb^uoU_vK}^v/j2|)/ z9sց/$r{,/zc66_w8QSѹ} naXcިޫ}_Wv{}x"u~c ^wΗ?{ޮ _淥w~%_~x^) ZpȤ6U?HiXć V&4N;  44`´ .P5MmFsa2}jN+*VRk*(T٢N^UQWJ_TU+s|u<,)N[ee gܫXA3FYM2 0J*meF1JgQU*!EM 1ATnYˉD%s+=JLm=VqtQN[ /`|ozϞ={={g<3̟y={R }'П7=3}~q'=c^}?g:w3Rl3U/{po{;{ۿGuy^֍X=8n/ s/۲7e=L}g{9&Wmڣ띹Gv=}=~ثhto=nCo_xV~T_cZD#ĸ~%6)-WJC dI:5p4 Cm=Đ&i#q:Yd6Eb3ZMJZX &[VkF'w=ArL)M0J&)2ob#cV[oklՍѰ*{KeR&]ޥs L6YlU&c\fS*y=JCfvM] EiVcvr^ S=mu߷wb*߇EQ"Y.MafU8% +ٜiX$3t)] (2a֌&2K:(UE^-USjMI+*e. )Ӣ%fEkJ:D4N ;%m(h6֧J9KΥ][%K+Z+H- L~.09@OUSHjWd@̫$2*2 V8*s!0O :FX H~EQ8:\r/\1>lאLk8"#uSZw* #96Y~JHW$P,0q=iPR-,Z&(4@Jز6slk=ld3ĄYbR6mK1 6aKiXO:DȾ @ ՙEr6/4ˇYykf3 ڀ,xuv -=e-'|!YtQF 3"fo=W"j|GmA'O}j>fNh '7#FQx&[É\4# 'I^ISgǜ R&?X&'jQ=i&oXc\du+ V7bhVU{jǜ&mQ?0Q1)R,m.vXUfeQLV&\'@Ϣ ]^w72{)^I<yE-$l*;sUͱR?iq>J%yMF]Wm Dv*^ [8D4{#;OAe!),Ld17NV08S+@a4br !(S:l ׆I^edl2[ڼY_my/8NVfAv}7d6x=:*JAnx3ȸ 뻩iC>iQf]0dtNuЌoVaMZ؏eD̛SH*ZcLiq+^|I8!ӊag`%V0wX,WJ{U2kE/b}u#^B]c'[X1,@-UrLv氭:1_fL>Z@V+g0" `Ȭ.rӍuo“Z@CG`G])d@"θ@a,3!p"N+[Mx2t2(8:^!b^r18{vtTr~fr$;raUdp|eQOfA Ӿ&8o%ؘ@FhQh ld]@k:Z6Kiv܈Ѷ *qM;*;jk~9n x%(kf&V̔NB`@7akU@ʎuZӖ+iN 8;P+\ш۹zqm Z Z2SRϝv5b͐TqtR?="8`N.&&)&B'Ll Xj Ť.+(*3K5u]̨ZH"0[,j_.AvNZQhߢi-h* AF(Cb5*'.Me FT,p ԓBrB/Bmez-B6E@I((+6=RB׫ЎҚpU?š4GxP)[RkQV,doLqLqߌ(3O:. X`biDi,ҀPk BYAv0&9|^E)i1l\{D"hdt6iRPK\ }Wdx4jQޅϘ\;h&0@_=eBߣhWx ځ{ݑeJ.l B`zԞ%1&):->Wiq7\rE)Pi' 0Y di| S^0;ciҴ_3XI/2Fc⤶ιDj2`Mp9\apZNDi|٦1]-{Q)]qyٮA(l'r4֓stGڣ֑u֢6 s#T|9T #Zo3(KgŽ+2ysta^t|IXԖy*Xm(MSuy:n.O|I]W}A7'7%Wd.V[ք#SL_ūnj]xxI)[0d׵tM8 fĨ!be<|uXJ d?w/y믿)^vO?_O~ o?_7aὗS91o7˺'4wx6 9+$'=SGHU~JXOg=)#-< />麉Y_|EO?#hJ|hhƀ&s&ZPV&2 b!֚?@ ,ukM2v( ??/{Ɨ ^ o3U#q!&jA$]sPZ=еɈdF#t6yGM̂$'˼P6p#=Om#k:J N\}?=^wu5.x(R!=6 - Sbeji %o իtd Wb c$B!ll\␸~&_:Og?{|?%8/_ gvɟUz+bm%~[O@}h^x s@*Okq\[a}|w*vv2;Kt߯|+yM^vxiQ;F?y;)'2N⤝4OK靥Nk;MN|f:cip,o^4_5SSNy~qb1`s;ދͰ,f`nnVBtaĪ 99sy^8|m! 7^bB8g[8aaU옿o;L[4^~gkZ`H $+kB™٢ub^- s8CTO8 ih;92 X5W_iʯ|yk׾,Abܿ[E :o}xI'iUY8*"d@;}^QeH;}~䣒ASO_m 8,fj}/KOsTe@D8c*ΤRLe!%@.F89L.rؿ˿_'|׿~rx7%g޻{|xg|m7u7ܨ]JR+#!sssET0 당" Ih@^q>vU +D?N^X|N`lJWM|ꩯHƳ{x9S8Q0;XPk1})& !' Kv7E,"n~~cmhnP>Ln;9 [.N{ `: ؏m),Sgl̺>T q6'{Ӕgu@c| ^HS ?(zM3$3. m"+Jf86]wnXx/B@:c8匓w6+l[8鸙um4P,( eיѢX(-7pxM7wsxwwޛ;oJ`O]6ޘ~"W<rj\6)l>l9B;1ڇ>AX"9slr ?w¯3{M:қNnpu׏w~GVkka> 9U]Ŭ6hk1:עD67y @sJ+xOtQ=$X LV33h3{Ɍΰ.kgoSK_7X0əYBz,53jgYAOcfQYJ[BNT`4̂'sO;KWbJʼn lAoqhߛ{}xwn/jvvL`^k.'of Һ~y>r63sO̬J,hL)*b^Z )oFVWwÿy׽ud,fM;qJwf(Sx7²[~S1j=,jl. tTȊY)&^9Y扌EߴS&~`-v5ϰи|~>k߭qE t`؟|//`=uP]l:f iL$LyLnL y%aAv-@y44rH9sX6)Pw}j7.tb^+7tjBQ3J2CssG+;MP`z'b^ .)#9 .s9dIX̔6Ĵo@rϽww$!iٗ\ۿLL 9xbQQC_7(@a;g8 xf~fO?=͘( 0lm!ƚ38sƙ`>m اQ$S-$i0" @[INP.;i%$bZq\ ;q^ МfX_{xy7@;jkq1''/:6>ց):wo,#{ -Sŷǯfu`l9Z}>1y+m6&‰3fr,rPcuDŽq'K`ӱG8!p )|UwH ZxR]=NAjW;%S7~ƎDžz%#_rJBک]Ր)[Wyqw󖡵!f`ju7H δhݛ{#KyxYzOߗ2༘oޤN)o Z!8r82 `A Q 3.ENV#8:׌' ׫ us, SR\o{kCsώaBc8Z@B2)X)igRgQ'/Wh*s0JEX#h/8}g+x31) 8I{y ksmnaMemgDKQF,2f֑g^ıc_D5 i|A73b0M83sZ56ל;g63aYʉ)2D.LciccI޽g):kO}Ӹxgp8#҇+ǓǤL>i7]Z;^< 1~#ֿإ>$o@ٌ|Yi7@s|.Ɂ1ipqV;; zrN!`B?ق\oϞwkR,s>"5Yž2(_=X&{tHl&pK`tͷ&ꫮOAxCb7&`oJ7]Oz7Tp 7Sm1A4{&۾}L.-_|/`=K{5LZ,3R 2U,n R?NF1mJr7_y>Gw!6HGob4jƿ9oRslXwv蟿#`{JW.5挜اn>sܧʼnLzc(ςv>>t=ik>̹ze=~ʹC^`+;! SE߂ AƲQ ` 8cy$>3fXN,R#h~`K{Ml%!G\k}_`jPU{ιŇzHgx(œUOI'➭ujZ ^yc?S?˗iG^C,nur}z|e[*6<>>qό>|d;|Ol)Ϋ1wN~ *^@S<:ajfdtM{/+wN %$)#3-Ygwﶠ/xܰ= _N3>aRF4 oW庯ɿlG2ׄ+\tC_M,c U^テwu~e0i_6T&|L'vqȉ# 2֪ @5Z`wf{{Þ7Ϳl~Skі}2d+ uI RI7 .~C؏?lyˀmlgr "lcdr}cH6ϝ0dOώٳryzc>)*0\X1g>y_}`{hl l4m>Kұtz ROA`ڰuhkW SJ#L^=W S0V<\=i}F}X#^=3h,_{eerG9Iz r@'7Pu{ ߙ0d uy}:~m}7LA*-6Bg=c|Vۤ[k>5f1έdOb)+)6dJZe9^އ}lNpWԇ{9d|KxpL}~R^x< 㹩̕8Ly Vr|ոcfTԡ9#c^ޑPi αO~r w>2Lɾ)@q,z}oVdL&Cb+䬓uӠ0H@@PGVݙq۷2@èWޫX޽[!3! NStTug|: ^L_-'oAn1b`IZ?~)/ W^̖a7_e0SO!Jy8c ,e?|_~ BDbH>& ^tkq aJݚqto͎ƾ*PU`6{"$dʵt VMdMri;Vn {q\yy&Ư)Mj2X} $IkOe{Gw (s'{rdLOL{`36^4'}<ؕ>?힥7fLxЦM>qbL랲M7>KTtSr*]ɎF* T|̅;tuK51r-=p^Z~60H_sdfVP羒]Ԙ@V?E`cXƜ_8NPg^X2$ ;}V" kUA*9)V 'O)~g+AM/H@.p;]eѓ`1!;0Z0ޣ:t>$uwsp/_y)ؿbיo=33S*_SU>#ibGQkeU\Ӭi1LP{as_8awS^Οr4QYSErTI?&E˃LJ@~dl#mt ?lzlՔfÉ<@~b.k1L|:੦lZ N]aO hz@H@γ޶}@}Yap0դˉ@| H='ZWـ/r0@YůEm/r`z}rc/?ZP_Zq,h yJ>Խ_xBbc/NeyO@VpNZP vh,zٱ/s%H&)ӽo1(8/prIq hkؑVy z;"C60.3aiic(0`'0=F9&Y1_@e垣NXR~-;ELx9fG9kQ_ώpƘI}D\cR#z;Ɯf۫V?wv?35gʶ,}Ԡ[c3 8ybLV߻Q=fi; =[{O̘ce@mhkfpVaɖ4PhXtRG~6yg.edj'̛ B Awn&T|MxDJ`O^t:ǘ0BЂnO&@T*0!dqZɁg·+q" g]p db6|~h2@ɕUN1 Mپoig_](k>090}|ea-,1770JQNW呀V1mv};Heu$)u`vb\R6+fl"k߭=W0frcT{IFn N=]ώJ_w Gu> }k>0yÎna 1掼2w ',wLiiŗWlol;#wNߛ{bw8댕wOqs{:vڀ F]dt1{gtIdz7χte=dM@QzG-xo}y~Ux`` WUM`ݷ~`g~gŨ<՚&ރWe69؞r1[ݢ?oc] 03\໸ժANfqA$wߊg_!ׁA_mda_W5w7 zO+k"f\C\\f˵s9.p5g%U)QJ?cYzg$3(f[!;c=ۆ [㧓{~rDIrhrʯ&3^gV>W߰"+.-:*D]\opT|Є}Ewm"$!؋}ncݯaE45=ӟ4?LЎ$Qlwl=c[ bq?!+<$[έ\P}u ۫rQӹ]#+ָpCO`cMmXt'^C;[33]dS{d=ː̸ɝXVw4x籕[k3lLV*bp΂rL`XK0A1YF۲_5k?͐Nh3m;[Ny>;cj àb'mpV^s4W1 u?uY*꣙m"ٮhN bdYi\s[o[XgͬxiK_ܽT(Q@Y(.6X@m9ڐ}1ڍ>gZo3YvVz[+$x  9HYs8?Ťa%s;w\DxRjC#{ojG5gqIc%>poʘmƋ62lz6תKC"nx<ώwŎ9, 䓇!G쿲ǞC؉PN4bˢΆ{&7V,^;z1ϥP+cofʶ>G ʤPfBk@3kA,甪52COC/{~/iC9@pM, @TbSU Ssp J=& [-L$!-=E͇+ɫG5)OzY-e]`K'`:eӎ&?3>O^]yEY"A Y kZ $k`l^(B¤4F@&\s&(o`f1J^(,/~Y+L?xo OWB▵Mggxf'G;bs&v)+ʮV~@*/ x 7<>vs3swW;Q6-x]n6wjk/`JXylpq6=2,߹-)UU2 9+E+;1!c fgOv޶'DM{W nnsb %b=@3dQbp;9ުAq6%2CU\+]P,Xtt<Ϯ?? %/vm{ ) 0hCv[^@ צ,ـC/9;h<]xKGuf'Tˬi ,2yG'~yv߆gpaԧ>Ž]P]<Odb-=pUy戯\v W^eN}E3%bTfvͱn̘{_M:0e|3F}ћWznEm/̝쭩o'>xcw0 jˮusXU9he>gd6cY.XZ`;)pjp!J́:Ҍt>/M{Ax1]ުA\5xs7͹ҡcհHC+X%՛]V {B[ၵJNKNt cފ-s.d5M =On3&2,01iTQ$I= H%U6}~H#p;M}Qdvinx0K?x*3,/=&i[Q^ŽQ9E^i7ArvM/o b}z |n" ;^qܱ$a?5}y`o]6~~?|- -{\&ݯ6޳ S c3H2cJVړH$;wY.v g#m_?b`afrT DMILbK4dׄz 6NΥ: ²sL]vT}G3UNdoha[8/!yWM>ESӏMN,§8&;}Vf2Է,ۄMj+k[B'Ɂd]Ůy 6S]g86kM{q7Q ; ^vhRtҰIwE~3klB{l>a̫ -ؤ܊a򪬯IV_⤅U_9ycm_wq|;;mGd㝧ZXٶq>#/`2` B&sf}"IzBIeBs6/⌇C__41$D&K,dRt%;g W <I '3KE>Y%d׸+,+3^ |@eujV#-d>U 33}|edѫ7U0ڳ&ĸ2KqR/f~/&-^PvT3T̽mɎ:DN6qԂ&%y@c[܁~b#f~`M=a5/s|- dvLM';mGJ]? `owoط1SI@x;+ ٗ|3͎`Sb4Jhg]%{+rܿyLƄ*e2r^ĜsMuKZ}G@T>nX钲 .dx&1<=k|uXw:zr;>ႁׅzY2'1[) F8sզkʸ'\ з7>Q< m 8#{I%]/GV=}±"|a;K\ h+R7^0ݛ uI;lGrZDoq;b;XY՛M[yw|[Xc1l䭾XK\Vr xW숱c[={͸?;7]gؽ3, lMܸnMbO`P쩓f ; VfoU]Fr8H WrF! J@ t]AAIxd~@|u YNRs tI0ꖉQȒObǹ:VwkJQq^Zhv 9g%sHLR4rSљ9S_jq뫤$qX}c#뾓_mG%m+CQWWe?8ןģ~-▨·J]ʮ>*`c?x!k(kְmFVΙip+Jf(#3I g:Xe3Y_AHʔ@; Og/YRMؒUűXҔI@j/0 \do]T.KE+jcGJ>ITϤ{L]f}I nzT.Ueg ;=vtV♡ȳ3 x!*bC0"2 1J` 3AĄ5vpX<RIMRL1NT9,.Zբ|9"x+FU N P’YV^0<ؑ/0O0h3.3Q}O^ f ٔ#1Y\Lr+]}pY&HJL{՗Qufg_xzv2(eaG͎`,3 1557ۑ& @.X#2eLwuuK+wNA>&VL982"&ϖpmFU툔"AeXNૠz%sL]tՖB[=<;QLy\r)OJKS)zz\Ycr`標3.M)O`zi4ifN%HPZ#l{h`,%0leU9WЍñ`ft1f`p!=ӎ(+v, CALGA 9C9Y!YWK/⇘*V5UPoW|&l/g=#Ȓ\fʠ,&e P)6ZQo^p؟^EYdY.~SKrkO֢ W$& {IA: PzDQ"8kBT ZNޗ6;Kɐ,`eX.&wGCQz F r#A#lS%T:# k%lI Iӹ[H,7p0JF2] A-{2PR{M=bMՙ\4uKT P='x%1DQA}GRr pGuq B:G\A&7T)vPB$c0hw_"I gGxO2pqX=% +VH.ULFL'H8hj$@#J|E 5X (m4r݁5Xg *E3bQY!麕.i ?33k_  f-sbPnf>8пYw`& i(`=ٯ ~e݁<>EIQgDR?yT>mDlRJŽn\U[[ $Xid2d9;^J_gVzSKiKƊ dhbErM3]J Q&pE^S# :Yw6yjHƀPl/gX@щABr26X_u%i`oSg DPV@C4S1/;cP bҟy k3ާ"AIg700(y}{pHdž P@;“p~'G|O// ,'V6]jaWX 3cuBMp&ɐZ (;NjͰ[韹d1KnؔZ~7h]Lי+rAX0 ׂ V4+Xk>kvzҠv9<ki]sB dh/J[碗V45b+-Xir~ùd:RTJ mk)Ndn(TmE2օ.;`[<~i DGZh`ml`m1tAk` P 0`p[i{Eᵬ l.0e;j%Aa$;,Ю垒mt=+eaͭ\6H lGde綶8/0&:(*>#hd`l(lu6:m: R @ lnm)eab@[1pӢ ;vxѣL}GwA_y,^4L ,mȳ- hu0RU{6hhIEc6gHeP+ T΂YEnj !R 9mT $){ELb+l6K $gcQEls [n+@F 7PgpRiɜ,}kaHɀezk ;bG(Y&/xKxac5{a86躴&~isz,7c6?nem:"{I⻍KM]aoL9m]8-eM;峌c6^om6 }FTEz\qQg-ϻk^dS7/ |ۋ_viZ]Pח\m8Ŏt5 Qxgq|ぜIdpX] t5[5ʧ;hydj6ZkZkrSW]VJ8C Ip|T^4SfOr@OC# ~'c;~m[n3>JkהP-BkHZ9{6Z4<} ;< x Y,xaG ;ZnڑK"f6rۢQ1Fd+[֤{fÓW7Y5NܬFK`:"&PC87JXbhO2=lS, ǀ1NVAiMMJ^7~;abNM_M6qu'[`A9}&pds="ۂzV~ jgccZ_ KgNe/Z!~. ~aG ;Znڑ E떍ۆ нf 7[g2ѬP;v :#ghǨyt6ѨЎA;b[e# n:oUL6vũg eݔQbǷq*A_q 9i k nPg xfI7 d=E#'"ڈ#3SslOk-hw툀|1Q؀JK4g݉F8u*3 !:^֤QxY;RX~`Gafjxn:gŦ H#Q1(Mecmdt5   3$v`7nx91jŢm0PFH.Ka uOeFF#Tr% T'#MriuL+qވmMvMIFj* #b 軔TYFu[qsȊcGy"t-*ҳ=XeGãVQR[^D9C|qcP˜9ϚMf3YN#vكc_CtPelE0XjW$3f:[0Tf&8AߩFo<{$v6 Xjn4Ymf|S{ .G-haGjGX-?2/HԔIENDB`PKZvimages/yes.pngnu[PNG  IHDRaIDAT8c?%d X6s.DYX$9[B ˰h85 \y}AgZѕq\RVa%ly3p]~gME_(X.Xd~.rgpi\#Y/xqW._aV/ln `/ryuwuV7&Fi0\UϺ JY}y0p=uIږ/?3k4+QUx%3{ްo{?[8]4(Ͼ`'>?iy^?k8 dęwlT-*4@ ^)%q~W!X][VD'e~6+Tp[ y7kr9'pD$7c\}IENDB`PKZ{7images/mask.pngnu[PNG  IHDReeT|-IDATx]R: l d8TQ7[7;}^c)qRj/4_Dw+\F]hztG;J:\F>vp cnd`±sVsɵǁD$h'=]as'BfOWdLeds(L׊GWHBרVFa ]W6Ev&xM,8O1};Bc JvY_#eTW ʴd>*Q<ZL̛q)'5Y|=iWOYXѵ؋I0G QW5ذD8F֊c(X%KIFu]ڲxZ&[Qp&NxCꚲyI%&JH#YtŖ˪'@zU%zI V%9 :'_2˂*%C',"# /a×gYVh˴d*,ߐ: YD}A8H#zr1*kwѰ%% ~T ) C cUҰJaq|#~!{hi~gxLdt#+{| ~#:̣)-QUU8VVː&A#;U=Pz241:9N\* AB#Q1q'Ò'y!'Q0_5S{NvGgWyH!'c.'Sq s2MsclV + a0N&?)o Z6`9Y٨9x*@ʎ "0~‰aPO,)(ZƮ̔ r1˛ՒC?&š#坨l9QuꬬkRS*+p)7g&P;3GH vVy htT(vme0w.xRp)V}iin S-1{'w<}m!`q| U#SS VhxA}˺Ҝ&N d7Q碝+Rޓ!k  ?=H¡URnDqq $cPAdbqP,(4"T?&;H@P(0{^^Gtg/O^1FR P%.c|B=0&7F!^6viBҚT%);QX*']OA;V|MKBN)yS)/i&—\ThBHơi4En Jݣ\^DF A، 'D wYjS!?sQJwM1} _K\~$bVr7zJjۊ3|zJb(2`J DW]ǀȮ#|]Dkg #h $X!lkgR" fWUUy?#z a!' Xi0}vegTkc>Q /2Rd^yJE<zJe+O<"|Tڲh ~LfA `w8*|])a@߱ڧn0;>K}9se5[IENDB`PKZ@@images/resize.gifnu[GIF89a !, @ajONrѦ9nY;PKZ~[images/bubble_bg.gifnu[GIF89ad)iN!%꧐𿿿d=3̡jgΠ4SkȺY/@A^u&GauャwN!),d@pH,H`)Ш~"vE.p`HRN~:xq@ <6yLK iKZ"ZVU RVZ'ut#RuZ!F{d RYbjL [W US[Ϛ&uSt[r$}S[IA;PKZWWimages/icons32.pngnu[PNG  IHDR-PLTELiq̵ooo```cccyyyUUU}}}~~~~~~~~~}}}rrrMMMnnn~~~}}}qqqxxx~~~www~~~{{{~~~iii}}}~~~IIIqqqmmmsssfffWWWtttVVVXXX]]]ZZZeee~~~zzzˍZZZttt^^^YYYnnn]]]mmmgggeeeaaafffXXXfffkkkyyymmmTTT***‡XXXmmmxxxHHHiiizzzTTT{{{yyyDDDϩyyy،~~~Ҷ鱱sss྾܁ݸ͗ttt۰ڕΤ޺yyyܣ擓wwwhhh{{{cccPPPtRNSJ B~+ p V!3e?WQ(܊MH$1#9~Ǭ4;h(-|uJxCo`ϸMhG]=Gq_/ȖOܦO/ǭ9uMA{}vIDATxXWpڎmw%n;N촳{\M6{$ͦnﻷި!TFzi*dF@ ZSfF Ҍ}{XbǛ޼ jjjjfǨc7 sacț!~G_xk7wgu7ṕCkPYЁkh~X;yd_G,u 7,|/D.sZVm.[VAcn5-#9~A*u!]\qh޸OwrD#ܰ6 ^~Qo^{Bԯ:S:Z$;*|X_l^55xʷ~m\]De&P놃V|~ôc+*¶e/SV{ uЬѷ%`Y"0|s=\L9v[=jeO 4r ^wv(,2}Y ~y*B݉Oq vpwͷl_0hd;+ӬJ͟>]^G0 މ~ 3JesoXm5ngGMA4h[Z5'!hB5d6, /? _~㈶6gc4ڑbOu![84c9ǯFo!~I`L}J]7NM!T:H=j*hsM@$;ǚ]e/`ly:>I1 k HOym33RJX#FDa1f7|Avd#mr :VP3w8ƹq:ѱ= 0,~kɶoxV19}\!`ѠͭP%nF>Da7''5Cs.(&i~_f$yq$ QCng#.1ɣ>. D"i2zr2V0Iz }r*c!>;ߗ>]R=(~b\9J_d9` fA7ےE{K]E`U8e+5GG`0ETgc=G}6vh8il;:j r v}pW.-%5/4SnW?;){;kС =?Kua Sx+gXB_PB@Wì -Lk•uwvDPѣ*;ޮA~)יJ|;}=B_!QbΛ؅@9L#I9DFK5%5U =ZE距Ⱥ5C&ηm&!r΢p٦LC#@Gk?8ϓȶjEJH3" - d;!B/(!iYP/ }.Vb> /2*f#9;aQ-L 5ZUTx0=ih 5]u:{C.c2]]#$*_9Xs8 # ,j:MK `e-!CzP-~ɋ:#&'ߌS'۽9הȨyr^z`kV-oq: R]5x; ^. !3@&lRY,٠mP8Syp8 ZA@XZBz1$ J]q(13]2FCMeLǓR1=)3@aXWϢt9{^CD1A/@/vwSd$/s# 6#&y=:w+u*V7dg,g$FI;ѱ˨O #zAJJ#oh4 K"'V_WVM֮"D@i7ʮԔ/Ա0@LD f鄞@Q}ɂ1*Yi@`1Q\*Q(C}GwM4M`lm~.KԴxDͫ d>*ɦ]ـtѐWd*̤|͟eIXt޽?OdO6v5D AHІ&ŎV{1}'4:2|~ѧc,{/zUL`Q=Gi,Cϔ_P/!D/¢ЋQgf eRzeʛ,fn\%4[96̷j'P۝ =lXˡ;.NLwZ}/{d'd7oGR̚b y%?yb)_5lDSDgB/D@@d%_ju[Ҧ$[90ДpD2ce2xL{aޠ_U! +CB%{A.3L>wYR":,2 .*I_?IWJ>qHZ%"Xp7w>y̓;'$ݗgl]`%NLݸ!/$}I B/MLT gqՠT̀/,2Om<&Y#S pK$vK|1ب808#tUoqe:.`s8ɢTʎb'vVB>E磥NM7z%,9сJ?Y-) nG A#d6zFGD͂c$ ϟ-/yګ*?`K59=ju[ޞyԚf ǾmkGff~Z4/l սg3}#g/i.{yZ)Y/Uχ>\C +QцCf%fGz*7Ow\kq_>1!ƙ&uKЇ3sѳ$+ RL$ȟF!43$mm^()toBiY7˵!5>\]^BJN;yxޟLGG2I'`e%IOۇ|Nņ\*w5  1Vi~l[" OL3_ Ze!( klLfٳ-LMGEPx8[H pvـ%wI{e>_7/w-_B<AA=cCwurT>DzZ٠='6|)YLwz;1cvz'_3A tk60<2[J6\KK} =$kcmǝNaUk3q\̣+Z3>yqe%ku8I\0@_)fg̳j HCO}u4A=?v[K/,-Ή"ܖ_/޸rPJ%-+'],[I'>cLZkeNN= f/1ĈU>vUaE5@0 i|ߠ{<_}q\?ˢ'j(v}d#{ 91}x~Xo ިc*75]|+ Q 冊"Qs H֒]ђi,Ko.=(/Θ)?IuS`vEbh@$hek^?G(;ƪݹnp,6 1z%v)7?i.-hU*K+7O 9c/h o<dy5;IkfOpz?. @|~yaևQ"W_R @;in]Fn ŋ,vRbFiAvolc`OnV*#R|t`4gσsl_٥fث-B9}؛wxw]7k>nn5Rbϯ=M6=?+jVo7LckEBOԶY5Oių?tCq*ˣ;dG`3cg,Wvu?uM׮} a'k&#qy<L6o":zteA(~kouyWס3߹al!{owz!ȋv+6;` wڊB@.)z뭷/~ l_7ЎUWD?"L1z?K'8>S"=tw{kef!}~v-TvĨ9Nlz=TlKuEM=]U[/^| vy>o߽u>k,C{7B,}MMo_tu+z;sj5TSM5TSM5TSM5TS*wIENDB`PKZGimages/wpspin_light.gifnu[GIF89a{{楥εŜޜν{{{ť{sssssŽ֥! NETSCAPE2.0! ,@p:@3dGҼ|3P.R11`0"p   M  tJCpMB} C}v]fZTC C Rlm stxnprEHLCA!,@P:@3l2G ! MEPQb  ,#X,4"EQ v ~  M M ! C  Ov s{,bFqZeN XMBEHKMA! ,p@PP(2Xx40Q}!0$2|ΠP P0pg%tr J (J  _Er kA!,@ 0"C*"CX(4J$B(2 o"2ba0BN3v BB  U o OE ZB   MA!,p0!$ pI`$haXb+HFU,gIV(8*9S }~J} qtB  l lA!,v@A0RAcY"SBxDW'$,3B^."Km*  }~s} v % J %K } BA! ,c`&fEH1 CվD$ݮ/2PHLjh,ah4hLXqc0ȴ+ *#WG#!!,ɄAKC*"e$ Z0PG&!Dp Nm BB !    x" x O YB{BA!,s0SX,pi<1DԂ@Pq0;XBOK ~Tx  Nx NK"K L LA!,e :L(bBѼ Z15Ka!C D*e<e9X3RX*[2B ,)g@2! zK |KX Q"!! ,r@P0p $ %cÈ@ 8"!`oB| qzgk zB B T  C "Jr KA!,@0 ,A*")09xU Cp^88!1@#BB{ Q    y{y syY  mO ZB MA;PKZtFFimages/resize-rtl.gifnu[GIF89a !, @)asX\AHHS;PKZ 4himages/resize-rtl-2x.gifnu[GIF89aڳ!,@[Hruڹ6f]Eu%3ڒ'7=2l@H xd e MJoSYm\&L"k7+nk o3i:;PKZ)SSimages/icons32-vs-2x.pngnu[PNG  IHDRZ"FvPLTELiqQH['kED4HeHPtTxM=;DITG]JJ>M[Q=E:L3[9JI5鍹_1voBهȨٻk⎹yĤܭܷ՞כӷNgRtRNSK *0-4!&u[LAThu7؋I=2VŮkgBަ"kahotOIDATx |Sm\1 [HIҴY˒ղjYdYX%[5q 6aBKh0iB6KNgy={%[LG/W޴=?wRJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)Tk7m"7mZ{VH)RӢUCVk^jQI)RJ/h~qz='GtMJ_SJ鿪21g_/Z=g^WV R;:'Q {SCJs{M3<Ɩjll|y# ny%}֪&+hVc0҄^N֌qdž?mz,1%~%_s+yںss[/~+7~~xÇ/}hS}Y@#EFv,6?Bel]/wlV;/ߵb9O"'-TRڤj^o }k@OͻrsI«܂XH{9Ji^3)IgѢ+G|\od|'3233vp@R{M{%u\ޞWl 5 15luk%"_ݵp9?_DRd56m8OO E*BxN*ssLm7O!dЏb@x0yv5[׍~UW%s0#3AԸ/Ф7X?B{(=|w t23?I׆նG~0+^ L&Z 8E?W/>| QȢ9'=m#0]KT6CtT'dٗ8}zr~HD#yt^o:!ұ=prZ, }2@W]\_8yR]Y)}߸,^FՕ[W:'U4E'D"ǙYVf,vuly{ )ʤoSPvL.jڰ쥩u4ȱVN-2ʞ[?'/bGN lN?|݄nW4|X eWM2h7iUy3M)5/M)ѰJ)WG޿+S,BN*"~9 ^ҭbGR#&P (3*Dnʯ*Tdq^Q~c=Ft.tar l_{ { -+0:ɠ'de]~-_ߒ>`!JBU}mA_*ԉ P2d0uB)=s=>qSN err<}=Do2wQY<(Xecv%`g--yi|qb5'a֦Pv^}x2BLXD\Ȓn+rmI[1'qJ*"X)i(^G y:ר\},/qeETQoU+chW/@yXJ zBV+ټQ1WY)ذ= lt I\n)K4`AVHSKNO=2p@-OП8r!J&]dʵ3bKnڪ T'+:@h؟@8r%0ܼ,+-3;R nQ&bQJnM jbd8MFJ5:*D JxУx^d\eܺ8[ŹV(EU H-EU X72NAx IM8ѷE 8'@hTv/X;V^?EWTH"%Cw<5̀da=*}(^:xٳ'?y?ON§(?޹Z* ,,B>{ H@W|Q7QERvnSy( ;|z+Xfuɮ3Z"i#-_ormt:γj_1?Noz~e% 2-\W&/jE19u{ }E~yΌ`*gHTзXF]\pT2!zw^23huJyV17tv4 B2P5E,ut400ܹSw<~ FEu+*M _#lK?Z15aQ7ʢ"`fp+OHyǶ0Q-񳩳NJ]u\ 2=j.S6 POh 3TbH_O7D*깄;`zفg8 jUW(Yڇ $2ag ;#6w;/IHrDE4o(s ŻOEY2UTJW&a4#AIMl]uup P'㪭&ժBmM:8uLFI-">uר4E|Cs8%HBzvZ<.Eejj_v;í(֝ZMcg99 #c3JNTgPIFs mY[l$[Nܼ^s厲Y- 7xj1$^d޽K4tRb5S1"fpԹΞ8}cNCNdzWGB3-Euܧ2ك>eA9zJkkѠ_߉8x"-OgN *2d7m#5HA='J#z@(MTXo:uNUnu@]]u5l=T#ןWOy|o,t:A!=/ v! 7;G1RXHq!G=`9^dU3 */3Iؤ&fl&|v.']L+o%Ҥ8yRwmh BQiZ)` wͅ?9|h ҋ Twb)Np.Aq^X?=O=0Z7{w#]6Z L>xU*v)j t9BU.ۦ2 :SX!%8_k|PŜ68O`lZ}Xye!CF [Mg@qY+ mR1XM?Ζ=A]@ȹ*"z.Dv>.# 8/-&~8Ov}L[<'L2g#Xh{I@04 OjKik4.$T5EGh B;UCW0Ӑ .H HT]ynjߛvOZ*z!JmAd]=٩#j?3q" $&hH5y?[ү̫t*ɤY& +F{*]UJ5zB%:HR0BHrZfZ)ݧ㯔uWCRC:E?\Y~w[UR$r,lH=`Nz,'+|*EqqA)QYW&RMB&ʉ@Atld1vd>1%uJ(pWy m`MۜBjGB)+ʻ6K 0T@z(xVk(v f9B}o2C^ īLpXj#U.%r9B=yc=&ĉ,BO{K($GF.O&3!U8o;O%rʎWI)D}|6H̍Xyuωx&@рa 8M3 ُ0{m:} >r#~飳'$Ʋ|تijeF)+JY rg8 {`Ѕ% J8$ak̦-;ըOV-b&0E&1)ށw=A?Dt:v`<- mYPKK`@źbR k5c9}\8UWm H/?l`qGIO#@dxkӐmiYɷЗ!y!}1oћLrLdXl({I<v 1]M#|X ShN7E10kuaPpsp?[O_׽p(~SG\:~ ~kHw %1wX]f+qп,Y*'/[r8_ mm8z{ }7B P"Kc%c,04"ѠgC̍ wS78S738} ܏?w훳GukJ< VPryĕ>L@[>c+Dn3g)}sI⼳=&۝8;v"3R@:zMe*y*&?A≥hrap4 "jh9y$Qm5yU108 \c6ADwSpv*\!\EA6+ IQ8tJJDE>({|/~cVG6O|瑄=z: D IOnDWuc4u @g^Oߟ4g-;"&qq\;bXl*Փd$ajBFg"m=%qPFWVsq'QS8~{]p8x!fw$ zk )uhsҚ0Q3 gVbi y_mm` ^鬭E;?%#a&80 6_E׉*>+gxq kY(ה5$kp$M oo wJوȨKBŵmAz*G$ɨFTe&hFXrΒ5.- X3!W#`􏑾LO-OͅJ 3=:@Gn%.0;J$ʓ8;z w\.Au料h<_bVqkófl_2Hђndt6cuVw;a U@CXT櫮xmYУ2鱐U_'pـJbAlVֲūm>)Hݸ}9r~%[ r|8#稈`Sq:+JF1 l6{̌]>qd q9{-x6z3 h_y@EQջ`"i8nUQEp`nt܌_ryI|CP]gdPGÊuC 'd>E>9+YmzwH`j5;-˛<LumnNʷ3tWO49/ʔtf.y &Rs*,K#&$#NT#r7^`9š憡΋zj@-? mDL" LMR!zk0 CzDK6IpuM{CQ -[~b4yDQ'ޅ\QMt ykICӘ}O1*w!:M_;3i~X6cKum奿. //7毋]ZuYtVT:RWrAcLoTS\UnKڱBW>z:# G秾^ k|&](Kƃ -ǀTJS g"Hyh(`eG8-fsCe4 )٨Aْ0JhPZjɡ,Wx)@A>֙[CTU_7!Hgk+Շ jԦ+; NL=J3g_j~d;wfď|qm2I6N 2^(F8MD·\崣o }@Dz>X)Eaa'^]gA믫r믋 "|9*Px>?uav1挓0#=@M="@Ԇ@o8+](^'ň@o[J0獡PWk;xvi?ә[B!c"_mrL|E/bF&yƩM=|$F}=D%*]3y,( h~RT!<Ρ~8"nt-IqUTQˈ'!Y,j-_UP|ЀސɠoÄjJa& ER>@ݣߋ}٫gۿ'L_LԥcӉRc=S]Q6Ӄ%ZGú4{ŏ3RO_=q0S~涏[N}r*0x'====S$wFQo?ae~+){\8УHV lWjamkU$s}V|z=Ûy*yNEiĀ2Nm2A'B، AP5ozѐN(+suhmny oB/$ &i>vNCvN`Ԋ):V+AMٷ"緺ڍj+$d7&rhØPrr(nwuBÒ&at<9tV|49믋ao>s.ǯYMH$ozMZ2fG.[ L<|Y| Nc8e}XK a_p"QaT~hbDꫧCDL[n@B,Z!` R`#zX핖 BpJ|ק8?:,BbL8os%Ky@y`*k鋳{"wQ(D60c^q٤NX&"ewնuw]\B=Pt#ON)x*X|h}&>îɤ1Nz`1憀|ozWG z&SIcji}^D_(!Fӳ*›d%dSN#{<nH#ؤ;KyqG P9_0o_4\[LjK?Kzvи}AG|WWzd Mhُ}4Z _{:XK^ =ZM`fN"6kU zԌ\>[#k)E Jn)TZTQA+%hu.x ԣ MHwEDCSXw{tܣr/bԆpm5=~1`//4rw`Ox8ڪBLL![ l^XE;A="1ɼ*z rdzm]k)hL(ïiGQ(E`2+iaBmУ* B+sHkXnk s<[ZU|LF>s5Q+yZ,Io3|q71ð`;.MNܘ)uޝXgXO=>Re)n |l6*T 87ԕ} I3 jZ/|}#Iz&r:=/@j ̽ay b,:uqas? {wԍFi8*".S#R᠘}悕Ϥ/Z-W&KrA&PB2zJ{%R w6 a;XF$8mԎ(ǞRHʟ|>&LeR9kh ^ @N x0SxB,x|)_ϐFDz88ߛ40ΥD^oʠ6KX,{Q"=dZ 9ȸCYzyTGFojp~0 cΫBcs(il_~7|/on\ݘ˽UPjC-6IWpp,ğGx0isWqr{wQe.|v'8ٌm<8M+ >qЧen/\R*.=ߒx $Gהo'xd`dKqskɤ^>X"SmrW!4ʅR|&B8!*%{VωZ tYMF7VQ*2iAU|eS^"ю0rѦ#8̳2d2d eك~ˏ/9pY݉UYVuGΞ8r-^E!Lҕ+S\SU~=GI ؄8To6" ?E',"`TvSAusJ,dm**0=Kvl0$8]7AZ( v!ocFOTRpٹ*#5(1dޔ/0 *o&(fO370\D"v4}/>s-ڥ5j?_\O=y&sXd6C'.3fa#>vE#/>v2N Uutç_ر7AЫu{7}gnb)aqMqUoMCWX K @ڞУW4h@/婐֜@(TA-L (Z̅2.;@nkp@?I,Vr09 MkaB7c<0P*呪6=*a#aR9|F3â9R8_nEzA!%zt-U:5|~_ `*dU `{TvGXȨ BbAˢP[wg-5{p3aof?/o|dAw|x@_>)A碢3"R{ƥI1З|r zStoΎ~rS~xA{Ӂk!`'0 |?=2m~qsMH-H_MWUIQxm@>ײOq h76qMѣXf@̀=h }b9r-]o4 |EO%e/ ΂hDۑeZW#JC'V[l!Զ HLR!(%G'u,I7Nԫ[$p+]`dG^IJW\,3&8ՙq = >ɣumT^3-V `)n~ 8q0Ob+f;0We>Px g!<}+8|c8_80?8vrÐ)!b6_h+g~"=l06dsw5Զ]jm*)@--*3e0^[T6zh5A~a:Ńyj'+T쯠$\[da,-lm:)w{:[.l@k'.x̍tdwd%c˒n>lWxff8~*l_)D6Tem_"O?Q7B=y$?!1alt/?h֠_c>sH\,?ox3Ql[[-}k4=}.c&?o@^S")[Qԁ)˘)k߷>3))QЏ6LM z%Pg m Z {L0㌻刍<:D"b1 k5C,ƫT^@ϔJD^RsV87roEz6WzMR8vvH6QΑ+@//d%C+w"YO9$E s;`XcmG@WCX_lC;w~ )nz}tϊ)vNt)N"ɛ@z|3F9:7@'Lt88?_f8턁Hbw㥺UI,T) uawHqЫܘoDǜ|aAÒh: ';qs02% K6myies/% V꺃bæS(V:]gJY GÂyZLWE稬 ﶓnMzpGCyC䨤P`_ADh<7=lł+8<@dk4I5|~9GK]AwF$&ಙf~{ɛ|x{緟}ln_x ?ER}{&6/gDn_5s9#}|7< 7SV:(`/f2=Bݯ YMyqCp}o*9v!&}3ViV[us5QO3:Srb+ dž mp,E7j1_bd>cO%D~n! ]fBWdD#4l<ɘ^&ϛC3ޔh,"$q>PBw:$ދʹDvdG\68@27:8yD>뵰ޥ(>TyЖՃ!K"0>~hDQ7-7 d:-'?9ÓgT`':z!?;pjk>>pӝq$胀@g mPH 1g<Zh:)_{6#i^\GqM}0*6R5嚇p¥>󟗬J[tyڷ4$ *Yw׸*d<Ӆe"3.]6Rꠈ~O{ts#b60/iO;$ȯwANF9<>?"`$٠>< =ӢΕ1+h0&z G]>p ΏjW,wC70!c 5M #@e)sO|qxiGXb/&:.e0Fyn+ "z!ҟd\"K  &? ܹ~^㝏 ?W Uldv-KU孤nIXjy<6a 錜C((lNN^._p_'GTI|!m$ -ɠ{zTFq8! <g;:}YEqu!4793JbGǤIhDg:"(w:;SCz׹xݬyh~ʯriu 4ZDztM=MzM l:, TS5tj>5>:JD蚹mZjOy0*HU̫n腑0I?ФR5՘z^ΕJprXl&|4 d nAz@}29vH*nJH2tRl4uA 91tъvbҁ?ߦ'· <s%7pĿWHAOq(&beO'J -㇞X놩-1>s17/^IRX0Q^o۠['%9L/h gS b9z?J,C3Jd׳F9O1,r6_Pɵ A#y[=xn"zSL7XJzp3F5mƮ[s^i|u+&UrIJ zMg;xogGHavgyC,7|XW#|;n {^TQ#; cdu7˟LzݩNQZ҃M^xxjh+HM`v2(7&I=dPx\m O@or~Gv^A>`4t_b`P-xC Э+s+!yUs[x$}3x+q?/C%]%0v3ɠg# =4 hEGy-}ƒ2ӤZWX{'Fs}kӆ^?vbm{ɍg&#_=DAccaȳĂ>v:Ѓ%G4B_am+}'B T45P_nOh |*7fί{ِkaԡ[3,"âtT5*Ϸ] `8O;$1VG z&ԉrPK9p)Ӎe R/J!qЃ' lQ.>%/]* zoW8EzV60g{z)_Ik^8r!N8v/3\K)Bx RB%+hC nm~9?m>x>mU3GhM#%=2x eJ:TrJކM֓AubCcG0o㗪hZEѡ%m|f9[*%}vcMK2R &脴I=3 EUXlEˤi5`Ng106rx&w$`5xm{$CQ3@{z%#؉z} `L}~`oN9|>9vM$*0'ff稘ăʛZ1^ZG6^F`*$7QN[dX6tzTA~qG=z"@Kwr]R$䐷|J$"2@zEp&zHR?2P_U=%zm Q^ +OHY:aR5`WhG!`mH\5J6.UaΌU9t6'اa$Az(ys}rCCN&sì-|fbLLg!=f!,ypF4kIgg.. )[Eu0@|_{tަ]^\١H} US^mjCGTD6!砸fXzAE}FGmOvz>z3~^ЬX+"$n<RAo`?q5ZL ̿ɇ{WEpj%p+d?0<A?6BԀ=+@lѣyةSci%m&chm kG>(ʹ9rT|\0P CH!EJKJZO g,G:A+P2 irfF\3c7"ac55vY~ q~w֮{*6ի 3~ܯPZ%e@U6BlHK9C2V@ ߋf$Ca[JO$מޒcQM y{Ʋ]LAF(f}fNGs,1Eѣ9Lg`=8sTllueƙ>;0> 5@,y8{_kC`P{{d*SoLyFi ES^b{ej^'xYmQM(sa4?pr@8׀^P96Wvr;pV&V5#,&t Ч\zv@v47us=5mr aQ 7ޮF)@X`+h@OVV]"w;͗ru@<"~mۤCprɡN+&v5 u-aF_c/.Q]zNBTvF67m8}\@ ^m{u/2} o_yh{YOaH+&z.~{;Dlj'|۳~7h NUšpӔJF5XcI]`yy˜ 5To*GYR2Px~)HOAxڑq:;Ž~IrgD#\Z(Ÿ ϧkѪ!8/f ]L_u|(T[af\7;}+0^JCƉN'YjKp~; 3}@@ahZ]x[O9`.z=e_oww_;+RH7K$'@u/ǭҳ }o{^}YWu߾;ݯ~^̬,w܉O^ FO #r>agn/qзvCwϸQ``0 70?֨~)zN¾#Nbg#!RGėOn>#?@aaSf.aJwJuK-mh~4m ?r BۏCygȣ~nH b#dv 0R(F.d͏mvw~~w&d߈BʟWrwL6;qpЧ=]\^e.)?9_P, ryuV8;ݳ60i'/Me'Qlj~R )WؗYI$kn}4ٯ,V8+8e# 6bN^-x~izYFɒH\ܚy"aɎͷ>+j"Ђ|Ϭ߻{~ܟ`u+RW3߾;zȷ?wv?э?[Sth,k{_ef-u~ hߞbm_U{?toݛzSJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)R"TrIENDB`PKZ4{images/align-none.pngnu[PNG  IHDR8<hIDAT(SMSA.8p ݀#q 4UU-4|^Apܟ03UuwPK @e0RJ9c1l_9c964ncT5,"`~]PmL&>{Jxˡ±T~7 #4۰Qlp"֥b&"*up8k( M;NӔRM?xza3B8@hgdЄ64$K,BIENDB`PKZ3JRRimages/media-button-2x.pngnu[PNG  IHDR D;PLTEnnnnnnnnnsssnnnnnnnnnnnnnnnдqqquuunnnnnnZZZnnnssswwwxxx{{{|||}}}(ߝtRNS'*?HkIDAT8ˍV0aƉJ кDJXkrW`:ڈsZJ`7ct ZΫh6[.cjW jOy{Ӫy#/@~}Ѳm[YZP@E.iMܯAtSI3zl_CpU~h@Y)p.>?ṢJ{vzksE#ljU%ڋ{;;{gdzIj\ uM$ "#,? !JtQf0)spE3D#n9}yQ=a`[m`wc?k$=B?I5El%[5]W| R w `(E)S\a)xaEVHM& ~`~U٣F$IENDB`PKZaimages/w-logo-white.pngnu[PNG  IHDRPLTEyxtRNS  !"#$%&'(*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~xDIDATx]i@U(b99CV*iH/JeHE|!>W6R{6)8ٳ"9Tdx}=Ϲpo{^g{ku8MML[~7oX*-q@ǭڍI-BAn˜v7uEe+Ztkq@d73S*`Jp4gן^_& 1 34l|Rny/i]<]]ԠD l!b`ԚT] =ʞbvPDQd?eS#}61;j S~ai9R:J9TI瓛q'_ #B.89ݽUuLssNZM&suITMwҗnt lgT%E Wl)N/(J{^|oX7|9.yw铝@eZU>s> m'ޛ k/\_j (hv,kliJڄ^܈@%UX[xYZG?vYS\lfʹX [ו`m*uhW0k3$nӿ2|J[vb>ׯ. EӗzfRV*mS0M(Sze(mf| M]qCy8751.?_6|T*ni s;J)CS]Zō:M␼^X}}ۊku '?*no9)S|MNZ#x쵳/gbBiUGEb6&ӆ}3R<ܩWҾM#-h8F<^2 @e ϕ;iXBt b"߰Gly7_Йk4`ile\;HJ\t{ A6W$BERdj<lѭ ћTj$ 'GJ> 1 ?>8}pbBέ%ԁgV6Z⅕iKL3l@;2w߻+{?r\tܼE˟W)L4]e2v>kx8@o)̴FݽMm>`NVݧ#kݒgi^=kf/g9Z31Mnho=,=cz찤6'RUk[O>J4i#KI_.Qmg@Ֆ-B0DJRȘzɔ/h u҈VYKZi,8"a6 RR Ws>U5g_ãs,Eod4-e8Ő@Y{@ph<)/#[mP6T~>Bo[  bFSz7\YKa e`VOA)1\ӼV>S?No`K?bp>.FRv9'oMv/S| ewwM3N &R;P~ckNhH'$+jkA|_#_1«ƺk~J1('&O 6"cp;D1PBp6#V=J~͝ >xdZG⸄b(n:[0rlA 4\.(^(I5<3n9d< 1x`'e^ѮWc"P_\o+>I<9K6WoXU>p 2Q !MK48aXD&ǵfpjm@Ns QK E A&0ڎV`D\wlRXyX ܎o/V=NAz3V'~jk8n}[~5Bov|ADݿ}UO3nÎo'Y]uD-)/d!4^&AM1H%Z/Bhe_ϣRpujS뚄 D;b_ X=kSl]qESw=v]1[v,D3a@9'!޶5 FM^qd36$D³FM3o-`-eJ$\t\oFf V?jˎJةW](fRV'| d-s7?e5YEdhr;ٳJ秇&i5vڳo!p0 Ae1';}eӎ&0J+j+ }%{v|@(BL?f(HƨֈW hV JX36lgS7q[{ L(KPšQdlS=4 kM%;Z&qDpP돖Im[xAt-++d`̢4GK_BMHj BaK@uNpE:rڮ-k_BaL0+'K1$:qe@AL@@.8R`8!OVT{P0'z+~Uè2?G=ޠm&%`6 g/_s) (W`LQs tJT_3.CѾ5p IKITRD3xdDi)LbO' {:x!Qf O(ڷߺMLo/JaSrx O(7KũQLr 5 $<#yLَdy^'7qP gp\^+2'n^#@ LBÕۨ$8))@g!(`Ѿ;nc%KSD$[~;&c0@n %@S$[6My8 sqsPo|YM)HSu8kњhУńΙQ7*ߌR>$5 V#lP=wKB*6!D=x Xb N*>l”4~% (+@yܤb0Mv\;+f0k+[Fks >*=j攈NwvD'rHa0woEo5!HϙNfl گ*$>{Vpe Brxc)/?<\)1sX@H!wȓMw']-Snߒ'47U͋NTnbMk%VJ #PY.ИfU0v!KPdk,lEh!~`( #e.RhjZ)k?C-p nTsFטVk'19/Jܐv0"]xf|` T$9vIENDB`PKZyp#images/menu-vs.pngnu[PNG  IHDR@) PLTELiqS4BXI,<6%$lZYV3;PGQ*=SQIE3&D52H|=1$1=9%MMLG,RI4:PvjAq8/bSN##@n~w`T+I"IIfWH==z':Q݁z8"!Yz?ܭw]mxřM7Laǩ̭Qr{4H2V\kΕڟO^>>?uRj{OOFFGaC^”|Q~?pij¼ʰIJ+kۑ˟f؂Gٓvñpwڛ6]qhIf]Ǔp߹sN`u/ξ`|JN]ZdbxCbtRNS>* 3 OA*lK?=J8_q(,WJµŹh\_ܵIcɮxtmZ+IDATx{PSW/(:@x  ped nus ã"T^)!&JE^<EEjΞ{97Ns?n2ܓsw~ɀa femկ_''ٖmn6ylZFSEr/*^6~""TDb.Ѣag P ̴4L,0Lquum Х:k#P L𷴙B7r-?ŃO|ZlD"s" ]u>E0zi,=p9YX܏*goirC6պ,-O)O  r=vCZEt!a1ðTA"QHM]$;so/sAKl~EFm!{ts[Z@T(+fg-|thZ 4;9G^:Fm6XAԓ"Ht3RTwEK>vVsrR}4LOF7LOOGGOOjFz ͙p,` ioT٠Xxa})?Ԛa|Ksɓ8yrgxQ Hޞ٢Za r|BK`zeOGiɪdhhD{ akIcD\yaOQx(|K7BFIr^EHHp.vavVXtOy &3 wv4eŲJl(ÓcKloWJGT4 W?B|sph -9҆2U^yd)«[E###"\ ~rRX ZOx %IR|5 nU+B,w,S[p .-hvTbc,PC8h 7*Wu8VDp^pF79##o JSZjAb4|wT𝤸ؕoESyֿ^DhήZj٘!?aOIX{CTr*ıw%#4\&L2Rm,MM*$h49Iw,=ӠP3']3;86r??9V Xx΢QL_~} DoAal ,7l> [Ӓew՜:Sb|ׁ٫2RDf+(g(Õ3:pU]9jR;a5n7gdZdJWu`ݎehoddFI>y⫾骕̒EK[^3q'I[1lo˶{c/ qf!HАeiiI>=7@}'W}Hů 475VP1x^KB֮Ȑe#&lR݅+K;ˎH]6ǙE|j[hf-5a>:c{邏?}lY`%4U,^9xHҐ*]kt K4}{ࠥazz4j7Yz ;C+ScȲԕЏŃ򳩉 qˠ 5D5+ Qh;iG+D1()ɄhpͨCȾ}GQl♱&4?b9Q ]2c'b\@E$H׳ţG%eDvpi ؽOO: :ف:@F@` iqA/ U= {P>?tv͚#k(HK<;]Cpd>-qomAZHO##q >6UPw' OI6 X4qHvG1f @`Zj`|jgZ@!wcDA,Ǫn, ؊CklZF8ngպuȇxY`B C`ŗC # Y/A|nƾC. ;#%}ьRrGsy]\g#=x1E`/Rzߋ*pIc =`ESF!*QALc-#܉.4s[/eƴ'%( 'uF^Ƀвͤ(CQ6@̨-%T 7jKU  $~<>cIP`Ef⨡mVHW]yn8#zK6|-TT,k$ n ))&ܯԥ!AD822M`6q=7:Su CimAƠiS)rfPY2pM裝XbI(0B5D D+V4y05nLLAk@5HMc֠' 󣘃e{K>^[Vzi4FdG7=f1#i^se*c-u]yVLrzAKvkHnp {|͏ Ns0 'iaqZhyq鄡:hԼRrfk6( 0!לi !9%,Va0بS.jt ; Cؾ5bov B~41PQ]Ҟ\~ikHlc+C!<[`& 0@g00Ά1׮VS糜ROIBq <)? ?VQ5 ht0l6h1Ppn9C''sp:{vy`0 $BR:d`Ϛ&#:'޽jF+ 3ȏ|/"q$= i=G0xN9gUaY8=`ck770Wf\`P w<U!ˠ@衎B*Ո$QP_+l IdJ!!PQ(äFCH4ΔLdޔKzA( 7?(ťON_ )/gYw~?Wʷ|km*q6@ua0j$9G)9,}u;?L'k%B֓Δ>~vz R)pJR+튬 J$rJEVNo"7Z ֛!.J)̿ÇR )q=(ix8|1hvQfb:+t R~mûN]29?uB1>^]}:l2H6&ON^y |1r?{7EHpPx{^{^{ׯV: IENDB`PKZ) 7Iimages/wordpress-logo.svgnu[PKZi:images/media-button-music.gifnu[GIF89a ꗗyyyʁYYY憆π!, @K'~vm (hߖm5T,9!N\8灀 4B,怡֋1yDN"Cb;PKZSimages/stars.pngnu[PNG  IHDR%m;cIDATxݔMLAUH*B(/H4Qŏу1rcAPF|U !Fi->ŪBQ閶v|n99?/y2[`}T:KUvX׎̓Vtl4h!@6埡I7emҠ!& !TAG>qvBX|=]|Y\(^N ᡦ#^gTr3rbk4qFT0 MT7W Be)YhN"uvbCy(~\|XD_ݕKS"P˛Xgy<&=P3T.'a7u"C(9V;Ǥ6k-j=~nexBJײgm~zQ{OרIENDB`PKZF Simages/media-button-image.gifnu[GIF87a www|||qqqϪƶkkk, @M`%$LhA(P,ǯ(x~_B) `l.EcJFEcf+A.łBdn  !;PKZHimages/media-button-video.gifnu[GIF87a qqqwww|||~~~kkk, @:IgiaqX1 &!id" ڜΣbH,*L@l!AA;PKZPqimages/align-left-2x.pngnu[PNG  IHDR,*X4 PLTEN!寯 Z>IDATWc`XC{,dU`c66zbd#Ct6`46vbJg+Zn>IENDB`PKZimages/freedom-2.svgnu[PKZaxx images/se.pngnu[PNG  IHDR ?PLTEě:tRNS@f IDATxڅ1 @O;D8Xb !sIENDB`PKZVo77images/sort.gifnu[GIF89a#-0!,@axVR22 ;PKZ6images/xit.gifnu[GIF89a ! , @bRG"BdHCa L0P`vOBL N11G`-<):CvD=[B;"(}oNOK|}m`YHg 8CuչrMH os]Xew_|ecnCEOѭ|X;});8*Ձa+x)+1zl,IT')X!TNʷ>lB3~ƤS\IlkE^Mog7k뛫d|ZvӃ>nsMуv{0nW\7 CFL?x\GDB-c`Hg_s=JfްW4|6 kcrț[/gG/(Dˢ77 zVbxEN~7) p_cpGR|.8d`&db*eri"fzk 1zd]#7eYUwό/IENDB`PKZ]rrimages/comment-grey-bubble.pngnu[PNG  IHDR lΤPLTEFFFrrrMtRNS@fIDATcOd ddf]AIENDB`PKZ% images/generic.pngnu[PNG  IHDRaIDATxڍSmHSaiQE_aR(ːB"AY(B`aVҒ$qMmlDjz;k{(M}9<9O&*폠CIwIh\"K#mPo] U*YE>;n6bZxQ٨ (}z030<٦|NN~R 丢LN }vvOߘV7!fݐ/ne)GQu5| ǽJ36$>C=7(!QQ/g}N[LmqrrÌ@m+ҥ{HnFr^w``vbp<*+t|AafޘB&SB>W!$6z.kR5I hu}G>?r $.7I〉>xԤQț(UTG =) &)?l$'qSZKTI^ k@  @>@҃О ޫ !2dbDb#V ;Rҵ5*䣇${ bcCA_=t 4#jP0qӅmppUI - KȰa O'H;IţJWb B<| z&s-nbPU)Q\Ç#+uddwE8-Fb:tBXXI~o9SEcT e0RdF'*5lb| $A DD)GXtкMQS-GuUr?(;PKZ;}DD$$images/contribute-code.svgnu[ PKZ}jimages/align-right.pngnu[PNG  IHDRo?IDAT(ϕRJQݟ"2vT?DHGDQ2ޝض evιgFqp<7"{8?I:4$$!!a)~^~G点RE]ZiwjhgaX'EwzmHvӹ?֣ #lL]ƵJL-jEԢjcW@Bۆ(}9pcz-'ի_*E5K_+_#U*{rT*dYhMeX -ޘs} W[`ip>!л{)P;v-c ]k }ll|p3 H@@P8/$\~Œ>y"f38?`-7STL&4ۄn˽N&,aӑ83cNyH`!hEբKd?]1w=p |Y/`To IENDB`PKZimages/align-center-2x.pngnu[PNG  IHDR*'Fds PLTEN!寯 ZBIDATWc` B ͵jj ƭlt6UlΦz\U0pGH@IENDB`PKZ}images/resize-2x.gifnu[GIF89aڳ!,@\x-9XL8԰|9&%_Hzh}^ddn[_穑R#i(MȔ04ׯv׋o3>;PKZmIZGGimages/icons32-vs.pngnu[PNG  IHDR-PLTELiqG;v{R(c:lFGLQOJFwVLJMKLKIKHKKK`IJMR LQM]D dMKJLRE8iSuHf1[sD~y3`yt4e3_xj6d~ٟmswa)LapD~9jԝ(Ka_ԜӜ =MMVq^L\E䙽Ӫڒе߫ەlؼ⎷OٴdF脱nrûWyTIܤئٔъuj푹agꆲ˻}|xHGoJC{?t;l>r]ݚ7jtRNSJ )B=P gܾY#r3UG"ݚ{*:+ֈ42m_l:a}DwJޣ#MKLMҨGO$}t᝽f:|GtIDATxXGp\9K{رۉs^K${[i$**HBBeBBBA`D7nz71NJ`#kߧ0KVE2$H"$H"$H"$?6\bsqH_,/Z5@;ҽQw)?]ZyhY R|M( Gl^Q_/pv*/[gIzf/w7Gejͮ]kV-=J=DKZt#ȢˋcE8= 0/<,D1_i,.!ο z?LwW*K T.σAuS fw8h/MKM=te O.լ\_x$~%GrdXoM|B!H r9%r^oA2LdFiji/D}Pʪ/"MdeeM,WtW\jQH6@"_K_3ϲVAyd=bGtkv }[覫곘afkɌ~Q߰=L1v k/t*) WzNNY})0F M|$3fC~1|Bsae ЭFP/9}2t;[R+-xH_V˂yThR!f"dCѯjCUsc$NyG4cGGcy8U[ÉQC%8Ye&Մ\NTIۡߘ~nh(le+o{'jѯS;Ee 0VakGx(ʫM*e"]MFFTNSrJJp**lh<ˑ e7i1BA_ˆ}Mo.OƧA/1 8M2I 610Ϸ'/ԸEBd GXP$rx@f텡ց|64dY~^5KPɓ 'm>d2 jD<#9ۄw^)n9)'p[ # DJ[T^^^NiEgJo%_T=i Z|#.mdwX/@h멸\Ԇ[D-U3W0`^!mO)'z)* UmЬ.<ЕQ(غFj4uO^z RЫZ yכ,bYqSgi<EׄW"M4RY_d}ͦt2K-DH_L8 c[ eLxcᤌe֬ݚv)+Z#FϨowbåc,\EDTm HKTҫ^[~tdWBqrFH6o;OZgΞ<}f$>}С.(wmP4ib1YQ9OYPɱ_HZc1"rDVtNrXc 4r:(k8 (apy)xjQUa q1@xP*_5ӣ7=F6*7 }e%t(VyWp:L`-sL&bl: YᒧJCA5UTMc/0l;P8ͱ&؉K2 s^_wٓC] =~|TCɳCCY=3@; A}TTN }ؼ55FP0#Hc DvBJw9><22Z: Cgk&LR+$@0!NkB- )ّ1Fi"gǰ9^z# ԐeU'UDenRԢf].SضkyS ?YQd_!لD(lEy}PUwg'o?qPmhk.:=HU3S,B4o}\IW0-u(u%._nx>s vM>zy#晅Fiȋ cz( t9,G.  N&"Ү lkGΈbgB95J*B^ϪDΞ.á!#LT y%`핣LLXR,<;hPSa=a-6OA JP hb2|;>j>$9yIކ;VoLCoj0h)EL'Mb{N7gJŅ".yI2 lrѨOTv|E o'EL>D%GO;L'Sl+eCߚoQp>mÁC/b7ghQaS"AY##e(uX^Ar{=_Ͽ3.żjN># ?׍O>=$UZ-D_T=_6 dhw՝޴v=W0w̔"K>Z{ gt l½PMn.F ?冓^0ٹm\Tj𒊈yq`iPD2SjH8 Ve!ۇLJ1j S%@̨V1K9V-6ժn] _.=NEK#cBe8LETעMcBW[WzYl`YB+D)A]ZTWש Kku!л  s\4 FM3WqM`p͛n~EzjW?7zfnHHmiw s4zpNQ:fcWdwK U-l?/WN6ߟ|})B_ UV6]lb9#[Tޱк,.,U98Dᘫn>wh 5=sOzQ$kQ,겏,Y2P7t}QlFfяTOCx]zzlHlcj=y5CoQ'V!5Fcmh qQzJu@|*4CBTOT Qxf[XA}9\E@zLQ_fСڋ^ jo.vds ) Tڶ{c9{LA\.5g7ԜGGvw x|^FP\~SCR@PMw޴=<O4yf^u(;y /Ѡ=SA`TL?XzP׳X6*@o4-)O2p}-Z4j^Z6W6WWRv`#F^쨾 3?khj \`phaѡ/H4bjA $<*wϟ;gF|iJ4C(^(nmjMd8K;nXjCE~Ǥ{zj '|MާTң+]TY+apRT>z&j?fsn_U+q0@uV&m5fo듆 ]SMM|4p bȒOɟE! '?(S[hv88->-cw r>7d-5R%=[QPParU(2Ρք'ANNf#<#/O^roG.\^Geqg䰭V\%*#3+z %NpE%8PtT_adiQJ(#vvg|Bi :8/\ DGz[AwoSwW)oz7 C,GO iPEG*DI-c^G`.m}ռS=zofq"|RJd|>Ⓧ\NWyFPȖEoSVңG%*lffexc=8i$(N_KnmfP̘MιJgPsmZ6cjJ"hy~lZČ[ =#LԩNMmhTW?4h™Rd BH^ l|{pn^d* R^tG-5Mt 5Ojz,n4U8G+އң_≭תWe(4v.zC'ffVRu ٘$~>͸,uHnm>=1u O2Swee\UznfzD!碠Zkٰg@}Ko38hވ¡br)zp64}髊|ҸVSq{<_JG<5汋NDLr/ H' F+^)1mGO%֙ᏘOQV @jo7M= g~r9 [ңOpZ[8'f{ /|SSS?>poZ7uqHG_cAe; (Yh-a<ƫBxb"=zNtL= }`"7)[i|p7^=I=32܃AXJ6J!wF>@rՐ*-[=|)j|mwOhuM$SS7\̷@  BFѿA>8r C0}OX\jח0jFB֋t,zm^A^ϳfGfVf먠UZ2zڤ=.T𥒕T0?Fy WGn054uӧ΂†E *砟J4 ,PQL&#bD3qTz*wwT"?~ \@<1aV\bOI9C~wWS}YUEw+H^ VLJ5B)Ң_k}xy)xDƼ{^ν:?57"B*KW֥~ycH9Z\8OrxPz<CQ 4v/_pE:bH}S1:mmvM}?ߊ^po}\s ]0Fͩ+'D2UaE2E#nUX uo~.Qb7WO J1x# {3Q+/wy0~f4FK J؉ 0c?VF)ңrO}$2V Nu5gXvzbVnD3z2B,C.poMHe>F&;Em#22h>%M=M,&Ysy?=:maGq7s;ESvD:/ r))\B]P 9s7ۼY7^1ak.ǕLXx}F]`2nYОSEAbf+5057,aF`,;80XO.ܿ{_o޼nݶW۹XɃ/}>-O?dɑ/ݓUsO8E3s>mg 2yF 4,fHj`#Uc_/*_7۷ymwz-%6"`"Ae-t# T?qoA,qaPoܾ {c32mZ~Ϟ{|Ş?cݹwAn˓K϶> xNU'ƯJW!lQ莄DI$DI$DI$DI$=[IENDB`PKZ̨images/bubble_bg-2x.gifnu[GIF89a$Z0'Hb%]ャpv̿ۨ!,$@I8ͻ`xdi6Xip,Bm߉| @,spl:Шt@Mάf\/kohmm3,|Q2wSP0T] ^.ꞕ>]@$< H U7\ 8Ɓ5_ذFU Iɓ(;2"z |ra"; $hʣH*]mZNJ1Ϧ@d5tm*5.r;PKZt  images/dashboard-background.svgnu[ PKZQmmimages/post-formats.pngnu[PNG  IHDR0!9h4IDAThklOժ4@ 8]6@JQy-Ajf|]EDmS&WMNCHر]{?ⵝήw T֝4s{=sfYXvഖ5D9W:2w4@|a$Q} pv}@7Q ~G^9 4+:\ ŇtASX?gt܃}`[ G-Xû! GJ! +dFx$X AkYdYWkfȦ6En:FEPΓɧ} !fp9zMM즧Hg`~褓&裏:l&`N06660N(YCCm@ʧ.ifNm rL9يُȦ̒e Q_}ƤѢ\c5l,1vҋdH #fz1b$hX ϐ&Ë/5b%}p1f2+F1e((?7 e߷SObHz`cfkOպE@pI?HY ~DYK9CD!2e:VQ WCcޠk+Đil|+ 1@fUM,0BҕI1/jW8ݍqθFka<L1QVSy%Kd,d*w]r*Y(sj]T@/ֽzbD9c9G (1ib&FI7 {iZ%&ĉӅNvjHoЈ6ty(k4cۍG]44=e?D=ɑ&E4IR=^qhѢӟѢx4nNPP]XOv uzxOV3Cu79GΓ9r|Y. 2G$˥y9W>uQJ]"#Jе:ylOu褮uH2jqrDHg99:z&H,:[ <*NqUkHg须D=!"Q&颇I_ t2:mQtR//TLBetD~\'~b& Gtnu{)ۃnm3,|UxQw^‹WXQ.7jG*r#Dif;[v'9TmQv&0YĈ~#ql`'i}NEXY"8Ҍ&9:hfG1u7Hu\wCdq"5 Dfr\! ::Nr\ uQ;@][[TZ== 2:U_> jk uﳈEQ/wb,#FeTD]Pb?8_uIEΐ #-|CETMEԱ㜠%Q܇L0ԓ%ARծFՐ;Q壳vv~oyw-n`_d U`MfLs~\T|8R4thίO2`n,"[y#<fH%f]1dŘE?=4ƖǷ3R|V.DiUS2k}[1a$M\{7pݹcfƌ D.vHnh%H Yo!Ŋ1ҙ"fz̺%F̤̔iBASfm)P[le1Z݉Qt 6t쎶y[r(B+52G.Υ IENDB`PKZ9simages/freedom-1.svgnu[PKZSimages/privacy.svgnu[PKZy""images/align-center.pngnu[PNG  IHDR8<IDAT(RNAKhH eKD>Hmw4MvAJ_uݙ˙֏&wf{!D3FW78%;J! gcxTwFwk떌W^!߶V.~ H_ ? 꿆ʢ0 Պrh*q\:>ƷŽG$~ *IDATxiXN7 @A}ݺU2Ʉ6) !HvM / ԭZ}pd3̐Ac03g1=?SN=+rAp}9r 7!Æ6y2d[8| 񌀑gwPܹ[-z|gO[UZun˞= 4dAIXo vcG#N9S'Ag Y^&n -|ש _&\BKAK}}p;U'@'g@0 F,{O9m*`4 0SvlBjIRn[wގݖT`K Fqv4נJа#mA+ WRZ ÿ Gnܸq0PfrӧfZw~j`ȝI AD-׌S_r۠q*.{Ba~~2 w&2>׸T@HHM5BHMH+Ʈgŕ89SlB+E0нD+*UYd(Ԟ;jAD|p auN3ֱx SSB,P?9Yu@ #U'Po,R_ Wy%])J7~ "A_]גl{`OiqFqi?a뇪c'q@蛀'U RuڵC;[I} ;F*-/7МH /SAA]RhPn ^1LHK J{_ 5AnɃP[12@º l] ^5CH$3W1J ̞}ÎMxZs JŬ ɀRwG`Vj(l!b o悤_no0_B8tb#}|Pt]ss !feGss]txw?f1KVE,^ d 6 BrUߝ 1%H2zuHEL1An^nb\R Ф+Wbf@f|-9p6R艣:;o_KW|  *ضݍW^yz ўy-w3(6s) ӕv&FX;_JOkb6U&CX}e:YSLW]֧?S+bE͈Vs B0ޫnËb\iyy<)(,$+6Z|ЕFܥ֌"ˣZ5Hy^Y0b"JG PȊ@ t#壨E)B{p:JI^ջB}\o"a1 WZ M2\i|9 tH2|zlΔx*j`jSbJGr(tgPn!Bz/ˠ!lr*YTBg}TS|}QST>|ɟg7mM>ܸ4݆{TǦW 6>*P :݁V%0O4KTeSLY&qUaa#lnՓm]iJ+td>Z2g&11Q.#hs%E5}²頁 ` FlE֕ E9WSRR|E<B?@ABCDEFGHIJKLMNOPQRSVWXYZ[\]^`abcdfghmopqstuwxyz{|}~%IDATC7qG$6Qs>Ŋ91DI3Y˵dkltZcSуQ. fO6|8iN%9q>1hZںŵ[t W?sulqʲ=J^J [R2Oqi}Ɣ,YԺ÷:,EkAkRxˮl9EK'CYtOڜckqyQ2trqMj*;-kңuGvc˚QVuq܋43U>hEDBo|0`NO%!rL^=ڕE qem2?qO"FV?qEauCcqj ; @eꦧӁj rZCA_Y ytG[ҁ>u߁g@6ʠmu7cdNm15C#\󅺭1?љ3Vݷd$st7{} HV9c1P-z싈 T T5eaT-F<&/ oF9 PT2pWAl>RmSGNslG4/8RI֑ϰ[=O}WkZ%ɵf-n"'Jv'Fvu8N%m {H(NRJ)q*B:l|b^W( cR~%ո6jqY/dLEs0+ \xmfj0[zH)ڮ$0vQZ?9#;qU1&pFyi:z(mS8N5* 9P"WH)EɶcF$2MU0J%J1IUJ;s\Jq+Fn-xHKY}++qmQlt5i(\+81WΑ38V dyn(G?qw+a\DwxƃJ W$e%AZfv'FRD1*l(=Y 0[*\?$>^Yʁf4Z0TjԡYfBGb9W*a7{^Y/V\ԡ$\+d_0\ !$LV)e,+@Ʃ1fȕe c&G؋kz(1r X 1XkYVc0AǁݲBq1`̐c 1`JπI2z0vV%mBrLaAy1 Ke7 P#PYk1ߪyèrLU@2ec**FfDqm9k9fUdF21~%mYՊ{B3^*amW\6Y*1Q=9VbFcJ5ȌH d: k4P-c BP+jsH 2pz`YFv)v9ŸGZv>|'c#e܂U@Fs/ ٖcc98B\}L?aUv5=WC^m=դ)r#-@:Q&VL/rc*o!mpdL= l]{d!2R»=gTF3"!YWd{0U _SBY:~R܀ZqMSC',` %|sx{VRSUeF08F+a[q/k4߇;u2GN.yUq&OIjHÒ_mA.(ؤYMncfcPHo" :ⲗ 'l,?$n^ rQytS=ꈺxŧq?.!9 WY[/.m clCjel6֫p2pQ/lcJtGyb/ƕ>;KJ~0.-itOV褴<%5KH  239927Xo14/- A?FIVZ RWos%)<6N^K]  # #()@KNZnitzUtRNS "*/58:=AgibIDATc`x!47?fq(. Fڄ~Uڮxʶv¬LYRrG|W)"^j0{<܅WP3\ԍ|\F` OH'f "Aݒ۰V =IQi-1԰B h*IENDB`PKZ[w}G images/freedom-4.svgnu[PKZӷ(!images/comment-grey-bubble-2x.pngnu[PNG  IHDRY PLTEsssrrrqqq77tRNS@fIDATEmBAD!dG:yrGc PU7h3^_>+ʣX` j;5IZnE*&KLlS>˽C(%1{Y9s 2{C4R 2xjcOF'cx=^/j_oYo'WO}pǣ^~Nv,#IENDB`PKZ )ggimages/wordpress-logo-white.svgnu[PKZ|6himages/date-button-2x.gifnu[GIF89a! avvvmmmZZZsssqqqnnn[[[eeejjj搐```䶶XXXaaaUUUkkkDDDpppccc___fffrrr㱱hhhYYY^^^iiilllddd]]]oooQQQRRR٭\\\!a,! @a a  ,060,MI!""!!IM?IK&!+I II? % W % ͈IIPI#II IPI H$ ڀ :0L*NdE2n1R( ɲ%K%THҠIa͜]xl" I*T g'`TI rD =JbKT$q@H$CΜxsB$SLÆV@ t;\$2hPx9 -8^퀴iԪE$H$b̈a$SHܺy>+RE ʙgp n9\jo'IG@^˟ I(xbժ &_ PEA}2 /$Q"}O4p(`Z j">$atЁ=i؁IU^@ ; 0A !L$0Vb L E7ܰ Î&@!R$"exPٞ| ;PKZimages/about-release-badge.svgnu[ PKZ0EEimages/contribute-main.svgnu[ PKZnimages/browser-rtl.pngnu[PNG  IHDRl,QoIDATx콉e]&_03=11CCb- lc0`M"fccU-}ec#[/xd={޷T}&%{U.I%{d뼈޽ɓ'~<߷9Ne*STǟWx.}߶qa2Le*{SŪ,qmm =eyE]GvDq*ST)m7x߿O=Le*Os뎠 2L廠'T2BnfT2<ST2T2LeLe*S{*ST캮ǩLe*SӻL=Le*`Oe*ST&T2g*`WU5Ne*STeLe*S{*ST2T25W^9^wuW1˲1U< GGo?;4z4ݡG7GÇxf{sY?hp<0Wy!_&==ſc}8uo:7ubngÏkpMw9ʣڳyc}<<b}n֡UWؖGI?kjtPjyΣ6JǸ_RWz|ߪq>quq9axw\px嗏>=Tv>nlIJ6o^[ۈm3qDzߛLmmkox&W}:o x=zukm]osaY?Mcm}n]m@87'j'ۈs6ڽ{\=x yk|\3umshyC}v_o~&c}W߯uM=uݿ7>=?^k>ۆnG(X7j<"[wZ<>~6xL[>XZ x^l[[xW`Duur˵q$/ka w&Xu-,c,q﨣e=Ķ|cݨ5Yo>go|p̞-~w<<,;gcbʼnvm@};HL8QmHx̀ 08?t&L^ d(ZE,“/Mx\0-&n'1f=Ƕ_ć`zw) 0p-ASW|vw6^c6>\ Vhڀ>zwA'w|?qo%. hscq 3 kˍ _Šif о7wy__\8og?}|r\_`qUw sNVnGNq%qegXs /  8i0Y=n P ҢOzǿp`'&Vl&07A#}L# f{;1N`5ZsvuaxgԂu08cE;jV l2x̮_4ph"  %BX|F h\n7w'le\T<V@ͅs|߃ m[&?лaA׾{+}3Kd:~nsp3~i/78x 98wSyώ/׼rO81 XsO$D`x4YjZט|`L]Jnh{N\B/8"xM}M&\L<{K8 dN6'2Xtޓ:`UXLH4b KBo= ZUv^}G)dp;,1u: {A3]Pm^p-j.KOYcI0"prZ\(h!,4  \O쏅Y,$z>Hʹ0z#Z8p|vSnޟ=fYw<\Ա[qq3_#(ۀ\Ա[{|ѩ_>_k.ہ;sQx4Q8إQ[䵤ΡyL$6KV$HPKƉB9D&A* 4~XidЭXLޒUo@[^BC&C[d~KX. &5=`N{l@#)0ͩw3ضA V$ ۅfKIdzⳔ$z.\h ZHd"X!9Z:Brt=~A:12D˵^7~K_~#ӥC}s{ln:P׎g #zGT#??X׎udkHWU\v6.JS}Ɋ,i ۑ50y$N :!)ʼnK)ҲH@`EۓU.& 1[JtgJ 0G^kQE'v6I%0ә9duxx.v!CYtmR-x3FPod p[{i+le1~iDzMt&Y cc6@]sk7ҙ`}4PXB;ַFg"wu~yԅ:wtk*ڨ u[n>Yző@;:Q6%pX*TLN4 əZI N0♻tU/4 y.r^ r*4L?NȅµU]mrwi./|?F(4y6֬\`Pr ԎuAS p_F' d iRڲ}x:ke+6ʀZs(2pCHr2p&t{V<=Gb<8k~q>{}ap"iS+`x^xACJC.傚/cy 0*Her rQ11qA}JCV]4to)f H'wT$U 7Y)[,gj>lmMVcٮbh6l%h F՘IbQG{Ormeo_5LAvޫ _xc`֏f٨uhWSz;X'> ۥX'>>|銳ή Xvus^e&[z )ȚzHse8]x[g*كQ E3zP`F-HZ ɹ&Vˤ g(0dk 8A/Vث4W9KK f-"/]d1c)=;KeNRv 㖝ce}0_XWRE;^%EpV0VY;eaeNr,qQtO0M AZN';``o8|>_LJzj k0G`?}`N}C"aV;[v'>d-2;Q`fR9hogٱNԽHVa[^toNNE/9 )f`/i(Z%\Y'ِ2f9_&K2`gS dI]*;g&).3.X75`&tq``^P*`]`aHH!YVvstwF.;'u ĈA 0ދ?sS϶|K ^c5`?qV67/`ee%`#ًG8Oc]uhB؏G;hBv1{waۜu6;X\=17[>Or2a /K8 ,W:R -\:!/JVQ@ni9mH)J+W GidPy$^2b.9)9xўSGا}wo|cLLdmno{S;;k*ClPD"&KЌ14(֫x_q* O=UfRx`l}@@#3]:J K 7-R0FCb̌hQ26zz3"l vh[:X JU'@R7 Rb, ::a;Z-.lr)Yɉ.r v@F}HWּ%8p a.:8G]cc`ٓCЮ}.F 3~2؆{#"i Bbl@=~( [@;EP&'oy`!‹>?q׀QDƳ>{W}2ևO鮅moPn=w%Ҧj5 G 0AI c&J @ x2 h`v@ G#1)[Z獗Qҙ;2,PyX A5 ZK mFRfBC}?.{d 2Y]p ԛ`6X%,R;ʽy%'  pn~"=D[o $*S1qh!]/eaDAU'g2"8ўk'0rk]ip@lWٵ}{kv-quhxî%Π]l&FޑM;4{];vg &>&v`\'Fh|n;fvҀ6% d@E&YҠ#2:VeD7Aʂ d WvqrBP]8y;m$5Ȫ0ˤtKH"P_X@ z. Xx>F vInA󖟓Y_zmJ:78DVβ Sc{;X.W`t~Eٞ,n h}/P{w׾,׿OMG;ƫ^swOMGW {еlz^,T[},Zu v{)͡uX[pؚordź7T;x{M' mCXaOi`4 :mKxd'.I\ap%`{ϒ6ꠔw:]yȲ9)3^HY,Z9~F6mUکߵaRZG|~-,jN}ҙujHDv8?8{ ^>;`\vJILd/ uT;ܱ> u3^"2ew#hT9jRof,A ѡ&'Tk3zAPـ9t/(\x.8%3wFa?0ɣCOّu+> !Tʽ5 ` [$g`4O'0 \n:O{(Sѷ:씋|t֓D餳3_|Ҷp'Hޠw#NNJ_$]x1_mF ɚrA2-A/ >xkYx̌ 6Y-ͥB Ӝ2cHҔFhPYϽ)~}Z(`1PnvKFVlARz=q癎'8 Od8)EIDAIio֍놠%R뷨CNbXᘢZuaCIYd/̰W@4u2ѡc2zqIY֩k]AO4wbMx'>ꫯ^EeCN,}?^+p6t'~Eݾ?z N}ү98d=ga+tb+Œ@=-B}2;L/i觵*9{j ^C2{׽~fwȈF }/w1⍋'uX3o3cOAOYn9Cw`GZcyO (X )ĬRMKmzh }㡗Pà(!`>/7P$ haPy^QHiA;qNGbm(J*Rکe;̲C az CA~k$]xVD\hq:3c:[o]im/~o~/Y+ gUkd|Y}Y7>w8fu׍{ǃox>9,`g;mS "8Y-XwzްJ֦l=RrH ke vc0:.d2%`#w~Y#*i`wyC~N=.Z-З;i KfovI0xQ>xB%֎|u=oDW6]z2H"s$%;$;څӨĕ2H;g4TcΒ&Ӛrh~pߌ>ݝ*X=DvhE9~+K.dŲK#SNI"Am bPytfcb`\x(&,*m]&}↉6)0~4>b+Z }^N>lE0McDg4iVZd7dHM;[lIqkg(Y$^na;GK72mP~!sGۯ2A31(Z ۣ":(͠= #y8RՆM!{ՏgG1֊di(fgy##?{GDL2]lLYxB%%ets Fac̤o5<JFFNELJRs =;MF5d-! 4v^:f"WF94C;[.(}R PCoEl VKgu3 F%-fY^σBgs%Do(H&IimZv:UQoPǦt-|>pϝX|(D3nC>8s {ڸ\n/~GhhOe9Xfop ~ݔYYkA@=W!ۢ6,?}k;Gɭ ,JuC煥!mBS>h.p:~[bKŦ!qaJ0mܪh_R;M.I2?޻}BXhȦ| s:_!xj,^ C/:JœQMtv-o yh?[MZav|u+AG0CqPއ8N|;fuB #*T D,h9Bs4A0Rd}}p|"5 f3- 5bqdfC MЮuͧ4u [J'UL7m@gFJp*7%ß^so`O}ڴfsX~ hb]Ɂ{{(5VH7^fǶYo}<]!V  `ŲYIdQ6x#,Wu9݈;4c=g;<66'9|dوˆ42TvCJ]ɝڕZ0N߷  ̰FZv#0I%:Kw `3'mջw+6&O3,N@*Cc6Kvahw# Q+ۮ:4l2i:ZHc|[1xHO4a8>xwSNiA@%0up @ꗫЄV`Y4ԯi^zc gCou^;i s뜉  (`a3]u X$۠2ᤕ&Ȉ&v[ۖM5 nѯEU8l3A{w3LM/}Z8")ө$JSbi5'2 EK(&_Ś8{Ώ#8u7wvxwuJ˞XTvkLڑ(jFT,뱯cq4Enj2+]k};[1N9bܱԽ A&Ɋj^ ٢"L~;L0zbPu\ױuڷZR 6&?Q~ckzO%VnW]D,ĺ6#lLmϠS@}>%;qC,}4:VNWoZ/5맃8(ϩb3QRZ ,=ԍk!"bM))xo }uu㼹XԮ#_@0f_:b%Լ&c vR6Aoc9`8BxW>_Ի]˞f*;؎p86d'.ΐkx<㏃OiFZ L4/-&Lo@6 ]+>W^ctVX '&.ň7ZtQu,`"&:,@[ZPoiu~o wzfh@}~Hԥ8aq"![7|PkĂ&_ډaEiO֞N7+۲v(b=qߝ.zn}q.#zh|7~O-;I#LeG{I60ZN0.S*dg/o9;Vʝ͆s]G 9NSD-Բ()#b5@;3t&pҢu>e"ȤNr=-N@*dk~wN(j+监S0;SD o Y6l:ydE0crFZbojg5`8Z-E,}xUWQ~xXLDv 8%.)@;4\I8V+EI#f]-HPhhvҼ_ %uNY7;2Azov5vC`"Q_j͜Cp,3dt 4Wa(dQ_؞'x+"БY9oFcd=K^؈֒FE'@ZڐO@**ZVNa ~9V)c5+ڝ|#@6F KS9Y 4*?6x'.)bd쩜8`f"Z'#@ʂ%[kI^u2E$d#!㬭j3yŀRv:6!#k 4&2ScyvN1*;9]r8V 6Z1TanGf C!r%5. :z1`d=T~^ԯ;qZrXjr#@#7)< I-t@w$_kGl7^g{n6lTd$Z`'H: bf12@ f{)%Zsb3-'pI] <`ꯜֹhEITacp&_^lK2240(d+eރEQ*= Mβ)eb2VuI Wڲ&s r@lgɧɁI_ⳲWD@L׶ AY9c7lVK/qĒFZYv"KGwhlɐ*Wr d@LJ5a!*RVJl6W,儣Vmq+kU8G2Nw|`ܷo_{|6I4I 4@iy\e% ͗ 6tAmA2tGSޯ',+F!od\ ЧmN=Ys-0B#^g0}yL<yԖi=8c_.ÇFdL[5~lx_ߌdVⳍf;&ӹZ:os}cŲ>vl8f3vmdmkg^9_߭7\Kv-*/vmx=Ի66Ss5ՃmM~uU}\666 8wmu5?~k] FQQSqCߠ7lwoPӛM=mt؆Vovi[+Żիξ[hz {m-xl{ Un\m<×buu/4x|Cz[u~%1x_ۺ/YowDv~v}?xC 0B 5WIAf hݑYՊܨ9hk330 Mh"7dIm`)Ȯhךe\8*h#eJNQ+h(lI>4+( b`Y[ Z NȦ`CD]2yWlC!81ckh6RϭLc\<BhaY0HE{ `ւ`D]$ .*f 5/Mc&<Goq@Y\~>], ?|~^?gq3o܋zߪzGVǩ}ƻ{ҋKbg킡cZ19vA3N۬  *8qیrbK\v!ՍCȶdj.jdKd%10fUQ7 dUJ\9YhVȅX։yLI:}V؄v@ꘐG/6i4yk~GPT4VzۂB zmg0dz,_ҸW~J;'魅IGl,62 Ï<<^/\Eɚ70x*:B)rU8,+5fKu.gt@?k;:uj36嵙 V!,'ۈ(K95[Qh|=Px/L<x¤䩬-fYShKj9'Y^']2 8\[ + \A iy%'+mmr<Ϩ`EsZ"4Cs.\s;!bT\%a^:X+ѢD6[x䀫mr־v{) qmMeҽKi,,'}U`XI4'bdU-sZn9Okdޅ"6F2Ge+S/Wl3+sސm '`,ԕR4N8u1z2L2i/Q! 1!VQ%B&('%—EDR!jbkM )5q+Q=.sǵ ՄS`m5_(+@Sڱ Qlr'o^jys0+ 1쪬Vqυ-H׍y:*r3#lgYMsrtG?):,QRV *Ei(1b8:yhg/r؂1P Xi`ԅ6NBYi o_aV[ W&~N8f÷ĺj$(|Hk5eN0#3c*dz97 Jf8y#th}"R,1hVYGJE}@礤ј~9MZtegva^9:1\/AsyUZw&][`rrXL^ņ!KaG'oM K.d '[f s62Z -2Ot{siuy) )Iv l8Rx3F=yܻrElG&/sT-6INL/51A7tU/i8b?d,s/VJ}ߣZ.RL.Ӝۄ2[,7J.pXiq43.^J,a !%7Q4`(L`;9`0 OX<Ymo{. YN9 w&30^f~!Lq DxN08N2r\H[grj_<W/1 KO"'ugM']f=5X[pLh Xx$\ ϶1vTgҥ B8:Yhg"`_z_Ȑ VEf}z3MRsB>B`n`2Un &<a&C180@/2}!2G+3ĔPUfG_I[uebhĜ Xm8FRX.|5CYP,NX'D."JJҗ'OB` cH;4J%ڶbS(7&blR&{\S} `x?iq43aCNi*QSÄ`\p&s69lf&reqޡ.+YUh2 hyۛyUJy[^POJfV0ŌjV(,fn>ŬLSA)ƪb9Ĥxs^' as2_+1N$ ngV9YdrpݢK3lԧld.>*xr7ALl1 WUI2v<K9R'lJ;oFV;Ѭu.07LR LqrBaұSf+fW29:][͹#$n+MW&uCL\frFg\U(㮶nZA@3瑶 Vʯ;1C}S]7HZȶK+éLԹ fGdiKG9P"2 ek6KzW3yvei(Q(Z#>^m(8⋧!gY;Ɍ[H:Ѣt8B(^VrWso`#x ~>sGS.dlN$b`Vf`I3Oi<3"ҠW ˏzֳ[V~@YsU`N2Ѷ 21YdS،;cl0ww|fiv#gJR_L(3 7\*`!XoK/`0-k4*i5?cQx1Iq@qB56!/zWz|Q]{'4NB1ww[U9Κ!&cd44Ow/ƂT:M\ΝTٜ+^/ N5/-3+~wTI񴕷=Wykǟɟg~f;d|~|7>9'~b|K_2~粽3sJs9| Ϧ4#U !Z)"D׹'|.`IfDT)`s9?sGn0${5׌]?xg7vzf純(Sx!wlUIƨ줫NxUK-o/xWb|_>v1z#?ey\r9_Z8VD^Y뙓L/K0&s"('6@o4iWW38K߰t'?SOO9}Rb2beG04yi.bHd\^0Ixd~$57]soC>GRlaur`QIe5b9QlFKk>6Қ-6~3WFP{{Ȭw5~w7$8"3Ixr 8}c3['jX=u_[>3d!@z_0䧤Gef<㙤φgyf36Rw+U:O/42Pϝ$) g\P v4]9B 4+2wy|]wI7 +KGWH=LcgB@y[۴ B/m/\GHwǐ7˕ŹL^Bo׹^E*0q3 Șk!㎻`p0>pC[o&[8S3 z_h.beB .K'H/B NHq9v05w&Hz@?ybb}J}׏?CG;TMR|pw=^v̶lTpߍߛvu`_zɥc:Nl&*,L2B6s|.,D€4 x%PIW`׿b, *#0w4Y$1vxA[@>=7';s@=~6rF->gt&Ț1-c<鐝˱fK KH@ ŝw=^~Eo@Qnnb.#jָ\t cf-YlQ!s f8bDvыdq#J;KG aw_mdVcs )G#.)t@ō$cyv&œ3' ؏ M`X,8=Ǹk^v);ؗ@@§$fک 'X<9!`2OɌȮ1OhEdDt^iV@LGOky~д)2LLI0s 錓"gR5RU8T=sJFfa3eXrQ"bgvj7^vwSen=W;10^&AVOrXο"U 뢥K.2vL>\ e , acI;.M<2=^ό7|sdw<ད]G}-@i feh].ިd0V=iZ88;Y.bi选Cyg-_[roPr==2Uj: oE{ 鹟D RO~Tt0qtH ںz1 Cw4;g``ۿ>Xr4Ŵcџf7{G6vu>U^[[/ Lf%̙&4O:tN \)̦\>Wl^Y:1GVŖ(bO@h|vfZ`J\N,R o#lK-"UdrG3s`ao띱R):]h%Yh c|2=ַd煵"s3vfE~!vbag 6f_Vˮ|P=`dn /0 ?>ӟ`_ Ͽp(r%ܠM1CMJVQ%q;~3%e19f=m&.ɓݛ',I2s>]@y>;Y}?嗻oQ-qBb0x|F$q 3G2[ͥos6yfU2b`ߍhbb۪`R^vfhU'W`^c JJr-,W(4?, `Db*=!OkziljT4ɜ2Bqܳƒ=,k~f ~sa*on~yzw}o 9XrϪFbp6VCwH>Q'/SlVgM*J0 eJz髱#20=vwρQ"BKYgKe$#W /YK.rre|RR^>?|ގTA"mLVQgT"5Vlh`Vٿ[Hm[U -2-<%Lir3n5$\j6r{д{_FKK/aJPaiz15rp,n(ۛY%"&sleYLq 6pg Y#`J;WG. X-m~ n6PkM"@"Wq*a6 ~z MJOFJ"^«(KZMha켬e>Q}JtEfVbkhT\VQg*"=CjƔ#Ν9OF%JK$pmr,//X ~ {rʥ K% |Rwv\waM7;,2I)FcUyg*֠٪iTb}sc{ܞNp綁V8QMs_Lb^ 7 ˪-6*UB9'۬ջIMXL`;0u`?̳V|cO6b7.]X'Vk3ڡZnTa_׈2?S/7><1&c O^Wj'^6ynAlUsfhl sۆ3Oj$ 98{`mmTmcg {ZͪĘTyX%ӟD'C{ % KVYZ5n2ѼʨUEA9Z5LԶP>FTN:ٽ}10/^\.@b{L W TX9/.\Ϝ^{;gBBjȎ)A?e'<ٔ@'oaƖCfssOކmsSRtg/=uO=sZ}jzN QlLk9!---u6F2Aa[N 8gmy 쭕#56iA!C哪x嗻* Pbyִˆ\٫-:fc$ K r<"HY~S4v,yl2F)"ibDV]/:*%FC_MbǔJ]!:s {p_=Q\i֔BXmLrL dmC2dm`c' h]> C <]\ r^TmcYu@_P@|٤:.}~YrO{0q$툃QR|n3g=ǡ_QF6n}V9uoOR;?7-O87 lh Ɇ'WmBPZ; gRLrd%~78XR !1SzM:>Pܪ #4|uyb 5l#i-H!YZJZa܊Uy=kp$BF6s}[cG#hЧ9Ŝy&{E_dQ^3HC 8i$mU=L`{^2` ʅCQ\Uu7ʊy8k,[odOwN(VBS''Ntx9yLTN<^;ҁ%sBD96AFI%>k' 7ACD+oϧ;` fN{Xwe*嫝85Ύ:`ߍ20K"O?'~pf؅I3!/w48J%I[teFhJr$g;~Ds+ŖQtt1PŽwW]jٮmߍ=wx(;z|uiݝv6ɪ ~Ie܏- PMc܇@ {uɦwNH92Fΰyh=p&H:>, *`>Rw,LEd,hjښ7ŵY%Xgc?^'1hmRkӡ%p&1)ܗ䐅~g?^/, +˔A \,ž_;z"q}ScϗrGv ga렴" @f:k;bS&ٕd&# X$!a?MZA 6]=)t1Ev93mGw ӕ;U]pz&L-aklxcO6K/q̰GJ4tfT`IHnfHGϔ' az E`#5- ^VnD4K*Plq(-1 نe [%r?Oאקu,#Ͷ}P SOuԧXoO~{/S _-D93q8yEjo~}3k- ufJae֪J#p Z"^&(uiJ3Hҷ{Tߍs*+}Np.6k >{{_WVű?vz$Z [?Zi&FƯ wiG.or$B2^l9c&dG)'}D,4؇>=m|Ta_*Fx?I-=fAN}ߞ(3s+W\ߓ ?86z 0[11~pL FRE3p]JddMƅi0;i )k9vPi96d*6!M'06Ў@<$c!m 3?C;`'FĹCpC70r>o} Ԝ>v %q> 76Y[}O~@ npz$~wIC>K[q-2#>C9x26dl,Us$`B&QĒ|2;otgh4YDo9߽v+ҽt#& (M/po"ǰd$}R7n%wƖBxͷqg.3;^bvԦvTd,$GFv gp{Q>5}n'elc~е:pnBG o`d M {e3ƙp(/M&f=šBZV[t vV( g#2|_Z;pkkTC3^UعZH Ldesc[LNr"Š,~p4Sٙ +_lu*L!zj} ǵ'V"܎< N3ICr=0M:8Ya"8dQC,I Pf:UbH9 "8|t_8 o;^CO|7k|eR'Yc{3UA5@ڎbkeI)!sHf"g"%2Zٟ8DjGj~Q4{!s+h.IE-u`r|E sgA{;[xwҷw[]oUq;6}mOla 6f:񓘦չ2|JĬZk8~ʪĠ#R0[c4IEbfmg:đ6k0d83Y f  3,L tbL%Cӫ[^h=#iM6I kcXc"oAb?E ;ͪD871׈YfՏGY#wm4FJ]9IbVLfLI2EI9X `cQ(LY@̰Yʵ0k{=24AZehȁ`,h4Ȱ|;>Ԡq>[ db&?+`?nm|U35xb `j|0u Ώ~NAlge.ᗾ8V9'g&XgC+A6L^9xwn,5e{ݱ()r/3 Iux+ }mMI#E_l?jلmqUǎr Ͳ>c %g6?`~Ͼa}uO6İ_X"#( `?\*ԎL(d(f"GC)ٕlQvˉ7H"j V0l8,M+$~\r_m0Jpb0(4VR ~pșZqU sr`xz~ʳ> 狵̚$(ci!4L0Wyژ-G p [ Hqi-`Mǡi};wLwmgXjMpE:-I~~( EӵF24qW;K2Q!#iLb v`K6#Z vlf{/uOWXVleh YꏡmÈ9 'csIB¡N1[YV34L3X]5tU;lf;fJZIPB,)2jhV:C v`8 :V1`#Vkψ:Ux%״<"&կ~8w/J$_$ZC  @}N5TY ` RM:r?Xj3bI4>"%9|ԑ!KF%V>M֍YFVk%x<74{'#z6Lr!  nv Z`|T70]./gZR;bEot3g׾}+_O>`c1u5QF1F$Q4ھ^kQ8-mMwb.XY^vd%V6۸ݸ*/323ͮ=n^:1!Apa0 a6䤒*UNȡ áTEo VDV/%}:+Wz{6opU$|1D^L X/AϩIJ@ %97GZnP<:< ݠPkVf]"\`k!rbʃUZO&0-avޅqስFyJTvϑGLBfSCB{?2FE=s ؋Z%7&iw"Gz$$ ٟLQL-&l8ei)Ul1_"m?+BiS2% 0$%T-4diP6I!3<7U-Rvʲ/JfX2, Td-ce4{M;.%ddb5敲iz;+y %N@E8جC\|l"6J>wChvYTc% cey`d0y[ _ 6E^nf%jWm<>Qshg?/d{8||pAΓ|1 {2+ 0ɜFɨiW8sy $,Ofz2B$ !{Lֆ\>!ѴO&p|@=/ PJq|̅%{8oI5 '}7C}r&<ډ8]$/+4/IɗuS\ ۗ6{aR},gmO˨NHS- +>Q~Y:Z_7;hefG͎f1!`/*:ZVbZ$eOXދAzfLMc4^ÙlI9p0 V6NJ;bv^U4]C@dyB- b#~hEbGJ,9-J9lIR˄T2~D">{++;n*ПtQzL"xg{>^٬3b 6fvhC~0lt `Q04}6‌CeWcC!yQ(&eڈ z: 1T eUA8x1*0NbdYcF:skHI!AL)H'$2IkbOSi4˞,%e/JZ5-zp8mJ5&3/s@z鴍 J_C<<$=/%$() ` SQld .EdYһ8hG382C/pK LWh6E"YUK(a奥f}BfN XC0}X`szXgҒz:gLRߟ'<"Zg4X72(M ?n?.I4GpN0;89_! Of9iyKĂCsȺ}t4:q/Z 9#W06PyK )'#q42Ġe:M;ċrnwEÐ\otv/Ɯv!4uY/ ;GG L3l?eүx>`T}ONa#; ɕc'^<{V~zsi bh+ p %c3;zXv4J^\|˧ }0 A8aJJ1)-D2$@P\f ʒ5<'@lFTx+Gq8t^#IjNέST H #/F;=~"@P2P'X$8F q9& =A<[Fcә}u&5R ~yLb~9\ߑa@8f 4 afGˎf1կ~ս_=+2 crْEd l)P8" *:sE$cF!XHg.禞 c.I#xV 8@l%oKI dv(%>!Xx8$XЎڲ7&%V㭲-YD9L/NHZI@/,, ]t ǓMaf- v~4-+&p>'08QʕTy̎T~fwȫ{7 C.&aDE>nNI#nv}H#dWR)(wr68s )SHfY PAl P IYPim XȺ$V^r\8v K .93S ?((_noa9Cu, N()ejK/smi2:p[2}2QI>c2\%~јEVF̎c¬o'Gu׮\T'CAMe]NL3!{P)P>H_oMvS;9 Bީ6狵Α!F?|^3jJr-g H-Tpf4K1hix5AVҩ_pʈP#3thtNɚiBb@AQp?(cyQgCt*=?J:c"}~[wY6zSgv숀_mmƍݠt)`}/*W j5Wb\5BbpZ <.Щ^|ӇΒ2 pJr!$t:D]U?;GL(a_\ ;{bJ_sA ms),kW"L|qY㞍]REj^naB }R_Z G:?4_SY*](_еrL]9~aqlXǢl!},Zl;yC</ߕvZ|ib1Kr-s̗=^qgο{dX,m+KwϗpτǢqپNY_Py/) #u^wu| LL $vfٔx BFñ7lI *.fjs+O$  7#'~I8w-' Jk1rB{ 2$f |o !$+ C?bSΙQ 8} $8'2bD`{Թ}fB:>$` :e⋌ݴg2kGdAA$U'=(V=|;"`7ncF ů\|6>c-P:6:fsc-:o|[_sn|grߍ1^6hXmnc7oٰmq&]^6vr11wo˺Kܴ:7>۴~__gƅ6677u|cc7eߖM5k#Z5Sf$̫v2^ 9YόD2KynY=P'tn)`|L$1ߵJf*`Ltr8F0p D~2̮:ҙ/td& .Φ?cgAɤ2[06)T&j+|U l j&4Ps5y:#S5cɞRV!R-}X }@d (@ѿYhaҘ^wYZDA#OmsF IEv6^mK!l?vb,4C-{M{IL=JG&3ayB$&,T(,#[B$uR¨8 *@#n@;x34uFZځ^)= RkM$Y_݉0O'P%X04Z>G1hfGgG 5:5ԕEzh5–Z#}m:\]VWF}Um3AsqR"yUTΐG%SunP[רU_q2AM& PbW9cXKG}¦|{rg)lWP%I®_¦&3JПU݇Y}rh}+h/gz-ȡؗAU)%]`Tu+GЯA|4f{ Ww{h%їW9hH a%GltTC؉ Yb1kDEBAx>$_"3 }i\d̰ãnr:5J.gS)) qzLA0ރ{0F|e%~%Y1p->dgNc3Wh/& b0v:/[U?T8Wm VR~F@e1zF(`(I޴.|[9iDp #&[Ee1ңSpOT5EjKV4@ƣsst8a!}]!0d+NB`z%bL}D[-㚎B>QUX(12A^G'yP1dQqpxcfu'3s _^fH8gv4`HƃvDGaQ[P5uesA̬GF{$#pCµTq4R1RGcx?4JYkstՙVWapV3lL3bG1%w"R:VNfBS)\V, |跊J r,CEmѴBI )>5'3˵Ȗ*ga5G~oUykoa-!hfG3;_;"`ZnsPN2 ]yp\ o~amt dxJL@h *iaեb h>0˵ ,HwBGU @>vxhu? =^̎fvv#bN.B!jIҐ8f~+FlxPxcB`$tPV3J@:Äp-`$Ym2&CÁ: k _:~NNwJaTJ0PGd*.8%my} 㪁7\atT}6ZyvgC b~*2eAzHr87ڬ033ӈ@îaRKk}AeQnDmKZt^6O{w]Y:%)”#c[̈6H+a%I^*yT7A@ /'S:6GBarr25(#ԋ"Pj!+"N=H00h~@HEꊼw霼,B5~ qj&AQO_Z2P\Tׄz"/snVZf\W MfZIܯT `h޾K`5!:pa.E!g(^-wEDJZZZb;3`$7v&c%RY(! }wq h 5q`ngnxS6ņ-H.Df J`2$#I\|coi*khhnPfD5]g%=&[$hn̶4T!rɱ8ЇyUh8`otjnhJb PrnJ-K"ީVϑ(n]J7J[EH܎Qe:!ȭū0k-j@V(S iiE Ip+xOC(noh>/]fCOšX A (ӧ!EDA*,I_lY8XR NZ Ǩ ,ۺLEk8$2T$p@Xz@%ambBыa2U@ " :u~G2ʲMմ @oNkq=&.n:څvQj`Ƞlk  ؄CpQ zjP!?CGP2 )\CCLL_:8!7}β'#ׂ%!ȀĪ0 A %PqA0 헌|d!ۀUz k*qzn_;TD5H֊tavpWr4>0kvڵg:[ ̔Mja|X#b͛7t M8 7XZ1 j6mڴBD%b9+Th#wkӱXLTS]X5P&kD;z2* ]+Q4J{dtFRtvvtz#a P@aWWgu.ݸ;pVUP&VpXe`y` =T Uhܿuq###WwP{4T;0`2 Db8>Oeӎ{?(S0 ]D"B MuFm466vG'}xϗ8ˡR# 3N^ z{(;h䐣K ߦBGibE p׎~(<FN.C(Vl4!Mx.3g3 YR*Bg8?Hю_|@ȵE$ ;v옝Pk( !i6C%?o ! ===,ٱ:v PlBN&#C y 8Ga Ʉ΃ '"0x&t}pi8{5. UR˃(GfWQ̰ po0@PC+ gˊda2!}@^~Y\j4 !nDf BğuD<@p#2-o8!1.lS_Ci<}/ !ÑH$fh;998@bA ;@Y9!a&@lAqH :(*R<,} dr*J"$&>1>lgs` 3h T*Px`.-#+yHwi&S(R!4( #$[((oR` ?"`r2S۲H+ `}fH(K}"'zHx UQA̾!jr Uy wzr` SALS} v߅\UKf/lII"`ӯG(\j4MN@)Q ߿Hkk#8kckLA! b&K=DT @  wo >R53t b)$y4|ry A &qx4Y > 5%ZxOrb8$ܚv@ 6?!n=%>0)$Hy "{qE2[ք ˔D4Avxg$s2JVoD)Z=PaDmċ3YvrUoF<,bjJA#^kpyu9cY_BI󭛐ؔ P{x=Ώ06T ҹt]bi !]h/ xlt@!tW:zd\za-<)ezs7%sdO&/xӺLjn_D]\9NcH"k FL %XZS wḬl' &2gKuV$&B @RaPT5J9fUא} hdNiN7+ V s]}:/o>J :D%MfG?lyD& ش7E 8昞 #sqc!~uWgopat +By 큝Z^J5IZ =y`YCQN@4js|q=kWxnϑ`T ={)I{$ܗva#aEl{S9M B1 j"A]QY-Ob-Haz3K ̜>5D97ޜ+VPOJpB 54B28*K&Y>h_K5Hl@aӚcIje8@dWIHȡuS X9s !!ۈN@Q$܃)`N$HOXᑐ9Į9Z-Ar_BB fխŲ=$Q}i+(kho*Abp27DZM@B%$$: !dz $p#I@1p83^<6@բZ=4"%X&H>H hbV"鹯Qrz͡<,[bfLb{s$aߧ+|ޜ7qe}HH Bt:>5,0IB+K1d([ena58ޠ97%Z]$j BY1KNGqiֶ)0dԫ,r1 h  n_lk FS (UUMfc#zc>$7hxzROB"UKu䳎B)AJ=U:[7̦ +"3As55Ϛ%_! { @Mx@fSL"5qbTGbT3_ R\d )obC(dHy=op*9&!^@ UkHzw*W򆎐1>BZ#m>i`<6Z3DXU"qU1F&XORh`U@"51 oz_jk>b%%r5^F<7@>VٚNMV*GrJc[׾uShit3rR'Cimf_ +FD;t73>6:۸z_o꬘ש#YuM MC3 ng~*@HVjda \ [Z s6 &Nl # Ɠ oU*7Yŗ` ^-&!h(~FD|s*_ $ȡ5fhمQ I6Rl"?d3ʍT`6ye ,|7: {sL)s0H3+7IENDB`PKZXXimages/loading.gifnu[GIF89a ƥνﵵ<<<ޘooo...>>>kkk@@@%%%dddsss===???:::}}}999ggg555///vvvAAA! NETSCAPE2.0! ,@p*HšPi6„B8HÀ1(A;X4 U B2="- #7W0$. z a3Xj#|>A8 *d H bF! , <".0" 2t8 *\<6&4ǩA Vp:Ll@dE@&@PE!! , CpA!ŀ`4 i8 exp mty|gE Oi%mEA!, [=s/Pul$p`'cp>Q; } )@ ;PKZf""images/wpspin_light-2x.gifnu[GIF89a ޙټ{{{~~~}}}! NETSCAPE2.0! , @ 8kYƎ9Jda%I1BdH xE +T ȴre,<#Bę3` d H&TA> qp͠Ua ˏ r6+3ߨ2 ( oxCG V)29]hQ獀lhтUxBY +TF3][7{4ҵ *UF*dŠ+Qb aa F`$Gl ($Y4I iaa ` XqP',HB h0u\(ą A1 g f,ș $HDh0¤|' i 0 ͑@U1 B4A[ @LFo QBd"`h@H(>ABpõ{BE t8lP@hAq~qo|@ t0$H0Q ɂD)ڑ,5$Fee[`  &po4ѵC\p4dPoG>hB,l@R+Fs,q5E6( Gt с`X!~, ~6lvoove6J{eH.ly>|b yk-oq RQPNMKIHGEhvTtVTSHFECB oQK XVUSRIGFDC`_QpG- bZXWB`?ACvXDG-YygI"5 -YEH!_~P;A1c4)RG0PdA>QĆ  R%XXRFŬ{3EREsްQ#  5"*( cm PrAʏ7eҘ1 #2pJcof-% RV1E1bǀ۷YVwo20`Р+(j…s%|p@ur̢;Yȉ|DQ*Vȯ#H0H@ ) uP7`ZZ|C(R '@A1Xp %С HlPdm# 'XU*bp#!Yd<$h!.,hTǗ @ f A"(I ^" W%Z"490aNḁ#(T[!-xo%Ȃ ҠQ0!0d$f 3f 8C C#2h 3ps *4` L4d`E8|rFĎ'bwG=A}D0qE +VXG1*T /w $p )\#h]-AHX(T2! d, H4t(|G %J(0ʜ3"D}A.IpO eKqys;=$Y .\`bK-` O,VPF1#A [VKTD A $m)R@ M9 .3)P8q"Aar޴0!B gTJM0 =(-A=RȲFa*N/Qb@!oXw7T&ZQ$ItN[υ YxB wĂQFBl\6LdFGѡ̥`A S AD.XBE`BB ѣY`Dm`!A.a|`x?X(W j@s7BZ Io<zG;4 9D[qC: oB 8h (dA|EB`å d䖆;)$4 8)P"DFdB 3jyo 1P ! #p cB / C5(P 'k$` ) Es Q r*Ђ poAQhoE$nrLDajL o-,4PLWT`3t,`XfԃRO aQBu0!~, ~7 rtooy 7MrK.}wqw{-om zyXwl|TM |ba J/y޸a]\by.|p |Kk\>.[HfEHa(ǯEs2ѧ% , ƍ /`@I>%\b?8ٰe xɹ4ti l8xE("4UL"%ϛ,t7d'MQ(Q|a@"lpf+?lGBV;ؼÈ"-;y⤴p1Bї@5="w(;ݒK\9R!I<Eḃ7yȑ#H(xc:2dBr|RE1Û2aހP NHq14(r0 b@Q`8YqIHB .P"s U# 'PxF^D4. աÏ' ,B 3`H*DA bV1@ 7CCA^+8 - 3Pwc~`"uTK0|,:= | ,y>Pc! , $E"WQ lñ  GRɹ gg;7s~v(ܱ̤ g !( 3aP b$`0]b2z0.\=$~jES- d#,XbمHhbE!#F|4DP*U#4DZC`Hw C$H(a"/(PDa&NmɓĈ"8"%LXscdxjt&!tz,hLRbI%!ŋ^ !R$ }Y 2hظ/`1KaĘF?RNB^\1 9xD?7hԉz3^'aPuaPbR ! ,  HPI9w(|CG!)J(3RDI@>PP'Le8lА… =(Sf c?;1`IaBoP,PP`> $H`Ga,f B ,#fv< m !CY $DBB91b9"qp0Y# P8E7fDq{2.t3A (Hf! ! oTa# w 0C¼Cr4Ea  8 $JER(`oQS`B fL !0'pˆQ8B `d (BAPHB|c.0Əc(?(Ea!“*&*]B ^ ,>Ph Yhŕ0Z, Y($GV(4Xh1^ - 0ȡdHDBTaXhA ԠP/ :W|ae(SPaŤ[q!q 2@s覐T@Thફ 6k M<Ķfp 9x` AI,ODA E 6CThHW@M PVXVk¦, 8..-,)M;7ă0//,2Qzhؠ1𹠡ɇAk:pР!C2d BA㖎@bpP$QXy2ظa @+P(@ GeN@a))9r萊 &`#h/`yȄlx D/:z`Р\BlH  u (0_BdI$@Z  8#H2"F4i(R$5%K F`/b;&NHb%.a }@#&Hn3i|,Zt#`zHYp#;xb?DQODRʕ,EGI }]L S!t`#\Ȉ! p, Hu(|SJ(31֩`ȑ"DHHC T *Ơ8a$fDE/^\"E >GBaG9" -<Uę37)J7i̐!#Ƌ,V@ѓOE;JjԘFcKOU= 6("B uYym4tɸ ?zN Zt7fB%&Ȁ7vxx<O&6Q-xT<(q&C oD@0jGo]oܡ_ I! сl0BY!2*􅄜iA.bC A ! iAJDQĔ U!ko`%`Fa!nXp\FypH$ YQ AZqFu*L "HgLP L4y(C8JAP8Q}*P\o Dq&F!VLBqt 8FzNAWhE|` ,@<[X1Vd.@o 8[t  WdEa0  XQXv! =x0\h{AΰBtaH I8PJx=Q5s QAH!~, ~5>voov=|4Gj=F,v\MLKJXuf,olX54320/.-+*N>uEQ87651,c)\oNHpN:9Ǵ2.*)('B|X],@Q\T@^A[sS(>KXK%#JJ^X1urQAI:]V4'>P)BJzzA!3F0NW`~k^GXE*g1}gNWN.B}con[P-|~~_\/#q‘aa4t|Pr{YҜժbYGٌεܿ^unL渹j%.KЄ[0G̓Š׹鳿∺ꮙԻ칟v⛙ŎB+/[{Īg`@ƣ6^2ݤlתssqĻѵԙnӚ4G1___͓}ڷ;,=`XKP׹ہ}㯪.@m?nhߞj<έtګV`wȧCښc״H|UoʊgM{vޝ7ЁMޒ_7Ō1~{Jq|^ҮoPIJxrځioX~TZШΓoB8W{,GtRNS$1F%Z?s谻K6KikS̀mqS\~Q- IDATxOSYq0][c2%H&0&;k2J!ҡ61m%RE2$ ȊD(y [ bxs[+[wܝ~KKh?=%!uRH*{ESРs8kPh3wI2/[ (H%X##h(4l]Gb.DM! nuih_x rYiHIxLl>@qL'sedhvy%'&E=0J|~M,-ĭ8c&KV[h`X 5Cj)d3ЪS* Vۭ>OQg>ۍ0(PˆVa@VWh :zg0/!Tyޞ''MCM%%|MO݃dFi4:zJY\n'2=j4LGi4,a Uנ*VAw,HMA}M&óaJdv'=2gt=\V)Aۭh .z$. &dz%$T.zWvEȇU{+wmSX{Z,A=hhĠ<0f 9M(s|6ڰkhrpMB }pa4kppIQa^E jα,,kX!Sf! .|VCJyj[8́rt/},lo|Iz,XǗXdWT<^r'Xe4|A8e11CncCm*4;c!{%C${K&PK !4M2<$laiɃ-X[Kh x6X, ũ.Ɛ\ d~|`omnp?!49>!gQ0V*480p1F$jMO8/a@[ؤ6 l1FS"ݾPK7 CC59ݐAod@&R)Һ "$OIAPSz6'-B 2=XX&cv}j-B1a0وIFXF7ca?0f ;4(dZx, o&Ldqo!ʀ[%>d=25CX92 bp4>_ubboOIǰ. "Z.U_|tUnVlJ3^:<ݭD7 :V66ZpDx`(looZZT8&A<0=4 z2/![ o'>gNi҂_H2UfDQ65)Gnqd ѻI0]acn|~넇|O墧QC1h1tuE04ifmk |i\aNc a1^"Z@C Dޱ$4NZ˂5<10L?^M'p{;s$KTdiE]a @M$BL; {6Ӵ˛ڴMgN7gd([ A[=ȞU˗/11ڧjQWN SAnNíet`FF?60ԑlj!*T%Nע?i2x[*Z `ˏR$Nl%avۆ`N W؍bĤW(/ϲ˭Gbq7Vi+` Xrl>[EyCOP NJ1U .PePVCJ>2I,4m͐8?5`L) ҃6Ai#H 2\di 4{H)3dju#4^N5$'Źj2ݯHK$ۥ-a4Y $I8+D3ڠ`P# -YOK87>U͒sO_2"$ / ;t>1<‚%K/ D/YH1$)J62.{%;=R٥LA,mvQ he(_Ie(p֬k>  Aۂ2{lzA >iSn?ޤMʘ0lu.ѤǏyKFS%=sC'Cr;cVD#@+ee֤Jlk%M258gM<ҤL I,2HvU:`©[iTWdB'CX3}޻1 R0c h&D =Ȱ~. aʰ2 -/w1m{66c Ё4Vb1w34C\JJA144dIWWWQp|e4i hd*WM/ɵn>o׸Tt gAeou%I\~ET0TV w I՟ &x~.d0[2ttN`::hdCqy;?# vw~acpqkЪBA ؘUCC|Z-p_wWTn Iy/qy P)2)2'u/w%d-f^iRZ{&AztzSE&IJVF0dYTCXJ}=W'X$ܕ_}̲j(BN9ZIۧ50hդ۞'0$dRr*P\ V Z<pY-ez}kG9ed͖ׅd0spTp eZ[u$ ~ +}Ud 3ph!h&D0RcH qSR˰vO H2lX>y,m`sw pajgi @-S\v5ZTf{rAP|^92Hg]d 8M&bąRDiF\A/0f5p,۩;~ 2ț#Ki #^*+R3CT@Gf\ zӤFndk/4SiP@VM~>uQ,>w4M ,g&I0%=a"÷~ t206a bڛ0І2Nx'4#Yl4j4Գynpa /h(F@WP Ir-IZ"qA/^`2,uuW)ku!*LրKhګ#wA !6T@ pbv8V!UpPoP0.@#е ]U,Sq2$9f0&ha0c@! f1G>|v90; /`0Il/)qnDv_t&8R7[ŐJvta "xX,F)cZ(tf6 NT9^Vy4!66S,~EEahրgeD10h%zχ!nb-8$dko={8o8c6'YXL5v }Zv1mz1z=dd8'漓7ߗf [|"/J (.Fm,5=!Zj hGU/pԆE{,uv%+(+}tuRoX";[D$8 N ᖖ|{Ҹѯ)?CD$f(JeV/b'yLDb=wmʃO=j:]=                      D曛wD^g-!Q$;=c?!y\xGD*=T:ABlem}Mw?<o>|%>p&lzE8jEvBf&H^_ԷkDś A | و>X_*i Hz2SRHv(T/0ό+tM֤ޓ=!؃7_Pkڻ.~k%jp' -0 |gm ɩ|ٱwd!MЛdz^Lʍ lnkxWmcu×?Y]ήrY7$)8"v."td'~A뾦l5Qb mAb%]t; _bΏ<{㌌xIsԊmzE`ё:ЛɜG%ހL' Tk5?CE+%~*GBW,Y̲.ZzCM@Hc9 " /*YV9V|E a`i, 'ZNLP0'ޫ|E`XF@]fږn\Fe\9fT;m^w{b'sa`\ՕMQ0ѥN,,5 Y2pò:W'8_Eiv/0-CLeցʏŠlX)Md]7,'0RNSgr- yu I4'Xg)rئ_T@/ROPβ ßTd_ vcKXG~⸦!}W:jXp Ϲ讶 ۾Br\6'@X bY/m5"eaL  TJOySEOUX߬jKxާ!K"exV:tNGl,eJXhW}@vՃhTzgWaPT; C7X(i c:M\Fj#m!ΕE!<|¤sr(gyBa }1f`SSJmKMp4kuj>0o0qZ:B(˞v7~ M‚Q˺بhaߌm{%Q\٘wS~w59&0x6pu˃҅PPu P S$\ wǩDG:'4 )r_k!"ޔن?"`T; cVڛO,H^r,Aeeͱlo@w0 _r,nF .YX 0 aC=4(py}<F0,ǰnjP;p3śSbt$L 3Q nǃihp0tEV2 Kt+V`$RIhв ,rM-L49͞=`pMeK~yfYNh3 yYÏE2r03h3dԔ6=O/^ELST`Q@  7_I .hAoӪ jΜ{%Ιi y.eb:qF}+Q|2^ x(:70|^>Vs.H7[ 00,(A@iW&󜸃W.*Pif':+hmZ1 ܽ"ema kPהXWA` QPB )j]]"?~JBHd8~#d4[&YtˢxrYQHl8 G?YfL,EWa8*/_(1c; k2x5 ^[v|0X130.JV4Sǖ.h6 %ʬӑaD~0Nm/4,Ԕ Qsq(`H*!(˰n%]/U{?.%d#<'؎d8m6]? A7êqqY='YLD=p$ C/k&]֎/̣ VQb A^Y<;LbA *LJM+TZT dCgbкpRU8"4r>2i֭vM[6eɞ  Q!x'SI hM2P&V ϯ0dXхUyj85 g[*R.ڞ׫jJ(b'C߬IZf8VUݒ#nLC7˜h@8: CM؞\]%0uKv}@hm؆{Ġ`C d 0܃E0qd٧a!Fzi!hh?lC-FWH"70lbbR$D9(r`.r6U= J- \nO^ yN% d@ΘI CI'3M*صq A( )VU0tr e?Kғv/[w/uÈg1Ei5 FA XÚ$RgdR /%Ea$gH f]ʒN`0Mm)E8j`l^M=[t r.iԔr4jYF8&aW$Uvh`PBH4nioV  RHcg4\]S[99Fo 8qtKkh|qPّ1ג!hmhBmkdӘuÚe ƈiqzO 2XXIh),<:%%axY晤܇I< eY2f6/,®x^n̤6x!dԔ@DozOƒ}j*]cqSI I>M ֟X8d1qU\K-I1)`8#5tΈ}[o7KYJO4g#fv ZR1"8>SU7-ƞwiSek㚅S$ęarH` N4 x/v_Ww#v5%/bS`OFAM0X#0XlƔ 2 #rC9"9xA@$0&Nb. ґJeNQd (/cӈ&}&X@>Y-RQ Г@@n@jJ ,T0qp^# E`]`T!ei) oJ)ՙj9@"$Sבͦ D D<}V$xa-}^zIoQ0 ;];4~|3hjdmL c/\- f|1P@e[0$a&7pM4P <0L+m Ȥn3azwEˆن8NټkNy~y#pmK7Se]rR4`  ƘqeY&ui4UO}>nƏ>C "jkUu$*U{>0( xGF8֨s͑a "iTÀ-Spɪ6M'e8Yَ8&3sFr]rS5m9!AxVDpmޤ*v37Guey x۸GYA1v/M7r'2aYp8F_[u%OPT$0icϯ- Cyfz?0>ֈ 6@1{j%`I_e;sCOg-<2f?uz< >HzS'7R!A]E qyx0P0MC{‚:ܣ`; ޼ 73fJ{WN J Jb)h '<2SQFf^[O&BqLDpbY1 #6yWh? < Y) Ͼ묔_-?$i$ QCAc|S%V_C H01 )vҽm.aϚT )eZIGoN?ߴ0hkeNTvcgǾTp;6A3 '{ju=Sr\fڃ oI;[գ1d8zl29+N Kiv )?Ǜ40x!`NAw9]=z8U,l}ףX= )`8@=Sz( ELH6QftI0\RayMWV`0`݇*eE1ihNb(J8Srd 2&l/ɰ l !)E*FnXժ Dү՛{|fV{ Ur^K,%{^kx&ؙ*c4J6ǰB.V,Ë {~2# XOkz.H"Iv&;z~S%iSMWXѵirm\3S7{"žcesbY#.Doz9Ѫ8Q,&Jo?l8f% lʓ1|WΪ}$_)O8zZg+8 W28N4W#dHYlG~Nm*d#pv$6CYؿ5/Y~bs=GRp>Eab-.h 1t'ӞTX~%;s~0j5 [0$ì_SLpJq[GhkمX'y$ ~}G\R1Kq4R1ǼSGYJcX, kh 5& 2IjjeBe51׿ A'|?wu i72Il͖ƙ;˻V_ \{&B/jPDʵgENlejVǮ@#C,<O@"ZO8Hڈa\:_*r\bFhWX*aDډYghQ>o_=<3\yBf dٍ5;x!x{dWek~!kYBS K9o _EdɰOwy0eUQT`cKd2ոu,1~/l74}dw2|Uiun1޳'E,axUD"' . '

' . sprintf( /* translators: %s: Documentation URL. */ __( 'You can also control the display of your content in RSS feeds, including the maximum number of posts to display and whether to show full text or an excerpt. Learn more about feeds.' ), __( 'https://developer.wordpress.org/advanced-administration/wordpress/feeds/' ) ) . '

' . '

' . __( 'You must click the Save Changes button at the bottom of the screen for new settings to take effect.' ) . '

', ) ); get_current_screen()->add_help_tab( array( 'id' => 'site-visibility', 'title' => has_action( 'blog_privacy_selector' ) ? __( 'Site visibility' ) : __( 'Search engine visibility' ), 'content' => '

' . __( 'You can choose whether or not your site will be crawled by robots, ping services, and spiders. If you want those services to ignore your site, click the checkbox next to “Discourage search engines from indexing this site” and click the Save Changes button at the bottom of the screen.' ) . '

' . '

' . __( 'Note that even when set to discourage search engines, your site is still visible on the web and not all search engines adhere to this directive.' ) . '

' . '

' . __( 'When this setting is in effect, a reminder is shown in the At a Glance box of the Dashboard that says, “Search engines discouraged”, to remind you that you have directed search engines to not crawl your site.' ) . '

', ) ); get_current_screen()->set_help_sidebar( '

' . __( 'For more information:' ) . '

' . '

' . __( 'Documentation on Reading Settings' ) . '

' . '

' . __( 'Support forums' ) . '

' ); require_once ABSPATH . 'wp-admin/admin-header.php'; ?>

'blog_charset' ) ); } ?>
PKZC;/`/` user-new.phpnu[' . __( 'You need a higher level of permission.' ) . '' . '

' . __( 'Sorry, you are not allowed to add users to this network.' ) . '

', 403 ); } } elseif ( ! current_user_can( 'create_users' ) ) { wp_die( '

' . __( 'You need a higher level of permission.' ) . '

' . '

' . __( 'Sorry, you are not allowed to create users.' ) . '

', 403 ); } if ( is_multisite() ) { add_filter( 'wpmu_signup_user_notification_email', 'admin_created_user_email' ); } if ( isset( $_REQUEST['action'] ) && 'adduser' === $_REQUEST['action'] ) { check_admin_referer( 'add-user', '_wpnonce_add-user' ); $user_details = null; $user_email = wp_unslash( $_REQUEST['email'] ); if ( str_contains( $user_email, '@' ) ) { $user_details = get_user_by( 'email', $user_email ); } else { if ( current_user_can( 'manage_network_users' ) ) { $user_details = get_user_by( 'login', $user_email ); } else { wp_redirect( add_query_arg( array( 'update' => 'enter_email' ), 'user-new.php' ) ); die(); } } if ( ! $user_details ) { wp_redirect( add_query_arg( array( 'update' => 'does_not_exist' ), 'user-new.php' ) ); die(); } if ( ! current_user_can( 'promote_user', $user_details->ID ) ) { wp_die( '

' . __( 'You need a higher level of permission.' ) . '

' . '

' . __( 'Sorry, you are not allowed to add users to this network.' ) . '

', 403 ); } // Adding an existing user to this blog. $new_user_email = array(); $redirect = 'user-new.php'; $username = $user_details->user_login; $user_id = $user_details->ID; if ( array_key_exists( $blog_id, get_blogs_of_user( $user_id ) ) ) { $redirect = add_query_arg( array( 'update' => 'addexisting' ), 'user-new.php' ); } else { if ( isset( $_POST['noconfirmation'] ) && current_user_can( 'manage_network_users' ) ) { wp_ensure_editable_role( $_REQUEST['role'] ); $result = add_existing_user_to_blog( array( 'user_id' => $user_id, 'role' => $_REQUEST['role'], ) ); if ( ! is_wp_error( $result ) ) { $redirect = add_query_arg( array( 'update' => 'addnoconfirmation', 'user_id' => $user_id, ), 'user-new.php' ); } else { $redirect = add_query_arg( array( 'update' => 'could_not_add' ), 'user-new.php' ); } } else { $newuser_key = wp_generate_password( 20, false ); add_option( 'new_user_' . $newuser_key, array( 'user_id' => $user_id, 'email' => $user_details->user_email, 'role' => $_REQUEST['role'], ) ); $roles = get_editable_roles(); $role = $roles[ $_REQUEST['role'] ]; /** * Fires immediately after an existing user is invited to join the site, but before the notification is sent. * * @since 4.4.0 * * @param int $user_id The invited user's ID. * @param array $role Array containing role information for the invited user. * @param string $newuser_key The key of the invitation. */ do_action( 'invite_user', $user_id, $role, $newuser_key ); $switched_locale = switch_to_user_locale( $user_id ); if ( '' !== get_option( 'blogname' ) ) { $site_title = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ); } else { $site_title = parse_url( home_url(), PHP_URL_HOST ); } /* translators: 1: Site title, 2: Site URL, 3: User role, 4: Activation URL. */ $message = __( 'Hi, You\'ve been invited to join \'%1$s\' at %2$s with the role of %3$s. Please click the following link to confirm the invite: %4$s' ); $new_user_email['to'] = $user_details->user_email; $new_user_email['subject'] = sprintf( /* translators: Joining confirmation notification email subject. %s: Site title. */ __( '[%s] Joining Confirmation' ), $site_title ); $new_user_email['message'] = sprintf( $message, get_option( 'blogname' ), home_url(), wp_specialchars_decode( translate_user_role( $role['name'] ) ), home_url( "/newbloguser/$newuser_key/" ) ); $new_user_email['headers'] = ''; /** * Filters the contents of the email sent when an existing user is invited to join the site. * * @since 5.6.0 * * @param array $new_user_email { * Used to build wp_mail(). * * @type string $to The email address of the invited user. * @type string $subject The subject of the email. * @type string $message The content of the email. * @type string $headers Headers. * } * @param int $user_id The invited user's ID. * @param array $role Array containing role information for the invited user. * @param string $newuser_key The key of the invitation. * */ $new_user_email = apply_filters( 'invited_user_email', $new_user_email, $user_id, $role, $newuser_key ); wp_mail( $new_user_email['to'], $new_user_email['subject'], $new_user_email['message'], $new_user_email['headers'] ); if ( $switched_locale ) { restore_previous_locale(); } $redirect = add_query_arg( array( 'update' => 'add' ), 'user-new.php' ); } } wp_redirect( $redirect ); die(); } elseif ( isset( $_REQUEST['action'] ) && 'createuser' === $_REQUEST['action'] ) { check_admin_referer( 'create-user', '_wpnonce_create-user' ); if ( ! current_user_can( 'create_users' ) ) { wp_die( '

' . __( 'You need a higher level of permission.' ) . '

' . '

' . __( 'Sorry, you are not allowed to create users.' ) . '

', 403 ); } if ( ! is_multisite() ) { $user_id = edit_user(); if ( is_wp_error( $user_id ) ) { $add_user_errors = $user_id; } else { if ( current_user_can( 'list_users' ) ) { $redirect = 'users.php?update=add&id=' . $user_id; } else { $redirect = add_query_arg( 'update', 'add', 'user-new.php' ); } wp_redirect( $redirect ); die(); } } else { // Adding a new user to this site. $new_user_email = wp_unslash( $_REQUEST['email'] ); $user_details = wpmu_validate_user_signup( $_REQUEST['user_login'], $new_user_email ); if ( is_wp_error( $user_details['errors'] ) && $user_details['errors']->has_errors() ) { $add_user_errors = $user_details['errors']; } else { /** This filter is documented in wp-includes/user.php */ $new_user_login = apply_filters( 'pre_user_login', sanitize_user( wp_unslash( $_REQUEST['user_login'] ), true ) ); if ( isset( $_POST['noconfirmation'] ) && current_user_can( 'manage_network_users' ) ) { add_filter( 'wpmu_signup_user_notification', '__return_false' ); // Disable confirmation email. add_filter( 'wpmu_welcome_user_notification', '__return_false' ); // Disable welcome email. } wp_ensure_editable_role( $_REQUEST['role'] ); wpmu_signup_user( $new_user_login, $new_user_email, array( 'add_to_blog' => get_current_blog_id(), 'new_role' => $_REQUEST['role'], ) ); if ( isset( $_POST['noconfirmation'] ) && current_user_can( 'manage_network_users' ) ) { $key = $wpdb->get_var( $wpdb->prepare( "SELECT activation_key FROM {$wpdb->signups} WHERE user_login = %s AND user_email = %s", $new_user_login, $new_user_email ) ); $new_user = wpmu_activate_signup( $key ); if ( is_wp_error( $new_user ) ) { $redirect = add_query_arg( array( 'update' => 'addnoconfirmation' ), 'user-new.php' ); } elseif ( ! is_user_member_of_blog( $new_user['user_id'] ) ) { $redirect = add_query_arg( array( 'update' => 'created_could_not_add' ), 'user-new.php' ); } else { $redirect = add_query_arg( array( 'update' => 'addnoconfirmation', 'user_id' => $new_user['user_id'], ), 'user-new.php' ); } } else { $redirect = add_query_arg( array( 'update' => 'newuserconfirmation' ), 'user-new.php' ); } wp_redirect( $redirect ); die(); } } } // Used in the HTML title tag. $title = __( 'Add User' ); $parent_file = 'users.php'; $do_both = false; if ( is_multisite() && current_user_can( 'promote_users' ) && current_user_can( 'create_users' ) ) { $do_both = true; } $help = '

' . __( 'To add a new user to your site, fill in the form on this screen and click the Add User button at the bottom.' ) . '

'; if ( is_multisite() ) { $help .= '

' . __( 'Because this is a multisite installation, you may add accounts that already exist on the Network by specifying a username or email, and defining a role. For more options, such as specifying a password, you have to be a Network Administrator and use the hover link under an existing user’s name to Edit the user profile under Network Admin > All Users.' ) . '

' . '

' . __( 'New users will receive an email letting them know they’ve been added as a user for your site. This email will also contain their password. Check the box if you do not want the user to receive a welcome email.' ) . '

'; } else { $help .= '

' . __( 'New users are automatically assigned a password, which they can change after logging in. You can view or edit the assigned password by clicking the Show Password button. The username cannot be changed once the user has been added.' ) . '

' . '

' . __( 'By default, new users will receive an email letting them know they’ve been added as a user for your site. This email will also contain a password reset link. Uncheck the box if you do not want to send the new user a welcome email.' ) . '

'; } $help .= '

' . __( 'Remember to click the Add User button at the bottom of this screen when you are finished.' ) . '

'; get_current_screen()->add_help_tab( array( 'id' => 'overview', 'title' => __( 'Overview' ), 'content' => $help, ) ); get_current_screen()->add_help_tab( array( 'id' => 'user-roles', 'title' => __( 'User Roles' ), 'content' => '

' . __( 'Here is a basic overview of the different user roles and the permissions associated with each one:' ) . '

' . '
    ' . '
  • ' . __( 'Subscribers can read comments/comment/receive newsletters, etc. but cannot create regular site content.' ) . '
  • ' . '
  • ' . __( 'Contributors can write and manage their posts but not publish posts or upload media files.' ) . '
  • ' . '
  • ' . __( 'Authors can publish and manage their own posts, and are able to upload files.' ) . '
  • ' . '
  • ' . __( 'Editors can publish posts, manage posts as well as manage other people’s posts, etc.' ) . '
  • ' . '
  • ' . __( 'Administrators have access to all the administration features.' ) . '
  • ' . '
', ) ); get_current_screen()->set_help_sidebar( '

' . __( 'For more information:' ) . '

' . '

' . __( 'Documentation on Adding New Users' ) . '

' . '

' . __( 'Support forums' ) . '

' ); wp_enqueue_script( 'wp-ajax-response' ); wp_enqueue_script( 'user-profile' ); /** * Filters whether to enable user auto-complete for non-super admins in Multisite. * * @since 3.4.0 * * @param bool $enable Whether to enable auto-complete for non-super admins. Default false. */ if ( is_multisite() && current_user_can( 'promote_users' ) && ! wp_is_large_network( 'users' ) && ( current_user_can( 'manage_network_users' ) || apply_filters( 'autocomplete_users_for_site_admins', false ) ) ) { wp_enqueue_script( 'user-suggest' ); } require_once ABSPATH . 'wp-admin/admin-header.php'; if ( isset( $_GET['update'] ) ) { $messages = array(); if ( is_multisite() ) { $edit_link = ''; if ( ( isset( $_GET['user_id'] ) ) ) { $user_id_new = absint( $_GET['user_id'] ); if ( $user_id_new ) { $edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ), get_edit_user_link( $user_id_new ) ) ); } } switch ( $_GET['update'] ) { case 'newuserconfirmation': $messages[] = __( 'Invitation email sent to new user. A confirmation link must be clicked before their account is created.' ); break; case 'add': $messages[] = __( 'Invitation email sent to user. A confirmation link must be clicked for them to be added to your site.' ); break; case 'addnoconfirmation': $message = __( 'User has been added to your site.' ); if ( $edit_link ) { $message .= sprintf( ' %s', $edit_link, __( 'Edit user' ) ); } $messages[] = $message; break; case 'addexisting': $messages[] = __( 'That user is already a member of this site.' ); break; case 'could_not_add': $add_user_errors = new WP_Error( 'could_not_add', __( 'That user could not be added to this site.' ) ); break; case 'created_could_not_add': $add_user_errors = new WP_Error( 'created_could_not_add', __( 'User has been created, but could not be added to this site.' ) ); break; case 'does_not_exist': $add_user_errors = new WP_Error( 'does_not_exist', __( 'The requested user does not exist.' ) ); break; case 'enter_email': $add_user_errors = new WP_Error( 'enter_email', __( 'Please enter a valid email address.' ) ); break; } } else { if ( 'add' === $_GET['update'] ) { $messages[] = __( 'User added.' ); } } } ?>

get_error_messages() as $err ) { $error_message .= "
  • $err
  • \n"; } wp_admin_notice( '
      ' . $error_message . '
    ', array( 'additional_classes' => array( 'error' ), 'paragraph_wrap' => false, ) ); endif; if ( ! empty( $messages ) ) { foreach ( $messages as $msg ) { wp_admin_notice( $msg, array( 'id' => 'message', 'additional_classes' => array( 'updated' ), 'dismissible' => true, ) ); } } ?> get_error_messages() as $message ) { $error_message .= "

    $message

    \n"; } wp_admin_notice( $error_message, array( 'additional_classes' => array( 'error' ), 'paragraph_wrap' => false, ) ); endif; ?>
    ' . __( 'Add Existing User' ) . ''; } if ( ! current_user_can( 'manage_network_users' ) ) { echo '

    ' . __( 'Enter the email address of an existing user on this network to invite them to this site. That person will be sent an email asking them to confirm the invite.' ) . '

    '; $label = __( 'Email' ); $type = 'email'; } else { echo '

    ' . __( 'Enter the email address or username of an existing user on this network to invite them to this site. That person will be sent an email asking them to confirm the invite.' ) . '

    '; $label = __( 'Email or Username' ); $type = 'text'; } ?>
    > 'addusersub' ) ); ?>
    ' . __( 'Add User' ) . ''; } ?>

    > 'createusersub' ) ); ?>
    comment_post_ID ) ) { wp_die( __( 'You cannot edit this comment because the associated post is in the Trash. Please restore the post first, then try again.' ) ); } } else { $comment = null; } switch ( $action ) { case 'editcomment': // Used in the HTML title tag. $title = __( 'Edit Comment' ); get_current_screen()->add_help_tab( array( 'id' => 'overview', 'title' => __( 'Overview' ), 'content' => '

    ' . __( 'You can edit the information left in a comment if needed. This is often useful when you notice that a commenter has made a typographical error.' ) . '

    ' . '

    ' . __( 'You can also moderate the comment from this screen using the Status box, where you can also change the timestamp of the comment.' ) . '

    ', ) ); get_current_screen()->set_help_sidebar( '

    ' . __( 'For more information:' ) . '

    ' . '

    ' . __( 'Documentation on Comments' ) . '

    ' . '

    ' . __( 'Support forums' ) . '

    ' ); wp_enqueue_script( 'comment' ); require_once ABSPATH . 'wp-admin/admin-header.php'; if ( ! $comment ) { comment_footer_die( __( 'Invalid comment ID.' ) . sprintf( ' ' . __( 'Go back' ) . '.', 'javascript:history.go(-1)' ) ); } if ( ! current_user_can( 'edit_comment', $comment_id ) ) { comment_footer_die( __( 'Sorry, you are not allowed to edit this comment.' ) ); } if ( 'trash' === $comment->comment_approved ) { comment_footer_die( __( 'This comment is in the Trash. Please move it out of the Trash if you want to edit it.' ) ); } $comment = get_comment_to_edit( $comment_id ); require ABSPATH . 'wp-admin/edit-form-comment.php'; break; case 'delete': case 'approve': case 'trash': case 'spam': // Used in the HTML title tag. $title = __( 'Moderate Comment' ); if ( ! $comment ) { wp_redirect( admin_url( 'edit-comments.php?error=1' ) ); die(); } if ( ! current_user_can( 'edit_comment', $comment->comment_ID ) ) { wp_redirect( admin_url( 'edit-comments.php?error=2' ) ); die(); } // No need to re-approve/re-trash/re-spam a comment. if ( str_replace( '1', 'approve', $comment->comment_approved ) === $action ) { wp_redirect( admin_url( 'edit-comments.php?same=' . $comment_id ) ); die(); } require_once ABSPATH . 'wp-admin/admin-header.php'; $formaction = $action . 'comment'; $nonce_action = ( 'approve' === $action ) ? 'approve-comment_' : 'delete-comment_'; $nonce_action .= $comment_id; ?>

    comment_approved ) { // If not unapproved. $message = ''; switch ( $comment->comment_approved ) { case '1': $message = __( 'This comment is currently approved.' ); break; case 'spam': $message = __( 'This comment is currently marked as spam.' ); break; case 'trash': $message = __( 'This comment is currently in the Trash.' ); break; } if ( $message ) { wp_admin_notice( $message, array( 'type' => 'info', 'id' => 'message', ) ); } } wp_admin_notice( '' . __( 'Caution:' ) . ' ' . $caution_msg, array( 'type' => 'warning', 'id' => 'message', ) ); ?>
    comment_post_ID; if ( current_user_can( 'edit_post', $post_id ) ) { $post_link = ""; $post_link .= esc_html( get_the_title( $post_id ) ) . ''; } else { $post_link = esc_html( get_the_title( $post_id ) ); } echo $post_link; if ( $comment->comment_parent ) { $parent = get_comment( $comment->comment_parent ); $parent_link = esc_url( get_comment_link( $parent ) ); $name = get_comment_author( $parent ); printf( /* translators: %s: Comment link. */ ' | ' . __( 'In reply to %s.' ), '' . $name . '' ); } ?>
    comment_post_ID ) ) { echo '' . $submitted . ''; } else { echo $submitted; } ?>

    comment_ID}" ) ); ?>">

    ' . __( 'Go back' ) . '.', 'edit-comments.php' ) ); } if ( ! current_user_can( 'edit_comment', $comment->comment_ID ) ) { comment_footer_die( __( 'Sorry, you are not allowed to edit comments on this post.' ) ); } if ( wp_get_referer() && ! $noredir && ! str_contains( wp_get_referer(), 'comment.php' ) ) { $redir = wp_get_referer(); } elseif ( wp_get_original_referer() && ! $noredir ) { $redir = wp_get_original_referer(); } elseif ( in_array( $action, array( 'approvecomment', 'unapprovecomment' ), true ) ) { $redir = admin_url( 'edit-comments.php?p=' . absint( $comment->comment_post_ID ) ); } else { $redir = admin_url( 'edit-comments.php' ); } $redir = remove_query_arg( array( 'spammed', 'unspammed', 'trashed', 'untrashed', 'deleted', 'ids', 'approved', 'unapproved' ), $redir ); switch ( $action ) { case 'deletecomment': wp_delete_comment( $comment ); $redir = add_query_arg( array( 'deleted' => '1' ), $redir ); break; case 'trashcomment': wp_trash_comment( $comment ); $redir = add_query_arg( array( 'trashed' => '1', 'ids' => $comment_id, ), $redir ); break; case 'untrashcomment': wp_untrash_comment( $comment ); $redir = add_query_arg( array( 'untrashed' => '1' ), $redir ); break; case 'spamcomment': wp_spam_comment( $comment ); $redir = add_query_arg( array( 'spammed' => '1', 'ids' => $comment_id, ), $redir ); break; case 'unspamcomment': wp_unspam_comment( $comment ); $redir = add_query_arg( array( 'unspammed' => '1' ), $redir ); break; case 'approvecomment': wp_set_comment_status( $comment, 'approve' ); $redir = add_query_arg( array( 'approved' => 1 ), $redir ); break; case 'unapprovecomment': wp_set_comment_status( $comment, 'hold' ); $redir = add_query_arg( array( 'unapproved' => 1 ), $redir ); break; } wp_redirect( $redir ); die; case 'editedcomment': $comment_id = absint( $_POST['comment_ID'] ); $comment_post_id = absint( $_POST['comment_post_ID'] ); check_admin_referer( 'update-comment_' . $comment_id ); $updated = edit_comment(); if ( is_wp_error( $updated ) ) { wp_die( $updated->get_error_message() ); } $location = ( empty( $_POST['referredby'] ) ? "edit-comments.php?p=$comment_post_id" : $_POST['referredby'] ) . '#comment-' . $comment_id; /** * Filters the URI the user is redirected to after editing a comment in the admin. * * @since 2.1.0 * * @param string $location The URI the user will be redirected to. * @param int $comment_id The ID of the comment being edited. */ $location = apply_filters( 'comment_edit_redirect', $location, $comment_id ); wp_redirect( $location ); exit; default: wp_die( __( 'Unknown action.' ) ); } // End switch. require_once ABSPATH . 'wp-admin/admin-footer.php'; PKZK  network.phpnu[tables( 'ms_global' ) as $table => $prefixed_table ) { $wpdb->$table = $prefixed_table; } if ( ! network_domain_check() && ( ! defined( 'WP_ALLOW_MULTISITE' ) || ! WP_ALLOW_MULTISITE ) ) { wp_die( printf( /* translators: 1: WP_ALLOW_MULTISITE, 2: wp-config.php */ __( 'You must define the %1$s constant as true in your %2$s file to allow creation of a Network.' ), 'WP_ALLOW_MULTISITE', 'wp-config.php' ) ); } if ( is_network_admin() ) { // Used in the HTML title tag. $title = __( 'Network Setup' ); $parent_file = 'settings.php'; } else { // Used in the HTML title tag. $title = __( 'Create a Network of WordPress Sites' ); $parent_file = 'tools.php'; } $network_help = '

    ' . __( 'This screen allows you to configure a network as having subdomains (site1.example.com) or subdirectories (example.com/site1). Subdomains require wildcard subdomains to be enabled in Apache and DNS records, if your host allows it.' ) . '

    ' . '

    ' . __( 'Choose subdomains or subdirectories; this can only be switched afterwards by reconfiguring your installation. Fill out the network details, and click Install. If this does not work, you may have to add a wildcard DNS record (for subdomains) or change to another setting in Permalinks (for subdirectories).' ) . '

    ' . '

    ' . __( 'The next screen for Network Setup will give you individually-generated lines of code to add to your wp-config.php and .htaccess files. Make sure the settings of your FTP client make files starting with a dot visible, so that you can find .htaccess; you may have to create this file if it really is not there. Make backup copies of those two files.' ) . '

    ' . '

    ' . __( 'Add the designated lines of code to wp-config.php (just before /*...stop editing...*/) and .htaccess (replacing the existing WordPress rules).' ) . '

    ' . '

    ' . __( 'Once you add this code and refresh your browser, multisite should be enabled. This screen, now in the Network Admin navigation menu, will keep an archive of the added code. You can toggle between Network Admin and Site Admin by clicking on the Network Admin or an individual site name under the My Sites dropdown in the Toolbar.' ) . '

    ' . '

    ' . __( 'The choice of subdirectory sites is disabled if this setup is more than a month old because of permalink problems with “/blog/” from the main site. This disabling will be addressed in a future version.' ) . '

    ' . '

    ' . __( 'For more information:' ) . '

    ' . '

    ' . __( 'Documentation on Creating a Network' ) . '

    ' . '

    ' . __( 'Documentation on the Network Screen' ) . '

    '; get_current_screen()->add_help_tab( array( 'id' => 'network', 'title' => __( 'Network' ), 'content' => $network_help, ) ); get_current_screen()->set_help_sidebar( '

    ' . __( 'For more information:' ) . '

    ' . '

    ' . __( 'Documentation on Creating a Network' ) . '

    ' . '

    ' . __( 'Documentation on the Network Screen' ) . '

    ' . '

    ' . __( 'Support forums' ) . '

    ' ); require_once ABSPATH . 'wp-admin/admin-header.php'; ?>

    get_error_codes() ) && 'no_wildcard_dns' === $result->get_error_code() ) { network_step2( $result ); } else { network_step1( $result ); } } else { network_step2(); } } else { network_step2(); } } elseif ( is_multisite() || network_domain_check() ) { network_step2(); } else { network_step1(); } ?>
    PKZbʏQQerase-personal-data.phpnu[add_help_tab( array( 'id' => 'overview', 'title' => __( 'Overview' ), 'content' => '

    ' . __( 'This screen is where you manage requests to erase personal data.' ) . '

    ' . '

    ' . __( 'Privacy Laws around the world require businesses and online services to delete, anonymize, or forget the data they collect about an individual. The rights those laws enshrine are sometimes called the "Right to be Forgotten".' ) . '

    ' . '

    ' . __( 'The tool associates data stored in WordPress with a supplied email address, including profile data and comments.' ) . '

    ' . '

    ' . __( 'Note: As this tool only gathers data from WordPress and participating plugins, you may need to do more to comply with erasure requests. For example, you are also responsible for ensuring that data collected by or stored with the 3rd party services your organization uses gets deleted.' ) . '

    ', ) ); get_current_screen()->add_help_tab( array( 'id' => 'default-data', 'title' => __( 'Default Data' ), 'content' => '

    ' . __( 'WordPress collects (but never publishes) a limited amount of data from logged-in users but then deletes it or anonymizes it. That data can include:' ) . '

    ' . '

    ' . __( 'Profile Information — user email address, username, display name, nickname, first name, last name, description/bio, and registration date.' ) . '

    ' . '

    ' . __( 'Community Events Location — The IP Address of the user which is used for the Upcoming Community Events shown in the dashboard widget.' ) . '

    ' . '

    ' . __( 'Session Tokens — User login information, IP Addresses, Expiration Date, User Agent (Browser/OS), and Last Login.' ) . '

    ' . '

    ' . __( 'Comments — WordPress does not delete comments. The software does anonymize (but, again, never publishes) the associated Email Address, IP Address, and User Agent (Browser/OS).' ) . '

    ' . '

    ' . __( 'Media — A list of URLs for all media file uploads made by the user.' ) . '

    ', ) ); $privacy_policy_guide = '

    ' . sprintf( /* translators: %s: URL to Privacy Policy Guide screen. */ __( 'If you are not sure, check the plugin documentation or contact the plugin author to see if the plugin collects data and if it supports the Data Eraser tool. This information may be available in the Privacy Policy Guide.' ), admin_url( 'options-privacy.php?tab=policyguide' ) ) . '

    '; get_current_screen()->add_help_tab( array( 'id' => 'plugin-data', 'title' => __( 'Plugin Data' ), 'content' => '

    ' . __( 'Many plugins may collect or store personal data either in the WordPress database or remotely. Any Erase Personal Data request should delete data from plugins as well.' ) . '

    ' . $privacy_policy_guide . '

    ' . __( 'If you are a plugin author, you can learn more about how to add the Personal Data Eraser to a plugin.' ) . '

    ', ) ); get_current_screen()->set_help_sidebar( '

    ' . __( 'For more information:' ) . '

    ' . '

    ' . __( 'Documentation on Erase Personal Data' ) . '

    ' . '

    ' . __( 'Support forums' ) . '

    ' ); // Handle list table actions. _wp_personal_data_handle_actions(); // Cleans up failed and expired requests before displaying the list table. _wp_personal_data_cleanup_requests(); wp_enqueue_script( 'privacy-tools' ); add_screen_option( 'per_page', array( 'default' => 20, 'option' => 'remove_personal_data_requests_per_page', ) ); $_list_table_args = array( 'plural' => 'privacy_requests', 'singular' => 'privacy_request', ); $requests_table = _get_list_table( 'WP_Privacy_Data_Removal_Requests_List_Table', $_list_table_args ); $requests_table->screen->set_screen_reader_content( array( 'heading_views' => __( 'Filter erase personal data list' ), 'heading_pagination' => __( 'Erase personal data list navigation' ), 'heading_list' => __( 'Erase personal data list' ), ) ); $requests_table->process_bulk_action(); $requests_table->prepare_items(); require_once ABSPATH . 'wp-admin/admin-header.php'; ?>



    views(); ?>
    search_box( __( 'Search Requests' ), 'requests' ); ?>
    display(); $requests_table->embed_scripts(); ?>
    ' . __( 'You need a higher level of permission.' ) . '' . '

    ' . __( 'Sorry, you are not allowed to edit theme options on this site.' ) . '

    ', 403 ); } if ( current_user_can( 'switch_themes' ) && isset( $_GET['action'] ) ) { if ( 'activate' === $_GET['action'] ) { check_admin_referer( 'switch-theme_' . $_GET['stylesheet'] ); $theme = wp_get_theme( $_GET['stylesheet'] ); if ( ! $theme->exists() || ! $theme->is_allowed() ) { wp_die( '

    ' . __( 'An error occurred.' ) . '

    ' . '

    ' . __( 'The requested theme does not exist.' ) . '

    ', 403 ); } switch_theme( $theme->get_stylesheet() ); wp_redirect( admin_url( 'themes.php?activated=true' ) ); exit; } elseif ( 'resume' === $_GET['action'] ) { check_admin_referer( 'resume-theme_' . $_GET['stylesheet'] ); $theme = wp_get_theme( $_GET['stylesheet'] ); if ( ! current_user_can( 'resume_theme', $_GET['stylesheet'] ) ) { wp_die( '

    ' . __( 'You need a higher level of permission.' ) . '

    ' . '

    ' . __( 'Sorry, you are not allowed to resume this theme.' ) . '

    ', 403 ); } $result = resume_theme( $theme->get_stylesheet(), self_admin_url( 'themes.php?error=resuming' ) ); if ( is_wp_error( $result ) ) { wp_die( $result ); } wp_redirect( admin_url( 'themes.php?resumed=true' ) ); exit; } elseif ( 'delete' === $_GET['action'] ) { check_admin_referer( 'delete-theme_' . $_GET['stylesheet'] ); $theme = wp_get_theme( $_GET['stylesheet'] ); if ( ! current_user_can( 'delete_themes' ) ) { wp_die( '

    ' . __( 'You need a higher level of permission.' ) . '

    ' . '

    ' . __( 'Sorry, you are not allowed to delete this item.' ) . '

    ', 403 ); } if ( ! $theme->exists() ) { wp_die( '

    ' . __( 'An error occurred while deleting the theme.' ) . '

    ' . '

    ' . __( 'The requested theme does not exist.' ) . '

    ', 403 ); } $active = wp_get_theme(); if ( $active->get( 'Template' ) === $_GET['stylesheet'] ) { wp_redirect( admin_url( 'themes.php?delete-active-child=true' ) ); } else { delete_theme( $_GET['stylesheet'] ); wp_redirect( admin_url( 'themes.php?deleted=true' ) ); } exit; } elseif ( 'enable-auto-update' === $_GET['action'] ) { if ( ! ( current_user_can( 'update_themes' ) && wp_is_auto_update_enabled_for_type( 'theme' ) ) ) { wp_die( __( 'Sorry, you are not allowed to enable themes automatic updates.' ) ); } check_admin_referer( 'updates' ); $all_items = wp_get_themes(); $auto_updates = (array) get_site_option( 'auto_update_themes', array() ); $auto_updates[] = $_GET['stylesheet']; $auto_updates = array_unique( $auto_updates ); // Remove themes that have been deleted since the site option was last updated. $auto_updates = array_intersect( $auto_updates, array_keys( $all_items ) ); update_site_option( 'auto_update_themes', $auto_updates ); wp_redirect( admin_url( 'themes.php?enabled-auto-update=true' ) ); exit; } elseif ( 'disable-auto-update' === $_GET['action'] ) { if ( ! ( current_user_can( 'update_themes' ) && wp_is_auto_update_enabled_for_type( 'theme' ) ) ) { wp_die( __( 'Sorry, you are not allowed to disable themes automatic updates.' ) ); } check_admin_referer( 'updates' ); $all_items = wp_get_themes(); $auto_updates = (array) get_site_option( 'auto_update_themes', array() ); $auto_updates = array_diff( $auto_updates, array( $_GET['stylesheet'] ) ); // Remove themes that have been deleted since the site option was last updated. $auto_updates = array_intersect( $auto_updates, array_keys( $all_items ) ); update_site_option( 'auto_update_themes', $auto_updates ); wp_redirect( admin_url( 'themes.php?disabled-auto-update=true' ) ); exit; } } // Used in the HTML title tag. $title = __( 'Themes' ); $parent_file = 'themes.php'; // Help tab: Overview. if ( current_user_can( 'switch_themes' ) ) { $help_overview = '

    ' . __( 'This screen is used for managing your installed themes. Aside from the default theme(s) included with your WordPress installation, themes are designed and developed by third parties.' ) . '

    ' . '

    ' . __( 'From this screen you can:' ) . '

    ' . '
    • ' . __( 'Hover or tap to see Activate and Live Preview buttons' ) . '
    • ' . '
    • ' . __( 'Click on the theme to see the theme name, version, author, description, tags, and the Delete link' ) . '
    • ' . '
    • ' . __( 'Click Customize for the active theme or Live Preview for any other theme to see a live preview' ) . '
    ' . '

    ' . __( 'The active theme is displayed highlighted as the first theme.' ) . '

    ' . '

    ' . __( 'The search for installed themes will search for terms in their name, description, author, or tag.' ) . ' ' . __( 'The search results will be updated as you type.' ) . '

    '; get_current_screen()->add_help_tab( array( 'id' => 'overview', 'title' => __( 'Overview' ), 'content' => $help_overview, ) ); } // End if 'switch_themes'. // Help tab: Adding Themes. if ( current_user_can( 'install_themes' ) ) { if ( is_multisite() ) { $help_install = '

    ' . __( 'Installing themes on Multisite can only be done from the Network Admin section.' ) . '

    '; } else { $help_install = '

    ' . sprintf( /* translators: %s: https://wordpress.org/themes/ */ __( 'If you would like to see more themes to choose from, click on the “Add Theme” button and you will be able to browse or search for additional themes from the WordPress Theme Directory. Themes in the WordPress Theme Directory are designed and developed by third parties, and are compatible with the license WordPress uses. Oh, and they are free!' ), __( 'https://wordpress.org/themes/' ) ) . '

    '; } get_current_screen()->add_help_tab( array( 'id' => 'adding-themes', 'title' => __( 'Adding Themes' ), 'content' => $help_install, ) ); } // End if 'install_themes'. // Help tab: Previewing and Customizing. if ( current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) { $help_customize = '

    ' . __( 'Tap or hover on any theme then click the Live Preview button to see a live preview of that theme and change theme options in a separate, full-screen view. You can also find a Live Preview button at the bottom of the theme details screen. Any installed theme can be previewed and customized in this way.' ) . '

    ' . '

    ' . __( 'The theme being previewed is fully interactive — navigate to different pages to see how the theme handles posts, archives, and other page templates. The settings may differ depending on what theme features the theme being previewed supports. To accept the new settings and activate the theme all in one step, click the Activate & Publish button above the menu.' ) . '

    ' . '

    ' . __( 'When previewing on smaller monitors, you can use the collapse icon at the bottom of the left-hand pane. This will hide the pane, giving you more room to preview your site in the new theme. To bring the pane back, click on the collapse icon again.' ) . '

    '; get_current_screen()->add_help_tab( array( 'id' => 'customize-preview-themes', 'title' => __( 'Previewing and Customizing' ), 'content' => $help_customize, ) ); } // End if 'edit_theme_options' && 'customize'. $help_sidebar_autoupdates = ''; // Help tab: Auto-updates. if ( current_user_can( 'update_themes' ) && wp_is_auto_update_enabled_for_type( 'theme' ) ) { $help_tab_autoupdates = '

    ' . __( 'Auto-updates can be enabled or disabled for each individual theme. Themes with auto-updates enabled will display the estimated date of the next auto-update. Auto-updates depends on the WP-Cron task scheduling system.' ) . '

    ' . '

    ' . __( 'Please note: Third-party themes and plugins, or custom code, may override WordPress scheduling.' ) . '

    '; get_current_screen()->add_help_tab( array( 'id' => 'plugins-themes-auto-updates', 'title' => __( 'Auto-updates' ), 'content' => $help_tab_autoupdates, ) ); $help_sidebar_autoupdates = '

    ' . __( 'Documentation on Auto-updates' ) . '

    '; } // End if 'update_themes' && 'wp_is_auto_update_enabled_for_type'. get_current_screen()->set_help_sidebar( '

    ' . __( 'For more information:' ) . '

    ' . '

    ' . __( 'Documentation on Using Themes' ) . '

    ' . '

    ' . __( 'Documentation on Managing Themes' ) . '

    ' . $help_sidebar_autoupdates . '

    ' . __( 'Support forums' ) . '

    ' ); if ( current_user_can( 'switch_themes' ) ) { $themes = wp_prepare_themes_for_js(); } else { $themes = wp_prepare_themes_for_js( array( wp_get_theme() ) ); } $theme = ! empty( $_REQUEST['theme'] ) ? sanitize_text_field( $_REQUEST['theme'] ) : ''; $search = ! empty( $_REQUEST['search'] ) ? sanitize_text_field( $_REQUEST['search'] ) : ''; wp_localize_script( 'theme', '_wpThemeSettings', array( 'themes' => $themes, 'settings' => array( 'canInstall' => ( ! is_multisite() && current_user_can( 'install_themes' ) ), 'installURI' => ( ! is_multisite() && current_user_can( 'install_themes' ) ) ? admin_url( 'theme-install.php' ) : null, 'confirmDelete' => __( "Are you sure you want to delete this theme?\n\nClick 'Cancel' to go back, 'OK' to confirm the delete." ), 'adminUrl' => parse_url( admin_url(), PHP_URL_PATH ), ), 'l10n' => array( 'addNew' => __( 'Add Theme' ), 'search' => __( 'Search installed themes' ), /* translators: %d: Number of themes. */ 'themesFound' => __( 'Number of Themes found: %d' ), 'noThemesFound' => __( 'No themes found. Try a different search.' ), ), ) ); add_thickbox(); wp_enqueue_script( 'theme' ); wp_enqueue_script( 'updates' ); require_once ABSPATH . 'wp-admin/admin-header.php'; ?>


    'message1', 'additional_classes' => array( 'updated' ), 'dismissible' => true, ) ); } elseif ( isset( $_GET['activated'] ) ) { if ( isset( $_GET['previewed'] ) ) { wp_admin_notice( __( 'Settings saved and theme activated.' ) . ' ' . __( 'Visit site' ) . '', array( 'id' => 'message2', 'additional_classes' => array( 'updated' ), 'dismissible' => true, ) ); } else { wp_admin_notice( __( 'New theme activated.' ) . ' ' . __( 'Visit site' ) . '', array( 'id' => 'message2', 'additional_classes' => array( 'updated' ), 'dismissible' => true, ) ); } } elseif ( isset( $_GET['deleted'] ) ) { wp_admin_notice( __( 'Theme deleted.' ), array( 'id' => 'message3', 'additional_classes' => array( 'updated' ), 'dismissible' => true, ) ); } elseif ( isset( $_GET['delete-active-child'] ) ) { wp_admin_notice( __( 'You cannot delete a theme while it has an active child theme.' ), array( 'id' => 'message4', 'additional_classes' => array( 'error' ), ) ); } elseif ( isset( $_GET['resumed'] ) ) { wp_admin_notice( __( 'Theme resumed.' ), array( 'id' => 'message5', 'additional_classes' => array( 'updated' ), 'dismissible' => true, ) ); } elseif ( isset( $_GET['error'] ) && 'resuming' === $_GET['error'] ) { wp_admin_notice( __( 'Theme could not be resumed because it triggered a fatal error.' ), array( 'id' => 'message6', 'additional_classes' => array( 'error' ), ) ); } elseif ( isset( $_GET['enabled-auto-update'] ) ) { wp_admin_notice( __( 'Theme will be auto-updated.' ), array( 'id' => 'message7', 'additional_classes' => array( 'updated' ), 'dismissible' => true, ) ); } elseif ( isset( $_GET['disabled-auto-update'] ) ) { wp_admin_notice( __( 'Theme will no longer be auto-updated.' ), array( 'id' => 'message8', 'additional_classes' => array( 'updated' ), 'dismissible' => true, ) ); } $current_theme = wp_get_theme(); if ( $current_theme->errors() && ( ! is_multisite() || current_user_can( 'manage_network_themes' ) ) ) { wp_admin_notice( '' . __( 'Error:' ) . ' ' . $current_theme->errors()->get_error_message(), array( 'additional_classes' => array( 'error' ), ) ); } $current_theme_actions = array(); if ( is_array( $submenu ) && isset( $submenu['themes.php'] ) ) { $forbidden_paths = array( 'themes.php', 'theme-editor.php', 'site-editor.php', 'edit.php?post_type=wp_navigation', ); foreach ( (array) $submenu['themes.php'] as $item ) { $class = ''; if ( in_array( $item[2], $forbidden_paths, true ) || str_starts_with( $item[2], 'customize.php' ) ) { continue; } // 0 = name, 1 = capability, 2 = file. if ( 0 === strcmp( $self, $item[2] ) && empty( $parent_file ) || $parent_file && $item[2] === $parent_file ) { $class = ' current'; } if ( ! empty( $submenu[ $item[2] ] ) ) { $submenu[ $item[2] ] = array_values( $submenu[ $item[2] ] ); // Re-index. $menu_hook = get_plugin_page_hook( $submenu[ $item[2] ][0][2], $item[2] ); if ( file_exists( WP_PLUGIN_DIR . "/{$submenu[$item[2]][0][2]}" ) || ! empty( $menu_hook ) ) { $current_theme_actions[] = "{$item[0]}"; } else { $current_theme_actions[] = "{$item[0]}"; } } elseif ( ! empty( $item[2] ) && current_user_can( $item[1] ) ) { $menu_file = $item[2]; if ( current_user_can( 'customize' ) ) { if ( 'custom-header' === $menu_file ) { $current_theme_actions[] = "{$item[0]}"; } elseif ( 'custom-background' === $menu_file ) { $current_theme_actions[] = "{$item[0]}"; } } $pos = strpos( $menu_file, '?' ); if ( false !== $pos ) { $menu_file = substr( $menu_file, 0, $pos ); } if ( file_exists( ABSPATH . "wp-admin/$menu_file" ) ) { $current_theme_actions[] = "{$item[0]}"; } else { $current_theme_actions[] = "{$item[0]}"; } } } } $class_name = 'theme-browser'; if ( ! empty( $_GET['search'] ) ) { $class_name .= ' search-loading'; } ?>
    Update now' ); } else { $new_version_available = __( 'New version available.' ); } wp_admin_notice( $new_version_available, array( 'type' => 'warning', 'additional_classes' => array( 'notice-alt', 'inline', 'update-message' ), ) ); else : $theme_update_error = ''; if ( ! $theme['updateResponse']['compatibleWP'] && ! $theme['updateResponse']['compatiblePHP'] ) { $theme_update_error .= sprintf( /* translators: %s: Theme name. */ __( 'There is a new version of %s available, but it does not work with your versions of WordPress and PHP.' ), $theme['name'] ); if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) { $theme_update_error .= sprintf( /* translators: 1: URL to WordPress Updates screen, 2: URL to Update PHP page. */ ' ' . __( 'Please update WordPress, and then learn more about updating PHP.' ), self_admin_url( 'update-core.php' ), esc_url( wp_get_update_php_url() ) ); wp_update_php_annotation( '

    ', '', false ); } elseif ( current_user_can( 'update_core' ) ) { $theme_update_error .= sprintf( /* translators: %s: URL to WordPress Updates screen. */ ' ' . __( 'Please update WordPress.' ), self_admin_url( 'update-core.php' ) ); } elseif ( current_user_can( 'update_php' ) ) { $theme_update_error .= sprintf( /* translators: %s: URL to Update PHP page. */ ' ' . __( 'Learn more about updating PHP.' ), esc_url( wp_get_update_php_url() ) ); wp_update_php_annotation( '

    ', '', false ); } } elseif ( ! $theme['updateResponse']['compatibleWP'] ) { $theme_update_error .= sprintf( /* translators: %s: Theme name. */ __( 'There is a new version of %s available, but it does not work with your version of WordPress.' ), $theme['name'] ); if ( current_user_can( 'update_core' ) ) { $theme_update_error .= sprintf( /* translators: %s: URL to WordPress Updates screen. */ ' ' . __( 'Please update WordPress.' ), self_admin_url( 'update-core.php' ) ); } } elseif ( ! $theme['updateResponse']['compatiblePHP'] ) { $theme_update_error .= sprintf( /* translators: %s: Theme name. */ __( 'There is a new version of %s available, but it does not work with your version of PHP.' ), $theme['name'] ); if ( current_user_can( 'update_php' ) ) { $theme_update_error .= sprintf( /* translators: %s: URL to Update PHP page. */ ' ' . __( 'Learn more about updating PHP.' ), esc_url( wp_get_update_php_url() ) ); wp_update_php_annotation( '

    ', '', false ); } } wp_admin_notice( $theme_update_error, array( 'type' => 'error', 'additional_classes' => array( 'notice-alt', 'inline', 'update-message' ), ) ); endif; endif; if ( ! $theme['compatibleWP'] || ! $theme['compatiblePHP'] ) { $message = ''; if ( ! $theme['compatibleWP'] && ! $theme['compatiblePHP'] ) { $message = __( 'This theme does not work with your versions of WordPress and PHP.' ); if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) { $message .= sprintf( /* translators: 1: URL to WordPress Updates screen, 2: URL to Update PHP page. */ ' ' . __( 'Please update WordPress, and then learn more about updating PHP.' ), self_admin_url( 'update-core.php' ), esc_url( wp_get_update_php_url() ) ); $message .= wp_update_php_annotation( '

    ', '', false ); } elseif ( current_user_can( 'update_core' ) ) { $message .= sprintf( /* translators: %s: URL to WordPress Updates screen. */ ' ' . __( 'Please update WordPress.' ), self_admin_url( 'update-core.php' ) ); } elseif ( current_user_can( 'update_php' ) ) { $message .= sprintf( /* translators: %s: URL to Update PHP page. */ ' ' . __( 'Learn more about updating PHP.' ), esc_url( wp_get_update_php_url() ) ); $message .= wp_update_php_annotation( '

    ', '', false ); } } elseif ( ! $theme['compatibleWP'] ) { $message .= __( 'This theme does not work with your version of WordPress.' ); if ( current_user_can( 'update_core' ) ) { $message .= sprintf( /* translators: %s: URL to WordPress Updates screen. */ ' ' . __( 'Please update WordPress.' ), self_admin_url( 'update-core.php' ) ); } } elseif ( ! $theme['compatiblePHP'] ) { $message .= __( 'This theme does not work with your version of PHP.' ); if ( current_user_can( 'update_php' ) ) { $message .= sprintf( /* translators: %s: URL to Update PHP page. */ ' ' . __( 'Learn more about updating PHP.' ), esc_url( wp_get_update_php_url() ) ); $message .= wp_update_php_annotation( '

    ', '', false ); } } wp_admin_notice( $message, array( 'type' => 'error', 'additional_classes' => array( 'inline', 'notice-alt' ), ) ); } /* translators: %s: Theme name. */ $details_aria_label = sprintf( _x( 'View Theme Details for %s', 'theme' ), $theme['name'] ); ?>

    true ) ); if ( ! is_multisite() && $broken_themes ) { ?>

    errors()->get_error_code() ) { $stylesheet = $broken_theme->get_stylesheet(); $resume_url = add_query_arg( array( 'action' => 'resume', 'stylesheet' => urlencode( $stylesheet ), ), admin_url( 'themes.php' ) ); $resume_url = wp_nonce_url( $resume_url, 'resume-theme_' . $stylesheet ); ?> get_stylesheet(); $delete_url = add_query_arg( array( 'action' => 'delete', 'stylesheet' => urlencode( $stylesheet ), ), admin_url( 'themes.php' ) ); $delete_url = wp_nonce_url( $delete_url, 'delete-theme_' . $stylesheet ); ?> errors()->get_error_code() ) { $parent_theme_name = $broken_theme->get( 'Template' ); $parent_theme = themes_api( 'theme_information', array( 'slug' => urlencode( $parent_theme_name ) ) ); if ( ! is_wp_error( $parent_theme ) ) { $install_url = add_query_arg( array( 'action' => 'install-theme', 'theme' => urlencode( $parent_theme_name ), ), admin_url( 'update.php' ) ); $install_url = wp_nonce_url( $install_url, 'install-theme_' . $parent_theme_name ); ?>
    get( 'Name' ) ? $broken_theme->display( 'Name' ) : esc_html( $broken_theme->get_stylesheet() ); ?> errors()->get_error_message(); ?>
    'error', 'additional_classes' => array( 'notice-alt', 'inline', 'hidden' ), ) ); $template = '
    <# if ( data.autoupdate.supported ) { #> <# if ( data.autoupdate.forced === false ) { #> ' . __( 'Auto-updates disabled' ) . ' <# } else if ( data.autoupdate.forced ) { #> ' . __( 'Auto-updates enabled' ) . ' <# } else if ( data.autoupdate.enabled ) { #> <# } else { #> <# } #> <# } #> <# if ( data.hasUpdate ) { #> <# if ( data.autoupdate.supported && data.autoupdate.enabled ) { #> <# } else { #> <# } #> ' . $notice . '
    '; /** * Filters the JavaScript template used to display the auto-update setting for a theme (in the overlay). * * See {@see wp_prepare_themes_for_js()} for the properties of the `data` object. * * @since 5.5.0 * * @param string $template The template for displaying the auto-update setting link. */ return apply_filters( 'theme_auto_update_setting_template', $template ); } /* * The tmpl-theme template is synchronized with PHP above! */ ?> wp_get_update_data(), ) ); require_once ABSPATH . 'wp-admin/admin-footer.php'; PKZEsmmoptions-head.phpnu[*').length > 1 ) { w = wpgallery.getWin(); $('#save-all, #gallery-settings').show(); if ( typeof w.tinyMCE !== 'undefined' && w.tinyMCE.activeEditor && ! w.tinyMCE.activeEditor.isHidden() ) { wpgallery.mcemode = true; wpgallery.init(); } else { $('#insert-gallery').show(); } } }); /* gallery settings */ window.tinymce = null; window.wpgallery = { mcemode : false, editor : {}, dom : {}, is_update : false, el : {}, I : function(e) { return document.getElementById(e); }, init: function() { var t = this, li, q, i, it, w = t.getWin(); if ( ! t.mcemode ) { return; } li = ('' + document.location.search).replace(/^\?/, '').split('&'); q = {}; for (i=0; i 250 && ( targetWidth + 30 > widgetWidth ) && widget.closest('div.widgets-sortables').length ) { if ( widget.closest('div.widget-liquid-right').length ) { margin = isRTL ? 'margin-right' : 'margin-left'; } else { margin = isRTL ? 'margin-left' : 'margin-right'; } css[ margin ] = widgetWidth - ( targetWidth + 30 ) + 'px'; widget.css( css ); } /* * Don't change the order of attributes changes and animation: * it's important for screen readers, see ticket #31476. */ toggleBtn.attr( 'aria-expanded', 'true' ); inside.slideDown( 'fast', function() { widget.addClass( 'open' ); }); } else { /* * Don't change the order of attributes changes and animation: * it's important for screen readers, see ticket #31476. */ toggleBtn.attr( 'aria-expanded', 'false' ); inside.slideUp( 'fast', function() { widget.attr( 'style', '' ); widget.removeClass( 'open' ); }); } } else if ( target.hasClass('widget-control-save') ) { wpWidgets.save( target.closest('div.widget'), 0, 1, 0 ); e.preventDefault(); } else if ( target.hasClass('widget-control-remove') ) { wpWidgets.save( target.closest('div.widget'), 1, 1, 0 ); } else if ( target.hasClass('widget-control-close') ) { widget = target.closest('div.widget'); widget.removeClass( 'open' ); toggleBtn.attr( 'aria-expanded', 'false' ); wpWidgets.close( widget ); } else if ( target.attr( 'id' ) === 'inactive-widgets-control-remove' ) { wpWidgets.removeInactiveWidgets(); e.preventDefault(); } }); sidebars.children('.widget').each( function() { var $this = $(this); wpWidgets.appendTitle( this ); if ( $this.find( 'p.widget-error' ).length ) { $this.find( '.widget-action' ).trigger( 'click' ).attr( 'aria-expanded', 'true' ); } }); $('#widget-list').children('.widget').draggable({ connectToSortable: 'div.widgets-sortables', handle: '> .widget-top > .widget-title', distance: 2, helper: 'clone', zIndex: 101, containment: '#wpwrap', refreshPositions: true, start: function( event, ui ) { var chooser = $(this).find('.widgets-chooser'); ui.helper.find('div.widget-description').hide(); the_id = this.id; if ( chooser.length ) { // Hide the chooser and move it out of the widget. $( '#wpbody-content' ).append( chooser.hide() ); // Delete the cloned chooser from the drag helper. ui.helper.find('.widgets-chooser').remove(); self.clearWidgetSelection(); } }, stop: function() { if ( rem ) { $(rem).hide(); } rem = ''; } }); /** * Opens and closes previously closed Sidebars when Widgets are dragged over/out of them. */ sidebars.droppable( { tolerance: 'intersect', /** * Open Sidebar when a Widget gets dragged over it. * * @ignore * * @param {Object} event jQuery event object. */ over: function( event ) { var $wrap = $( event.target ).parent(); if ( wpWidgets.hoveredSidebar && ! $wrap.is( wpWidgets.hoveredSidebar ) ) { // Close the previous Sidebar as the Widget has been dragged onto another Sidebar. wpWidgets.closeSidebar( event ); } if ( $wrap.hasClass( 'closed' ) ) { wpWidgets.hoveredSidebar = $wrap; $wrap .removeClass( 'closed' ) .find( '.handlediv' ).attr( 'aria-expanded', 'true' ); } $( this ).sortable( 'refresh' ); }, /** * Close Sidebar when the Widget gets dragged out of it. * * @ignore * * @param {Object} event jQuery event object. */ out: function( event ) { if ( wpWidgets.hoveredSidebar ) { wpWidgets.closeSidebar( event ); } } } ); sidebars.sortable({ placeholder: 'widget-placeholder', items: '> .widget', handle: '> .widget-top > .widget-title', cursor: 'move', distance: 2, containment: '#wpwrap', tolerance: 'pointer', refreshPositions: true, start: function( event, ui ) { var height, $this = $(this), $wrap = $this.parent(), inside = ui.item.children('.widget-inside'); if ( inside.css('display') === 'block' ) { ui.item.removeClass('open'); ui.item.find( '.widget-top button.widget-action' ).attr( 'aria-expanded', 'false' ); inside.hide(); $(this).sortable('refreshPositions'); } if ( ! $wrap.hasClass('closed') ) { // Lock all open sidebars min-height when starting to drag. // Prevents jumping when dragging a widget from an open sidebar to a closed sidebar below. height = ui.item.hasClass('ui-draggable') ? $this.height() : 1 + $this.height(); $this.css( 'min-height', height + 'px' ); } }, stop: function( event, ui ) { var addNew, widgetNumber, $sidebar, $children, child, item, $widget = ui.item, id = the_id; // Reset the var to hold a previously closed sidebar. wpWidgets.hoveredSidebar = null; if ( $widget.hasClass('deleting') ) { wpWidgets.save( $widget, 1, 0, 1 ); // Delete widget. $widget.remove(); return; } addNew = $widget.find('input.add_new').val(); widgetNumber = $widget.find('input.multi_number').val(); $widget.attr( 'style', '' ).removeClass('ui-draggable'); the_id = ''; if ( addNew ) { if ( 'multi' === addNew ) { $widget.html( $widget.html().replace( /<[^<>]+>/g, function( tag ) { return tag.replace( /__i__|%i%/g, widgetNumber ); }) ); $widget.attr( 'id', id.replace( '__i__', widgetNumber ) ); widgetNumber++; $( 'div#' + id ).find( 'input.multi_number' ).val( widgetNumber ); } else if ( 'single' === addNew ) { $widget.attr( 'id', 'new-' + id ); rem = 'div#' + id; } wpWidgets.save( $widget, 0, 0, 1 ); $widget.find('input.add_new').val(''); $document.trigger( 'widget-added', [ $widget ] ); } $sidebar = $widget.parent(); if ( $sidebar.parent().hasClass('closed') ) { $sidebar.parent() .removeClass( 'closed' ) .find( '.handlediv' ).attr( 'aria-expanded', 'true' ); $children = $sidebar.children('.widget'); // Make sure the dropped widget is at the top. if ( $children.length > 1 ) { child = $children.get(0); item = $widget.get(0); if ( child.id && item.id && child.id !== item.id ) { $( child ).before( $widget ); } } } if ( addNew ) { $widget.find( '.widget-action' ).trigger( 'click' ); } else { wpWidgets.saveOrder( $sidebar.attr('id') ); } }, activate: function() { $(this).parent().addClass( 'widget-hover' ); }, deactivate: function() { // Remove all min-height added on "start". $(this).css( 'min-height', '' ).parent().removeClass( 'widget-hover' ); }, receive: function( event, ui ) { var $sender = $( ui.sender ); // Don't add more widgets to orphaned sidebars. if ( this.id.indexOf('orphaned_widgets') > -1 ) { $sender.sortable('cancel'); return; } // If the last widget was moved out of an orphaned sidebar, close and remove it. if ( $sender.attr('id').indexOf('orphaned_widgets') > -1 && ! $sender.children('.widget').length ) { $sender.parents('.orphan-sidebar').slideUp( 400, function(){ $(this).remove(); } ); } } }).sortable( 'option', 'connectWith', 'div.widgets-sortables' ); $('#available-widgets').droppable({ tolerance: 'pointer', accept: function(o){ return $(o).parent().attr('id') !== 'widget-list'; }, drop: function(e,ui) { ui.draggable.addClass('deleting'); $('#removing-widget').hide().children('span').empty(); }, over: function(e,ui) { ui.draggable.addClass('deleting'); $('div.widget-placeholder').hide(); if ( ui.draggable.hasClass('ui-sortable-helper') ) { $('#removing-widget').show().children('span') .html( ui.draggable.find( 'div.widget-title' ).children( 'h3' ).html() ); } }, out: function(e,ui) { ui.draggable.removeClass('deleting'); $('div.widget-placeholder').show(); $('#removing-widget').hide().children('span').empty(); } }); // Area Chooser. $( '#widgets-right .widgets-holder-wrap' ).each( function( index, element ) { var $element = $( element ), name = $element.find( '.sidebar-name h2' ).text() || '', ariaLabel = $element.find( '.sidebar-name' ).data( 'add-to' ), id = $element.find( '.widgets-sortables' ).attr( 'id' ), li = $( '
  • ' ), button = $( '
  • '),k("#pending-menu-items-to-delete li .separator").html(", "),k("#pending-menu-items-to-delete li .separator").last().html(".")})},setBulkDeleteCheckboxStatus:function(){var e=k("#menu-to-edit .menu-item-checkbox");k.each(e,function(){k(this).prop("disabled")?k(this).prop("disabled",!1):k(this).prop("disabled",!0),k(this).is(":checked")&&k(this).prop("checked",!1)}),this.setRemoveSelectedButtonStatus()},setRemoveSelectedButtonStatus:function(){var e=k(".menu-items-delete");0'}),k("#update-nav-menu").append(e),I.menuList.find(".menu-item-data-position").val(function(e){return e+1}),!(window.onbeforeunload=null)):(t.parent().addClass("form-invalid"),!1)},eventOnClickMenuDelete:function(){return!!window.confirm(wp.i18n.__("You are about to permanently delete this menu.\n'Cancel' to stop, 'OK' to delete."))&&!(window.onbeforeunload=null)},eventOnClickMenuItemDelete:function(e){e=parseInt(e.id.replace("delete-",""),10);return I.removeMenuItem(k("#menu-item-"+e)),I.registerChange(),!1},processQuickSearchQueryResponse:function(e,t,n){var i,a,s,o={},m=document.getElementById("nav-menu-meta"),u=/menu-item[(\[^]\]*/,e=k("
    ").html(e).find("li"),d=n.closest(".accordion-section-content"),r=d.find(".button-controls .select-all");e.length?(e.each(function(){if(s=k(this),(i=u.exec(s.html()))&&i[1]){for(a=i[1];m.elements["menu-item["+a+"][menu-item-type]"]||o[a];)a--;o[a]=!0,a!=i[1]&&s.html(s.html().replace(new RegExp("menu-item\\["+i[1]+"\\]","g"),"menu-item["+a+"]"))}}),k(".categorychecklist",n).html(e),k(".spinner",n).removeClass("is-active"),d.removeClass("has-no-menu-item"),r.is(":checked")&&r.prop("checked",!1)):(k(".categorychecklist",n).html("
  • "+wp.i18n.__("No results found.")+"

  • "),k(".spinner",n).removeClass("is-active"),d.addClass("has-no-menu-item"))},removeMenuItem:function(t){var n=t.childMenuItems();k(document).trigger("menu-removing-item",[t]),t.addClass("deleting").animate({opacity:0,height:0},350,function(){var e=k("#menu-instructions");t.remove(),n.shiftDepthClass(-1).updateParentMenuItemDBId(),0===k("#menu-to-edit li").length&&(k(".drag-instructions").hide(),e.removeClass("menu-instructions-inactive")),I.refreshAdvancedAccessibility(),wp.a11y.speak(menus.itemRemoved),k("#menu-to-edit").updateParentDropdown(),k("#menu-to-edit").updateOrderDropdown()})},depthToPx:function(e){return e*I.options.menuItemDepthPerLevel},pxToDepth:function(e){return Math.floor(e/I.options.menuItemDepthPerLevel)}};k(function(){wpNavMenu.init(),k(".menu-edit a, .menu-edit button, .menu-edit input, .menu-edit textarea, .menu-edit select").on("focus",function(){var e,t,n;783<=window.innerWidth&&(e=k("#nav-menu-footer").height()+20,0<(t=k(this).offset().top-(k(window).scrollTop()+k(window).height()-k(this).height()))&&(t=0),(t*=-1)' + count + '' ); } else if ( 'recommended' === issue.status ) { heading = sprintf( _n( '%s recommended improvement', '%s recommended improvements', count ), '' + count + '' ); } else if ( 'good' === issue.status ) { heading = sprintf( _n( '%s item with no issues detected', '%s items with no issues detected', count ), '' + count + '' ); } if ( heading ) { $( '.site-health-issue-count-title', issueWrapper ).html( heading ); } menuCounter.text( SiteHealth.site_status.issues.critical ); if ( 0 < parseInt( SiteHealth.site_status.issues.critical, 0 ) ) { $( '#health-check-issues-critical' ).removeClass( 'hidden' ); menuCounterWrapper.removeClass( 'count-0' ); } else { menuCounterWrapper.addClass( 'count-0' ); } if ( 0 < parseInt( SiteHealth.site_status.issues.recommended, 0 ) ) { $( '#health-check-issues-recommended' ).removeClass( 'hidden' ); } $( '.issues', '#health-check-issues-' + issue.status ).append( template( issue ) ); } /** * Updates site health status indicator as asynchronous tests are run and returned. * * @since 5.2.0 */ function recalculateProgression() { var r, c, pct; var $progress = $( '.site-health-progress' ); var $wrapper = $progress.closest( '.site-health-progress-wrapper' ); var $progressLabel = $( '.site-health-progress-label', $wrapper ); var $circle = $( '.site-health-progress svg #bar' ); var totalTests = parseInt( SiteHealth.site_status.issues.good, 0 ) + parseInt( SiteHealth.site_status.issues.recommended, 0 ) + ( parseInt( SiteHealth.site_status.issues.critical, 0 ) * 1.5 ); var failedTests = ( parseInt( SiteHealth.site_status.issues.recommended, 0 ) * 0.5 ) + ( parseInt( SiteHealth.site_status.issues.critical, 0 ) * 1.5 ); var val = 100 - Math.ceil( ( failedTests / totalTests ) * 100 ); if ( 0 === totalTests ) { $progress.addClass( 'hidden' ); return; } $wrapper.removeClass( 'loading' ); r = $circle.attr( 'r' ); c = Math.PI * ( r * 2 ); if ( 0 > val ) { val = 0; } if ( 100 < val ) { val = 100; } pct = ( ( 100 - val ) / 100 ) * c + 'px'; $circle.css( { strokeDashoffset: pct } ); if ( 80 <= val && 0 === parseInt( SiteHealth.site_status.issues.critical, 0 ) ) { $wrapper.addClass( 'green' ).removeClass( 'orange' ); $progressLabel.text( __( 'Good' ) ); announceTestsProgression( 'good' ); } else { $wrapper.addClass( 'orange' ).removeClass( 'green' ); $progressLabel.text( __( 'Should be improved' ) ); announceTestsProgression( 'improvable' ); } if ( isStatusTab ) { $.post( ajaxurl, { 'action': 'health-check-site-status-result', '_wpnonce': SiteHealth.nonce.site_status_result, 'counts': SiteHealth.site_status.issues } ); if ( 100 === val ) { $( '.site-status-all-clear' ).removeClass( 'hide' ); $( '.site-status-has-issues' ).addClass( 'hide' ); } } } /** * Queues the next asynchronous test when we're ready to run it. * * @since 5.2.0 */ function maybeRunNextAsyncTest() { var doCalculation = true; if ( 1 <= SiteHealth.site_status.async.length ) { $.each( SiteHealth.site_status.async, function() { var data = { 'action': 'health-check-' + this.test.replace( '_', '-' ), '_wpnonce': SiteHealth.nonce.site_status }; if ( this.completed ) { return true; } doCalculation = false; this.completed = true; if ( 'undefined' !== typeof( this.has_rest ) && this.has_rest ) { wp.apiRequest( { url: wp.url.addQueryArgs( this.test, { _locale: 'user' } ), headers: this.headers } ) .done( function( response ) { /** This filter is documented in wp-admin/includes/class-wp-site-health.php */ appendIssue( wp.hooks.applyFilters( 'site_status_test_result', response ) ); } ) .fail( function( response ) { var description; if ( 'undefined' !== typeof( response.responseJSON ) && 'undefined' !== typeof( response.responseJSON.message ) ) { description = response.responseJSON.message; } else { description = __( 'No details available' ); } addFailedSiteHealthCheckNotice( this.url, description ); } ) .always( function() { maybeRunNextAsyncTest(); } ); } else { $.post( ajaxurl, data ).done( function( response ) { /** This filter is documented in wp-admin/includes/class-wp-site-health.php */ appendIssue( wp.hooks.applyFilters( 'site_status_test_result', response.data ) ); } ).fail( function( response ) { var description; if ( 'undefined' !== typeof( response.responseJSON ) && 'undefined' !== typeof( response.responseJSON.message ) ) { description = response.responseJSON.message; } else { description = __( 'No details available' ); } addFailedSiteHealthCheckNotice( this.url, description ); } ).always( function() { maybeRunNextAsyncTest(); } ); } return false; } ); } if ( doCalculation ) { recalculateProgression(); } } /** * Add the details of a failed asynchronous test to the list of test results. * * @since 5.6.0 */ function addFailedSiteHealthCheckNotice( url, description ) { var issue; issue = { 'status': 'recommended', 'label': __( 'A test is unavailable' ), 'badge': { 'color': 'red', 'label': __( 'Unavailable' ) }, 'description': '

    ' + url + '

    ' + description + '

    ', 'actions': '' }; /** This filter is documented in wp-admin/includes/class-wp-site-health.php */ appendIssue( wp.hooks.applyFilters( 'site_status_test_result', issue ) ); } if ( 'undefined' !== typeof SiteHealth ) { if ( 0 === SiteHealth.site_status.direct.length && 0 === SiteHealth.site_status.async.length ) { recalculateProgression(); } else { SiteHealth.site_status.issues = { 'good': 0, 'recommended': 0, 'critical': 0 }; } if ( 0 < SiteHealth.site_status.direct.length ) { $.each( SiteHealth.site_status.direct, function() { appendIssue( this ); } ); } if ( 0 < SiteHealth.site_status.async.length ) { maybeRunNextAsyncTest(); } else { recalculateProgression(); } } function getDirectorySizes() { var timestamp = ( new Date().getTime() ); // After 3 seconds announce that we're still waiting for directory sizes. var timeout = window.setTimeout( function() { announceTestsProgression( 'waiting-for-directory-sizes' ); }, 3000 ); wp.apiRequest( { path: '/wp-site-health/v1/directory-sizes' } ).done( function( response ) { updateDirSizes( response || {} ); } ).always( function() { var delay = ( new Date().getTime() ) - timestamp; $( '.health-check-wp-paths-sizes.spinner' ).css( 'visibility', 'hidden' ); if ( delay > 3000 ) { /* * We have announced that we're waiting. * Announce that we're ready after giving at least 3 seconds * for the first announcement to be read out, or the two may collide. */ if ( delay > 6000 ) { delay = 0; } else { delay = 6500 - delay; } window.setTimeout( function() { recalculateProgression(); }, delay ); } else { // Cancel the announcement. window.clearTimeout( timeout ); } $( document ).trigger( 'site-health-info-dirsizes-done' ); } ); } function updateDirSizes( data ) { var copyButton = $( 'button.button.copy-button' ); var clipboardText = copyButton.attr( 'data-clipboard-text' ); $.each( data, function( name, value ) { var text = value.debug || value.size; if ( typeof text !== 'undefined' ) { clipboardText = clipboardText.replace( name + ': loading...', name + ': ' + text ); } } ); copyButton.attr( 'data-clipboard-text', clipboardText ); pathsSizesSection.find( 'td[class]' ).each( function( i, element ) { var td = $( element ); var name = td.attr( 'class' ); if ( data.hasOwnProperty( name ) && data[ name ].size ) { td.text( data[ name ].size ); } } ); } if ( isDebugTab ) { if ( pathsSizesSection.length ) { getDirectorySizes(); } else { recalculateProgression(); } } // Trigger a class toggle when the extended menu button is clicked. $( '.health-check-offscreen-nav-wrapper' ).on( 'click', function() { $( this ).toggleClass( 'visible' ); } ); /** * Announces to assistive technologies the tests progression status. * * @since 6.4.0 * * @param {string} type The type of message to be announced. * * @return {void} */ function announceTestsProgression( type ) { // Only announce the messages in the Site Health pages. if ( 'site-health' !== SiteHealth.screen ) { return; } switch ( type ) { case 'good': wp.a11y.speak( __( 'All site health tests have finished running. Your site is looking good.' ) ); break; case 'improvable': wp.a11y.speak( __( 'All site health tests have finished running. There are items that should be addressed.' ) ); break; case 'waiting-for-directory-sizes': wp.a11y.speak( __( 'Running additional tests... please wait.' ) ); break; default: return; } } } ); PKZ js/inline-edit-tax.min.jsnu[/*! This file is auto-generated */ window.wp=window.wp||{},function(s,l){window.inlineEditTax={init:function(){var t=this,i=s("#inline-edit");t.type=s("#the-list").attr("data-wp-lists").substr(5),t.what="#"+t.type+"-",s("#the-list").on("click",".editinline",function(){s(this).attr("aria-expanded","true"),inlineEditTax.edit(this)}),i.on("keyup",function(t){if(27===t.which)return inlineEditTax.revert()}),s(".cancel",i).on("click",function(){return inlineEditTax.revert()}),s(".save",i).on("click",function(){return inlineEditTax.save(this)}),s("input, select",i).on("keydown",function(t){if(13===t.which)return inlineEditTax.save(this)}),s('#posts-filter input[type="submit"]').on("mousedown",function(){t.revert()})},toggle:function(t){var i=this;"none"===s(i.what+i.getId(t)).css("display")?i.revert():i.edit(t)},edit:function(t){var i,e,n=this;return n.revert(),"object"==typeof t&&(t=n.getId(t)),i=s("#inline-edit").clone(!0),e=s("#inline_"+t),s("td",i).attr("colspan",s("th:visible, td:visible",".wp-list-table.widefat:first thead").length),s(n.what+t).hide().after(i).after(''),(n=s(".name",e)).find("img").replaceWith(function(){return this.alt}),n=n.text(),s(':input[name="name"]',i).val(n),(n=s(".slug",e)).find("img").replaceWith(function(){return this.alt}),n=n.text(),s(':input[name="slug"]',i).val(n),s(i).attr("id","edit-"+t).addClass("inline-editor").show(),s(".ptitle",i).eq(0).trigger("focus"),!1},save:function(d){var t=s('input[name="taxonomy"]').val()||"";return"object"==typeof d&&(d=this.getId(d)),s("table.widefat .spinner").addClass("is-active"),t={action:"inline-save-tax",tax_type:this.type,tax_ID:d,taxonomy:t},t=s("#edit-"+d).find(":input").serialize()+"&"+s.param(t),s.post(ajaxurl,t,function(t){var i,e,n,a=s("#edit-"+d+" .inline-edit-save .notice-error"),r=a.find(".error");s("table.widefat .spinner").removeClass("is-active"),t?-1!==t.indexOf("").text(e),a||((t=o('")).on("click keypress",function(t){"click"!==t.type&&13!==t.keyCode&&32!==t.keyCode||(13!==t.keyCode&&32!==t.keyCode||o(this).closest(".tagsdiv").find("input.newtag").trigger("focus"),tagBox.userAction="remove",tagBox.parseTags(this))}),e.prepend(" ").prepend(t)),i.append(e))}),tagBox.screenReadersMessage())},flushTags:function(t,e,a){var i,n,s=o(".the-tags",t),c=o("input.newtag",t);return void 0!==(n=(e=e||!1)?o(e).text():c.val())&&""!==n&&(i=s.val(),i=this.clean(i=i?i+r+n:n),i=array_unique_noempty(i.split(r)).join(r),s.val(i),this.quickClicks(t),e||c.val(""),void 0===a)&&c.trigger("focus"),!1},get:function(a){var i=a.substr(a.indexOf("-")+1);o.post(ajaxurl,{action:"get-tagcloud",tax:i},function(t,e){0!==t&&"success"==e&&(t=o('
    '+t+"
    "),o("a",t).on("click",function(){return tagBox.userAction="add",tagBox.flushTags(o("#"+i),this),!1}),o("#"+a).after(t))})},userAction:"",screenReadersMessage:function(){var t;switch(this.userAction){case"remove":t=wp.i18n.__("Term removed.");break;case"add":t=wp.i18n.__("Term added.");break;default:return}window.wp.a11y.speak(t,"assertive")},init:function(){var t=o("div.ajaxtag");o(".tagsdiv").each(function(){tagBox.quickClicks(this)}),o(".tagadd",t).on("click",function(){tagBox.userAction="add",tagBox.flushTags(o(this).closest(".tagsdiv"))}),o("input.newtag",t).on("keypress",function(t){13==t.which&&(tagBox.userAction="add",tagBox.flushTags(o(this).closest(".tagsdiv")),t.preventDefault(),t.stopPropagation())}).each(function(t,e){o(e).wpTagsSuggest()}),o("#post").on("submit",function(){o("div.tagsdiv").each(function(){tagBox.flushTags(this,!1,1)})}),o(".tagcloud-link").on("click",function(){tagBox.get(o(this).attr("id")),o(this).attr("aria-expanded","true").off().on("click",function(){o(this).attr("aria-expanded","false"===o(this).attr("aria-expanded")?"true":"false").siblings(".the-tagcloud").toggle()})})}}}(jQuery);PKZ_Ws> js/color-picker.min.jsnu[/*! This file is auto-generated */ !function(i,t){var a=wp.i18n.__;i.widget("wp.wpColorPicker",{options:{defaultColor:!1,change:!1,clear:!1,hide:!0,palettes:!0,width:255,mode:"hsv",type:"full",slider:"horizontal"},_createHueOnly:function(){var e,o=this,t=o.element;t.hide(),e="hsl("+t.val()+", 100, 50)",t.iris({mode:"hsl",type:"hue",hide:!1,color:e,change:function(e,t){"function"==typeof o.options.change&&o.options.change.call(this,e,t)},width:o.options.width,slider:o.options.slider})},_create:function(){if(i.support.iris){var o=this,e=o.element;if(i.extend(o.options,e.data()),"hue"===o.options.type)return o._createHueOnly();o.close=o.close.bind(o),o.initialValue=e.val(),e.addClass("wp-color-picker"),e.parent("label").length||(e.wrap(""),o.wrappingLabelText=i('').insertBefore(e).text(a("Color value"))),o.wrappingLabel=e.parent(),o.wrappingLabel.wrap('
    '),o.wrap=o.wrappingLabel.parent(),o.toggler=i('').insertBefore(o.wrappingLabel).css({backgroundColor:o.initialValue}),o.toggler.find(".wp-color-result-text").text(a("Select Color")),o.pickerContainer=i('
    ').insertAfter(o.wrappingLabel),o.button=i(''),o.options.defaultColor?o.button.addClass("wp-picker-default").val(a("Default")).attr("aria-label",a("Select default color")):o.button.addClass("wp-picker-clear").val(a("Clear")).attr("aria-label",a("Clear color")),o.wrappingLabel.wrap('
    ' ); var clone = $('.quick-draft-textarea-clone'), editor = $('#content'), editorHeight = editor.height(), /* * 100px roughly accounts for browser chrome and allows the * save draft button to show on-screen at the same time. */ editorMaxHeight = $(window).height() - 100; /* * Match up textarea and clone div as much as possible. * Padding cannot be reliably retrieved using shorthand in all browsers. */ clone.css({ 'font-family': editor.css('font-family'), 'font-size': editor.css('font-size'), 'line-height': editor.css('line-height'), 'padding-bottom': editor.css('paddingBottom'), 'padding-left': editor.css('paddingLeft'), 'padding-right': editor.css('paddingRight'), 'padding-top': editor.css('paddingTop'), 'white-space': 'pre-wrap', 'word-wrap': 'break-word', 'display': 'none' }); // The 'propertychange' is used in IE < 9. editor.on('focus input propertychange', function() { var $this = $(this), // Add a non-breaking space to ensure that the height of a trailing newline is // included. textareaContent = $this.val() + ' ', // Add 2px to compensate for border-top & border-bottom. cloneHeight = clone.css('width', $this.css('width')).text(textareaContent).outerHeight() + 2; // Default to show a vertical scrollbar, if needed. editor.css('overflow-y', 'auto'); // Only change the height if it has changed and both heights are below the max. if ( cloneHeight === editorHeight || ( cloneHeight >= editorMaxHeight && editorHeight >= editorMaxHeight ) ) { return; } /* * Don't allow editor to exceed the height of the window. * This is also bound in CSS to a max-height of 1300px to be extra safe. */ if ( cloneHeight > editorMaxHeight ) { editorHeight = editorMaxHeight; } else { editorHeight = cloneHeight; } // Disable scrollbars because we adjust the height to the content. editor.css('overflow', 'hidden'); $this.css('height', editorHeight + 'px'); }); } } ); jQuery( function( $ ) { 'use strict'; var communityEventsData = window.communityEventsData, dateI18n = wp.date.dateI18n, format = wp.date.format, sprintf = wp.i18n.sprintf, __ = wp.i18n.__, _x = wp.i18n._x, app; /** * Global Community Events namespace. * * @since 4.8.0 * * @memberOf wp * @namespace wp.communityEvents */ app = window.wp.communityEvents = /** @lends wp.communityEvents */{ initialized: false, model: null, /** * Initializes the wp.communityEvents object. * * @since 4.8.0 * * @return {void} */ init: function() { if ( app.initialized ) { return; } var $container = $( '#community-events' ); /* * When JavaScript is disabled, the errors container is shown, so * that "This widget requires JavaScript" message can be seen. * * When JS is enabled, the container is hidden at first, and then * revealed during the template rendering, if there actually are * errors to show. * * The display indicator switches from `hide-if-js` to `aria-hidden` * here in order to maintain consistency with all the other fields * that key off of `aria-hidden` to determine their visibility. * `aria-hidden` can't be used initially, because there would be no * way to set it to false when JavaScript is disabled, which would * prevent people from seeing the "This widget requires JavaScript" * message. */ $( '.community-events-errors' ) .attr( 'aria-hidden', 'true' ) .removeClass( 'hide-if-js' ); $container.on( 'click', '.community-events-toggle-location, .community-events-cancel', app.toggleLocationForm ); /** * Filters events based on entered location. * * @return {void} */ $container.on( 'submit', '.community-events-form', function( event ) { var location = $( '#community-events-location' ).val().trim(); event.preventDefault(); /* * Don't trigger a search if the search field is empty or the * search term was made of only spaces before being trimmed. */ if ( ! location ) { return; } app.getEvents({ location: location }); }); if ( communityEventsData && communityEventsData.cache && communityEventsData.cache.location && communityEventsData.cache.events ) { app.renderEventsTemplate( communityEventsData.cache, 'app' ); } else { app.getEvents(); } app.initialized = true; }, /** * Toggles the visibility of the Edit Location form. * * @since 4.8.0 * * @param {event|string} action 'show' or 'hide' to specify a state; * or an event object to flip between states. * * @return {void} */ toggleLocationForm: function( action ) { var $toggleButton = $( '.community-events-toggle-location' ), $cancelButton = $( '.community-events-cancel' ), $form = $( '.community-events-form' ), $target = $(); if ( 'object' === typeof action ) { // The action is the event object: get the clicked element. $target = $( action.target ); /* * Strict comparison doesn't work in this case because sometimes * we explicitly pass a string as value of aria-expanded and * sometimes a boolean as the result of an evaluation. */ action = 'true' == $toggleButton.attr( 'aria-expanded' ) ? 'hide' : 'show'; } if ( 'hide' === action ) { $toggleButton.attr( 'aria-expanded', 'false' ); $cancelButton.attr( 'aria-expanded', 'false' ); $form.attr( 'aria-hidden', 'true' ); /* * If the Cancel button has been clicked, bring the focus back * to the toggle button so users relying on screen readers don't * lose their place. */ if ( $target.hasClass( 'community-events-cancel' ) ) { $toggleButton.trigger( 'focus' ); } } else { $toggleButton.attr( 'aria-expanded', 'true' ); $cancelButton.attr( 'aria-expanded', 'true' ); $form.attr( 'aria-hidden', 'false' ); } }, /** * Sends REST API requests to fetch events for the widget. * * @since 4.8.0 * * @param {Object} requestParams REST API Request parameters object. * * @return {void} */ getEvents: function( requestParams ) { var initiatedBy, app = this, $spinner = $( '.community-events-form' ).children( '.spinner' ); requestParams = requestParams || {}; requestParams._wpnonce = communityEventsData.nonce; requestParams.timezone = window.Intl ? window.Intl.DateTimeFormat().resolvedOptions().timeZone : ''; initiatedBy = requestParams.location ? 'user' : 'app'; $spinner.addClass( 'is-active' ); wp.ajax.post( 'get-community-events', requestParams ) .always( function() { $spinner.removeClass( 'is-active' ); }) .done( function( response ) { if ( 'no_location_available' === response.error ) { if ( requestParams.location ) { response.unknownCity = requestParams.location; } else { /* * No location was passed, which means that this was an automatic query * based on IP, locale, and timezone. Since the user didn't initiate it, * it should fail silently. Otherwise, the error could confuse and/or * annoy them. */ delete response.error; } } app.renderEventsTemplate( response, initiatedBy ); }) .fail( function() { app.renderEventsTemplate({ 'location' : false, 'events' : [], 'error' : true }, initiatedBy ); }); }, /** * Renders the template for the Events section of the Events & News widget. * * @since 4.8.0 * * @param {Object} templateParams The various parameters that will get passed to wp.template. * @param {string} initiatedBy 'user' to indicate that this was triggered manually by the user; * 'app' to indicate it was triggered automatically by the app itself. * * @return {void} */ renderEventsTemplate: function( templateParams, initiatedBy ) { var template, elementVisibility, $toggleButton = $( '.community-events-toggle-location' ), $locationMessage = $( '#community-events-location-message' ), $results = $( '.community-events-results' ); templateParams.events = app.populateDynamicEventFields( templateParams.events, communityEventsData.time_format ); /* * Hide all toggleable elements by default, to keep the logic simple. * Otherwise, each block below would have to turn hide everything that * could have been shown at an earlier point. * * The exception to that is that the .community-events container is hidden * when the page is first loaded, because the content isn't ready yet, * but once we've reached this point, it should always be shown. */ elementVisibility = { '.community-events' : true, '.community-events-loading' : false, '.community-events-errors' : false, '.community-events-error-occurred' : false, '.community-events-could-not-locate' : false, '#community-events-location-message' : false, '.community-events-toggle-location' : false, '.community-events-results' : false }; /* * Determine which templates should be rendered and which elements * should be displayed. */ if ( templateParams.location.ip ) { /* * If the API determined the location by geolocating an IP, it will * provide events, but not a specific location. */ $locationMessage.text( __( 'Attend an upcoming event near you.' ) ); if ( templateParams.events.length ) { template = wp.template( 'community-events-event-list' ); $results.html( template( templateParams ) ); } else { template = wp.template( 'community-events-no-upcoming-events' ); $results.html( template( templateParams ) ); } elementVisibility['#community-events-location-message'] = true; elementVisibility['.community-events-toggle-location'] = true; elementVisibility['.community-events-results'] = true; } else if ( templateParams.location.description ) { template = wp.template( 'community-events-attend-event-near' ); $locationMessage.html( template( templateParams ) ); if ( templateParams.events.length ) { template = wp.template( 'community-events-event-list' ); $results.html( template( templateParams ) ); } else { template = wp.template( 'community-events-no-upcoming-events' ); $results.html( template( templateParams ) ); } if ( 'user' === initiatedBy ) { wp.a11y.speak( sprintf( /* translators: %s: The name of a city. */ __( 'City updated. Listing events near %s.' ), templateParams.location.description ), 'assertive' ); } elementVisibility['#community-events-location-message'] = true; elementVisibility['.community-events-toggle-location'] = true; elementVisibility['.community-events-results'] = true; } else if ( templateParams.unknownCity ) { template = wp.template( 'community-events-could-not-locate' ); $( '.community-events-could-not-locate' ).html( template( templateParams ) ); wp.a11y.speak( sprintf( /* * These specific examples were chosen to highlight the fact that a * state is not needed, even for cities whose name is not unique. * It would be too cumbersome to include that in the instructions * to the user, so it's left as an implication. */ /* * translators: %s is the name of the city we couldn't locate. * Replace the examples with cities related to your locale. Test that * they match the expected location and have upcoming events before * including them. If no cities related to your locale have events, * then use cities related to your locale that would be recognizable * to most users. Use only the city name itself, without any region * or country. Use the endonym (native locale name) instead of the * English name if possible. */ __( 'We couldn’t locate %s. Please try another nearby city. For example: Kansas City; Springfield; Portland.' ), templateParams.unknownCity ) ); elementVisibility['.community-events-errors'] = true; elementVisibility['.community-events-could-not-locate'] = true; } else if ( templateParams.error && 'user' === initiatedBy ) { /* * Errors messages are only shown for requests that were initiated * by the user, not for ones that were initiated by the app itself. * Showing error messages for an event that user isn't aware of * could be confusing or unnecessarily distracting. */ wp.a11y.speak( __( 'An error occurred. Please try again.' ) ); elementVisibility['.community-events-errors'] = true; elementVisibility['.community-events-error-occurred'] = true; } else { $locationMessage.text( __( 'Enter your closest city to find nearby events.' ) ); elementVisibility['#community-events-location-message'] = true; elementVisibility['.community-events-toggle-location'] = true; } // Set the visibility of toggleable elements. _.each( elementVisibility, function( isVisible, element ) { $( element ).attr( 'aria-hidden', ! isVisible ); }); $toggleButton.attr( 'aria-expanded', elementVisibility['.community-events-toggle-location'] ); if ( templateParams.location && ( templateParams.location.ip || templateParams.location.latitude ) ) { // Hide the form when there's a valid location. app.toggleLocationForm( 'hide' ); if ( 'user' === initiatedBy ) { /* * When the form is programmatically hidden after a user search, * bring the focus back to the toggle button so users relying * on screen readers don't lose their place. */ $toggleButton.trigger( 'focus' ); } } else { app.toggleLocationForm( 'show' ); } }, /** * Populate event fields that have to be calculated on the fly. * * These can't be stored in the database, because they're dependent on * the user's current time zone, locale, etc. * * @since 5.5.2 * * @param {Array} rawEvents The events that should have dynamic fields added to them. * @param {string} timeFormat A time format acceptable by `wp.date.dateI18n()`. * * @returns {Array} */ populateDynamicEventFields: function( rawEvents, timeFormat ) { // Clone the parameter to avoid mutating it, so that this can remain a pure function. var populatedEvents = JSON.parse( JSON.stringify( rawEvents ) ); $.each( populatedEvents, function( index, event ) { var timeZone = app.getTimeZone( event.start_unix_timestamp * 1000 ); event.user_formatted_date = app.getFormattedDate( event.start_unix_timestamp * 1000, event.end_unix_timestamp * 1000, timeZone ); event.user_formatted_time = dateI18n( timeFormat, event.start_unix_timestamp * 1000, timeZone ); event.timeZoneAbbreviation = app.getTimeZoneAbbreviation( event.start_unix_timestamp * 1000 ); } ); return populatedEvents; }, /** * Returns the user's local/browser time zone, in a form suitable for `wp.date.i18n()`. * * @since 5.5.2 * * @param startTimestamp * * @returns {string|number} */ getTimeZone: function( startTimestamp ) { /* * Prefer a name like `Europe/Helsinki`, since that automatically tracks daylight savings. This * doesn't need to take `startTimestamp` into account for that reason. */ var timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone; /* * Fall back to an offset for IE11, which declares the property but doesn't assign a value. */ if ( 'undefined' === typeof timeZone ) { /* * It's important to use the _event_ time, not the _current_ * time, so that daylight savings time is accounted for. */ timeZone = app.getFlippedTimeZoneOffset( startTimestamp ); } return timeZone; }, /** * Get intuitive time zone offset. * * `Data.prototype.getTimezoneOffset()` returns a positive value for time zones * that are _behind_ UTC, and a _negative_ value for ones that are ahead. * * See https://stackoverflow.com/questions/21102435/why-does-javascript-date-gettimezoneoffset-consider-0500-as-a-positive-off. * * @since 5.5.2 * * @param {number} startTimestamp * * @returns {number} */ getFlippedTimeZoneOffset: function( startTimestamp ) { return new Date( startTimestamp ).getTimezoneOffset() * -1; }, /** * Get a short time zone name, like `PST`. * * @since 5.5.2 * * @param {number} startTimestamp * * @returns {string} */ getTimeZoneAbbreviation: function( startTimestamp ) { var timeZoneAbbreviation, eventDateTime = new Date( startTimestamp ); /* * Leaving the `locales` argument undefined is important, so that the browser * displays the abbreviation that's most appropriate for the current locale. For * some that will be `UTC{+|-}{n}`, and for others it will be a code like `PST`. * * This doesn't need to take `startTimestamp` into account, because a name like * `America/Chicago` automatically tracks daylight savings. */ var shortTimeStringParts = eventDateTime.toLocaleTimeString( undefined, { timeZoneName : 'short' } ).split( ' ' ); if ( 3 === shortTimeStringParts.length ) { timeZoneAbbreviation = shortTimeStringParts[2]; } if ( 'undefined' === typeof timeZoneAbbreviation ) { /* * It's important to use the _event_ time, not the _current_ * time, so that daylight savings time is accounted for. */ var timeZoneOffset = app.getFlippedTimeZoneOffset( startTimestamp ), sign = -1 === Math.sign( timeZoneOffset ) ? '' : '+'; // translators: Used as part of a string like `GMT+5` in the Events Widget. timeZoneAbbreviation = _x( 'GMT', 'Events widget offset prefix' ) + sign + ( timeZoneOffset / 60 ); } return timeZoneAbbreviation; }, /** * Format a start/end date in the user's local time zone and locale. * * @since 5.5.2 * * @param {int} startDate The Unix timestamp in milliseconds when the the event starts. * @param {int} endDate The Unix timestamp in milliseconds when the the event ends. * @param {string} timeZone A time zone string or offset which is parsable by `wp.date.i18n()`. * * @returns {string} */ getFormattedDate: function( startDate, endDate, timeZone ) { var formattedDate; /* * The `date_format` option is not used because it's important * in this context to keep the day of the week in the displayed date, * so that users can tell at a glance if the event is on a day they * are available, without having to open the link. * * The case of crossing a year boundary is intentionally not handled. * It's so rare in practice that it's not worth the complexity * tradeoff. The _ending_ year should be passed to * `multiple_month_event`, though, just in case. */ /* translators: Date format for upcoming events on the dashboard. Include the day of the week. See https://www.php.net/manual/datetime.format.php */ var singleDayEvent = __( 'l, M j, Y' ), /* translators: Date string for upcoming events. 1: Month, 2: Starting day, 3: Ending day, 4: Year. */ multipleDayEvent = __( '%1$s %2$d–%3$d, %4$d' ), /* translators: Date string for upcoming events. 1: Starting month, 2: Starting day, 3: Ending month, 4: Ending day, 5: Ending year. */ multipleMonthEvent = __( '%1$s %2$d – %3$s %4$d, %5$d' ); // Detect single-day events. if ( ! endDate || format( 'Y-m-d', startDate ) === format( 'Y-m-d', endDate ) ) { formattedDate = dateI18n( singleDayEvent, startDate, timeZone ); // Multiple day events. } else if ( format( 'Y-m', startDate ) === format( 'Y-m', endDate ) ) { formattedDate = sprintf( multipleDayEvent, dateI18n( _x( 'F', 'upcoming events month format' ), startDate, timeZone ), dateI18n( _x( 'j', 'upcoming events day format' ), startDate, timeZone ), dateI18n( _x( 'j', 'upcoming events day format' ), endDate, timeZone ), dateI18n( _x( 'Y', 'upcoming events year format' ), endDate, timeZone ) ); // Multi-day events that cross a month boundary. } else { formattedDate = sprintf( multipleMonthEvent, dateI18n( _x( 'F', 'upcoming events month format' ), startDate, timeZone ), dateI18n( _x( 'j', 'upcoming events day format' ), startDate, timeZone ), dateI18n( _x( 'F', 'upcoming events month format' ), endDate, timeZone ), dateI18n( _x( 'j', 'upcoming events day format' ), endDate, timeZone ), dateI18n( _x( 'Y', 'upcoming events year format' ), endDate, timeZone ) ); } return formattedDate; } }; if ( $( '#dashboard_primary' ).is( ':visible' ) ) { app.init(); } else { $( document ).on( 'postbox-toggled', function( event, postbox ) { var $postbox = $( postbox ); if ( 'dashboard_primary' === $postbox.attr( 'id' ) && $postbox.is( ':visible' ) ) { app.init(); } }); } }); /** * Removed in 5.6.0, needed for back-compatibility. * * @since 4.8.0 * @deprecated 5.6.0 * * @type {object} */ window.communityEventsData.l10n = window.communityEventsData.l10n || { enter_closest_city: '', error_occurred_please_try_again: '', attend_event_near_generic: '', could_not_locate_city: '', city_updated: '' }; window.communityEventsData.l10n = window.wp.deprecateL10nObject( 'communityEventsData.l10n', window.communityEventsData.l10n, '5.6.0' ); PKZ{Xjs/auth-app.jsnu[/** * @output wp-admin/js/auth-app.js */ /* global authApp */ ( function( $, authApp ) { var $appNameField = $( '#app_name' ), $approveBtn = $( '#approve' ), $rejectBtn = $( '#reject' ), $form = $appNameField.closest( 'form' ), context = { userLogin: authApp.user_login, successUrl: authApp.success, rejectUrl: authApp.reject }; $approveBtn.on( 'click', function( e ) { var name = $appNameField.val(), appId = $( 'input[name="app_id"]', $form ).val(); e.preventDefault(); if ( $approveBtn.prop( 'aria-disabled' ) ) { return; } if ( 0 === name.length ) { $appNameField.trigger( 'focus' ); return; } $approveBtn.prop( 'aria-disabled', true ).addClass( 'disabled' ); var request = { name: name }; if ( appId.length > 0 ) { request.app_id = appId; } /** * Filters the request data used to Authorize an Application Password request. * * @since 5.6.0 * * @param {Object} request The request data. * @param {Object} context Context about the Application Password request. * @param {string} context.userLogin The user's login username. * @param {string} context.successUrl The URL the user will be redirected to after approving the request. * @param {string} context.rejectUrl The URL the user will be redirected to after rejecting the request. */ request = wp.hooks.applyFilters( 'wp_application_passwords_approve_app_request', request, context ); wp.apiRequest( { path: '/wp/v2/users/me/application-passwords?_locale=user', method: 'POST', data: request } ).done( function( response, textStatus, jqXHR ) { /** * Fires when an Authorize Application Password request has been successfully approved. * * In most cases, this should be used in combination with the {@see 'wp_authorize_application_password_form_approved_no_js'} * action to ensure that both the JS and no-JS variants are handled. * * @since 5.6.0 * * @param {Object} response The response from the REST API. * @param {string} response.password The newly created password. * @param {string} textStatus The status of the request. * @param {jqXHR} jqXHR The underlying jqXHR object that made the request. */ wp.hooks.doAction( 'wp_application_passwords_approve_app_request_success', response, textStatus, jqXHR ); var raw = authApp.success, url, message, $notice; if ( raw ) { url = raw + ( -1 === raw.indexOf( '?' ) ? '?' : '&' ) + 'site_url=' + encodeURIComponent( authApp.site_url ) + '&user_login=' + encodeURIComponent( authApp.user_login ) + '&password=' + encodeURIComponent( response.password ); window.location = url; } else { message = wp.i18n.sprintf( /* translators: %s: Application name. */ '', '' ) + ' '; $notice = $( '
    ' ) .attr( 'role', 'alert' ) .attr( 'tabindex', -1 ) .addClass( 'notice notice-success notice-alt' ) .append( $( '

    ' ).addClass( 'application-password-display' ).html( message ) ) .append( '

    ' + wp.i18n.__( 'Be sure to save this in a safe location. You will not be able to retrieve it.' ) + '

    ' ); // We're using .text() to write the variables to avoid any chance of XSS. $( 'strong', $notice ).text( response.name ); $( 'input', $notice ).val( response.password ); $form.replaceWith( $notice ); $notice.trigger( 'focus' ); } } ).fail( function( jqXHR, textStatus, errorThrown ) { var errorMessage = errorThrown, error = null; if ( jqXHR.responseJSON ) { error = jqXHR.responseJSON; if ( error.message ) { errorMessage = error.message; } } var $notice = $( '
    ' ) .attr( 'role', 'alert' ) .addClass( 'notice notice-error' ) .append( $( '

    ' ).text( errorMessage ) ); $( 'h1' ).after( $notice ); $approveBtn.removeProp( 'aria-disabled', false ).removeClass( 'disabled' ); /** * Fires when an Authorize Application Password request encountered an error when trying to approve the request. * * @since 5.6.0 * @since 5.6.1 Corrected action name and signature. * * @param {Object|null} error The error from the REST API. May be null if the server did not send proper JSON. * @param {string} textStatus The status of the request. * @param {string} errorThrown The error message associated with the response status code. * @param {jqXHR} jqXHR The underlying jqXHR object that made the request. */ wp.hooks.doAction( 'wp_application_passwords_approve_app_request_error', error, textStatus, errorThrown, jqXHR ); } ); } ); $rejectBtn.on( 'click', function( e ) { e.preventDefault(); /** * Fires when an Authorize Application Password request has been rejected by the user. * * @since 5.6.0 * * @param {Object} context Context about the Application Password request. * @param {string} context.userLogin The user's login username. * @param {string} context.successUrl The URL the user will be redirected to after approving the request. * @param {string} context.rejectUrl The URL the user will be redirected to after rejecting the request. */ wp.hooks.doAction( 'wp_application_passwords_reject_app', context ); // @todo: Make a better way to do this so it feels like less of a semi-open redirect. window.location = authApp.reject; } ); $form.on( 'submit', function( e ) { e.preventDefault(); } ); }( jQuery, authApp ) ); PKZ aIIjs/post.min.jsnu[/*! This file is auto-generated */ window.makeSlugeditClickable=window.editPermalink=function(){},window.wp=window.wp||{},function(s){var t=!1,a=wp.i18n.__;window.commentsBox={st:0,get:function(t,e){var i=this.st;return this.st+=e=e||20,this.total=t,s("#commentsdiv .spinner").addClass("is-active"),t={action:"get-comments",mode:"single",_ajax_nonce:s("#add_comment_nonce").val(),p:s("#post_ID").val(),start:i,number:e},s.post(ajaxurl,t,function(t){t=wpAjax.parseAjaxResponse(t),s("#commentsdiv .widefat").show(),s("#commentsdiv .spinner").removeClass("is-active"),"object"==typeof t&&t.responses[0]?(s("#the-comment-list").append(t.responses[0].data),theList=theExtraList=null,s("a[className*=':']").off(),commentsBox.st>commentsBox.total?s("#show-comments").hide():s("#show-comments").show().children("a").text(a("Show more comments"))):1==t?s("#show-comments").text(a("No more comments found.")):s("#the-comment-list").append(''+wpAjax.broken+"")}),!1},load:function(t){this.st=jQuery("#the-comment-list tr.comment:visible").length,this.get(t)}},window.WPSetThumbnailHTML=function(t){s(".inside","#postimagediv").html(t)},window.WPSetThumbnailID=function(t){var e=s('input[value="_thumbnail_id"]',"#list-table");0",{class:"avatar avatar-64 photo",width:64,height:64,alt:"",src:e.lock_error.avatar_src,srcset:e.lock_error.avatar_src_2x?e.lock_error.avatar_src_2x+" 2x":void 0}),i.find("div.post-locked-avatar").empty().append(a)),i.show().find(".currently-editing").text(e.lock_error.text),i.find(".wp-tab-first").trigger("focus")):e.new_lock&&s("#active_post_lock").val(e.new_lock))}).on("before-autosave.update-post-slug",function(){t=document.activeElement&&"title"===document.activeElement.id}).on("after-autosave.update-post-slug",function(){s("#edit-slug-box > *").length||t||s.post(ajaxurl,{action:"sample-permalink",post_id:s("#post_ID").val(),new_title:s("#title").val(),samplepermalinknonce:s("#samplepermalinknonce").val()},function(t){"-1"!=t&&s("#edit-slug-box").html(t)})})}(jQuery),function(a){var n,t;function i(){n=!1,window.clearTimeout(t),t=window.setTimeout(function(){n=!0},3e5)}a(function(){i()}).on("heartbeat-send.wp-refresh-nonces",function(t,e){var i=a("#wp-auth-check-wrap");(n||i.length&&!i.hasClass("hidden"))&&(i=a("#post_ID").val())&&a("#_wpnonce").val()&&(e["wp-refresh-post-nonces"]={post_id:i})}).on("heartbeat-tick.wp-refresh-nonces",function(t,e){e=e["wp-refresh-post-nonces"];e&&(i(),e.replace&&a.each(e.replace,function(t,e){a("#"+t).val(e)}),e.heartbeatNonce)&&(window.heartbeatSettings.nonce=e.heartbeatNonce)})}(jQuery),jQuery(function(h){var d,e,i,a,n,s,o,l,r,t,c,p,u=h("#content"),v=h(document),f=h("#post_ID").val()||0,m=h("#submitpost"),w=!0,g=h("#post-visibility-select"),b=h("#timestampdiv"),k=h("#post-status-select"),_=!!window.navigator.platform&&-1!==window.navigator.platform.indexOf("Mac"),y=new ClipboardJS(".copy-attachment-url.edit-media"),x=wp.i18n.__,C=wp.i18n._x;function D(t){c.hasClass("wp-editor-expand")||(r?o.theme.resizeTo(null,l+t.pageY):u.height(Math.max(50,l+t.pageY)),t.preventDefault())}function j(){var t;c.hasClass("wp-editor-expand")||(t=r?(o.focus(),((t=parseInt(h("#wp-content-editor-container .mce-toolbar-grp").height(),10))<10||200 *").length&&(h("form#post").one("submit",function(){t=!0}),window.setTimeout(function(){!t&&wp.autosave&&wp.autosave.server.triggerSave()},200))}),v.on("autosave-disable-buttons.edit-post",function(){i.addClass("disabled")}).on("autosave-enable-buttons.edit-post",function(){wp.heartbeat&&wp.heartbeat.hasConnectionError()||i.removeClass("disabled")}).on("before-autosave.edit-post",function(){h(".autosave-message").text(x("Saving Draft\u2026"))}).on("after-autosave.edit-post",function(t,e){h(".autosave-message").text(e.message),h(document.body).hasClass("post-new-php")&&h(".submitbox .submitdelete").show()}),h(window).on("beforeunload.edit-post",function(t){var e=window.tinymce&&window.tinymce.get("content"),i=!1;if(wp.autosave?i=wp.autosave.server.postChanged():e&&(i=!e.isHidden()&&e.isDirty()),i)return t.preventDefault(),x("The changes you made will be lost if you navigate away from this page.")}).on("pagehide.edit-post",function(t){if(w&&(!t.target||"#document"==t.target.nodeName)){var t=h("#post_ID").val(),e=h("#active_post_lock").val();if(t&&e){t={action:"wp-remove-post-lock",_wpnonce:h("#_wpnonce").val(),post_ID:t,active_post_lock:e};if(window.FormData&&window.navigator.sendBeacon){var i=new window.FormData;if(h.each(t,function(t,e){i.append(t,e)}),window.navigator.sendBeacon(ajaxurl,i))return}h.post({async:!1,data:t,url:ajaxurl})}}}),h("#tagsdiv-post_tag").length?window.tagBox&&window.tagBox.init():h(".meta-box-sortables").children("div.postbox").each(function(){if(0===this.id.indexOf("tagsdiv-"))return window.tagBox&&window.tagBox.init(),!1}),h(".categorydiv").each(function(){var t,a,e,i=h(this).attr("id").split("-");i.shift(),a=i.join("-"),e="category"==a?"cats":a+"_tab",h("a","#"+a+"-tabs").on("click",function(t){t.preventDefault();t=h(this).attr("href");h(this).parent().addClass("tabs").siblings("li").removeClass("tabs"),h("#"+a+"-tabs").siblings(".tabs-panel").hide(),h(t).show(),"#"+a+"-all"==t?deleteUserSetting(e):setUserSetting(e,"pop")}),getUserSetting(e)&&h('a[href="#'+a+'-pop"]',"#"+a+"-tabs").trigger("click"),h("#new"+a).one("focus",function(){h(this).val("").removeClass("form-input-tip")}),h("#new"+a).on("keypress",function(t){13===t.keyCode&&(t.preventDefault(),h("#"+a+"-add-submit").trigger("click"))}),h("#"+a+"-add-submit").on("click",function(){h("#new"+a).trigger("focus")}),i=function(t){return!!h("#new"+a).val()&&(t.data+="&"+h(":checked","#"+a+"checklist").serialize(),h("#"+a+"-add-submit").prop("disabled",!0),t)},t=function(t,e){var i=h("#new"+a+"_parent");h("#"+a+"-add-submit").prop("disabled",!1),"undefined"!=e.parsed.responses[0]&&(e=e.parsed.responses[0].supplemental.newcat_parent)&&(i.before(e),i.remove())},h("#"+a+"checklist").wpList({alt:"",response:a+"-ajax-response",addBefore:i,addAfter:t}),h("#"+a+"-add-toggle").on("click",function(t){t.preventDefault(),h("#"+a+"-adder").toggleClass("wp-hidden-children"),h('a[href="#'+a+'-all"]',"#"+a+"-tabs").trigger("click"),h("#new"+a).trigger("focus")}),h("#"+a+"checklist, #"+a+"checklist-pop").on("click",'li.popular-category > label input[type="checkbox"]',function(){var t=h(this),e=t.is(":checked"),i=t.val();i&&t.parents("#taxonomy-"+a).length&&(h("input#in-"+a+"-"+i+', input[id^="in-'+a+"-"+i+'-"]').prop("checked",e),h("input#in-popular-"+a+"-"+i).prop("checked",e))})}),h("#postcustom").length&&h("#the-list").wpList({addBefore:function(t){return t.data+="&post_id="+h("#post_ID").val(),t},addAfter:function(){h("table#list-table").show()}}),h("#submitdiv").length&&(d=h("#timestamp").html(),e=h("#post-visibility-display").html(),a=function(){"public"!=g.find("input:radio:checked").val()?(h("#sticky").prop("checked",!1),h("#sticky-span").hide()):h("#sticky-span").show(),"password"!=g.find("input:radio:checked").val()?h("#password-span").hide():h("#password-span").show()},n=function(){if(b.length){var t,e=h("#post_status"),i=h('option[value="publish"]',e),a=h("#aa").val(),n=h("#mm").val(),s=h("#jj").val(),o=h("#hh").val(),l=h("#mn").val(),r=new Date(a,n-1,s,o,l),c=new Date(h("#hidden_aa").val(),h("#hidden_mm").val()-1,h("#hidden_jj").val(),h("#hidden_hh").val(),h("#hidden_mn").val()),p=new Date(h("#cur_aa").val(),h("#cur_mm").val()-1,h("#cur_jj").val(),h("#cur_hh").val(),h("#cur_mn").val());if(r.getFullYear()!=a||1+r.getMonth()!=n||r.getDate()!=s||r.getMinutes()!=l)return b.find(".timestamp-wrap").addClass("form-invalid"),!1;b.find(".timestamp-wrap").removeClass("form-invalid"),p"+x("%1$s %2$s, %3$s at %4$s:%5$s").replace("%1$s",h('option[value="'+n+'"]',"#mm").attr("data-text")).replace("%2$s",parseInt(s,10)).replace("%3$s",a).replace("%4$s",("00"+o).slice(-2)).replace("%5$s",("00"+l).slice(-2))+" "),"private"==g.find("input:radio:checked").val()?(h("#publish").val(x("Update")),0===i.length?e.append('"):i.html(x("Privately Published")),h('option[value="publish"]',e).prop("selected",!0),h("#misc-publishing-actions .edit-post-status").hide()):("future"==h("#original_post_status").val()||"draft"==h("#original_post_status").val()?i.length&&(i.remove(),e.val(h("#hidden_post_status").val())):i.html(x("Published")),e.is(":hidden")&&h("#misc-publishing-actions .edit-post-status").show()),h("#post-status-display").text(wp.sanitize.stripTagsAndEncodeText(h("option:selected",e).text())),"private"==h("option:selected",e).val()||"publish"==h("option:selected",e).val()?h("#save-post").hide():(h("#save-post").show(),"pending"==h("option:selected",e).val()?h("#save-post").show().val(x("Save as Pending")):h("#save-post").show().val(x("Save Draft")))}return!0},h("#visibility .edit-visibility").on("click",function(t){t.preventDefault(),g.is(":hidden")&&(a(),g.slideDown("fast",function(){g.find('input[type="radio"]').first().trigger("focus")}),h(this).hide())}),g.find(".cancel-post-visibility").on("click",function(t){g.slideUp("fast"),h("#visibility-radio-"+h("#hidden-post-visibility").val()).prop("checked",!0),h("#post_password").val(h("#hidden-post-password").val()),h("#sticky").prop("checked",h("#hidden-post-sticky").prop("checked")),h("#post-visibility-display").html(e),h("#visibility .edit-visibility").show().trigger("focus"),n(),t.preventDefault()}),g.find(".save-post-visibility").on("click",function(t){var e="",i=g.find("input:radio:checked").val();switch(g.slideUp("fast"),h("#visibility .edit-visibility").show().trigger("focus"),n(),"public"!==i&&h("#sticky").prop("checked",!1),i){case"public":e=h("#sticky").prop("checked")?x("Public, Sticky"):x("Public");break;case"private":e=x("Private");break;case"password":e=x("Password Protected")}h("#post-visibility-display").text(e),t.preventDefault()}),g.find("input:radio").on("change",function(){a()}),b.siblings("a.edit-timestamp").on("click",function(t){b.is(":hidden")&&(b.slideDown("fast",function(){h("input, select",b.find(".timestamp-wrap")).first().trigger("focus")}),h(this).hide()),t.preventDefault()}),b.find(".cancel-timestamp").on("click",function(t){b.slideUp("fast").siblings("a.edit-timestamp").show().trigger("focus"),h("#mm").val(h("#hidden_mm").val()),h("#jj").val(h("#hidden_jj").val()),h("#aa").val(h("#hidden_aa").val()),h("#hh").val(h("#hidden_hh").val()),h("#mn").val(h("#hidden_mn").val()),n(),t.preventDefault()}),b.find(".save-timestamp").on("click",function(t){n()&&(b.slideUp("fast"),b.siblings("a.edit-timestamp").show().trigger("focus")),t.preventDefault()}),h("#post").on("submit",function(t){n()||(t.preventDefault(),b.show(),wp.autosave&&wp.autosave.enableButtons(),h("#publishing-action .spinner").removeClass("is-active"))}),k.siblings("a.edit-post-status").on("click",function(t){k.is(":hidden")&&(k.slideDown("fast",function(){k.find("select").trigger("focus")}),h(this).hide()),t.preventDefault()}),k.find(".save-post-status").on("click",function(t){k.slideUp("fast").siblings("a.edit-post-status").show().trigger("focus"),n(),t.preventDefault()}),k.find(".cancel-post-status").on("click",function(t){k.slideUp("fast").siblings("a.edit-post-status").show().trigger("focus"),h("#post_status").val(h("#hidden_post_status").val()),n(),t.preventDefault()})),h("#titlediv").on("click",".edit-slug",function(){var t,e,a,i,n=0,s=h("#post_name"),o=s.val(),l=h("#sample-permalink"),r=l.html(),c=h("#sample-permalink a").html(),p=h("#edit-slug-buttons"),d=p.html(),u=h("#editable-post-name-full");for(u.find("img").replaceWith(function(){return this.alt}),u=u.html(),l.html(c),a=h("#editable-post-name"),i=a.html(),p.html(' "),p.children(".save").on("click",function(){var i=a.children("input").val();i==h("#editable-post-name-full").text()?p.children(".cancel").trigger("click"):h.post(ajaxurl,{action:"sample-permalink",post_id:f,new_slug:i,new_title:h("#title").val(),samplepermalinknonce:h("#samplepermalinknonce").val()},function(t){var e=h("#edit-slug-box");e.html(t),e.hasClass("hidden")&&e.fadeIn("fast",function(){e.removeClass("hidden")}),p.html(d),l.html(r),s.val(i),h(".edit-slug").trigger("focus"),wp.a11y.speak(x("Permalink saved"))})}),p.children(".cancel").on("click",function(){h("#view-post-btn").show(),a.html(i),p.html(d),l.html(r),s.val(o),h(".edit-slug").trigger("focus")}),t=0;tu.length/4?"":u,e=x("URL Slug"),a.html('').children("input").on("keydown",function(t){var e=t.which;13===e&&(t.preventDefault(),p.children(".save").trigger("click")),27===e&&p.children(".cancel").trigger("click")}).on("keyup",function(){s.val(this.value)}).trigger("focus")}),window.wptitlehint=function(t){var e=h("#"+(t=t||"title")),i=h("#"+t+"-prompt-text");""===e.val()&&i.removeClass("screen-reader-text"),e.on("input",function(){""===this.value?i.removeClass("screen-reader-text"):i.addClass("screen-reader-text")})},wptitlehint(),t=h("#post-status-info"),c=h("#postdivrich"),!u.length||"ontouchstart"in window?h("#content-resize-handle").hide():t.on("mousedown.wp-editor-resize",function(t){(o="undefined"!=typeof tinymce?tinymce.get("content"):o)&&!o.isHidden()?(r=!0,l=h("#content_ifr").height()-t.pageY):(r=!1,l=u.height()-t.pageY,u.trigger("blur")),v.on("mousemove.wp-editor-resize",D).on("mouseup.wp-editor-resize mouseleave.wp-editor-resize",j),t.preventDefault()}).on("mouseup.wp-editor-resize",j),"undefined"!=typeof tinymce&&(h("#post-formats-select input.post-format").on("change.set-editor-class",function(){var t,e,i=this.id;i&&h(this).prop("checked")&&(t=tinymce.get("content"))&&((e=t.getBody()).className=e.className.replace(/\bpost-format-[^ ]+/,""),t.dom.addClass(e,"post-format-0"==i?"post-format-standard":i),h(document).trigger("editor-classchange"))}),h("#page_template").on("change.set-editor-class",function(){var t,e,i=h(this).val()||"";(i=i.substr(i.lastIndexOf("/")+1,i.length).replace(/\.php$/,"").replace(/\./g,"-"))&&(t=tinymce.get("content"))&&((e=t.getBody()).className=e.className.replace(/\bpage-template-[^ ]+/,""),t.dom.addClass(e,"page-template-"+i),h(document).trigger("editor-classchange"))})),u.on("keydown.wp-autosave",function(t){83!==t.which||t.shiftKey||t.altKey||_&&(!t.metaKey||t.ctrlKey)||!_&&!t.ctrlKey||(wp.autosave&&wp.autosave.server.triggerSave(),t.preventDefault())}),"auto-draft"===h("#original_post_status").val()&&window.history.replaceState&&h("#publish").on("click",function(){p=(p=window.location.href)+(-1!==p.indexOf("?")?"&":"?")+"wp-post-new-reload=true",window.history.replaceState(null,null,p)}),y.on("success",function(t){var e=h(t.trigger),i=h(".success",e.closest(".copy-to-clipboard-container"));t.clearSelection(),clearTimeout(s),i.removeClass("hidden"),s=setTimeout(function(){i.addClass("hidden")},3e3),wp.a11y.speak(x("The file URL has been copied to your clipboard"))})}),function(t,o){t(function(){var i,e=t("#content"),a=t("#wp-word-count").find(".word-count"),n=0;function s(){var t=!i||i.isHidden()?e.val():i.getContent({format:"raw"}),t=o.count(t);t!==n&&a.text(t),n=t}t(document).on("tinymce-editor-init",function(t,e){"content"===e.id&&(i=e).on("nodechange keyup",_.debounce(s,1e3))}),e.on("input keyup",_.debounce(s,1e3)),s()})}(jQuery,new wp.utils.WordCounter);PKZM+**js/privacy-tools.jsnu[/** * Interactions used by the User Privacy tools in WordPress. * * @output wp-admin/js/privacy-tools.js */ // Privacy request action handling. jQuery( function( $ ) { var __ = wp.i18n.__, copiedNoticeTimeout; function setActionState( $action, state ) { $action.children().addClass( 'hidden' ); $action.children( '.' + state ).removeClass( 'hidden' ); } function clearResultsAfterRow( $requestRow ) { $requestRow.removeClass( 'has-request-results' ); if ( $requestRow.next().hasClass( 'request-results' ) ) { $requestRow.next().remove(); } } function appendResultsAfterRow( $requestRow, classes, summaryMessage, additionalMessages ) { var itemList = '', resultRowClasses = 'request-results'; clearResultsAfterRow( $requestRow ); if ( additionalMessages.length ) { $.each( additionalMessages, function( index, value ) { itemList = itemList + '
  • ' + value + '
  • '; }); itemList = '
      ' + itemList + '
    '; } $requestRow.addClass( 'has-request-results' ); if ( $requestRow.hasClass( 'status-request-confirmed' ) ) { resultRowClasses = resultRowClasses + ' status-request-confirmed'; } if ( $requestRow.hasClass( 'status-request-failed' ) ) { resultRowClasses = resultRowClasses + ' status-request-failed'; } $requestRow.after( function() { return '' + '' + '' + ''; }); } $( '.export-personal-data-handle' ).on( 'click', function( event ) { var $this = $( this ), $action = $this.parents( '.export-personal-data' ), $requestRow = $this.parents( 'tr' ), $progress = $requestRow.find( '.export-progress' ), $rowActions = $this.parents( '.row-actions' ), requestID = $action.data( 'request-id' ), nonce = $action.data( 'nonce' ), exportersCount = $action.data( 'exporters-count' ), sendAsEmail = $action.data( 'send-as-email' ) ? true : false; event.preventDefault(); event.stopPropagation(); $rowActions.addClass( 'processing' ); $action.trigger( 'blur' ); clearResultsAfterRow( $requestRow ); setExportProgress( 0 ); function onExportDoneSuccess( zipUrl ) { var summaryMessage = __( 'This user’s personal data export link was sent.' ); if ( 'undefined' !== typeof zipUrl ) { summaryMessage = __( 'This user’s personal data export file was downloaded.' ); } setActionState( $action, 'export-personal-data-success' ); appendResultsAfterRow( $requestRow, 'notice-success', summaryMessage, [] ); if ( 'undefined' !== typeof zipUrl ) { window.location = zipUrl; } else if ( ! sendAsEmail ) { onExportFailure( __( 'No personal data export file was generated.' ) ); } setTimeout( function() { $rowActions.removeClass( 'processing' ); }, 500 ); } function onExportFailure( errorMessage ) { var summaryMessage = __( 'An error occurred while attempting to export personal data.' ); setActionState( $action, 'export-personal-data-failed' ); if ( errorMessage ) { appendResultsAfterRow( $requestRow, 'notice-error', summaryMessage, [ errorMessage ] ); } setTimeout( function() { $rowActions.removeClass( 'processing' ); }, 500 ); } function setExportProgress( exporterIndex ) { var progress = ( exportersCount > 0 ? exporterIndex / exportersCount : 0 ), progressString = Math.round( progress * 100 ).toString() + '%'; $progress.html( progressString ); } function doNextExport( exporterIndex, pageIndex ) { $.ajax( { url: window.ajaxurl, data: { action: 'wp-privacy-export-personal-data', exporter: exporterIndex, id: requestID, page: pageIndex, security: nonce, sendAsEmail: sendAsEmail }, method: 'post' } ).done( function( response ) { var responseData = response.data; if ( ! response.success ) { // e.g. invalid request ID. setTimeout( function() { onExportFailure( response.data ); }, 500 ); return; } if ( ! responseData.done ) { setTimeout( doNextExport( exporterIndex, pageIndex + 1 ) ); } else { setExportProgress( exporterIndex ); if ( exporterIndex < exportersCount ) { setTimeout( doNextExport( exporterIndex + 1, 1 ) ); } else { setTimeout( function() { onExportDoneSuccess( responseData.url ); }, 500 ); } } }).fail( function( jqxhr, textStatus, error ) { // e.g. Nonce failure. setTimeout( function() { onExportFailure( error ); }, 500 ); }); } // And now, let's begin. setActionState( $action, 'export-personal-data-processing' ); doNextExport( 1, 1 ); }); $( '.remove-personal-data-handle' ).on( 'click', function( event ) { var $this = $( this ), $action = $this.parents( '.remove-personal-data' ), $requestRow = $this.parents( 'tr' ), $progress = $requestRow.find( '.erasure-progress' ), $rowActions = $this.parents( '.row-actions' ), requestID = $action.data( 'request-id' ), nonce = $action.data( 'nonce' ), erasersCount = $action.data( 'erasers-count' ), hasRemoved = false, hasRetained = false, messages = []; event.preventDefault(); event.stopPropagation(); $rowActions.addClass( 'processing' ); $action.trigger( 'blur' ); clearResultsAfterRow( $requestRow ); setErasureProgress( 0 ); function onErasureDoneSuccess() { var summaryMessage = __( 'No personal data was found for this user.' ), classes = 'notice-success'; setActionState( $action, 'remove-personal-data-success' ); if ( false === hasRemoved ) { if ( false === hasRetained ) { summaryMessage = __( 'No personal data was found for this user.' ); } else { summaryMessage = __( 'Personal data was found for this user but was not erased.' ); classes = 'notice-warning'; } } else { if ( false === hasRetained ) { summaryMessage = __( 'All of the personal data found for this user was erased.' ); } else { summaryMessage = __( 'Personal data was found for this user but some of the personal data found was not erased.' ); classes = 'notice-warning'; } } appendResultsAfterRow( $requestRow, classes, summaryMessage, messages ); setTimeout( function() { $rowActions.removeClass( 'processing' ); }, 500 ); } function onErasureFailure() { var summaryMessage = __( 'An error occurred while attempting to find and erase personal data.' ); setActionState( $action, 'remove-personal-data-failed' ); appendResultsAfterRow( $requestRow, 'notice-error', summaryMessage, [] ); setTimeout( function() { $rowActions.removeClass( 'processing' ); }, 500 ); } function setErasureProgress( eraserIndex ) { var progress = ( erasersCount > 0 ? eraserIndex / erasersCount : 0 ), progressString = Math.round( progress * 100 ).toString() + '%'; $progress.html( progressString ); } function doNextErasure( eraserIndex, pageIndex ) { $.ajax({ url: window.ajaxurl, data: { action: 'wp-privacy-erase-personal-data', eraser: eraserIndex, id: requestID, page: pageIndex, security: nonce }, method: 'post' }).done( function( response ) { var responseData = response.data; if ( ! response.success ) { setTimeout( function() { onErasureFailure(); }, 500 ); return; } if ( responseData.items_removed ) { hasRemoved = hasRemoved || responseData.items_removed; } if ( responseData.items_retained ) { hasRetained = hasRetained || responseData.items_retained; } if ( responseData.messages ) { messages = messages.concat( responseData.messages ); } if ( ! responseData.done ) { setTimeout( doNextErasure( eraserIndex, pageIndex + 1 ) ); } else { setErasureProgress( eraserIndex ); if ( eraserIndex < erasersCount ) { setTimeout( doNextErasure( eraserIndex + 1, 1 ) ); } else { setTimeout( function() { onErasureDoneSuccess(); }, 500 ); } } }).fail( function() { setTimeout( function() { onErasureFailure(); }, 500 ); }); } // And now, let's begin. setActionState( $action, 'remove-personal-data-processing' ); doNextErasure( 1, 1 ); }); // Privacy Policy page, copy action. $( document ).on( 'click', function( event ) { var $parent, range, $target = $( event.target ), copiedNotice = $target.siblings( '.success' ); clearTimeout( copiedNoticeTimeout ); if ( $target.is( 'button.privacy-text-copy' ) ) { $parent = $target.closest( '.privacy-settings-accordion-panel' ); if ( $parent.length ) { try { var documentPosition = document.documentElement.scrollTop, bodyPosition = document.body.scrollTop; // Setup copy. window.getSelection().removeAllRanges(); // Hide tutorial content to remove from copied content. range = document.createRange(); $parent.addClass( 'hide-privacy-policy-tutorial' ); // Copy action. range.selectNodeContents( $parent[0] ); window.getSelection().addRange( range ); document.execCommand( 'copy' ); // Reset section. $parent.removeClass( 'hide-privacy-policy-tutorial' ); window.getSelection().removeAllRanges(); // Return scroll position - see #49540. if ( documentPosition > 0 && documentPosition !== document.documentElement.scrollTop ) { document.documentElement.scrollTop = documentPosition; } else if ( bodyPosition > 0 && bodyPosition !== document.body.scrollTop ) { document.body.scrollTop = bodyPosition; } // Display and speak notice to indicate action complete. copiedNotice.addClass( 'visible' ); wp.a11y.speak( __( 'The suggested policy text has been copied to your clipboard.' ) ); // Delay notice dismissal. copiedNoticeTimeout = setTimeout( function() { copiedNotice.removeClass( 'visible' ); }, 3000 ); } catch ( er ) {} } } }); // Label handling to focus the create page button on Privacy settings page. $( 'body.options-privacy-php label[for=create-page]' ).on( 'click', function( e ) { e.preventDefault(); $( 'input#create-page' ).trigger( 'focus' ); } ); // Accordion handling in various new Privacy settings pages. $( '.privacy-settings-accordion' ).on( 'click', '.privacy-settings-accordion-trigger', function() { var isExpanded = ( 'true' === $( this ).attr( 'aria-expanded' ) ); if ( isExpanded ) { $( this ).attr( 'aria-expanded', 'false' ); $( '#' + $( this ).attr( 'aria-controls' ) ).attr( 'hidden', true ); } else { $( this ).attr( 'aria-expanded', 'true' ); $( '#' + $( this ).attr( 'aria-controls' ) ).attr( 'hidden', false ); } } ); }); PKZr?\7js/word-count.min.jsnu[/*! This file is auto-generated */ !function(){function e(e){var t,s;if(e)for(t in e)e.hasOwnProperty(t)&&(this.settings[t]=e[t]);(s=this.settings.l10n.shortcodes)&&s.length&&(this.settings.shortcodesRegExp=new RegExp("\\[\\/?(?:"+s.join("|")+")[^\\]]*?\\]","g"))}e.prototype.settings={HTMLRegExp:/<\/?[a-z][^>]*?>/gi,HTMLcommentRegExp://g,spaceRegExp:/ | /gi,HTMLEntityRegExp:/&\S+?;/g,connectorRegExp:/--|\u2014/g,removeRegExp:new RegExp(["[","!-@[-`{-~","\x80-\xbf\xd7\xf7","\u2000-\u2bff","\u2e00-\u2e7f","]"].join(""),"g"),astralRegExp:/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,wordsRegExp:/\S\s+/g,characters_excluding_spacesRegExp:/\S/g,characters_including_spacesRegExp:/[^\f\n\r\t\v\u00AD\u2028\u2029]/g,l10n:window.wordCountL10n||{}},e.prototype.count=function(e,t){var s=0;return"characters_excluding_spaces"!==(t=t||this.settings.l10n.type)&&"characters_including_spaces"!==t&&(t="words"),s=e&&(e=(e=(e+="\n").replace(this.settings.HTMLRegExp,"\n")).replace(this.settings.HTMLcommentRegExp,""),e=(e=this.settings.shortcodesRegExp?e.replace(this.settings.shortcodesRegExp,"\n"):e).replace(this.settings.spaceRegExp," "),e=(e="words"===t?(e=(e=e.replace(this.settings.HTMLEntityRegExp,"")).replace(this.settings.connectorRegExp," ")).replace(this.settings.removeRegExp,""):(e=e.replace(this.settings.HTMLEntityRegExp,"a")).replace(this.settings.astralRegExp,"a")).match(this.settings[t+"RegExp"]))?e.length:s},window.wp=window.wp||{},window.wp.utils=window.wp.utils||{},window.wp.utils.WordCounter=e}();PKZ:g g js/comment.jsnu[/** * @output wp-admin/js/comment.js */ /* global postboxes */ /** * Binds to the document ready event. * * @since 2.5.0 * * @param {jQuery} $ The jQuery object. */ jQuery( function($) { postboxes.add_postbox_toggles('comment'); var $timestampdiv = $('#timestampdiv'), $timestamp = $( '#timestamp' ), stamp = $timestamp.html(), $timestampwrap = $timestampdiv.find( '.timestamp-wrap' ), $edittimestamp = $timestampdiv.siblings( 'a.edit-timestamp' ); /** * Adds event that opens the time stamp form if the form is hidden. * * @listens $edittimestamp:click * * @param {Event} event The event object. * @return {void} */ $edittimestamp.on( 'click', function( event ) { if ( $timestampdiv.is( ':hidden' ) ) { // Slide down the form and set focus on the first field. $timestampdiv.slideDown( 'fast', function() { $( 'input, select', $timestampwrap ).first().trigger( 'focus' ); } ); $(this).hide(); } event.preventDefault(); }); /** * Resets the time stamp values when the cancel button is clicked. * * @listens .cancel-timestamp:click * * @param {Event} event The event object. * @return {void} */ $timestampdiv.find('.cancel-timestamp').on( 'click', function( event ) { // Move focus back to the Edit link. $edittimestamp.show().trigger( 'focus' ); $timestampdiv.slideUp( 'fast' ); $('#mm').val($('#hidden_mm').val()); $('#jj').val($('#hidden_jj').val()); $('#aa').val($('#hidden_aa').val()); $('#hh').val($('#hidden_hh').val()); $('#mn').val($('#hidden_mn').val()); $timestamp.html( stamp ); event.preventDefault(); }); /** * Sets the time stamp values when the ok button is clicked. * * @listens .save-timestamp:click * * @param {Event} event The event object. * @return {void} */ $timestampdiv.find('.save-timestamp').on( 'click', function( event ) { // Crazyhorse branch - multiple OK cancels. var aa = $('#aa').val(), mm = $('#mm').val(), jj = $('#jj').val(), hh = $('#hh').val(), mn = $('#mn').val(), newD = new Date( aa, mm - 1, jj, hh, mn ); event.preventDefault(); if ( newD.getFullYear() != aa || (1 + newD.getMonth()) != mm || newD.getDate() != jj || newD.getMinutes() != mn ) { $timestampwrap.addClass( 'form-invalid' ); return; } else { $timestampwrap.removeClass( 'form-invalid' ); } $timestamp.html( wp.i18n.__( 'Submitted on:' ) + ' ' + /* translators: 1: Month, 2: Day, 3: Year, 4: Hour, 5: Minute. */ wp.i18n.__( '%1$s %2$s, %3$s at %4$s:%5$s' ) .replace( '%1$s', $( 'option[value="' + mm + '"]', '#mm' ).attr( 'data-text' ) ) .replace( '%2$s', parseInt( jj, 10 ) ) .replace( '%3$s', aa ) .replace( '%4$s', ( '00' + hh ).slice( -2 ) ) .replace( '%5$s', ( '00' + mn ).slice( -2 ) ) + ' ' ); // Move focus back to the Edit link. $edittimestamp.show().trigger( 'focus' ); $timestampdiv.slideUp( 'fast' ); }); }); PKZz js/common.jsnu[/** * @output wp-admin/js/common.js */ /* global setUserSetting, ajaxurl, alert, confirm, pagenow */ /* global columns, screenMeta */ /** * Adds common WordPress functionality to the window. * * @param {jQuery} $ jQuery object. * @param {Object} window The window object. * @param {mixed} undefined Unused. */ ( function( $, window, undefined ) { var $document = $( document ), $window = $( window ), $body = $( document.body ), __ = wp.i18n.__, sprintf = wp.i18n.sprintf; /** * Throws an error for a deprecated property. * * @since 5.5.1 * * @param {string} propName The property that was used. * @param {string} version The version of WordPress that deprecated the property. * @param {string} replacement The property that should have been used. */ function deprecatedProperty( propName, version, replacement ) { var message; if ( 'undefined' !== typeof replacement ) { message = sprintf( /* translators: 1: Deprecated property name, 2: Version number, 3: Alternative property name. */ __( '%1$s is deprecated since version %2$s! Use %3$s instead.' ), propName, version, replacement ); } else { message = sprintf( /* translators: 1: Deprecated property name, 2: Version number. */ __( '%1$s is deprecated since version %2$s with no alternative available.' ), propName, version ); } window.console.warn( message ); } /** * Deprecate all properties on an object. * * @since 5.5.1 * @since 5.6.0 Added the `version` parameter. * * @param {string} name The name of the object, i.e. commonL10n. * @param {object} l10nObject The object to deprecate the properties on. * @param {string} version The version of WordPress that deprecated the property. * * @return {object} The object with all its properties deprecated. */ function deprecateL10nObject( name, l10nObject, version ) { var deprecatedObject = {}; Object.keys( l10nObject ).forEach( function( key ) { var prop = l10nObject[ key ]; var propName = name + '.' + key; if ( 'object' === typeof prop ) { Object.defineProperty( deprecatedObject, key, { get: function() { deprecatedProperty( propName, version, prop.alternative ); return prop.func(); } } ); } else { Object.defineProperty( deprecatedObject, key, { get: function() { deprecatedProperty( propName, version, 'wp.i18n' ); return prop; } } ); } } ); return deprecatedObject; } window.wp.deprecateL10nObject = deprecateL10nObject; /** * Removed in 5.5.0, needed for back-compatibility. * * @since 2.6.0 * @deprecated 5.5.0 */ window.commonL10n = window.commonL10n || { warnDelete: '', dismiss: '', collapseMenu: '', expandMenu: '' }; window.commonL10n = deprecateL10nObject( 'commonL10n', window.commonL10n, '5.5.0' ); /** * Removed in 5.5.0, needed for back-compatibility. * * @since 3.3.0 * @deprecated 5.5.0 */ window.wpPointerL10n = window.wpPointerL10n || { dismiss: '' }; window.wpPointerL10n = deprecateL10nObject( 'wpPointerL10n', window.wpPointerL10n, '5.5.0' ); /** * Removed in 5.5.0, needed for back-compatibility. * * @since 4.3.0 * @deprecated 5.5.0 */ window.userProfileL10n = window.userProfileL10n || { warn: '', warnWeak: '', show: '', hide: '', cancel: '', ariaShow: '', ariaHide: '' }; window.userProfileL10n = deprecateL10nObject( 'userProfileL10n', window.userProfileL10n, '5.5.0' ); /** * Removed in 5.5.0, needed for back-compatibility. * * @since 4.9.6 * @deprecated 5.5.0 */ window.privacyToolsL10n = window.privacyToolsL10n || { noDataFound: '', foundAndRemoved: '', noneRemoved: '', someNotRemoved: '', removalError: '', emailSent: '', noExportFile: '', exportError: '' }; window.privacyToolsL10n = deprecateL10nObject( 'privacyToolsL10n', window.privacyToolsL10n, '5.5.0' ); /** * Removed in 5.5.0, needed for back-compatibility. * * @since 3.6.0 * @deprecated 5.5.0 */ window.authcheckL10n = { beforeunload: '' }; window.authcheckL10n = window.authcheckL10n || deprecateL10nObject( 'authcheckL10n', window.authcheckL10n, '5.5.0' ); /** * Removed in 5.5.0, needed for back-compatibility. * * @since 2.8.0 * @deprecated 5.5.0 */ window.tagsl10n = { noPerm: '', broken: '' }; window.tagsl10n = window.tagsl10n || deprecateL10nObject( 'tagsl10n', window.tagsl10n, '5.5.0' ); /** * Removed in 5.5.0, needed for back-compatibility. * * @since 2.5.0 * @deprecated 5.5.0 */ window.adminCommentsL10n = window.adminCommentsL10n || { hotkeys_highlight_first: { alternative: 'window.adminCommentsSettings.hotkeys_highlight_first', func: function() { return window.adminCommentsSettings.hotkeys_highlight_first; } }, hotkeys_highlight_last: { alternative: 'window.adminCommentsSettings.hotkeys_highlight_last', func: function() { return window.adminCommentsSettings.hotkeys_highlight_last; } }, replyApprove: '', reply: '', warnQuickEdit: '', warnCommentChanges: '', docTitleComments: '', docTitleCommentsCount: '' }; window.adminCommentsL10n = deprecateL10nObject( 'adminCommentsL10n', window.adminCommentsL10n, '5.5.0' ); /** * Removed in 5.5.0, needed for back-compatibility. * * @since 2.5.0 * @deprecated 5.5.0 */ window.tagsSuggestL10n = window.tagsSuggestL10n || { tagDelimiter: '', removeTerm: '', termSelected: '', termAdded: '', termRemoved: '' }; window.tagsSuggestL10n = deprecateL10nObject( 'tagsSuggestL10n', window.tagsSuggestL10n, '5.5.0' ); /** * Removed in 5.5.0, needed for back-compatibility. * * @since 3.5.0 * @deprecated 5.5.0 */ window.wpColorPickerL10n = window.wpColorPickerL10n || { clear: '', clearAriaLabel: '', defaultString: '', defaultAriaLabel: '', pick: '', defaultLabel: '' }; window.wpColorPickerL10n = deprecateL10nObject( 'wpColorPickerL10n', window.wpColorPickerL10n, '5.5.0' ); /** * Removed in 5.5.0, needed for back-compatibility. * * @since 2.7.0 * @deprecated 5.5.0 */ window.attachMediaBoxL10n = window.attachMediaBoxL10n || { error: '' }; window.attachMediaBoxL10n = deprecateL10nObject( 'attachMediaBoxL10n', window.attachMediaBoxL10n, '5.5.0' ); /** * Removed in 5.5.0, needed for back-compatibility. * * @since 2.5.0 * @deprecated 5.5.0 */ window.postL10n = window.postL10n || { ok: '', cancel: '', publishOn: '', publishOnFuture: '', publishOnPast: '', dateFormat: '', showcomm: '', endcomm: '', publish: '', schedule: '', update: '', savePending: '', saveDraft: '', 'private': '', 'public': '', publicSticky: '', password: '', privatelyPublished: '', published: '', saveAlert: '', savingText: '', permalinkSaved: '' }; window.postL10n = deprecateL10nObject( 'postL10n', window.postL10n, '5.5.0' ); /** * Removed in 5.5.0, needed for back-compatibility. * * @since 2.7.0 * @deprecated 5.5.0 */ window.inlineEditL10n = window.inlineEditL10n || { error: '', ntdeltitle: '', notitle: '', comma: '', saved: '' }; window.inlineEditL10n = deprecateL10nObject( 'inlineEditL10n', window.inlineEditL10n, '5.5.0' ); /** * Removed in 5.5.0, needed for back-compatibility. * * @since 2.7.0 * @deprecated 5.5.0 */ window.plugininstallL10n = window.plugininstallL10n || { plugin_information: '', plugin_modal_label: '', ays: '' }; window.plugininstallL10n = deprecateL10nObject( 'plugininstallL10n', window.plugininstallL10n, '5.5.0' ); /** * Removed in 5.5.0, needed for back-compatibility. * * @since 3.0.0 * @deprecated 5.5.0 */ window.navMenuL10n = window.navMenuL10n || { noResultsFound: '', warnDeleteMenu: '', saveAlert: '', untitled: '' }; window.navMenuL10n = deprecateL10nObject( 'navMenuL10n', window.navMenuL10n, '5.5.0' ); /** * Removed in 5.5.0, needed for back-compatibility. * * @since 2.5.0 * @deprecated 5.5.0 */ window.commentL10n = window.commentL10n || { submittedOn: '', dateFormat: '' }; window.commentL10n = deprecateL10nObject( 'commentL10n', window.commentL10n, '5.5.0' ); /** * Removed in 5.5.0, needed for back-compatibility. * * @since 2.9.0 * @deprecated 5.5.0 */ window.setPostThumbnailL10n = window.setPostThumbnailL10n || { setThumbnail: '', saving: '', error: '', done: '' }; window.setPostThumbnailL10n = deprecateL10nObject( 'setPostThumbnailL10n', window.setPostThumbnailL10n, '5.5.0' ); /** * Removed in 6.5.0, needed for back-compatibility. * * @since 4.5.0 * @deprecated 6.5.0 */ window.uiAutocompleteL10n = window.uiAutocompleteL10n || { noResults: '', oneResult: '', manyResults: '', itemSelected: '' }; window.uiAutocompleteL10n = deprecateL10nObject( 'uiAutocompleteL10n', window.uiAutocompleteL10n, '6.5.0' ); /** * Removed in 3.3.0, needed for back-compatibility. * * @since 2.7.0 * @deprecated 3.3.0 */ window.adminMenu = { init : function() {}, fold : function() {}, restoreMenuState : function() {}, toggle : function() {}, favorites : function() {} }; // Show/hide/save table columns. window.columns = { /** * Initializes the column toggles in the screen options. * * Binds an onClick event to the checkboxes to show or hide the table columns * based on their toggled state. And persists the toggled state. * * @since 2.7.0 * * @return {void} */ init : function() { var that = this; $('.hide-column-tog', '#adv-settings').on( 'click', function() { var $t = $(this), column = $t.val(); if ( $t.prop('checked') ) that.checked(column); else that.unchecked(column); columns.saveManageColumnsState(); }); }, /** * Saves the toggled state for the columns. * * Saves whether the columns should be shown or hidden on a page. * * @since 3.0.0 * * @return {void} */ saveManageColumnsState : function() { var hidden = this.hidden(); $.post( ajaxurl, { action: 'hidden-columns', hidden: hidden, screenoptionnonce: $('#screenoptionnonce').val(), page: pagenow }, function() { wp.a11y.speak( __( 'Screen Options updated.' ) ); } ); }, /** * Makes a column visible and adjusts the column span for the table. * * @since 3.0.0 * @param {string} column The column name. * * @return {void} */ checked : function(column) { $('.column-' + column).removeClass( 'hidden' ); this.colSpanChange(+1); }, /** * Hides a column and adjusts the column span for the table. * * @since 3.0.0 * @param {string} column The column name. * * @return {void} */ unchecked : function(column) { $('.column-' + column).addClass( 'hidden' ); this.colSpanChange(-1); }, /** * Gets all hidden columns. * * @since 3.0.0 * * @return {string} The hidden column names separated by a comma. */ hidden : function() { return $( '.manage-column[id]' ).filter( '.hidden' ).map(function() { return this.id; }).get().join( ',' ); }, /** * Gets the checked column toggles from the screen options. * * @since 3.0.0 * * @return {string} String containing the checked column names. */ useCheckboxesForHidden : function() { this.hidden = function(){ return $('.hide-column-tog').not(':checked').map(function() { var id = this.id; return id.substring( id, id.length - 5 ); }).get().join(','); }; }, /** * Adjusts the column span for the table. * * @since 3.1.0 * * @param {number} diff The modifier for the column span. */ colSpanChange : function(diff) { var $t = $('table').find('.colspanchange'), n; if ( !$t.length ) return; n = parseInt( $t.attr('colspan'), 10 ) + diff; $t.attr('colspan', n.toString()); } }; $( function() { columns.init(); } ); /** * Validates that the required form fields are not empty. * * @since 2.9.0 * * @param {jQuery} form The form to validate. * * @return {boolean} Returns true if all required fields are not an empty string. */ window.validateForm = function( form ) { return !$( form ) .find( '.form-required' ) .filter( function() { return $( ':input:visible', this ).val() === ''; } ) .addClass( 'form-invalid' ) .find( ':input:visible' ) .on( 'change', function() { $( this ).closest( '.form-invalid' ).removeClass( 'form-invalid' ); } ) .length; }; // Stub for doing better warnings. /** * Shows message pop-up notice or confirmation message. * * @since 2.7.0 * * @type {{warn: showNotice.warn, note: showNotice.note}} * * @return {void} */ window.showNotice = { /** * Shows a delete confirmation pop-up message. * * @since 2.7.0 * * @return {boolean} Returns true if the message is confirmed. */ warn : function() { if ( confirm( __( 'You are about to permanently delete these items from your site.\nThis action cannot be undone.\n\'Cancel\' to stop, \'OK\' to delete.' ) ) ) { return true; } return false; }, /** * Shows an alert message. * * @since 2.7.0 * * @param text The text to display in the message. */ note : function(text) { alert(text); } }; /** * Represents the functions for the meta screen options panel. * * @since 3.2.0 * * @type {{element: null, toggles: null, page: null, init: screenMeta.init, * toggleEvent: screenMeta.toggleEvent, open: screenMeta.open, * close: screenMeta.close}} * * @return {void} */ window.screenMeta = { element: null, // #screen-meta toggles: null, // .screen-meta-toggle page: null, // #wpcontent /** * Initializes the screen meta options panel. * * @since 3.2.0 * * @return {void} */ init: function() { this.element = $('#screen-meta'); this.toggles = $( '#screen-meta-links' ).find( '.show-settings' ); this.page = $('#wpcontent'); this.toggles.on( 'click', this.toggleEvent ); }, /** * Toggles the screen meta options panel. * * @since 3.2.0 * * @return {void} */ toggleEvent: function() { var panel = $( '#' + $( this ).attr( 'aria-controls' ) ); if ( !panel.length ) return; if ( panel.is(':visible') ) screenMeta.close( panel, $(this) ); else screenMeta.open( panel, $(this) ); }, /** * Opens the screen meta options panel. * * @since 3.2.0 * * @param {jQuery} panel The screen meta options panel div. * @param {jQuery} button The toggle button. * * @return {void} */ open: function( panel, button ) { $( '#screen-meta-links' ).find( '.screen-meta-toggle' ).not( button.parent() ).css( 'visibility', 'hidden' ); panel.parent().show(); /** * Sets the focus to the meta options panel and adds the necessary CSS classes. * * @since 3.2.0 * * @return {void} */ panel.slideDown( 'fast', function() { panel.removeClass( 'hidden' ).trigger( 'focus' ); button.addClass( 'screen-meta-active' ).attr( 'aria-expanded', true ); }); $document.trigger( 'screen:options:open' ); }, /** * Closes the screen meta options panel. * * @since 3.2.0 * * @param {jQuery} panel The screen meta options panel div. * @param {jQuery} button The toggle button. * * @return {void} */ close: function( panel, button ) { /** * Hides the screen meta options panel. * * @since 3.2.0 * * @return {void} */ panel.slideUp( 'fast', function() { button.removeClass( 'screen-meta-active' ).attr( 'aria-expanded', false ); $('.screen-meta-toggle').css('visibility', ''); panel.parent().hide(); panel.addClass( 'hidden' ); }); $document.trigger( 'screen:options:close' ); } }; /** * Initializes the help tabs in the help panel. * * @param {Event} e The event object. * * @return {void} */ $('.contextual-help-tabs').on( 'click', 'a', function(e) { var link = $(this), panel; e.preventDefault(); // Don't do anything if the click is for the tab already showing. if ( link.is('.active a') ) return false; // Links. $('.contextual-help-tabs .active').removeClass('active'); link.parent('li').addClass('active'); panel = $( link.attr('href') ); // Panels. $('.help-tab-content').not( panel ).removeClass('active').hide(); panel.addClass('active').show(); }); /** * Update custom permalink structure via buttons. */ var permalinkStructureFocused = false, $permalinkStructure = $( '#permalink_structure' ), $permalinkStructureInputs = $( '.permalink-structure input:radio' ), $permalinkCustomSelection = $( '#custom_selection' ), $availableStructureTags = $( '.form-table.permalink-structure .available-structure-tags button' ); // Change permalink structure input when selecting one of the common structures. $permalinkStructureInputs.on( 'change', function() { if ( 'custom' === this.value ) { return; } $permalinkStructure.val( this.value ); // Update button states after selection. $availableStructureTags.each( function() { changeStructureTagButtonState( $( this ) ); } ); } ); $permalinkStructure.on( 'click input', function() { $permalinkCustomSelection.prop( 'checked', true ); } ); // Check if the permalink structure input field has had focus at least once. $permalinkStructure.on( 'focus', function( event ) { permalinkStructureFocused = true; $( this ).off( event ); } ); /** * Enables or disables a structure tag button depending on its usage. * * If the structure is already used in the custom permalink structure, * it will be disabled. * * @param {Object} button Button jQuery object. */ function changeStructureTagButtonState( button ) { if ( -1 !== $permalinkStructure.val().indexOf( button.text().trim() ) ) { button.attr( 'data-label', button.attr( 'aria-label' ) ); button.attr( 'aria-label', button.attr( 'data-used' ) ); button.attr( 'aria-pressed', true ); button.addClass( 'active' ); } else if ( button.attr( 'data-label' ) ) { button.attr( 'aria-label', button.attr( 'data-label' ) ); button.attr( 'aria-pressed', false ); button.removeClass( 'active' ); } } // Check initial button state. $availableStructureTags.each( function() { changeStructureTagButtonState( $( this ) ); } ); // Observe permalink structure field and disable buttons of tags that are already present. $permalinkStructure.on( 'change', function() { $availableStructureTags.each( function() { changeStructureTagButtonState( $( this ) ); } ); } ); $availableStructureTags.on( 'click', function() { var permalinkStructureValue = $permalinkStructure.val(), selectionStart = $permalinkStructure[ 0 ].selectionStart, selectionEnd = $permalinkStructure[ 0 ].selectionEnd, textToAppend = $( this ).text().trim(), textToAnnounce, newSelectionStart; if ( $( this ).hasClass( 'active' ) ) { textToAnnounce = $( this ).attr( 'data-removed' ); } else { textToAnnounce = $( this ).attr( 'data-added' ); } // Remove structure tag if already part of the structure. if ( -1 !== permalinkStructureValue.indexOf( textToAppend ) ) { permalinkStructureValue = permalinkStructureValue.replace( textToAppend + '/', '' ); $permalinkStructure.val( '/' === permalinkStructureValue ? '' : permalinkStructureValue ); // Announce change to screen readers. $( '#custom_selection_updated' ).text( textToAnnounce ); // Disable button. changeStructureTagButtonState( $( this ) ); return; } // Input field never had focus, move selection to end of input. if ( ! permalinkStructureFocused && 0 === selectionStart && 0 === selectionEnd ) { selectionStart = selectionEnd = permalinkStructureValue.length; } $permalinkCustomSelection.prop( 'checked', true ); // Prepend and append slashes if necessary. if ( '/' !== permalinkStructureValue.substr( 0, selectionStart ).substr( -1 ) ) { textToAppend = '/' + textToAppend; } if ( '/' !== permalinkStructureValue.substr( selectionEnd, 1 ) ) { textToAppend = textToAppend + '/'; } // Insert structure tag at the specified position. $permalinkStructure.val( permalinkStructureValue.substr( 0, selectionStart ) + textToAppend + permalinkStructureValue.substr( selectionEnd ) ); // Announce change to screen readers. $( '#custom_selection_updated' ).text( textToAnnounce ); // Disable button. changeStructureTagButtonState( $( this ) ); // If input had focus give it back with cursor right after appended text. if ( permalinkStructureFocused && $permalinkStructure[0].setSelectionRange ) { newSelectionStart = ( permalinkStructureValue.substr( 0, selectionStart ) + textToAppend ).length; $permalinkStructure[0].setSelectionRange( newSelectionStart, newSelectionStart ); $permalinkStructure.trigger( 'focus' ); } } ); $( function() { var checks, first, last, checked, sliced, mobileEvent, transitionTimeout, focusedRowActions, lastClicked = false, pageInput = $('input.current-page'), currentPage = pageInput.val(), isIOS = /iPhone|iPad|iPod/.test( navigator.userAgent ), isAndroid = navigator.userAgent.indexOf( 'Android' ) !== -1, $adminMenuWrap = $( '#adminmenuwrap' ), $wpwrap = $( '#wpwrap' ), $adminmenu = $( '#adminmenu' ), $overlay = $( '#wp-responsive-overlay' ), $toolbar = $( '#wp-toolbar' ), $toolbarPopups = $toolbar.find( 'a[aria-haspopup="true"]' ), $sortables = $('.meta-box-sortables'), wpResponsiveActive = false, $adminbar = $( '#wpadminbar' ), lastScrollPosition = 0, pinnedMenuTop = false, pinnedMenuBottom = false, menuTop = 0, menuState, menuIsPinned = false, height = { window: $window.height(), wpwrap: $wpwrap.height(), adminbar: $adminbar.height(), menu: $adminMenuWrap.height() }, $headerEnd = $( '.wp-header-end' ); /** * Makes the fly-out submenu header clickable, when the menu is folded. * * @param {Event} e The event object. * * @return {void} */ $adminmenu.on('click.wp-submenu-head', '.wp-submenu-head', function(e){ $(e.target).parent().siblings('a').get(0).click(); }); /** * Collapses the admin menu. * * @return {void} */ $( '#collapse-button' ).on( 'click.collapse-menu', function() { var viewportWidth = getViewportWidth() || 961; // Reset any compensation for submenus near the bottom of the screen. $('#adminmenu div.wp-submenu').css('margin-top', ''); if ( viewportWidth <= 960 ) { if ( $body.hasClass('auto-fold') ) { $body.removeClass('auto-fold').removeClass('folded'); setUserSetting('unfold', 1); setUserSetting('mfold', 'o'); menuState = 'open'; } else { $body.addClass('auto-fold'); setUserSetting('unfold', 0); menuState = 'folded'; } } else { if ( $body.hasClass('folded') ) { $body.removeClass('folded'); setUserSetting('mfold', 'o'); menuState = 'open'; } else { $body.addClass('folded'); setUserSetting('mfold', 'f'); menuState = 'folded'; } } $document.trigger( 'wp-collapse-menu', { state: menuState } ); }); /** * Ensures an admin submenu is within the visual viewport. * * @since 4.1.0 * * @param {jQuery} $menuItem The parent menu item containing the submenu. * * @return {void} */ function adjustSubmenu( $menuItem ) { var bottomOffset, pageHeight, adjustment, theFold, menutop, wintop, maxtop, $submenu = $menuItem.find( '.wp-submenu' ); menutop = $menuItem.offset().top; wintop = $window.scrollTop(); maxtop = menutop - wintop - 30; // max = make the top of the sub almost touch admin bar. bottomOffset = menutop + $submenu.height() + 1; // Bottom offset of the menu. pageHeight = $wpwrap.height(); // Height of the entire page. adjustment = 60 + bottomOffset - pageHeight; theFold = $window.height() + wintop - 50; // The fold. if ( theFold < ( bottomOffset - adjustment ) ) { adjustment = bottomOffset - theFold; } if ( adjustment > maxtop ) { adjustment = maxtop; } if ( adjustment > 1 && $('#wp-admin-bar-menu-toggle').is(':hidden') ) { $submenu.css( 'margin-top', '-' + adjustment + 'px' ); } else { $submenu.css( 'margin-top', '' ); } } if ( 'ontouchstart' in window || /IEMobile\/[1-9]/.test(navigator.userAgent) ) { // Touch screen device. // iOS Safari works with touchstart, the rest work with click. mobileEvent = isIOS ? 'touchstart' : 'click'; /** * Closes any open submenus when touch/click is not on the menu. * * @param {Event} e The event object. * * @return {void} */ $body.on( mobileEvent+'.wp-mobile-hover', function(e) { if ( $adminmenu.data('wp-responsive') ) { return; } if ( ! $( e.target ).closest( '#adminmenu' ).length ) { $adminmenu.find( 'li.opensub' ).removeClass( 'opensub' ); } }); /** * Handles the opening or closing the submenu based on the mobile click|touch event. * * @param {Event} event The event object. * * @return {void} */ $adminmenu.find( 'a.wp-has-submenu' ).on( mobileEvent + '.wp-mobile-hover', function( event ) { var $menuItem = $(this).parent(); if ( $adminmenu.data( 'wp-responsive' ) ) { return; } /* * Show the sub instead of following the link if: * - the submenu is not open. * - the submenu is not shown inline or the menu is not folded. */ if ( ! $menuItem.hasClass( 'opensub' ) && ( ! $menuItem.hasClass( 'wp-menu-open' ) || $menuItem.width() < 40 ) ) { event.preventDefault(); adjustSubmenu( $menuItem ); $adminmenu.find( 'li.opensub' ).removeClass( 'opensub' ); $menuItem.addClass('opensub'); } }); } if ( ! isIOS && ! isAndroid ) { $adminmenu.find( 'li.wp-has-submenu' ).hoverIntent({ /** * Opens the submenu when hovered over the menu item for desktops. * * @return {void} */ over: function() { var $menuItem = $( this ), $submenu = $menuItem.find( '.wp-submenu' ), top = parseInt( $submenu.css( 'top' ), 10 ); if ( isNaN( top ) || top > -5 ) { // The submenu is visible. return; } if ( $adminmenu.data( 'wp-responsive' ) ) { // The menu is in responsive mode, bail. return; } adjustSubmenu( $menuItem ); $adminmenu.find( 'li.opensub' ).removeClass( 'opensub' ); $menuItem.addClass( 'opensub' ); }, /** * Closes the submenu when no longer hovering the menu item. * * @return {void} */ out: function(){ if ( $adminmenu.data( 'wp-responsive' ) ) { // The menu is in responsive mode, bail. return; } $( this ).removeClass( 'opensub' ).find( '.wp-submenu' ).css( 'margin-top', '' ); }, timeout: 200, sensitivity: 7, interval: 90 }); /** * Opens the submenu on when focused on the menu item. * * @param {Event} event The event object. * * @return {void} */ $adminmenu.on( 'focus.adminmenu', '.wp-submenu a', function( event ) { if ( $adminmenu.data( 'wp-responsive' ) ) { // The menu is in responsive mode, bail. return; } $( event.target ).closest( 'li.menu-top' ).addClass( 'opensub' ); /** * Closes the submenu on blur from the menu item. * * @param {Event} event The event object. * * @return {void} */ }).on( 'blur.adminmenu', '.wp-submenu a', function( event ) { if ( $adminmenu.data( 'wp-responsive' ) ) { return; } $( event.target ).closest( 'li.menu-top' ).removeClass( 'opensub' ); /** * Adjusts the size for the submenu. * * @return {void} */ }).find( 'li.wp-has-submenu.wp-not-current-submenu' ).on( 'focusin.adminmenu', function() { adjustSubmenu( $( this ) ); }); } /* * The `.below-h2` class is here just for backward compatibility with plugins * that are (incorrectly) using it. Do not use. Use `.inline` instead. See #34570. * If '.wp-header-end' is found, append the notices after it otherwise * after the first h1 or h2 heading found within the main content. */ if ( ! $headerEnd.length ) { $headerEnd = $( '.wrap h1, .wrap h2' ).first(); } $( 'div.updated, div.error, div.notice' ).not( '.inline, .below-h2' ).insertAfter( $headerEnd ); /** * Makes notices dismissible. * * @since 4.4.0 * * @return {void} */ function makeNoticesDismissible() { $( '.notice.is-dismissible' ).each( function() { var $el = $( this ), $button = $( '' ); if ( $el.find( '.notice-dismiss' ).length ) { return; } // Ensure plain text. $button.find( '.screen-reader-text' ).text( __( 'Dismiss this notice.' ) ); $button.on( 'click.wp-dismiss-notice', function( event ) { event.preventDefault(); $el.fadeTo( 100, 0, function() { $el.slideUp( 100, function() { $el.remove(); }); }); }); $el.append( $button ); }); } $document.on( 'wp-updates-notice-added wp-plugin-install-error wp-plugin-update-error wp-plugin-delete-error wp-theme-install-error wp-theme-delete-error wp-notice-added', makeNoticesDismissible ); // Init screen meta. screenMeta.init(); /** * Checks a checkbox. * * This event needs to be delegated. Ticket #37973. * * @return {boolean} Returns whether a checkbox is checked or not. */ $body.on( 'click', 'tbody > tr > .check-column :checkbox', function( event ) { // Shift click to select a range of checkboxes. if ( 'undefined' == event.shiftKey ) { return true; } if ( event.shiftKey ) { if ( !lastClicked ) { return true; } checks = $( lastClicked ).closest( 'form' ).find( ':checkbox' ).filter( ':visible:enabled' ); first = checks.index( lastClicked ); last = checks.index( this ); checked = $(this).prop('checked'); if ( 0 < first && 0 < last && first != last ) { sliced = ( last > first ) ? checks.slice( first, last ) : checks.slice( last, first ); sliced.prop( 'checked', function() { if ( $(this).closest('tr').is(':visible') ) return checked; return false; }); } } lastClicked = this; // Toggle the "Select all" checkboxes depending if the other ones are all checked or not. var unchecked = $(this).closest('tbody').find('tr').find(':checkbox').filter(':visible:enabled').not(':checked'); /** * Determines if all checkboxes are checked. * * @return {boolean} Returns true if there are no unchecked checkboxes. */ $(this).closest('table').children('thead, tfoot').find(':checkbox').prop('checked', function() { return ( 0 === unchecked.length ); }); return true; }); /** * Controls all the toggles on bulk toggle change. * * When the bulk checkbox is changed, all the checkboxes in the tables are changed accordingly. * When the shift-button is pressed while changing the bulk checkbox the checkboxes in the table are inverted. * * This event needs to be delegated. Ticket #37973. * * @param {Event} event The event object. * * @return {boolean} */ $body.on( 'click.wp-toggle-checkboxes', 'thead .check-column :checkbox, tfoot .check-column :checkbox', function( event ) { var $this = $(this), $table = $this.closest( 'table' ), controlChecked = $this.prop('checked'), toggle = event.shiftKey || $this.data('wp-toggle'); $table.children( 'tbody' ).filter(':visible') .children().children('.check-column').find(':checkbox') /** * Updates the checked state on the checkbox in the table. * * @return {boolean} True checks the checkbox, False unchecks the checkbox. */ .prop('checked', function() { if ( $(this).is(':hidden,:disabled') ) { return false; } if ( toggle ) { return ! $(this).prop( 'checked' ); } else if ( controlChecked ) { return true; } return false; }); $table.children('thead, tfoot').filter(':visible') .children().children('.check-column').find(':checkbox') /** * Syncs the bulk checkboxes on the top and bottom of the table. * * @return {boolean} True checks the checkbox, False unchecks the checkbox. */ .prop('checked', function() { if ( toggle ) { return false; } else if ( controlChecked ) { return true; } return false; }); }); /** * Marries a secondary control to its primary control. * * @param {jQuery} topSelector The top selector element. * @param {jQuery} topSubmit The top submit element. * @param {jQuery} bottomSelector The bottom selector element. * @param {jQuery} bottomSubmit The bottom submit element. * @return {void} */ function marryControls( topSelector, topSubmit, bottomSelector, bottomSubmit ) { /** * Updates the primary selector when the secondary selector is changed. * * @since 5.7.0 * * @return {void} */ function updateTopSelector() { topSelector.val($(this).val()); } bottomSelector.on('change', updateTopSelector); /** * Updates the secondary selector when the primary selector is changed. * * @since 5.7.0 * * @return {void} */ function updateBottomSelector() { bottomSelector.val($(this).val()); } topSelector.on('change', updateBottomSelector); /** * Triggers the primary submit when then secondary submit is clicked. * * @since 5.7.0 * * @return {void} */ function triggerSubmitClick(e) { e.preventDefault(); e.stopPropagation(); topSubmit.trigger('click'); } bottomSubmit.on('click', triggerSubmitClick); } // Marry the secondary "Bulk actions" controls to the primary controls: marryControls( $('#bulk-action-selector-top'), $('#doaction'), $('#bulk-action-selector-bottom'), $('#doaction2') ); // Marry the secondary "Change role to" controls to the primary controls: marryControls( $('#new_role'), $('#changeit'), $('#new_role2'), $('#changeit2') ); var addAdminNotice = function( data ) { var $notice = $( data.selector ), $headerEnd = $( '.wp-header-end' ), type, dismissible, $adminNotice; delete data.selector; dismissible = ( data.dismissible && data.dismissible === true ) ? ' is-dismissible' : ''; type = ( data.type ) ? data.type : 'info'; $adminNotice = '

    ' + data.message + '

    '; // Check if this admin notice already exists. if ( ! $notice.length ) { $notice = $( '#' + data.id ); } if ( $notice.length ) { $notice.replaceWith( $adminNotice ); } else if ( $headerEnd.length ) { $headerEnd.after( $adminNotice ); } else { if ( 'customize' === pagenow ) { $( '.customize-themes-notifications' ).append( $adminNotice ); } else { $( '.wrap' ).find( '> h1' ).after( $adminNotice ); } } $document.trigger( 'wp-notice-added' ); }; $( '.bulkactions' ).parents( 'form' ).on( 'submit', function( event ) { var form = this, submitterName = event.originalEvent && event.originalEvent.submitter ? event.originalEvent.submitter.name : false, currentPageSelector = form.querySelector( '#current-page-selector' ); if ( currentPageSelector && currentPageSelector.defaultValue !== currentPageSelector.value ) { return; // Pagination form submission. } // Observe submissions from posts lists for 'bulk_action' or users lists for 'new_role'. var bulkFieldRelations = { 'bulk_action' : window.bulkActionObserverIds.bulk_action, 'changeit' : window.bulkActionObserverIds.changeit }; if ( ! Object.keys( bulkFieldRelations ).includes( submitterName ) ) { return; } var values = new FormData(form); var value = values.get( bulkFieldRelations[ submitterName ] ) || '-1'; // Check that the action is not the default one. if ( value !== '-1' ) { // Check that at least one item is selected. var itemsSelected = form.querySelectorAll( '.wp-list-table tbody .check-column input[type="checkbox"]:checked' ); if ( itemsSelected.length > 0 ) { return; } } event.preventDefault(); event.stopPropagation(); $( 'html, body' ).animate( { scrollTop: 0 } ); var errorMessage = __( 'Please select at least one item to perform this action on.' ); addAdminNotice( { id: 'no-items-selected', type: 'error', message: errorMessage, dismissible: true, } ); wp.a11y.speak( errorMessage ); }); /** * Shows row actions on focus of its parent container element or any other elements contained within. * * @return {void} */ $( '#wpbody-content' ).on({ focusin: function() { clearTimeout( transitionTimeout ); focusedRowActions = $( this ).find( '.row-actions' ); // transitionTimeout is necessary for Firefox, but Chrome won't remove the CSS class without a little help. $( '.row-actions' ).not( this ).removeClass( 'visible' ); focusedRowActions.addClass( 'visible' ); }, focusout: function() { // Tabbing between post title and .row-actions links needs a brief pause, otherwise // the .row-actions div gets hidden in transit in some browsers (ahem, Firefox). transitionTimeout = setTimeout( function() { focusedRowActions.removeClass( 'visible' ); }, 30 ); } }, '.table-view-list .has-row-actions' ); // Toggle list table rows on small screens. $( 'tbody' ).on( 'click', '.toggle-row', function() { $( this ).closest( 'tr' ).toggleClass( 'is-expanded' ); }); $('#default-password-nag-no').on( 'click', function() { setUserSetting('default_password_nag', 'hide'); $('div.default-password-nag').hide(); return false; }); /** * Handles tab keypresses in theme and plugin file editor textareas. * * @param {Event} e The event object. * * @return {void} */ $('#newcontent').on('keydown.wpevent_InsertTab', function(e) { var el = e.target, selStart, selEnd, val, scroll, sel; // After pressing escape key (keyCode: 27), the tab key should tab out of the textarea. if ( e.keyCode == 27 ) { // When pressing Escape: Opera 12 and 27 blur form fields, IE 8 clears them. e.preventDefault(); $(el).data('tab-out', true); return; } // Only listen for plain tab key (keyCode: 9) without any modifiers. if ( e.keyCode != 9 || e.ctrlKey || e.altKey || e.shiftKey ) return; // After tabbing out, reset it so next time the tab key can be used again. if ( $(el).data('tab-out') ) { $(el).data('tab-out', false); return; } selStart = el.selectionStart; selEnd = el.selectionEnd; val = el.value; // If any text is selected, replace the selection with a tab character. if ( document.selection ) { el.focus(); sel = document.selection.createRange(); sel.text = '\t'; } else if ( selStart >= 0 ) { scroll = this.scrollTop; el.value = val.substring(0, selStart).concat('\t', val.substring(selEnd) ); el.selectionStart = el.selectionEnd = selStart + 1; this.scrollTop = scroll; } // Cancel the regular tab functionality, to prevent losing focus of the textarea. if ( e.stopPropagation ) e.stopPropagation(); if ( e.preventDefault ) e.preventDefault(); }); // Reset page number variable for new filters/searches but not for bulk actions. See #17685. if ( pageInput.length ) { /** * Handles pagination variable when filtering the list table. * * Set the pagination argument to the first page when the post-filter form is submitted. * This happens when pressing the 'filter' button on the list table page. * * The pagination argument should not be touched when the bulk action dropdowns are set to do anything. * * The form closest to the pageInput is the post-filter form. * * @return {void} */ pageInput.closest('form').on( 'submit', function() { /* * action = bulk action dropdown at the top of the table */ if ( $('select[name="action"]').val() == -1 && pageInput.val() == currentPage ) pageInput.val('1'); }); } /** * Resets the bulk actions when the search button is clicked. * * @return {void} */ $('.search-box input[type="search"], .search-box input[type="submit"]').on( 'mousedown', function () { $('select[name^="action"]').val('-1'); }); /** * Scrolls into view when focus.scroll-into-view is triggered. * * @param {Event} e The event object. * * @return {void} */ $('#contextual-help-link, #show-settings-link').on( 'focus.scroll-into-view', function(e){ if ( e.target.scrollIntoViewIfNeeded ) e.target.scrollIntoViewIfNeeded(false); }); /** * Disables the submit upload buttons when no data is entered. * * @return {void} */ (function(){ var button, input, form = $('form.wp-upload-form'); // Exit when no upload form is found. if ( ! form.length ) return; button = form.find('input[type="submit"]'); input = form.find('input[type="file"]'); /** * Determines if any data is entered in any file upload input. * * @since 3.5.0 * * @return {void} */ function toggleUploadButton() { // When no inputs have a value, disable the upload buttons. button.prop('disabled', '' === input.map( function() { return $(this).val(); }).get().join('')); } // Update the status initially. toggleUploadButton(); // Update the status when any file input changes. input.on('change', toggleUploadButton); })(); /** * Pins the menu while distraction-free writing is enabled. * * @param {Event} event Event data. * * @since 4.1.0 * * @return {void} */ function pinMenu( event ) { var windowPos = $window.scrollTop(), resizing = ! event || event.type !== 'scroll'; if ( isIOS || $adminmenu.data( 'wp-responsive' ) ) { return; } /* * When the menu is higher than the window and smaller than the entire page. * It should be adjusted to be able to see the entire menu. * * Otherwise it can be accessed normally. */ if ( height.menu + height.adminbar < height.window || height.menu + height.adminbar + 20 > height.wpwrap ) { unpinMenu(); return; } menuIsPinned = true; // If the menu is higher than the window, compensate on scroll. if ( height.menu + height.adminbar > height.window ) { // Check for overscrolling, this happens when swiping up at the top of the document in modern browsers. if ( windowPos < 0 ) { // Stick the menu to the top. if ( ! pinnedMenuTop ) { pinnedMenuTop = true; pinnedMenuBottom = false; $adminMenuWrap.css({ position: 'fixed', top: '', bottom: '' }); } return; } else if ( windowPos + height.window > $document.height() - 1 ) { // When overscrolling at the bottom, stick the menu to the bottom. if ( ! pinnedMenuBottom ) { pinnedMenuBottom = true; pinnedMenuTop = false; $adminMenuWrap.css({ position: 'fixed', top: '', bottom: 0 }); } return; } if ( windowPos > lastScrollPosition ) { // When a down scroll has been detected. // If it was pinned to the top, unpin and calculate relative scroll. if ( pinnedMenuTop ) { pinnedMenuTop = false; // Calculate new offset position. menuTop = $adminMenuWrap.offset().top - height.adminbar - ( windowPos - lastScrollPosition ); if ( menuTop + height.menu + height.adminbar < windowPos + height.window ) { menuTop = windowPos + height.window - height.menu - height.adminbar; } $adminMenuWrap.css({ position: 'absolute', top: menuTop, bottom: '' }); } else if ( ! pinnedMenuBottom && $adminMenuWrap.offset().top + height.menu < windowPos + height.window ) { // Pin it to the bottom. pinnedMenuBottom = true; $adminMenuWrap.css({ position: 'fixed', top: '', bottom: 0 }); } } else if ( windowPos < lastScrollPosition ) { // When a scroll up is detected. // If it was pinned to the bottom, unpin and calculate relative scroll. if ( pinnedMenuBottom ) { pinnedMenuBottom = false; // Calculate new offset position. menuTop = $adminMenuWrap.offset().top - height.adminbar + ( lastScrollPosition - windowPos ); if ( menuTop + height.menu > windowPos + height.window ) { menuTop = windowPos; } $adminMenuWrap.css({ position: 'absolute', top: menuTop, bottom: '' }); } else if ( ! pinnedMenuTop && $adminMenuWrap.offset().top >= windowPos + height.adminbar ) { // Pin it to the top. pinnedMenuTop = true; $adminMenuWrap.css({ position: 'fixed', top: '', bottom: '' }); } } else if ( resizing ) { // Window is being resized. pinnedMenuTop = pinnedMenuBottom = false; // Calculate the new offset. menuTop = windowPos + height.window - height.menu - height.adminbar - 1; if ( menuTop > 0 ) { $adminMenuWrap.css({ position: 'absolute', top: menuTop, bottom: '' }); } else { unpinMenu(); } } } lastScrollPosition = windowPos; } /** * Determines the height of certain elements. * * @since 4.1.0 * * @return {void} */ function resetHeights() { height = { window: $window.height(), wpwrap: $wpwrap.height(), adminbar: $adminbar.height(), menu: $adminMenuWrap.height() }; } /** * Unpins the menu. * * @since 4.1.0 * * @return {void} */ function unpinMenu() { if ( isIOS || ! menuIsPinned ) { return; } pinnedMenuTop = pinnedMenuBottom = menuIsPinned = false; $adminMenuWrap.css({ position: '', top: '', bottom: '' }); } /** * Pins and unpins the menu when applicable. * * @since 4.1.0 * * @return {void} */ function setPinMenu() { resetHeights(); if ( $adminmenu.data('wp-responsive') ) { $body.removeClass( 'sticky-menu' ); unpinMenu(); } else if ( height.menu + height.adminbar > height.window ) { pinMenu(); $body.removeClass( 'sticky-menu' ); } else { $body.addClass( 'sticky-menu' ); unpinMenu(); } } if ( ! isIOS ) { $window.on( 'scroll.pin-menu', pinMenu ); $document.on( 'tinymce-editor-init.pin-menu', function( event, editor ) { editor.on( 'wp-autoresize', resetHeights ); }); } /** * Changes the sortables and responsiveness of metaboxes. * * @since 3.8.0 * * @return {void} */ window.wpResponsive = { /** * Initializes the wpResponsive object. * * @since 3.8.0 * * @return {void} */ init: function() { var self = this; this.maybeDisableSortables = this.maybeDisableSortables.bind( this ); // Modify functionality based on custom activate/deactivate event. $document.on( 'wp-responsive-activate.wp-responsive', function() { self.activate(); self.toggleAriaHasPopup( 'add' ); }).on( 'wp-responsive-deactivate.wp-responsive', function() { self.deactivate(); self.toggleAriaHasPopup( 'remove' ); }); $( '#wp-admin-bar-menu-toggle a' ).attr( 'aria-expanded', 'false' ); // Toggle sidebar when toggle is clicked. $( '#wp-admin-bar-menu-toggle' ).on( 'click.wp-responsive', function( event ) { event.preventDefault(); // Close any open toolbar submenus. $adminbar.find( '.hover' ).removeClass( 'hover' ); $wpwrap.toggleClass( 'wp-responsive-open' ); if ( $wpwrap.hasClass( 'wp-responsive-open' ) ) { $(this).find('a').attr( 'aria-expanded', 'true' ); $( '#adminmenu a:first' ).trigger( 'focus' ); } else { $(this).find('a').attr( 'aria-expanded', 'false' ); } } ); // Close sidebar when target moves outside of toggle and sidebar. $( document ).on( 'click', function( event ) { if ( ! $wpwrap.hasClass( 'wp-responsive-open' ) || ! document.hasFocus() ) { return; } var focusIsInToggle = $.contains( $( '#wp-admin-bar-menu-toggle' )[0], event.target ); var focusIsInSidebar = $.contains( $( '#adminmenuwrap' )[0], event.target ); if ( ! focusIsInToggle && ! focusIsInSidebar ) { $( '#wp-admin-bar-menu-toggle' ).trigger( 'click.wp-responsive' ); } } ); // Close sidebar when a keypress completes outside of toggle and sidebar. $( document ).on( 'keyup', function( event ) { var toggleButton = $( '#wp-admin-bar-menu-toggle' )[0]; if ( ! $wpwrap.hasClass( 'wp-responsive-open' ) ) { return; } if ( 27 === event.keyCode ) { $( toggleButton ).trigger( 'click.wp-responsive' ); $( toggleButton ).find( 'a' ).trigger( 'focus' ); } else { if ( 9 === event.keyCode ) { var sidebar = $( '#adminmenuwrap' )[0]; var focusedElement = event.relatedTarget || document.activeElement; // A brief delay is required to allow focus to switch to another element. setTimeout( function() { var focusIsInToggle = $.contains( toggleButton, focusedElement ); var focusIsInSidebar = $.contains( sidebar, focusedElement ); if ( ! focusIsInToggle && ! focusIsInSidebar ) { $( toggleButton ).trigger( 'click.wp-responsive' ); } }, 10 ); } } }); // Add menu events. $adminmenu.on( 'click.wp-responsive', 'li.wp-has-submenu > a', function( event ) { if ( ! $adminmenu.data('wp-responsive') ) { return; } let state = ( 'false' === $( this ).attr( 'aria-expanded' ) ) ? 'true' : 'false'; $( this ).parent( 'li' ).toggleClass( 'selected' ); $( this ).attr( 'aria-expanded', state ); $( this ).trigger( 'focus' ); event.preventDefault(); }); self.trigger(); $document.on( 'wp-window-resized.wp-responsive', this.trigger.bind( this ) ); // This needs to run later as UI Sortable may be initialized when the document is ready. $window.on( 'load.wp-responsive', this.maybeDisableSortables ); $document.on( 'postbox-toggled', this.maybeDisableSortables ); // When the screen columns are changed, potentially disable sortables. $( '#screen-options-wrap input' ).on( 'click', this.maybeDisableSortables ); }, /** * Disable sortables if there is only one metabox, or the screen is in one column mode. Otherwise, enable sortables. * * @since 5.3.0 * * @return {void} */ maybeDisableSortables: function() { var width = navigator.userAgent.indexOf('AppleWebKit/') > -1 ? $window.width() : window.innerWidth; if ( ( width <= 782 ) || ( 1 >= $sortables.find( '.ui-sortable-handle:visible' ).length && jQuery( '.columns-prefs-1 input' ).prop( 'checked' ) ) ) { this.disableSortables(); } else { this.enableSortables(); } }, /** * Changes properties of body and admin menu. * * Pins and unpins the menu and adds the auto-fold class to the body. * Makes the admin menu responsive and disables the metabox sortables. * * @since 3.8.0 * * @return {void} */ activate: function() { setPinMenu(); if ( ! $body.hasClass( 'auto-fold' ) ) { $body.addClass( 'auto-fold' ); } $adminmenu.data( 'wp-responsive', 1 ); this.disableSortables(); }, /** * Changes properties of admin menu and enables metabox sortables. * * Pin and unpin the menu. * Removes the responsiveness of the admin menu and enables the metabox sortables. * * @since 3.8.0 * * @return {void} */ deactivate: function() { setPinMenu(); $adminmenu.removeData('wp-responsive'); this.maybeDisableSortables(); }, /** * Toggles the aria-haspopup attribute for the responsive admin menu. * * The aria-haspopup attribute is only necessary for the responsive menu. * See ticket https://core.trac.wordpress.org/ticket/43095 * * @since 6.6.0 * * @param {string} action Whether to add or remove the aria-haspopup attribute. * * @return {void} */ toggleAriaHasPopup: function( action ) { var elements = $adminmenu.find( '[data-ariahaspopup]' ); if ( action === 'add' ) { elements.each( function() { $( this ).attr( 'aria-haspopup', 'menu' ).attr( 'aria-expanded', 'false' ); } ); return; } elements.each( function() { $( this ).removeAttr( 'aria-haspopup' ).removeAttr( 'aria-expanded' ); } ); }, /** * Sets the responsiveness and enables the overlay based on the viewport width. * * @since 3.8.0 * * @return {void} */ trigger: function() { var viewportWidth = getViewportWidth(); // Exclude IE < 9, it doesn't support @media CSS rules. if ( ! viewportWidth ) { return; } if ( viewportWidth <= 782 ) { if ( ! wpResponsiveActive ) { $document.trigger( 'wp-responsive-activate' ); wpResponsiveActive = true; } } else { if ( wpResponsiveActive ) { $document.trigger( 'wp-responsive-deactivate' ); wpResponsiveActive = false; } } if ( viewportWidth <= 480 ) { this.enableOverlay(); } else { this.disableOverlay(); } this.maybeDisableSortables(); }, /** * Inserts a responsive overlay and toggles the window. * * @since 3.8.0 * * @return {void} */ enableOverlay: function() { if ( $overlay.length === 0 ) { $overlay = $( '
    ' ) .insertAfter( '#wpcontent' ) .hide() .on( 'click.wp-responsive', function() { $toolbar.find( '.menupop.hover' ).removeClass( 'hover' ); $( this ).hide(); }); } $toolbarPopups.on( 'click.wp-responsive', function() { $overlay.show(); }); }, /** * Disables the responsive overlay and removes the overlay. * * @since 3.8.0 * * @return {void} */ disableOverlay: function() { $toolbarPopups.off( 'click.wp-responsive' ); $overlay.hide(); }, /** * Disables sortables. * * @since 3.8.0 * * @return {void} */ disableSortables: function() { if ( $sortables.length ) { try { $sortables.sortable( 'disable' ); $sortables.find( '.ui-sortable-handle' ).addClass( 'is-non-sortable' ); } catch ( e ) {} } }, /** * Enables sortables. * * @since 3.8.0 * * @return {void} */ enableSortables: function() { if ( $sortables.length ) { try { $sortables.sortable( 'enable' ); $sortables.find( '.ui-sortable-handle' ).removeClass( 'is-non-sortable' ); } catch ( e ) {} } } }; /** * Add an ARIA role `button` to elements that behave like UI controls when JavaScript is on. * * @since 4.5.0 * * @return {void} */ function aria_button_if_js() { $( '.aria-button-if-js' ).attr( 'role', 'button' ); } $( document ).on( 'ajaxComplete', function() { aria_button_if_js(); }); /** * Get the viewport width. * * @since 4.7.0 * * @return {number|boolean} The current viewport width or false if the * browser doesn't support innerWidth (IE < 9). */ function getViewportWidth() { var viewportWidth = false; if ( window.innerWidth ) { // On phones, window.innerWidth is affected by zooming. viewportWidth = Math.max( window.innerWidth, document.documentElement.clientWidth ); } return viewportWidth; } /** * Sets the admin menu collapsed/expanded state. * * Sets the global variable `menuState` and triggers a custom event passing * the current menu state. * * @since 4.7.0 * * @return {void} */ function setMenuState() { var viewportWidth = getViewportWidth() || 961; if ( viewportWidth <= 782 ) { menuState = 'responsive'; } else if ( $body.hasClass( 'folded' ) || ( $body.hasClass( 'auto-fold' ) && viewportWidth <= 960 && viewportWidth > 782 ) ) { menuState = 'folded'; } else { menuState = 'open'; } $document.trigger( 'wp-menu-state-set', { state: menuState } ); } // Set the menu state when the window gets resized. $document.on( 'wp-window-resized.set-menu-state', setMenuState ); /** * Sets ARIA attributes on the collapse/expand menu button. * * When the admin menu is open or folded, updates the `aria-expanded` and * `aria-label` attributes of the button to give feedback to assistive * technologies. In the responsive view, the button is always hidden. * * @since 4.7.0 * * @return {void} */ $document.on( 'wp-menu-state-set wp-collapse-menu', function( event, eventData ) { var $collapseButton = $( '#collapse-button' ), ariaExpanded, ariaLabelText; if ( 'folded' === eventData.state ) { ariaExpanded = 'false'; ariaLabelText = __( 'Expand Main menu' ); } else { ariaExpanded = 'true'; ariaLabelText = __( 'Collapse Main menu' ); } $collapseButton.attr({ 'aria-expanded': ariaExpanded, 'aria-label': ariaLabelText }); }); window.wpResponsive.init(); setPinMenu(); setMenuState(); makeNoticesDismissible(); aria_button_if_js(); $document.on( 'wp-pin-menu wp-window-resized.pin-menu postboxes-columnchange.pin-menu postbox-toggled.pin-menu wp-collapse-menu.pin-menu wp-scroll-start.pin-menu', setPinMenu ); // Set initial focus on a specific element. $( '.wp-initial-focus' ).trigger( 'focus' ); // Toggle update details on update-core.php. $body.on( 'click', '.js-update-details-toggle', function() { var $updateNotice = $( this ).closest( '.js-update-details' ), $progressDiv = $( '#' + $updateNotice.data( 'update-details' ) ); /* * When clicking on "Show details" move the progress div below the update * notice. Make sure it gets moved just the first time. */ if ( ! $progressDiv.hasClass( 'update-details-moved' ) ) { $progressDiv.insertAfter( $updateNotice ).addClass( 'update-details-moved' ); } // Toggle the progress div visibility. $progressDiv.toggle(); // Toggle the Show Details button expanded state. $( this ).attr( 'aria-expanded', $progressDiv.is( ':visible' ) ); }); }); /** * Hides the update button for expired plugin or theme uploads. * * On the "Update plugin/theme from uploaded zip" screen, once the upload has expired, * hides the "Replace current with uploaded" button and displays a warning. * * @since 5.5.0 */ $( function( $ ) { var $overwrite, $warning; if ( ! $body.hasClass( 'update-php' ) ) { return; } $overwrite = $( 'a.update-from-upload-overwrite' ); $warning = $( '.update-from-upload-expired' ); if ( ! $overwrite.length || ! $warning.length ) { return; } window.setTimeout( function() { $overwrite.hide(); $warning.removeClass( 'hidden' ); if ( window.wp && window.wp.a11y ) { window.wp.a11y.speak( $warning.text() ); } }, 7140000 // 119 minutes. The uploaded file is deleted after 2 hours. ); } ); // Fire a custom jQuery event at the end of window resize. ( function() { var timeout; /** * Triggers the WP window-resize event. * * @since 3.8.0 * * @return {void} */ function triggerEvent() { $document.trigger( 'wp-window-resized' ); } /** * Fires the trigger event again after 200 ms. * * @since 3.8.0 * * @return {void} */ function fireOnce() { window.clearTimeout( timeout ); timeout = window.setTimeout( triggerEvent, 200 ); } $window.on( 'resize.wp-fire-once', fireOnce ); }()); // Make Windows 8 devices play along nicely. (function(){ if ( '-ms-user-select' in document.documentElement.style && navigator.userAgent.match(/IEMobile\/10\.0/) ) { var msViewportStyle = document.createElement( 'style' ); msViewportStyle.appendChild( document.createTextNode( '@-ms-viewport{width:auto!important}' ) ); document.getElementsByTagName( 'head' )[0].appendChild( msViewportStyle ); } })(); }( jQuery, window )); /** * Freeze animated plugin icons when reduced motion is enabled. * * When the user has enabled the 'prefers-reduced-motion' setting, this module * stops animations for all GIFs on the page with the class 'plugin-icon' or * plugin icon images in the update plugins table. * * @since 6.4.0 */ (function() { // Private variables and methods. var priv = {}, pub = {}, mediaQuery; // Initialize pauseAll to false; it will be set to true if reduced motion is preferred. priv.pauseAll = false; if ( window.matchMedia ) { mediaQuery = window.matchMedia( '(prefers-reduced-motion: reduce)' ); if ( ! mediaQuery || mediaQuery.matches ) { priv.pauseAll = true; } } // Method to replace animated GIFs with a static frame. priv.freezeAnimatedPluginIcons = function( img ) { var coverImage = function() { var width = img.width; var height = img.height; var canvas = document.createElement( 'canvas' ); // Set canvas dimensions. canvas.width = width; canvas.height = height; // Copy classes from the image to the canvas. canvas.className = img.className; // Check if the image is inside a specific table. var isInsideUpdateTable = img.closest( '#update-plugins-table' ); if ( isInsideUpdateTable ) { // Transfer computed styles from image to canvas. var computedStyles = window.getComputedStyle( img ), i, max; for ( i = 0, max = computedStyles.length; i < max; i++ ) { var propName = computedStyles[ i ]; var propValue = computedStyles.getPropertyValue( propName ); canvas.style[ propName ] = propValue; } } // Draw the image onto the canvas. canvas.getContext( '2d' ).drawImage( img, 0, 0, width, height ); // Set accessibility attributes on canvas. canvas.setAttribute( 'aria-hidden', 'true' ); canvas.setAttribute( 'role', 'presentation' ); // Insert canvas before the image and set the image to be near-invisible. var parent = img.parentNode; parent.insertBefore( canvas, img ); img.style.opacity = 0.01; img.style.width = '0px'; img.style.height = '0px'; }; // If the image is already loaded, apply the coverImage function. if ( img.complete ) { coverImage(); } else { // Otherwise, wait for the image to load. img.addEventListener( 'load', coverImage, true ); } }; // Public method to freeze all relevant GIFs on the page. pub.freezeAll = function() { var images = document.querySelectorAll( '.plugin-icon, #update-plugins-table img' ); for ( var x = 0; x < images.length; x++ ) { if ( /\.gif(?:\?|$)/i.test( images[ x ].src ) ) { priv.freezeAnimatedPluginIcons( images[ x ] ); } } }; // Only run the freezeAll method if the user prefers reduced motion. if ( true === priv.pauseAll ) { pub.freezeAll(); } // Listen for jQuery AJAX events. ( function( $ ) { if ( window.pagenow === 'plugin-install' ) { // Only listen for ajaxComplete if this is the plugin-install.php page. $( document ).ajaxComplete( function( event, xhr, settings ) { // Check if this is the 'search-install-plugins' request. if ( settings.data && typeof settings.data === 'string' && settings.data.includes( 'action=search-install-plugins' ) ) { // Recheck if the user prefers reduced motion. if ( window.matchMedia ) { var mediaQuery = window.matchMedia( '(prefers-reduced-motion: reduce)' ); if ( mediaQuery.matches ) { pub.freezeAll(); } } else { // Fallback for browsers that don't support matchMedia. if ( true === priv.pauseAll ) { pub.freezeAll(); } } } } ); } } )( jQuery ); // Expose public methods. return pub; })(); PKZry$$js/auth-app.min.jsnu[/*! This file is auto-generated */ !function(t,s){var p=t("#app_name"),r=t("#approve"),e=t("#reject"),n=p.closest("form"),i={userLogin:s.user_login,successUrl:s.success,rejectUrl:s.reject};r.on("click",function(e){var a=p.val(),o=t('input[name="app_id"]',n).val();e.preventDefault(),r.prop("aria-disabled")||(0===a.length?p.trigger("focus"):(r.prop("aria-disabled",!0).addClass("disabled"),e={name:a},0'+wp.i18n.__("Your new password for %s is:")+"","")+' ',o=t("
    ").attr("role","alert").attr("tabindex",-1).addClass("notice notice-success notice-alt").append(t("

    ").addClass("application-password-display").html(a)).append("

    "+wp.i18n.__("Be sure to save this in a safe location. You will not be able to retrieve it.")+"

    "),t("strong",o).text(e.name),t("input",o).val(e.password),n.replaceWith(o),o.trigger("focus"))}).fail(function(e,a,o){var s=o,p=null,s=(e.responseJSON&&(p=e.responseJSON).message&&(s=p.message),t("
    ").attr("role","alert").addClass("notice notice-error").append(t("

    ").text(s)));t("h1").after(s),r.removeProp("aria-disabled",!1).removeClass("disabled"),wp.hooks.doAction("wp_application_passwords_approve_app_request_error",p,a,o,e)})))}),e.on("click",function(e){e.preventDefault(),wp.hooks.doAction("wp_application_passwords_reject_app",i),window.location=s.reject}),n.on("submit",function(e){e.preventDefault()})}(jQuery,authApp);PKZjs/user-suggest.min.jsnu[/*! This file is auto-generated */ !function(a){var n="undefined"!=typeof current_site_id?"&site_id="+current_site_id:"";a(function(){var i={offset:"0, -1"};"undefined"!=typeof isRtl&&isRtl&&(i.my="right top",i.at="right bottom"),a(".wp-suggest-user").each(function(){var e=a(this),t=void 0!==e.data("autocompleteType")?e.data("autocompleteType"):"add",o=void 0!==e.data("autocompleteField")?e.data("autocompleteField"):"user_login";e.autocomplete({source:ajaxurl+"?action=autocomplete-user&autocomplete_type="+t+"&autocomplete_field="+o+n,delay:500,minLength:2,position:i,open:function(){a(this).addClass("open")},close:function(){a(this).removeClass("open")}})})})}(jQuery);PKZl44js/editor-expand.min.jsnu[/*! This file is auto-generated */ !function(F,I){"use strict";var L=I(F),M=I(document),V=I("#wpadminbar"),N=I("#wpfooter");I(function(){var g,e,u=I("#postdivrich"),h=I("#wp-content-wrap"),m=I("#wp-content-editor-tools"),w=I(),H=I(),b=I("#ed_toolbar"),v=I("#content"),i=v[0],o=0,x=I("#post-status-info"),y=I(),T=I(),B=I("#side-sortables"),C=I("#postbox-container-1"),S=I("#post-body"),O=F.wp.editor&&F.wp.editor.fullscreen,r=function(){},l=function(){},z=!1,E=!1,k=!1,A=!1,W=0,K=56,R=20,Y=300,f=h.hasClass("tmce-active")?"tinymce":"html",U=!!parseInt(F.getUserSetting("hidetb"),10),D={windowHeight:0,windowWidth:0,adminBarHeight:0,toolsHeight:0,menuBarHeight:0,visualTopHeight:0,textTopHeight:0,bottomHeight:0,statusBarHeight:0,sideSortablesHeight:0},a=F._.throttle(function(){var t=F.scrollX||document.documentElement.scrollLeft,e=F.scrollY||document.documentElement.scrollTop,o=parseInt(i.style.height,10);i.style.height=Y+"px",i.scrollHeight>Y&&(i.style.height=i.scrollHeight+"px"),void 0!==t&&F.scrollTo(t,e),i.scrollHeight=u-D.toolsHeight-D.adminBarHeight&&e<=u-D.toolsHeight-D.adminBarHeight+l-n?(z=!0,m.css({position:"fixed",top:D.adminBarHeight,width:f}),i&&y.length&&y.css({position:"fixed",top:D.adminBarHeight+D.toolsHeight,width:f-2-(i?0:a.outerWidth()-a.width())}),a.css({position:"fixed",top:D.adminBarHeight+D.toolsHeight+D.menuBarHeight,width:f-2-(i?0:a.outerWidth()-a.width())})):(z||o)&&(e<=u-D.toolsHeight-D.adminBarHeight?(z=!1,m.css({position:"absolute",top:0,width:f}),i&&y.length&&y.css({position:"absolute",top:0,width:f-2}),a.css({position:"absolute",top:D.menuBarHeight,width:f-2-(i?0:a.outerWidth()-a.width())})):e>=u-D.toolsHeight-D.adminBarHeight+l-n&&(z=!1,m.css({position:"absolute",top:l-n,width:f}),i&&y.length&&y.css({position:"absolute",top:l-n,width:f-2}),a.css({position:"absolute",top:l-n+D.menuBarHeight,width:f-2-(i?0:a.outerWidth()-a.width())}))),(!E||o&&U)&&e+D.windowHeight<=r+l+D.bottomHeight+D.statusBarHeight+1?t&&0r+l+D.bottomHeight+D.statusBarHeight-1)&&(E=!1,T.attr("style",U?"":"visibility: hidden;"),x.attr("style",""))):o&&(m.css({position:"absolute",top:0,width:f}),i&&y.length&&y.css({position:"absolute",top:0,width:f-2}),a.css({position:"absolute",top:D.menuBarHeight,width:f-2-(i?0:a.outerWidth()-a.width())}),T.attr("style",U?"":"visibility: hidden;"),x.attr("style","")),C.width()<300&&600B.height()+s+120&&D.windowHeightD.windowHeight||k||A?e+K<=s?(B.attr("style",""),k=A=!1):W=e+K&&(k=!0,B.css({position:"fixed",top:K,bottom:""}))):(s-K<=e?B.css({position:"fixed",top:K}):B.attr("style",""),k=A=!1),W=e):(B.attr("style",""),k=A=!1),o)&&(h.css({paddingTop:D.toolsHeight}),i?H.css({paddingTop:D.visualTopHeight+D.menuBarHeight}):v.css({marginTop:D.textTopHeight})))}function n(){P(),p()}function X(t){for(var e=1;e<6;e++)setTimeout(t,500*e)}function t(){F.pageYOffset&&130K&&(A=!0,F.scrollBy(0,-1),p(),F.scrollBy(0,1)),p()}).on("wp-window-resized.editor-expand",function(){g&&!g.isHidden()?g.execCommand("wpAutoResize"):P()}),v.on("focus.editor-expand input.editor-expand propertychange.editor-expand",P),r(),O&&O.pubsub.subscribe("hidden",n),g&&(g.settings.wp_autoresize_on=!0,g.execCommand("wpAutoResizeOn"),g.isHidden()||g.execCommand("wpAutoResize")),g&&!g.isHidden()||P(),p(),M.trigger("editor-expand-on")}function s(){var t=parseInt(F.getUserSetting("ed_size",300),10);t<50?t=50:5e3t&&F.scrollTo(F.pageXOffset,t-D.adminBarHeight),P(),p()},100),p()}function c(){U=!U}"content"===f.id&&((g=f).settings.autoresize_min_height=Y,w=h.find(".mce-toolbar-grp"),H=h.find(".mce-edit-area"),T=h.find(".mce-statusbar"),y=h.find(".mce-menubar"),r=function(){f.on("keyup",o),f.on("show",s),f.on("hide",d),f.on("wp-toolbar-toggle",c),f.on("setcontent wp-autoresize wp-toolbar-toggle",p),f.on("undo redo",i),f.on("FullscreenStateChanged",n),L.off("scroll.mce-float-panels").on("scroll.mce-float-panels",e)},l=function(){f.off("keyup",o),f.off("show",s),f.off("hide",d),f.off("wp-toolbar-toggle",c),f.off("setcontent wp-autoresize wp-toolbar-toggle",p),f.off("undo redo",i),f.off("FullscreenStateChanged",n),L.off("scroll.mce-float-panels")},u.hasClass("wp-editor-expand"))&&(r(),X(p))}),u.hasClass("wp-editor-expand")&&(t(),h.hasClass("html-active"))&&X(function(){p(),P()}),I("#adv-settings .editor-expand").show(),I("#editor-expand-toggle").on("change.editor-expand",function(){I(this).prop("checked")?(t(),F.setUserSetting("editor_expand","on")):(s(),F.setUserSetting("editor_expand","off"))}),F.editorExpand={on:t,off:s}}),I(function(){var i,n,t,s,f,a,d,c,u,r,l,p=I(document.body),o=I("#wpcontent"),g=I("#post-body-content"),e=I("#title"),h=I("#content"),m=I(document.createElement("DIV")),w=I("#edit-slug-box"),H=w.find("a").add(w.find("button")).add(w.find("input")),Y=I("#adminmenuwrap"),b=(I(),I(),"on"===F.getUserSetting("editor_expand","on")),v=!!b&&"on"===F.getUserSetting("post_dfw"),x=0,y=0,T=20;function B(){(s=g.offset()).right=s.left+g.outerWidth(),s.bottom=s.top+g.outerHeight()}function C(){b||(b=!0,M.trigger("dfw-activate"),h.on("keydown.focus-shortcut",R))}function S(){b&&(z(),b=!1,M.trigger("dfw-deactivate"),h.off("keydown.focus-shortcut"))}function O(){!v&&b&&(v=!0,h.on("keydown.focus",_),e.add(h).on("blur.focus",A),_(),F.setUserSetting("post_dfw","on"),M.trigger("dfw-on"))}function z(){v&&(v=!1,e.add(h).off(".focus"),k(),g.off(".focus"),F.setUserSetting("post_dfw","off"),M.trigger("dfw-off"))}function E(){(v?z:O)()}function _(t){var e,o=t&&t.keyCode;F.navigator.platform&&(e=-1s.bottom+T)&&k(),c=t})}).on("mouseleave.focus",function(){f=a=null,x=y=0,L.off("scroll.focus")}).on("mousemove.focus",function(t){var e=t.clientX,t=t.clientY,o=F.pageYOffset,i=F.pageXOffset;if(f&&a&&(e!==f||t!==a))if(t<=a&&ts.bottom-o||e<=f&&es.right-i){if(x+=Math.abs(f-e),y+=Math.abs(a-t),(t<=s.top-T-o||t>=s.bottom+T-o||e<=s.left-T-i||e>=s.right+T-i)&&(10 .widget-tpl:visible:first")).length&&this.select(t),""!==e.target.value?this.$clearResults.addClass("is-visible"):""===e.target.value&&this.$clearResults.removeClass("is-visible"),this.searchMatchesCount?this.$el.removeClass("no-widgets-found"):this.$el.addClass("no-widgets-found")},500),updateSearchMatchesCount:function(){this.searchMatchesCount=this.collection.where({search_matched:!0}).length},announceSearchMatches:function(){var e=f.widgetsFound.replace("%d",this.searchMatchesCount);this.searchMatchesCount||(e=f.noWidgetsFound),u.a11y.speak(e)},updateList:function(){this.collection.each(function(e){var t=h("#widget-tpl-"+e.id);t.toggle(e.get("search_matched")&&!e.get("is_disabled")),e.get("is_disabled")&&t.is(this.selected)&&(this.selected=null)})},select:function(e){this.selected=h(e),this.selected.siblings(".widget-tpl").removeClass("selected"),this.selected.addClass("selected")},focus:function(e){this.select(h(e.currentTarget))},_submit:function(e){"keypress"===e.type&&13!==e.which&&32!==e.which||this.submit(h(e.currentTarget))},submit:function(e){(e=e||this.selected)&&this.currentSidebarControl&&(this.select(e),e=h(this.selected).data("widget-id"),e=this.collection.findWhere({id:e}))&&((e=this.currentSidebarControl.addWidget(e.get("id_base")))&&e.focus(),this.close())},open:function(e){this.currentSidebarControl=e,_(this.currentSidebarControl.getWidgetFormControls()).each(function(e){e.params.is_wide&&e.collapseForm()}),p.section.has("publish_settings")&&p.section("publish_settings").collapse(),h("body").addClass("adding-widget"),this.$el.find(".selected").removeClass("selected"),this.collection.doSearch(""),p.settings.browser.mobile||this.$search.trigger("focus")},close:function(e){(e=e||{}).returnFocus&&this.currentSidebarControl&&this.currentSidebarControl.container.find(".add-new-widget").focus(),this.currentSidebarControl=null,this.selected=null,h("body").removeClass("adding-widget"),this.$search.val("").trigger("input")},keyboardAccessible:function(e){var t=13===e.which,i=27===e.which,n=40===e.which,s=38===e.which,d=9===e.which,a=e.shiftKey,o=null,r=this.$el.find("> .widget-tpl:visible:first"),l=this.$el.find("> .widget-tpl:visible:last"),c=h(e.target).is(this.$search),g=h(e.target).is(".widget-tpl:visible:last");n||s?(n?c?o=r:this.selected&&0!==this.selected.nextAll(".widget-tpl:visible").length&&(o=this.selected.nextAll(".widget-tpl:visible:first")):s&&(c?o=l:this.selected&&0!==this.selected.prevAll(".widget-tpl:visible").length&&(o=this.selected.prevAll(".widget-tpl:visible:first"))),this.select(o),(o||this.$search).trigger("focus")):t&&!this.$search.val()||(t?this.submit():i&&this.close({returnFocus:!0}),this.currentSidebarControl&&d&&(a&&c||!a&&g)&&(this.currentSidebarControl.container.find(".add-new-widget").focus(),e.preventDefault()))}}),p.Widgets.formSyncHandlers={rss:function(e,t,i){var n=t.find(".widget-error:first"),i=h("
    "+i+"
    ").find(".widget-error:first");n.length&&i.length?n.replaceWith(i):n.length?n.remove():i.length&&t.find(".widget-content:first").prepend(i)}},p.Widgets.WidgetControl=p.Control.extend({defaultExpandedArguments:{duration:"fast",completeCallback:h.noop},initialize:function(e,t){var i=this;i.widgetControlEmbedded=!1,i.widgetContentEmbedded=!1,i.expanded=new p.Value(!1),i.expandedArgumentsQueue=[],i.expanded.bind(function(e){var t=i.expandedArgumentsQueue.shift(),t=h.extend({},i.defaultExpandedArguments,t);i.onChangeExpanded(e,t)}),i.altNotice=!0,p.Control.prototype.initialize.call(i,e,t)},ready:function(){var n=this;n.section()?p.section(n.section(),function(t){function i(e){e&&(n.embedWidgetControl(),t.expanded.unbind(i))}t.expanded()?i(!0):t.expanded.bind(i)}):n.embedWidgetControl()},embedWidgetControl:function(){var e,t=this;t.widgetControlEmbedded||(t.widgetControlEmbedded=!0,e=h(t.params.widget_control),t.container.append(e),t._setupModel(),t._setupWideWidget(),t._setupControlToggle(),t._setupWidgetTitle(),t._setupReorderUI(),t._setupHighlightEffects(),t._setupUpdateUI(),t._setupRemoveUI())},embedWidgetContent:function(){var e,t=this;t.embedWidgetControl(),t.widgetContentEmbedded||(t.widgetContentEmbedded=!0,t.notifications.container=t.getNotificationsContainerElement(),t.notifications.render(),e=h(t.params.widget_content),t.container.find(".widget-content:first").append(e),h(document).trigger("widget-added",[t.container.find(".widget:first")]))},_setupModel:function(){var i=this,e=function(){p.Widgets.savedWidgetIds[i.params.widget_id]=!0};p.bind("ready",e),p.bind("saved",e),this._updateCount=0,this.isWidgetUpdating=!1,this.liveUpdateMode=!0,this.setting.bind(function(e,t){_(t).isEqual(e)||i.isWidgetUpdating||i.updateWidget({instance:e})})},_setupWideWidget:function(){var n,s,e,t,i,d=this;!this.params.is_wide||h(window).width()<=640||(n=this.container.find(".widget-inside"),s=n.find("> .form"),e=h(".wp-full-overlay-sidebar-content:first"),this.container.addClass("wide-widget-control"),this.container.find(".form:first").css({"max-width":this.params.width,"min-height":this.params.height}),i=function(){var e=d.container.offset().top,t=h(window).height(),i=s.outerHeight();n.css("max-height",t),e=Math.max(0,Math.min(Math.max(e,0),t-i)),n.css("top",e)},t=h("#customize-theme-controls"),this.container.on("expand",function(){i(),e.on("scroll",i),h(window).on("resize",i),t.on("expanded collapsed",i)}),this.container.on("collapsed",function(){e.off("scroll",i),h(window).off("resize",i),t.off("expanded collapsed",i)}),p.each(function(e){0===e.id.indexOf("sidebars_widgets[")&&e.bind(function(){d.container.hasClass("expanded")&&i()})}))},_setupControlToggle:function(){var t=this;this.container.find(".widget-top").on("click",function(e){e.preventDefault(),t.getSidebarWidgetsControl().isReordering||t.expanded(!t.expanded())}),this.container.find(".widget-control-close").on("click",function(){t.collapse(),t.container.find(".widget-top .widget-action:first").focus()})},_setupWidgetTitle:function(){var i=this,e=function(){var e=i.setting().title,t=i.container.find(".in-widget-title");e?t.text(": "+e):t.text("")};this.setting.bind(e),e()},_setupReorderUI:function(){var t,e,d=this,s=function(e){e.siblings(".selected").removeClass("selected"),e.addClass("selected");e=e.data("id")===d.params.sidebar_id;d.container.find(".move-widget-btn").prop("disabled",e)};this.container.find(".widget-title-action").after(h(p.Widgets.data.tpl.widgetReorderNav)),e=_.template(p.Widgets.data.tpl.moveWidgetArea),t=h(e({sidebars:_(p.Widgets.registeredSidebars.toArray()).pluck("attributes")})),this.container.find(".widget-top").after(t),(e=function(){var e=t.find("li"),i=0,n=e.filter(function(){return h(this).data("id")===d.params.sidebar_id});e.each(function(){var e=h(this),t=e.data("id"),t=p.Widgets.registeredSidebars.get(t).get("is_rendered");e.toggle(t),t&&(i+=1),e.hasClass("selected")&&!t&&s(n)}),1"+e.data.form+"
    "),n=g._getInputs(t),(t=g._getInputsSignature(l)===g._getInputsSignature(n))&&!g.liveUpdateMode&&(g.liveUpdateMode=!0,g.container.removeClass("widget-form-disabled"),g.container.find('input[name="savewidget"]').hide()),t&&g.liveUpdateMode?(l.each(function(e){var t=h(this),e=h(n[e]),i=t.data("state"+r),e=g._getInputState(e);t.data("sanitized",e),_.isEqual(i,e)||!s.ignoreActiveElement&&t.is(document.activeElement)||g._setInputState(t,e)}),h(document).trigger("widget-synced",[a,e.data.form])):g.liveUpdateMode?(g.liveUpdateMode=!1,g.container.find('input[name="savewidget"]').show(),i=!0):(o.html(e.data.form),g.container.removeClass("widget-form-disabled"),h(document).trigger("widget-updated",[a])),(c=!i&&!_(g.setting()).isEqual(e.data.instance))?(g.isWidgetUpdating=!0,g.setting(e.data.instance),g.isWidgetUpdating=!1):g.container.removeClass("previewer-loading"),d&&d.call(g,null,{noChange:!c,ajaxFinished:!0})):(t=f.error,e.data&&e.data.message&&(t=e.data.message),d?d.call(g,t):o.prepend('

    '+t+"

    "))}),i.fail(function(e,t){d&&d.call(g,t)}),i.always(function(){g.container.removeClass("widget-form-loading"),l.each(function(){h(this).removeData("state"+r)}),t(t()-1)})},expandControlSection:function(){p.Control.prototype.expand.call(this)},_toggleExpanded:p.Section.prototype._toggleExpanded,expand:p.Section.prototype.expand,expandForm:function(){this.expand()},collapse:p.Section.prototype.collapse,collapseForm:function(){this.collapse()},toggleForm:function(e){void 0===e&&(e=!this.expanded()),this.expanded(e)},onChangeExpanded:function(e,t){var i,n,s,d,a,o=this;o.embedWidgetControl(),e&&o.embedWidgetContent(),t.unchanged?e&&p.Control.prototype.expand.call(o,{completeCallback:t.completeCallback}):(i=this.container.find("div.widget:first"),n=i.find(".widget-inside:first"),e=function(){p.control.each(function(e){o.params.type===e.params.type&&o!==e&&e.collapse()}),s=function(){o.container.removeClass("expanding"),o.container.addClass("expanded"),i.addClass("open"),a.attr("aria-expanded","true"),o.container.trigger("expanded")},t.completeCallback&&(d=s,s=function(){d(),t.completeCallback()}),o.params.is_wide?n.fadeIn(t.duration,s):n.slideDown(t.duration,s),o.container.trigger("expand"),o.container.addClass("expanding")},"false"===(a=this.container.find(".widget-top button.widget-action")).attr("aria-expanded")?p.section.has(o.section())?p.section(o.section()).expand({completeCallback:e}):e():(s=function(){o.container.removeClass("collapsing"),o.container.removeClass("expanded"),i.removeClass("open"),a.attr("aria-expanded","false"),o.container.trigger("collapsed")},t.completeCallback&&(d=s,s=function(){d(),t.completeCallback()}),o.container.trigger("collapse"),o.container.addClass("collapsing"),o.params.is_wide?n.fadeOut(t.duration,s):n.slideUp(t.duration,function(){i.css({width:"",margin:""}),s()})))},getWidgetSidebarPosition:function(){var e=this.getSidebarWidgetsControl().setting(),e=_.indexOf(e,this.params.widget_id);if(-1!==e)return e},moveUp:function(){this._moveWidgetByOne(-1)},moveDown:function(){this._moveWidgetByOne(1)},_moveWidgetByOne:function(e){var t=this.getWidgetSidebarPosition(),i=this.getSidebarWidgetsControl().setting,n=Array.prototype.slice.call(i()),s=n[t+e];n[t+e]=this.params.widget_id,n[t]=s,i(n)},toggleWidgetMoveArea:function(e){var t=this,i=this.container.find(".move-widget-area");(e=void 0===e?!i.hasClass("active"):e)&&(i.find(".selected").removeClass("selected"),i.find("li").filter(function(){return h(this).data("id")===t.params.sidebar_id}).addClass("selected"),this.container.find(".move-widget-btn").prop("disabled",!0)),i.toggleClass("active",e)},highlightSectionAndControl:function(){var e=this.container.is(":hidden")?this.container.closest(".control-section"):this.container;h(".highlighted").removeClass("highlighted"),e.addClass("highlighted"),setTimeout(function(){e.removeClass("highlighted")},500)}}),p.Widgets.WidgetsPanel=p.Panel.extend({ready:function(){var d=this;p.Panel.prototype.ready.call(d),d.deferred.embedded.done(function(){var t,i,n,e=d.container.find(".panel-meta"),s=h("
    ",{class:"no-widget-areas-rendered-notice",role:"alert"});e.append(s),i=function(){return _.filter(d.sections(),function(e){return"sidebar"===e.params.type&&e.active()}).length},n=function(){var e=i();return 0===e||e!==p.Widgets.data.registeredSidebars.length},(t=function(){var e,t=i();s.empty(),t!==(e=p.Widgets.data.registeredSidebars.length)&&((e=0!==t?f.someAreasShown[e-t]:f.noAreasShown)&&s.append(h("

    ",{text:e})),s.append(h("

    ",{text:f.navigatePreview})))})(),s.toggle(n()),p.previewer.deferred.active.done(function(){s.toggle(n())}),p.bind("pane-contents-reflowed",function(){var e="resolved"===p.previewer.deferred.active.state()?"fast":0;t(),n()?s.slideDown(e):s.slideUp(e)})})},isContextuallyActive:function(){return this.active()}}),p.Widgets.SidebarSection=p.Section.extend({ready:function(){var t;p.Section.prototype.ready.call(this),t=p.Widgets.registeredSidebars.get(this.params.sidebarId),this.active.bind(function(e){t.set("is_rendered",e)}),t.set("is_rendered",this.active())}}),p.Widgets.SidebarControl=p.Control.extend({ready:function(){this.$controlSection=this.container.closest(".control-section"),this.$sectionContent=this.container.closest(".accordion-section-content"),this._setupModel(),this._setupSortable(),this._setupAddition(),this._applyCardinalOrderClassNames()},_setupModel:function(){var s=this;this.setting.bind(function(i,e){var t,n,e=_(e).difference(i);i=_(i).filter(function(e){e=c(e);return!!p.Widgets.availableWidgets.findWhere({id_base:e.id_base})}),(t=_(i).map(function(e){return p.Widgets.getWidgetFormControlForWidget(e)||s.addWidget(e)})).sort(function(e,t){return _.indexOf(i,e.params.widget_id)-_.indexOf(i,t.params.widget_id)}),n=0,_(t).each(function(e){e.priority(n),e.section(s.section()),n+=1}),s.priority(n),s._applyCardinalOrderClassNames(),_(t).each(function(e){e.params.sidebar_id=s.params.sidebar_id}),_(e).each(function(n){setTimeout(function(){var e,t,i=!1;p.each(function(e){e.id!==s.setting.id&&0===e.id.indexOf("sidebars_widgets[")&&"sidebars_widgets[wp_inactive_widgets]"!==e.id&&(e=e(),-1!==_.indexOf(e,n))&&(i=!0)}),i||(t=(e=p.Widgets.getWidgetFormControlForWidget(n))&&h.contains(document,e.container[0])&&!h.contains(s.$sectionContent[0],e.container[0]),e&&!t&&(p.control.remove(e.id),e.container.remove()),p.Widgets.savedWidgetIds[n]&&((t=p.value("sidebars_widgets[wp_inactive_widgets]")().slice()).push(n),p.value("sidebars_widgets[wp_inactive_widgets]")(_(t).unique())),e=c(n).id_base,(t=p.Widgets.availableWidgets.findWhere({id_base:e}))&&!t.get("is_multi")&&t.set("is_disabled",!1))})})})},_setupSortable:function(){var t=this;this.isReordering=!1,this.$sectionContent.sortable({items:"> .customize-control-widget_form",handle:".widget-top",axis:"y",tolerance:"pointer",connectWith:".accordion-section-content:has(.customize-control-sidebar_widgets)",update:function(){var e=t.$sectionContent.sortable("toArray"),e=h.map(e,function(e){return h("#"+e).find(":input[name=widget-id]").val()});t.setting(e)}}),this.$controlSection.find(".accordion-section-title").droppable({accept:".customize-control-widget_form",over:function(){p.section(t.section.get()).expand({allowMultiple:!0,completeCallback:function(){p.section.each(function(e){e.container.find(".customize-control-sidebar_widgets").length&&e.container.find(".accordion-section-content:first").sortable("refreshPositions")})}})}}),this.container.find(".reorder-toggle").on("click",function(){t.toggleReordering(!t.isReordering)})},_setupAddition:function(){var t=this;this.container.find(".add-new-widget").on("click",function(){var e=h(this);t.$sectionContent.hasClass("reordering")||(h("body").hasClass("adding-widget")?(e.attr("aria-expanded","false"),p.Widgets.availableWidgetsPanel.close()):(e.attr("aria-expanded","true"),p.Widgets.availableWidgetsPanel.open(t)))})},_applyCardinalOrderClassNames:function(){var t=[];_.each(this.setting(),function(e){e=p.Widgets.getWidgetFormControlForWidget(e);e&&t.push(e)}),0===t.length||1===p.Widgets.registeredSidebars.length&&t.length<=1?this.container.find(".reorder-toggle").hide():(this.container.find(".reorder-toggle").show(),h(t).each(function(){h(this.container).removeClass("first-widget").removeClass("last-widget").find(".move-widget-down, .move-widget-up").prop("tabIndex",0)}),_.first(t).container.addClass("first-widget").find(".move-widget-up").prop("tabIndex",-1),_.last(t).container.addClass("last-widget").find(".move-widget-down").prop("tabIndex",-1))},toggleReordering:function(e){var t=this.$sectionContent.find(".add-new-widget"),i=this.container.find(".reorder-toggle"),n=this.$sectionContent.find(".widget-title");(e=Boolean(e))!==this.$sectionContent.hasClass("reordering")&&(this.isReordering=e,this.$sectionContent.toggleClass("reordering",e),e?(_(this.getWidgetFormControls()).each(function(e){e.collapse()}),t.attr({tabindex:"-1","aria-hidden":"true"}),i.attr("aria-label",f.reorderLabelOff),u.a11y.speak(f.reorderModeOn),n.attr("aria-hidden","true")):(t.removeAttr("tabindex aria-hidden"),i.attr("aria-label",f.reorderLabelOn),u.a11y.speak(f.reorderModeOff),n.attr("aria-hidden","false")))},getWidgetFormControls:function(){var t=[];return _(this.setting()).each(function(e){e=function(e){var t,e=c(e);t="widget_"+e.id_base,e.number&&(t+="["+e.number+"]");return t}(e),e=p.control(e);e&&t.push(e)}),t},addWidget:function(n){var e,t,i,s,d,a=this,o="widget_form",r=c(n),l=r.number,r=p.Widgets.availableWidgets.findWhere({id_base:r.id_base});return!(!r||l&&!r.get("is_multi"))&&(r.get("is_multi")&&!l&&(r.set("multi_number",r.get("multi_number")+1),l=r.get("multi_number")),e=h("#widget-tpl-"+r.get("id")).html().trim(),r.get("is_multi")?e=e.replace(/<[^<>]+>/g,function(e){return e.replace(/__i__|%i%/g,l)}):r.set("is_disabled",!0),e=h(e),(e=h("
  • ").addClass("customize-control").addClass("customize-control-"+o).append(e)).find("> .widget-icon").remove(),r.get("is_multi")&&(e.find('input[name="widget_number"]').val(l),e.find('input[name="multi_number"]').val(l)),n=e.find('[name="widget-id"]').val(),e.hide(),t="widget_"+r.get("id_base"),r.get("is_multi")&&(t+="["+l+"]"),e.attr("id","customize-control-"+t.replace(/\]/g,"").replace(/\[/g,"-")),(i=p.has(t))||(d={transport:p.Widgets.data.selectiveRefreshableWidgets[r.get("id_base")]?"postMessage":"refresh",previewer:this.setting.previewer},p.create(t,t,"",d).set({})),d=p.controlConstructor[o],s=new d(t,{settings:{default:t},content:e,sidebar_id:a.params.sidebar_id,widget_id:n,widget_id_base:r.get("id_base"),type:o,is_new:!i,width:r.get("width"),height:r.get("height"),is_wide:r.get("is_wide")}),p.control.add(s),p.each(function(e){var t,i;e.id!==a.setting.id&&0===e.id.indexOf("sidebars_widgets[")&&(t=e().slice(),-1!==(i=_.indexOf(t,n)))&&(t.splice(i),e(t))}),d=this.setting().slice(),-1===_.indexOf(d,n)&&(d.push(n),this.setting(d)),e.slideDown(function(){i&&s.updateWidget({instance:s.setting()})}),s)}}),h.extend(p.panelConstructor,{widgets:p.Widgets.WidgetsPanel}),h.extend(p.sectionConstructor,{sidebar:p.Widgets.SidebarSection}),h.extend(p.controlConstructor,{widget_form:p.Widgets.WidgetControl,sidebar_widgets:p.Widgets.SidebarControl}),p.bind("ready",function(){p.Widgets.availableWidgetsPanel=new p.Widgets.AvailableWidgetsPanelView({collection:p.Widgets.availableWidgets}),p.previewer.bind("highlight-widget-control",p.Widgets.highlightWidgetFormControl),p.previewer.bind("focus-widget-control",p.Widgets.focusWidgetFormControl)}),p.Widgets.highlightWidgetFormControl=function(e){e=p.Widgets.getWidgetFormControlForWidget(e);e&&e.highlightSectionAndControl()},p.Widgets.focusWidgetFormControl=function(e){e=p.Widgets.getWidgetFormControlForWidget(e);e&&e.focus()},p.Widgets.getSidebarWidgetControlContainingWidget=function(t){var i=null;return p.control.each(function(e){"sidebar_widgets"===e.params.type&&-1!==_.indexOf(e.setting(),t)&&(i=e)}),i},p.Widgets.getWidgetFormControlForWidget=function(t){var i=null;return p.control.each(function(e){"widget_form"===e.params.type&&e.params.widget_id===t&&(i=e)}),i},h(document).on("widget-added",function(e,t){var s,d,i,n=c(t.find("> .widget-inside > .form > .widget-id").val());"nav_menu"===n.id_base&&(s=p.control("widget_nav_menu["+String(n.number)+"]"))&&(d=t.find('select[name*="nav_menu"]'),i=t.find(".edit-selected-nav-menu > button"),0!==d.length)&&0!==i.length&&(d.on("change",function(){p.section.has("nav_menu["+d.val()+"]")?i.parent().show():i.parent().hide()}),i.on("click",function(){var i,n,e=p.section("nav_menu["+d.val()+"]");e&&(n=s,(i=e).focus(),i.expanded.bind(function e(t){t||(i.expanded.unbind(e),n.focus())}))}))}))}(window.wp,jQuery);PKZI js/code-editor.min.jsnu[/*! This file is auto-generated */ void 0===window.wp&&(window.wp={}),void 0===window.wp.codeEditor&&(window.wp.codeEditor={}),function(u,d){"use strict";function s(r,s){var a=[],d=[];function c(){s.onUpdateErrorNotice&&!_.isEqual(a,d)&&(s.onUpdateErrorNotice(a,r),d=a)}function i(){var i,t=r.getOption("lint");return!!t&&(!0===t?t={}:_.isObject(t)&&(t=u.extend({},t)),t.options||(t.options={}),"javascript"===s.codemirror.mode&&s.jshint&&u.extend(t.options,s.jshint),"css"===s.codemirror.mode&&s.csslint&&u.extend(t.options,s.csslint),"htmlmixed"===s.codemirror.mode&&s.htmlhint&&(t.options.rules=u.extend({},s.htmlhint),s.jshint&&(t.options.rules.jshint=s.jshint),s.csslint)&&(t.options.rules.csslint=s.csslint),t.onUpdateLinting=(i=t.onUpdateLinting,function(t,e,n){var o=_.filter(t,function(t){return"error"===t.severity});i&&i.apply(t,e,n),!_.isEqual(o,a)&&(a=o,s.onChangeLintingErrors&&s.onChangeLintingErrors(o,t,e,n),!r.state.focused||0===a.length||0'),c="linear-gradient(top,#fff,#000)",a.each(l,function(a,e){if(b.css(d,e+c),b.css(d).match("gradient"))return k=a,!1}),!1===k&&(b.css("background","-webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#000))"),b.css(d).match("gradient")&&(k="webkit")),b.remove())}function d(a,b){return a="top"===a?"top":"left",b=Array.isArray(b)?b:Array.prototype.slice.call(arguments,1),"webkit"===k?f(a,b):l[k]+"linear-gradient("+a+", "+b.join(", ")+")"}function e(b,c){var d,e,f,h,i,j,k,l,m;b="top"===b?"top":"left",c=Array.isArray(c)?c:Array.prototype.slice.call(arguments,1),d="top"===b?0:1,e=a(this),f=c.length-1,h="filter",i=1===d?"left":"top",j=1===d?"right":"bottom",k=1===d?"height":"width",l='
    ',m="","static"===e.css("position")&&e.css({position:"relative"}),c=g(c),a.each(c,function(a,b){var e,g,h;if(a===f)return!1;e=c[a+1],b.stop!==e.stop&&(g=100-parseFloat(e.stop)+"%",b.octoHex=new Color(b.color).toIEOctoHex(),e.octoHex=new Color(e.color).toIEOctoHex(),h="progid:DXImageTransform.Microsoft.Gradient(GradientType="+d+", StartColorStr='"+b.octoHex+"', EndColorStr='"+e.octoHex+"')",m+=l.replace("%start%",b.stop).replace("%end%",g).replace("%filter%",h))}),e.find(".iris-ie-gradient-shim").remove(),a(m).prependTo(e)}function f(b,c){var d=[];return b="top"===b?"0% 0%,0% 100%,":"0% 100%,100% 100%,",c=g(c),a.each(c,function(a,b){d.push("color-stop("+parseFloat(b.stop)/100+", "+b.color+")")}),"-webkit-gradient(linear,"+b+d.join(",")+")"}function g(b){var c=[],d=[],e=[],f=b.length-1;return a.each(b,function(a,b){var e=b,f=!1,g=b.match(/1?[0-9]{1,2}%$/);g&&(e=b.replace(/\s?1?[0-9]{1,2}%$/,""),f=g.shift()),c.push(e),d.push(f)}),!1===d[0]&&(d[0]="0%"),!1===d[f]&&(d[f]="100%"),d=h(d),a.each(d,function(a){e[a]={color:c[a],stop:d[a]}}),e}function h(b){var c,d,e,f,g=0,i=b.length-1,j=0,k=!1;if(b.length<=2||a.inArray(!1,b)<0)return b;for(;j'),c=a(''),d=Array.isArray(this.options.palettes)?this.options.palettes:this._palettes;this.picker.find(".iris-palette-container").length&&(b=this.picker.find(".iris-palette-container").detach().html("")),a.each(d,function(a,d){c.clone().data("color",d).css("backgroundColor",d).appendTo(b).height(10).width(10)}),this.picker.append(b)},_paint:function(){var a=this;a.horizontalSlider?a._paintDimension("left","strip"):a._paintDimension("top","strip"),a._paintDimension("top","vert"),a._paintDimension("left","horiz")},_paintDimension:function(a,b){var c,d=this,e=d._color,f=d.options.mode,g=d._getHSpaceColor(),h=d.controls[b],i=d.options.controls;if(b!==d.active&&("square"!==d.active||"strip"===b))switch(i[b]){case"h":if("hsv"===f){switch(g=e.clone(),b){case"horiz":g[i.vert](100);break;case"vert":g[i.horiz](100);break;case"strip":g.setHSpace("hsl")}c=g.toHsl()}else c="strip"===b?{s:g.s,l:g.l}:{s:100,l:g.l};h.rainbowGradient(a,c);break;case"s":"hsv"===f?"vert"===b?c=[e.clone().a(0).s(0).toCSS("rgba"),e.clone().a(1).s(0).toCSS("rgba")]:"strip"===b?c=[e.clone().s(100).toCSS("hsl"),e.clone().s(0).toCSS("hsl")]:"horiz"===b&&(c=["#fff","hsl("+g.h+",100%,50%)"]):c="vert"===b&&"h"===d.options.controls.horiz?["hsla(0, 0%, "+g.l+"%, 0)","hsla(0, 0%, "+g.l+"%, 1)"]:["hsl("+g.h+",0%,50%)","hsl("+g.h+",100%,50%)"],h.gradient(a,c);break;case"l":c="strip"===b?["hsl("+g.h+",100%,100%)","hsl("+g.h+", "+g.s+"%,50%)","hsl("+g.h+",100%,0%)"]:["#fff","rgba(255,255,255,0) 50%","rgba(0,0,0,0) 50%","rgba(0,0,0,1)"],h.gradient(a,c);break;case"v":c="strip"===b?[e.clone().v(100).toCSS(),e.clone().v(0).toCSS()]:["rgba(0,0,0,0)","#000"],h.gradient(a,c)}},_getHSpaceColor:function(){return"hsv"===this.options.mode?this._color.toHsv():this._color.toHsl()},_stripOnlyDimensions:function(){var a=this,b=this.options.width,c=.12*b;a.horizontalSlider?a.picker.css({width:b,height:c}).addClass("iris-only-strip iris-strip-horiz"):a.picker.css({width:c,height:b}).addClass("iris-only-strip iris-strip-vert")},_dimensions:function(b){if("hue"===this.options.type)return this._stripOnlyDimensions();var c,d,e,f,g=this,h=g.options,i=g.controls,j=i.square,k=g.picker.find(".iris-strip"),l="77.5%",m="12%",n=20,o=h.border?h.width-n:h.width,p=Array.isArray(h.palettes)?h.palettes.length:g._palettes.length;if(b&&(j.css("width",""),k.css("width",""),g.picker.css({width:"",height:""})),l=o*(parseFloat(l)/100),m=o*(parseFloat(m)/100),c=h.border?l+n:l,j.width(l).height(l),k.height(l).width(m),g.picker.css({width:h.width,height:c}),!h.palettes)return g.picker.css("paddingBottom","");d=2*l/100,f=l-(p-1)*d,e=f/p,g.picker.find(".iris-palette").each(function(b){var c=0===b?0:d;a(this).css({width:e,height:e,marginLeft:c})}),g.picker.css("paddingBottom",e+d),k.height(e+d+l)},_addInputListeners:function(a){var b=this,c=function(c){var d=new Color(a.val()),e=a.val().replace(/^#/,"");a.removeClass("iris-error"),d.error?""!==e&&a.addClass("iris-error"):d.toString()!==b._color.toString()&&("keyup"===c.type&&e.match(/^[0-9a-fA-F]{3}$/)||b._setOption("color",d.toString()))};a.on("change",c).on("keyup",b._debounce(c,100)),b.options.hide&&a.one("focus",function(){b.show()})},_initControls:function(){var b=this,c=b.controls,d=c.square,e=b.options.controls,f=b._scale[e.strip],g=b.horizontalSlider?"horizontal":"vertical";c.stripSlider.slider({orientation:g,max:f,slide:function(a,c){b.active="strip","h"===e.strip&&"vertical"===g&&(c.value=f-c.value),b._color[e.strip](c.value),b._change.apply(b,arguments)}}),c.squareDrag.draggable({containment:c.square.find(".iris-square-inner"),zIndex:1e3,cursor:"move",drag:function(a,c){b._squareDrag(a,c)},start:function(){d.addClass("iris-dragging"),a(this).addClass("ui-state-focus")},stop:function(){d.removeClass("iris-dragging"),a(this).removeClass("ui-state-focus")}}).on("mousedown mouseup",function(c){var d="ui-state-focus";c.preventDefault(),"mousedown"===c.type?(b.picker.find("."+d).removeClass(d).trigger("blur"),a(this).addClass(d).trigger("focus")):a(this).removeClass(d)}).on("keydown",function(a){var d=c.square,e=c.squareDrag,f=e.position(),g=b.options.width/100;switch(a.altKey&&(g*=10),a.keyCode){case 37:f.left-=g;break;case 38:f.top-=g;break;case 39:f.left+=g;break;case 40:f.top+=g;break;default:return!0}f.left=Math.max(0,Math.min(f.left,d.width())),f.top=Math.max(0,Math.min(f.top,d.height())),e.css(f),b._squareDrag(a,{position:f}),a.preventDefault()}),d.on("mousedown",function(c){var d,e;1===c.which&&a(c.target).is("div")&&(d=b.controls.square.offset(),e={top:c.pageY-d.top,left:c.pageX-d.left},c.preventDefault(),b._squareDrag(c,{position:e}),c.target=b.controls.squareDrag.get(0),b.controls.squareDrag.css(e).trigger(c))}),b.options.palettes&&b._paletteListeners()},_paletteListeners:function(){var b=this;b.picker.find(".iris-palette-container").on("click.palette",".iris-palette",function(){b._color.fromCSS(a(this).data("color")),b.active="external",b._change()}).on("keydown.palette",".iris-palette",function(b){if(13!==b.keyCode&&32!==b.keyCode)return!0;b.stopPropagation(),a(this).trigger("click")})},_squareDrag:function(a,b){var c=this,d=c.options.controls,e=c._squareDimensions(),f=Math.round((e.h-b.position.top)/e.h*c._scale[d.vert]),g=c._scale[d.horiz]-Math.round((e.w-b.position.left)/e.w*c._scale[d.horiz]);c._color[d.horiz](g)[d.vert](f),c.active="square",c._change.apply(c,arguments)},_setOption:function(b,c){var d,e,f=this,g=f.options[b],h=!1;switch(f.options[b]=c,b){case"color":f.onlySlider?(c=parseInt(c,10),c=isNaN(c)||c<0||c>359?g:"hsl("+c+",100,50)",f.options.color=f.options[b]=c,f._color=new Color(c).setHSpace(f.options.mode),f.active="external",f._change()):(c=""+c,c.replace(/^#/,""),d=new Color(c).setHSpace(f.options.mode),d.error?f.options[b]=g:(f._color=d,f.options.color=f.options[b]=f._color.toString(),f.active="external",f._change()));break;case"palettes":h=!0,c?f._addPalettes():f.picker.find(".iris-palette-container").remove(),g||f._paletteListeners();break;case"width":h=!0;break;case"border":h=!0,e=c?"addClass":"removeClass",f.picker[e]("iris-border");break;case"mode":case"controls":if(g===c)return;return e=f.element,g=f.options,g.hide=!f.picker.is(":visible"),f.destroy(),f.picker.remove(),a(f.element).iris(g)}h&&f._dimensions(!0)},_squareDimensions:function(a){var c,d=this.controls.square;return a!==b&&d.data("dimensions")?d.data("dimensions"):(this.controls.squareDrag,c={w:d.width(),h:d.height()},d.data("dimensions",c),c)},_isNonHueControl:function(a,b){return"square"===a&&"h"===this.options.controls.strip||"external"!==b&&("h"!==b||"strip"!==a)},_change:function(){var b=this,c=b.controls,d=b._getHSpaceColor(),e=["square","strip"],f=b.options.controls,g=f[b.active]||"external",h=b.hue;"strip"===b.active?e=[]:"external"!==b.active&&e.pop(),a.each(e,function(a,e){var g,h,i;if(e!==b.active)switch(e){case"strip":g="h"!==f.strip||b.horizontalSlider?d[f.strip]:b._scale[f.strip]-d[f.strip],c.stripSlider.slider("value",g);break;case"square":h=b._squareDimensions(),i={left:d[f.horiz]/b._scale[f.horiz]*h.w,top:h.h-d[f.vert]/b._scale[f.vert]*h.h},b.controls.squareDrag.css(i)}}),d.h!==h&&b._isNonHueControl(b.active,g)&&b._color.h(h),b.hue=b._color.h(),b.options.color=b._color.toString(),b._inited&&b._trigger("change",{type:b.active},{color:b._color}),b.element.is(":input")&&!b._color.error&&(b.element.removeClass("iris-error"),b.onlySlider?b.element.val()!==b.hue&&b.element.val(b.hue):b.element.val()!==b._color.toString()&&b.element.val(b._color.toString())),b._paint(),b._inited=!0,b.active=!1},_debounce:function(a,b,c){var d,e;return function(){var f,g,h=this,i=arguments;return f=function(){d=null,c||(e=a.apply(h,i))},g=c&&!d,clearTimeout(d),d=setTimeout(f,b),g&&(e=a.apply(h,i)),e}},show:function(){this.picker.show()},hide:function(){this.picker.hide()},toggle:function(){this.picker.toggle()},color:function(a){return!0===a?this._color.clone():a===b?this._color.toString():void this.option("color",a)}},a.widget("a8c.iris",n),a('").appendTo("head")}(jQuery),function(a,b){var c=function(a,b){return this instanceof c?this._init(a,b):new c(a,b)};c.fn=c.prototype={_color:0,_alpha:1,error:!1,_hsl:{h:0,s:0,l:0},_hsv:{h:0,s:0,v:0},_hSpace:"hsl",_init:function(a){var c="noop";switch(typeof a){case"object":return a.a!==b&&this.a(a.a),c=a.r!==b?"fromRgb":a.l!==b?"fromHsl":a.v!==b?"fromHsv":c,this[c](a);case"string":return this.fromCSS(a);case"number":return this.fromInt(parseInt(a,10))}return this},_error:function(){return this.error=!0,this},clone:function(){for(var a=new c(this.toInt()),b=["_alpha","_hSpace","_hsl","_hsv","error"],d=b.length-1;d>=0;d--)a[b[d]]=this[b[d]];return a},setHSpace:function(a){return this._hSpace="hsv"===a?a:"hsl",this},noop:function(){return this},fromCSS:function(a){var b,c=/^(rgb|hs(l|v))a?\(/;if(this.error=!1,a=a.replace(/^\s+/,"").replace(/\s+$/,"").replace(/;$/,""),a.match(c)&&a.match(/\)$/)){if(b=a.replace(/(\s|%)/g,"").replace(c,"").replace(/,?\);?$/,"").split(","),b.length<3)return this._error();if(4===b.length&&(this.a(parseFloat(b.pop())),this.error))return this;for(var d=b.length-1;d>=0;d--)if(b[d]=parseInt(b[d],10),isNaN(b[d]))return this._error();return a.match(/^rgb/)?this.fromRgb({r:b[0],g:b[1],b:b[2]}):a.match(/^hsv/)?this.fromHsv({h:b[0],s:b[1],v:b[2]}):this.fromHsl({h:b[0],s:b[1],l:b[2]})}return this.fromHex(a)},fromRgb:function(a,c){return"object"!=typeof a||a.r===b||a.g===b||a.b===b?this._error():(this.error=!1,this.fromInt(parseInt((a.r<<16)+(a.g<<8)+a.b,10),c))},fromHex:function(a){return a=a.replace(/^#/,"").replace(/^0x/,""),3===a.length&&(a=a[0]+a[0]+a[1]+a[1]+a[2]+a[2]),this.error=!/^[0-9A-F]{6}$/i.test(a),this.fromInt(parseInt(a,16))},fromHsl:function(a){var c,d,e,f,g,h,i,j;return"object"!=typeof a||a.h===b||a.s===b||a.l===b?this._error():(this._hsl=a,this._hSpace="hsl",h=a.h/360,i=a.s/100,j=a.l/100,0===i?c=d=e=j:(f=j<.5?j*(1+i):j+i-j*i,g=2*j-f,c=this.hue2rgb(g,f,h+1/3),d=this.hue2rgb(g,f,h),e=this.hue2rgb(g,f,h-1/3)),this.fromRgb({r:255*c,g:255*d,b:255*e},!0))},fromHsv:function(a){var c,d,e,f,g,h,i,j,k,l,m;if("object"!=typeof a||a.h===b||a.s===b||a.v===b)return this._error();switch(this._hsv=a,this._hSpace="hsv",c=a.h/360,d=a.s/100,e=a.v/100,i=Math.floor(6*c),j=6*c-i,k=e*(1-d),l=e*(1-j*d),m=e*(1-(1-j)*d),i%6){case 0:f=e,g=m,h=k;break;case 1:f=l,g=e,h=k;break;case 2:f=k,g=e,h=m;break;case 3:f=k,g=l,h=e;break;case 4:f=m,g=k,h=e;break;case 5:f=e,g=k,h=l}return this.fromRgb({r:255*f,g:255*g,b:255*h},!0)},fromInt:function(a,c){return this._color=parseInt(a,10),isNaN(this._color)&&(this._color=0),this._color>16777215?this._color=16777215:this._color<0&&(this._color=0),c===b&&(this._hsv.h=this._hsv.s=this._hsl.h=this._hsl.s=0),this},hue2rgb:function(a,b,c){return c<0&&(c+=1),c>1&&(c-=1),c<1/6?a+6*(b-a)*c:c<.5?b:c<2/3?a+(b-a)*(2/3-c)*6:a},toString:function(){var a=parseInt(this._color,10).toString(16);if(this.error)return"";if(a.length<6)for(var b=6-a.length-1;b>=0;b--)a="0"+a;return"#"+a},toCSS:function(a,b){switch(a=a||"hex",b=parseFloat(b||this._alpha),a){case"rgb":case"rgba":var c=this.toRgb();return b<1?"rgba( "+c.r+", "+c.g+", "+c.b+", "+b+" )":"rgb( "+c.r+", "+c.g+", "+c.b+" )";case"hsl":case"hsla":var d=this.toHsl();return b<1?"hsla( "+d.h+", "+d.s+"%, "+d.l+"%, "+b+" )":"hsl( "+d.h+", "+d.s+"%, "+d.l+"% )";default:return this.toString()}},toRgb:function(){return{r:255&this._color>>16,g:255&this._color>>8,b:255&this._color}},toHsl:function(){var a,b,c=this.toRgb(),d=c.r/255,e=c.g/255,f=c.b/255,g=Math.max(d,e,f),h=Math.min(d,e,f),i=(g+h)/2;if(g===h)a=b=0;else{var j=g-h;switch(b=i>.5?j/(2-g-h):j/(g+h),g){case d:a=(e-f)/j+(ed?(b+.05)/(d+.05):(d+.05)/(b+.05)},getMaxContrastColor:function(){var a=this.getDistanceLuminosityFrom(new c("#000")),b=this.getDistanceLuminosityFrom(new c("#fff"));return new c(a>=b?"#000":"#fff")},getReadableContrastingColor:function(a,d){if(!(a instanceof c))return this;var e,f,g=d===b?5:d,h=a.getDistanceLuminosityFrom(this);if(h>=g)return this;if(e=a.getMaxContrastColor(),e.getDistanceLuminosityFrom(a)<=g)return e;for(f=0===e.toInt()?-1:1;hc.range[1]?c.range[1]:d),f[a]=d,this._spaceFunc("from",c.space,f))}},_spaceFunc:function(a,b,c){var d=b||this._hSpace;return this[a+d.charAt(0).toUpperCase()+d.substr(1)](c)}};var d={h:{mod:360},s:{range:[0,100]},l:{space:"hsl",range:[0,100]},v:{space:"hsv",range:[0,100]},r:{space:"rgb",range:[0,255]},g:{space:"rgb",range:[0,255]},b:{space:"rgb",range:[0,255]}};for(var e in d)d.hasOwnProperty(e)&&(c.fn[e]=c.fn._partial(e));"object"==typeof exports?module.exports=c:a.Color=c}(this);PKZ/mm js/media.jsnu[/** * Creates a dialog containing posts that can have a particular media attached * to it. * * @since 2.7.0 * @output wp-admin/js/media.js * * @namespace findPosts * * @requires jQuery */ /* global ajaxurl, _wpMediaGridSettings, showNotice, findPosts, ClipboardJS */ ( function( $ ){ window.findPosts = { /** * Opens a dialog to attach media to a post. * * Adds an overlay prior to retrieving a list of posts to attach the media to. * * @since 2.7.0 * * @memberOf findPosts * * @param {string} af_name The name of the affected element. * @param {string} af_val The value of the affected post element. * * @return {boolean} Always returns false. */ open: function( af_name, af_val ) { var overlay = $( '.ui-find-overlay' ); if ( overlay.length === 0 ) { $( 'body' ).append( '
    ' ); findPosts.overlay(); } overlay.show(); if ( af_name && af_val ) { // #affected is a hidden input field in the dialog that keeps track of which media should be attached. $( '#affected' ).attr( 'name', af_name ).val( af_val ); } $( '#find-posts' ).show(); // Close the dialog when the escape key is pressed. $('#find-posts-input').trigger( 'focus' ).on( 'keyup', function( event ){ if ( event.which == 27 ) { findPosts.close(); } }); // Retrieves a list of applicable posts for media attachment and shows them. findPosts.send(); return false; }, /** * Clears the found posts lists before hiding the attach media dialog. * * @since 2.7.0 * * @memberOf findPosts * * @return {void} */ close: function() { $('#find-posts-response').empty(); $('#find-posts').hide(); $( '.ui-find-overlay' ).hide(); }, /** * Binds a click event listener to the overlay which closes the attach media * dialog. * * @since 3.5.0 * * @memberOf findPosts * * @return {void} */ overlay: function() { $( '.ui-find-overlay' ).on( 'click', function () { findPosts.close(); }); }, /** * Retrieves and displays posts based on the search term. * * Sends a post request to the admin_ajax.php, requesting posts based on the * search term provided by the user. Defaults to all posts if no search term is * provided. * * @since 2.7.0 * * @memberOf findPosts * * @return {void} */ send: function() { var post = { ps: $( '#find-posts-input' ).val(), action: 'find_posts', _ajax_nonce: $('#_ajax_nonce').val() }, spinner = $( '.find-box-search .spinner' ); spinner.addClass( 'is-active' ); /** * Send a POST request to admin_ajax.php, hide the spinner and replace the list * of posts with the response data. If an error occurs, display it. */ $.ajax( ajaxurl, { type: 'POST', data: post, dataType: 'json' }).always( function() { spinner.removeClass( 'is-active' ); }).done( function( x ) { if ( ! x.success ) { $( '#find-posts-response' ).text( wp.i18n.__( 'An error has occurred. Please reload the page and try again.' ) ); } $( '#find-posts-response' ).html( x.data ); }).fail( function() { $( '#find-posts-response' ).text( wp.i18n.__( 'An error has occurred. Please reload the page and try again.' ) ); }); } }; /** * Initializes the file once the DOM is fully loaded and attaches events to the * various form elements. * * @return {void} */ $( function() { var settings, $mediaGridWrap = $( '#wp-media-grid' ), copyAttachmentURLClipboard = new ClipboardJS( '.copy-attachment-url.media-library' ), copyAttachmentURLSuccessTimeout, previousSuccessElement = null; // Opens a manage media frame into the grid. if ( $mediaGridWrap.length && window.wp && window.wp.media ) { settings = _wpMediaGridSettings; var frame = window.wp.media({ frame: 'manage', container: $mediaGridWrap, library: settings.queryVars }).open(); // Fire a global ready event. $mediaGridWrap.trigger( 'wp-media-grid-ready', frame ); } // Prevents form submission if no post has been selected. $( '#find-posts-submit' ).on( 'click', function( event ) { if ( ! $( '#find-posts-response input[type="radio"]:checked' ).length ) event.preventDefault(); }); // Submits the search query when hitting the enter key in the search input. $( '#find-posts .find-box-search :input' ).on( 'keypress', function( event ) { if ( 13 == event.which ) { findPosts.send(); return false; } }); // Binds the click event to the search button. $( '#find-posts-search' ).on( 'click', findPosts.send ); // Binds the close dialog click event. $( '#find-posts-close' ).on( 'click', findPosts.close ); // Binds the bulk action events to the submit buttons. $( '#doaction' ).on( 'click', function( event ) { /* * Handle the bulk action based on its value. */ $( 'select[name="action"]' ).each( function() { var optionValue = $( this ).val(); if ( 'attach' === optionValue ) { event.preventDefault(); findPosts.open(); } else if ( 'delete' === optionValue ) { if ( ! showNotice.warn() ) { event.preventDefault(); } } }); }); /** * Enables clicking on the entire table row. * * @return {void} */ $( '.find-box-inside' ).on( 'click', 'tr', function() { $( this ).find( '.found-radio input' ).prop( 'checked', true ); }); /** * Handles media list copy media URL button. * * @since 6.0.0 * * @param {MouseEvent} event A click event. * @return {void} */ copyAttachmentURLClipboard.on( 'success', function( event ) { var triggerElement = $( event.trigger ), successElement = $( '.success', triggerElement.closest( '.copy-to-clipboard-container' ) ); // Clear the selection and move focus back to the trigger. event.clearSelection(); // Checking if the previousSuccessElement is present, adding the hidden class to it. if ( previousSuccessElement ) { previousSuccessElement.addClass( 'hidden' ); } // Show success visual feedback. clearTimeout( copyAttachmentURLSuccessTimeout ); successElement.removeClass( 'hidden' ); // Hide success visual feedback after 3 seconds since last success and unfocus the trigger. copyAttachmentURLSuccessTimeout = setTimeout( function() { successElement.addClass( 'hidden' ); // No need to store the previous success element further. previousSuccessElement = null; }, 3000 ); previousSuccessElement = successElement; // Handle success audible feedback. wp.a11y.speak( wp.i18n.__( 'The file URL has been copied to your clipboard' ) ); } ); }); })( jQuery ); PKZ|[OתPPjs/inline-edit-post.jsnu[/** * This file contains the functions needed for the inline editing of posts. * * @since 2.7.0 * @output wp-admin/js/inline-edit-post.js */ /* global ajaxurl, typenow, inlineEditPost */ window.wp = window.wp || {}; /** * Manages the quick edit and bulk edit windows for editing posts or pages. * * @namespace inlineEditPost * * @since 2.7.0 * * @type {Object} * * @property {string} type The type of inline editor. * @property {string} what The prefix before the post ID. * */ ( function( $, wp ) { window.inlineEditPost = { /** * Initializes the inline and bulk post editor. * * Binds event handlers to the Escape key to close the inline editor * and to the save and close buttons. Changes DOM to be ready for inline * editing. Adds event handler to bulk edit. * * @since 2.7.0 * * @memberof inlineEditPost * * @return {void} */ init : function(){ var t = this, qeRow = $('#inline-edit'), bulkRow = $('#bulk-edit'); t.type = $('table.widefat').hasClass('pages') ? 'page' : 'post'; // Post ID prefix. t.what = '#post-'; /** * Binds the Escape key to revert the changes and close the quick editor. * * @return {boolean} The result of revert. */ qeRow.on( 'keyup', function(e){ // Revert changes if Escape key is pressed. if ( e.which === 27 ) { return inlineEditPost.revert(); } }); /** * Binds the Escape key to revert the changes and close the bulk editor. * * @return {boolean} The result of revert. */ bulkRow.on( 'keyup', function(e){ // Revert changes if Escape key is pressed. if ( e.which === 27 ) { return inlineEditPost.revert(); } }); /** * Reverts changes and close the quick editor if the cancel button is clicked. * * @return {boolean} The result of revert. */ $( '.cancel', qeRow ).on( 'click', function() { return inlineEditPost.revert(); }); /** * Saves changes in the quick editor if the save(named: update) button is clicked. * * @return {boolean} The result of save. */ $( '.save', qeRow ).on( 'click', function() { return inlineEditPost.save(this); }); /** * If Enter is pressed, and the target is not the cancel button, save the post. * * @return {boolean} The result of save. */ $('td', qeRow).on( 'keydown', function(e){ if ( e.which === 13 && ! $( e.target ).hasClass( 'cancel' ) ) { return inlineEditPost.save(this); } }); /** * Reverts changes and close the bulk editor if the cancel button is clicked. * * @return {boolean} The result of revert. */ $( '.cancel', bulkRow ).on( 'click', function() { return inlineEditPost.revert(); }); /** * Disables the password input field when the private post checkbox is checked. */ $('#inline-edit .inline-edit-private input[value="private"]').on( 'click', function(){ var pw = $('input.inline-edit-password-input'); if ( $(this).prop('checked') ) { pw.val('').prop('disabled', true); } else { pw.prop('disabled', false); } }); /** * Binds click event to the .editinline button which opens the quick editor. */ $( '#the-list' ).on( 'click', '.editinline', function() { $( this ).attr( 'aria-expanded', 'true' ); inlineEditPost.edit( this ); }); // Clone quick edit categories for the bulk editor. var beCategories = $( '#inline-edit fieldset.inline-edit-categories' ).clone(); // Make "id" attributes globally unique. beCategories.find( '*[id]' ).each( function() { this.id = 'bulk-edit-' + this.id; }); $('#bulk-edit').find('fieldset:first').after( beCategories ).siblings( 'fieldset:last' ).prepend( $( '#inline-edit .inline-edit-tags-wrap' ).clone() ); $('select[name="_status"] option[value="future"]', bulkRow).remove(); /** * Adds onclick events to the apply buttons. */ $('#doaction').on( 'click', function(e){ var n, $itemsSelected = $( '#posts-filter .check-column input[type="checkbox"]:checked' ); if ( $itemsSelected.length < 1 ) { return; } t.whichBulkButtonId = $( this ).attr( 'id' ); n = t.whichBulkButtonId.substr( 2 ); if ( 'edit' === $( 'select[name="' + n + '"]' ).val() ) { e.preventDefault(); t.setBulk(); } else if ( $('form#posts-filter tr.inline-editor').length > 0 ) { t.revert(); } }); }, /** * Toggles the quick edit window, hiding it when it's active and showing it when * inactive. * * @since 2.7.0 * * @memberof inlineEditPost * * @param {Object} el Element within a post table row. */ toggle : function(el){ var t = this; $( t.what + t.getId( el ) ).css( 'display' ) === 'none' ? t.revert() : t.edit( el ); }, /** * Creates the bulk editor row to edit multiple posts at once. * * @since 2.7.0 * * @memberof inlineEditPost */ setBulk : function(){ var te = '', type = this.type, c = true; var checkedPosts = $( 'tbody th.check-column input[type="checkbox"]:checked' ); var categories = {}; this.revert(); $( '#bulk-edit td' ).attr( 'colspan', $( 'th:visible, td:visible', '.widefat:first thead' ).length ); // Insert the editor at the top of the table with an empty row above to maintain zebra striping. $('table.widefat tbody').prepend( $('#bulk-edit') ).prepend(''); $('#bulk-edit').addClass('inline-editor').show(); /** * Create a HTML div with the title and a link(delete-icon) for each selected * post. * * Get the selected posts based on the checked checkboxes in the post table. */ $( 'tbody th.check-column input[type="checkbox"]' ).each( function() { // If the checkbox for a post is selected, add the post to the edit list. if ( $(this).prop('checked') ) { c = false; var id = $( this ).val(), theTitle = $( '#inline_' + id + ' .post_title' ).html() || wp.i18n.__( '(no title)' ), buttonVisuallyHiddenText = wp.i18n.sprintf( /* translators: %s: Post title. */ wp.i18n.__( 'Remove “%s” from Bulk Edit' ), theTitle ); te += '
  • '; } }); // If no checkboxes where checked, just hide the quick/bulk edit rows. if ( c ) { return this.revert(); } // Populate the list of items to bulk edit. $( '#bulk-titles' ).html( '
      ' + te + '
    ' ); // Gather up some statistics on which of these checked posts are in which categories. checkedPosts.each( function() { var id = $( this ).val(); var checked = $( '#category_' + id ).text().split( ',' ); checked.map( function( cid ) { categories[ cid ] || ( categories[ cid ] = 0 ); // Just record that this category is checked. categories[ cid ]++; } ); } ); // Compute initial states. $( '.inline-edit-categories input[name="post_category[]"]' ).each( function() { if ( categories[ $( this ).val() ] == checkedPosts.length ) { // If the number of checked categories matches the number of selected posts, then all posts are in this category. $( this ).prop( 'checked', true ); } else if ( categories[ $( this ).val() ] > 0 ) { // If the number is less than the number of selected posts, then it's indeterminate. $( this ).prop( 'indeterminate', true ); if ( ! $( this ).parent().find( 'input[name="indeterminate_post_category[]"]' ).length ) { // Get the term label text. var label = $( this ).parent().text(); // Set indeterminate states for the backend. Add accessible text for indeterminate inputs. $( this ).after( '' ).attr( 'aria-label', label.trim() + ': ' + wp.i18n.__( 'Some selected posts have this category' ) ); } } } ); $( '.inline-edit-categories input[name="post_category[]"]:indeterminate' ).on( 'change', function() { // Remove accessible label text. Remove the indeterminate flags as there was a specific state change. $( this ).removeAttr( 'aria-label' ).parent().find( 'input[name="indeterminate_post_category[]"]' ).remove(); } ); $( '.inline-edit-save button' ).on( 'click', function() { $( '.inline-edit-categories input[name="post_category[]"]' ).prop( 'indeterminate', false ); } ); /** * Binds on click events to handle the list of items to bulk edit. * * @listens click */ $( '#bulk-titles .ntdelbutton' ).click( function() { var $this = $( this ), id = $this.attr( 'id' ).substr( 1 ), $prev = $this.parent().prev().children( '.ntdelbutton' ), $next = $this.parent().next().children( '.ntdelbutton' ); $( 'input#cb-select-all-1, input#cb-select-all-2' ).prop( 'checked', false ); $( 'table.widefat input[value="' + id + '"]' ).prop( 'checked', false ); $( '#_' + id ).parent().remove(); wp.a11y.speak( wp.i18n.__( 'Item removed.' ), 'assertive' ); // Move focus to a proper place when items are removed. if ( $next.length ) { $next.focus(); } else if ( $prev.length ) { $prev.focus(); } else { $( '#bulk-titles-list' ).remove(); inlineEditPost.revert(); wp.a11y.speak( wp.i18n.__( 'All selected items have been removed. Select new items to use Bulk Actions.' ) ); } }); // Enable auto-complete for tags when editing posts. if ( 'post' === type ) { $( 'tr.inline-editor textarea[data-wp-taxonomy]' ).each( function ( i, element ) { /* * While Quick Edit clones the form each time, Bulk Edit always re-uses * the same form. Let's check if an autocomplete instance already exists. */ if ( $( element ).autocomplete( 'instance' ) ) { // jQuery equivalent of `continue` within an `each()` loop. return; } $( element ).wpTagsSuggest(); } ); } // Set initial focus on the Bulk Edit region. $( '#bulk-edit .inline-edit-wrapper' ).attr( 'tabindex', '-1' ).focus(); // Scrolls to the top of the table where the editor is rendered. $('html, body').animate( { scrollTop: 0 }, 'fast' ); }, /** * Creates a quick edit window for the post that has been clicked. * * @since 2.7.0 * * @memberof inlineEditPost * * @param {number|Object} id The ID of the clicked post or an element within a post * table row. * @return {boolean} Always returns false at the end of execution. */ edit : function(id) { var t = this, fields, editRow, rowData, status, pageOpt, pageLevel, nextPage, pageLoop = true, nextLevel, f, val, pw; t.revert(); if ( typeof(id) === 'object' ) { id = t.getId(id); } fields = ['post_title', 'post_name', 'post_author', '_status', 'jj', 'mm', 'aa', 'hh', 'mn', 'ss', 'post_password', 'post_format', 'menu_order', 'page_template']; if ( t.type === 'page' ) { fields.push('post_parent'); } // Add the new edit row with an extra blank row underneath to maintain zebra striping. editRow = $('#inline-edit').clone(true); $( 'td', editRow ).attr( 'colspan', $( 'th:visible, td:visible', '.widefat:first thead' ).length ); // Remove the ID from the copied row and let the `for` attribute reference the hidden ID. $( 'td', editRow ).find('#quick-edit-legend').removeAttr('id'); $( 'td', editRow ).find('p[id^="quick-edit-"]').removeAttr('id'); $(t.what+id).removeClass('is-expanded').hide().after(editRow).after(''); // Populate fields in the quick edit window. rowData = $('#inline_'+id); if ( !$(':input[name="post_author"] option[value="' + $('.post_author', rowData).text() + '"]', editRow).val() ) { // The post author no longer has edit capabilities, so we need to add them to the list of authors. $(':input[name="post_author"]', editRow).prepend(''); } if ( $( ':input[name="post_author"] option', editRow ).length === 1 ) { $('label.inline-edit-author', editRow).hide(); } for ( f = 0; f < fields.length; f++ ) { val = $('.'+fields[f], rowData); /** * Replaces the image for a Twemoji(Twitter emoji) with it's alternate text. * * @return {string} Alternate text from the image. */ val.find( 'img' ).replaceWith( function() { return this.alt; } ); val = val.text(); $(':input[name="' + fields[f] + '"]', editRow).val( val ); } if ( $( '.comment_status', rowData ).text() === 'open' ) { $( 'input[name="comment_status"]', editRow ).prop( 'checked', true ); } if ( $( '.ping_status', rowData ).text() === 'open' ) { $( 'input[name="ping_status"]', editRow ).prop( 'checked', true ); } if ( $( '.sticky', rowData ).text() === 'sticky' ) { $( 'input[name="sticky"]', editRow ).prop( 'checked', true ); } /** * Creates the select boxes for the categories. */ $('.post_category', rowData).each(function(){ var taxname, term_ids = $(this).text(); if ( term_ids ) { taxname = $(this).attr('id').replace('_'+id, ''); $('ul.'+taxname+'-checklist :checkbox', editRow).val(term_ids.split(',')); } }); /** * Gets all the taxonomies for live auto-fill suggestions when typing the name * of a tag. */ $('.tags_input', rowData).each(function(){ var terms = $(this), taxname = $(this).attr('id').replace('_' + id, ''), textarea = $('textarea.tax_input_' + taxname, editRow), comma = wp.i18n._x( ',', 'tag delimiter' ).trim(); // Ensure the textarea exists. if ( ! textarea.length ) { return; } terms.find( 'img' ).replaceWith( function() { return this.alt; } ); terms = terms.text(); if ( terms ) { if ( ',' !== comma ) { terms = terms.replace(/,/g, comma); } textarea.val(terms); } textarea.wpTagsSuggest(); }); // Handle the post status. var post_date_string = $(':input[name="aa"]').val() + '-' + $(':input[name="mm"]').val() + '-' + $(':input[name="jj"]').val(); post_date_string += ' ' + $(':input[name="hh"]').val() + ':' + $(':input[name="mn"]').val() + ':' + $(':input[name="ss"]').val(); var post_date = new Date( post_date_string ); status = $('._status', rowData).text(); if ( 'future' !== status && Date.now() > post_date ) { $('select[name="_status"] option[value="future"]', editRow).remove(); } else { $('select[name="_status"] option[value="publish"]', editRow).remove(); } pw = $( '.inline-edit-password-input' ).prop( 'disabled', false ); if ( 'private' === status ) { $('input[name="keep_private"]', editRow).prop('checked', true); pw.val( '' ).prop( 'disabled', true ); } // Remove the current page and children from the parent dropdown. pageOpt = $('select[name="post_parent"] option[value="' + id + '"]', editRow); if ( pageOpt.length > 0 ) { pageLevel = pageOpt[0].className.split('-')[1]; nextPage = pageOpt; while ( pageLoop ) { nextPage = nextPage.next('option'); if ( nextPage.length === 0 ) { break; } nextLevel = nextPage[0].className.split('-')[1]; if ( nextLevel <= pageLevel ) { pageLoop = false; } else { nextPage.remove(); nextPage = pageOpt; } } pageOpt.remove(); } $(editRow).attr('id', 'edit-'+id).addClass('inline-editor').show(); $('.ptitle', editRow).trigger( 'focus' ); return false; }, /** * Saves the changes made in the quick edit window to the post. * Ajax saving is only for Quick Edit and not for bulk edit. * * @since 2.7.0 * * @param {number} id The ID for the post that has been changed. * @return {boolean} False, so the form does not submit when pressing * Enter on a focused field. */ save : function(id) { var params, fields, page = $('.post_status_page').val() || ''; if ( typeof(id) === 'object' ) { id = this.getId(id); } $( 'table.widefat .spinner' ).addClass( 'is-active' ); params = { action: 'inline-save', post_type: typenow, post_ID: id, edit_date: 'true', post_status: page }; fields = $('#edit-'+id).find(':input').serialize(); params = fields + '&' + $.param(params); // Make Ajax request. $.post( ajaxurl, params, function(r) { var $errorNotice = $( '#edit-' + id + ' .inline-edit-save .notice-error' ), $error = $errorNotice.find( '.error' ); $( 'table.widefat .spinner' ).removeClass( 'is-active' ); if (r) { if ( -1 !== r.indexOf( ']*?>/g, '' ); $errorNotice.removeClass( 'hidden' ); $error.html( r ); wp.a11y.speak( $error.text() ); } } else { $errorNotice.removeClass( 'hidden' ); $error.text( wp.i18n.__( 'Error while saving the changes.' ) ); wp.a11y.speak( wp.i18n.__( 'Error while saving the changes.' ) ); } }, 'html'); // Prevent submitting the form when pressing Enter on a focused field. return false; }, /** * Hides and empties the Quick Edit and/or Bulk Edit windows. * * @since 2.7.0 * * @memberof inlineEditPost * * @return {boolean} Always returns false. */ revert : function(){ var $tableWideFat = $( '.widefat' ), id = $( '.inline-editor', $tableWideFat ).attr( 'id' ); if ( id ) { $( '.spinner', $tableWideFat ).removeClass( 'is-active' ); if ( 'bulk-edit' === id ) { // Hide the bulk editor. $( '#bulk-edit', $tableWideFat ).removeClass( 'inline-editor' ).hide().siblings( '.hidden' ).remove(); $('#bulk-titles').empty(); // Store the empty bulk editor in a hidden element. $('#inlineedit').append( $('#bulk-edit') ); // Move focus back to the Bulk Action button that was activated. $( '#' + inlineEditPost.whichBulkButtonId ).trigger( 'focus' ); } else { // Remove both the inline-editor and its hidden tr siblings. $('#'+id).siblings('tr.hidden').addBack().remove(); id = id.substr( id.lastIndexOf('-') + 1 ); // Show the post row and move focus back to the Quick Edit button. $( this.what + id ).show().find( '.editinline' ) .attr( 'aria-expanded', 'false' ) .trigger( 'focus' ); } } return false; }, /** * Gets the ID for a the post that you want to quick edit from the row in the quick * edit table. * * @since 2.7.0 * * @memberof inlineEditPost * * @param {Object} o DOM row object to get the ID for. * @return {string} The post ID extracted from the table row in the object. */ getId : function(o) { var id = $(o).closest('tr').attr('id'), parts = id.split('-'); return parts[parts.length - 1]; } }; $( function() { inlineEditPost.init(); } ); // Show/hide locks on posts. $( function() { // Set the heartbeat interval to 10 seconds. if ( typeof wp !== 'undefined' && wp.heartbeat ) { wp.heartbeat.interval( 10 ); } }).on( 'heartbeat-tick.wp-check-locked-posts', function( e, data ) { var locked = data['wp-check-locked-posts'] || {}; $('#the-list tr').each( function(i, el) { var key = el.id, row = $(el), lock_data, avatar; if ( locked.hasOwnProperty( key ) ) { if ( ! row.hasClass('wp-locked') ) { lock_data = locked[key]; row.find('.column-title .locked-text').text( lock_data.text ); row.find('.check-column checkbox').prop('checked', false); if ( lock_data.avatar_src ) { avatar = $( '', { 'class': 'avatar avatar-18 photo', width: 18, height: 18, alt: '', src: lock_data.avatar_src, srcset: lock_data.avatar_src_2x ? lock_data.avatar_src_2x + ' 2x' : undefined } ); row.find('.column-title .locked-avatar').empty().append( avatar ); } row.addClass('wp-locked'); } } else if ( row.hasClass('wp-locked') ) { row.removeClass( 'wp-locked' ).find( '.locked-info span' ).empty(); } }); }).on( 'heartbeat-send.wp-check-locked-posts', function( e, data ) { var check = []; $('#the-list tr').each( function(i, el) { if ( el.id ) { check.push( el.id ); } }); if ( check.length ) { data['wp-check-locked-posts'] = check; } }); })( jQuery, window.wp ); PKZA""js/dashboard.min.jsnu[/*! This file is auto-generated */ window.wp=window.wp||{},window.communityEventsData=window.communityEventsData||{},jQuery(function(s){var t,n=s("#welcome-panel"),e=s("#wp_welcome_panel-hide");t=function(e){s.post(ajaxurl,{action:"update-welcome-panel",visible:e,welcomepanelnonce:s("#welcomepanelnonce").val()},function(){wp.a11y.speak(wp.i18n.__("Screen Options updated."))})},n.hasClass("hidden")&&e.prop("checked")&&n.removeClass("hidden"),s(".welcome-panel-close, .welcome-panel-dismiss a",n).on("click",function(e){e.preventDefault(),n.addClass("hidden"),t(0),s("#wp_welcome_panel-hide").prop("checked",!1)}),e.on("click",function(){n.toggleClass("hidden",!this.checked),t(this.checked?1:0)}),window.ajaxWidgets=["dashboard_primary"],window.ajaxPopulateWidgets=function(e){function t(e,t){var n,o=s("#"+t+" div.inside:visible").find(".widget-loading");o.length&&(n=o.parent(),setTimeout(function(){n.load(ajaxurl+"?action=dashboard-widgets&widget="+t+"&pagenow="+pagenow,"",function(){n.hide().slideDown("normal",function(){s(this).css("display","")})})},500*e))}e?(e=e.toString(),-1!==s.inArray(e,ajaxWidgets)&&t(0,e)):s.each(ajaxWidgets,t)},ajaxPopulateWidgets(),postboxes.add_postbox_toggles(pagenow,{pbshow:ajaxPopulateWidgets}),window.quickPressLoad=function(){var t,n,o,i,a,e=s("#quickpost-action");s('#quick-press .submit input[type="submit"], #quick-press .submit input[type="reset"]').prop("disabled",!1),t=s("#quick-press").on("submit",function(e){e.preventDefault(),s("#dashboard_quick_press #publishing-action .spinner").show(),s('#quick-press .submit input[type="submit"], #quick-press .submit input[type="reset"]').prop("disabled",!0),s.post(t.attr("action"),t.serializeArray(),function(e){var t;s("#dashboard_quick_press .inside").html(e),s("#quick-press").removeClass("initial-form"),quickPressLoad(),(t=s(".drafts ul li").first()).css("background","#fffbe5"),setTimeout(function(){t.css("background","none")},1e3),s("#title").trigger("focus")})}),s("#publish").on("click",function(){e.val("post-quickpress-publish")}),s("#quick-press").on("click focusin",function(){wpActiveEditor="content"}),document.documentMode&&document.documentMode<9||(s("body").append(''),n=s(".quick-draft-textarea-clone"),o=s("#content"),i=o.height(),a=s(window).height()-100,n.css({"font-family":o.css("font-family"),"font-size":o.css("font-size"),"line-height":o.css("line-height"),"padding-bottom":o.css("paddingBottom"),"padding-left":o.css("paddingLeft"),"padding-right":o.css("paddingRight"),"padding-top":o.css("paddingTop"),"white-space":"pre-wrap","word-wrap":"break-word",display:"none"}),o.on("focus input propertychange",function(){var e=s(this),t=e.val()+" ",t=n.css("width",e.css("width")).text(t).outerHeight()+2;o.css("overflow-y","auto"),t===i||a<=t&&a<=i||(i=a'+s+""):"recommended"===e.status?t=r(n("%s recommended improvement","%s recommended improvements",s),''+s+""):"good"===e.status&&(t=r(n("%s item with no issues detected","%s items with no issues detected",s),''+s+"")),t&&o(".site-health-issue-count-title",i).html(t),u.text(SiteHealth.site_status.issues.critical),0"+e+"

    "+t+"

    ",actions:""};d(wp.hooks.applyFilters("site_status_test_result",e))}function s(){var t=(new Date).getTime(),s=window.setTimeout(function(){g("waiting-for-directory-sizes")},3e3);wp.apiRequest({path:"/wp-site-health/v1/directory-sizes"}).done(function(e){var a,s;a=e||{},e=o("button.button.copy-button"),s=e.attr("data-clipboard-text"),o.each(a,function(e,t){t=t.debug||t.size;void 0!==t&&(s=s.replace(e+": loading...",e+": "+t))}),e.attr("data-clipboard-text",s),i.find("td[class]").each(function(e,t){var t=o(t),s=t.attr("class");a.hasOwnProperty(s)&&a[s].size&&t.text(a[s].size)})}).always(function(){var e=(new Date).getTime()-t;o(".health-check-wp-paths-sizes.spinner").css("visibility","hidden"),3e3 0 ) { component.showWarning(); } if ( false !== component.codeEditor ) { /* * Defer adding notices until after DOM ready as workaround for WP Admin injecting * its own managed dismiss buttons and also to prevent the editor from showing a notice * when the file had linting errors to begin with. */ _.defer( function() { component.initCodeEditor(); } ); } $( component.initFileBrowser ); $( window ).on( 'beforeunload', function() { if ( component.dirty ) { return __( 'The changes you made will be lost if you navigate away from this page.' ); } return undefined; } ); component.docsLookUpList.on( 'change', function() { var option = $( this ).val(); if ( '' === option ) { component.docsLookUpButton.prop( 'disabled', true ); } else { component.docsLookUpButton.prop( 'disabled', false ); } } ); }; /** * Set up and display the warning modal. * * @since 4.9.0 * @return {void} */ component.showWarning = function() { // Get the text within the modal. var rawMessage = component.warning.find( '.file-editor-warning-message' ).text(); // Hide all the #wpwrap content from assistive technologies. $( '#wpwrap' ).attr( 'aria-hidden', 'true' ); // Detach the warning modal from its position and append it to the body. $( document.body ) .addClass( 'modal-open' ) .append( component.warning.detach() ); // Reveal the modal and set focus on the go back button. component.warning .removeClass( 'hidden' ) .find( '.file-editor-warning-go-back' ).trigger( 'focus' ); // Get the links and buttons within the modal. component.warningTabbables = component.warning.find( 'a, button' ); // Attach event handlers. component.warningTabbables.on( 'keydown', component.constrainTabbing ); component.warning.on( 'click', '.file-editor-warning-dismiss', component.dismissWarning ); // Make screen readers announce the warning message after a short delay (necessary for some screen readers). setTimeout( function() { wp.a11y.speak( wp.sanitize.stripTags( rawMessage.replace( /\s+/g, ' ' ) ), 'assertive' ); }, 1000 ); }; /** * Constrain tabbing within the warning modal. * * @since 4.9.0 * @param {Object} event jQuery event object. * @return {void} */ component.constrainTabbing = function( event ) { var firstTabbable, lastTabbable; if ( 9 !== event.which ) { return; } firstTabbable = component.warningTabbables.first()[0]; lastTabbable = component.warningTabbables.last()[0]; if ( lastTabbable === event.target && ! event.shiftKey ) { firstTabbable.focus(); event.preventDefault(); } else if ( firstTabbable === event.target && event.shiftKey ) { lastTabbable.focus(); event.preventDefault(); } }; /** * Dismiss the warning modal. * * @since 4.9.0 * @return {void} */ component.dismissWarning = function() { wp.ajax.post( 'dismiss-wp-pointer', { pointer: component.themeOrPlugin + '_editor_notice' }); // Hide modal. component.warning.remove(); $( '#wpwrap' ).removeAttr( 'aria-hidden' ); $( 'body' ).removeClass( 'modal-open' ); }; /** * Callback for when a change happens. * * @since 4.9.0 * @return {void} */ component.onChange = function() { component.dirty = true; component.removeNotice( 'file_saved' ); }; /** * Submit file via Ajax. * * @since 4.9.0 * @param {jQuery.Event} event - Event. * @return {void} */ component.submit = function( event ) { var data = {}, request; event.preventDefault(); // Prevent form submission in favor of Ajax below. $.each( component.form.serializeArray(), function() { data[ this.name ] = this.value; } ); // Use value from codemirror if present. if ( component.instance ) { data.newcontent = component.instance.codemirror.getValue(); } if ( component.isSaving ) { return; } // Scroll to the line that has the error. if ( component.lintErrors.length ) { component.instance.codemirror.setCursor( component.lintErrors[0].from.line ); return; } component.isSaving = true; component.textarea.prop( 'readonly', true ); if ( component.instance ) { component.instance.codemirror.setOption( 'readOnly', true ); } component.spinner.addClass( 'is-active' ); request = wp.ajax.post( 'edit-theme-plugin-file', data ); // Remove previous save notice before saving. if ( component.lastSaveNoticeCode ) { component.removeNotice( component.lastSaveNoticeCode ); } request.done( function( response ) { component.lastSaveNoticeCode = 'file_saved'; component.addNotice({ code: component.lastSaveNoticeCode, type: 'success', message: response.message, dismissible: true }); component.dirty = false; } ); request.fail( function( response ) { var notice = $.extend( { code: 'save_error', message: __( 'An error occurred while saving your changes. Please try again. If the problem persists, you may need to manually update the file via FTP.' ) }, response, { type: 'error', dismissible: true } ); component.lastSaveNoticeCode = notice.code; component.addNotice( notice ); } ); request.always( function() { component.spinner.removeClass( 'is-active' ); component.isSaving = false; component.textarea.prop( 'readonly', false ); if ( component.instance ) { component.instance.codemirror.setOption( 'readOnly', false ); } } ); }; /** * Add notice. * * @since 4.9.0 * * @param {Object} notice - Notice. * @param {string} notice.code - Code. * @param {string} notice.type - Type. * @param {string} notice.message - Message. * @param {boolean} [notice.dismissible=false] - Dismissible. * @param {Function} [notice.onDismiss] - Callback for when a user dismisses the notice. * @return {jQuery} Notice element. */ component.addNotice = function( notice ) { var noticeElement; if ( ! notice.code ) { throw new Error( 'Missing code.' ); } // Only let one notice of a given type be displayed at a time. component.removeNotice( notice.code ); noticeElement = $( component.noticeTemplate( notice ) ); noticeElement.hide(); noticeElement.find( '.notice-dismiss' ).on( 'click', function() { component.removeNotice( notice.code ); if ( notice.onDismiss ) { notice.onDismiss( notice ); } } ); wp.a11y.speak( notice.message ); component.noticesContainer.append( noticeElement ); noticeElement.slideDown( 'fast' ); component.noticeElements[ notice.code ] = noticeElement; return noticeElement; }; /** * Remove notice. * * @since 4.9.0 * * @param {string} code - Notice code. * @return {boolean} Whether a notice was removed. */ component.removeNotice = function( code ) { if ( component.noticeElements[ code ] ) { component.noticeElements[ code ].slideUp( 'fast', function() { $( this ).remove(); } ); delete component.noticeElements[ code ]; return true; } return false; }; /** * Initialize code editor. * * @since 4.9.0 * @return {void} */ component.initCodeEditor = function initCodeEditor() { var codeEditorSettings, editor; codeEditorSettings = $.extend( {}, component.codeEditor ); /** * Handle tabbing to the field before the editor. * * @since 4.9.0 * * @return {void} */ codeEditorSettings.onTabPrevious = function() { $( '#templateside' ).find( ':tabbable' ).last().trigger( 'focus' ); }; /** * Handle tabbing to the field after the editor. * * @since 4.9.0 * * @return {void} */ codeEditorSettings.onTabNext = function() { $( '#template' ).find( ':tabbable:not(.CodeMirror-code)' ).first().trigger( 'focus' ); }; /** * Handle change to the linting errors. * * @since 4.9.0 * * @param {Array} errors - List of linting errors. * @return {void} */ codeEditorSettings.onChangeLintingErrors = function( errors ) { component.lintErrors = errors; // Only disable the button in onUpdateErrorNotice when there are errors so users can still feel they can click the button. if ( 0 === errors.length ) { component.submitButton.toggleClass( 'disabled', false ); } }; /** * Update error notice. * * @since 4.9.0 * * @param {Array} errorAnnotations - Error annotations. * @return {void} */ codeEditorSettings.onUpdateErrorNotice = function onUpdateErrorNotice( errorAnnotations ) { var noticeElement; component.submitButton.toggleClass( 'disabled', errorAnnotations.length > 0 ); if ( 0 !== errorAnnotations.length ) { noticeElement = component.addNotice({ code: 'lint_errors', type: 'error', message: sprintf( /* translators: %s: Error count. */ _n( 'There is %s error which must be fixed before you can update this file.', 'There are %s errors which must be fixed before you can update this file.', errorAnnotations.length ), String( errorAnnotations.length ) ), dismissible: false }); noticeElement.find( 'input[type=checkbox]' ).on( 'click', function() { codeEditorSettings.onChangeLintingErrors( [] ); component.removeNotice( 'lint_errors' ); } ); } else { component.removeNotice( 'lint_errors' ); } }; editor = wp.codeEditor.initialize( $( '#newcontent' ), codeEditorSettings ); editor.codemirror.on( 'change', component.onChange ); // Improve the editor accessibility. $( editor.codemirror.display.lineDiv ) .attr({ role: 'textbox', 'aria-multiline': 'true', 'aria-labelledby': 'theme-plugin-editor-label', 'aria-describedby': 'editor-keyboard-trap-help-1 editor-keyboard-trap-help-2 editor-keyboard-trap-help-3 editor-keyboard-trap-help-4' }); // Focus the editor when clicking on its label. $( '#theme-plugin-editor-label' ).on( 'click', function() { editor.codemirror.focus(); }); component.instance = editor; }; /** * Initialization of the file browser's folder states. * * @since 4.9.0 * @return {void} */ component.initFileBrowser = function initFileBrowser() { var $templateside = $( '#templateside' ); // Collapse all folders. $templateside.find( '[role="group"]' ).parent().attr( 'aria-expanded', false ); // Expand ancestors to the current file. $templateside.find( '.notice' ).parents( '[aria-expanded]' ).attr( 'aria-expanded', true ); // Find Tree elements and enhance them. $templateside.find( '[role="tree"]' ).each( function() { var treeLinks = new TreeLinks( this ); treeLinks.init(); } ); // Scroll the current file into view. $templateside.find( '.current-file:first' ).each( function() { if ( this.scrollIntoViewIfNeeded ) { this.scrollIntoViewIfNeeded(); } else { this.scrollIntoView( false ); } } ); }; /* jshint ignore:start */ /* jscs:disable */ /* eslint-disable */ /** * Creates a new TreeitemLink. * * @since 4.9.0 * @class * @private * @see {@link https://www.w3.org/TR/wai-aria-practices-1.1/examples/treeview/treeview-2/treeview-2b.html|W3C Treeview Example} * @license W3C-20150513 */ var TreeitemLink = (function () { /** * This content is licensed according to the W3C Software License at * https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document * * File: TreeitemLink.js * * Desc: Treeitem widget that implements ARIA Authoring Practices * for a tree being used as a file viewer * * Author: Jon Gunderson, Ku Ja Eun and Nicholas Hoyt */ /** * @constructor * * @desc * Treeitem object for representing the state and user interactions for a * treeItem widget * * @param node * An element with the role=tree attribute */ var TreeitemLink = function (node, treeObj, group) { // Check whether node is a DOM element. if (typeof node !== 'object') { return; } node.tabIndex = -1; this.tree = treeObj; this.groupTreeitem = group; this.domNode = node; this.label = node.textContent.trim(); this.stopDefaultClick = false; if (node.getAttribute('aria-label')) { this.label = node.getAttribute('aria-label').trim(); } this.isExpandable = false; this.isVisible = false; this.inGroup = false; if (group) { this.inGroup = true; } var elem = node.firstElementChild; while (elem) { if (elem.tagName.toLowerCase() == 'ul') { elem.setAttribute('role', 'group'); this.isExpandable = true; break; } elem = elem.nextElementSibling; } this.keyCode = Object.freeze({ RETURN: 13, SPACE: 32, PAGEUP: 33, PAGEDOWN: 34, END: 35, HOME: 36, LEFT: 37, UP: 38, RIGHT: 39, DOWN: 40 }); }; TreeitemLink.prototype.init = function () { this.domNode.tabIndex = -1; if (!this.domNode.getAttribute('role')) { this.domNode.setAttribute('role', 'treeitem'); } this.domNode.addEventListener('keydown', this.handleKeydown.bind(this)); this.domNode.addEventListener('click', this.handleClick.bind(this)); this.domNode.addEventListener('focus', this.handleFocus.bind(this)); this.domNode.addEventListener('blur', this.handleBlur.bind(this)); if (this.isExpandable) { this.domNode.firstElementChild.addEventListener('mouseover', this.handleMouseOver.bind(this)); this.domNode.firstElementChild.addEventListener('mouseout', this.handleMouseOut.bind(this)); } else { this.domNode.addEventListener('mouseover', this.handleMouseOver.bind(this)); this.domNode.addEventListener('mouseout', this.handleMouseOut.bind(this)); } }; TreeitemLink.prototype.isExpanded = function () { if (this.isExpandable) { return this.domNode.getAttribute('aria-expanded') === 'true'; } return false; }; /* EVENT HANDLERS */ TreeitemLink.prototype.handleKeydown = function (event) { var tgt = event.currentTarget, flag = false, _char = event.key, clickEvent; function isPrintableCharacter(str) { return str.length === 1 && str.match(/\S/); } function printableCharacter(item) { if (_char == '*') { item.tree.expandAllSiblingItems(item); flag = true; } else { if (isPrintableCharacter(_char)) { item.tree.setFocusByFirstCharacter(item, _char); flag = true; } } } this.stopDefaultClick = false; if (event.altKey || event.ctrlKey || event.metaKey) { return; } if (event.shift) { if (event.keyCode == this.keyCode.SPACE || event.keyCode == this.keyCode.RETURN) { event.stopPropagation(); this.stopDefaultClick = true; } else { if (isPrintableCharacter(_char)) { printableCharacter(this); } } } else { switch (event.keyCode) { case this.keyCode.SPACE: case this.keyCode.RETURN: if (this.isExpandable) { if (this.isExpanded()) { this.tree.collapseTreeitem(this); } else { this.tree.expandTreeitem(this); } flag = true; } else { event.stopPropagation(); this.stopDefaultClick = true; } break; case this.keyCode.UP: this.tree.setFocusToPreviousItem(this); flag = true; break; case this.keyCode.DOWN: this.tree.setFocusToNextItem(this); flag = true; break; case this.keyCode.RIGHT: if (this.isExpandable) { if (this.isExpanded()) { this.tree.setFocusToNextItem(this); } else { this.tree.expandTreeitem(this); } } flag = true; break; case this.keyCode.LEFT: if (this.isExpandable && this.isExpanded()) { this.tree.collapseTreeitem(this); flag = true; } else { if (this.inGroup) { this.tree.setFocusToParentItem(this); flag = true; } } break; case this.keyCode.HOME: this.tree.setFocusToFirstItem(); flag = true; break; case this.keyCode.END: this.tree.setFocusToLastItem(); flag = true; break; default: if (isPrintableCharacter(_char)) { printableCharacter(this); } break; } } if (flag) { event.stopPropagation(); event.preventDefault(); } }; TreeitemLink.prototype.handleClick = function (event) { // Only process click events that directly happened on this treeitem. if (event.target !== this.domNode && event.target !== this.domNode.firstElementChild) { return; } if (this.isExpandable) { if (this.isExpanded()) { this.tree.collapseTreeitem(this); } else { this.tree.expandTreeitem(this); } event.stopPropagation(); } }; TreeitemLink.prototype.handleFocus = function (event) { var node = this.domNode; if (this.isExpandable) { node = node.firstElementChild; } node.classList.add('focus'); }; TreeitemLink.prototype.handleBlur = function (event) { var node = this.domNode; if (this.isExpandable) { node = node.firstElementChild; } node.classList.remove('focus'); }; TreeitemLink.prototype.handleMouseOver = function (event) { event.currentTarget.classList.add('hover'); }; TreeitemLink.prototype.handleMouseOut = function (event) { event.currentTarget.classList.remove('hover'); }; return TreeitemLink; })(); /** * Creates a new TreeLinks. * * @since 4.9.0 * @class * @private * @see {@link https://www.w3.org/TR/wai-aria-practices-1.1/examples/treeview/treeview-2/treeview-2b.html|W3C Treeview Example} * @license W3C-20150513 */ TreeLinks = (function () { /* * This content is licensed according to the W3C Software License at * https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document * * File: TreeLinks.js * * Desc: Tree widget that implements ARIA Authoring Practices * for a tree being used as a file viewer * * Author: Jon Gunderson, Ku Ja Eun and Nicholas Hoyt */ /* * @constructor * * @desc * Tree item object for representing the state and user interactions for a * tree widget * * @param node * An element with the role=tree attribute */ var TreeLinks = function (node) { // Check whether node is a DOM element. if (typeof node !== 'object') { return; } this.domNode = node; this.treeitems = []; this.firstChars = []; this.firstTreeitem = null; this.lastTreeitem = null; }; TreeLinks.prototype.init = function () { function findTreeitems(node, tree, group) { var elem = node.firstElementChild; var ti = group; while (elem) { if ((elem.tagName.toLowerCase() === 'li' && elem.firstElementChild.tagName.toLowerCase() === 'span') || elem.tagName.toLowerCase() === 'a') { ti = new TreeitemLink(elem, tree, group); ti.init(); tree.treeitems.push(ti); tree.firstChars.push(ti.label.substring(0, 1).toLowerCase()); } if (elem.firstElementChild) { findTreeitems(elem, tree, ti); } elem = elem.nextElementSibling; } } // Initialize pop up menus. if (!this.domNode.getAttribute('role')) { this.domNode.setAttribute('role', 'tree'); } findTreeitems(this.domNode, this, false); this.updateVisibleTreeitems(); this.firstTreeitem.domNode.tabIndex = 0; }; TreeLinks.prototype.setFocusToItem = function (treeitem) { for (var i = 0; i < this.treeitems.length; i++) { var ti = this.treeitems[i]; if (ti === treeitem) { ti.domNode.tabIndex = 0; ti.domNode.focus(); } else { ti.domNode.tabIndex = -1; } } }; TreeLinks.prototype.setFocusToNextItem = function (currentItem) { var nextItem = false; for (var i = (this.treeitems.length - 1); i >= 0; i--) { var ti = this.treeitems[i]; if (ti === currentItem) { break; } if (ti.isVisible) { nextItem = ti; } } if (nextItem) { this.setFocusToItem(nextItem); } }; TreeLinks.prototype.setFocusToPreviousItem = function (currentItem) { var prevItem = false; for (var i = 0; i < this.treeitems.length; i++) { var ti = this.treeitems[i]; if (ti === currentItem) { break; } if (ti.isVisible) { prevItem = ti; } } if (prevItem) { this.setFocusToItem(prevItem); } }; TreeLinks.prototype.setFocusToParentItem = function (currentItem) { if (currentItem.groupTreeitem) { this.setFocusToItem(currentItem.groupTreeitem); } }; TreeLinks.prototype.setFocusToFirstItem = function () { this.setFocusToItem(this.firstTreeitem); }; TreeLinks.prototype.setFocusToLastItem = function () { this.setFocusToItem(this.lastTreeitem); }; TreeLinks.prototype.expandTreeitem = function (currentItem) { if (currentItem.isExpandable) { currentItem.domNode.setAttribute('aria-expanded', true); this.updateVisibleTreeitems(); } }; TreeLinks.prototype.expandAllSiblingItems = function (currentItem) { for (var i = 0; i < this.treeitems.length; i++) { var ti = this.treeitems[i]; if ((ti.groupTreeitem === currentItem.groupTreeitem) && ti.isExpandable) { this.expandTreeitem(ti); } } }; TreeLinks.prototype.collapseTreeitem = function (currentItem) { var groupTreeitem = false; if (currentItem.isExpanded()) { groupTreeitem = currentItem; } else { groupTreeitem = currentItem.groupTreeitem; } if (groupTreeitem) { groupTreeitem.domNode.setAttribute('aria-expanded', false); this.updateVisibleTreeitems(); this.setFocusToItem(groupTreeitem); } }; TreeLinks.prototype.updateVisibleTreeitems = function () { this.firstTreeitem = this.treeitems[0]; for (var i = 0; i < this.treeitems.length; i++) { var ti = this.treeitems[i]; var parent = ti.domNode.parentNode; ti.isVisible = true; while (parent && (parent !== this.domNode)) { if (parent.getAttribute('aria-expanded') == 'false') { ti.isVisible = false; } parent = parent.parentNode; } if (ti.isVisible) { this.lastTreeitem = ti; } } }; TreeLinks.prototype.setFocusByFirstCharacter = function (currentItem, _char) { var start, index; _char = _char.toLowerCase(); // Get start index for search based on position of currentItem. start = this.treeitems.indexOf(currentItem) + 1; if (start === this.treeitems.length) { start = 0; } // Check remaining slots in the menu. index = this.getIndexFirstChars(start, _char); // If not found in remaining slots, check from beginning. if (index === -1) { index = this.getIndexFirstChars(0, _char); } // If match was found... if (index > -1) { this.setFocusToItem(this.treeitems[index]); } }; TreeLinks.prototype.getIndexFirstChars = function (startIndex, _char) { for (var i = startIndex; i < this.firstChars.length; i++) { if (this.treeitems[i].isVisible) { if (_char === this.firstChars[i]) { return i; } } } return -1; }; return TreeLinks; })(); /* jshint ignore:end */ /* jscs:enable */ /* eslint-enable */ return component; })( jQuery ); /** * Removed in 5.5.0, needed for back-compatibility. * * @since 4.9.0 * @deprecated 5.5.0 * * @type {object} */ wp.themePluginEditor.l10n = wp.themePluginEditor.l10n || { saveAlert: '', saveError: '', lintError: { alternative: 'wp.i18n', func: function() { return { singular: '', plural: '' }; } } }; wp.themePluginEditor.l10n = window.wp.deprecateL10nObject( 'wp.themePluginEditor.l10n', wp.themePluginEditor.l10n, '5.5.0' ); PKZR"<<js/edit-comments.min.jsnu[/*! This file is auto-generated */ !function(w){var o,s,i=document.title,C=w("#dashboard_right_now").length,c=wp.i18n.__,x=function(t){t=parseInt(t.html().replace(/[^0-9]+/g,""),10);return isNaN(t)?0:t},r=function(t,e){var n="";if(!isNaN(e)){if(3<(e=e<1?"0":e.toString()).length){for(;3"),e=i,1<=(a=(a=s.exec(document.title))?(a=a[0],o.html(a),x(o)+t):(o.html(0),t))?(r(o,a),(n=s.exec(document.title))&&(e=document.title.replace(n[0],c("Comments (%s)").replace("%s",o.text())+" "))):(n=s.exec(e))&&(e=e.replace(n[0],c("Comments"))),document.title=e},I=function(n,t){var e=".post-com-count-"+t,a="comment-count-no-pending",o="post-com-count-no-pending",s="comment-count-pending";C||l(n),w("span.pending-count").each(function(){var t=w(this),e=x(t)+n;e<1&&(e=0),t.closest(".awaiting-mod")[0===e?"addClass":"removeClass"]("count-0"),r(t,e)}),t&&(t=w("span."+s,e),e=w("span."+a,e),t.each(function(){var t=w(this),e=x(t)+n;0===(e=e<1?0:e)?(t.parent().addClass(o),t.removeClass(s).addClass(a)):(t.parent().removeClass(o),t.addClass(s).removeClass(a)),r(t,e)}),e.each(function(){var t=w(this);0
    "),a.on("click",".notice.is-dismissible .notice-dismiss",function(){setTimeout(function(){a.removeClass("plugin-card-update-failed").find(".column-name a").trigger("focus")},200)}),s.removeClass("updating-message").addClass("button-disabled").attr("aria-label",i).text(n),g.a11y.speak(t,"assertive"),g.updates.setCardButtonStatus({status:"plugin-install-failed",slug:e.slug,removeClasses:"updating-message",addClasses:"button-disabled",text:n,ariaLabel:i}),f.trigger("wp-plugin-install-error",e))},g.updates.checkPluginDependencies=function(e){return e=_.extend({success:g.updates.checkPluginDependenciesSuccess,error:g.updates.checkPluginDependenciesError},e),g.a11y.speak(h("Checking plugin dependencies... please wait.")),f.trigger("wp-checking-plugin-dependencies",e),g.updates.ajax("check_plugin_dependencies",e)},g.updates.checkPluginDependenciesSuccess=function(e){var t,a,s=c(".plugin-card-"+e.slug+", #plugin-information-footer").find(".install-now");s.removeClass("install-now installed button-disabled updated-message").addClass("activate-now button-primary").attr("href",e.activateUrl),g.a11y.speak(h("Plugin dependencies check completed successfully.")),f.trigger("wp-check-plugin-dependencies-success",e),("plugins-network"===pagenow?(t=r("Network Activate","plugin"),a=v(r("Network Activate %s","plugin"),e.pluginName),s.attr("aria-label",a)):(t=r("Activate","plugin"),a=v(r("Activate %s","plugin"),e.pluginName),s.attr("aria-label",a).attr("data-name",e.pluginName).attr("data-slug",e.slug).attr("data-plugin",e.plugin))).text(t),"plugin-information-footer"===s.parent().attr("id")&&g.updates.setCardButtonStatus({status:"dependencies-check-success",slug:e.slug,removeClasses:"install-now installed button-disabled updated-message",addClasses:"activate-now button-primary",text:t,ariaLabel:a,pluginName:e.pluginName,plugin:e.plugin,href:e.activateUrl})},g.updates.checkPluginDependenciesError=function(e){var t,a=c(".plugin-card-"+e.slug+", #plugin-information-footer").find(".install-now"),s=r("Activate","plugin"),n=v(r("Cannot activate %1$s. %2$s","plugin"),e.pluginName,e.errorMessage);g.updates.isValidResponse(e,"check-dependencies")&&(t=v(h("Activation failed: %s"),e.errorMessage),g.a11y.speak(t,"assertive"),f.trigger("wp-check-plugin-dependencies-error",e),a.removeClass("install-now installed updated-message").addClass("activate-now button-primary").attr("aria-label",n).text(s),"plugin-information-footer"===a.parent().attr("id"))&&g.updates.setCardButtonStatus({status:"dependencies-check-failed",slug:e.slug,removeClasses:"install-now installed updated-message",addClasses:"activate-now button-primary",text:s,ariaLabel:n})},g.updates.activatePlugin=function(e){var t=c(".plugin-card-"+e.slug+", #plugin-information-footer").find(".activate-now, .activating-message");return e=_.extend({success:g.updates.activatePluginSuccess,error:g.updates.activatePluginError},e),g.a11y.speak(h("Activating... please wait.")),f.trigger("wp-activating-plugin",e),"plugin-information-footer"===t.parent().attr("id")&&g.updates.setCardButtonStatus({status:"activating-plugin",slug:e.slug,removeClasses:"installed updated-message button-primary",addClasses:"activating-message",text:h("Activating..."),ariaLabel:v(r("Activating %s","plugin"),e.name)}),g.updates.ajax("activate-plugin",e)},g.updates.activatePluginSuccess=function(e){var t=c(".plugin-card-"+e.slug+", #plugin-information-footer").find(".activating-message"),a=r("Activated!","plugin"),s=v("%s activated successfully.",e.pluginName);g.a11y.speak(h("Activation completed successfully.")),f.trigger("wp-plugin-activate-success",e),t.removeClass("activating-message").addClass("activated-message button-disabled").attr("aria-label",s).text(a),"plugin-information-footer"===t.parent().attr("id")&&g.updates.setCardButtonStatus({status:"activated-plugin",slug:e.slug,removeClasses:"activating-message",addClasses:"activated-message button-disabled",text:a,ariaLabel:s}),setTimeout(function(){t.removeClass("activated-message").text(r("Active","plugin")),"plugin-information-footer"===t.parent().attr("id")&&g.updates.setCardButtonStatus({status:"plugin-active",slug:e.slug,removeClasses:"activated-message",text:r("Active","plugin"),ariaLabel:v("%s is active.",e.pluginName)})},1e3)},g.updates.activatePluginError=function(e){var t,a=c(".plugin-card-"+e.slug+", #plugin-information-footer").find(".activating-message"),s=h("Activation failed."),n=v(r("%s activation failed","plugin"),e.pluginName);g.updates.isValidResponse(e,"activate")&&(t=v(h("Activation failed: %s"),e.errorMessage),g.a11y.speak(t,"assertive"),f.trigger("wp-plugin-activate-error",e),a.removeClass("install-now installed activating-message").addClass("button-disabled").attr("aria-label",n).text(s),"plugin-information-footer"===a.parent().attr("id"))&&g.updates.setCardButtonStatus({status:"plugin-activation-failed",slug:e.slug,removeClasses:"install-now installed activating-message",addClasses:"button-disabled",text:s,ariaLabel:n})},g.updates.installImporterSuccess=function(e){g.updates.addAdminNotice({id:"install-success",className:"notice-success is-dismissible",message:v(h('Importer installed successfully. Run importer'),e.activateUrl+"&from=import")}),c('[data-slug="'+e.slug+'"]').removeClass("install-now updating-message").addClass("activate-now").attr({href:e.activateUrl+"&from=import","aria-label":v(h("Run %s"),e.pluginName)}).text(h("Run Importer")),g.a11y.speak(h("Installation completed successfully.")),f.trigger("wp-importer-install-success",e)},g.updates.installImporterError=function(e){var t=v(h("Installation failed: %s"),e.errorMessage),a=c('[data-slug="'+e.slug+'"]'),s=a.data("name");g.updates.isValidResponse(e,"install")&&!g.updates.maybeHandleCredentialError(e,"install-plugin")&&(g.updates.addAdminNotice({id:e.errorCode,className:"notice-error is-dismissible",message:t}),a.removeClass("updating-message").attr("aria-label",v(r("Install %s now","plugin"),s)).text(r("Install Now","plugin")),g.a11y.speak(t,"assertive"),f.trigger("wp-importer-install-error",e))},g.updates.deletePlugin=function(e){var t=c('[data-plugin="'+e.plugin+'"]').find(".row-actions a.delete");return e=_.extend({success:g.updates.deletePluginSuccess,error:g.updates.deletePluginError},e),t.html()!==h("Deleting...")&&t.data("originaltext",t.html()).text(h("Deleting...")),g.a11y.speak(h("Deleting...")),f.trigger("wp-plugin-deleting",e),g.updates.ajax("delete-plugin",e)},g.updates.deletePluginSuccess=function(u){c('[data-plugin="'+u.plugin+'"]').css({backgroundColor:"#faafaa"}).fadeOut(350,function(){var e=c("#bulk-action-form"),t=c(".subsubsub"),a=c(this),s=t.find('[aria-current="page"]'),n=c(".displaying-num"),i=e.find("thead th:not(.hidden), thead td").length,l=g.template("item-deleted-row"),d=m.plugins;a.hasClass("plugin-update-tr")||a.after(l({slug:u.slug,plugin:u.plugin,colspan:i,name:u.pluginName})),a.remove(),-1!==_.indexOf(d.upgrade,u.plugin)&&(d.upgrade=_.without(d.upgrade,u.plugin),g.updates.decrementCount("plugin")),-1!==_.indexOf(d.inactive,u.plugin)&&(d.inactive=_.without(d.inactive,u.plugin),d.inactive.length?t.find(".inactive .count").text("("+d.inactive.length+")"):t.find(".inactive").remove()),-1!==_.indexOf(d.active,u.plugin)&&(d.active=_.without(d.active,u.plugin),d.active.length?t.find(".active .count").text("("+d.active.length+")"):t.find(".active").remove()),-1!==_.indexOf(d.recently_activated,u.plugin)&&(d.recently_activated=_.without(d.recently_activated,u.plugin),d.recently_activated.length?t.find(".recently_activated .count").text("("+d.recently_activated.length+")"):t.find(".recently_activated").remove()),-1!==_.indexOf(d["auto-update-enabled"],u.plugin)&&(d["auto-update-enabled"]=_.without(d["auto-update-enabled"],u.plugin),d["auto-update-enabled"].length?t.find(".auto-update-enabled .count").text("("+d["auto-update-enabled"].length+")"):t.find(".auto-update-enabled").remove()),-1!==_.indexOf(d["auto-update-disabled"],u.plugin)&&(d["auto-update-disabled"]=_.without(d["auto-update-disabled"],u.plugin),d["auto-update-disabled"].length?t.find(".auto-update-disabled .count").text("("+d["auto-update-disabled"].length+")"):t.find(".auto-update-disabled").remove()),d.all=_.without(d.all,u.plugin),d.all.length?t.find(".all .count").text("("+d.all.length+")"):(e.find(".tablenav").css({visibility:"hidden"}),t.find(".all").remove(),e.find("tr.no-items").length||e.find("#the-list").append(''+h("No plugins are currently available.")+"")),n.length&&s.length&&(l=d[s.parent("li").attr("class")].length,n.text(v(o("%s item","%s items",l,"plugin/plugins"),l)))}),g.a11y.speak(r("Deleted!","plugin")),f.trigger("wp-plugin-delete-success",u)},g.updates.deletePluginError=function(e){var t,a=g.template("item-update-row"),s=g.updates.adminNotice({className:"update-message notice-error notice-alt",message:e.errorMessage}),n=e.plugin?(t=c('tr.inactive[data-plugin="'+e.plugin+'"]')).siblings('[data-plugin="'+e.plugin+'"]'):(t=c('tr.inactive[data-slug="'+e.slug+'"]')).siblings('[data-slug="'+e.slug+'"]');g.updates.isValidResponse(e,"delete")&&!g.updates.maybeHandleCredentialError(e,"delete-plugin")&&(n.length?(n.find(".notice-error").remove(),n.find(".plugin-update").append(s)):t.addClass("update").after(a({slug:e.slug,plugin:e.plugin||e.slug,colspan:c("#bulk-action-form").find("thead th:not(.hidden), thead td").length,content:s})),f.trigger("wp-plugin-delete-error",e))},g.updates.updateTheme=function(e){var t;return e=_.extend({success:g.updates.updateThemeSuccess,error:g.updates.updateThemeError},e),(t=("themes-network"===pagenow?c('[data-slug="'+e.slug+'"]').find(".update-message").removeClass("notice-error").addClass("updating-message notice-warning"):(t="customize"===pagenow?((t=c('[data-slug="'+e.slug+'"].notice').removeClass("notice-large")).find("h3").remove(),t.add(c("#customize-control-installed_theme_"+e.slug).find(".update-message"))):((t=c("#update-theme").closest(".notice").removeClass("notice-large")).find("h3").remove(),t.add(c('[data-slug="'+e.slug+'"]').find(".update-message")))).addClass("updating-message")).find("p")).html()!==h("Updating...")&&t.data("originaltext",t.html()),g.a11y.speak(h("Updating... please wait.")),t.text(h("Updating...")),f.trigger("wp-theme-updating",e),g.updates.ajax("update-theme",e)},g.updates.updateThemeSuccess=function(e){var t,a,s=c("body.modal-open").length,n=c('[data-slug="'+e.slug+'"]'),i={className:"updated-message notice-success notice-alt",message:r("Updated!","theme")};"customize"===pagenow?((n=c(".updating-message").siblings(".theme-name")).length&&(a=n.html().replace(e.oldVersion,e.newVersion),n.html(a)),t=c(".theme-info .notice").add(g.customize.control("installed_theme_"+e.slug).container.find(".theme").find(".update-message"))):"themes-network"===pagenow?(t=n.find(".update-message"),a=n.find(".theme-version-author-uri").html().replace(e.oldVersion,e.newVersion),n.find(".theme-version-author-uri").html(a),n.find(".auto-update-time").empty()):(t=c(".theme-info .notice").add(n.find(".update-message")),s?(c(".load-customize:visible").trigger("focus"),c(".theme-info .theme-autoupdate").find(".auto-update-time").empty()):n.find(".load-customize").trigger("focus")),g.updates.addAdminNotice(_.extend({selector:t},i)),g.a11y.speak(h("Update completed successfully.")),g.updates.decrementCount("theme"),f.trigger("wp-theme-update-success",e),s&&"customize"!==pagenow&&c(".theme-info .theme-author").after(g.updates.adminNotice(i))},g.updates.updateThemeError=function(e){var t,a=c('[data-slug="'+e.slug+'"]'),s=v(h("Update failed: %s"),e.errorMessage);g.updates.isValidResponse(e,"update")&&!g.updates.maybeHandleCredentialError(e,"update-theme")&&("customize"===pagenow&&(a=g.customize.control("installed_theme_"+e.slug).container.find(".theme")),"themes-network"===pagenow?t=a.find(".update-message "):(t=c(".theme-info .notice").add(a.find(".notice")),(c("body.modal-open").length?c(".load-customize:visible"):a.find(".load-customize")).trigger("focus")),g.updates.addAdminNotice({selector:t,className:"update-message notice-error notice-alt is-dismissible",message:s}),g.a11y.speak(s),f.trigger("wp-theme-update-error",e))},g.updates.installTheme=function(e){var t=c('.theme-install[data-slug="'+e.slug+'"]');return e=_.extend({success:g.updates.installThemeSuccess,error:g.updates.installThemeError},e),t.addClass("updating-message"),t.parents(".theme").addClass("focus"),t.html()!==h("Installing...")&&t.data("originaltext",t.html()),t.attr("aria-label",v(r("Installing %s...","theme"),t.data("name"))).text(h("Installing...")),g.a11y.speak(h("Installing... please wait.")),c('.install-theme-info, [data-slug="'+e.slug+'"]').removeClass("theme-install-failed").find(".notice.notice-error").remove(),f.trigger("wp-theme-installing",e),g.updates.ajax("install-theme",e)},g.updates.installThemeSuccess=function(e){var t,a=c(".wp-full-overlay-header, [data-slug="+e.slug+"]");f.trigger("wp-theme-install-success",e),t=a.find(".button-primary").removeClass("updating-message").addClass("updated-message disabled").attr("aria-label",v(r("%s installed!","theme"),e.themeName)).text(r("Installed!","theme")),g.a11y.speak(h("Installation completed successfully.")),setTimeout(function(){e.activateUrl&&(t.attr("href",e.activateUrl).removeClass("theme-install updated-message disabled").addClass("activate"),"themes-network"===pagenow?t.attr("aria-label",v(r("Network Activate %s","theme"),e.themeName)).text(h("Network Enable")):t.attr("aria-label",v(r("Activate %s","theme"),e.themeName)).text(r("Activate","theme"))),e.customizeUrl&&t.siblings(".preview").replaceWith(function(){return c("").attr("href",e.customizeUrl).addClass("button load-customize").text(h("Live Preview"))})},1e3)},g.updates.installThemeError=function(e){var t,a=v(h("Installation failed: %s"),e.errorMessage),s=g.updates.adminNotice({className:"update-message notice-error notice-alt",message:a});g.updates.isValidResponse(e,"install")&&!g.updates.maybeHandleCredentialError(e,"install-theme")&&("customize"===pagenow?(f.find("body").hasClass("modal-open")?(t=c('.theme-install[data-slug="'+e.slug+'"]'),c(".theme-overlay .theme-info").prepend(s)):(t=c('.theme-install[data-slug="'+e.slug+'"]')).closest(".theme").addClass("theme-install-failed").append(s),g.customize.notifications.remove("theme_installing")):f.find("body").hasClass("full-overlay-active")?(t=c('.theme-install[data-slug="'+e.slug+'"]'),c(".install-theme-info").prepend(s)):t=c('[data-slug="'+e.slug+'"]').removeClass("focus").addClass("theme-install-failed").append(s).find(".theme-install"),t.removeClass("updating-message").attr("aria-label",v(r("%s installation failed","theme"),t.data("name"))).text(h("Installation failed.")),g.a11y.speak(a,"assertive"),f.trigger("wp-theme-install-error",e))},g.updates.deleteTheme=function(e){var t;return"themes"===pagenow?t=c(".theme-actions .delete-theme"):"themes-network"===pagenow&&(t=c('[data-slug="'+e.slug+'"]').find(".row-actions a.delete")),e=_.extend({success:g.updates.deleteThemeSuccess,error:g.updates.deleteThemeError},e),t&&t.html()!==h("Deleting...")&&t.data("originaltext",t.html()).text(h("Deleting...")),g.a11y.speak(h("Deleting...")),c(".theme-info .update-message").remove(),f.trigger("wp-theme-deleting",e),g.updates.ajax("delete-theme",e)},g.updates.deleteThemeSuccess=function(n){var e=c('[data-slug="'+n.slug+'"]');"themes-network"===pagenow&&e.css({backgroundColor:"#faafaa"}).fadeOut(350,function(){var e=c(".subsubsub"),t=c(this),a=m.themes,s=g.template("item-deleted-row");t.hasClass("plugin-update-tr")||t.after(s({slug:n.slug,colspan:c("#bulk-action-form").find("thead th:not(.hidden), thead td").length,name:t.find(".theme-title strong").text()})),t.remove(),-1!==_.indexOf(a.upgrade,n.slug)&&(a.upgrade=_.without(a.upgrade,n.slug),g.updates.decrementCount("theme")),-1!==_.indexOf(a.disabled,n.slug)&&(a.disabled=_.without(a.disabled,n.slug),a.disabled.length?e.find(".disabled .count").text("("+a.disabled.length+")"):e.find(".disabled").remove()),-1!==_.indexOf(a["auto-update-enabled"],n.slug)&&(a["auto-update-enabled"]=_.without(a["auto-update-enabled"],n.slug),a["auto-update-enabled"].length?e.find(".auto-update-enabled .count").text("("+a["auto-update-enabled"].length+")"):e.find(".auto-update-enabled").remove()),-1!==_.indexOf(a["auto-update-disabled"],n.slug)&&(a["auto-update-disabled"]=_.without(a["auto-update-disabled"],n.slug),a["auto-update-disabled"].length?e.find(".auto-update-disabled .count").text("("+a["auto-update-disabled"].length+")"):e.find(".auto-update-disabled").remove()),a.all=_.without(a.all,n.slug),e.find(".all .count").text("("+a.all.length+")")}),"themes"===pagenow&&_.find(_wpThemeSettings.themes,{id:n.slug}).hasUpdate&&g.updates.decrementCount("theme"),g.a11y.speak(r("Deleted!","theme")),f.trigger("wp-theme-delete-success",n)},g.updates.deleteThemeError=function(e){var t=c('tr.inactive[data-slug="'+e.slug+'"]'),a=c(".theme-actions .delete-theme"),s=g.template("item-update-row"),n=t.siblings("#"+e.slug+"-update"),i=v(h("Deletion failed: %s"),e.errorMessage),l=g.updates.adminNotice({className:"update-message notice-error notice-alt",message:i});g.updates.maybeHandleCredentialError(e,"delete-theme")||("themes-network"===pagenow?n.length?(n.find(".notice-error").remove(),n.find(".plugin-update").append(l)):t.addClass("update").after(s({slug:e.slug,colspan:c("#bulk-action-form").find("thead th:not(.hidden), thead td").length,content:l})):c(".theme-info .theme-description").before(l),a.html(a.data("originaltext")),g.a11y.speak(i,"assertive"),f.trigger("wp-theme-delete-error",e))},g.updates._addCallbacks=function(e,t){return"import"===pagenow&&"install-plugin"===t&&(e.success=g.updates.installImporterSuccess,e.error=g.updates.installImporterError),e},g.updates.queueChecker=function(){var e;if(!g.updates.ajaxLocked&&g.updates.queue.length)switch((e=g.updates.queue.shift()).action){case"install-plugin":g.updates.installPlugin(e.data);break;case"update-plugin":g.updates.updatePlugin(e.data);break;case"delete-plugin":g.updates.deletePlugin(e.data);break;case"install-theme":g.updates.installTheme(e.data);break;case"update-theme":g.updates.updateTheme(e.data);break;case"delete-theme":g.updates.deleteTheme(e.data)}},g.updates.requestFilesystemCredentials=function(e){!1===g.updates.filesystemCredentials.available&&(e&&!g.updates.$elToReturnFocusToFromCredentialsModal&&(g.updates.$elToReturnFocusToFromCredentialsModal=c(e.target)),g.updates.ajaxLocked=!0,g.updates.requestForCredentialsModalOpen())},g.updates.maybeRequestFilesystemCredentials=function(e){g.updates.shouldRequestFilesystemCredentials&&!g.updates.ajaxLocked&&g.updates.requestFilesystemCredentials(e)},g.updates.keydown=function(e){27===e.keyCode?g.updates.requestForCredentialsModalCancel():9===e.keyCode&&("upgrade"!==e.target.id||e.shiftKey?"hostname"===e.target.id&&e.shiftKey&&(c("#upgrade").trigger("focus"),e.preventDefault()):(c("#hostname").trigger("focus"),e.preventDefault()))},g.updates.requestForCredentialsModalOpen=function(){var e=c("#request-filesystem-credentials-dialog");c("body").addClass("modal-open"),e.show(),e.find("input:enabled:first").trigger("focus"),e.on("keydown",g.updates.keydown)},g.updates.requestForCredentialsModalClose=function(){c("#request-filesystem-credentials-dialog").hide(),c("body").removeClass("modal-open"),g.updates.$elToReturnFocusToFromCredentialsModal&&g.updates.$elToReturnFocusToFromCredentialsModal.trigger("focus")},g.updates.requestForCredentialsModalCancel=function(){(g.updates.ajaxLocked||g.updates.queue.length)&&(_.each(g.updates.queue,function(e){f.trigger("credential-modal-cancel",e)}),g.updates.ajaxLocked=!1,g.updates.queue=[],g.updates.requestForCredentialsModalClose())},g.updates.showErrorInCredentialsForm=function(e){var t=c("#request-filesystem-credentials-form");t.find(".notice").remove(),t.find("#request-filesystem-credentials-title").after('")},g.updates.credentialError=function(e,t){e=g.updates._addCallbacks(e,t),g.updates.queue.unshift({action:t,data:e}),g.updates.filesystemCredentials.available=!1,g.updates.showErrorInCredentialsForm(e.errorMessage),g.updates.requestFilesystemCredentials()},g.updates.maybeHandleCredentialError=function(e,t){return!(!g.updates.shouldRequestFilesystemCredentials||!e.errorCode||"unable_to_connect_to_filesystem"!==e.errorCode||(g.updates.credentialError(e,t),0))},g.updates.isValidResponse=function(e,t){var a,s=h("An error occurred during the update process. Please try again.");if(_.isObject(e)&&!_.isFunction(e.always))return!0;switch(_.isString(e)&&"-1"===e?s=h("An error has occurred. Please reload the page and try again."):_.isString(e)?s=e:void 0!==e.readyState&&0===e.readyState?s=h("Connection lost or the server is busy. Please try again later."):_.isString(e.responseText)&&""!==e.responseText?s=e.responseText:_.isString(e.statusText)&&(s=e.statusText),t){case"update":a=h("Update failed: %s");break;case"install":a=h("Installation failed: %s");break;case"check-dependencies":a=h("Dependencies check failed: %s");break;case"activate":a=h("Activation failed: %s");break;case"delete":a=h("Deletion failed: %s")}return s=s.replace(/<[\/a-z][^<>]*>/gi,""),a=a.replace("%s",s),g.updates.addAdminNotice({id:"unknown_error",className:"notice-error is-dismissible",message:_.escape(a)}),g.updates.ajaxLocked=!1,g.updates.queue=[],c(".button.updating-message").removeClass("updating-message").removeAttr("aria-label").prop("disabled",!0).text(h("Update failed.")),c(".updating-message:not(.button):not(.thickbox)").removeClass("updating-message notice-warning").addClass("notice-error").find("p").removeAttr("aria-label").text(a),g.a11y.speak(a,"assertive"),!1},g.updates.beforeunload=function(){if(g.updates.ajaxLocked)return h("Updates may not complete if you navigate away from this page.")},c(function(){var l=c("#plugin-filter, #plugin-information-footer"),o=c("#bulk-action-form"),e=c("#request-filesystem-credentials-form"),t=c("#request-filesystem-credentials-dialog"),a=c(".plugins-php .wp-filter-search"),d=c(".plugin-install-php .wp-filter-search"),s=((m=_.extend(m,window._wpUpdatesItemCounts||{})).totals&&g.updates.refreshCount(),g.updates.shouldRequestFilesystemCredentials=0").html(a.find("p").data("originaltext"))),a.removeClass("updating-message").html(s),"plugin-install"!==pagenow&&"plugin-install-network"!==pagenow||("update-plugin"===t.action?a.attr("aria-label",v(r("Update %s now","plugin"),a.data("name"))):"install-plugin"===t.action&&a.attr("aria-label",v(r("Install %s now","plugin"),a.data("name"))))),g.a11y.speak(h("Update canceled."))}),o.on("click","[data-plugin] .update-link",function(e){var t=c(e.target),a=t.parents("tr");e.preventDefault(),t.hasClass("updating-message")||t.hasClass("button-disabled")||(g.updates.maybeRequestFilesystemCredentials(e),g.updates.$elToReturnFocusToFromCredentialsModal=a.find(".check-column input"),g.updates.updatePlugin({plugin:a.data("plugin"),slug:a.data("slug")}))}),l.on("click",".update-now",function(e){var t=c(e.target);e.preventDefault(),t.hasClass("updating-message")||t.hasClass("button-disabled")||(g.updates.maybeRequestFilesystemCredentials(e),g.updates.updatePlugin({plugin:t.data("plugin"),slug:t.data("slug")}))}),l.on("click",".install-now",function(e){var t=c(e.target);e.preventDefault(),t.hasClass("updating-message")||t.hasClass("button-disabled")||(g.updates.shouldRequestFilesystemCredentials&&!g.updates.ajaxLocked&&(g.updates.requestFilesystemCredentials(e),f.on("credential-modal-cancel",function(){c(".install-now.updating-message").removeClass("updating-message").text(r("Install Now","plugin")),g.a11y.speak(h("Update canceled."))})),g.updates.installPlugin({slug:t.data("slug")}))}),f.on("click","#plugin-information-footer .activate-now",function(e){e.preventDefault(),window.parent.location.href=c(e.target).attr("href")}),f.on("click",".importer-item .install-now",function(e){var t=c(e.target),a=c(this).data("name");e.preventDefault(),t.hasClass("updating-message")||(g.updates.shouldRequestFilesystemCredentials&&!g.updates.ajaxLocked&&(g.updates.requestFilesystemCredentials(e),f.on("credential-modal-cancel",function(){t.removeClass("updating-message").attr("aria-label",v(r("Install %s now","plugin"),a)).text(r("Install Now","plugin")),g.a11y.speak(h("Update canceled."))})),g.updates.installPlugin({slug:t.data("slug"),pagenow:pagenow,success:g.updates.installImporterSuccess,error:g.updates.installImporterError}))}),o.on("click","[data-plugin] a.delete",function(e){var t=c(e.target).parents("tr"),a=t.hasClass("is-uninstallable")?v(h("Are you sure you want to delete %s and its data?"),t.find(".plugin-title strong").text()):v(h("Are you sure you want to delete %s?"),t.find(".plugin-title strong").text());e.preventDefault(),window.confirm(a)&&(g.updates.maybeRequestFilesystemCredentials(e),g.updates.deletePlugin({plugin:t.data("plugin"),slug:t.data("slug")}))}),f.on("click",".themes-php.network-admin .update-link",function(e){var t=c(e.target),a=t.parents("tr");e.preventDefault(),t.hasClass("updating-message")||t.hasClass("button-disabled")||(g.updates.maybeRequestFilesystemCredentials(e),g.updates.$elToReturnFocusToFromCredentialsModal=a.find(".check-column input"),g.updates.updateTheme({slug:a.data("slug")}))}),f.on("click",".themes-php.network-admin a.delete",function(e){var t=c(e.target).parents("tr"),a=v(h("Are you sure you want to delete %s?"),t.find(".theme-title strong").text());e.preventDefault(),window.confirm(a)&&(g.updates.maybeRequestFilesystemCredentials(e),g.updates.deleteTheme({slug:t.data("slug")}))}),o.on("click",'[type="submit"]:not([name="clear-recent-list"])',function(e){var t,s,n=c(e.target).siblings("select").val(),a=o.find('input[name="checked[]"]:checked'),i=0,l=0,d=[];switch(pagenow){case"plugins":case"plugins-network":t="plugin";break;case"themes-network":t="theme";break;default:return}switch(n=a.length?n:!1){case"update-selected":s=n.replace("selected",t);break;case"delete-selected":var u=h("plugin"===t?"Are you sure you want to delete the selected plugins and their data?":"Caution: These themes may be active on other sites in the network. Are you sure you want to proceed?");if(!window.confirm(u))return void e.preventDefault();s=n.replace("selected",t);break;default:return}g.updates.maybeRequestFilesystemCredentials(e),e.preventDefault(),o.find('.manage-column [type="checkbox"]').prop("checked",!1),f.trigger("wp-"+t+"-bulk-"+n,a),a.each(function(e,t){var t=c(t),a=t.parents("tr");"update-selected"!==n||a.hasClass("update")&&!a.find("notice-error").length?"update-selected"===n&&a.hasClass("is-enqueued")||(a.addClass("is-enqueued"),g.updates.queue.push({action:s,data:{plugin:a.data("plugin"),slug:a.data("slug")}})):t.prop("checked",!1)}),f.on("wp-plugin-update-success wp-plugin-update-error wp-theme-update-success wp-theme-update-error",function(e,t){var a,s=c('[data-slug="'+t.slug+'"]'),e=("wp-"+t.update+"-update-success"===e.type?i++:(e=t.pluginName||s.find(".column-primary strong").text(),l++,d.push(e+": "+t.errorMessage)),s.find('input[name="checked[]"]:checked').prop("checked",!1),g.updates.adminNotice=g.template("wp-bulk-updates-admin-notice"),null),s=(i&&(e="plugin"===t.update?v(p("%s plugin successfully updated.","%s plugins successfully updated.",i),i):v(p("%s theme successfully updated.","%s themes successfully updated.",i),i)),null);l&&(s=v(p("%s update failed.","%s updates failed.",l),l)),g.updates.addAdminNotice({id:"bulk-action-notice",className:"bulk-action-notice",successMessage:e,errorMessage:s,errorMessages:d,type:t.update}),a=c("#bulk-action-notice").on("click","button",function(){c(this).toggleClass("bulk-action-errors-collapsed").attr("aria-expanded",!c(this).hasClass("bulk-action-errors-collapsed")),a.find(".bulk-action-errors").toggleClass("hidden")}),0=g.updates.searchMinCharacters||s>g.updates.searchMinCharacters;return s=e,t},d.on("keyup input",_.debounce(function(e,t){var a=c(".plugin-install-search"),s=d.val().length,n={_ajax_nonce:g.updates.ajaxNonce,s:encodeURIComponent(e.target.value),tab:"search",type:c("#typeselector").val(),pagenow:pagenow},i=location.href.split("?")[0]+"?"+c.param(_.omit(n,["_ajax_nonce","pagenow"]));g.updates.shouldSearch(s)?(d.attr("autocomplete","off"),"keyup"===e.type&&27===e.which&&(e.target.value=""),g.updates.searchTerm===n.s&&"typechange"!==t||(l.empty(),g.updates.searchTerm=n.s,window.history&&window.history.replaceState&&window.history.replaceState(null,"",i),a.length||(a=c('
  • "+t+"
  • "}),s="
      "+s+"
    "),e.addClass("has-request-results"),e.hasClass("status-request-confirmed")&&(n+=" status-request-confirmed"),e.hasClass("status-request-failed")&&(n+=" status-request-failed"),e.after(function(){return'"})}v(".export-personal-data-handle").on("click",function(e){var t=v(this),n=t.parents(".export-personal-data"),r=t.parents("tr"),a=r.find(".export-progress"),i=t.parents(".row-actions"),c=n.data("request-id"),d=n.data("nonce"),l=n.data("exporters-count"),u=!!n.data("send-as-email");function p(e){var t=h("An error occurred while attempting to export personal data.");w(n,"export-personal-data-failed"),e&&T(r,"notice-error",t,[e]),setTimeout(function(){i.removeClass("processing")},500)}function m(e){e=Math.round(100*(0 autoresizeMinHeight ) { textEditor.style.height = textEditor.scrollHeight + 'px'; } if ( typeof x !== 'undefined' ) { window.scrollTo( x, y ); } if ( textEditor.scrollHeight < height ) { adjust(); } }, 300 ); /** * Resizes the text editor depending on the old text length. * * If there is an mceEditor and it is hidden, it resizes the editor depending * on the old text length. If the current length of the text is smaller than * the old text length, it shrinks the text area. Otherwise it resizes the editor to * the scroll height. * * @since 4.6.1 * * @return {void} */ function textEditorResize() { var length = textEditor.value.length; if ( mceEditor && ! mceEditor.isHidden() ) { return; } if ( ! mceEditor && initialMode === 'tinymce' ) { return; } if ( length < oldTextLength ) { shrinkTextarea(); } else if ( parseInt( textEditor.style.height, 10 ) < textEditor.scrollHeight ) { textEditor.style.height = Math.ceil( textEditor.scrollHeight ) + 'px'; adjust(); } oldTextLength = length; } /** * Gets the height and widths of elements. * * Gets the heights of the window, the adminbar, the tools, the menu, * the visualTop, the textTop, the bottom, the statusbar and sideSortables * and stores these in the heights object. Defaults to 0. * Gets the width of the window and stores this in the heights object. * * @since 4.0.0 * * @return {void} */ function getHeights() { var windowWidth = $window.width(); heights = { windowHeight: $window.height(), windowWidth: windowWidth, adminBarHeight: ( windowWidth > 600 ? $adminBar.outerHeight() : 0 ), toolsHeight: $tools.outerHeight() || 0, menuBarHeight: $menuBar.outerHeight() || 0, visualTopHeight: $visualTop.outerHeight() || 0, textTopHeight: $textTop.outerHeight() || 0, bottomHeight: $bottom.outerHeight() || 0, statusBarHeight: $statusBar.outerHeight() || 0, sideSortablesHeight: $sideSortables.height() || 0 }; // Adjust for hidden menubar. if ( heights.menuBarHeight < 3 ) { heights.menuBarHeight = 0; } } // We need to wait for TinyMCE to initialize. /** * Binds all necessary functions for editor expand to the editor when the editor * is initialized. * * @since 4.0.0 * * @param {event} event The TinyMCE editor init event. * @param {object} editor The editor to bind the vents on. * * @return {void} */ $document.on( 'tinymce-editor-init.editor-expand', function( event, editor ) { // VK contains the type of key pressed. VK = virtual keyboard. var VK = window.tinymce.util.VK, /** * Hides any float panel with a hover state. Additionally hides tooltips. * * @return {void} */ hideFloatPanels = _.debounce( function() { ! $( '.mce-floatpanel:hover' ).length && window.tinymce.ui.FloatPanel.hideAll(); $( '.mce-tooltip' ).hide(); }, 1000, true ); // Make sure it's the main editor. if ( editor.id !== 'content' ) { return; } // Copy the editor instance. mceEditor = editor; // Set the minimum height to the initial viewport height. editor.settings.autoresize_min_height = autoresizeMinHeight; // Get the necessary UI elements. $visualTop = $contentWrap.find( '.mce-toolbar-grp' ); $visualEditor = $contentWrap.find( '.mce-edit-area' ); $statusBar = $contentWrap.find( '.mce-statusbar' ); $menuBar = $contentWrap.find( '.mce-menubar' ); /** * Gets the offset of the editor. * * @return {number|boolean} Returns the offset of the editor * or false if there is no offset height. */ function mceGetCursorOffset() { var node = editor.selection.getNode(), range, view, offset; /* * If editor.wp.getView and the selection node from the editor selection * are defined, use this as a view for the offset. */ if ( editor.wp && editor.wp.getView && ( view = editor.wp.getView( node ) ) ) { offset = view.getBoundingClientRect(); } else { range = editor.selection.getRng(); // Try to get the offset from a range. try { offset = range.getClientRects()[0]; } catch( er ) {} // Get the offset from the bounding client rectangle of the node. if ( ! offset ) { offset = node.getBoundingClientRect(); } } return offset.height ? offset : false; } /** * Filters the special keys that should not be used for scrolling. * * @since 4.0.0 * * @param {event} event The event to get the key code from. * * @return {void} */ function mceKeyup( event ) { var key = event.keyCode; // Bail on special keys. Key code 47 is a '/'. if ( key <= 47 && ! ( key === VK.SPACEBAR || key === VK.ENTER || key === VK.DELETE || key === VK.BACKSPACE || key === VK.UP || key === VK.LEFT || key === VK.DOWN || key === VK.UP ) ) { return; // OS keys, function keys, num lock, scroll lock. Key code 91-93 are OS keys. // Key code 112-123 are F1 to F12. Key code 144 is num lock. Key code 145 is scroll lock. } else if ( ( key >= 91 && key <= 93 ) || ( key >= 112 && key <= 123 ) || key === 144 || key === 145 ) { return; } mceScroll( key ); } /** * Makes sure the cursor is always visible in the editor. * * Makes sure the cursor is kept between the toolbars of the editor and scrolls * the window when the cursor moves out of the viewport to a wpview. * Setting a buffer > 0 will prevent the browser default. * Some browsers will scroll to the middle, * others to the top/bottom of the *window* when moving the cursor out of the viewport. * * @since 4.1.0 * * @param {string} key The key code of the pressed key. * * @return {void} */ function mceScroll( key ) { var offset = mceGetCursorOffset(), buffer = 50, cursorTop, cursorBottom, editorTop, editorBottom; // Don't scroll if there is no offset. if ( ! offset ) { return; } // Determine the cursorTop based on the offset and the top of the editor iframe. cursorTop = offset.top + editor.iframeElement.getBoundingClientRect().top; // Determine the cursorBottom based on the cursorTop and offset height. cursorBottom = cursorTop + offset.height; // Subtract the buffer from the cursorTop. cursorTop = cursorTop - buffer; // Add the buffer to the cursorBottom. cursorBottom = cursorBottom + buffer; editorTop = heights.adminBarHeight + heights.toolsHeight + heights.menuBarHeight + heights.visualTopHeight; /* * Set the editorBottom based on the window Height, and add the bottomHeight and statusBarHeight if the * advanced editor is enabled. */ editorBottom = heights.windowHeight - ( advanced ? heights.bottomHeight + heights.statusBarHeight : 0 ); // Don't scroll if the node is taller than the visible part of the editor. if ( editorBottom - editorTop < offset.height ) { return; } /* * If the cursorTop is smaller than the editorTop and the up, left * or backspace key is pressed, scroll the editor to the position defined * by the cursorTop, pageYOffset and editorTop. */ if ( cursorTop < editorTop && ( key === VK.UP || key === VK.LEFT || key === VK.BACKSPACE ) ) { window.scrollTo( window.pageXOffset, cursorTop + window.pageYOffset - editorTop ); /* * If any other key is pressed or the cursorTop is bigger than the editorTop, * scroll the editor to the position defined by the cursorBottom, * pageYOffset and editorBottom. */ } else if ( cursorBottom > editorBottom ) { window.scrollTo( window.pageXOffset, cursorBottom + window.pageYOffset - editorBottom ); } } /** * If the editor is fullscreen, calls adjust. * * @since 4.1.0 * * @param {event} event The FullscreenStateChanged event. * * @return {void} */ function mceFullscreenToggled( event ) { // event.state is true if the editor is fullscreen. if ( ! event.state ) { adjust(); } } /** * Shows the editor when scrolled. * * Binds the hideFloatPanels function on the window scroll.mce-float-panels event. * Executes the wpAutoResize on the active editor. * * @since 4.0.0 * * @return {void} */ function mceShow() { $window.on( 'scroll.mce-float-panels', hideFloatPanels ); setTimeout( function() { editor.execCommand( 'wpAutoResize' ); adjust(); }, 300 ); } /** * Resizes the editor. * * Removes all functions from the window scroll.mce-float-panels event. * Resizes the text editor and scrolls to a position based on the pageXOffset and adminBarHeight. * * @since 4.0.0 * * @return {void} */ function mceHide() { $window.off( 'scroll.mce-float-panels' ); setTimeout( function() { var top = $contentWrap.offset().top; if ( window.pageYOffset > top ) { window.scrollTo( window.pageXOffset, top - heights.adminBarHeight ); } textEditorResize(); adjust(); }, 100 ); adjust(); } /** * Toggles advanced states. * * @since 4.1.0 * * @return {void} */ function toggleAdvanced() { advanced = ! advanced; } /** * Binds events of the editor and window. * * @since 4.0.0 * * @return {void} */ mceBind = function() { editor.on( 'keyup', mceKeyup ); editor.on( 'show', mceShow ); editor.on( 'hide', mceHide ); editor.on( 'wp-toolbar-toggle', toggleAdvanced ); // Adjust when the editor resizes. editor.on( 'setcontent wp-autoresize wp-toolbar-toggle', adjust ); // Don't hide the caret after undo/redo. editor.on( 'undo redo', mceScroll ); // Adjust when exiting TinyMCE's fullscreen mode. editor.on( 'FullscreenStateChanged', mceFullscreenToggled ); $window.off( 'scroll.mce-float-panels' ).on( 'scroll.mce-float-panels', hideFloatPanels ); }; /** * Unbinds the events of the editor and window. * * @since 4.0.0 * * @return {void} */ mceUnbind = function() { editor.off( 'keyup', mceKeyup ); editor.off( 'show', mceShow ); editor.off( 'hide', mceHide ); editor.off( 'wp-toolbar-toggle', toggleAdvanced ); editor.off( 'setcontent wp-autoresize wp-toolbar-toggle', adjust ); editor.off( 'undo redo', mceScroll ); editor.off( 'FullscreenStateChanged', mceFullscreenToggled ); $window.off( 'scroll.mce-float-panels' ); }; if ( $wrap.hasClass( 'wp-editor-expand' ) ) { // Adjust "immediately". mceBind(); initialResize( adjust ); } } ); /** * Adjusts the toolbars heights and positions. * * Adjusts the toolbars heights and positions based on the scroll position on * the page, the active editor mode and the heights of the editor, admin bar and * side bar. * * @since 4.0.0 * * @param {event} event The event that calls this function. * * @return {void} */ function adjust( event ) { // Makes sure we're not in fullscreen mode. if ( fullscreen && fullscreen.settings.visible ) { return; } var windowPos = $window.scrollTop(), type = event && event.type, resize = type !== 'scroll', visual = mceEditor && ! mceEditor.isHidden(), buffer = autoresizeMinHeight, postBodyTop = $postBody.offset().top, borderWidth = 1, contentWrapWidth = $contentWrap.width(), $top, $editor, sidebarTop, footerTop, canPin, topPos, topHeight, editorPos, editorHeight; /* * Refresh the heights if type isn't 'scroll' * or heights.windowHeight isn't set. */ if ( resize || ! heights.windowHeight ) { getHeights(); } // Resize on resize event when the editor is in text mode. if ( ! visual && type === 'resize' ) { textEditorResize(); } if ( visual ) { $top = $visualTop; $editor = $visualEditor; topHeight = heights.visualTopHeight; } else { $top = $textTop; $editor = $textEditor; topHeight = heights.textTopHeight; } // Return if TinyMCE is still initializing. if ( ! visual && ! $top.length ) { return; } topPos = $top.parent().offset().top; editorPos = $editor.offset().top; editorHeight = $editor.outerHeight(); /* * If in visual mode, checks if the editorHeight is greater than the autoresizeMinHeight + topHeight. * If not in visual mode, checks if the editorHeight is greater than the autoresizeMinHeight + 20. */ canPin = visual ? autoresizeMinHeight + topHeight : autoresizeMinHeight + 20; // 20px from textarea padding. canPin = editorHeight > ( canPin + 5 ); if ( ! canPin ) { if ( resize ) { $tools.css( { position: 'absolute', top: 0, width: contentWrapWidth } ); if ( visual && $menuBar.length ) { $menuBar.css( { position: 'absolute', top: 0, width: contentWrapWidth - ( borderWidth * 2 ) } ); } $top.css( { position: 'absolute', top: heights.menuBarHeight, width: contentWrapWidth - ( borderWidth * 2 ) - ( visual ? 0 : ( $top.outerWidth() - $top.width() ) ) } ); $statusBar.attr( 'style', advanced ? '' : 'visibility: hidden;' ); $bottom.attr( 'style', '' ); } } else { // Check if the top is not already in a fixed position. if ( ( ! fixedTop || resize ) && ( windowPos >= ( topPos - heights.toolsHeight - heights.adminBarHeight ) && windowPos <= ( topPos - heights.toolsHeight - heights.adminBarHeight + editorHeight - buffer ) ) ) { fixedTop = true; $tools.css( { position: 'fixed', top: heights.adminBarHeight, width: contentWrapWidth } ); if ( visual && $menuBar.length ) { $menuBar.css( { position: 'fixed', top: heights.adminBarHeight + heights.toolsHeight, width: contentWrapWidth - ( borderWidth * 2 ) - ( visual ? 0 : ( $top.outerWidth() - $top.width() ) ) } ); } $top.css( { position: 'fixed', top: heights.adminBarHeight + heights.toolsHeight + heights.menuBarHeight, width: contentWrapWidth - ( borderWidth * 2 ) - ( visual ? 0 : ( $top.outerWidth() - $top.width() ) ) } ); // Check if the top is already in a fixed position. } else if ( fixedTop || resize ) { if ( windowPos <= ( topPos - heights.toolsHeight - heights.adminBarHeight ) ) { fixedTop = false; $tools.css( { position: 'absolute', top: 0, width: contentWrapWidth } ); if ( visual && $menuBar.length ) { $menuBar.css( { position: 'absolute', top: 0, width: contentWrapWidth - ( borderWidth * 2 ) } ); } $top.css( { position: 'absolute', top: heights.menuBarHeight, width: contentWrapWidth - ( borderWidth * 2 ) - ( visual ? 0 : ( $top.outerWidth() - $top.width() ) ) } ); } else if ( windowPos >= ( topPos - heights.toolsHeight - heights.adminBarHeight + editorHeight - buffer ) ) { fixedTop = false; $tools.css( { position: 'absolute', top: editorHeight - buffer, width: contentWrapWidth } ); if ( visual && $menuBar.length ) { $menuBar.css( { position: 'absolute', top: editorHeight - buffer, width: contentWrapWidth - ( borderWidth * 2 ) } ); } $top.css( { position: 'absolute', top: editorHeight - buffer + heights.menuBarHeight, width: contentWrapWidth - ( borderWidth * 2 ) - ( visual ? 0 : ( $top.outerWidth() - $top.width() ) ) } ); } } // Check if the bottom is not already in a fixed position. if ( ( ! fixedBottom || ( resize && advanced ) ) && // Add borderWidth for the border around the .wp-editor-container. ( windowPos + heights.windowHeight ) <= ( editorPos + editorHeight + heights.bottomHeight + heights.statusBarHeight + borderWidth ) ) { if ( event && event.deltaHeight > 0 && event.deltaHeight < 100 ) { window.scrollBy( 0, event.deltaHeight ); } else if ( visual && advanced ) { fixedBottom = true; $statusBar.css( { position: 'fixed', bottom: heights.bottomHeight, visibility: '', width: contentWrapWidth - ( borderWidth * 2 ) } ); $bottom.css( { position: 'fixed', bottom: 0, width: contentWrapWidth } ); } } else if ( ( ! advanced && fixedBottom ) || ( ( fixedBottom || resize ) && ( windowPos + heights.windowHeight ) > ( editorPos + editorHeight + heights.bottomHeight + heights.statusBarHeight - borderWidth ) ) ) { fixedBottom = false; $statusBar.attr( 'style', advanced ? '' : 'visibility: hidden;' ); $bottom.attr( 'style', '' ); } } // The postbox container is positioned with @media from CSS. Ensure it is pinned on the side. if ( $postboxContainer.width() < 300 && heights.windowWidth > 600 && // Check if the sidebar is not taller than the document height. $document.height() > ( $sideSortables.height() + postBodyTop + 120 ) && // Check if the editor is taller than the viewport. heights.windowHeight < editorHeight ) { if ( ( heights.sideSortablesHeight + pinnedToolsTop + sidebarBottom ) > heights.windowHeight || fixedSideTop || fixedSideBottom ) { // Reset the sideSortables style when scrolling to the top. if ( windowPos + pinnedToolsTop <= postBodyTop ) { $sideSortables.attr( 'style', '' ); fixedSideTop = fixedSideBottom = false; } else { // When scrolling down. if ( windowPos > lastScrollPosition ) { if ( fixedSideTop ) { // Let it scroll. fixedSideTop = false; sidebarTop = $sideSortables.offset().top - heights.adminBarHeight; footerTop = $footer.offset().top; // Don't get over the footer. if ( footerTop < sidebarTop + heights.sideSortablesHeight + sidebarBottom ) { sidebarTop = footerTop - heights.sideSortablesHeight - 12; } $sideSortables.css({ position: 'absolute', top: sidebarTop, bottom: '' }); } else if ( ! fixedSideBottom && heights.sideSortablesHeight + $sideSortables.offset().top + sidebarBottom < windowPos + heights.windowHeight ) { // Pin the bottom. fixedSideBottom = true; $sideSortables.css({ position: 'fixed', top: 'auto', bottom: sidebarBottom }); } // When scrolling up. } else if ( windowPos < lastScrollPosition ) { if ( fixedSideBottom ) { // Let it scroll. fixedSideBottom = false; sidebarTop = $sideSortables.offset().top - sidebarBottom; footerTop = $footer.offset().top; // Don't get over the footer. if ( footerTop < sidebarTop + heights.sideSortablesHeight + sidebarBottom ) { sidebarTop = footerTop - heights.sideSortablesHeight - 12; } $sideSortables.css({ position: 'absolute', top: sidebarTop, bottom: '' }); } else if ( ! fixedSideTop && $sideSortables.offset().top >= windowPos + pinnedToolsTop ) { // Pin the top. fixedSideTop = true; $sideSortables.css({ position: 'fixed', top: pinnedToolsTop, bottom: '' }); } } } } else { // If the sidebar container is smaller than the viewport, then pin/unpin the top when scrolling. if ( windowPos >= ( postBodyTop - pinnedToolsTop ) ) { $sideSortables.css( { position: 'fixed', top: pinnedToolsTop } ); } else { $sideSortables.attr( 'style', '' ); } fixedSideTop = fixedSideBottom = false; } lastScrollPosition = windowPos; } else { $sideSortables.attr( 'style', '' ); fixedSideTop = fixedSideBottom = false; } if ( resize ) { $contentWrap.css( { paddingTop: heights.toolsHeight } ); if ( visual ) { $visualEditor.css( { paddingTop: heights.visualTopHeight + heights.menuBarHeight } ); } else { $textEditor.css( { marginTop: heights.textTopHeight } ); } } } /** * Resizes the editor and adjusts the toolbars. * * @since 4.0.0 * * @return {void} */ function fullscreenHide() { textEditorResize(); adjust(); } /** * Runs the passed function with 500ms intervals. * * @since 4.0.0 * * @param {function} callback The function to run in the timeout. * * @return {void} */ function initialResize( callback ) { for ( var i = 1; i < 6; i++ ) { setTimeout( callback, 500 * i ); } } /** * Runs adjust after 100ms. * * @since 4.0.0 * * @return {void} */ function afterScroll() { clearTimeout( scrollTimer ); scrollTimer = setTimeout( adjust, 100 ); } /** * Binds editor expand events on elements. * * @since 4.0.0 * * @return {void} */ function on() { /* * Scroll to the top when triggering this from JS. * Ensure the toolbars are pinned properly. */ if ( window.pageYOffset && window.pageYOffset > pageYOffsetAtTop ) { window.scrollTo( window.pageXOffset, 0 ); } $wrap.addClass( 'wp-editor-expand' ); // Adjust when the window is scrolled or resized. $window.on( 'scroll.editor-expand resize.editor-expand', function( event ) { adjust( event.type ); afterScroll(); } ); /* * Adjust when collapsing the menu, changing the columns * or changing the body class. */ $document.on( 'wp-collapse-menu.editor-expand postboxes-columnchange.editor-expand editor-classchange.editor-expand', adjust ) .on( 'postbox-toggled.editor-expand postbox-moved.editor-expand', function() { if ( ! fixedSideTop && ! fixedSideBottom && window.pageYOffset > pinnedToolsTop ) { fixedSideBottom = true; window.scrollBy( 0, -1 ); adjust(); window.scrollBy( 0, 1 ); } adjust(); }).on( 'wp-window-resized.editor-expand', function() { if ( mceEditor && ! mceEditor.isHidden() ) { mceEditor.execCommand( 'wpAutoResize' ); } else { textEditorResize(); } }); $textEditor.on( 'focus.editor-expand input.editor-expand propertychange.editor-expand', textEditorResize ); mceBind(); // Adjust when entering or exiting fullscreen mode. fullscreen && fullscreen.pubsub.subscribe( 'hidden', fullscreenHide ); if ( mceEditor ) { mceEditor.settings.wp_autoresize_on = true; mceEditor.execCommand( 'wpAutoResizeOn' ); if ( ! mceEditor.isHidden() ) { mceEditor.execCommand( 'wpAutoResize' ); } } if ( ! mceEditor || mceEditor.isHidden() ) { textEditorResize(); } adjust(); $document.trigger( 'editor-expand-on' ); } /** * Unbinds editor expand events. * * @since 4.0.0 * * @return {void} */ function off() { var height = parseInt( window.getUserSetting( 'ed_size', 300 ), 10 ); if ( height < 50 ) { height = 50; } else if ( height > 5000 ) { height = 5000; } /* * Scroll to the top when triggering this from JS. * Ensure the toolbars are reset properly. */ if ( window.pageYOffset && window.pageYOffset > pageYOffsetAtTop ) { window.scrollTo( window.pageXOffset, 0 ); } $wrap.removeClass( 'wp-editor-expand' ); $window.off( '.editor-expand' ); $document.off( '.editor-expand' ); $textEditor.off( '.editor-expand' ); mceUnbind(); // Adjust when entering or exiting fullscreen mode. fullscreen && fullscreen.pubsub.unsubscribe( 'hidden', fullscreenHide ); // Reset all CSS. $.each( [ $visualTop, $textTop, $tools, $menuBar, $bottom, $statusBar, $contentWrap, $visualEditor, $textEditor, $sideSortables ], function( i, element ) { element && element.attr( 'style', '' ); }); fixedTop = fixedBottom = fixedSideTop = fixedSideBottom = false; if ( mceEditor ) { mceEditor.settings.wp_autoresize_on = false; mceEditor.execCommand( 'wpAutoResizeOff' ); if ( ! mceEditor.isHidden() ) { $textEditor.hide(); if ( height ) { mceEditor.theme.resizeTo( null, height ); } } } // If there is a height found in the user setting. if ( height ) { $textEditor.height( height ); } $document.trigger( 'editor-expand-off' ); } // Start on load. if ( $wrap.hasClass( 'wp-editor-expand' ) ) { on(); // Resize just after CSS has fully loaded and QuickTags is ready. if ( $contentWrap.hasClass( 'html-active' ) ) { initialResize( function() { adjust(); textEditorResize(); } ); } } // Show the on/off checkbox. $( '#adv-settings .editor-expand' ).show(); $( '#editor-expand-toggle' ).on( 'change.editor-expand', function() { if ( $(this).prop( 'checked' ) ) { on(); window.setUserSetting( 'editor_expand', 'on' ); } else { off(); window.setUserSetting( 'editor_expand', 'off' ); } }); // Expose on() and off(). window.editorExpand = { on: on, off: off }; } ); /** * Handles the distraction free writing of TinyMCE. * * @since 4.1.0 * * @return {void} */ $( function() { var $body = $( document.body ), $wrap = $( '#wpcontent' ), $editor = $( '#post-body-content' ), $title = $( '#title' ), $content = $( '#content' ), $overlay = $( document.createElement( 'DIV' ) ), $slug = $( '#edit-slug-box' ), $slugFocusEl = $slug.find( 'a' ) .add( $slug.find( 'button' ) ) .add( $slug.find( 'input' ) ), $menuWrap = $( '#adminmenuwrap' ), $editorWindow = $(), $editorIframe = $(), _isActive = window.getUserSetting( 'editor_expand', 'on' ) === 'on', _isOn = _isActive ? window.getUserSetting( 'post_dfw' ) === 'on' : false, traveledX = 0, traveledY = 0, buffer = 20, faded, fadedAdminBar, fadedSlug, editorRect, x, y, mouseY, scrollY, focusLostTimer, overlayTimer, editorHasFocus; $body.append( $overlay ); $overlay.css( { display: 'none', position: 'fixed', top: $adminBar.height(), right: 0, bottom: 0, left: 0, 'z-index': 9997 } ); $editor.css( { position: 'relative' } ); $window.on( 'mousemove.focus', function( event ) { mouseY = event.pageY; } ); /** * Recalculates the bottom and right position of the editor in the DOM. * * @since 4.1.0 * * @return {void} */ function recalcEditorRect() { editorRect = $editor.offset(); editorRect.right = editorRect.left + $editor.outerWidth(); editorRect.bottom = editorRect.top + $editor.outerHeight(); } /** * Activates the distraction free writing mode. * * @since 4.1.0 * * @return {void} */ function activate() { if ( ! _isActive ) { _isActive = true; $document.trigger( 'dfw-activate' ); $content.on( 'keydown.focus-shortcut', toggleViaKeyboard ); } } /** * Deactivates the distraction free writing mode. * * @since 4.1.0 * * @return {void} */ function deactivate() { if ( _isActive ) { off(); _isActive = false; $document.trigger( 'dfw-deactivate' ); $content.off( 'keydown.focus-shortcut' ); } } /** * Returns _isActive. * * @since 4.1.0 * * @return {boolean} Returns true is _isActive is true. */ function isActive() { return _isActive; } /** * Binds events on the editor for distraction free writing. * * @since 4.1.0 * * @return {void} */ function on() { if ( ! _isOn && _isActive ) { _isOn = true; $content.on( 'keydown.focus', fadeOut ); $title.add( $content ).on( 'blur.focus', maybeFadeIn ); fadeOut(); window.setUserSetting( 'post_dfw', 'on' ); $document.trigger( 'dfw-on' ); } } /** * Unbinds events on the editor for distraction free writing. * * @since 4.1.0 * * @return {void} */ function off() { if ( _isOn ) { _isOn = false; $title.add( $content ).off( '.focus' ); fadeIn(); $editor.off( '.focus' ); window.setUserSetting( 'post_dfw', 'off' ); $document.trigger( 'dfw-off' ); } } /** * Binds or unbinds the editor expand events. * * @since 4.1.0 * * @return {void} */ function toggle() { if ( _isOn ) { off(); } else { on(); } } /** * Returns the value of _isOn. * * @since 4.1.0 * * @return {boolean} Returns true if _isOn is true. */ function isOn() { return _isOn; } /** * Fades out all elements except for the editor. * * The fading is done based on key presses and mouse movements. * Also calls the fadeIn on certain key presses * or if the mouse leaves the editor. * * @since 4.1.0 * * @param event The event that triggers this function. * * @return {void} */ function fadeOut( event ) { var isMac, key = event && event.keyCode; if ( window.navigator.platform ) { isMac = ( window.navigator.platform.indexOf( 'Mac' ) > -1 ); } // Fade in and returns on Escape and keyboard shortcut Alt+Shift+W and Ctrl+Opt+W. if ( key === 27 || ( key === 87 && event.altKey && ( ( ! isMac && event.shiftKey ) || ( isMac && event.ctrlKey ) ) ) ) { fadeIn( event ); return; } // Return if any of the following keys or combinations of keys is pressed. if ( event && ( event.metaKey || ( event.ctrlKey && ! event.altKey ) || ( event.altKey && event.shiftKey ) || ( key && ( // Special keys ( tab, ctrl, alt, esc, arrow keys... ). ( key <= 47 && key !== 8 && key !== 13 && key !== 32 && key !== 46 ) || // Windows keys. ( key >= 91 && key <= 93 ) || // F keys. ( key >= 112 && key <= 135 ) || // Num Lock, Scroll Lock, OEM. ( key >= 144 && key <= 150 ) || // OEM or non-printable. key >= 224 ) ) ) ) { return; } if ( ! faded ) { faded = true; clearTimeout( overlayTimer ); overlayTimer = setTimeout( function() { $overlay.show(); }, 600 ); $editor.css( 'z-index', 9998 ); $overlay // Always recalculate the editor area when entering the overlay with the mouse. .on( 'mouseenter.focus', function() { recalcEditorRect(); $window.on( 'scroll.focus', function() { var nScrollY = window.pageYOffset; if ( ( scrollY && mouseY && scrollY !== nScrollY ) && ( mouseY < editorRect.top - buffer || mouseY > editorRect.bottom + buffer ) ) { fadeIn(); } scrollY = nScrollY; } ); } ) .on( 'mouseleave.focus', function() { x = y = null; traveledX = traveledY = 0; $window.off( 'scroll.focus' ); } ) // Fade in when the mouse moves away form the editor area. .on( 'mousemove.focus', function( event ) { var nx = event.clientX, ny = event.clientY, pageYOffset = window.pageYOffset, pageXOffset = window.pageXOffset; if ( x && y && ( nx !== x || ny !== y ) ) { if ( ( ny <= y && ny < editorRect.top - pageYOffset ) || ( ny >= y && ny > editorRect.bottom - pageYOffset ) || ( nx <= x && nx < editorRect.left - pageXOffset ) || ( nx >= x && nx > editorRect.right - pageXOffset ) ) { traveledX += Math.abs( x - nx ); traveledY += Math.abs( y - ny ); if ( ( ny <= editorRect.top - buffer - pageYOffset || ny >= editorRect.bottom + buffer - pageYOffset || nx <= editorRect.left - buffer - pageXOffset || nx >= editorRect.right + buffer - pageXOffset ) && ( traveledX > 10 || traveledY > 10 ) ) { fadeIn(); x = y = null; traveledX = traveledY = 0; return; } } else { traveledX = traveledY = 0; } } x = nx; y = ny; } ) // When the overlay is touched, fade in and cancel the event. .on( 'touchstart.focus', function( event ) { event.preventDefault(); fadeIn(); } ); $editor.off( 'mouseenter.focus' ); if ( focusLostTimer ) { clearTimeout( focusLostTimer ); focusLostTimer = null; } $body.addClass( 'focus-on' ).removeClass( 'focus-off' ); } fadeOutAdminBar(); fadeOutSlug(); } /** * Fades all elements back in. * * @since 4.1.0 * * @param event The event that triggers this function. * * @return {void} */ function fadeIn( event ) { if ( faded ) { faded = false; clearTimeout( overlayTimer ); overlayTimer = setTimeout( function() { $overlay.hide(); }, 200 ); $editor.css( 'z-index', '' ); $overlay.off( 'mouseenter.focus mouseleave.focus mousemove.focus touchstart.focus' ); /* * When fading in, temporarily watch for refocus and fade back out - helps * with 'accidental' editor exits with the mouse. When fading in and the event * is a key event (Escape or Alt+Shift+W) don't watch for refocus. */ if ( 'undefined' === typeof event ) { $editor.on( 'mouseenter.focus', function() { if ( $.contains( $editor.get( 0 ), document.activeElement ) || editorHasFocus ) { fadeOut(); } } ); } focusLostTimer = setTimeout( function() { focusLostTimer = null; $editor.off( 'mouseenter.focus' ); }, 1000 ); $body.addClass( 'focus-off' ).removeClass( 'focus-on' ); } fadeInAdminBar(); fadeInSlug(); } /** * Fades in if the focused element based on it position. * * @since 4.1.0 * * @return {void} */ function maybeFadeIn() { setTimeout( function() { var position = document.activeElement.compareDocumentPosition( $editor.get( 0 ) ); function hasFocus( $el ) { return $.contains( $el.get( 0 ), document.activeElement ); } // The focused node is before or behind the editor area, and not outside the wrap. if ( ( position === 2 || position === 4 ) && ( hasFocus( $menuWrap ) || hasFocus( $wrap ) || hasFocus( $footer ) ) ) { fadeIn(); } }, 0 ); } /** * Fades out the admin bar based on focus on the admin bar. * * @since 4.1.0 * * @return {void} */ function fadeOutAdminBar() { if ( ! fadedAdminBar && faded ) { fadedAdminBar = true; $adminBar .on( 'mouseenter.focus', function() { $adminBar.addClass( 'focus-off' ); } ) .on( 'mouseleave.focus', function() { $adminBar.removeClass( 'focus-off' ); } ); } } /** * Fades in the admin bar. * * @since 4.1.0 * * @return {void} */ function fadeInAdminBar() { if ( fadedAdminBar ) { fadedAdminBar = false; $adminBar.off( '.focus' ); } } /** * Fades out the edit slug box. * * @since 4.1.0 * * @return {void} */ function fadeOutSlug() { if ( ! fadedSlug && faded && ! $slug.find( ':focus').length ) { fadedSlug = true; $slug.stop().fadeTo( 'fast', 0.3 ).on( 'mouseenter.focus', fadeInSlug ).off( 'mouseleave.focus' ); $slugFocusEl.on( 'focus.focus', fadeInSlug ).off( 'blur.focus' ); } } /** * Fades in the edit slug box. * * @since 4.1.0 * * @return {void} */ function fadeInSlug() { if ( fadedSlug ) { fadedSlug = false; $slug.stop().fadeTo( 'fast', 1 ).on( 'mouseleave.focus', fadeOutSlug ).off( 'mouseenter.focus' ); $slugFocusEl.on( 'blur.focus', fadeOutSlug ).off( 'focus.focus' ); } } /** * Triggers the toggle on Alt + Shift + W. * * Keycode 87 = w. * * @since 4.1.0 * * @param {event} event The event to trigger the toggle. * * @return {void} */ function toggleViaKeyboard( event ) { if ( event.altKey && event.shiftKey && 87 === event.keyCode ) { toggle(); } } if ( $( '#postdivrich' ).hasClass( 'wp-editor-expand' ) ) { $content.on( 'keydown.focus-shortcut', toggleViaKeyboard ); } /** * Adds the distraction free writing button when setting up TinyMCE. * * @since 4.1.0 * * @param {event} event The TinyMCE editor setup event. * @param {object} editor The editor to add the button to. * * @return {void} */ $document.on( 'tinymce-editor-setup.focus', function( event, editor ) { editor.addButton( 'dfw', { active: _isOn, classes: 'wp-dfw btn widget', disabled: ! _isActive, onclick: toggle, onPostRender: function() { var button = this; editor.on( 'init', function() { if ( button.disabled() ) { button.hide(); } } ); $document .on( 'dfw-activate.focus', function() { button.disabled( false ); button.show(); } ) .on( 'dfw-deactivate.focus', function() { button.disabled( true ); button.hide(); } ) .on( 'dfw-on.focus', function() { button.active( true ); } ) .on( 'dfw-off.focus', function() { button.active( false ); } ); }, tooltip: 'Distraction-free writing mode', shortcut: 'Alt+Shift+W' } ); editor.addCommand( 'wpToggleDFW', toggle ); editor.addShortcut( 'access+w', '', 'wpToggleDFW' ); } ); /** * Binds and unbinds events on the editor. * * @since 4.1.0 * * @param {event} event The TinyMCE editor init event. * @param {object} editor The editor to bind events on. * * @return {void} */ $document.on( 'tinymce-editor-init.focus', function( event, editor ) { var mceBind, mceUnbind; function focus() { editorHasFocus = true; } function blur() { editorHasFocus = false; } if ( editor.id === 'content' ) { $editorWindow = $( editor.getWin() ); $editorIframe = $( editor.getContentAreaContainer() ).find( 'iframe' ); mceBind = function() { editor.on( 'keydown', fadeOut ); editor.on( 'blur', maybeFadeIn ); editor.on( 'focus', focus ); editor.on( 'blur', blur ); editor.on( 'wp-autoresize', recalcEditorRect ); }; mceUnbind = function() { editor.off( 'keydown', fadeOut ); editor.off( 'blur', maybeFadeIn ); editor.off( 'focus', focus ); editor.off( 'blur', blur ); editor.off( 'wp-autoresize', recalcEditorRect ); }; if ( _isOn ) { mceBind(); } // Bind and unbind based on the distraction free writing focus. $document.on( 'dfw-on.focus', mceBind ).on( 'dfw-off.focus', mceUnbind ); // Focus the editor when it is the target of the click event. editor.on( 'click', function( event ) { if ( event.target === editor.getDoc().documentElement ) { editor.focus(); } } ); } } ); /** * Binds events on quicktags init. * * @since 4.1.0 * * @param {event} event The quicktags init event. * @param {object} editor The editor to bind events on. * * @return {void} */ $document.on( 'quicktags-init', function( event, editor ) { var $button; // Bind the distraction free writing events if the distraction free writing button is available. if ( editor.settings.buttons && ( ',' + editor.settings.buttons + ',' ).indexOf( ',dfw,' ) !== -1 ) { $button = $( '#' + editor.name + '_dfw' ); $( document ) .on( 'dfw-activate', function() { $button.prop( 'disabled', false ); } ) .on( 'dfw-deactivate', function() { $button.prop( 'disabled', true ); } ) .on( 'dfw-on', function() { $button.addClass( 'active' ); } ) .on( 'dfw-off', function() { $button.removeClass( 'active' ); } ); } } ); $document.on( 'editor-expand-on.focus', activate ).on( 'editor-expand-off.focus', deactivate ); if ( _isOn ) { $content.on( 'keydown.focus', fadeOut ); $title.add( $content ).on( 'blur.focus', maybeFadeIn ); } window.wp = window.wp || {}; window.wp.editor = window.wp.editor || {}; window.wp.editor.dfw = { activate: activate, deactivate: deactivate, isActive: isActive, on: on, off: off, toggle: toggle, isOn: isOn }; } ); } )( window, window.jQuery ); PKZMBjs/customize-nav-menus.jsnu[/** * @output wp-admin/js/customize-nav-menus.js */ /* global menus, _wpCustomizeNavMenusSettings, wpNavMenu, console */ ( function( api, wp, $ ) { 'use strict'; /** * Set up wpNavMenu for drag and drop. */ wpNavMenu.originalInit = wpNavMenu.init; wpNavMenu.options.menuItemDepthPerLevel = 20; wpNavMenu.options.sortableItems = '> .customize-control-nav_menu_item'; wpNavMenu.options.targetTolerance = 10; wpNavMenu.init = function() { this.jQueryExtensions(); }; /** * @namespace wp.customize.Menus */ api.Menus = api.Menus || {}; // Link settings. api.Menus.data = { itemTypes: [], l10n: {}, settingTransport: 'refresh', phpIntMax: 0, defaultSettingValues: { nav_menu: {}, nav_menu_item: {} }, locationSlugMappedToName: {} }; if ( 'undefined' !== typeof _wpCustomizeNavMenusSettings ) { $.extend( api.Menus.data, _wpCustomizeNavMenusSettings ); } /** * Newly-created Nav Menus and Nav Menu Items have negative integer IDs which * serve as placeholders until Save & Publish happens. * * @alias wp.customize.Menus.generatePlaceholderAutoIncrementId * * @return {number} */ api.Menus.generatePlaceholderAutoIncrementId = function() { return -Math.ceil( api.Menus.data.phpIntMax * Math.random() ); }; /** * wp.customize.Menus.AvailableItemModel * * A single available menu item model. See PHP's WP_Customize_Nav_Menu_Item_Setting class. * * @class wp.customize.Menus.AvailableItemModel * @augments Backbone.Model */ api.Menus.AvailableItemModel = Backbone.Model.extend( $.extend( { id: null // This is only used by Backbone. }, api.Menus.data.defaultSettingValues.nav_menu_item ) ); /** * wp.customize.Menus.AvailableItemCollection * * Collection for available menu item models. * * @class wp.customize.Menus.AvailableItemCollection * @augments Backbone.Collection */ api.Menus.AvailableItemCollection = Backbone.Collection.extend(/** @lends wp.customize.Menus.AvailableItemCollection.prototype */{ model: api.Menus.AvailableItemModel, sort_key: 'order', comparator: function( item ) { return -item.get( this.sort_key ); }, sortByField: function( fieldName ) { this.sort_key = fieldName; this.sort(); } }); api.Menus.availableMenuItems = new api.Menus.AvailableItemCollection( api.Menus.data.availableMenuItems ); /** * Insert a new `auto-draft` post. * * @since 4.7.0 * @alias wp.customize.Menus.insertAutoDraftPost * * @param {Object} params - Parameters for the draft post to create. * @param {string} params.post_type - Post type to add. * @param {string} params.post_title - Post title to use. * @return {jQuery.promise} Promise resolved with the added post. */ api.Menus.insertAutoDraftPost = function insertAutoDraftPost( params ) { var request, deferred = $.Deferred(); request = wp.ajax.post( 'customize-nav-menus-insert-auto-draft', { 'customize-menus-nonce': api.settings.nonce['customize-menus'], 'wp_customize': 'on', 'customize_changeset_uuid': api.settings.changeset.uuid, 'params': params } ); request.done( function( response ) { if ( response.post_id ) { api( 'nav_menus_created_posts' ).set( api( 'nav_menus_created_posts' ).get().concat( [ response.post_id ] ) ); if ( 'page' === params.post_type ) { // Activate static front page controls as this could be the first page created. if ( api.section.has( 'static_front_page' ) ) { api.section( 'static_front_page' ).activate(); } // Add new page to dropdown-pages controls. api.control.each( function( control ) { var select; if ( 'dropdown-pages' === control.params.type ) { select = control.container.find( 'select[name^="_customize-dropdown-pages-"]' ); select.append( new Option( params.post_title, response.post_id ) ); } } ); } deferred.resolve( response ); } } ); request.fail( function( response ) { var error = response || ''; if ( 'undefined' !== typeof response.message ) { error = response.message; } console.error( error ); deferred.rejectWith( error ); } ); return deferred.promise(); }; api.Menus.AvailableMenuItemsPanelView = wp.Backbone.View.extend(/** @lends wp.customize.Menus.AvailableMenuItemsPanelView.prototype */{ el: '#available-menu-items', events: { 'input #menu-items-search': 'debounceSearch', 'focus .menu-item-tpl': 'focus', 'click .menu-item-tpl': '_submit', 'click #custom-menu-item-submit': '_submitLink', 'keypress #custom-menu-item-name': '_submitLink', 'click .new-content-item .add-content': '_submitNew', 'keypress .create-item-input': '_submitNew', 'keydown': 'keyboardAccessible' }, // Cache current selected menu item. selected: null, // Cache menu control that opened the panel. currentMenuControl: null, debounceSearch: null, $search: null, $clearResults: null, searchTerm: '', rendered: false, pages: {}, sectionContent: '', loading: false, addingNew: false, /** * wp.customize.Menus.AvailableMenuItemsPanelView * * View class for the available menu items panel. * * @constructs wp.customize.Menus.AvailableMenuItemsPanelView * @augments wp.Backbone.View */ initialize: function() { var self = this; if ( ! api.panel.has( 'nav_menus' ) ) { return; } this.$search = $( '#menu-items-search' ); this.$clearResults = this.$el.find( '.clear-results' ); this.sectionContent = this.$el.find( '.available-menu-items-list' ); this.debounceSearch = _.debounce( self.search, 500 ); _.bindAll( this, 'close' ); /* * If the available menu items panel is open and the customize controls * are interacted with (other than an item being deleted), then close * the available menu items panel. Also close on back button click. */ $( '#customize-controls, .customize-section-back' ).on( 'click keydown', function( e ) { var isDeleteBtn = $( e.target ).is( '.item-delete, .item-delete *' ), isAddNewBtn = $( e.target ).is( '.add-new-menu-item, .add-new-menu-item *' ); if ( $( 'body' ).hasClass( 'adding-menu-items' ) && ! isDeleteBtn && ! isAddNewBtn ) { self.close(); } } ); // Clear the search results and trigger an `input` event to fire a new search. this.$clearResults.on( 'click', function() { self.$search.val( '' ).trigger( 'focus' ).trigger( 'input' ); } ); this.$el.on( 'input', '#custom-menu-item-name.invalid, #custom-menu-item-url.invalid', function() { $( this ).removeClass( 'invalid' ); var errorMessageId = $( this ).attr( 'aria-describedby' ); $( '#' + errorMessageId ).hide(); $( this ).removeAttr( 'aria-invalid' ).removeAttr( 'aria-describedby' ); }); // Load available items if it looks like we'll need them. api.panel( 'nav_menus' ).container.on( 'expanded', function() { if ( ! self.rendered ) { self.initList(); self.rendered = true; } }); // Load more items. this.sectionContent.on( 'scroll', function() { var totalHeight = self.$el.find( '.accordion-section.open .available-menu-items-list' ).prop( 'scrollHeight' ), visibleHeight = self.$el.find( '.accordion-section.open' ).height(); if ( ! self.loading && $( this ).scrollTop() > 3 / 4 * totalHeight - visibleHeight ) { var type = $( this ).data( 'type' ), object = $( this ).data( 'object' ); if ( 'search' === type ) { if ( self.searchTerm ) { self.doSearch( self.pages.search ); } } else { self.loadItems( [ { type: type, object: object } ] ); } } }); // Close the panel if the URL in the preview changes. api.previewer.bind( 'url', this.close ); self.delegateEvents(); }, // Search input change handler. search: function( event ) { var $searchSection = $( '#available-menu-items-search' ), $otherSections = $( '#available-menu-items .accordion-section' ).not( $searchSection ); if ( ! event ) { return; } if ( this.searchTerm === event.target.value ) { return; } if ( '' !== event.target.value && ! $searchSection.hasClass( 'open' ) ) { $otherSections.fadeOut( 100 ); $searchSection.find( '.accordion-section-content' ).slideDown( 'fast' ); $searchSection.addClass( 'open' ); this.$clearResults.addClass( 'is-visible' ); } else if ( '' === event.target.value ) { $searchSection.removeClass( 'open' ); $otherSections.show(); this.$clearResults.removeClass( 'is-visible' ); } this.searchTerm = event.target.value; this.pages.search = 1; this.doSearch( 1 ); }, // Get search results. doSearch: function( page ) { var self = this, params, $section = $( '#available-menu-items-search' ), $content = $section.find( '.accordion-section-content' ), itemTemplate = wp.template( 'available-menu-item' ); if ( self.currentRequest ) { self.currentRequest.abort(); } if ( page < 0 ) { return; } else if ( page > 1 ) { $section.addClass( 'loading-more' ); $content.attr( 'aria-busy', 'true' ); wp.a11y.speak( api.Menus.data.l10n.itemsLoadingMore ); } else if ( '' === self.searchTerm ) { $content.html( '' ); wp.a11y.speak( '' ); return; } $section.addClass( 'loading' ); self.loading = true; params = api.previewer.query( { excludeCustomizedSaved: true } ); _.extend( params, { 'customize-menus-nonce': api.settings.nonce['customize-menus'], 'wp_customize': 'on', 'search': self.searchTerm, 'page': page } ); self.currentRequest = wp.ajax.post( 'search-available-menu-items-customizer', params ); self.currentRequest.done(function( data ) { var items; if ( 1 === page ) { // Clear previous results as it's a new search. $content.empty(); } $section.removeClass( 'loading loading-more' ); $content.attr( 'aria-busy', 'false' ); $section.addClass( 'open' ); self.loading = false; items = new api.Menus.AvailableItemCollection( data.items ); self.collection.add( items.models ); items.each( function( menuItem ) { $content.append( itemTemplate( menuItem.attributes ) ); } ); if ( 20 > items.length ) { self.pages.search = -1; // Up to 20 posts and 20 terms in results, if <20, no more results for either. } else { self.pages.search = self.pages.search + 1; } if ( items && page > 1 ) { wp.a11y.speak( api.Menus.data.l10n.itemsFoundMore.replace( '%d', items.length ) ); } else if ( items && page === 1 ) { wp.a11y.speak( api.Menus.data.l10n.itemsFound.replace( '%d', items.length ) ); } }); self.currentRequest.fail(function( data ) { // data.message may be undefined, for example when typing slow and the request is aborted. if ( data.message ) { $content.empty().append( $( '
  • ' ).text( data.message ) ); wp.a11y.speak( data.message ); } self.pages.search = -1; }); self.currentRequest.always(function() { $section.removeClass( 'loading loading-more' ); $content.attr( 'aria-busy', 'false' ); self.loading = false; self.currentRequest = null; }); }, // Render the individual items. initList: function() { var self = this; // Render the template for each item by type. _.each( api.Menus.data.itemTypes, function( itemType ) { self.pages[ itemType.type + ':' + itemType.object ] = 0; } ); self.loadItems( api.Menus.data.itemTypes ); }, /** * Load available nav menu items. * * @since 4.3.0 * @since 4.7.0 Changed function signature to take list of item types instead of single type/object. * @access private * * @param {Array.} itemTypes List of objects containing type and key. * @param {string} deprecated Formerly the object parameter. * @return {void} */ loadItems: function( itemTypes, deprecated ) { var self = this, _itemTypes, requestItemTypes = [], params, request, itemTemplate, availableMenuItemContainers = {}; itemTemplate = wp.template( 'available-menu-item' ); if ( _.isString( itemTypes ) && _.isString( deprecated ) ) { _itemTypes = [ { type: itemTypes, object: deprecated } ]; } else { _itemTypes = itemTypes; } _.each( _itemTypes, function( itemType ) { var container, name = itemType.type + ':' + itemType.object; if ( -1 === self.pages[ name ] ) { return; // Skip types for which there are no more results. } container = $( '#available-menu-items-' + itemType.type + '-' + itemType.object ); container.find( '.accordion-section-title' ).addClass( 'loading' ); availableMenuItemContainers[ name ] = container; requestItemTypes.push( { object: itemType.object, type: itemType.type, page: self.pages[ name ] } ); } ); if ( 0 === requestItemTypes.length ) { return; } self.loading = true; params = api.previewer.query( { excludeCustomizedSaved: true } ); _.extend( params, { 'customize-menus-nonce': api.settings.nonce['customize-menus'], 'wp_customize': 'on', 'item_types': requestItemTypes } ); request = wp.ajax.post( 'load-available-menu-items-customizer', params ); request.done(function( data ) { var typeInner; _.each( data.items, function( typeItems, name ) { if ( 0 === typeItems.length ) { if ( 0 === self.pages[ name ] ) { availableMenuItemContainers[ name ].find( '.accordion-section-title' ) .addClass( 'cannot-expand' ) .removeClass( 'loading' ) .find( '.accordion-section-title > button' ) .prop( 'tabIndex', -1 ); } self.pages[ name ] = -1; return; } else if ( ( 'post_type:page' === name ) && ( ! availableMenuItemContainers[ name ].hasClass( 'open' ) ) ) { availableMenuItemContainers[ name ].find( '.accordion-section-title > button' ).trigger( 'click' ); } typeItems = new api.Menus.AvailableItemCollection( typeItems ); // @todo Why is this collection created and then thrown away? self.collection.add( typeItems.models ); typeInner = availableMenuItemContainers[ name ].find( '.available-menu-items-list' ); typeItems.each( function( menuItem ) { typeInner.append( itemTemplate( menuItem.attributes ) ); } ); self.pages[ name ] += 1; }); }); request.fail(function( data ) { if ( typeof console !== 'undefined' && console.error ) { console.error( data ); } }); request.always(function() { _.each( availableMenuItemContainers, function( container ) { container.find( '.accordion-section-title' ).removeClass( 'loading' ); } ); self.loading = false; }); }, // Adjust the height of each section of items to fit the screen. itemSectionHeight: function() { var sections, lists, totalHeight, accordionHeight, diff; totalHeight = window.innerHeight; sections = this.$el.find( '.accordion-section:not( #available-menu-items-search ) .accordion-section-content' ); lists = this.$el.find( '.accordion-section:not( #available-menu-items-search ) .available-menu-items-list:not(":only-child")' ); accordionHeight = 46 * ( 1 + sections.length ) + 14; // Magic numbers. diff = totalHeight - accordionHeight; if ( 120 < diff && 290 > diff ) { sections.css( 'max-height', diff ); lists.css( 'max-height', ( diff - 60 ) ); } }, // Highlights a menu item. select: function( menuitemTpl ) { this.selected = $( menuitemTpl ); this.selected.siblings( '.menu-item-tpl' ).removeClass( 'selected' ); this.selected.addClass( 'selected' ); }, // Highlights a menu item on focus. focus: function( event ) { this.select( $( event.currentTarget ) ); }, // Submit handler for keypress and click on menu item. _submit: function( event ) { // Only proceed with keypress if it is Enter or Spacebar. if ( 'keypress' === event.type && ( 13 !== event.which && 32 !== event.which ) ) { return; } this.submit( $( event.currentTarget ) ); }, // Adds a selected menu item to the menu. submit: function( menuitemTpl ) { var menuitemId, menu_item; if ( ! menuitemTpl ) { menuitemTpl = this.selected; } if ( ! menuitemTpl || ! this.currentMenuControl ) { return; } this.select( menuitemTpl ); menuitemId = $( this.selected ).data( 'menu-item-id' ); menu_item = this.collection.findWhere( { id: menuitemId } ); if ( ! menu_item ) { return; } this.currentMenuControl.addItemToMenu( menu_item.attributes ); $( menuitemTpl ).find( '.menu-item-handle' ).addClass( 'item-added' ); }, // Submit handler for keypress and click on custom menu item. _submitLink: function( event ) { // Only proceed with keypress if it is Enter. if ( 'keypress' === event.type && 13 !== event.which ) { return; } this.submitLink(); }, // Adds the custom menu item to the menu. submitLink: function() { var menuItem, itemName = $( '#custom-menu-item-name' ), itemUrl = $( '#custom-menu-item-url' ), urlErrorMessage = $( '#custom-url-error' ), nameErrorMessage = $( '#custom-name-error' ), url = itemUrl.val().trim(), urlRegex, errorText; if ( ! this.currentMenuControl ) { return; } /* * Allow URLs including: * - http://example.com/ * - //example.com * - /directory/ * - ?query-param * - #target * - mailto:foo@example.com * * Any further validation will be handled on the server when the setting is attempted to be saved, * so this pattern does not need to be complete. */ urlRegex = /^((\w+:)?\/\/\w.*|\w+:(?!\/\/$)|\/|\?|#)/; if ( ! urlRegex.test( url ) || '' === itemName.val() ) { if ( ! urlRegex.test( url ) ) { itemUrl.addClass( 'invalid' ) .attr( 'aria-invalid', 'true' ) .attr( 'aria-describedby', 'custom-url-error' ); urlErrorMessage.show(); errorText = urlErrorMessage.text(); // Announce error message via screen reader wp.a11y.speak( errorText, 'assertive' ); } if ( '' === itemName.val() ) { itemName.addClass( 'invalid' ) .attr( 'aria-invalid', 'true' ) .attr( 'aria-describedby', 'custom-name-error' ); nameErrorMessage.show(); errorText = ( '' === errorText ) ? nameErrorMessage.text() : errorText + nameErrorMessage.text(); // Announce error message via screen reader wp.a11y.speak( errorText, 'assertive' ); } return; } urlErrorMessage.hide(); nameErrorMessage.hide(); itemName.removeClass( 'invalid' ) .removeAttr( 'aria-invalid', 'true' ) .removeAttr( 'aria-describedby', 'custom-name-error' ); itemUrl.removeClass( 'invalid' ) .removeAttr( 'aria-invalid', 'true' ) .removeAttr( 'aria-describedby', 'custom-name-error' ); menuItem = { 'title': itemName.val(), 'url': url, 'type': 'custom', 'type_label': api.Menus.data.l10n.custom_label, 'object': 'custom' }; this.currentMenuControl.addItemToMenu( menuItem ); // Reset the custom link form. itemUrl.val( '' ).attr( 'placeholder', 'https://' ); itemName.val( '' ); }, /** * Submit handler for keypress (enter) on field and click on button. * * @since 4.7.0 * @private * * @param {jQuery.Event} event Event. * @return {void} */ _submitNew: function( event ) { var container; // Only proceed with keypress if it is Enter. if ( 'keypress' === event.type && 13 !== event.which ) { return; } if ( this.addingNew ) { return; } container = $( event.target ).closest( '.accordion-section' ); this.submitNew( container ); }, /** * Creates a new object and adds an associated menu item to the menu. * * @since 4.7.0 * @private * * @param {jQuery} container * @return {void} */ submitNew: function( container ) { var panel = this, itemName = container.find( '.create-item-input' ), title = itemName.val(), dataContainer = container.find( '.available-menu-items-list' ), itemType = dataContainer.data( 'type' ), itemObject = dataContainer.data( 'object' ), itemTypeLabel = dataContainer.data( 'type_label' ), promise; if ( ! this.currentMenuControl ) { return; } // Only posts are supported currently. if ( 'post_type' !== itemType ) { return; } if ( '' === itemName.val().trim() ) { itemName.addClass( 'invalid' ); itemName.focus(); return; } else { itemName.removeClass( 'invalid' ); container.find( '.accordion-section-title' ).addClass( 'loading' ); } panel.addingNew = true; itemName.attr( 'disabled', 'disabled' ); promise = api.Menus.insertAutoDraftPost( { post_title: title, post_type: itemObject } ); promise.done( function( data ) { var availableItem, $content, itemElement; availableItem = new api.Menus.AvailableItemModel( { 'id': 'post-' + data.post_id, // Used for available menu item Backbone models. 'title': itemName.val(), 'type': itemType, 'type_label': itemTypeLabel, 'object': itemObject, 'object_id': data.post_id, 'url': data.url } ); // Add new item to menu. panel.currentMenuControl.addItemToMenu( availableItem.attributes ); // Add the new item to the list of available items. api.Menus.availableMenuItemsPanel.collection.add( availableItem ); $content = container.find( '.available-menu-items-list' ); itemElement = $( wp.template( 'available-menu-item' )( availableItem.attributes ) ); itemElement.find( '.menu-item-handle:first' ).addClass( 'item-added' ); $content.prepend( itemElement ); $content.scrollTop(); // Reset the create content form. itemName.val( '' ).removeAttr( 'disabled' ); panel.addingNew = false; container.find( '.accordion-section-title' ).removeClass( 'loading' ); } ); }, // Opens the panel. open: function( menuControl ) { var panel = this, close; this.currentMenuControl = menuControl; this.itemSectionHeight(); if ( api.section.has( 'publish_settings' ) ) { api.section( 'publish_settings' ).collapse(); } $( 'body' ).addClass( 'adding-menu-items' ); close = function() { panel.close(); $( this ).off( 'click', close ); }; $( '#customize-preview' ).on( 'click', close ); // Collapse all controls. _( this.currentMenuControl.getMenuItemControls() ).each( function( control ) { control.collapseForm(); } ); this.$el.find( '.selected' ).removeClass( 'selected' ); this.$search.trigger( 'focus' ); }, // Closes the panel. close: function( options ) { options = options || {}; if ( options.returnFocus && this.currentMenuControl ) { this.currentMenuControl.container.find( '.add-new-menu-item' ).focus(); } this.currentMenuControl = null; this.selected = null; $( 'body' ).removeClass( 'adding-menu-items' ); $( '#available-menu-items .menu-item-handle.item-added' ).removeClass( 'item-added' ); this.$search.val( '' ).trigger( 'input' ); }, // Add a few keyboard enhancements to the panel. keyboardAccessible: function( event ) { var isEnter = ( 13 === event.which ), isEsc = ( 27 === event.which ), isBackTab = ( 9 === event.which && event.shiftKey ), isSearchFocused = $( event.target ).is( this.$search ); // If enter pressed but nothing entered, don't do anything. if ( isEnter && ! this.$search.val() ) { return; } if ( isSearchFocused && isBackTab ) { this.currentMenuControl.container.find( '.add-new-menu-item' ).focus(); event.preventDefault(); // Avoid additional back-tab. } else if ( isEsc ) { this.close( { returnFocus: true } ); } } }); /** * wp.customize.Menus.MenusPanel * * Customizer panel for menus. This is used only for screen options management. * Note that 'menus' must match the WP_Customize_Menu_Panel::$type. * * @class wp.customize.Menus.MenusPanel * @augments wp.customize.Panel */ api.Menus.MenusPanel = api.Panel.extend(/** @lends wp.customize.Menus.MenusPanel.prototype */{ attachEvents: function() { api.Panel.prototype.attachEvents.call( this ); var panel = this, panelMeta = panel.container.find( '.panel-meta' ), help = panelMeta.find( '.customize-help-toggle' ), content = panelMeta.find( '.customize-panel-description' ), options = $( '#screen-options-wrap' ), button = panelMeta.find( '.customize-screen-options-toggle' ); button.on( 'click keydown', function( event ) { if ( api.utils.isKeydownButNotEnterEvent( event ) ) { return; } event.preventDefault(); // Hide description. if ( content.not( ':hidden' ) ) { content.slideUp( 'fast' ); help.attr( 'aria-expanded', 'false' ); } if ( 'true' === button.attr( 'aria-expanded' ) ) { button.attr( 'aria-expanded', 'false' ); panelMeta.removeClass( 'open' ); panelMeta.removeClass( 'active-menu-screen-options' ); options.slideUp( 'fast' ); } else { button.attr( 'aria-expanded', 'true' ); panelMeta.addClass( 'open' ); panelMeta.addClass( 'active-menu-screen-options' ); options.slideDown( 'fast' ); } return false; } ); // Help toggle. help.on( 'click keydown', function( event ) { if ( api.utils.isKeydownButNotEnterEvent( event ) ) { return; } event.preventDefault(); if ( 'true' === button.attr( 'aria-expanded' ) ) { button.attr( 'aria-expanded', 'false' ); help.attr( 'aria-expanded', 'true' ); panelMeta.addClass( 'open' ); panelMeta.removeClass( 'active-menu-screen-options' ); options.slideUp( 'fast' ); content.slideDown( 'fast' ); } } ); }, /** * Update field visibility when clicking on the field toggles. */ ready: function() { var panel = this; panel.container.find( '.hide-column-tog' ).on( 'click', function() { panel.saveManageColumnsState(); }); // Inject additional heading into the menu locations section's head container. api.section( 'menu_locations', function( section ) { section.headContainer.prepend( wp.template( 'nav-menu-locations-header' )( api.Menus.data ) ); } ); }, /** * Save hidden column states. * * @since 4.3.0 * @private * * @return {void} */ saveManageColumnsState: _.debounce( function() { var panel = this; if ( panel._updateHiddenColumnsRequest ) { panel._updateHiddenColumnsRequest.abort(); } panel._updateHiddenColumnsRequest = wp.ajax.post( 'hidden-columns', { hidden: panel.hidden(), screenoptionnonce: $( '#screenoptionnonce' ).val(), page: 'nav-menus' } ); panel._updateHiddenColumnsRequest.always( function() { panel._updateHiddenColumnsRequest = null; } ); }, 2000 ), /** * @deprecated Since 4.7.0 now that the nav_menu sections are responsible for toggling the classes on their own containers. */ checked: function() {}, /** * @deprecated Since 4.7.0 now that the nav_menu sections are responsible for toggling the classes on their own containers. */ unchecked: function() {}, /** * Get hidden fields. * * @since 4.3.0 * @private * * @return {Array} Fields (columns) that are hidden. */ hidden: function() { return $( '.hide-column-tog' ).not( ':checked' ).map( function() { var id = this.id; return id.substring( 0, id.length - 5 ); }).get().join( ',' ); } } ); /** * wp.customize.Menus.MenuSection * * Customizer section for menus. This is used only for lazy-loading child controls. * Note that 'nav_menu' must match the WP_Customize_Menu_Section::$type. * * @class wp.customize.Menus.MenuSection * @augments wp.customize.Section */ api.Menus.MenuSection = api.Section.extend(/** @lends wp.customize.Menus.MenuSection.prototype */{ /** * Initialize. * * @since 4.3.0 * * @param {string} id * @param {Object} options */ initialize: function( id, options ) { var section = this; api.Section.prototype.initialize.call( section, id, options ); section.deferred.initSortables = $.Deferred(); }, /** * Ready. */ ready: function() { var section = this, fieldActiveToggles, handleFieldActiveToggle; if ( 'undefined' === typeof section.params.menu_id ) { throw new Error( 'params.menu_id was not defined' ); } /* * Since newly created sections won't be registered in PHP, we need to prevent the * preview's sending of the activeSections to result in this control * being deactivated when the preview refreshes. So we can hook onto * the setting that has the same ID and its presence can dictate * whether the section is active. */ section.active.validate = function() { if ( ! api.has( section.id ) ) { return false; } return !! api( section.id ).get(); }; section.populateControls(); section.navMenuLocationSettings = {}; section.assignedLocations = new api.Value( [] ); api.each(function( setting, id ) { var matches = id.match( /^nav_menu_locations\[(.+?)]/ ); if ( matches ) { section.navMenuLocationSettings[ matches[1] ] = setting; setting.bind( function() { section.refreshAssignedLocations(); }); } }); section.assignedLocations.bind(function( to ) { section.updateAssignedLocationsInSectionTitle( to ); }); section.refreshAssignedLocations(); api.bind( 'pane-contents-reflowed', function() { // Skip menus that have been removed. if ( ! section.contentContainer.parent().length ) { return; } section.container.find( '.menu-item .menu-item-reorder-nav button' ).attr({ 'tabindex': '0', 'aria-hidden': 'false' }); section.container.find( '.menu-item.move-up-disabled .menus-move-up' ).attr({ 'tabindex': '-1', 'aria-hidden': 'true' }); section.container.find( '.menu-item.move-down-disabled .menus-move-down' ).attr({ 'tabindex': '-1', 'aria-hidden': 'true' }); section.container.find( '.menu-item.move-left-disabled .menus-move-left' ).attr({ 'tabindex': '-1', 'aria-hidden': 'true' }); section.container.find( '.menu-item.move-right-disabled .menus-move-right' ).attr({ 'tabindex': '-1', 'aria-hidden': 'true' }); } ); /** * Update the active field class for the content container for a given checkbox toggle. * * @this {jQuery} * @return {void} */ handleFieldActiveToggle = function() { var className = 'field-' + $( this ).val() + '-active'; section.contentContainer.toggleClass( className, $( this ).prop( 'checked' ) ); }; fieldActiveToggles = api.panel( 'nav_menus' ).contentContainer.find( '.metabox-prefs:first' ).find( '.hide-column-tog' ); fieldActiveToggles.each( handleFieldActiveToggle ); fieldActiveToggles.on( 'click', handleFieldActiveToggle ); }, populateControls: function() { var section = this, menuNameControlId, menuLocationsControlId, menuAutoAddControlId, menuDeleteControlId, menuControl, menuNameControl, menuLocationsControl, menuAutoAddControl, menuDeleteControl; // Add the control for managing the menu name. menuNameControlId = section.id + '[name]'; menuNameControl = api.control( menuNameControlId ); if ( ! menuNameControl ) { menuNameControl = new api.controlConstructor.nav_menu_name( menuNameControlId, { type: 'nav_menu_name', label: api.Menus.data.l10n.menuNameLabel, section: section.id, priority: 0, settings: { 'default': section.id } } ); api.control.add( menuNameControl ); menuNameControl.active.set( true ); } // Add the menu control. menuControl = api.control( section.id ); if ( ! menuControl ) { menuControl = new api.controlConstructor.nav_menu( section.id, { type: 'nav_menu', section: section.id, priority: 998, settings: { 'default': section.id }, menu_id: section.params.menu_id } ); api.control.add( menuControl ); menuControl.active.set( true ); } // Add the menu locations control. menuLocationsControlId = section.id + '[locations]'; menuLocationsControl = api.control( menuLocationsControlId ); if ( ! menuLocationsControl ) { menuLocationsControl = new api.controlConstructor.nav_menu_locations( menuLocationsControlId, { section: section.id, priority: 999, settings: { 'default': section.id }, menu_id: section.params.menu_id } ); api.control.add( menuLocationsControl.id, menuLocationsControl ); menuControl.active.set( true ); } // Add the control for managing the menu auto_add. menuAutoAddControlId = section.id + '[auto_add]'; menuAutoAddControl = api.control( menuAutoAddControlId ); if ( ! menuAutoAddControl ) { menuAutoAddControl = new api.controlConstructor.nav_menu_auto_add( menuAutoAddControlId, { type: 'nav_menu_auto_add', label: '', section: section.id, priority: 1000, settings: { 'default': section.id } } ); api.control.add( menuAutoAddControl ); menuAutoAddControl.active.set( true ); } // Add the control for deleting the menu. menuDeleteControlId = section.id + '[delete]'; menuDeleteControl = api.control( menuDeleteControlId ); if ( ! menuDeleteControl ) { menuDeleteControl = new api.Control( menuDeleteControlId, { section: section.id, priority: 1001, templateId: 'nav-menu-delete-button' } ); api.control.add( menuDeleteControl.id, menuDeleteControl ); menuDeleteControl.active.set( true ); menuDeleteControl.deferred.embedded.done( function () { menuDeleteControl.container.find( 'button' ).on( 'click', function() { var menuId = section.params.menu_id; var menuControl = api.Menus.getMenuControl( menuId ); menuControl.setting.set( false ); }); } ); } }, /** * */ refreshAssignedLocations: function() { var section = this, menuTermId = section.params.menu_id, currentAssignedLocations = []; _.each( section.navMenuLocationSettings, function( setting, themeLocation ) { if ( setting() === menuTermId ) { currentAssignedLocations.push( themeLocation ); } }); section.assignedLocations.set( currentAssignedLocations ); }, /** * @param {Array} themeLocationSlugs Theme location slugs. */ updateAssignedLocationsInSectionTitle: function( themeLocationSlugs ) { var section = this, $title; $title = section.container.find( '.accordion-section-title button:first' ); $title.find( '.menu-in-location' ).remove(); _.each( themeLocationSlugs, function( themeLocationSlug ) { var $label, locationName; $label = $( '' ); locationName = api.Menus.data.locationSlugMappedToName[ themeLocationSlug ]; $label.text( api.Menus.data.l10n.menuLocation.replace( '%s', locationName ) ); $title.append( $label ); }); section.container.toggleClass( 'assigned-to-menu-location', 0 !== themeLocationSlugs.length ); }, onChangeExpanded: function( expanded, args ) { var section = this, completeCallback; if ( expanded ) { wpNavMenu.menuList = section.contentContainer; wpNavMenu.targetList = wpNavMenu.menuList; // Add attributes needed by wpNavMenu. $( '#menu-to-edit' ).removeAttr( 'id' ); wpNavMenu.menuList.attr( 'id', 'menu-to-edit' ).addClass( 'menu' ); api.Menus.MenuItemControl.prototype.initAccessibility(); _.each( api.section( section.id ).controls(), function( control ) { if ( 'nav_menu_item' === control.params.type ) { control.actuallyEmbed(); } } ); // Make sure Sortables is initialized after the section has been expanded to prevent `offset` issues. if ( args.completeCallback ) { completeCallback = args.completeCallback; } args.completeCallback = function() { if ( 'resolved' !== section.deferred.initSortables.state() ) { wpNavMenu.initSortables(); // Depends on menu-to-edit ID being set above. section.deferred.initSortables.resolve( wpNavMenu.menuList ); // Now MenuControl can extend the sortable. // @todo Note that wp.customize.reflowPaneContents() is debounced, // so this immediate change will show a slight flicker while priorities get updated. api.control( 'nav_menu[' + String( section.params.menu_id ) + ']' ).reflowMenuItems(); } if ( _.isFunction( completeCallback ) ) { completeCallback(); } }; } api.Section.prototype.onChangeExpanded.call( section, expanded, args ); }, /** * Highlight how a user may create new menu items. * * This method reminds the user to create new menu items and how. * It's exposed this way because this class knows best which UI needs * highlighted but those expanding this section know more about why and * when the affordance should be highlighted. * * @since 4.9.0 * * @return {void} */ highlightNewItemButton: function() { api.utils.highlightButton( this.contentContainer.find( '.add-new-menu-item' ), { delay: 2000 } ); } }); /** * Create a nav menu setting and section. * * @since 4.9.0 * * @param {string} [name=''] Nav menu name. * @return {wp.customize.Menus.MenuSection} Added nav menu. */ api.Menus.createNavMenu = function createNavMenu( name ) { var customizeId, placeholderId, setting; placeholderId = api.Menus.generatePlaceholderAutoIncrementId(); customizeId = 'nav_menu[' + String( placeholderId ) + ']'; // Register the menu control setting. setting = api.create( customizeId, customizeId, {}, { type: 'nav_menu', transport: api.Menus.data.settingTransport, previewer: api.previewer } ); setting.set( $.extend( {}, api.Menus.data.defaultSettingValues.nav_menu, { name: name || '' } ) ); /* * Add the menu section (and its controls). * Note that this will automatically create the required controls * inside via the Section's ready method. */ return api.section.add( new api.Menus.MenuSection( customizeId, { panel: 'nav_menus', title: displayNavMenuName( name ), customizeAction: api.Menus.data.l10n.customizingMenus, priority: 10, menu_id: placeholderId } ) ); }; /** * wp.customize.Menus.NewMenuSection * * Customizer section for new menus. * * @class wp.customize.Menus.NewMenuSection * @augments wp.customize.Section */ api.Menus.NewMenuSection = api.Section.extend(/** @lends wp.customize.Menus.NewMenuSection.prototype */{ /** * Add behaviors for the accordion section. * * @since 4.3.0 */ attachEvents: function() { var section = this, container = section.container, contentContainer = section.contentContainer, navMenuSettingPattern = /^nav_menu\[/; section.headContainer.find( '.accordion-section-title' ).replaceWith( wp.template( 'nav-menu-create-menu-section-title' ) ); /* * We have to manually handle section expanded because we do not * apply the `accordion-section-title` class to this button-driven section. */ container.on( 'click', '.customize-add-menu-button', function() { section.expand(); }); contentContainer.on( 'keydown', '.menu-name-field', function( event ) { if ( 13 === event.which ) { // Enter. section.submit(); } } ); contentContainer.on( 'click', '#customize-new-menu-submit', function( event ) { section.submit(); event.stopPropagation(); event.preventDefault(); } ); /** * Get number of non-deleted nav menus. * * @since 4.9.0 * @return {number} Count. */ function getNavMenuCount() { var count = 0; api.each( function( setting ) { if ( navMenuSettingPattern.test( setting.id ) && false !== setting.get() ) { count += 1; } } ); return count; } /** * Update visibility of notice to prompt users to create menus. * * @since 4.9.0 * @return {void} */ function updateNoticeVisibility() { container.find( '.add-new-menu-notice' ).prop( 'hidden', getNavMenuCount() > 0 ); } /** * Handle setting addition. * * @since 4.9.0 * @param {wp.customize.Setting} setting - Added setting. * @return {void} */ function addChangeEventListener( setting ) { if ( navMenuSettingPattern.test( setting.id ) ) { setting.bind( updateNoticeVisibility ); updateNoticeVisibility(); } } /** * Handle setting removal. * * @since 4.9.0 * @param {wp.customize.Setting} setting - Removed setting. * @return {void} */ function removeChangeEventListener( setting ) { if ( navMenuSettingPattern.test( setting.id ) ) { setting.unbind( updateNoticeVisibility ); updateNoticeVisibility(); } } api.each( addChangeEventListener ); api.bind( 'add', addChangeEventListener ); api.bind( 'removed', removeChangeEventListener ); updateNoticeVisibility(); api.Section.prototype.attachEvents.apply( section, arguments ); }, /** * Set up the control. * * @since 4.9.0 */ ready: function() { this.populateControls(); }, /** * Create the controls for this section. * * @since 4.9.0 */ populateControls: function() { var section = this, menuNameControlId, menuLocationsControlId, newMenuSubmitControlId, menuNameControl, menuLocationsControl, newMenuSubmitControl; menuNameControlId = section.id + '[name]'; menuNameControl = api.control( menuNameControlId ); if ( ! menuNameControl ) { menuNameControl = new api.controlConstructor.nav_menu_name( menuNameControlId, { label: api.Menus.data.l10n.menuNameLabel, description: api.Menus.data.l10n.newMenuNameDescription, section: section.id, priority: 0 } ); api.control.add( menuNameControl.id, menuNameControl ); menuNameControl.active.set( true ); } menuLocationsControlId = section.id + '[locations]'; menuLocationsControl = api.control( menuLocationsControlId ); if ( ! menuLocationsControl ) { menuLocationsControl = new api.controlConstructor.nav_menu_locations( menuLocationsControlId, { section: section.id, priority: 1, menu_id: '', isCreating: true } ); api.control.add( menuLocationsControlId, menuLocationsControl ); menuLocationsControl.active.set( true ); } newMenuSubmitControlId = section.id + '[submit]'; newMenuSubmitControl = api.control( newMenuSubmitControlId ); if ( !newMenuSubmitControl ) { newMenuSubmitControl = new api.Control( newMenuSubmitControlId, { section: section.id, priority: 1, templateId: 'nav-menu-submit-new-button' } ); api.control.add( newMenuSubmitControlId, newMenuSubmitControl ); newMenuSubmitControl.active.set( true ); } }, /** * Create the new menu with name and location supplied by the user. * * @since 4.9.0 */ submit: function() { var section = this, contentContainer = section.contentContainer, nameInput = contentContainer.find( '.menu-name-field' ).first(), name = nameInput.val(), menuSection; if ( ! name ) { nameInput.addClass( 'invalid' ); nameInput.focus(); return; } menuSection = api.Menus.createNavMenu( name ); // Clear name field. nameInput.val( '' ); nameInput.removeClass( 'invalid' ); contentContainer.find( '.assigned-menu-location input[type=checkbox]' ).each( function() { var checkbox = $( this ), navMenuLocationSetting; if ( checkbox.prop( 'checked' ) ) { navMenuLocationSetting = api( 'nav_menu_locations[' + checkbox.data( 'location-id' ) + ']' ); navMenuLocationSetting.set( menuSection.params.menu_id ); // Reset state for next new menu. checkbox.prop( 'checked', false ); } } ); wp.a11y.speak( api.Menus.data.l10n.menuAdded ); // Focus on the new menu section. menuSection.focus( { completeCallback: function() { menuSection.highlightNewItemButton(); } } ); }, /** * Select a default location. * * This method selects a single location by default so we can support * creating a menu for a specific menu location. * * @since 4.9.0 * * @param {string|null} locationId - The ID of the location to select. `null` clears all selections. * @return {void} */ selectDefaultLocation: function( locationId ) { var locationControl = api.control( this.id + '[locations]' ), locationSelections = {}; if ( locationId !== null ) { locationSelections[ locationId ] = true; } locationControl.setSelections( locationSelections ); } }); /** * wp.customize.Menus.MenuLocationControl * * Customizer control for menu locations (rendered as a ', { type: 'hidden', name: '_method', value: 'GET' } ) ); _.each( previewFrame.query, function( value, key ) { form.append( $( '', { type: 'hidden', name: key, value: value } ) ); } ); previewFrame.container.append( form ); form.trigger( 'submit' ); form.remove(); // No need to keep the form around after submitted. } previewFrame.bind( 'iframe-loading-error', function( error ) { previewFrame.iframe.remove(); // Check if the user is not logged in. if ( 0 === error ) { previewFrame.login( deferred ); return; } // Check for cheaters. if ( -1 === error ) { deferred.rejectWith( previewFrame, [ 'cheatin' ] ); return; } deferred.rejectWith( previewFrame, [ 'request failure' ] ); } ); previewFrame.iframe.one( 'load', function() { loaded = true; if ( ready ) { deferred.resolveWith( previewFrame, [ readyData ] ); } else { setTimeout( function() { deferred.rejectWith( previewFrame, [ 'ready timeout' ] ); }, previewFrame.sensitivity ); } }); }, login: function( deferred ) { var self = this, reject; reject = function() { deferred.rejectWith( self, [ 'logged out' ] ); }; if ( this.triedLogin ) { return reject(); } // Check if we have an admin cookie. $.get( api.settings.url.ajax, { action: 'logged-in' }).fail( reject ).done( function( response ) { var iframe; if ( '1' !== response ) { reject(); } iframe = $( '

    ' . sprintf( /* translators: %s: URL to create a new page. */ __( 'You can choose what’s displayed on the homepage of your site. It can be posts in reverse chronological order (classic blog), or a fixed/static page. To set a static homepage, you first need to create two Pages. One will become the homepage, and the other will be where your posts are displayed.' ), 'post-new.php?post_type=page' ) . '