ggthemes/0000755000176200001440000000000014002057473012057 5ustar liggesusersggthemes/NAMESPACE0000644000176200001440000001123314001707037013273 0ustar liggesusers# Generated by roxygen2: do not edit by hand export(GeomRangeFrame) export(GeomTufteboxplot) export(StatFivenumber) export(bank_slopes) export(calc_pal) export(calc_shape_pal) export(canva_pal) export(circlefill_shape_pal) export(cleveland_shape_pal) export(colorblind_pal) export(economist_pal) export(excel_new_pal) export(excel_pal) export(extended_range_breaks) export(extended_range_breaks_) export(few_pal) export(few_shape_pal) export(fivethirtyeight_pal) export(gdocs_pal) export(geom_rangeframe) export(geom_tufteboxplot) export(hc_pal) export(palette_pander) export(ptol_pal) export(scale_color_calc) export(scale_color_canva) export(scale_color_colorblind) export(scale_color_continuous_tableau) export(scale_color_economist) export(scale_color_excel) export(scale_color_excel_new) export(scale_color_few) export(scale_color_fivethirtyeight) export(scale_color_gdocs) export(scale_color_gradient2_tableau) export(scale_color_gradient_tableau) export(scale_color_hc) export(scale_color_pander) export(scale_color_ptol) export(scale_color_solarized) export(scale_color_stata) export(scale_color_tableau) export(scale_color_wsj) export(scale_colour_calc) export(scale_colour_canva) export(scale_colour_colorblind) export(scale_colour_economist) export(scale_colour_excel) export(scale_colour_excel_new) export(scale_colour_few) export(scale_colour_fivethirtyeight) export(scale_colour_gdocs) export(scale_colour_gradient2_tableau) export(scale_colour_gradient_tableau) export(scale_colour_hc) export(scale_colour_pander) export(scale_colour_ptol) export(scale_colour_solarized) export(scale_colour_stata) export(scale_colour_tableau) export(scale_colour_wsj) export(scale_fill_calc) export(scale_fill_canva) export(scale_fill_colorblind) export(scale_fill_continuous_tableau) export(scale_fill_economist) export(scale_fill_excel) export(scale_fill_excel_new) export(scale_fill_few) export(scale_fill_fivethirtyeight) export(scale_fill_gdocs) export(scale_fill_gradient2_tableau) export(scale_fill_gradient_tableau) export(scale_fill_hc) export(scale_fill_pander) export(scale_fill_ptol) export(scale_fill_solarized) export(scale_fill_stata) export(scale_fill_tableau) export(scale_fill_wsj) export(scale_linetype_stata) export(scale_shape_calc) export(scale_shape_circlefill) export(scale_shape_cleveland) export(scale_shape_few) export(scale_shape_stata) export(scale_shape_tableau) export(scale_shape_tremmel) export(show_linetypes) export(show_shapes) export(smart_digits) export(smart_digits_format) export(solarized_pal) export(stat_fivenumber) export(stata_linetype_pal) export(stata_pal) export(stata_shape_pal) export(tableau_color_pal) export(tableau_div_gradient_pal) export(tableau_gradient_pal) export(tableau_seq_gradient_pal) export(tableau_shape_pal) export(theme_base) export(theme_calc) export(theme_clean) export(theme_economist) export(theme_economist_white) export(theme_excel) export(theme_excel_new) export(theme_few) export(theme_fivethirtyeight) export(theme_foundation) export(theme_gdocs) export(theme_hc) export(theme_igray) export(theme_map) export(theme_pander) export(theme_par) export(theme_solarized) export(theme_solarized_2) export(theme_solid) export(theme_stata) export(theme_tufte) export(theme_wsj) export(tremmel_shape_pal) export(wsj_pal) importFrom(ggplot2,"%+replace%") importFrom(ggplot2,Geom) importFrom(ggplot2,GeomBoxplot) importFrom(ggplot2,GeomPoint) importFrom(ggplot2,GeomSegment) importFrom(ggplot2,aes) importFrom(ggplot2,continuous_scale) importFrom(ggplot2,discrete_scale) importFrom(ggplot2,draw_key_path) importFrom(ggplot2,draw_key_pointrange) importFrom(ggplot2,element_blank) importFrom(ggplot2,element_line) importFrom(ggplot2,element_rect) importFrom(ggplot2,element_text) importFrom(ggplot2,ggplot) importFrom(ggplot2,ggproto) importFrom(ggplot2,ggproto_parent) importFrom(ggplot2,layer) importFrom(ggplot2,margin) importFrom(ggplot2,rel) importFrom(ggplot2,remove_missing) importFrom(ggplot2,resolution) importFrom(ggplot2,theme) importFrom(ggplot2,theme_bw) importFrom(ggplot2,theme_gray) importFrom(ggplot2,theme_grey) importFrom(graphics,abline) importFrom(graphics,axis) importFrom(graphics,par) importFrom(graphics,plot) importFrom(graphics,points) importFrom(graphics,text) importFrom(grid,gList) importFrom(grid,gTree) importFrom(grid,gpar) importFrom(grid,grobName) importFrom(grid,grobTree) importFrom(grid,segmentsGrob) importFrom(grid,unit) importFrom(methods,as) importFrom(methods,hasArg) importFrom(purrr,map) importFrom(purrr,map_dfr) importFrom(scales,alpha) importFrom(scales,div_gradient_pal) importFrom(scales,manual_pal) importFrom(scales,seq_gradient_pal) importFrom(stringr,str_c) importFrom(stringr,str_replace) importFrom(tibble,as_tibble) importFrom(tibble,deframe) ggthemes/data/0000755000176200001440000000000013774436615013006 5ustar liggesusersggthemes/data/ggthemes_data.rda0000644000176200001440000003111614001707134016251 0ustar liggesusersBZh91AY&SYRzd{_P~7=۝bNJ!|_tRJѠ4(T@QFQ$9;ym]}t+mշ79rg'nUY63[_N! bcM4M2ji@@GhQ5<4CF#M F@ S 5122~i3Ph@d$DMЩʏMHѳH4&!@h2444CL(4jFS S<)Si4eC=4@D=@i4S  MFi&SSF4 P FF@ 6(c|ȅ [FQ̀ڈBےD/* ^̂-ȉN>mn.BoT*"#RʠTB¨Tce*X"Dt>%LH(D eE@#m.>w3Z}=|<F MٚMGcTN_Pf+԰[Z|EGG3O<ľZ<`2bd7 ` a4c{+_s"ts'ةgnr*9jWaz懈r`8_-p>ϜW\v @Z?p0vG(P`sO,0Hؒj;EIfFJI.G5B c7=>C?ΡaϔTb n~bF,S@;xY"PLP4-mxhqԨu{" HŃf% KA3g@.)K4$R:|FqaBaDEY DklbuY5v5ͮ{E;if숦;':/gڱ" =1G4pEX}T5Cb)J# ( /&0p]AwJŻR1d>5g^|{οC |̴|IeaFSt;;HT(f^u'9[82Dx?\x׾, #$4yE: } 5ɩѽH%k;?:FL,km=O"&3)n+l.v;Lh*V ~_GñZ`QO ?ŝ?~&q~&{|{< g#| Ya;t|NCAb9xa#^^*o.r pQA;lXIn׸s//{{jVC`KDW6>/-"[˩V0nk/!Mp0;ffdfumF{!`-oMX()|mt*mda$6F"* ,k!63;MQPrUF:E!H7هv\7Tb^?>|M*uCN2Tr윍Q|Tꗬhȣ;&*_Ɔ8ycw  )"ĄB"H&ezճ+k6 '1ŔֱQ 3y~N'+mH"{ѽkR7uƸtzYԄ36]2Ecl-f[L) r]|.@B J[x1n}پ/e|ۉ6aQR5N9C%pJNg&*I`P덑vpo55\<6-lkŏKcf7IciLs IGδHLP 3Y^wJ5TٛVSrXh6Kj|>ԱKJ-6 #2Om5z'rw֦맴kne=׫H?|uR*t%UXy6ZQ3S0? +K"Ŀ\s-FSuvѽN<0*j .k2K wh3O rl{(?LJ~)uN1ѯz9%?ͦ/ȟW[]hr܊:7,{ 33 .r߽wL_dH7~֗Lz&i$^a M#mVieU.Ei-DI&/<.4( }M_ .M=?19P. m6u^kϘ vˡ<}\TJL^ܸiӿCZa)e{ܽ*ٸk̛ )pwKD{[8O``&0Bk:_$2!TZ&[WsȀ)Dêkb",RVKN!*5=()QE@Ɠh%~.m$x}3ye@3.9B@[$qz2 +Åm 6Y3P丕CHȃ'>ۇm ʱj hLo7zHPb䐃#};'6; ns}(q!K1*A!nL@Xc5G+Ђay}'&ewa?n} tҡL=sE"Yj7?AxgB2Sӈh⺋%5we@@]!ŬؿHuTYɁb x bQ7(.Hr-fV9P 87T.^.i 0lTve-8 o睒V͌У(J&1Ր˔K ȋZ]\VM1ceaɊ DY%op (ڐ e,LGca}7[솆 |´K;m30x jx*yB(a5a5lpLX.]-ڶ""w Ç,Ռ 7ÏHlMΙM~[\9ǜf;p~fF8ٕw)Xshv'yiQ&G>ŸxJ zA2/ݪfBh:1>w"a3 NR tqQ\rQiX{1, C2o 't߀jF^#φPBl6Ymҁ{;94J5^҂ –|R=oMM  >Y]Z _kmD;HQkV0dfDQX"SqzԂ6Leé8Wl7F`+e2ҸTݱgJ@BtՎFuyCO\>mZg7ѿg7x@ [qK!d!FҶ˼nDCQfϹ ށ>xl{hߤ.YgĪϵY~1[%o{OShXAd @*0{ɮu׫"흡i sOlkѰ)m#Huz瘊 >xC)N![ȅ@#$xIꃞN4o{of( R!PG ՠnR%DƷ9d1Gkr*"s$[o]zigH1lD+#4n p)uyMڄP ޔ*\KsvaToےժ0J?pzlۡμ(3NFB0FyTE/ 'zT}}& 14ߎ*5yU! p{1m_k Ѐ nd'%F }Z;tca:rnhϻv9Fiyl 5d_wVf3bz'GM & PsD~7TZMc9s>_xs5P$Δ[mF% c*Zyd7bS]O 9=| hDMK2qdtBOVՑ#55|Ѳ=m ,upakH>'nad.0Pd("ź :kjX͔H:S#07PK  "8CAW p-fd^ҐXT;:Ădl`c\x:Ό(cWXypf۽Xt}Xia /+UnW!MǪɛF<,7tijkApF &\*\PQ8`^Gu3"Sk\Xcf % " q&v֫3uB۪g4{zs.LLiISX6d]}uT9E&55](]mT c#"C,MCArP6 [mM,{4#(a˝ʼw [Nn"Wlӻ cDR>Zތg8sK9WyhZ%i:EmnsCe")h8jI_`֪w<)5>}x-jH-;n"YnbΓ)\,I PYھLbDQ(y9枣ɺ\5D1DQ0zv29]l#>P.^ڨ]DҤa pD6l^)|6lo:=".G̶8+;V!qK[+a; I˜yN̹@Jm%"Վ]3A9O:1GtC5*Rĩ"%_\Yq1Iǡ##NNuܒ𜏇F,gP W^3J t}  ǃ#tP+TƑ6)} d6,'}ҍ׸$$)d1ڄez}x9q-t0@/VlMo i1ܬb eV4k}@jٌw}= 2@F,lBA! 1@! 1zV+5MԏS@7 …JRr@$7m͟B}תXK!zpNqk#W5a)Ae2; ͣ+55jgG! 3bD>C{fY0r0TV>FYzAGQ.{ !NT(7T|Upf q13 #ēڮXҡe0lDCA ݧQRa&j.X k280$qEҩv [wǑV׍hys"rdxHc u I Hl[zA2n!ΊL SiN]0ax(v7-u5%mٷ3JMƍ{IA!T բGT\&w[$*\U܆/A#O4 q{wnUjRjgDRIk]H}bZq.[=Dn1$0%obnU D.h`޴Le%F.xË bif|@+ƱI[((^٠h-&EA@"K -0ws:]7u)i lkZ^B[Mn:W,N9ͬ)cRaF8L"!wճocס!VAXV`i}yOE*\D hQ0ϻ[جGq[I#Y !'&d;bl4|+(F)zFD"K` R I7uz8>0ޢg 1Hr^6}:Os=ԁUTW^8"u0Rz8%zVCLk3T^\E*`JTw]ܵ UDTD\FS5 |hle_vK~R3/AZ>dHS4z #Q䗲Cs fih#|$:oMHC_=>뻯zK*cm)LD '۸e#~!zcɞB.B'h/Dfucu+`Y1!\`rh:lD pxu^M6ĚICw!2c n d8`(q2.4y,rn`;4g`I7́T5%塹Gp\!kIZ"-pqKC ]O1Ƹ hmf& bʏ5&etEZb(AV٘ Z d(BBk)\w"σ>@惂cGط;9q0˰lĴ1%Q$0E]DegѠH;G@V0zYitBhڹ6m6ZI闋̅,VqmڸWb+׍յ&mHcl a`*˭%N؀>A%zI-RĐP3?;;\Qx)i\# KZ^崺4&]kÐyFCdrIG|53[{#"RAi8h"DĀH!V~ Clik. g )p|E0i$q@n 0[l p]+h$4soqyqAlg#G H޶./cdU˽>8z+I49nanWa\Wsp9DӅ$‡7 ߍCPl ;bPt%@KI`A/&C攴^ rs `gni| uCxL8"nj/|. !VJljBF/)Z%$Fo$@пrGIlӃ,3<0h ɛZ 6XNykاs\H]"d/ќ+ku뿞Fzح8k c#5ĸ!ŁS2į4#BDʅ`P>5mO2Zz ": .j+XȀ.L:l͒ UKG NsNo{Cf5͞j 懲RLZԒ -t=x[=WˮWΟpc'9X(>[hܦȗHe4nhK4$l/p@6twQqJd|"Jc묂hHi=j2_$xQֶ\-XnH$=az%IT: ul-rSrЧ*^ǚ'w]vmiV <3s["q "o_&DH`Ǵ1֦CQ=N!0hj`[n+*Dg!JA17@=fn4OZҎ`'V>h= 0sm9h#D-SəH VFRis\"8K;171T5p@""Ȯ%elF7Z)ӏOL)L[IA^Kh > &xR (&Q0"M\\EXaUtT!Вais1Z8^+执.1bd',B`wiZ|LXAG)"jh7ht }J=v'.y#C8BHP==/(Haz69]ATAbȒ+&fZɩŒ,bM ș @M 4 4U͊WSh4h { W!Wqݍix`r1/Yf`8;G-itr X`dAK`#y< FA`,ň@% 6mEy$Yb4w_ vbI,H˒cs QM/#5VͶhVT%.!cD&d8 ZPb tR X,${t pBZ@P(@! +.L^![km[(ܒ9gFo[mbD̽ D 4c./%zTK0.OŤ] h{$Ua& ccccL`Б&splȺ7$U|M/@_\ǣ :յ +h,pP7ƺy ā# H 6Qɞ<^iYhH*DF"Ȥ+V85œ v~c4i&TH'r!dT*v>D}Cl5t^mzpI))XޫɢgyP![f^ 3},HHLsb7) @1%&N8 *UfM U ~T3Nkg vkECong͊03pV\xP⃡KQsYtxDd 6L916%Q.(A[vR"!6xZB"l[sUPUw;1<ti!eB|hڇ"5O ?̰~9¢$"ޡB0| fs\dO"L'"Ôׁ|M{O^fL}زX!;jV".$Fa[UvP".EX nQ\A/(PJ_|K8w1qVpn$ÿ'o|8=>=gHv!9rWYuD5 5- >-4RstH"M+%^ ˻f )sH;˅l:dݩ3ʨP^jV,.zY-.E^oe0R5lHcZpAH'I ݑ4NӶ](d=Kژ R5]L |tՎ)%Spk:8AҔ,eBy ?S&z9iJ`Ga#1WƎ:bNT;XJ;X¶hg"J1"i r Z$*dAp!axQ IE` @mpE 'l$1,>jZUHVnkv1 ɅN*ug!gk8}G 7kHLGBHHԬTub"gњgFjTH1Yth@el\b6GB42BPo-AR*(^vDK\Dn}ZdffNFb3Vǰ4d 93P$pO1kNqQ:pkb SfUR.L>w5f͗` Mpfvmr}B:PI2⭁)|A%oxdDzwHA§]X46%g N0G$aB)E۸ #@4pX%[;NT,u> Gu!ũ `dcTS1fmHV^$t!x]˧}T"&_BND%MSTDKMa"1`g  `PI8-.x2PR^2iE ڻVv# D'qUt]#L\de N AY"rc>f Mh:eޢJ[N@So.Cu:q=@!U;u-x"IZԨHJ'r=$4>dڸ0i΁H^.Au4Z`eLڙ<:† #zRdJ6'щ> ICu:ZmnuE%!<(=93ftD"gt!t9hDGcL)ȇӖRw ӄ?:|q&1 yAa[< LAul,Czxp*b3q1J-ڴOKKJDelyN /,kQ o"#DfIh>HY7f>* S4nT;cif~ vOLUFR|^&6|j;vR Z OCamϢӶ:  NYe pޅ>  IgI\BƕTo[|p D$":0ELuEH`L! I!Gp<y护⌆)!&I:GU\k(7E\,!L Umwب"fXPbAeI234(\tCC O3 | 'W30 ,Α1tr{ѥVcKQ o4;gff1'H%ITeRekp[L00*:c >x߄>ot\SN.uIaY# I0uYRpZ޴] Ca6xdYa֝t2h껝sdlUZ# DU̵ρt-ǩr4bb&SE¶ @T+94t&-)EKcQl{fg4o/?8%>j )e$G)S9'2pYA@N-z+7Fɔ#i3my&dE~E:-* iϑ1k@:y2OJGA&'EںAh%NG32_К](V-4uADG2,&BS6_t0~QBh|S[M{TGKcN2EFIa}{,4,F2ZWFdKZc>p^GPZ(Z./ld RNj,P1b&#Y)bGx=W˘2y&%*yH+yz%B6Dfv,@$LQ^<\jx 3:n>ڳxN@V$9s10DGK6/뽙YNZ"Җ 9QH0d~Z\dOK^"˯D6 u+ޝTJWfŽn9H: 9k $gU&S<8{й 5f:q!f~c Z؊t~ aaf~ TKes?X@730Qy\wBA!l:B'f$ic!MH32wVt|YɅMMB^n-Ȏќ/㟖!aγ q5P[n~ZثOy'yܮ]ùyهsojT>!8ǧ^-U=fNu! >ۻq`_=/!pa/7e0NAKE^i cÐҷ'IR6Z/7bQ8g5ëwio\Xv=lǃv|A! >H,}Bu:-3覾թN]_-u=_ISIGp2$YkF7}Zι#/}So?wqZM_CN`ݏIX"pI9(ѯ8T}Ҥ@)VPުĽJPhݿ:Ǟ m'1?:ozF/bl o#]#qwO+qJzٓ|cbJxRF>cF?x {ie/^mw(? 9OLB:; A ߋG(6ggthemes/man/0000755000176200001440000000000013774436616012651 5ustar liggesusersggthemes/man/scale_few.Rd0000644000176200001440000000651613774436616015100 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/few.R \name{scale_colour_few} \alias{scale_colour_few} \alias{scale_color_few} \alias{scale_fill_few} \title{Color scales from Few's "Practical Rules for Using Color in Charts"} \usage{ scale_colour_few(palette = "Medium", ...) scale_color_few(palette = "Medium", ...) scale_fill_few(palette = "Light", ...) } \arguments{ \item{palette}{One of \Sexpr[results=rd]{names(ggthemes:::rd_optlist(ggthemes::ggthemes_data$few$colors))}} \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item A function that takes the breaks as input and returns labels as output }} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ See \code{\link{few_pal}()}. } \seealso{ Other colour few: \code{\link{few_pal}()} } \concept{colour few} ggthemes/man/hc_pal.Rd0000644000176200001440000000125613775062406014363 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/hc.R \name{hc_pal} \alias{hc_pal} \title{Highcharts color palette (discrete)} \usage{ hc_pal(palette = "default") } \arguments{ \item{palette}{\code{character} The name of the Highcharts theme to use.} } \description{ The Highcharts uses many different color palettes in its plots. This collects a few of them. } \section{Palettes}{ The following palettes are defined, \itemize{ \item{\href{https://www.highcharts.com/demo}{default}} \item{\href{https://www.highcharts.com/demo/line-basic/dark-unica}{dark-unica}} } } \seealso{ Other colour hc: \code{\link{scale_colour_hc}()} } \concept{colour hc} ggthemes/man/theme_clean.Rd0000644000176200001440000000153213774436616015405 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/clean.R \name{theme_clean} \alias{theme_clean} \title{Clean ggplot theme} \usage{ theme_clean(base_size = 12, base_family = "sans") } \arguments{ \item{base_size}{Base font size.} \item{base_family}{Base font family.} } \description{ Clean ggplot theme with no panel background, black axis lines and grey fill colour for chart elements. } \examples{ library("ggplot2") p <- ggplot(mtcars, aes(x = wt, y = mpg, colour = factor(gear))) + geom_point() + facet_wrap(~am) + geom_smooth(method = "lm", se = FALSE) + theme_clean() p } \seealso{ Other themes: \code{\link{theme_base}()}, \code{\link{theme_foundation}()}, \code{\link{theme_igray}()}, \code{\link{theme_par}()}, \code{\link{theme_solid}()} } \author{ Konrad Zdeb \email{name.surname@me.com} } \concept{themes} ggthemes/man/theme_calc.Rd0000644000176200001440000000133113774436616015222 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/calc.R \name{theme_calc} \alias{theme_calc} \title{Theme Calc} \usage{ theme_calc(base_size = 10, base_family = "sans") } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} } \description{ Theme similar to the default settings of LibreOffice Calc charts. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) + theme_calc() p + scale_color_calc() q <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, shape = factor(gear))) + facet_wrap(~am) + theme_calc() q + scale_shape_calc() } \concept{themes calc} ggthemes/man/theme_solarized.Rd0000644000176200001440000000272513774461466016325 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/solarized.R \name{theme_solarized} \alias{theme_solarized} \alias{theme_solarized_2} \title{ggplot color themes based on the Solarized palette} \usage{ theme_solarized(base_size = 12, base_family = "", light = TRUE) theme_solarized_2(base_size = 12, base_family = "", light = TRUE) } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} \item{light}{\code{logical}. Light or dark theme?} } \description{ See \url{https://ethanschoonover.com/solarized/} for a description of the Solarized palette. } \details{ Plots made with this theme integrate seamlessly with the Solarized Beamer color theme. \url{https://github.com/jrnold/beamercolorthemesolarized}. There are two variations: \code{theme_solarized} is similar to to \code{\link[ggplot2]{theme_bw}()}, while \code{theme_solarized_2()} is similar to \code{\link[ggplot2]{theme_gray}()}. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) # Light version with different main accent colors for (accent in names(ggthemes::ggthemes_data[["solarized"]][["accents"]])) { print(p + theme_solarized() + scale_colour_solarized(accent)) } # Dark version p + theme_solarized(light = FALSE) + scale_colour_solarized("blue") # Alternative theme p + theme_solarized_2(light = FALSE) + scale_colour_solarized("blue") } \concept{themes solarized} ggthemes/man/tremmel_shape_pal.Rd0000644000176200001440000000310613777476671016631 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/shapes.R \name{tremmel_shape_pal} \alias{tremmel_shape_pal} \title{Shape palette from Tremmel (1995) (discrete)} \usage{ tremmel_shape_pal(overlap = FALSE, alt = FALSE, n3alt = NULL) } \arguments{ \item{overlap}{use an empty circle instead of a solid circle when \code{n == 2}.} \item{alt, n3alt}{If \code{TRUE}, then when \code{n == 3}, use a solid circle, plus sign and empty triangle. Otherwise use a solid circle, empty circle, and empty triangle.} } \description{ Based on experiments Tremmel (1995) suggests the following shape palettes: } \details{ If two symbols, then use a solid circle and plus sign. If three symbols, then use a solid circle, empty circle, and an empty triangle. However, that set of symbols does not satisfy the requirement that each symbol should differ from the other symbols in the same feature dimension. A set of three symbols that satisfies this is a circle (curvature), plus sign (number of terminators), triangle (line orientation). This palette supports up to three values. If more than three groups of data, then separate the groups into different plots. } \references{ Tremmel, Lothar, (1995) "The Visual Separability of Plotting Symbols in Scatterplots" Journal of Computational and Graphical Statistics, \url{https://www.jstor.org/stable/1390760} } \seealso{ Other shapes: \code{\link{circlefill_shape_pal}()}, \code{\link{cleveland_shape_pal}()}, \code{\link{scale_shape_circlefill}()}, \code{\link{scale_shape_cleveland}()}, \code{\link{scale_shape_tremmel}()} } \concept{shapes} ggthemes/man/excel_pal.Rd0000644000176200001440000000144313774436616015076 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/excel.R \name{excel_pal} \alias{excel_pal} \title{Excel 97 ugly color palettes (discrete)} \usage{ excel_pal(line = TRUE) } \arguments{ \item{line}{If \code{TRUE}, use the palette for lines and points. Otherwise, use the palette for area.} } \description{ The color palettes used in Microsoft Excel 97 (and up until Excel 2007). Use this for that classic ugly look and feel. For ironic purposes only. 3D bars and pies not included. Please never use this color palette. } \examples{ library("scales") show_col(excel_pal()(7)) show_col(excel_pal(line = FALSE)(7)) } \seealso{ Other colour excel: \code{\link{excel_new_pal}()}, \code{\link{scale_colour_excel_new}()}, \code{\link{scale_fill_excel}()} } \concept{colour excel} ggthemes/man/stata_linetype_pal.Rd0000644000176200001440000000071513774436616017024 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stata.R \name{stata_linetype_pal} \alias{stata_linetype_pal} \title{Stata linetype palette (discrete)} \usage{ stata_linetype_pal() } \description{ Linetype palette based on the linepattern scheme in Stata. This palette supports up to 15 values. } \seealso{ \code{\link{scale_linetype_stata}()} Other linetype stata: \code{\link{scale_linetype_stata}()} } \concept{linetype stata} ggthemes/man/theme_wsj.Rd0000644000176200001440000000211313774436616015122 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/wsj.R \name{theme_wsj} \alias{theme_wsj} \title{Wall Street Journal theme} \usage{ theme_wsj( base_size = 12, color = "brown", base_family = "sans", title_family = "mono" ) } \arguments{ \item{base_size}{base font size, given in pts.} \item{color}{The background color of plot. One of \code{'brown', 'gray', 'green', 'blue'}.} \item{base_family}{base font family} \item{title_family}{Plot title font family.} } \description{ Theme based on the plots in \emph{The Wall Street Journal}. } \details{ This theme should be used with \code{\link{scale_color_wsj}()}. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) + ggtitle("Diamond Prices") p + scale_colour_wsj("colors6", "") + theme_wsj() # Use a gray background instead p + scale_colour_wsj("colors6", "") + theme_wsj(color = "gray") } \references{ \url{https://twitter.com/WSJGraphics} \url{https://pinterest.com/wsjgraphics/wsj-graphics/} } \concept{themes wsj} ggthemes/man/excel_new_pal.Rd0000644000176200001440000000155613774436616015754 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/excel.R \name{excel_new_pal} \alias{excel_new_pal} \title{Excel (current versions) color palettes (discrete)} \usage{ excel_new_pal(theme = "Office Theme") } \arguments{ \item{theme}{The name of the Office theme or color theme (not to be confused with ggplot2 themes) from which to derive the color palette. Available themes include: \Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$excel$themes))}} } \description{ Color palettes used by current versions of Microsoft Office and Excel. } \examples{ library("scales") for (i in names(ggthemes::ggthemes_data$excel$palettes)) { show_col(excel_new_pal(theme = i))(6) } } \seealso{ Other colour excel: \code{\link{excel_pal}()}, \code{\link{scale_colour_excel_new}()}, \code{\link{scale_fill_excel}()} } \concept{colour excel} ggthemes/man/bank_slopes.Rd0000644000176200001440000000663713774436616015454 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/banking.R \name{bank_slopes} \alias{bank_slopes} \title{Bank Slopes to 45 degrees} \usage{ bank_slopes(x, y, cull = FALSE, weight = NULL, method = c("ms", "as"), ...) } \arguments{ \item{x}{x values} \item{y}{y values} \item{cull}{\code{logical}. Remove all slopes of 0 or \code{Inf}.} \item{weight}{No longer used, but kept for backwards compatibility.} \item{method}{One of 'ms' (Median Absolute Slope) or 'as' (Average Absolute Slope). Other options are no longer supported, and will use 'ms' instead with a warning.} \item{...}{No longer used, but kept for backwards compatibility.} } \value{ \code{numeric} The aspect ratio (x , y). } \description{ Calculate the optimal aspect ratio of a line graph by banking the slopes to 45 degrees as suggested by W.S. Cleveland. This maximizes the ability to visually differentiate differences in slope. This function will calculate the optimal aspect ratio for a line plot using any of the methods described in Herr and Argwala (2006). In their review of the methods they suggest using median absolute slope banking ('ms'), which produces aspect ratios which are generally the median of the various methods provided here. } \section{Methods}{ As written, all of these methods calculate the aspect ratio (x /y), but \code{bank_slopes} will return (y / x) to be compatible with \code{link[ggplot2]{coord_fixed()}}. \strong{Median Absolute Slopes Banking} Let the aspect ratio be \eqn{\alpha = \frac{w}{h}}{alpha = w / h} then the median absolute slop banking is the \eqn{\alpha}{alpha} such that, \deqn{ median \left| \frac{s_i}{\alpha} \right| = 1 }{ median |s_i / alpha| } Let \eqn{R_z = z_{max} - z_{min}}{R_z = z_max - z_min} for \eqn{z = x, y}, and \eqn{M = median \| s_i \|}{M = median | s_i |}. Then, \deqn{ \alpha = M \frac{R_x}{R_y} }{ alpha = M R_x / R_y } \strong{Average Absolute Slope Banking} Let the aspect ratio be \eqn{\alpha = \frac{w}{h}}{alpha = w/h}. then the mean absolute slope banking is the \eqn{\alpha}{alpha} such that, \deqn{ mean \left| \frac{s_i}{\alpha} \right| = 1 }{ mean |s_i / alpha| = 1 } Heer and Agrawala (2006) and Cleveland discuss several other methods including average (weighted) orientation, and global and local orientation resolution. These are no longer implemented in this function. In general, either the median or average absolute slopes will produce reasonable results without requiring optimization. } \examples{ library("ggplot2") # Use the classic sunspot data from Cleveland's original paper x <- seq_along(sunspot.year) y <- as.numeric(sunspot.year) # Without banking m <- ggplot(data.frame(x = x, y = y), aes(x = x, y = y)) + geom_line() m ## Using the default method, Median Absolute Slope ratio <- bank_slopes(x, y) m + coord_fixed(ratio = ratio) ## Using culling ## Average Absolute Slope bank_slopes(x, y, method = "as") } \references{ Cleveland, W. S., M. E. McGill, and R. McGill. The Shape Parameter of a Two-Variable Graph. Journal of the American Statistical Association, 83:289-300, 1988 Heer, Jeffrey and Maneesh Agrawala, 2006. 'Multi-Scale Banking to 45' IEEE Transactions On Visualization And Computer Graphics. Cleveland, W. S. 1993. 'A Model for Studying Display Methods of Statistical Graphs.' Journal of Computational and Statistical Graphics. Cleveland, W. S. 1994. The Elements of Graphing Data, Revised Edition. } \seealso{ \code{\link[lattice]{banking}()} } ggthemes/man/scale_shape_tableau.Rd0000644000176200001440000000554113774436616017111 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tableau.R \name{scale_shape_tableau} \alias{scale_shape_tableau} \title{Tableau shape scales} \usage{ scale_shape_tableau(palette = "default", ...) } \arguments{ \item{palette}{Palette name.} \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{na.value}}{If \code{na.translate = TRUE}, what aesthetic value should the missing values be displayed as? Does not apply to position scales where \code{NA} is always placed at the far right.} \item{\code{aesthetics}}{The names of the aesthetics that this scale works with.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item A function that takes the breaks as input and returns labels as output }} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ See \code{\link{tableau_shape_pal}()} for details. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, shape = factor(gear))) + facet_wrap(~am) p + scale_shape_tableau() } \seealso{ Other shape tableau: \code{\link{tableau_shape_pal}()} } \concept{shape tableau} ggthemes/man/scale_shape_calc.Rd0000644000176200001440000000523113774436616016372 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/calc.R \name{scale_shape_calc} \alias{scale_shape_calc} \title{Calc shape scale} \usage{ scale_shape_calc(...) } \arguments{ \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{na.value}}{If \code{na.translate = TRUE}, what aesthetic value should the missing values be displayed as? Does not apply to position scales where \code{NA} is always placed at the far right.} \item{\code{aesthetics}}{The names of the aesthetics that this scale works with.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item A function that takes the breaks as input and returns labels as output }} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ See \code{\link{calc_shape_pal}()} for details. } \seealso{ \code{\link{theme_calc}()} for examples. Other shapes calc: \code{\link{calc_shape_pal}()} } \concept{shapes calc} ggthemes/man/theme_solid.Rd0000644000176200001440000000167313774436616015443 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/theme-solid.R \name{theme_solid} \alias{theme_solid} \title{Theme with nothing other than a background color} \usage{ theme_solid(base_size = 12, base_family = "", fill = NA) } \arguments{ \item{base_size}{Base font size.} \item{base_family}{Ignored, kept for consistency with \code{\link{theme}()}.} \item{fill}{Background color of the plot.} } \description{ Theme that removes all non-geom elements (lines, text, etc), This theme is when only the geometric objects are desired. } \examples{ library("ggplot2") ggplot(mtcars, aes(wt, mpg)) + geom_point() + theme_solid(fill = "white") ggplot(mtcars, aes(wt, mpg)) + geom_point(color = "white") + theme_solid(fill = "black") } \seealso{ Other themes: \code{\link{theme_base}()}, \code{\link{theme_clean}()}, \code{\link{theme_foundation}()}, \code{\link{theme_igray}()}, \code{\link{theme_par}()} } \concept{themes} ggthemes/man/tableau_shape_pal.Rd0000644000176200001440000000200213774461466016564 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tableau.R \name{tableau_shape_pal} \alias{tableau_shape_pal} \title{Tableau Shape Palettes (discrete)} \usage{ tableau_shape_pal(palette = c("default", "filled", "proportions")) } \arguments{ \item{palette}{Palette name.} } \description{ Shape palettes used by \href{https://www.tableau.com/}{Tableau}. } \details{ Not all shape palettes in Tableau are supported. Additionally, these palettes are not exact, and use the best unicode character for the shape palette. Since these palettes use unicode characters, their look may depend on the font being used, and not all characters may be available. Shape palettes in Tableau are used to expose images for use a markers in charts, and thus are sometimes groupings of closely related symbols. } \examples{ \dontrun{ # need to set a font containing these values show_shapes(tableau_shape_pal()(5)) } } \seealso{ Other shape tableau: \code{\link{scale_shape_tableau}()} } \concept{shape tableau} ggthemes/man/theme_economist.Rd0000644000176200001440000000532213774462557016327 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/economist.R \name{theme_economist} \alias{theme_economist} \alias{theme_economist_white} \title{ggplot color theme based on the Economist} \usage{ theme_economist( base_size = 10, base_family = "sans", horizontal = TRUE, dkpanel = FALSE ) theme_economist_white( base_size = 11, base_family = "sans", gray_bg = TRUE, horizontal = TRUE ) } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} \item{horizontal}{\code{logical} Horizontal axis lines?} \item{dkpanel}{\code{logical} Darker background for panel region?} \item{gray_bg}{\code{logical} If \code{TRUE}, use gray background, else use white background.} } \value{ An object of class \code{\link[ggplot2]{theme}()}. } \description{ A theme that approximates the style of \emph{The Economist}. } \details{ \code{theme_economist} implements the standard bluish-gray background theme in the print \emph{The Economist} and \href{https://www.economist.com/}{economist.com}. \code{theme_economist_white} implements a variant with a while panel and light gray (or white) background often used by \emph{The Economist} blog \href{https://www.economist.com/blogs/graphicdetail}{Graphic Detail}. Use \code{\link{scale_color_economist}()} with this theme. The x axis should be displayed on the right hand side. \emph{The Economist} uses "ITC Officina Sans" as its font for graphs. If you have access to this font, you can use it with the \pkg{extrafont} package. "Verdana" is a good substitute. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) + # Economist puts x-axis labels on the right-hand side scale_y_continuous(position = "right") ## Standard p + theme_economist() + scale_colour_economist() # Change axis lines to vertical p + theme_economist(horizontal = FALSE) + scale_colour_economist() + coord_flip() ## White panel/light gray background p + theme_economist_white() + scale_colour_economist() ## All white variant p + theme_economist_white(gray_bg = FALSE) + scale_colour_economist() \dontrun{ ## The Economist uses ITC Officina Sans library("extrafont") p + theme_economist(base_family="ITC Officina Sans") + scale_colour_economist() ## Verdana is a widely available substitute p + theme_economist(base_family="Verdana") + scale_colour_economist() } } \references{ \itemize{ \item \href{https://www.economist.com/}{The Economist} \item \href{https://spiekermann.com/en/itc-officina-display/}{Spiekerblog, "ITC Officina Display", January 1, 2007.} \item \url{https://www.economist.com/help/about-us} } } \concept{themes economist} ggthemes/man/calc_pal.Rd0000644000176200001440000000062213774436616014676 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/calc.R \name{calc_pal} \alias{calc_pal} \title{Calc color palette (discrete)} \usage{ calc_pal() } \description{ Color palettes from LibreOffice Calc. This palette has 12 values. } \examples{ library("scales") show_col(calc_pal()(12)) } \seealso{ Other colour calc: \code{\link{scale_fill_calc}()} } \concept{colour calc} ggthemes/man/scale_shape_stata.Rd0000644000176200001440000000535013774436616016606 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stata.R \name{scale_shape_stata} \alias{scale_shape_stata} \title{Stata shape scale} \usage{ scale_shape_stata(...) } \arguments{ \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{na.value}}{If \code{na.translate = TRUE}, what aesthetic value should the missing values be displayed as? Does not apply to position scales where \code{NA} is always placed at the far right.} \item{\code{aesthetics}}{The names of the aesthetics that this scale works with.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item A function that takes the breaks as input and returns labels as output }} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ See \code{\link{stata_shape_pal}()} for details. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, shape = factor(gear))) + facet_wrap(~am) p + theme_stata() + scale_shape_stata() } \concept{shape stata} ggthemes/man/theme_excel_new.Rd0000644000176200001440000000145213774436616016275 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/excel.R \name{theme_excel_new} \alias{theme_excel_new} \title{ggplot theme similar to current Excel plot defaults} \usage{ theme_excel_new(base_size = 9, base_family = "sans") } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} } \value{ An object of class \code{\link[ggplot2]{theme}()}. } \description{ Theme for ggplot2 that is similar to the default style of charts in current versions of Microsoft Excel. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_excel_new() + scale_colour_excel_new() } \seealso{ Other themes excel: \code{\link{theme_excel}()} } \concept{themes excel} ggthemes/man/ggthemes.Rd0000644000176200001440000000053413774436616014745 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ggthemes-package.R \docType{package} \name{ggthemes} \alias{ggthemes} \title{ggthemes} \description{ This package contains extra themes, scales, and geoms, and functions for and related to \pkg{ggplot2}. See \url{https://jrnold.github.io/ggthemes/} for documentation. } ggthemes/man/scale_linetype_stata.Rd0000644000176200001440000000602013774436616017332 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stata.R \name{scale_linetype_stata} \alias{scale_linetype_stata} \title{Stata linetype palette (discrete)} \usage{ scale_linetype_stata(...) } \arguments{ \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{na.value}}{If \code{na.translate = TRUE}, what aesthetic value should the missing values be displayed as? Does not apply to position scales where \code{NA} is always placed at the far right.} \item{\code{aesthetics}}{The names of the aesthetics that this scale works with.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item A function that takes the breaks as input and returns labels as output }} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ See \code{\link{stata_linetype_pal}()} for details. } \examples{ require("ggplot2") if (require("tidyr") && require("dplyr")) { rescale01 <- function(x) { (x - min(x)) / diff(range(x)) } gather(economics, variable, value, -date) \%>\% group_by(variable) \%>\% mutate(value = rescale01(value)) \%>\% ggplot(aes(x = date, y = value, linetype = variable)) + geom_line() + scale_linetype_stata() } } \seealso{ Other linetype stata: \code{\link{stata_linetype_pal}()} } \concept{linetype stata} ggthemes/man/theme_map.Rd0000644000176200001440000000136313774436616015102 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/theme-map.R \name{theme_map} \alias{theme_map} \title{Clean theme for maps} \usage{ theme_map(base_size = 9, base_family = "") } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} } \description{ A clean theme that is good for displaying maps from \code{\link[ggplot2]{geom_map}()}. } \examples{ library("maps") library("ggplot2") us <- fortify(map_data("state"), region = "region") gg <- ggplot() + geom_map(data = us, map = us, aes(x = long, y = lat, map_id = region, group = group), fill = "white", color = "black", size = 0.25) + coord_map("albers", lat0 = 39, lat1 = 45) + theme_map() gg } ggthemes/man/fivethirtyeight_pal.Rd0000644000176200001440000000101113775061657017203 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/fivethirtyeight.R \name{fivethirtyeight_pal} \alias{fivethirtyeight_pal} \title{FiveThirtyEight color palette} \usage{ fivethirtyeight_pal() } \description{ The standard three-color FiveThirtyEight palette for line plots comprises blue, red, and green. } \examples{ library("scales") show_col(fivethirtyeight_pal()(3)) } \seealso{ Other colour fivethirtyeight: \code{\link{scale_colour_fivethirtyeight}()} } \concept{colour fivethirtyeight} ggthemes/man/theme_par.Rd0000644000176200001440000000331613774436616015107 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/base.R \name{theme_par} \alias{theme_par} \title{Theme which uses the current \sQuote{base} graphics parameter values from \code{\link[graphics]{par}()}. Not all \code{par()} parameters, are supported, and not all are relevant to \pkg{ggplot2} themes.} \usage{ theme_par(base_size = par()$ps, base_family = par()$family) } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} } \description{ Currently this theme uses the values of the parameters: \code{"code"}, "\code{"ps"}", \code{"code"} \code{"family"}, \code{"fg"}, \code{"bg"}, \code{"adj"}, \code{"font"}, \code{"cex.axis"}, \code{"cex.lab"}, \code{"cex.main"}, \code{"cex.sub"}, \code{"col.axis"}, \code{"col.lab"}, \code{"col.main"}, \code{"col.sub"}, \code{"font"}, \code{"font.axis"}, \code{"font.lab"}, \code{"font.main"}, \code{"font.sub"}, \code{"las"}, \code{"lend"}, \code{"lheight"}, \code{"lty"}, \code{"mar"}, \code{"ps"}, \code{"tcl"}, \code{"tck"}, \code{"xaxt"}, \code{"yaxt"}. } \details{ This theme does not translate the base graphics perfectly, so the graphs produced by it will not be identical to those produced by base graphics, most notably in the spacing of the margins. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_par() # theme changes with respect to values of par par(font = 2, col.lab = "red", fg = "white", bg = "black") p + theme_par() } \seealso{ Other themes: \code{\link{theme_base}()}, \code{\link{theme_clean}()}, \code{\link{theme_foundation}()}, \code{\link{theme_igray}()}, \code{\link{theme_solid}()} } \concept{themes} ggthemes/man/canva_pal.Rd0000644000176200001440000000260213774436616015064 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/canva.R \name{canva_pal} \alias{canva_pal} \title{Canva.com color palettes} \usage{ canva_pal(palette = "Fresh and bright") } \arguments{ \item{palette}{Palette name. See the names of \code{\link{canva_palettes}()} for valid names.} } \value{ A function that takes a single value, the number of colors to use. } \description{ 150+ color palettes from canva.com. See \code{\link{canva_palettes}()}. } \examples{ require("ggplot2") require("tibble") if (require("purrr") && require("scales") && require("dplyr")) { canva_df <- map2_df( canva_palettes, names(canva_palettes), ~ tibble( colors = .x, .id = seq_along(colors), palette = .y ) ) ggplot(canva_df, aes( y = palette, x = .id, fill = colors )) + geom_raster() + scale_fill_identity(guide = FALSE) + theme_minimal() + theme(panel.grid = element_blank(), axis.text.x = element_blank()) + labs(x = "", y = "") show_col(canva_pal("Fresh and bright")(4)) show_col(canva_pal("Cool blues")(4)) show_col(canva_pal("Modern and crisp")(4)) } } ggthemes/man/scale_ptol.Rd0000644000176200001440000000701713774436616015272 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ptol.R \name{scale_colour_ptol} \alias{scale_colour_ptol} \alias{scale_color_ptol} \alias{scale_fill_ptol} \title{Color Scales from Paul Tol's "Colour Schemes} \usage{ scale_colour_ptol(...) scale_color_ptol(...) scale_fill_ptol(...) } \arguments{ \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item A function that takes the breaks as input and returns labels as output }} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ See \code{\link{ptol_pal}()}. These palettes support up to 12 values. } \examples{ library("ggplot2") p2 <- ggplot(mtcars, aes(x = wt, y = mpg, colour = factor(gear))) + geom_point() + geom_smooth(method = "lm", se = FALSE) + scale_color_ptol("cyl") + theme_minimal() + ggtitle("Cars") ggplot(diamonds, aes(x = clarity, fill = cut)) + geom_bar() + scale_fill_ptol() + theme_minimal() } \seealso{ Other colour ptol: \code{\link{ptol_pal}()} } \concept{colour ptol} ggthemes/man/scale_pander.Rd0000644000176200001440000000647313777476671015602 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pander.R \name{scale_color_pander} \alias{scale_color_pander} \alias{scale_colour_pander} \alias{scale_fill_pander} \title{Color scale from the pander package} \usage{ scale_color_pander(...) scale_colour_pander(...) scale_fill_pander(...) } \arguments{ \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item A function that takes the breaks as input and returns labels as output }} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ The \pkg{pander} ships with a default colorblind and printer-friendly color palette borrowed from \verb{https://jfly.iam.u-tokyo.ac.jp/color/}. } \seealso{ \code{\link{theme_pander}()} Other colour pander: \code{\link{palette_pander}()} } \concept{colour pander} ggthemes/man/geom_tufteboxplot.Rd0000644000176200001440000001266013774436616016713 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/geom-tufteboxplot.R \docType{data} \name{geom_tufteboxplot} \alias{geom_tufteboxplot} \alias{GeomTufteboxplot} \title{Tufte's Box Plot} \usage{ geom_tufteboxplot( mapping = NULL, data = NULL, stat = "fivenumber", position = "dodge", outlier.colour = "black", outlier.shape = 19, outlier.size = 1.5, outlier.stroke = 0.5, voffset = 0.01, hoffset = 0.005, na.rm = FALSE, show.legend = NA, inherit.aes = TRUE, median.type = "point", whisker.type = "line", ... ) } \arguments{ \item{mapping}{Set of aesthetic mappings created by \code{\link[ggplot2:aes]{aes()}} or \code{\link[ggplot2:aes_]{aes_()}}. If specified and \code{inherit.aes = TRUE} (the default), it is combined with the default mapping at the top level of the plot. You must supply \code{mapping} if there is no plot mapping.} \item{data}{The data to be displayed in this layer. There are three options: If \code{NULL}, the default, the data is inherited from the plot data as specified in the call to \code{\link[ggplot2:ggplot]{ggplot()}}. A \code{data.frame}, or other object, will override the plot data. All objects will be fortified to produce a data frame. See \code{\link[ggplot2:fortify]{fortify()}} for which variables will be created. A \code{function} will be called with a single argument, the plot data. The return value must be a \code{data.frame}, and will be used as the layer data. A \code{function} can be created from a \code{formula} (e.g. \code{~ head(.x, 10)}).} \item{stat}{The statistical transformation to use on the data for this layer, as a string.} \item{position}{Position adjustment, either as a string, or the result of a call to a position adjustment function.} \item{outlier.colour}{colour for outlying points} \item{outlier.shape}{shape of outlying points} \item{outlier.size}{size of outlying points} \item{outlier.stroke}{stroke for outlying points} \item{voffset}{controls the size of the gap in the line representing the median when \code{median.type = 'line'}. This is a fraction of the range of \code{y}.} \item{hoffset}{controls how much the interquartile line is offset from the whiskers when \code{median.type = 'line'}. This is a fraction of the range of \code{x}.} \item{na.rm}{If \code{FALSE}, the default, missing values are removed with a warning. If \code{TRUE}, missing values are silently removed.} \item{show.legend}{logical. Should this layer be included in the legends? \code{NA}, the default, includes if any aesthetics are mapped. \code{FALSE} never includes, and \code{TRUE} always includes. It can also be a named logical vector to finely select the aesthetics to display.} \item{inherit.aes}{If \code{FALSE}, overrides the default aesthetics, rather than combining with them. This is most useful for helper functions that define both data and aesthetics and shouldn't inherit behaviour from the default plot specification, e.g. \code{\link[ggplot2:borders]{borders()}}.} \item{median.type}{If \code{'point'}, then the median is represented by a point, and the interquartile range by a gap in the line. If \code{median.type='line'}, then the interquartile range is represented by a line, possibly offset, and the median by a gap in the line.} \item{whisker.type}{If \code{'line'}, then whiskers are represented by lines. If \code{'point'}, then whiskers are represented by points at \code{ymin} and \code{ymax}.} \item{...}{Other arguments passed on to \code{\link[ggplot2:layer]{layer()}}. These are often aesthetics, used to set an aesthetic to a fixed value, like \code{colour = "red"} or \code{size = 3}. They may also be parameters to the paired geom/stat.} } \description{ Edward Tufte's revisions of the box plot as described in \emph{The Visual Display of Quantitative Information}. This functions provides several box plot variants: \itemize{ \item{A point indicating the median, a gap indicating the interquartile range, and lines for whiskers.} \item{An offset line indicating the interquartile range and a gap indicating the median.} \item{A line indicating the interquartile range, a gap indicating the median, and points indicating the minimum and maximum values} \item{A wide line indicating the interquartile range, a gap indicating the median, and lines indicating the minimum and maximum.} } } \section{Aesthetics}{ \itemize{ \item x [required] \item y [required] \item colour \item size \item linetype \item shape \item fill \item alpha } } \examples{ library("ggplot2") p <- ggplot(mtcars, aes(factor(cyl), mpg)) # with a point for the median and lines for whiskers p + geom_tufteboxplot() # with a line for the interquartile range and points for whiskers p + geom_tufteboxplot(median.type = "line", whisker.type = "point", hoffset = 0) # with a wide line for the interquartile range and lines for whiskers p + geom_tufteboxplot(median.type = "line", hoffset = 0, width = 3) # with an offset line for the interquartile range and lines for whiskers p + geom_tufteboxplot(median.type = "line") # combined with theme_tufte p + geom_tufteboxplot() + theme_tufte() + theme(axis.ticks.x = element_blank()) } \references{ Tufte, Edward R. (2001) The Visual Display of Quantitative Information, Chapter 6. McGill, R., Tukey, J. W. and Larsen, W. A. (1978) Variations of box plots. The American Statistician 32, 12-16. } \seealso{ \code{\link{geom_boxplot}()} Other geom tufte: \code{\link{geom_rangeframe}()} } \concept{geom tufte} \keyword{datasets} ggthemes/man/tableau_color_pal.Rd0000644000176200001440000000442013774461466016610 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tableau.R \name{tableau_color_pal} \alias{tableau_color_pal} \title{Tableau Color Palettes (discrete)} \usage{ tableau_color_pal( palette = "Tableau 10", type = c("regular", "ordered-sequential", "ordered-diverging"), direction = 1 ) } \arguments{ \item{palette}{Palette name. See Details for available palettes.} \item{type}{Type of palette. One of \code{"regular"}, \code{"ordered-diverging"}, or \code{"ordered-sequential"}.} \item{direction}{If 1, the default, then use the original order of colors. If -1, then reverse the order.} } \description{ Color palettes used in \href{https://www.tableau.com/}{Tableau}. } \details{ Tableau provides three types of color palettes: \code{"regular"} (discrete, qualitative categories), \code{"ordered-sequential"}, and \code{"ordered-diverging"}. \itemize{ \item{\code{"regular"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["regular"]]))}} \item{\code{"ordered-diverging"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["ordered-diverging"]]))}} \item{\code{"ordered-sequential"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["ordered-sequential"]]))}} } } \examples{ library("scales") palettes <- ggthemes_data[["tableau"]][["color-palettes"]][["regular"]] for (palname in names(palettes)) { pal <- tableau_color_pal(palname) max_n <- attr(pal, "max_n") show_col(pal(max_n)) title(main = palname) } } \references{ \url{http://vis.stanford.edu/color-names/analyzer/} Maureen Stone, 'Designing Colors for Data' (slides), at the International Symposium on Computational Aesthetics in Graphics, Visualization, and Imaging, Banff, AB, Canada, June 22, 2007. Heer, Jeffrey and Maureen Stone, 2012 'Color Naming Models for Color Selection, Image Editing and Palette Design', ACM Human Factors in Computing Systems (CHI) \url{http://vis.stanford.edu/files/2012-ColorNameModels-CHI.pdf}. } \seealso{ Other colour tableau: \code{\link{scale_colour_gradient2_tableau}()}, \code{\link{scale_colour_gradient_tableau}()}, \code{\link{scale_colour_tableau}()}, \code{\link{tableau_gradient_pal}()} } \concept{colour tableau} ggthemes/man/colorblind.Rd0000644000176200001440000000737313777476671015311 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/colorblind.R \name{colorblind_pal} \alias{colorblind_pal} \alias{scale_colour_colorblind} \alias{scale_color_colorblind} \alias{scale_fill_colorblind} \title{Colorblind Color Palette (Discrete) and Scales} \usage{ colorblind_pal() scale_colour_colorblind(...) scale_color_colorblind(...) scale_fill_colorblind(...) } \arguments{ \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item A function that takes the breaks as input and returns labels as output }} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ An eight-color colorblind safe qualitative discrete palette. } \examples{ library("ggplot2") library("scales") show_col(colorblind_pal()(8)) p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_igray() + scale_colour_colorblind() } \references{ Chang, W. "\href{http://www.cookbook-r.com/Graphs/Colors_(ggplot2)/#a-colorblind-friendly-palette}{Cookbook for R}" \verb{https://jfly.iam.u-tokyo.ac.jp/color} } \seealso{ The \pkg{dichromat} package, \code{\link[scales]{dichromat_pal}()}, and \code{\link{scale_color_tableau}()} for other colorblind palettes. } \concept{colour} ggthemes/man/scale_wsj.Rd0000644000176200001440000000671113774436616015117 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/wsj.R \name{scale_colour_wsj} \alias{scale_colour_wsj} \alias{scale_color_wsj} \alias{scale_fill_wsj} \title{Wall Street Journal color and fill scales} \usage{ scale_colour_wsj(palette = "colors6", ...) scale_color_wsj(palette = "colors6", ...) scale_fill_wsj(palette = "colors6", ...) } \arguments{ \item{palette}{\code{character} The color palette to use: . \Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$wsj$palettes))}} \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item A function that takes the breaks as input and returns labels as output }} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ Colour and fill scales which use the palettes in \code{\link{wsj_pal}()}. These scales should be used with \code{\link{theme_wsj}()}. } \seealso{ Other colour wsj: \code{\link{wsj_pal}()} } \concept{colour wsj} ggthemes/man/scale_excel.Rd0000644000176200001440000000707413774436616015417 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/excel.R \name{scale_fill_excel} \alias{scale_fill_excel} \alias{scale_colour_excel} \alias{scale_color_excel} \title{Excel 97 ugly color scales} \usage{ scale_fill_excel(...) scale_colour_excel(...) scale_color_excel(...) } \arguments{ \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item A function that takes the breaks as input and returns labels as output }} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ The classic "ugly" color scales from Excel 97. } \examples{ library("ggplot2") # Line and scatter plot colors p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_excel() + scale_colour_excel() # Bar plot (area/fill) colors ggplot(mpg, aes(x = class, fill = drv)) + geom_bar() + scale_fill_excel() + theme_excel() } \seealso{ Other colour excel: \code{\link{excel_new_pal}()}, \code{\link{excel_pal}()}, \code{\link{scale_colour_excel_new}()} } \concept{colour excel} ggthemes/man/scale_stata.Rd0000644000176200001440000000641413774436616015430 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stata.R \name{scale_colour_stata} \alias{scale_colour_stata} \alias{scale_fill_stata} \alias{scale_color_stata} \title{Stata color scales} \usage{ scale_colour_stata(scheme = "s2color", ...) scale_fill_stata(scheme = "s2color", ...) scale_color_stata(scheme = "s2color", ...) } \arguments{ \item{scheme}{\code{character}. One of \code{"s2color"}, \code{"s1rcolor"}, \code{"s1color"}, or \code{"mono"}.} \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item A function that takes the breaks as input and returns labels as output }} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ See \code{\link{stata_pal}()} for details. } \concept{colour stata} ggthemes/man/scale_shape_circlefill.Rd0000644000176200001440000000555013774436616017604 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/shapes.R \name{scale_shape_circlefill} \alias{scale_shape_circlefill} \title{Filled Circle Shape palette (discrete)} \usage{ scale_shape_circlefill(...) } \arguments{ \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{na.value}}{If \code{na.translate = TRUE}, what aesthetic value should the missing values be displayed as? Does not apply to position scales where \code{NA} is always placed at the far right.} \item{\code{aesthetics}}{The names of the aesthetics that this scale works with.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item A function that takes the breaks as input and returns labels as output }} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ Filled Circle Shape palette (discrete) } \seealso{ \code{\link{circlefill_shape_pal}()} for a description of the palette. Other shapes: \code{\link{circlefill_shape_pal}()}, \code{\link{cleveland_shape_pal}()}, \code{\link{scale_shape_cleveland}()}, \code{\link{scale_shape_tremmel}()}, \code{\link{tremmel_shape_pal}()} } \concept{shapes} ggthemes/man/macros/0000755000176200001440000000000013774436616014135 5ustar liggesusersggthemes/man/macros/funclink.Rd0000644000176200001440000000006013774436616016231 0ustar liggesusers\newcommand{\funclink}{\code{\link[=#1]{#1()}}} ggthemes/man/range_breaks.Rd0000644000176200001440000000336713774436616015574 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/scales.R \name{extended_range_breaks_} \alias{extended_range_breaks_} \alias{extended_range_breaks} \title{Pretty axis breaks inclusive of extreme values} \usage{ extended_range_breaks_( dmin, dmax, n = 5, Q = c(1, 5, 2, 2.5, 4, 3), w = c(0.25, 0.2, 0.5, 0.05) ) extended_range_breaks(n = 5, ...) } \arguments{ \item{dmin}{minimum of the data range} \item{dmax}{maximum of the data range} \item{n}{desired number of breaks} \item{Q}{set of nice numbers} \item{w}{weights applied to the four optimization components (simplicity, coverage, density, and legibility)} \item{...}{other arguments passed to \code{extended_range_breaks_()}} } \value{ For \code{extended_range_breaks}, the vector of axis label locations. For \code{scales_extended_range_breaks}, a function which takes a single argument, a vector of data, and returns the vector of axis label locations. A function which returns breaks given a vector. } \description{ This function returns pretty axis breaks that always include the extreme values of the data. This works by calling the extended Wilkinson algorithm (Talbot et. al, 2010), constrained to solutions interior to the data range. Then, the minimum and maximum labels are moved to the minimum and maximum of the data range. } \details{ \code{extended_range_breaks} implements the algorithm and returns the break values. \code{scales_extended_range_breaks} uses the conventions of the \pkg{scales} package, and returns a function. } \references{ Talbot, J., Lin, S., Hanrahan, P. (2010) An Extension of Wilkinson's Algorithm for Positioning Tick Labels on Axes, InfoVis 2010. } \author{ Justin Talbot \email{jtalbot@stanford.edu}, Jeffrey B. Arnold, Baptiste Auguie } ggthemes/man/smart_digits.Rd0000644000176200001440000000145613774457675015647 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/scales.R \name{smart_digits} \alias{smart_digits} \alias{smart_digits_format} \title{Format numbers with automatic number of digits} \usage{ smart_digits(x, ...) smart_digits_format(x, ...) } \arguments{ \item{x}{A numeric vector to format} \item{...}{Parameters passed to \code{\link{format}()}} } \value{ A character vector. \code{smart_digits_format()} returns a function with a single argument \code{x}, a numeric vector, that returns a character vector. } \description{ Format numbers with automatic number of digits } \references{ Josh O'Brien, \url{https://stackoverflow.com/questions/23169938/select-accuracy-to-display-additional-axis-breaks/23171858#23171858}. } \author{ Josh O'Brien, Baptise Auguie, Jeffrey B. Arnold } ggthemes/man/solarized_pal.Rd0000644000176200001440000000155713774461466016001 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/solarized.R \name{solarized_pal} \alias{solarized_pal} \title{Solarized color palette (discrete)} \usage{ solarized_pal(accent = "blue") } \arguments{ \item{accent}{\code{character} Starting color.} } \description{ Qualitative color palate based on the Ethan Schoonover's Solarized palette, \url{https://ethanschoonover.com/solarized/}. This palette supports up to seven values. } \note{ For a given starting color and number of colors in the palette, the other colors are the combination of colors that maximizes the total Euclidean distance between colors in L*a*b space. } \examples{ library("scales") show_col(solarized_pal()(2)) show_col(solarized_pal()(3)) show_col(solarized_pal("red")(4)) } \seealso{ Other solarized colour: \code{\link{scale_fill_solarized}()} } \concept{solarized colour} ggthemes/man/circlefill_shape_pal.Rd0000644000176200001440000000223213777476671017273 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/shapes.R \name{circlefill_shape_pal} \alias{circlefill_shape_pal} \title{Filled Circle Shape palette (discrete)} \usage{ circlefill_shape_pal() } \description{ Shape palette with circles varying by amount of fill. This uses the set of 3 circle fill values in Lewandowsky and Spence (1989): solid, hollow, half-filled, with two additional fill amounts: three-quarters, and one-quarter. } \details{ This palette supports up to five values. } \examples{ library("ggplot2") p <- ggplot(mtcars, aes(x = mpg, y = hp, shape = factor(cyl))) + geom_point() p + scale_shape_tremmel() p + scale_shape_circlefill() p + scale_shape_cleveland() p + scale_shape_cleveland(overlap = TRUE) } \references{ Lewandowsky, Stephan and Ian Spence (1989) "Discriminating Strata in Scatterplots", Journal of the American Statistical Association, \url{https://www.jstor.org/stable/2289649} } \seealso{ Other shapes: \code{\link{cleveland_shape_pal}()}, \code{\link{scale_shape_circlefill}()}, \code{\link{scale_shape_cleveland}()}, \code{\link{scale_shape_tremmel}()}, \code{\link{tremmel_shape_pal}()} } \concept{shapes} ggthemes/man/theme_hc.Rd0000644000176200001440000000400513775062651014706 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/hc.R \name{theme_hc} \alias{theme_hc} \title{Highcharts Theme} \usage{ theme_hc( base_size = 12, base_family = "sans", style = c("default", "darkunica"), bgcolor = NULL ) } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} \item{style}{The Highcharts theme to use \code{'default'}, \code{'darkunica'}.} \item{bgcolor}{Deprecated} } \description{ Theme based on \href{https://www.highcharts.com/}{Highcharts} plots. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_hc() + scale_colour_hc() p + theme_hc(bgcolor = "darkunica") + scale_colour_hc("darkunica") dtemp <- data.frame(months = factor(rep(substr(month.name, 1, 3), 4), levels = substr(month.name, 1, 3)), city = rep(c("Tokyo", "New York", "Berlin", "London"), each = 12), temp = c(7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6, -0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8, 24.1, 20.1, 14.1, 8.6, 2.5, -0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0, 3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6, 4.8)) ggplot(dtemp, aes(x = months, y = temp, group = city, color = city)) + geom_line() + geom_point(size = 1.1) + ggtitle("Monthly Average Temperature") + theme_hc() + scale_colour_hc() ggplot(dtemp, aes(x = months, y = temp, group = city, color = city)) + geom_line() + geom_point(size = 1.1) + ggtitle("Monthly Average Temperature") + theme_hc(bgcolor = "darkunica") + scale_fill_hc("darkunica") } \references{ \url{https://www.highcharts.com/demo/line-basic} } \concept{themes hc} ggthemes/man/ggthemes_data.Rd0000644000176200001440000000062413774436616015736 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ggthemes_data.R \docType{data} \name{ggthemes_data} \alias{ggthemes_data} \title{Palette and theme data} \format{ A \code{list} object. } \usage{ ggthemes_data } \description{ The \code{ggthemes} environment contains various values used in themes and palettes. This is undocumented and subject to change. } \keyword{datasets} ggthemes/man/wsj_pal.Rd0000644000176200001440000000274313777476671014615 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/wsj.R \name{wsj_pal} \alias{wsj_pal} \title{Wall Street Journal color palette (discrete)} \usage{ wsj_pal(palette = "colors6") } \arguments{ \item{palette}{\code{character} The color palette to use: . \Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$wsj$palettes))}} } \description{ The Wall Street Journal uses many different color palettes in its plots. This collects a few of them, but is by no means exhaustive. Collections of these plots can be found on the WSJ Graphics \href{https://twitter.com/WSJGraphics}{Twitter} feed and \href{https://pinterest.com/wsjgraphics/wsj-graphics/}{Pinterest}. } \section{Palettes}{ The following palettes are defined, \describe{ \item{rgby}{Red/Green/Blue/Yellow theme. Examples: \url{https://twitpic.com/b2e3v2}. Up to four values.} \item{red_green}{Green/red two-color scale for good/bad. Examples: \url{https://twitpic.com/b1avj6}, \url{https://twitpic.com/a4kxcl}.} \item{green_black}{Black-green 4-color scale for 'Very negative', 'Somewhat negative', 'somewhat positive', 'very positive'. Examples: \url{https://twitpic.com/awbua0}.} \item{dem_rep}{Democrat/Republican/Undecided blue/red/gray scale. Examples: \url{https://twitpic.com/awbua0}.} \item{colors6}{Red, blue, gold, green, orange, and black palette. Examples: \url{https://twitpic.com/9gfg5q}.} } } \seealso{ Other colour wsj: \code{\link{scale_colour_wsj}()} } \concept{colour wsj} ggthemes/man/tableau_gradient_pal.Rd0000644000176200001440000000327413774436616017274 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tableau.R \name{tableau_gradient_pal} \alias{tableau_gradient_pal} \alias{tableau_seq_gradient_pal} \alias{tableau_div_gradient_pal} \title{Tableau colour gradient palettes (continuous)} \usage{ tableau_gradient_pal(palette = "Blue", type = "ordered-sequential") tableau_seq_gradient_pal(palette = "Blue", ...) tableau_div_gradient_pal(palette = "Orange-Blue Diverging", ...) } \arguments{ \item{palette}{Palette name. \itemize{ \item{\code{"ordered-sequential"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["ordered-sequential"]]))}} \item{\code{"ordered-diverging"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["ordered-diverging"]]))}} }} \item{type}{Palette type, either \code{"ordered-sequential"} or \code{"ordered-diverging"}.} \item{...}{Arguments passed to \code{tableau_gradient_pal}.} } \description{ Gradient color palettes using the diverging and sequential continous color palettes in Tableau. See \funclink{tableau_color_pal} for discrete color palettes. } \examples{ library("scales") x <- seq(0, 1, length = 25) r <- sqrt(outer(x ^ 2, x ^ 2, "+")) palettes <- ggthemes_data[["tableau"]][["color-palettes"]][["ordered-sequential"]] for (palname in names(palettes)) { col <- tableau_seq_gradient_pal(palname)(seq(0, 1, length = 12)) image(r, col = col) title(main = palname) } } \seealso{ Other colour tableau: \code{\link{scale_colour_gradient2_tableau}()}, \code{\link{scale_colour_gradient_tableau}()}, \code{\link{scale_colour_tableau}()}, \code{\link{tableau_color_pal}()} } \concept{colour tableau} ggthemes/man/show_shapes.Rd0000644000176200001440000000126713774436616015471 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/show.R \name{show_shapes} \alias{show_shapes} \title{Show shapes} \usage{ show_shapes(shapes, labels = TRUE) } \arguments{ \item{shapes}{A numeric or character vector of shapes. See \code{\link[graphics]{par}()}.} \item{labels}{Include the plotting character value of the symbol.} } \value{ This function called for the side effect of creating a plot. It returns \code{shapes}. } \description{ A quick and dirty way to show shapes. } \examples{ library("scales") show_shapes(shape_pal()(5)) show_shapes(shape_pal()(3), labels = TRUE) } \seealso{ \code{\link[scales]{show_col}()}, \code{\link{show_linetypes}()} } ggthemes/man/theme_foundation.Rd0000644000176200001440000000243013774436616016467 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/theme-foundation.R \name{theme_foundation} \alias{theme_foundation} \title{Foundation Theme} \usage{ theme_foundation(base_size = 12, base_family = "") } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} } \description{ This theme is designed to be a foundation from which to build new themes, and not meant to be used directly. \code{theme_foundation()} is a complete theme with only minimal number of elements defined. It is easier to create new themes by extending this one rather than \code{\link[ggplot2]{theme_gray}()} or \code{\link[ggplot2]{theme_bw}()}, because those themes define elements deep in the hierarchy. } \details{ This theme takes \code{\link[ggplot2]{theme_gray}()} and sets all \code{colour} and \code{fill} values to \code{NULL}, except for the top-level elements (\code{line}, \code{rect}, and \code{title}), which have \code{colour = "black"}, and \code{fill = "white"}. This leaves the spacing and-non colour defaults of the default \pkg{ggplot2} themes in place. } \seealso{ Other themes: \code{\link{theme_base}()}, \code{\link{theme_clean}()}, \code{\link{theme_igray}()}, \code{\link{theme_par}()}, \code{\link{theme_solid}()} } \concept{themes} ggthemes/man/geom_rangeframe.Rd0000644000176200001440000000702513774452367016263 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/geom-rangeframe.R \docType{data} \name{geom_rangeframe} \alias{geom_rangeframe} \alias{GeomRangeFrame} \title{Range Frames} \usage{ geom_rangeframe( mapping = NULL, data = NULL, stat = "identity", position = "identity", ..., sides = "bl", na.rm = FALSE, show.legend = NA, inherit.aes = TRUE ) } \arguments{ \item{mapping}{Set of aesthetic mappings created by \code{\link[ggplot2:aes]{aes()}} or \code{\link[ggplot2:aes_]{aes_()}}. If specified and \code{inherit.aes = TRUE} (the default), it is combined with the default mapping at the top level of the plot. You must supply \code{mapping} if there is no plot mapping.} \item{data}{The data to be displayed in this layer. There are three options: If \code{NULL}, the default, the data is inherited from the plot data as specified in the call to \code{\link[ggplot2:ggplot]{ggplot()}}. A \code{data.frame}, or other object, will override the plot data. All objects will be fortified to produce a data frame. See \code{\link[ggplot2:fortify]{fortify()}} for which variables will be created. A \code{function} will be called with a single argument, the plot data. The return value must be a \code{data.frame}, and will be used as the layer data. A \code{function} can be created from a \code{formula} (e.g. \code{~ head(.x, 10)}).} \item{stat}{The statistical transformation to use on the data for this layer, as a string.} \item{position}{Position adjustment, either as a string, or the result of a call to a position adjustment function.} \item{...}{Other arguments passed on to \code{\link[ggplot2:layer]{layer()}}. These are often aesthetics, used to set an aesthetic to a fixed value, like \code{colour = "red"} or \code{size = 3}. They may also be parameters to the paired geom/stat.} \item{sides}{A string that controls which sides of the plot the frames appear on. It can be set to a string containing any of \code{'trbl'}, for top, right, bottom, and left.} \item{na.rm}{If \code{FALSE}, the default, missing values are removed with a warning. If \code{TRUE}, missing values are silently removed.} \item{show.legend}{logical. Should this layer be included in the legends? \code{NA}, the default, includes if any aesthetics are mapped. \code{FALSE} never includes, and \code{TRUE} always includes. It can also be a named logical vector to finely select the aesthetics to display.} \item{inherit.aes}{If \code{FALSE}, overrides the default aesthetics, rather than combining with them. This is most useful for helper functions that define both data and aesthetics and shouldn't inherit behaviour from the default plot specification, e.g. \code{\link[ggplot2:borders]{borders()}}.} } \description{ Axis lines which extend to the maximum and minimum of the plotted data. } \details{ This should be used with `coord_cartesian(clip="off")` in order to correctly draw the lines. } \section{Aesthetics}{ \itemize{ \item colour \item size \item linetype \item alpha } } \examples{ library("ggplot2") ggplot(mtcars, aes(wt, mpg)) + geom_point() + geom_rangeframe() + coord_cartesian(clip="off") + theme_tufte() # In the example above, # `coord_cartesian(clip="off")`` ensures that the full width of the line is drawn. # if you know a better way to fix this, # please open an issue or PR on github https://github.com/jrnold/ggthemes/issue } \references{ Tufte, Edward R. (2001) The Visual Display of Quantitative Information, Chapter 6. } \seealso{ Other geom tufte: \code{\link{geom_tufteboxplot}()} } \concept{geom tufte} \keyword{datasets} ggthemes/man/stata_shape_pal.Rd0000644000176200001440000000064013774436616016270 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stata.R \name{stata_shape_pal} \alias{stata_shape_pal} \title{Stata shape palette (discrete)} \usage{ stata_shape_pal() } \description{ Shape palette based on the symbol palette in Stata used in scheme s2mono. This palette supports up to 10 values. } \seealso{ See \code{\link{scale_shape_stata}()} for examples. } \concept{shapes stata} ggthemes/man/scale_calc.Rd0000644000176200001440000000627613774436616015224 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/calc.R \name{scale_fill_calc} \alias{scale_fill_calc} \alias{scale_colour_calc} \alias{scale_color_calc} \title{LibreOffice Calc color scales} \usage{ scale_fill_calc(...) scale_colour_calc(...) scale_color_calc(...) } \arguments{ \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item A function that takes the breaks as input and returns labels as output }} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ Color scales from LibreOffice Calc. } \seealso{ See \code{\link{theme_calc}()} for examples. Other colour calc: \code{\link{calc_pal}()} } \concept{colour calc} ggthemes/man/solarized_rebase.Rd0000644000176200001440000000103113774461466016451 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/solarized.R \name{solarized_rebase} \alias{solarized_rebase} \title{Base colors for Solarized light and dark themes} \usage{ solarized_rebase(light = TRUE) } \arguments{ \item{light}{\code{logical} Light theme? Creates the base colors for a light or dark solarized theme. See \url{https://ethanschoonover.com/solarized/}. This function is a port of the CSS style example.} } \description{ Base colors for Solarized light and dark themes } \keyword{internal} ggthemes/man/scale_color_tableau.Rd0000644000176200001440000000353713774436616017132 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tableau.R \name{scale_colour_tableau} \alias{scale_colour_tableau} \alias{scale_fill_tableau} \alias{scale_color_tableau} \title{Tableau color scales (discrete)} \usage{ scale_colour_tableau( palette = "Tableau 10", type = "regular", direction = 1, ... ) scale_fill_tableau( palette = "Tableau 10", type = "regular", direction = 1, ... ) scale_color_tableau( palette = "Tableau 10", type = "regular", direction = 1, ... ) } \arguments{ \item{palette}{Palette name. See \funclink{tableau_color_pal} for available palettes.} \item{type}{Palette type. One of \code{"regular"}, \code{"sequential"}, or \code{"diverging"}. See \funclink{tableau_color_pal}.} \item{direction}{If 1, the default, then use the original order of colors. If -1, then reverse the order.} \item{...}{Other arguments passed on to \funclink{discrete_scale}.} } \description{ Categorical (qualitative) color scales used in Tableau. Use the function \funclink{scale_colour_gradient_tableau} for the sequential and \funclink{scale_colour_gradient2_tableau} for the diverging continuous color scales from Tableu. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) + theme_igray() palettes <- ggthemes_data[["tableau"]][["color-palettes"]][["regular"]] for (palette in head(names(palettes), 3L)) { print(p + scale_colour_tableau(palette) + ggtitle(palette)) } # the order of colour can be reversed p + scale_color_tableau(direction = -1) } \seealso{ \code{\link{tableau_color_pal}()} for references. Other colour tableau: \code{\link{scale_colour_gradient2_tableau}()}, \code{\link{scale_colour_gradient_tableau}()}, \code{\link{tableau_color_pal}()}, \code{\link{tableau_gradient_pal}()} } \concept{colour tableau} ggthemes/man/scale_colour_canva.Rd0000644000176200001440000000127113774436616016763 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/canva.R \name{scale_colour_canva} \alias{scale_colour_canva} \alias{scale_color_canva} \alias{scale_fill_canva} \title{Discrete color scale using canva.com color palettes} \usage{ scale_colour_canva(..., palette = "Fresh and bright") scale_color_canva(..., palette = "Fresh and bright") scale_fill_canva(..., palette = "Fresh and bright") } \arguments{ \item{...}{Arguments passed to \code{\link{discrete_scale}()}.} \item{palette}{Palette name. See the names of \code{\link{canva_palettes}()} for valid names.} } \description{ Color scale for canva.com color palettes described in \code{\link{canva_palettes}()}. } ggthemes/man/ptol_pal.Rd0000644000176200001440000000153213774436616014753 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ptol.R \name{ptol_pal} \alias{ptol_pal} \title{Color Palettes from Paul Tol's "Colour Schemes"} \usage{ ptol_pal() } \description{ Qualitative color palettes from Paul Tol, \href{https://personal.sron.nl/~pault/}{"Colour Schemes"}. } \details{ Incorporation of the palette into an R package was originally inspired by Peter Carl's [Paul Tol 21 Gun Salute](https://tradeblotter.wordpress.com/2013/02/28/the-paul-tol-21-color-salute/) } \examples{ library("scales") show_col(ptol_pal()(6)) show_col(ptol_pal()(4)) show_col(ptol_pal()(12)) } \references{ Paul Tol. 2012. "Colour Schemes." SRON Technical Note, SRON/EPS/TN/09-002. \url{https://personal.sron.nl/~pault/data/colourschemes.pdf} } \seealso{ Other colour ptol: \code{\link{scale_colour_ptol}()} } \concept{colour ptol} ggthemes/man/few_pal.Rd0000644000176200001440000000247613777476671014576 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/few.R \name{few_pal} \alias{few_pal} \title{Color Palettes Few "Show Me the Numbers"} \usage{ few_pal(palette = "Medium") } \arguments{ \item{palette}{One of \Sexpr[results=rd]{names(ggthemes:::rd_optlist(ggthemes::ggthemes_data$few$colors))}} } \description{ Qualitative color palettes from Stephen Few (2012) \emph{Show Me the Numbers}. There are three palettes: Light, Medium, and Dark. Each palette comprises nine colors: gray, blue, orange, green, pink, brown, purple, yellow, red. For \code{n = 1}, gray is used. For \code{n > 1}, the eight non-gray colors are used. } \details{ Use the light palette for filled areas, such as bar charts. Use the medium palette for points and lines. Use the dark palette for highlighting specific points or for small and thin lines and points. } \examples{ library("scales") show_col(few_pal()(7)) show_col(few_pal("Dark")(7)) show_col(few_pal("Light")(7)) } \references{ Few, S. (2012) \emph{Show Me the Numbers: Designing Tables and Graphs to Enlighten}. 2nd edition. Analytics Press. \href{https://www.perceptualedge.com/articles/visual_business_intelligence/rules_for_using_color.pdf}{"Practical Rules for Using Color in Charts"}. } \seealso{ Other colour few: \code{\link{scale_colour_few}()} } \concept{colour few} ggthemes/man/stat_fivenumber.Rd0000644000176200001440000000600613774436616016337 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stat-fivenumber.R \docType{data} \name{stat_fivenumber} \alias{stat_fivenumber} \alias{StatFivenumber} \title{Calculate components of a five-number summary} \usage{ stat_fivenumber( mapping = NULL, data = NULL, geom = "boxplot", probs = c(0, 0.25, 0.5, 0.75, 1), na.rm = FALSE, position = "identity", show.legend = NA, inherit.aes = TRUE, ... ) } \arguments{ \item{mapping}{Set of aesthetic mappings created by \code{\link[ggplot2:aes]{aes()}} or \code{\link[ggplot2:aes_]{aes_()}}. If specified and \code{inherit.aes = TRUE} (the default), it is combined with the default mapping at the top level of the plot. You must supply \code{mapping} if there is no plot mapping.} \item{data}{The data to be displayed in this layer. There are three options: If \code{NULL}, the default, the data is inherited from the plot data as specified in the call to \code{\link[ggplot2:ggplot]{ggplot()}}. A \code{data.frame}, or other object, will override the plot data. All objects will be fortified to produce a data frame. See \code{\link[ggplot2:fortify]{fortify()}} for which variables will be created. A \code{function} will be called with a single argument, the plot data. The return value must be a \code{data.frame}, and will be used as the layer data. A \code{function} can be created from a \code{formula} (e.g. \code{~ head(.x, 10)}).} \item{geom}{The geometric object to use display the data} \item{probs}{Quantiles to use for the five number summary.} \item{na.rm}{If \code{FALSE} (the default), removes missing values with a warning. If \code{TRUE} silently removes missing values.} \item{position}{Position adjustment, either as a string, or the result of a call to a position adjustment function.} \item{show.legend}{logical. Should this layer be included in the legends? \code{NA}, the default, includes if any aesthetics are mapped. \code{FALSE} never includes, and \code{TRUE} always includes. It can also be a named logical vector to finely select the aesthetics to display.} \item{inherit.aes}{If \code{FALSE}, overrides the default aesthetics, rather than combining with them. This is most useful for helper functions that define both data and aesthetics and shouldn't inherit behaviour from the default plot specification, e.g. \code{\link[ggplot2:borders]{borders()}}.} \item{...}{Other arguments passed on to \code{\link[ggplot2:layer]{layer()}}. These are often aesthetics, used to set an aesthetic to a fixed value, like \code{colour = "red"} or \code{size = 3}. They may also be parameters to the paired geom/stat.} } \value{ A data frame with additional columns: \item{width}{width of boxplot} \item{min}{minimum} \item{lower}{lower hinge, 25\% quantile} \item{middle}{median, 50\% quantile} \item{upper}{upper hinge, 75\% quantile} \item{max}{maximum} } \description{ The five number summary of a sample is the minimum, first quartile, median, third quartile, and maximum. } \seealso{ \code{\link[ggplot2]{stat_boxplot}()} } \keyword{datasets} ggthemes/man/economist_pal.Rd0000644000176200001440000000117513774436616016000 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/economist.R \name{economist_pal} \alias{economist_pal} \title{Economist color palette (discrete)} \usage{ economist_pal(fill = TRUE) } \arguments{ \item{fill}{Use the fill palette.} } \description{ The hues in the palette are blues, grays, and greens. Red is not included in these palettes and should be used to indicate important data. } \examples{ library("scales") show_col(economist_pal()(6)) ## fill palette show_col(economist_pal(fill = TRUE)(6)) } \seealso{ Other colour economist: \code{\link{scale_colour_economist}()} } \concept{colour economist} ggthemes/man/few_shape_pal.Rd0000644000176200001440000000076113774436616015741 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/few.R \name{few_shape_pal} \alias{few_shape_pal} \title{Shape palette from "Show Me the Numbers" (discrete)} \usage{ few_shape_pal() } \description{ Shape palette from Stephen Few's, "Show Me the Numbers". The shape palette consists of five shapes: circle, square, triangle, plus, times. } \references{ Few, S. (2012) \emph{Show Me the Numbers: Designing Tables and Graphs to Enlighten}, Analytics Press, p. 208. } ggthemes/man/scale_colour_gradient2_tableau.Rd0000644000176200001440000000430713774436616021252 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tableau.R \name{scale_colour_gradient2_tableau} \alias{scale_colour_gradient2_tableau} \alias{scale_fill_gradient2_tableau} \alias{scale_color_gradient2_tableau} \title{Tableau diverging colour scales (continuous)} \usage{ scale_colour_gradient2_tableau( palette = "Orange-Blue Diverging", ..., na.value = "grey50", guide = "colourbar" ) scale_fill_gradient2_tableau( palette = "Orange-Blue Diverging", ..., na.value = "grey50", guide = "colourbar" ) scale_color_gradient2_tableau( palette = "Orange-Blue Diverging", ..., na.value = "grey50", guide = "colourbar" ) } \arguments{ \item{palette}{Palette name. \itemize{ \item{\code{"ordered-sequential"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["ordered-sequential"]]))}} \item{\code{"ordered-diverging"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["ordered-diverging"]]))}} }} \item{...}{Arguments passed to \code{tableau_gradient_pal}.} \item{na.value}{Colour to use for missing values} \item{guide}{Type of legend. Use \code{'colourbar'} for continuous colour bar, or \code{'legend'} for discrete colour legend.} } \description{ Continuous color scales using the diverging color scales in Tableau. See \funclink{scale_colour_tableau} for Tabaleau discrete color scales, and \funclink{scale_colour_gradient_tableau} for sequential color scales. } \examples{ library("ggplot2") df <- data.frame( x = runif(100), y = runif(100), z1 = rnorm(100), z2 = abs(rnorm(100)) ) p <- ggplot(df, aes(x, y)) + geom_point(aes(colour = z2)) palettes <- ggthemes_data[["tableau"]][["color-palettes"]][["ordered-diverging"]] for (palette in head(names(palettes))) { print(p + scale_colour_gradient2_tableau(palette) + ggtitle(palette)) } # If you need to reverse a palette, use a transformation p + scale_colour_gradient2_tableau(trans = "reverse") } \seealso{ Other colour tableau: \code{\link{scale_colour_gradient_tableau}()}, \code{\link{scale_colour_tableau}()}, \code{\link{tableau_color_pal}()}, \code{\link{tableau_gradient_pal}()} } \concept{colour tableau} ggthemes/man/gdocs_pal.Rd0000644000176200001440000000064113774436616015074 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/gdocs.R \name{gdocs_pal} \alias{gdocs_pal} \title{Google Docs color palette (discrete)} \usage{ gdocs_pal() } \description{ Color palettes from Google Docs. This palette includes 20 colors. } \examples{ library("scales") show_col(gdocs_pal()(20)) } \seealso{ Other colour gdocs: \code{\link{scale_fill_gdocs}()} } \concept{colour gdocs} ggthemes/man/scale_gdocs.Rd0000644000176200001440000000630013774436616015405 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/gdocs.R \name{scale_fill_gdocs} \alias{scale_fill_gdocs} \alias{scale_colour_gdocs} \alias{scale_color_gdocs} \title{Google Docs color scales} \usage{ scale_fill_gdocs(...) scale_colour_gdocs(...) scale_color_gdocs(...) } \arguments{ \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item A function that takes the breaks as input and returns labels as output }} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ Color scales from Google Docs. } \seealso{ See \code{\link{theme_gdocs}()} for examples. Other colour gdocs: \code{\link{gdocs_pal}()} } \concept{colour gdocs} ggthemes/man/scale_economist.Rd0000644000176200001440000000640613774436616016315 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/economist.R \name{scale_colour_economist} \alias{scale_colour_economist} \alias{scale_color_economist} \alias{scale_fill_economist} \title{Economist color scales} \usage{ scale_colour_economist(...) scale_color_economist(...) scale_fill_economist(...) } \arguments{ \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item A function that takes the breaks as input and returns labels as output }} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ Color scales using the colors in the Economist graphics. } \seealso{ \code{\link{theme_economist}()} for examples. Other colour economist: \code{\link{economist_pal}()} } \concept{colour economist} ggthemes/man/canva_palettes.Rd0000644000176200001440000000405113774461466016132 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/canva.R \docType{data} \name{canva_palettes} \alias{canva_palettes} \title{150 Color Palettes from Canva} \format{ A named \code{list} of character vector. The names are the palette names. The values of the character vectors are hex colors, e.g. \code{"#f98866"}. } \usage{ canva_palettes } \description{ 150 four-color palettes by the \href{https://www.canva.com/learn/}{canva.com} design school. These palettes were derived from photos and "impactful websites". } \examples{ require("ggplot2") require("tibble") if (require("purrr") && require("scales") && require("dplyr")) { canva_df <- map2_df( canva_palettes, names(canva_palettes), ~ tibble( colors = .x, .id = seq_along(colors), palette = .y ) ) ggplot(canva_df, aes( y = palette, x = .id, fill = colors )) + geom_raster() + scale_fill_identity(guide = FALSE) + theme_minimal() + theme(panel.grid = element_blank(), axis.text.x = element_blank()) + labs(x = "", y = "") show_col(canva_pal("Fresh and bright")(4)) show_col(canva_pal("Cool blues")(4)) show_col(canva_pal("Modern and crisp")(4)) } } \references{ \itemize{ \item{Janie Kliever, \href{https://www.canva.com/learn/100-color-combinations/}{100 Brilliant Color Combinations and How to Apply Them to Your Designs}, \emph{Canva.com}, June 20, 2015.} \item{Mary Stribley, \href{https://www.canva.com/learn/website-color-schemes/}{Website Color Schemes: The Palettes of 50 Visually Impactful Websites to Inspire You}, \emph{Canva.com}, January 26, 2016.} \item{Schwabish, Jonathan. \href{https://policyviz.com/2017/01/12/150-color-palettes-for-excel/}{150+ Color Palettes for Excel}, \emph{PolicyViz}, January 12, 2017.} } } \keyword{datasets} ggthemes/man/scale_excel_new.Rd0000644000176200001440000000745513774436616016273 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/excel.R \name{scale_colour_excel_new} \alias{scale_colour_excel_new} \alias{scale_color_excel_new} \alias{scale_fill_excel_new} \title{Excel (current versions) color scales} \usage{ scale_colour_excel_new(theme = "Office Theme", ...) scale_color_excel_new(theme = "Office Theme", ...) scale_fill_excel_new(theme = "Office Theme", ...) } \arguments{ \item{theme}{The name of the Office theme or color theme (not to be confused with ggplot2 themes) from which to derive the color palette. Available themes include: \Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$excel$themes))}} \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item A function that takes the breaks as input and returns labels as output }} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ Discrete color scales used in current versions of Microsoft Office and Excel. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_excel_new() + scale_colour_excel_new() } \seealso{ Other colour excel: \code{\link{excel_new_pal}()}, \code{\link{excel_pal}()}, \code{\link{scale_fill_excel}()} } \concept{colour excel} ggthemes/man/theme_base.Rd0000644000176200001440000000147213774436616015240 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/base.R \name{theme_base} \alias{theme_base} \title{Theme Base} \usage{ theme_base(base_size = 16, base_family = "") } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} } \description{ Theme similar to the default settings of the \sQuote{base} R graphics. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_base() # Change values of par par(fg = "blue", bg = "gray", col.lab = "red", font.lab = 3) p + theme_base() } \seealso{ Other themes: \code{\link{theme_clean}()}, \code{\link{theme_foundation}()}, \code{\link{theme_igray}()}, \code{\link{theme_par}()}, \code{\link{theme_solid}()} } \concept{themes} ggthemes/man/scale_solarized.Rd0000644000176200001440000000700513774436616016305 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/solarized.R \name{scale_fill_solarized} \alias{scale_fill_solarized} \alias{scale_colour_solarized} \alias{scale_color_solarized} \title{Solarized color scales} \usage{ scale_fill_solarized(accent = "blue", ...) scale_colour_solarized(accent = "blue", ...) scale_color_solarized(accent = "blue", ...) } \arguments{ \item{accent}{\code{character} Starting color.} \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item A function that takes the breaks as input and returns labels as output }} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ See \code{\link{solarized_pal}()} for details. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_solarized() + scale_colour_solarized() } \seealso{ Other solarized colour: \code{\link{solarized_pal}()} } \concept{colour scales} \concept{solarized colour} ggthemes/man/scale_shape_tremmel.Rd0000644000176200001440000000650313774436616017140 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/shapes.R \name{scale_shape_tremmel} \alias{scale_shape_tremmel} \title{Shape scales from Tremmel (1995)} \usage{ scale_shape_tremmel(overlap = FALSE, alt = TRUE, ...) } \arguments{ \item{overlap}{use an empty circle instead of a solid circle when \code{n == 2}.} \item{alt}{If \code{TRUE}, then when \code{n == 3}, use a solid circle, plus sign and empty triangle. Otherwise use a solid circle, empty circle, and empty triangle.} \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{na.value}}{If \code{na.translate = TRUE}, what aesthetic value should the missing values be displayed as? Does not apply to position scales where \code{NA} is always placed at the far right.} \item{\code{aesthetics}}{The names of the aesthetics that this scale works with.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item A function that takes the breaks as input and returns labels as output }} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ Shape scales from Tremmel (1995) } \examples{ library("ggplot2") p <- ggplot(mtcars, aes(x = mpg, y = hp, shape = factor(cyl))) + geom_point() p + scale_shape_tremmel() p + scale_shape_tremmel(alt = TRUE) p + scale_shape_tremmel(overlap = TRUE) } \seealso{ \code{\link{tremmel_shape_pal}()} for a description of the palette. Other shapes: \code{\link{circlefill_shape_pal}()}, \code{\link{cleveland_shape_pal}()}, \code{\link{scale_shape_circlefill}()}, \code{\link{scale_shape_cleveland}()}, \code{\link{tremmel_shape_pal}()} } \concept{shapes} ggthemes/man/theme_fivethirtyeight.Rd0000644000176200001440000000135313777476671017552 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/fivethirtyeight.R \name{theme_fivethirtyeight} \alias{theme_fivethirtyeight} \title{Theme inspired by FiveThirtyEight plots} \usage{ theme_fivethirtyeight(base_size = 12, base_family = "sans") } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} } \description{ Theme inspired by the plots on \href{https://fivethirtyeight.com}{FiveThirtyEight}. } \examples{ library("ggplot2") p <- ggplot(mtcars, aes(x = wt, y = mpg, colour = factor(gear))) + geom_point() + facet_wrap(~am) + geom_smooth(method = "lm", se = FALSE) + scale_color_fivethirtyeight() + theme_fivethirtyeight() p } \concept{themes fivethirtyeight} ggthemes/man/show_linetypes.Rd0000644000176200001440000000130413774436616016212 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/show.R \name{show_linetypes} \alias{show_linetypes} \title{Show linetypes} \usage{ show_linetypes(linetypes, labels = TRUE) } \arguments{ \item{linetypes}{A character vector of linetypes. See \code{\link{par}()}.} \item{labels}{Label each line with its linetype (lty) value.} } \value{ This function called for the side effect of creating a plot. It returns \code{linetypes}. } \description{ A quick and dirty way to show linetypes. } \examples{ library("scales") show_linetypes(linetype_pal()(3)) show_linetypes(linetype_pal()(3), labels = TRUE) } \seealso{ \code{\link[scales]{show_col}()}, \code{\link{show_linetypes}()} } ggthemes/man/cleveland_shape_pal.Rd0000644000176200001440000000407413777476671017126 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/shapes.R \name{cleveland_shape_pal} \alias{cleveland_shape_pal} \title{Shape palette from Cleveland "Elements of Graphing Data" (discrete).} \usage{ cleveland_shape_pal(overlap = TRUE) } \arguments{ \item{overlap}{\code{logical} Use the scale for overlapping points?} } \description{ Shape palettes for overlapping and non-overlapping points. } \note{ In the \emph{Elements of Graphing Data}, W.S. Cleveland suggests two shape palettes for scatter plots: one for overlapping data and another for non-overlapping data. The symbols for overlapping data relies on pattern discrimination, while the symbols for non-overlapping data vary the amount of fill. This palette attempts to create these palettes. However, I found that these were hard to replicate. Using the R shapes and unicode fonts: the symbols can vary in size, they are dependent of the fonts used, and there does not exist a unicode symbol for a circle with a vertical line. If someone can improve this palette, please let me know. Following Tremmel (1995), I replace the circle with a vertical line with an encircled plus sign. The palette \code{cleveland_shape_pal()} supports up to five values. } \examples{ ### (discrete). library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, shape = factor(gear))) + facet_wrap(~am) + theme_bw() # overlapping symbol palette p + scale_shape_cleveland() # non-overlapping symbol palette p + scale_shape_cleveland(overlap = FALSE) } \references{ Cleveland WS. \emph{The Elements of Graphing Data}. Revised Edition. Hobart Press, Summit, NJ, 1994, pp. 154-164, 234-239. Tremmel, Lothar, (1995) "The Visual Separability of Plotting Symbols in Scatterplots", \emph{Journal of Computational and Graphical Statistics}, \url{https://www.jstor.org/stable/1390760} } \seealso{ Other shapes: \code{\link{circlefill_shape_pal}()}, \code{\link{scale_shape_circlefill}()}, \code{\link{scale_shape_cleveland}()}, \code{\link{scale_shape_tremmel}()}, \code{\link{tremmel_shape_pal}()} } \concept{shapes} ggthemes/man/palette_pander.Rd0000644000176200001440000000133113777476671016135 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pander.R \name{palette_pander} \alias{palette_pander} \title{Color palette from the pander package} \usage{ palette_pander(n, random_order = FALSE) } \arguments{ \item{n}{number of colors. This palette supports up to eight colors.} \item{random_order}{if the palette should be reordered randomly before rendering each plot to get colorful images} } \description{ The \pkg{pander} ships with a default colorblind and printer-friendly color palette borrowed from \verb{https://jfly.iam.u-tokyo.ac.jp/color/}. } \examples{ \dontrun{ palette_pander(TRUE) } } \seealso{ Other colour pander: \code{\link{scale_color_pander}()} } \concept{colour pander} ggthemes/man/scale_shape_few.Rd0000644000176200001440000000125313774436616016251 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/few.R \name{scale_shape_few} \alias{scale_shape_few} \title{Scales for shapes from "Show Me the Numbers"} \usage{ scale_shape_few(...) } \arguments{ \item{...}{Common \code{\link[ggplot2]{discrete_scale}()} parameters.} } \description{ \code{scale_shape_few()} maps discrete variables to up to five easily discernible shapes. It is based on the shape palette suggested in Few (2012). } \references{ Few, S. (2012) \emph{Show Me the Numbers: Designing Tables and Graphs to Enlighten}, Analytics Press, p. 208. } \seealso{ \code{\link{scale_shape_few}()} for the shape palette that this scale uses. } ggthemes/man/theme_igray.Rd0000644000176200001440000000236113774436616015437 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/igray.R \name{theme_igray} \alias{theme_igray} \title{Inverse gray theme} \usage{ theme_igray(base_size = 12, base_family = "") } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} } \description{ Theme with white panel and gray background. } \section{Details}{ This theme inverts the colors in the \code{\link[ggplot2]{theme_gray}()}, a white panel and a light gray area around it. This keeps a white background for the color scales like \code{\link[ggplot2]{theme_bw}()}. But by using a gray background, the plot is closer to the typographical color of the document, which is the motivation for using a gray panel in \code{\link[ggplot2]{theme_gray}()}. This is similar to the style of plots in Stata and Tableau. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_igray() } \seealso{ \code{\link[ggplot2]{theme_gray}()}, \code{\link[ggplot2]{theme_bw}()} Other themes: \code{\link{theme_base}()}, \code{\link{theme_clean}()}, \code{\link{theme_foundation}()}, \code{\link{theme_par}()}, \code{\link{theme_solid}()} } \concept{themes} ggthemes/man/stata_pal.Rd0000644000176200001440000000131713774457675015122 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stata.R \name{stata_pal} \alias{stata_pal} \title{Stata color palettes (discrete)} \usage{ stata_pal(scheme = "s2color") } \arguments{ \item{scheme}{\code{character}. One of \code{"s2color"}, \code{"s1rcolor"}, \code{"s1color"}, or \code{"mono"}.} } \description{ Stata color palettes. See Stata documentation for a description of the schemes, \url{https://www.stata.com/help.cgi?schemes}. } \details{ All these palettes support up to 15 values. } \examples{ library("scales") show_col(stata_pal("s2color")(15)) show_col(stata_pal("s1rcolor")(15)) show_col(stata_pal("s1color")(15)) show_col(stata_pal("mono")(15)) } \concept{stata colour} ggthemes/man/calc_shape_pal.Rd0000644000176200001440000000066713774436616016067 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/calc.R \name{calc_shape_pal} \alias{calc_shape_pal} \title{Calc shape palette (discrete)} \usage{ calc_shape_pal() } \description{ Shape palette based on the shapes used in LibreOffice Calc. } \examples{ library("ggplot2") \dontrun{ show_shapes(calc_shape_pal()(13)) } } \seealso{ Other shapes calc: \code{\link{scale_shape_calc}()} } \concept{shapes calc} ggthemes/man/scale_shape_cleveland.Rd0000644000176200001440000000614013774436616017425 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/shapes.R \name{scale_shape_cleveland} \alias{scale_shape_cleveland} \title{Shape scales from Cleveland "Elements of Graphing Data"} \usage{ scale_shape_cleveland(overlap = TRUE, ...) } \arguments{ \item{overlap}{\code{logical} Use the scale for overlapping points?} \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{na.value}}{If \code{na.translate = TRUE}, what aesthetic value should the missing values be displayed as? Does not apply to position scales where \code{NA} is always placed at the far right.} \item{\code{aesthetics}}{The names of the aesthetics that this scale works with.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item A function that takes the breaks as input and returns labels as output }} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ Shape scales from Cleveland "Elements of Graphing Data" } \references{ Cleveland WS. The Elements of Graphing Data. Revised Edition. Hobart Press, Summit, NJ, 1994, pp. 154-164, 234-239. } \seealso{ \code{\link{cleveland_shape_pal}()} for a description of the palette. Other shapes: \code{\link{circlefill_shape_pal}()}, \code{\link{cleveland_shape_pal}()}, \code{\link{scale_shape_circlefill}()}, \code{\link{scale_shape_tremmel}()}, \code{\link{tremmel_shape_pal}()} } \concept{shapes} ggthemes/man/theme_pander.Rd0000644000176200001440000000357013774436616015600 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pander.R \name{theme_pander} \alias{theme_pander} \title{A ggplot theme originated from the pander package} \usage{ theme_pander( base_size = 12, base_family = "sans", nomargin = TRUE, ff = NULL, fc = "black", fs = NULL, gM = TRUE, gm = TRUE, gc = "grey", gl = "dashed", boxes = FALSE, bc = "white", pc = "transparent", lp = "right", axis = 1 ) } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} \item{nomargin}{suppress the white space around the plot (boolean)} \item{ff}{font family, like \code{sans}. Deprecated: use \code{base_family} instead.} \item{fc}{font color (name or hexa code)} \item{fs}{font size (integer). Deprecated: use \code{base_size} instead.} \item{gM}{major grid (boolean)} \item{gm}{minor grid (boolean)} \item{gc}{grid color (name or hexa code)} \item{gl}{grid line type (\code{lty})} \item{boxes}{to render a border around the plot or not} \item{bc}{background color (name or hexa code)} \item{pc}{panel background color (name or hexa code)} \item{lp}{legend position} \item{axis}{axis angle as defined in \code{par(les)}} } \description{ The \pkg{pander} ships with a default theme when the 'unify plots' option is enabled via \code{panderOptions}, which is now also available outside of \pkg{pander} internals, like \code{evals}, \code{eval.msgs} or \code{Pandoc.brew}. } \examples{ require("ggplot2") if (require("pander")) { p <- ggplot(mtcars, aes(x = mpg, y = wt)) + geom_point() p + theme_pander() panderOptions("graph.grid.color", "red") p + theme_pander() p <- ggplot(mtcars, aes(wt, mpg, colour = factor(cyl))) + geom_point() p + theme_pander() + scale_color_pander() ggplot(mpg, aes(x = class, fill = drv)) + geom_bar() + scale_fill_pander() + theme_pander() } } ggthemes/man/scale_hc.Rd0000644000176200001440000000654213774436616014710 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/hc.R \name{scale_colour_hc} \alias{scale_colour_hc} \alias{scale_color_hc} \alias{scale_fill_hc} \title{Highcharts color and fill scales} \usage{ scale_colour_hc(palette = "default", ...) scale_color_hc(palette = "default", ...) scale_fill_hc(palette = "default", ...) } \arguments{ \item{palette}{\code{character} The name of the Highcharts theme to use.} \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item A function that takes the breaks as input and returns labels as output }} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ Colour and fill scales which use the palettes in \code{\link{hc_pal}()} and are meant for use with \code{\link{theme_hc}()}. } \seealso{ Other colour hc: \code{\link{hc_pal}()} } \concept{colour hc} ggthemes/man/theme_excel.Rd0000644000176200001440000000212013774436616015415 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/excel.R \name{theme_excel} \alias{theme_excel} \title{ggplot theme based on old Excel plots} \usage{ theme_excel(base_size = 12, base_family = "", horizontal = TRUE) } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} \item{horizontal}{\code{logical}. Horizontal axis lines?} } \value{ An object of class \code{\link[ggplot2]{theme}()}. } \description{ Theme to replicate the ugly monstrosity that was the old gray-background Excel chart. Please never use this. This theme should be combined with the \code{\link{scale_colour_excel}()} color scale. } \examples{ library("ggplot2") # Line and scatter plot colors p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_excel() + scale_colour_excel() # Bar plot (area/fill) colors ggplot(mpg, aes(x = class, fill = drv)) + geom_bar() + scale_fill_excel() + theme_excel() } \seealso{ Other themes excel: \code{\link{theme_excel_new}()} } \concept{themes excel} ggthemes/man/theme_gdocs.Rd0000644000176200001440000000113313774436616015417 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/gdocs.R \name{theme_gdocs} \alias{theme_gdocs} \title{Theme with Google Docs Chart defaults} \usage{ theme_gdocs(base_size = 12, base_family = "sans") } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} } \description{ Theme similar to the default look of charts in Google Docs. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_gdocs() + scale_color_gdocs() } \concept{themes gdocs} ggthemes/man/scale_fivethirtyeight.Rd0000644000176200001440000000653213775061657017533 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/fivethirtyeight.R \name{scale_colour_fivethirtyeight} \alias{scale_colour_fivethirtyeight} \alias{scale_color_fivethirtyeight} \alias{scale_fill_fivethirtyeight} \title{FiveThirtyEight color scales} \usage{ scale_colour_fivethirtyeight(...) scale_color_fivethirtyeight(...) scale_fill_fivethirtyeight(...) } \arguments{ \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item A function that takes the breaks as input and returns labels as output }} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ Color scales using the colors in the FiveThirtyEight graphics. } \seealso{ \code{\link{theme_fivethirtyeight}()} for examples. Other colour fivethirtyeight: \code{\link{fivethirtyeight_pal}()} } \concept{colour fivethirtyeight} ggthemes/man/theme_few.Rd0000644000176200001440000000223113777476671015111 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/few.R \name{theme_few} \alias{theme_few} \title{Theme based on Few's "Practical Rules for Using Color in Charts"} \usage{ theme_few(base_size = 12, base_family = "") } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} } \description{ Theme based on the rules and examples from Stephen Few's \emph{Show Me the Numbers} and "Practical Rules for Using Color in Charts". } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_few() + scale_colour_few() p + theme_few() + scale_colour_few("Light") p + theme_few() + scale_colour_few("Dark") ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, shape = factor(gear))) + theme_few() + scale_shape_few() } \references{ Few, S. (2012) \emph{Show Me the Numbers: Designing Tables and Graphs to Enlighten}. 2nd edition. Analytics Press. Stephen Few, "Practical Rules for Using Color in Charts", \url{https://www.perceptualedge.com/articles/visual_business_intelligence/rules_for_using_color.pdf}. } \concept{themes few} ggthemes/man/theme_stata.Rd0000644000176200001440000000324513774457675015452 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stata.R \name{theme_stata} \alias{theme_stata} \title{Themes based on Stata graph schemes} \usage{ theme_stata(base_size = 11, base_family = "sans", scheme = "s2color") } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} \item{scheme}{One of "s2color", "s2mono", "s1color", "s1rcolor", or "s1mono", "s2manual", "s1manual", or "sj"} } \description{ Themes based on Stata graph schemes } \details{ These themes approximate Stata schemes using the features \pkg{ggplot2}. The graphical models of Stata and ggplot2 differ in various ways that make an exact replication impossible (or more difficult than it is worth). Some features in Stata schemes not in ggplot2: defaults for specific graph types, different levels of titles, captions and notes. These themes also adopt some of the ggplot2 defaults, and more effort was made to match the colors and sizes of major elements than in matching the margins. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~ am) + labs(title = "Graphs by car type", x = "Weight (lbs.)", y = "MPG") # s2color p + theme_stata() + scale_colour_stata("s2color") # s2mono p + theme_stata(scheme = "s2mono") + scale_colour_stata("mono") # s1color p + theme_stata(scheme = "s2color") + scale_colour_stata("s1color") # s1rcolor p + theme_stata(scheme = "s1rcolor") + scale_colour_stata("s1rcolor") # s1mono p + theme_stata(scheme = "s1mono") + scale_colour_stata("mono") } \references{ \url{https://www.stata.com/help.cgi?schemes} } \concept{themes stata} ggthemes/man/scale_colour_gradient_tableau.Rd0000644000176200001440000000454013774436616021167 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tableau.R \name{scale_colour_gradient_tableau} \alias{scale_colour_gradient_tableau} \alias{scale_fill_gradient_tableau} \alias{scale_color_gradient_tableau} \alias{scale_color_continuous_tableau} \alias{scale_fill_continuous_tableau} \title{Tableau sequential colour scales (continuous)} \usage{ scale_colour_gradient_tableau( palette = "Blue", ..., na.value = "grey50", guide = "colourbar" ) scale_fill_gradient_tableau( palette = "Blue", ..., na.value = "grey50", guide = "colourbar" ) scale_color_gradient_tableau( palette = "Blue", ..., na.value = "grey50", guide = "colourbar" ) scale_color_continuous_tableau( palette = "Blue", ..., na.value = "grey50", guide = "colourbar" ) scale_fill_continuous_tableau( palette = "Blue", ..., na.value = "grey50", guide = "colourbar" ) } \arguments{ \item{palette}{Palette name. \itemize{ \item{\code{"ordered-sequential"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["ordered-sequential"]]))}} \item{\code{"ordered-diverging"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["ordered-diverging"]]))}} }} \item{...}{Arguments passed to \code{tableau_gradient_pal}.} \item{na.value}{Colour to use for missing values} \item{guide}{Type of legend. Use \code{'colourbar'} for continuous colour bar, or \code{'legend'} for discrete colour legend.} } \description{ Continuous color scales using the sequential color palettes in Tableau. See \funclink{scale_colour_tableau} for Tableau discrete color scales, and \funclink{scale_colour_gradient2_tableau} for diverging color scales. } \examples{ library("ggplot2") df <- data.frame( x = runif(100), y = runif(100), z1 = rnorm(100), z2 = abs(rnorm(100)) ) p <- ggplot(df, aes(x, y)) + geom_point(aes(colour = z2)) + theme_igray() palettes <- ggthemes_data[["tableau"]][["color-palettes"]][["ordered-sequential"]] for (palette in head(names(palettes))) { print(p + scale_colour_gradient_tableau(palette) + ggtitle(palette)) } } \seealso{ Other colour tableau: \code{\link{scale_colour_gradient2_tableau}()}, \code{\link{scale_colour_tableau}()}, \code{\link{tableau_color_pal}()}, \code{\link{tableau_gradient_pal}()} } \concept{colour tableau} ggthemes/man/theme_tufte.Rd0000644000176200001440000000275613774445260015456 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tufte.R \name{theme_tufte} \alias{theme_tufte} \title{Tufte Maximal Data, Minimal Ink Theme} \usage{ theme_tufte(base_size = 11, base_family = "serif", ticks = TRUE) } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} \item{ticks}{\code{logical} Show axis ticks?} } \description{ Theme based on Chapter 6 'Data-Ink Maximization and Graphical Design' of Edward Tufte *The Visual Display of Quantitative Information*. No border, no axis lines, no grids. This theme works best in combination with \code{\link{geom_rug}()} or \code{\link{geom_rangeframe}()}. } \note{ The default font family is set to 'serif' as he uses serif fonts for labels in 'The Visual Display of Quantitative Information'. The serif font used by Tufte in his books is a variant of Bembo, while the sans serif font is Gill Sans. If these fonts are installed on your system, then you can use them with the package \bold{extrafont}. } \examples{ library("ggplot2") p <- ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point() + scale_x_continuous(breaks = extended_range_breaks()(mtcars$wt)) + scale_y_continuous(breaks = extended_range_breaks()(mtcars$mpg)) + ggtitle("Cars") p + geom_rangeframe() + coord_cartesian(clip="off") + theme_tufte() p + geom_rug() + theme_tufte(ticks = FALSE) } \references{ Tufte, Edward R. (2001) The Visual Display of Quantitative Information, Chapter 6. } \concept{themes tufte} ggthemes/DESCRIPTION0000644000176200001440000000402214002057473013563 0ustar liggesusersPackage: ggthemes Version: 4.2.4 Title: Extra Themes, Scales and Geoms for 'ggplot2' Authors@R: c(person("Jeffrey B.", "Arnold", role = c("aut", "cre"), email = "jeffrey.arnold@gmail.com", comment = ""), person("Gergely", "Daroczi", role = "ctb"), person("Bo", "Werth", role = "ctb"), person("Brian", "Weitzner", role = "ctb"), person("Joshua", "Kunst", role = "ctb"), person("Baptise", "Auguie", role = "ctb"), person("Bob", "Rudis", role = "ctb"), person("Hadley", "Wickham", role = c("ctb"), comment = "Code from the ggplot2 package."), person("Justin", "Talbot", role = "ctb", comment = "Code from the labeling package"), person("Joshua", "London", role = "ctb")) Depends: R (>= 3.3.0) Imports: ggplot2 (>= 3.0.0), graphics, grid, methods, purrr, scales, stringr, tibble Suggests: dplyr, covr, extrafont, glue, knitr, lattice, lintr, maps, mapproj, pander, rlang, rmarkdown, spelling, testthat, tidyr, vdiffr, withr Description: Some extra themes, geoms, and scales for 'ggplot2'. Provides 'ggplot2' themes and scales that replicate the look of plots by Edward Tufte, Stephen Few, 'Fivethirtyeight', 'The Economist', 'Stata', 'Excel', and 'The Wall Street Journal', among others. Provides 'geoms' for Tufte's box plot and range frame. License: GPL-2 URL: https://github.com/jrnold/ggthemes BugReports: https://github.com/jrnold/ggthemes RoxygenNote: 7.1.1 LazyData: true Language: en-US Encoding: UTF-8 NeedsCompilation: no Packaged: 2021-01-20 02:04:38 UTC; jrnold Author: Jeffrey B. Arnold [aut, cre] (), Gergely Daroczi [ctb], Bo Werth [ctb], Brian Weitzner [ctb], Joshua Kunst [ctb], Baptise Auguie [ctb], Bob Rudis [ctb], Hadley Wickham [ctb] (Code from the ggplot2 package.), Justin Talbot [ctb] (Code from the labeling package), Joshua London [ctb] Maintainer: Jeffrey B. Arnold Repository: CRAN Date/Publication: 2021-01-20 16:50:03 UTC ggthemes/build/0000755000176200001440000000000014001707665013162 5ustar liggesusersggthemes/build/ggthemes.pdf0000644000176200001440000124631214001707665015471 0ustar liggesusers%PDF-1.5 % 2 0 obj << /Type /ObjStm /N 100 /First 812 /Length 1084 /Filter /FlateDecode >> stream xڝMs8 86g:=޻{܋lӱ_/([vl}vҌx@%YJd(rd='#)HJERt!7%xHJ{RTfH CʒFr3=2 J YOJ6pC$g\ |J"!ՔYP<ZFau_8:/OJl|5( JQ))XBAʧIyy4x-3H3&Enu}t :3@B0а @S;>C#%w?q=b:@ RHbP2V bRE` VM6@tx袌B@'AS uxQw@#2.H TM ghV0"(yH<(~# i M-,GͧI$%h 4VF\waphMl-Ŏb |ڢ& n@@$CAxCA2|J/˟%A_oϫx-}K?hl;΋u }ˋKq&]£qs|19?,4͵huYKC7#ȋLbYժ؟2 XusC۠cx@aI kqҫvsUGWVɸȃ֏GcEۉB.!ҞECWͯ=(sgEnu}a<\Ca-mªV=6ymvp='9&o0Nệkn7~ɝsvXu <[h6 ahg3уajy^}SFfv>KnenUهcڳF2u8naK9ޭfynnn\/Mqy>GxNP|ݣ.o 6&GwYtChͪ"a1 ݛw{qO;ތ[Jc-Tdv'X!rv ʏOzF`~ {ngA endstream endobj 336 0 obj << /Length 898 /Filter /FlateDecode >> stream xڭVMo8W6$@{( Ehw ,-4I(:}IQr$vZ'873@yлgM{(¡m=ȋp g0GpF'|C81miCa F?@ qG=kk+`A82 pd( @i,Y48>5F~ P E_ uQ6GɌ^3^$tY9)ikeRV׶BZ_nj5P؈);0>ӆE{q@z@p99=8`_FHuѹ. R6`IBWg$͎Op**v81K)Vm?JI^3sƓ0>$MyC"u#p&IVrO+7hI9u49E#WdIj +" 1v絡f܉Q;d8<|k\nvg3msN? u `E7cw-fIjG\q |N m-b9my#\[IҦ9QhiR'++iZ/c'{<gCWЮzNqʳ92\lj+rQQĮ95 Dr.)Cv'&JԬl֜I)=o[.NK}Y{[I* ~* ߽n9uKߙ `r n_TOIs}? Г#@t|vJ5%W~_e-b9 WS`A'>ٚ~0/ANF?H^ lx#@}z v8ݳʮ6l endstream endobj 392 0 obj << /Length 1062 /Filter /FlateDecode >> stream xˎH~ R,G*㬒PI0Xt>6:UnfᣖUT)@*@ɟɛiAD0_2H"NI0ςOS2w'"b704&:6OYH8fUۘ5i4\hiOH)AHdǾÿ%mrDĔ8^B3XD0j̳qvƔoߏ#ޖiqxt!TǸ`EwB"LYpEa˔q\\ajcA"&h")MQm#1>};׻TPw_MO!Mb!1&M4&,XGGY'[B1 Gyyrیi#PQq0mT6n:-gHQ瞧_p i )2H8k7EWEU/ޣB\]Y9a7iUViM'S1HM{w>؉&./&>C)3uRLMm&/ I$g +{b'JV>w2n!tu^&_Y ݏ[`Ui3<jjO:;Oaݲ5ǶZ>R !+79ڵteD ^] 5̚ש%܃;N!W?_xeimF Wnm[ !u{#Ԫ?ߏ7H٭qBOnl N1}GoPZm 摘WulI&$; )@x')oRSk&W*"Vyv< =YsM/Aw}ݪ7_:elx{$5̋ ϰ +h+u;q'?/]Ϝ3o"&Z'n5S'yiǭ9ZgG>%~TyOyn@=z[NbKzz|۩{J!񱨯9~N/o_H^ endstream endobj 203 0 obj << /Type /ObjStm /N 100 /First 866 /Length 1769 /Filter /FlateDecode >> stream xڽYMo7W\$I6@ v u}5U͊TK5RC#q8eFya M^ ʡB ZGa,I1TC0 l*Z_8ryGL ZA{q p6P@&DJG`B GwlN!Z:!R'%0BČx+o_S&<>r€=فn<6v?ِ.b ŏ8x ~ZN)a7qyɐXh {LDƃo<ˍCI3|N1W|d̽ؿeͤ[!\>p:qdc#hv=ZY}W-uO/Q9ug\iV~C7T[YNv7Q/\MUFcr;G:ϤW=N˷z7q~8o2sewI=OWmjqekkivIksyywOttS?Kj5쌹IsQU<9pY@y8/r>*mԚ~)mU\*\r/2@D᧳Y ˶JٹjAC-*~*>ZɌqrWrAkeREak._I;Aq:Q\߫I/~( 55ػ|VOmkN% ]F?"%Ʌl$-r::4V+ltgА`qoUVWV ztQb۠gT~m@hRSv%L X>!1i:[[,t\se<\g<|g<|gB /dB /dBƋ/fbƋ/fbƋ!#9W o' Zw*g{HR$ˁtx{: $sG횃\蚃22pCxHCԦC8%Ur!I;%\w5eJ0b;FYwp0@!ْRVte9-ݒRVHJ2VYs@ ƾ(LͧŻ)D'OPN5<3]j5,ue9؄ }#:C8> ҆m+CEm ˸{sܖ` ^.B/ʁ"jGH\ǽmY@%L^wW67>[d9eO9$f2ڎTm9X%B 2QF))+莋۬SRG endstream endobj 473 0 obj << /Length 1392 /Filter /FlateDecode >> stream xI6+X b9Nķd*ե5_یIZc~uV/nW_1q4&i(fU&1Fn_?$* J,%Р.LU=kq`M2UKވ͸N|њ8!@IQ@0LJ<TDo9E!#Q|zFc&yi_!]<͓V&ש 6tl:cیGԍVk^$>{vӦF+ GQm,xz*u"l P v[3-[y1Fyާjyan&G-ݑxnʾ2ڍ5JOWRt]``xf)kGmhfG}Rx#y@M ƣ<ؘN=%ЧEw}+ _8\HURj/?nA Oܑxg\2 .i/^zS\b:{]?vdy7F]W}y_ǜ80߫|AK__:.}:z.*Ͽ:s(8O2\лxdex>s.6Ku zCtu]3q7 ~!Snl{yԋa+ou'*E~Y_%Mk9˃5!1KS#_`7־CpMíڏVXSјYP7PP-NmC084/F'ZiB =K"ǧZњ0ޘ:>&L +%(f_6izzɥhqNqX 4 "n^<6\ `}c"!Zpp([h4xdomLM)ɨ~؛ކUv)yl+ݱ+7N6$GQqjT$2"S]?ZܤTqԂҭtؽĭ2bhVgRSӦ$Y L!j}a̷!P !Ve`-]6#Tyz M14Hk')H&qRIn[Yi!NlސP֎3ro:jP)Pjڧ ZT֬l?`TO%̓ӐIr~/ٙ2l0:E转[AA  endstream endobj 510 0 obj << /Length 2222 /Filter /FlateDecode >> stream xY[s6~LJudfvICS1E$U[߃ )RX psppe7'\3d*0w7r?gΖfÏյnV|/ O"_!,7FbĞUv~ hceTL[wOT ao6`3{D ʈ;atf\Si*$a^.4ɽLie@)#_u9!d?ɕ0v\./c14?V(eXNT,B<0'[҉RWnL(|7Eo,%#-כnAR8_(<]קnƤޅgIVf7uoOeh.Z`4q#}6܇AeǒωC6@)4YYxK%bv)FR.k|^]eE褣lV~p*b|L!h*ljQFAm.o,IY&ZW-Lzu*^4nͰs!3 6)"g| 窱ita+ m(Bڀe?5UƯ5+?T{5aUg;~ϏёJp(t#ZZ Ͷ*"`g6 q$YQg>x>Hu/%W&ϊO&/巴,O^ύ<P)Wh4PaEQ |]no#Gl00BDgL$|q$4`HQks=*$a1wtٖW've9-@F,#8ř0Qq`u&[DspH]O8'q[P0-6]G&ˑCKPBA@q[t;>v XWRA1 ^$yWq(0〒? A( t@ QO-vlf*ǬOX\m@adSJ@a2"w$ KK$"LOX< z4xaY<8Ыx{O7G=6-hۅ˻yVۺvuJr7YvYiۈ̫iq4v#NOt2jƉQ.ƈVGTi ,4טy*v&h[*f.[ormz-4?-Ep·{/ua,g!4ԙJ=pGƳ}i I)X7oSOR.Ľyۼnjne7۬˴ٯSfť^$uW9Mc?f(B~N/\o~E ^z*j+Xv2L*ضU1ľWN?N2geCJ6+4fw*|텵ʕ 㺱u\eiafb+i?ATw|{W ncpXwL\6")WnU R y^@He+SJДSM]OzԷnbr'CIۤm~[7ۦZdiƌ1[4]lٮ3rhgE9׹.ڮU\wYɓ'}&з`q%O}H#6q:[k1ҵ&MỈ1O7w6e "%M⏽tܲZ{iY-GHeU !n endstream endobj 526 0 obj << /Length 835 /Filter /FlateDecode >> stream xڽVn@}WXDm{ࡔ@4ƱX{]&ũ&4}AQ9;;clg6Xgcnh1ЎBϵg}3JKaϾ߳q4eH xcO:MrExxt?CSK=)):(h)e68wL(z )*FRQљXo`i,դ^eYxu<_RGپOGׂI4!D/D[7z٢慞3@)Sk{\[m2G u%$ZU B F!Fqk6{?10^fR):(zO*ۂy"@<W,ykŶy1|>&..ZԤreՉ׃]yЎyBxF-KC~0dQ^Y^~:sbgm2L*1̱.HˌXRC;MsRٝmݥhMUυtЪ"ǡyһoT;{yIv:lt@kW/ʓGDl u1-GU;gS}G[RX7N!y~T;Z[+b|w!@A Դsp\nbsh:$a-u-dܵ%A]~Pj9pyg_Mn068*=_ M@,4G#G]Or endstream endobj 541 0 obj << /Length 800 /Filter /FlateDecode >> stream xڵV]o0}ﯰFP_qb$lH1`mM#Ҥ$I5-+lCnsϽ.A!"xpr.RXI&x(! ae!ï[<)%sح-2Q|GP*SG_rGKCB)jVjdKGaӂX`au3r ~J dAbҵBp%-Ȝ9>KfK%xY]5.8xdi~K44w%iFS.E]b7m5RvFxTX~3(L<WQS$W6-d3Kӿ6L , cizb4 `]E%X١P֭K*x*?Z$o3 Mymd8@:]|wk/ujgL޴reak{EI~PrR_ym"m=^0: endstream endobj 416 0 obj << /Type /ObjStm /N 100 /First 896 /Length 2139 /Filter /FlateDecode >> stream xڽZ[o\~_Hp[ m ?(&5"H%7#5b1%@ysɹS*&h9Uh%qǿkjh-6u-Jh{DtÍJK8wn ܛ&jubOR:0qTt'تI{8 k, ^ @ xU՚Dbd#"E,'E4?k '1bе#9~/IaX VF02F8`g#bkEPՒcModdmb /7ǮINAK@5KNpl\0ylXO^ 2og {xy+ -=50RT1*Uߘ$I}k MNɰnj`CD:`EZ=uZ1BN?Tb{{(ԙԥbFkP+M1X!)T Zu *KJ @*Ҁ^(c_%="H@̠Lbyb}Of}凛_?^~wJZ>llo{-йbspl 6xoOWeçw?oo"0U }:k[9ŀaJ03CZ8`p0 2Zt`t>A9W'ajZ20ԞaT@5KƯā<yt-Gtp՝k&L naf" ˽Ł`A& 1b̃| Euˇ29_5W`G0_3rX,Nq,{ez=Iۿ㟩wx4ĭ83O_..>Yp(8zWn0N+/ˮC+W5[z;qũgpn!B|lqa?9X͐H"jO'j.EbC'!>Wiw~|Ux8Tb~|-cEk"i< ̚YO1+kڃYBOAl/r"qFVĈGF8S#?SaD0ҡ endstream endobj 561 0 obj << /Length 1415 /Filter /FlateDecode >> stream xڥW[D~ϯTz:3ࡗB%h"ThLM@9sq{f'{1vVv^NNܰIQȹ]:cG: 烛 ٣ EۊxMp8BqDA[e@{}Kr&7OnI9 5I$4ji+kfxZmS8%}QsqT.=a*SͶkå?zd4Mk.-6: %Qԇg < p9gΫ1[K^F *\}maWyU7[@Q H.zd4yU4.->k5?sa2$MQōF`f TK=B%GI,ЕY͛Vʠ!3 Q+N=x7Oxw}AX\+ /EV }Dv6y{'xF( ;٠VZ,d̿//s}iө͗~:RRb׬DWԢY,ZmVpx@<WͰy켸@T QY-ɣU׷OCs,HcdG,#CA8wpBBP ;nie" $%i2U=v҄tӒ@)sUG/XQfY{!s’̿(AQhKñ ) h TVV,z<4uն(v wpJ(BF^z S,B4rUMFȽ]FaJg0W,b[Wm1LTMeY|'MSdwޞFJm熯4(S0QG۴ ,[zigfz_@+44St~Lhӱn^!E4Wu.}|I30tQb!2^9t]]z[ڜ{! 1,@$u!~ P0Z"v0~Qʴ1#s;Imfa٦u%SMEދ+-sձq*VG݈_Fveօ!cĊ[]h.Ch~ >ͺTAy. `?Y8N.CF)CQT8t#N "/:Уb4څ`o1 endstream endobj 577 0 obj << /Length 1189 /Filter /FlateDecode >> stream xڥVMs6Wp|PS"L{HLzhҌ DdIi{,d2e; a8Xq&M U9ɃE%iyKX~dɉa$q&3.gDZіMZ* LSN]&I8^.Q^V%݆KC*V4\lcTe=O=6-/Qǡ=uk7RJr^Fͨ3FVhcd.dIwM[b&-34Ĵf/-5]3eAW?2 ~NT`|ЮyL MtE>p7YF}gzoסw3`zl5_Sڵf-|0뵞L $GUB4=rN,:JtEzٟM?#LĜp> r#Zy ~Sɗ+}Vq^D~4^aS73Y1I ȽUowlb~cIa΂zk͢ t´8xner°!8HrRvB'K}0+: U%>4қaƙd,r9L@br?6UsfΚiv؅"o筐 Y1Á7uo?o؞]緗丽LC~LIRV{u55 Fy+16 Ј:`!) C%>1kb'oC'" -g &⪬왾6SUFFYxbAv0$ZD(4ܞѩrk.G+XԷ 9kP#l E~me!d!h5@*&)`蒽xYL}A")JզmҦn5{V㨫3[LC>y%c57w{&q~zT0s^TtrTSs> stream xڽn6=_!l۰atk1t]l[Q(6mkDMf_CJ9KaGsŷa4x䭶 Da 9!0C"ڼ묘[z!Ā`#,qjP.CqycDyVh5"o4}dS @XM k ܾ5JaD4?L+(? c6,:+S`76/>IpNT1?C AO0|NȲݤ9OY>D} Q?fe]H=TKc$DH ɚ;nW嗝2@Nɭg1WD7e=Gp&}׸}[>muj}W.=`KOQ˝TZU;t,DZA_8Fˈ9O|Ϥ2? WdSdȳ7ۋ_ f/ah޺6AxGZz-& oyd> >BG<0ǖ=eCBLD9t)hP*YBj5b-71yC6ďƭ\YJJ/O).SMJDK$miϠ:iyf3VuEN609% o"ܫAPkU 0) Asm#kYm$Q(8I*8մ̧ C#+FY`9+c1dpن{"t?~lkyeoqW4UY&/f#r=jsw*d5t?+Ysp\_y( YR=4 Mt_bB/[D`e\9(W+\e6缾Qn_ v,,y? 4VM:s㧴7yR䙩(:[(~bqw#SNt/ ' 3O0O) 3hru$DWSz.a?y5-~yHmޗ<Py_bT]M1΢5?32I'Sd ;GY_^$4<(ge1ք,e5m^bX?}e_b`kaGAa+Zuh*neYtx\-K~?]rK!]0ܯ&4oNj۶_^]GnUCUmv[+?HYGqx)R endstream endobj 609 0 obj << /Length 1318 /Filter /FlateDecode >> stream xW[o6~XRW*5P붤Oia6m .yoE؎e Qsxno_GoIPyst"'0 }Ϲ_8c'_? ( ld(HŴdBɏ=z4;'񕨋f:.(Iy5qIJQR:/3 #%qgIZ_BLgb&(I4bs&%et;bͲd|:oqFK+2WS6+YCp) :p[ ڗxyg3Hb`6}Xk.: bxbglhqpFJ@y'HI|Bwԇ{T cBp 2-Wt׫j- lia"L/?NH8ڊdl皭%5hM%G w%T-J!B/N @z89 d<;q[?4+ԡ;^i]s Yknhe=*5hz(6Vz!~uxL,|F5fYs6M*fG UWXUʁRLofG6U7Lh\,w%jj] EcfSVzThxA[k'l]4bae7qV 1UakaKr|ABm;1F>ӼlθKաZPH:N 6ΛbHUWdGzGz77V (Սײtضƪwn,{1`?n qPT ^m0^u endstream endobj 628 0 obj << /Length 2294 /Filter /FlateDecode >> stream xڝY[ۺ~ϯ05WE]Ahf>,hȒ JK{RmŻ) Q!9("\qIDaaHX,$$E⏠h[WeylE៷wq$- hDa$Ve}t#zД$I݇sRCtph^!4WqCĔS wVIbʯh-FB אC3(|7^W7Rr:e OB)TY-þ0oR6NR߷4܍5I:4h $@ɳ[<6<ǷnCAIZ^4>7vʢg \1='{Qǐ%a9ɢȆMK8\ Ac, -Rz7e9vV+lM: ;c.DXIS+8xH| dm&6@Aʱby|B*x.-X\;Y%}ُA`c?t3=2DR2) *#;+^ @&YtQR ,D5r4.0:;&* ˌ*\ 66-Ρ%-_>|^JNXxW.6MRlYF(_)W" KڝS)Cuh纕zh%t_7L @z$b_@#˜/T[`Ԛ91d .tZ I 8lA0٬Ȣ?pFg/X|sZ^t5"6.}Wiq2kc=S&^+B֒vo|!8$P ^:DuPXX<1bƻXQe_A!d[iʵmj ƠDn`g Op7#{vx\{|]^g9ooO_ȎKHRV=l!DCDA12\U3:pxLMY썱k\1[Q|;y2 I6Y\Ҙrjk'%^610:C3$I@a:~ Pԏ0;+׃8w2.@ 6K1.2ܖr݉U|۵UGo&Cr[>ՙ}󤍪yZ13ڥS' g}!:{虿Zۦ sIуG>;oo(FvhuլQӕw] s1ǓgA{x?P endstream endobj 643 0 obj << /Length 1539 /Filter /FlateDecode >> stream xڵX[8~ϯ@ 6 J0̶ҨijխF$HR M16IH "V3|.߹ד[Ƭr0Fy0r)&Sяɇ׷.I]NG1#ڛǕձ6L?rvXrڔ[s9>1t_Ecű(F0MeG vw*os1qqipdQHϿ(,$4rbmq2_NѪҤfz}k3' eb-s-EZ=̆DfN2uy&LlLy&eSAQ/HҢ1Dp^ސ/uy%<K5!R1l K7r|2豭L7/2=+E%q u6Z=#ln^1 O^#k+4']ȧH6][:k:ݣ?d9򼴹嗴 UT҂( @o۬gWjY+K:}fiƏ35Ңe<9?(WKYcl淉z<|~VP v"FR`8=APX^jnVOY ܅Q{ky/`0h{o~A_iG꟏SuJ LXl.(u.[yGO3'0ہ qQѭk V2li8W3TEpbiXU$ HSr_#郸ߢ|u1e[vjt;ԹVftu6)zQ?v7ʜKlهbDS_ԫeyL]q-e 8N7}vM{\KKHe`; K~wC? g3DvW|+]2h%;-#y5-/~_[E&Ų۾9LembxNF5lP"\Wo`}ո y endstream endobj 660 0 obj << /Length 1290 /Filter /FlateDecode >> stream xV[o6~>@K=dh2lXq0dPK.wI)r#Ii߹m=4q>y{.B/ ҈E|QBG^@̛OR߮^3=<9K N@!L{xŸg\H91AS]R/R@ NoNVVĪe AU(ӒQt8A":]P IAxk8Kax738?O{ߏԆ!H=!PU⃛lSg&L[}w.};eU5 c_63CD,H3,a4c*aI*o)Uֺ4r(Z-jUui첳~Edݷh~p _OS2JguV]fRй.!.+KY(@l9c#UU ڗVe"[;̪z(;Ne+ݮ]efC9e¿Fҁh3jc1s49,quOo#BH.tVaŘ<;Vz{HtZM)m.H}qw7܁4Xy"Q1ŦbtE r 4f\Q|଒x0P }cq#E f!aa}&>6fzq?t!X9?lTxf4MQ]X7⿨b+KH֫zd_07d=vmM].?o˜L.6FE̼BR$yyC(m2R̪M[h_Y{!u]KQ)(9Po_vN]Xa ]S#5pkHF ֡ 0HO7ED$! v!0aerTQKSe]n)*zs ޒ N$17؂b¨P\ET${)-}ThiR;qf0&h KG@ {sPyۅ (W:[J];J: dde(r f1ƐU&5 endstream endobj 554 0 obj << /Type /ObjStm /N 100 /First 882 /Length 2185 /Filter /FlateDecode >> stream xZ[o8~ /C)^!` :;.0Hq;XNίP8˱txTb4ʨ QEUe3c4*;1VPgXƓ&: p!"9tR-e  `0DeB'Cc-V&GX `)畳X)&,uTrR /KqDGQd`$osɽ$/P HT(PLC$e2V`:',[qDXr)"eD(ALdd o78+Os0"lla[`$gP*h! e6PE$Rl0d2ϊ=4.`8)H'@LnL2M$`]2MBe$+NQNPM9<"~s*D![S>(Y.CЉ{Gg>1#U_A /g~x&0~̗PUoB7݅߁2 w0_ۢ꽪~_jԻ5nOQjSUGu\.&u[̺ >l =S LR=7}CBIPrR:YԋX VُBrs> )4܏j%6^><,+T'i3V8U~/ΖˋUU]]]xy'y5NjyunOW,9#c,{9I3k{~I;&XB,9'hf? il$WVU6^+xV/u./zv_ &o{|#B 0"66<8B< ;)@p00b1x[ۿvOw<}7nXKi$ cH9l bmB7Ӫ]guTinTHOw;) }H< l4TڭgU|6;pp<z`J]8F,?LQ3@02d07A[RN>PGPQBs}6mg ҕmU%-X[d#/Ate~Z::|~ؑ^NOQ.nzt #QYg]*}r4rQNBY/ZhЬYb,݇/\x6S҃E* ʓ{Q}F\Hu2-r;amb-u]zDp<<"~;3|; `r5 բ!-O7 ' vGOy!s)}97A\k\vROys>mr-!rJq!?8h@0l*z; uq ؋a @!'g9Ra`_as>;6Ls?'Hgu?SܫgkW*҄-q̍*R$.$'o)sL+:#D~8LQ#8HW >p.^ON"3(cGQ\)_ endstream endobj 678 0 obj << /Length 1142 /Filter /FlateDecode >> stream xڵW_o6 lV%ٲc`bm=rm(TGI:r`}Q؉%%(IOV$ʻ(HP燩(xdp(|-k˵@a=`X8E8#b~PLFh,[ȷ o89r:wɨ'/YCrUղYohZK[sR[H(PRRsb !Z-Q) T5f&y6nBNlˋ'>\,[UoXa J!H| sj(=ŝyU!v(iwͼ \,ڽ NzQ n&ktH2$QeWC8(I92;> stream xڵWKo6R >$J ib&7$d-+D+)}gHJUNSk g44x}xz '2X]R"bD`>*IsWѧgq|t${Y[K8]-.4`|^g7s x:\[FYҌ$ 'y3^umѰU+f΢4 U7ܶ<&@[ƪ,RnaO r9 ,/ n̊0S,McN^w@Pf endstream endobj 707 0 obj << /Length 835 /Filter /FlateDecode >> stream xڽVn@}WR ,#E-q°H\'w`|k&Uv03Ü33gCP| Nǎ&d(!;y`34ѭE}?:= .i|tf뀘@n̰ 2Q^˹,m[2wѐTgK֣-\2έ ' ;F(^'͢xa>1Hb3{ .J<0f 4ak\+\-̋(dQ\DŽ=\tSF&ѷR*uRGY8p]8T̈VGN DF=A1B&cD$ef}9;MoJ E0a\5OdHI옙^(e8iv\ 2L :+*&dU%`s h*|Ǫ0s."*UQ'͸UeE)pP6-aކdin~ZeEZΖ2U<β1>e+T\peQWD("W($NA3l(?pR -(Xj b.'/4ufaâO1%< OS"h_ciMDG !M+[dX/ endstream endobj 729 0 obj << /Length 2230 /Filter /FlateDecode >> stream xڝYYoF~ %`@8ؙlv$A@I-YԲއdX^A>L}D\}wQA.bQR"/^߻٫]W귻޾Oɱ2@gnwwWb0/ a6ǫ_~`ȣ{% &u_BR0J҄EɳR $@ Yp"g^OphhV7\Jʸ[1m, )|Fd iL+S_M (N`G7,'9C(u(7?T*W~=8 ˇx>ڏo;V8fgNumݖ}IMAVyJ.jQƧ2.0yf_H֜Bt7[㗏nFI^ؙڝ/`j,R>2~B⼆c:$I4%?[&{hIS:]@TWr;f`)UONaGЏ<)Ihޜ{x> }_m#צSX?kQS>@&p :Ws\nWF +/ y>G AN-6կr/="lpsH=YAhBŠwW:D1,(YU;\(5f;d(7D(a 08>,O3گTT>TcHa>w,?t [stKaʢ԰iDU_##56&KO8Bqxw]{f O1j(7# ۔u=bP,{d2rU eE3MlM 0#Bh#+R'MvW3m #*"tUM"(,Mm4-BcڮM(BԵF9' ] d4L!sfW~x!TNZN\%XvUf0Vu)8 Kd)Rql@ݹzγ0蘑AP08B 0pL ,W:f%w :OC\*S)/,\s8OC%XgK8Zr9R)=ĝrd|ʭYI<.%I*)_rg5wzA O7m.Ij> (Ii+\k/J^<pЩݱ }nMo2IPOg,I]g3 xu몆Q;W@O[[nX`4|h5:(|#,m_&j6y }lDfwKfvA۶S: Qxi~p8+daIrMZx2 3Mg9鰫t:{g4gYa:_L(ұYj?*4t_zF˞y?L$6{yWG6b+FyOת=larVbG7 endstream endobj 743 0 obj << /Length 1635 /Filter /FlateDecode >> stream xڝn7_p"4v@GK+=,_e1 pֲ?,WkE,o-6m渾6a-֗ W3tE<>g+{lj$69uSҁU<懾5EGb-v DLҼiI%dRl6٪Vyf84r-ڶ$,sFuLPׯ?@im#OrVI)'xgSaOnUޔ) m]F Q R(*F^Ѯd[fXh3^?;C],r-㧂uYtD(];`O}oez$))CC=k۶v|ov(YU\ֲRqU~o›lQ͛;j7䴮򲔫:7N)ċ%tbpч1;\Vn8O8QƝ~+kC@&5]}A|e҇$?+-[ȭ#W C7!7#,}x lcqs0PdV5%N:$ #uaHګ561GXX R4}ffB*r@oX ?|oKRֺ\hs#kEQ#ಸ224^ViUͷABm꺨^`Sfyo:ƪ9q\\<㺰nahҳ/lk 9skra nVb}:h-x}[JV(,6od17~2;ϙ/~ISz8G(qXoe*U-a à/QWT1 'LUf<`Qp cUbC.BeI5!^ ȟ۵]շ݁}۽5vRe?zWP;>* 3=EO Kz0KIoe;0,8[DKjuz8X0!!8.n6rZ#ZxDnT:A\S 1!w ]?*[kb"'z?050^dݬs|%~o1PpN BGXٳnt`EBCVgthY;VPk :jI1B/ILw.w s֬e+;¦+ 2Vh$,|`l2L:b՛&32T(1T2,Ǝn$K endstream endobj 761 0 obj << /Length 1833 /Filter /FlateDecode >> stream xMo6_a2YR1` h0aXB)[,i4;=ENn "|}.v ǛC4wIж,^/ۋ蟆Կ6:?#ɢC>ÐČ%'bՏȘQRrdzn=&}d kوMR>Unb@cE8%4e\;#m#AQmE^%&]_ {EO ԇ5V^ dJFYdoF/JwdRbj-!5>5t-{}peWoޡ]F9pJIpB aB)U}dpiXl|91a^w7>tSfI!2WCA{(*]e9Sr0a}0[3R:N~{S? 7]c&rbc)ņg8O fXVfG=Pn:7jEaD3^E`ÈAl*U":(wB81(QQ+Tl3NP7]L }wXGA"Fܟ`Y-R9vs}НvݥڢϠs-8N!G"%V޾T,qwJ@7 IJιT/N}`Z}j^paOaxBJxlޥ#pъdM3k PJ5JS >Loi" F*?hߩփ(!ηW7E+ endstream endobj 771 0 obj << /Length 1930 /Filter /FlateDecode >> stream xXmo6_ad*a1#zV ٖ- KC; MdI&ޯT$GI `rw&7yyELRF~4&Iy,dw|cE(z+Y׬UݭZ5/olqˉg ѧ1:UsoGcyqD!ј!Λz8BM!5nі5}f Q91+6r ˬrwaG̋Iب:k>#^,8N?kp-d9%Ę4@qX iVH!Zwmq(Ȋ5}^ged^5Q ;#|Zl˦]V+mDި҈]h0sƴe^"3z\zn=9@n6:\Q`i!ʝ۪.ht%Vj! "Ѩbk3dR#f{uu~83/륪^? `6> m,vDlsɂJ}9#$tIǪ2+*C?qT7Pl<!DaVUU:|O>5SdhESǝ,W4WbIɋP yl.7}' a5xHVٞh1KGpޮBĩdd!6AD2Tdʦz(WxQ՚i2h߫;%kME`[x5D̿T4$֍zDL-FEU8bs fvEVty(e"?\LJGTgRَyu v^F2l4%ʛBC~¾`1YvZ ?˹w*RGʝJ6VLAvA+Iciq̍)ƌ[@!bd ) p :%gL !_;O7a,FxK!L;pr<#P_D{e3ϩ9t{qg4H*&xpo5,FUsMɄnވ9W1/nQsZ%k(Zr^nJf@ϛV N!qdIbM(NJYxyiX{_;"oPuGd0lF w.OGDǨZ#FJrXa4NAIX.T|W̖{בN̬s#W4e͈tNm>%̫ʵm*H"UX=xy|bC˜p}Jo3.Pӧ :od 7Y_qaZqbćw.3iJB;/o%} !-R_oQ)MM*E+ h1W5D[eT|abH|9;~{CT.X^&lH8[I0hal.oÑy$@0 :ŠئZ{dtFԌ(嗮Ns.g4 :$>YaoϑVk꟡_R:+ZE//5~D4MS:66;Lьlw7ұLZ@2U@ 3?W95U%lSb=]gKd~F5q hE63x`jJHMwJ^N endstream endobj 675 0 obj << /Type /ObjStm /N 100 /First 872 /Length 1846 /Filter /FlateDecode >> stream xY]o}ׯc ,i['h#֐VMYjXBKRgp&gȱL&%o|x(M٠vDџP~2/}%_LrѐD3.HD ~bJ &eg AG"x?e2>x&IG#xr/c6x?t r> úQ .࣎0#ACH:M^G !K.y4Z ,cW#B+ "R%'&:"1\ЀO9PzÀǘtǣ[!l-@6I! #X)EJI# P`68S},!3,&=IH&*a!A Qѷ#),G1 8 i3\g8f F!4F79a'Bk nC-~i/'?t̐\\i.Ϣدf60o=:09:pd~n& K9](<8q#{t9}UxI;aQ=Tc# VK1g8|0mjGdXy1'ݬy'C,k?ڛ{(׭w5~2ɬ],'t:ng㶙/9vs{sy~$oi bb[4(%vJh<) H !T0d Z $TGd~B )PQ+߭䮯o]`poe mD\'J\}>1`0 ؤҖin; ^|nfh\_/c$*Dc%A_,ӲEun1m4VHx  <QDꃄî Cf;)vs ^?#(T-e7_˫}}R̪/^Uw4(P[}[̂}8ׁ)}>.9p\5 0(?Jm.$Lm^s,GQ5,=U@!7Tڐ[UuCj26;Uʿjʄ> stream xڵWK6WEF#O=={ ZeeeɕwW*6 p8 i.~[/VWb]@0FAc$ :, W-?Z]q>瘠$g֐cꊱ ۘۈG41ݒH`aSjfw޻'wZ6"e"s798Ms ?2X&de #~l0Ts6aTT-~ꕟݠu5#w[-#e>0}m9^7g'k_ƍ^օB3r 4Fbۙ4We9|1[_ w473 +Z)>x0j,to?U Ii\~Jt6|}Tk>_il9d\9d g ;esfo/ 1~^!:Rj?ت+bd-{>vûCpq`iW̵jgK(G t}*~-cl> stream xڵV[o6~ڇI@EQIb}J@iK,j,~9Rzi"p|;ˊz-@x=Q(@;vjYQa>kQC#͂X5uru+@oDus?9b\Ɋ =w95A Kb $DB\ cD_@ |&PSss_l,<ʜcVYU\c]+|wÅZ|O<=Î?ixSz X;|pcy>wU(~:.:[|Y\ܣuɇ # gSC4ݠ{դЬxe&^֬"pTYۭKkId<簆b34z" ?#.GWhӮ$]ӓV6]װ$A~ڔ*CPVǪϤHO^^|#2 vfڵ9ތ)|'7cAW3G/nb?R{/^Yzu:!eX/ӝ aHw4M- Y Me(:,U~vxJ~&vjɜQG+wLu꿷%s 6x'a} C X/Va EۢQ۾uoP{ȤJA@8vI~aPSx?6E3HvGRk~ 什$ >n)߰Qz:_I`W# endstream endobj 821 0 obj << /Length 1397 /Filter /FlateDecode >> stream xWKoFW>@mR4VNIɘ"Yrŗξ$Җ'9AYrvv|ޝ?W1r'4V`XxiQ̨Z{\ux}iUMvF4z eJeA;=%!M;؀a)0>13=Fۀ> d)WAFA$O1JC$conRlŀ.` j7o # u+ŋ{˷7!p1zp܊l3嬔.Ke ǐDZQD? з j+k.a 6n9[bO1oBcڟYB&XɝlKkLĊOsF(ڣf~GcO,gTY21ZƷ]}\O $\ijlmspB` lw* &Xa`(yѯl&t{rgAtuȞ b!2.>|>9噷Ӫ[/})|3+7ox1L 3qQmqQ[ZpV.{ߩ?LRp0$):F CWgpU#eYRtE+nBcWHb$Qŷh iF9J!3Δ -ie<'Uyh}e0c ԢרT3)zu?w.Uv%Cvm?? +%!g‚9w$A$O]8 PW'fl z%K.+}>:Tl<)@ w$o*4gux،[CtnC}UE=wNy21(K7VyU(t֎j>klzmuXR t^e08ץ_au !8MkG'<~P̚ endstream endobj 841 0 obj << /Length 2234 /Filter /FlateDecode >> stream xڵYmo_aP@6\%C.EE_nOlӶzf;䐴$+kX 噇L-şop>I9S. DŽ'"Kc"8[\qI$hr2#57ms͞(A6[d׽VE%b5-UʨuIE*cV CuabP)1ppޡFgciN{5~~ G M& #$PJr! f^+:s"Yt*GU.MQ}85xҏ:VT:i3p~14OIB)48yڢUѩK&$_F4Mݕu;M׭԰M+yRBճoPj}MRBY|/˜]A l#OAH@/[8;:4+5.| vڴ0GǁY@>\y&" Fq + $[ SPmM: A"hY"xԒ$ĺl1m&hm@9 -dXt"k BTte`l*ʯәp!I)bdJ q0A&K/i"9MwXT,W>1kuwUqqdYsYxs4,ؕkc:otIND?|xtC{ ,4F2]>8CkE Lj9L$nl78cTf?\F LVG5g@Fyw qEe>ccFG튧t#Zȩi i`Y+9%M&*o{\vAՆ !2 i`lul7;!`II :b/O";Xﱥˍ1 rpjb.;*̈%ɒ@v }M^@ΓdT<55#&U֡ /ih М'tp9r6Ơvc0B!Զ|@u@u(0-wu$'D=;gXlbvzy s ;#i̼@d>+{Y~Bj|%6bS:?,| ! cŽ"G6:\vc}r u.1YjU}*\}{uP_ O %nS/'}P6."p8yruv7?=ڕix 'pxNz=١Eb2(1T->sƤwIAeI(gJRȮ7$D6ZOє%԰PfB0V\k.޹s x-x>dNXG)gBMO)5z|t,VϻMDFX~rd:zf=TCb(03 ~ѕ܉UzmKLcewL f˶&g(,Ǿk F//@Ke'K#tc[k]pDfyB%T>_a郛- կ7?L>/PH] { E1TY˜<2] $18< endstream endobj 855 0 obj << /Length 1770 /Filter /FlateDecode >> stream xXY6~_GX3o'o^=}2H`mxd\Q7W^1XҀCIzk8|Q*{{u E귞i#e%qȂ&D2='I2bI*Y4ȱyS.yD_K2U9!lU GӏU9[LJ8Q&/lwz;2ZvyK#I(#Q[=+.cWuw4x0 䂤'xɈfgI.~J^msV*'' 9;܇?jtPM׸O+~D67'⤒s@n5ЬV),"Gn>HzxOf_6]oNi2VU&y]±K`ʢVncmosЈAp-RGhpE{FeAd_]]*:XmX;A`dKi:ųgN߁# Cd#)v8f BVVP !3.AUg#`$apBI$Iׯg!$dٵ9@`sYUQC/L4NZo >TW#9X&pYmN,!J^'xfS]vVY`'Y(7 25r i&A%qw*]zZCuX _PD4( fյ^yJEŰR"va4,us""Q]aXHiq,Z.aI;+gбA jh4زvÆS68j4& 8MÅ%#_R_[S^S`0XƥXucGMCSej[jf cyیS1&Im l89"0[a׶DkS5Yt$m3 ڠ&G#DbJ:/R]lxtQ[o IqS^?S|TR!CfM%]; U' 0*oߛ5[BE:iٚtCW*M["LGR)%al))_75PaqSJ/=̪=,pfБbo`iZIېazy0I9nshRRqu"= Qr3jfSILhUq9"> stream xڭZY8~@bIg@ē`13h%F<:~dK-0@],:Xj,|OsD(1;Ǩ3O?\Ov(`IXd!.)xs,\N>l7mo.%4A& _y[?qQ+ǽں(3y:-r7Á+ OE.]Q, m)4S0 EqE^Wdb~ 3#-3#>,'AYUkڋ Х^|슲hPLD-Tafd^5lD]b 2k`rm*cEV8')&1.bmFZ*ƨ+Mg=t4*8OkNa)?:~} 2R5l'0'ᅈJJgDԏIFX[Oe5pnPak =#ȉ!×!-($tZR- ܹIBۥj+0VvC!C$>*0zwtxJ̨JihNh*nTegoMjvA jḔhG"騡/@ya6SJtFj؂ VFMLƖZH7) w[T(]hZlCQ}S9P:z! CFsN4gDs߳>FEs5[?c - C䅝22G\2hi@F$e\2 ۆE{"$ rA7Rp-If\v;cQGE,z+|6V#'?ãj6< Ֆfƙ*3M5 uPk"'͑RSdO ޚD^vUhs8Khͷk Ab y~z2 biC33ZU] r{zH`:'8x1>9dXx/!Wz__uKtin AA[(Rj]sEU,,ᗅJbLc8` F9̍ĿWb)x;Q^ bvn~yc^BKBND^Aw/, cj`OG{^8%)pqlk}5ч:ԥyZhۅJayQUy>JCpafzeFl6Ɋ*4@ki" m Pƍ:.kUw2(tRЛ͂4&#àf!ߌ XA㣀-;,匂-#Yfi> * tFTdc<,6c|tԫk=cկXt[(`^ ƑTPdә}Y&˗g).CD٧r]PAUeRzk@a2(ՇA~E?]εg~B^T9jC9S grS0-"OkW^ܱpl` EA/WYC᷑M#g973d`kDb(6M3ʧkGZm. D}P( [_6(b8wg]XXJ_#~lY~4[pVN.CkhOqP>E_".K3y(~| a?e5^븟EO#UrLR@%q0MSҍ2fG8( f;wkW5 XMGY~O=%i,{R^^ݼRl{ĕ)F~sCХzm1嘅W}vֶ {pHw`ZMCUTk8m"_5eYaap]@NBeeeMُ0zZI;:*afyTi,RԽmE73c\60oy~4q6!}7JV9s>{a㻠ͦ-qGQ`>{Udƙhޜni<]5ROxro}a˶|;el endstream endobj 777 0 obj << /Type /ObjStm /N 100 /First 880 /Length 2053 /Filter /FlateDecode >> stream xZQo~ׯcp\3q@@@9?(VOҪɽJEq# .\zșf$bI6PВa&6(,FxΌTL.ީ`Ƈ { \vd 04J/ ޛLhSGa舘# &G)CA !MgVD1L\p%C.HFGd]1M,,ڲt!"at*>0`倷# 擜F9@8C=9îN+, 03G]#aRy&[(4^4͛co.vj|َlW𓺊jqխvUy?uM{, Vo6x)x3TYaq1ahnuEKi!iZjEF;k"Z#ދ+V|VϞ]mH~/LW;ߌX_p 3 d#VN\ BcfDdr '|?RЁBbkDm ޶qʶF:j*Ψd(Xx |܋J&e N6e7[g+r=ܙDnLIABjhH l)Z/ Xߙ5۾? &"e\o.Ԩx?OƋo9]ѭxN0(~g+( iY"AL|1)wbؒ0ab)S#8xgAy;)޻]OY)n+wnTV 1ߥ%> stream xY[o~_a,9")bAIvmӎ$$yo!)d:m0D;T:_ͻkW)Rn+DŽ'*Kc"8[VFz++umfVUwb"zoﮓdJS尅23M6՚eLıw|_Nt\?.IhjD >7`՚$ϓ՚rRd˃,s,b%0,=㪿Wة#9T}muǑVجck<<~qqNn{bg?/6/ @w#gCb[gY&6:]ϥ'5Cof]PŸC;pius~%#YF_7[| }%̲ExY\)ש)wTi8fQymˍwc8 pܛ5Yv5'5NMSx~+헋›_hVP-ȕRe}.r蛣˭]K.g'I NXoj/8Dih໮i/7KH*ˣ#,Br*)8flj]sD2 HV<ĉE'҂$|›_n?, &~]$MBI,sEND%Ve=uqD1 XU ϸJ\4Z\fAd+٫K&$J F +fnߚ ނi&yR) o1۱zMRBY]&{jzv&R1 od(EǑÒC쀺Ƿ-ЩccAa;i!.[nն?-XR$#J3sVX$%\6$g4 4$kyh4HF?F[$-L. [,)ho\V@A uQi-V!qytͶ@`eSm'yrc]MQ6Ye(lXEx|ZH4&KGҀge3AnJ_B` `W#b2kJ1$9w`?G (ܣ x=c~5phN؎~ކ4+a%WU,o--) #i7,ilX̊?YJ 4-N4#ԋ$%`^hsp!:<]4_,OT=fWQ$"w; 4%슖RD-CT'f@izA֎ Ez _oPɭ`q[WV-/*ƃ8.}A:bwU0]%ޫRp1c~Wa~$_uF00xJbE[&݁rC?) e:9u0\.;r~E˻%I+Gjm&qq`lyl9;!`!nxyJnﱥ˝17cߕr|ADz1x+-X. 1a0_A~XF9.:F؄C,J%;8()WxF, n_$LۆcymŗPY( rI(O1B 6EY8(QKɘ4tK QciוŅrixUn{rr bYvb)µK:#i2x>,@{YqA]E0O淒zhgf\`!e~I|En؎e.DA,wʭr3pߞ=~Q $)竇VV3$]YB2\nwsnu; ; giV 瞖VLQP#˦ݓá}1So{e跲av *9޵MYyS#4=87I^J')Cq LRC'[38{z뗲𑣺-ztLl>ܼu endstream endobj 895 0 obj << /Length 1857 /Filter /FlateDecode >> stream xX[o6~ϯ2YRԅP -[` oEpc=1q?7𡄌Q,hJOf*f#*D"J(r84q{:ϒP3PN&Wm;tQmq8N6~beg$'b` M9y)mQW#M7ƑL4CJ92#"h_YN>͆GPgq <=q'7,d4QFx+-jVʎ(;Ř4Pm syZN !^!eaBM>߈(˓];njMc%_ijIcI/8HGRV CLHEKs/2*^E{Ajzmpp 7ժkY )񜈤dQOf'Z@v'[[J*MpUIacUTM[ո3A_[nIjjK[`ΪԸI2 /`-g!k`ͮH7uvuWq0+%4uhϞ:e20}ˇ49wF9X6&%[6J~'4g8/2eqwc%d$Ng۷3 p$M\7䴇{_"vUK-0`N3K{5DT6h4X ӶbMydm+hXpr,xW>ږhxL~-ܒ V9h{F7s ڠfGOJ].Ŕ, 1w Gw=kVGql5+<*PO$LMF܎q*ǐ! U!Tyc6olqM֤ClWyhwX{OCSشKSRߗߌloc9<^Ld-BGZIi%mC qmas/{;ݎ1D-^ϘRϦФTq|sN)Dُ^//"" endstream endobj 907 0 obj << /Length 1710 /Filter /FlateDecode >> stream xXY6~_23"s߶m@h<%kӶYrud73ROaА ooW?FX[m=LV߬UUQu  ͨaDeQd:frUWi3ɍjhFMWkGFw;PkLZ1s y@WPՁz+)[,#cG4u2xg<~,j.uE䌬9>Q~?qRT#rL$ɘՠk";0xUaxN# Y ˛3.% đzSt٢jypFo];+j{_ݜx'? 3a.!#=G~CzO&h1rˮ\S XO8:Sڳ^"b]_p!P^h|"bΓ-Y mp23w`*'[~,F?hR#E(XJn:Tvg( {89ܞS4 Ȍg[Y=ny(QKYH&E[g6k;I.R&Ou~zO@ȅ GtB#yyH9z?X$1!h{3΁M<뗇ʥ(tׅj\SQ5Sssݺ6!@$ J20EfMTg P > N&EjDc@"YBY?U1I&[]s͖O]#t[>} |$f ѿ hއfx! 4x&EFh3@lh#"|cexgu[ <r+T`D UP~p_=* e&mN }>x v:I<g%K6ڑd\=1OWm^Ϭ{R}oj(Yk. 8 3/^w Ev>9 K}Çˬz46p@h,,#9t%] drm4YP6=rD606%aީc.=T"Vq#̬ͤLq-&G endstream endobj 922 0 obj << /Length 2256 /Filter /FlateDecode >> stream xڕYY~_-yA8N k^ (tխ)Ⱦ`.^:ȡӊy{)Wb%j{X}]VP ; $GR0uMM3?t@h M5)o>!/$VJb1Kۦ0&IiM4 3 s/rƀU)6o WHhO:fj[\}&؀KSE1aH8@J{dhe}tiGOWJyݴd4CvA[~vxl,W*+yC3M c$6 FtBq_~S ?M&!I _&\36Pz#w`V>$7%i*'}*/DN2( Z}ut2*0R҂7,iYYg@1,}# ?6Ģ|rG20)ۺ5ƹs3 Eky xE$ U<mW{o@D DOWH #`p B<&r_e6D2\qFW 2E+r%;88)d2$}-LNU\ՁW#}9~+R_|Bʧ Vچn{ K/@Uۢ0v "x_h@IhB)",>q!?G!NP]uB0fYwPi]նx9$}zO }]L$~ 3⮙GOl\}E8OH1pdMP4+җ8#,c}l@]&ЈE78OӘ]+>_@¡6UN s'x)Fzb>kH5;Ey;gc:l?} Ճ`Ony%mR:+VыLa(VAAq*,xZ{xv 5TS;%א67 !TBR%0P D0ǭ  Xt8wh.!ӯVQʶz'ηTh| o:z@ePRclX@z?P }5I L6Lv=)iqeGK#V鬌_E endstream endobj 937 0 obj << /Length 1395 /Filter /FlateDecode >> stream xYKoFWDzp@Q A 0i-%RwĥIi%9- Ho`> wkbj0PB 5Њl0 ~8uwe\gw,%nbwk/B4P (sZrAjnSbT1]Z9[wD-hiCTHRH)8`V>ʍ#I2ŋޥO7͓|">t÷x AgYn:^grA4BU@Ac,mz>IOI>>)Di9]E=1 J꽫lL xD{ 034YD+mXLtͣo=Pj zSɖO1Bmjf.s(w$N"Mܢ|{} ݪ ^D oEV9RV]R32ʾ*L#Z퇻Ws@5ؖ]Hd8PNFpOniKt>0z߽M?2dTRW8{L_*"BtL;DIpe~Id8}Dcb aAVmߧq'*&0fUmvBD>.9 ZJ(BZuBO{-1gE|!vշc£Ws϶߄우.# 4G- N Jt)dz|A@ f5m5P{$dWgTm!r(bNq!Kx^n%KM& Pb}K=WtnF!YN6$"-뭒# u|K(AP2@ʆA$ȅh.i\T+վh#E״`@5?hcuK}y=F}:FmG7an*+t$@UfeX@6P590H^ײ4< OhzLlؘ|Y[n V<¹?i[139_) puZv(m$fPONԻ8*N ]S07k;! }9R^y*c>_̫Ƭ>]WZN7 Vn26dThchy_]r4w#!s+^^+G@NozkJ۹pC+g-(_o;܆NUX/wl/$ qbG.؝f*>YAtω.YO3iiƥczn+e q|9AoEkraP<;U~! +O/ ܖ^痲7 H㓁Ow0}<^9A bA{> B$L,Tǧ}ڼH'vdJ endstream endobj 949 0 obj << /Length 944 /Filter /FlateDecode >> stream xVKs6W`ԋ8 a<>fK8('ǣM E* ZwAH}~A"zquE(Yb"JQ`ZfYpZ$&A7UMe^tR7qF\O8* Yb6wrT!/Wלq4Đ&8!;-dY|(3 ~ N⭖;eJ, lֈΛrxD}L<1#Z8NlgS5LYf|YSG(]u6gc7ڎ2IcpG~^aY{ȳ7Wpfk~qeTv:A Ʊ;ܽ:4Jv5.0:m@N˺w+}1CF/έb,ޭ_Dz -nn y( T>*ab6d>"#ČH~le^Z^bw7cz[jy|؊c}AShuYDїuNe^'0> stream xYێ6}߯0fyYI]( q5/4,Q+ɒ-VMp8$Lo^-nn$0b5j+b9}vx"au,CM>%oB(!y:2ox]5O{O˧|$p8Jx(5Y$G)){$vIBf?hߕm_c(I;.sG~i6:PF|u5yp<ǽ甠 బl.\:g%ΩNek6K@UT}ASLwv_G41 ij}l6%'D. ?|-o KaJ!| s)ZD8qG$9([VZ@0a}mxwe#4˖cF.2xJ_q-l{|IccENp:ѤHN,A0 d#p5cf v)LTB_ڕKc+iq{Yϲ='h3֗!ePcO}]Z&Wikm7E8/ ⩩TIߋp?Г8E_==>#I)ZoXʩ/u]AM>s*NIfouN)=7gI> endstream endobj 877 0 obj << /Type /ObjStm /N 100 /First 884 /Length 1957 /Filter /FlateDecode >> stream xZMEW.B@ٝ$Ǝl/ϫجwdv=b=3ӯ_fq՜\6;$O%8ra6Ta_˔5Өq%5e3Ẋӄ~.?tEJ'EVD:b\uTkA2`RuvV`TuD6%vD)2@!Xo)lH+:$ ~Ѐ- Nv#*9&LCt,A$:cK8\:VҀopŨǓBiKdo(F`0FqQ-Ҙ@"8D 00{vBtՑ rFQ p J2s:2)ܦ`G ^rFɥ\ yf Nᣬ"xPɩdÓu)XerJXm)&B'<* `bwf/Mx3kE`P- ӄDQEMzWTƶlk\4E2ѣG5n|Xϯ~[?L翏_/e ߍ2b^R,OX>)YK=zŋ?v={=bcZgW3n2}I#غ#Y~/kj?+N47Wp˽jyѬccs9|xlM<D_yt+pZƍy+LnAmkصżfǞq\!|V޿W>9pDK@%3# o7Wf5, @#zP#墙2o:MylQ1h]` 1m.e4? lExp'[֠>Di >ʁQ1/mVSYvlhEx%s\K*'xtE^etDj[U"pyPU"YI kq 3.5& *1^TqM] A LA V F kʦ^s9 =y'5P{J&52(;R8X?_NOSndOJ=gO sK>E J؛Q@ K=@N_ݳQdY*17l.8/7$@-+ (R8mK]˪1umҵk+Y!e]k=J,^!J+T? ~էd^[qV8cc[٬N뿛雷.jߤPĐDb>~`}&(S&4xԣڻX̰z۬\ YhrA݉pscTrr9>>،bCකb?cK6BsTa ©)ߖ|'B7;̝|N>}m~+1yBPnJQtppvRfcdo9]YTgr 2!Snl%ˁ gT?v endstream endobj 975 0 obj << /Length 1570 /Filter /FlateDecode >> stream xXYoF~ׯ f(6NQ-O!E"q/1> Ϋks"﬷Qw#F]g8K=[Ic3us˼l. ly~MIu14rVn i_ȳx~TEYaA#xK)F ;䘲Ž:cKPVld{inOfJ-SB]yߘr9Y)q#ks'hvb/6YZqy?M7l5;ɡO̹4UbM~{{\RjeE齲JD%U->h2W]-Rc#Hod~O˂{u#W>2r}1Sp[c઩)C&Lńjh󏪌Ň`bt5X;$h:AGΝ >UaaP<Ecj#v` ߲|r^$/MsMS =z _tu\e&+c !b!#_bJa~eNm-4Ť* *u,QQځ.ހ1:A^ ^&6Y{8Ds]&uFY(BdN XyACi>b'ojG|]`.`E"͛ BnBym&oOJ /g^pO+^< 1Qq=Dg`mKHvMIu)Lc|uColtyGQ=vZux,CbHO3QtG M>k꣸;(JaFqRIXE-ι?R(pczmJ6kPcYm$שN<0o2~  G2:L%\K*rV.dPuv/5l=ʵ@n%*'7L):1{u.e/Peu NR_mSyŦP6n*Rk EÑO&8|2`RS sO657\EtjwG j:ƪm4R "`sF~> stream xڥYm6B8 ČHz pአn>%E@˴,D)rHYUC"p^yD>tA 'y’i("ױzm qB(K5$)=8bȪ] eőmc~y޼~3'}ɳ_;|izyu_[UfEl (3j:]Hܵ!r'a#}޸I`8DPOm`ewVw(#mD3^ I%SۤMmmN5YRuYk/X"uj7+a!b<&"Y_T) !B&x3:"NEkuGy:aˆ "3΂[Ua,`E9|x~X,Kxe10YUڸXvc348+QY{-wY:%iJJbL\S)#qb%HL+{`qf<)p$CW=fRqQP̫ixhV\HJQveS`*)EU) h [Yt WyKS`Zkf(4z!SE,IH$7ڦUpl,$qʹw}]8kq =K>?-kI պok}i-?;3jYMI4wz2{ܜƑXDxjt'gƣ\LX}"oˢB+ &ȇGn4!S FJ@C hlS:UU^ ݇@ߠ͐a[`W}&.<‘* e$[[ wO+Qش&F".kZsv,,*is—4+NW<$ݟT{{>yUR{hq1p[۾x䩾 Ix.GLini ί>maP=lHC$ '`]m<14QA`=[cȶpQw8j4~ћ@~LAʋn"@ #rz/gƿ*8׿W-Xm #qqdDAb%HJ& >HbV.8r4Kja,Z;-^>`57p=ie?MSq6Ċ,%_y}0OYzwf04'"ӹһ/ &5dzG-aj@j r?Skõ=l>Yi/Nqƚ 3z 4m#(ُŗ2sA>P'?zB]ʺsOR {ϯ}pwaSU wN噿9̯5]bm ѵ;9 M^hFF{_FE펞sv zeFjF,7 endstream endobj 1002 0 obj << /Length 2229 /Filter /FlateDecode >> stream xYoܸba*KkE A \OCriŅ(!JZy4m0D_yd7}U)MWItI,]nWF,ond<}SZ})u˱ӵ]&6cM A#Dj*qxh$һ'V,2Z'R1{S4[G|JcN0i[<]j͒8Ϲ[>=-XR'Jt+sVXpw. M8dX6phM?vF[-&KPHcE-7~G+ j[l蠌{'X<:]V#CH#/VlXe3 (, r PP6@|YA;>P$O'9ivka# 0H$٫1 E5QsM>0%' @Pu1?Ag 4,-Nhk:?@lG?͓`CvU1쒫*Bb 7O[3@ z. ւO [Z() ?k׃ټzp_9nqPzM Ϡ:{m!bJJ84Ts!$4PTKXZYǣ=nyc)O؊-cIpF!z>&4+$a\a'v dpFȻ)!=IcʊyvEK)#CT'[ݣ4 "kOHQ[p ԲtY 9 /2"c<،1Ӈmai(S'6_~wFM&0+k= 7w &N/WU-693 ҃ gіdv`\я-XJ RB0##^1)׉ώ&!cQ>cyXѾ?oA2@Q8%;5~CݞxG#@ :BvHP+YcT[s0iR ~[ɍrXv*F89m"6v<&'3&vKt#9QF m(ƒ Gq u4J>) qrGdOӶeۀPS;#WC6f9W= Q(gBy*qj@°-W "Q]Yftd(jQ32}*=ygh1 H!.> X0qp%|4gwPp: ^VaG뇼p8S:?//s[&#/.}9S~)" Owng~o wnI`rmՏIv񗣬g/ v\ã<[s_Q|gcM+'~uG/6SsXkU/wx+ekޒ%ƸGΏ>MȇӃG;Jh+i$CtޔpH҇/G]5 тda9hݻ^o'|\Շ+ϥ5ш{zn|'D]>Wugp_iQ endstream endobj 1011 0 obj << /Length 1713 /Filter /FlateDecode >> stream xڵXYo7~ׯXIF-fy"(6.Z-OI`%-ZN 98FqQ$r8F%QĈS-чZRޮ[矖b,d1Fib- M ,4ʀ6avAS2LIǣwUQ(?<|qO((J|?SB^8oJZtMzUVc@,XJj'ZҲ.|AA?jldI2>U C89Ӳr[!Y/V˙NܕP&)t˲J] I ƸgAF$tL6@*Jɵ7v_ݼ<o5孅$&!9X!5$KN6] Nh7I:TL޹U>U s VL8Ct=Dl ޢ,7OL(/'|Hrku97-XϹbmͮ=@e' k]ӕkO#>|%%ڢtSk` 鼒 ܆C?Cf;fU?ŖB&[oa endstream endobj 1027 0 obj << /Length 1773 /Filter /FlateDecode >> stream xXm6 ~(0zdu>t/6ڢ%JΫc|#Eɱ^0+2EQɇyxŏ8(XFis&4Rm.9QRY+mT?nۏF]UZꂻ+9VsɈI 'I[zzff~^(͘k7acKYDNoiVu31tSMKJDu햘 ~0E2f ϼq{p$?9,XxI[{@@9,K!X$$ջ+c9(qG+gw*5I0^GmgAe7Y*eٛJwД [-.XJo_^J0xca0q@W*]Plfs&DLz+u!3'ˌejE}&,NP"!;=8\J<<qĤy05NLr&k!'[UwLGo gY?p%V@}#f(:JQ\XuT2DVOݒÁBѹ4aEszL\jqF7K>g?}5xMlۺ;G/jzKK(|p#{<:-_#$<6][ĔYHbwmd!,ݠiԝQHq&0 ͨ했^,j:H)#QTO*TC3V{1r-3*A66QY*ph(3`ւ"2{_/*ʙ` /֊fUY3"˲wog%Y[N\y(N%06@0$ڭ)09"O@x_{iOHxMlsgنƧ=pCcs5=+ [7>ot,:/խ> endstream endobj 1044 0 obj << /Length 1334 /Filter /FlateDecode >> stream xڭWn6}WV Iö(mYP,ZV![^JN6(o"GA g {yltu/AIHCo(`z̻˴eUV{xgﯮ1LPR-$jc`o ni9%x7bԎt{u8"62viD@l$-_OO9lӍ@S?<7U(g!ĒUۤwHmr>b<, VŪQ:xr?(^3mMQOʧ,B!!O"'E{H8U+1F8JZ=c)}P1kiR6( A X+a(LAmV |P+CQ۽%(ɗf=~p{܈d˦K&<D|ҬJm/Fn2a6-t%3!կ86¢OTK^c"0[s1*k)> dj]̌T!+Xhn>'l"L2M8b$P-1hߔuuߣwTÆM籤+!vi >J-)2D2 zj/s1yz*8 1J^< I/v.L'M[ 1@44rt+<1h Y$A,d*qʪ6(! Șfgs'k+MLeZZ I\TŮ*Z,J6Bߛσv5xt7ηY\˦JW.R%vh2) !7bQM>voSn[Xuԋ,m۱ |?tk|ЀzAiQ=Qlw-L-WeSwv}kQ稾Sb"t"oԕԓm3_t8zӝ/Ž*ِOYt?2z;} REft;^p< {[7Z"һv2-`DNpa 9 (0ځ&TFNh"Dc~W(m.}v$1>SĂhw&e\-mObwԚh-m 25h- ZrmOSaYb{AvavxE^XgtQ'h1vmվvY{ej f}AW5yoQTP[\_>OGA?R:[օ^ߩX_pU+?wqd endstream endobj 1060 0 obj << /Length 2399 /Filter /FlateDecode >> stream xY[۸~ϯ01#t(htӶ6VbK(e2<$jd(y=<e9'9N /}ԱÄpKΙ54FNRwoXksѾ$2|ɼ`^BJcE=bhZ>^ܳd k6n6'F_A)'ֻXV/% MCUpRLĒ9i.܈CKZvbu:%q:7?-q QCY< q3Q  @ApZU9˘1w P +7G@vdS~hO~ApSeu+2B"{fv T`G#$0R?pSGqh >5V+lz^pg'[+1Q>!VO bpHn_{VXz\6 kZ.&E\"q۠ta*277~G+A ݶIN0qyt0ͶR](|-Rme&y 1fuY6q(OyM^l`e5/YrׇQԷCn#jB$Հ8*(R FWNeX/A%Juc1"W 4l*,NYk:?AlG?-`CvU!쒫j![yb%dd›@NXUt)J1^6͢ `QmlJ~ ~i$#kv)m:5m]Q !X|;ʹ`PLzyƽ ]X0W,~R4(AG-bN8L.$OʮEB4~(=y,cx.Ĉrp%x1YT1\ot`//Ao>yWQE7>}ʘcF{mm̋ړ9f;\Gޟ3Rf/Y7r. endstream endobj 1069 0 obj << /Length 1780 /Filter /FlateDecode >> stream xX[o6~ϯУ,)Ra6+&Om06mk%O;!eVt7o MUD~:{:QNrj1J 2$%)OE>nzcn>Pl67@?^2)NfQϫ?4b+N|{#kKm$0MGz0J`QF%i6cY Y}.gyz@!`GRyLxa۴#9OHnm6G~f 'zf[׺x0Nmh|.d gXDZoQ:L>}bulpZ{B\fzwy c( ryʇP!]n Ji]ni[+gY;~ޒ~]Y@ÍrfU/L}^Dt_ss@塠pzhZ(pdYwmm1b9\5 JW԰4IR)x'䴇׻PweK-0`ž[kDTh0<x*L{A0R-9«ׯ&Bz< @)DƖŜ,H&4b@iV .tAY~qnJjHKY`/tTOHgy %$Ujֺl6t(.7EI+!*kp-ͅ.c#YltSluFۢif[! Ko1܅7 :XYTب6ofrĝU[Tfcf[YkpΊe;¿{k ;3/hW A,E;aPx0$lhVIФ\q@ iR(cy-n2)oV0 4†TB_3#"iیS1&˂m2 Lx9f> stream xZQs~cbw Lδ3i?0kUIHMoA#YsI).6B+9P*Y 1TU )TɡZj 7 I+?ˤB D Oj@h$ʁWU'Z& F hC7X՟d͟h`iZ-E3%|_ckZ Z4JD3 9K A`: gW0d.Րp?"hȒSќKR0Мs a U |&LQr8aS wIb;l '$.`>M,ڵ+$e<`dw%JKim]mPW{H2S_VD`VkoBI/J(L>HQ^QrP6KیOKtiƁ J'h^ vS !!QFn J.TDgVvPZBm}n oQ۸ ?2yb2}\Ëa .!p^&)}7i{;o'op?|o8Njd/+pr2}=_-o™H rbmM`(QnXųN=ɩgsu3&77_/L_^_̯{ӿL8~X1HI9z"l"bQ R$}'Miv/W뛫qvOQdJ~2͇YҜ4{\\ί j~DLÅ+& ­Egd:7|V e8⧿ČzOڕAQ'P&NΣXƶ,Z+Q;u}z,QtO#暷W^m{-$.d刀@9G5E/Fx0?}-V!p ؄TCl:7pKm/7q9Qxy$f3}RR'P3zT,^DB{|\/et~ty^NG =N~!όsmĊRp|_ !Nyny2Ȗr,%T#KmC*\)^D_T/Vcbz,D#cz tL` eå9+]]de8mhr`txaD7=$.F,0;[36`Jjkc=[NbTmbsBдgͰ}eȰb*z`Y#&NAFXl(UP63gk&#(qO-70 "Z;2!FsREh28R5(ҟ4JȾ4o2N! |y%oֳ_泛#2(HRR,p͜`Ra1 hTþu}miE"PM$|"[d-A  A8겁' ZZE2 _R]\`ow栅l29 ic:q^,F4YJ8"Iu}g'P+г(fU<,OAXOu081{(|~?>;swż#}b! `wcC*ȗ|sBGԽ2$ʐC.9Geml1ڊIm.r e.(DZb:RP;빯6zt9d~9r(+n5\nP-HvЁq־l־o4ZzBaD'>0X:H?h"!T3yPPoiGdzK.VfR<: gŏ9?9f endstream endobj 1083 0 obj << /Length 1786 /Filter /FlateDecode >> stream xڵio6{~P` ,/]a퀡X5#ӶPYt4#)K8;"w&W?^y'e,qpD8HbJ"U9|7"1,<UPN/X>4oމ1%$ɄEb~ܫj5?cUHƙΐŒgQۢ+bd}X !pwFFFUG(pj;Uu-B^]'jeY,&\de$"zgPGY&jZVJuxoSãJ[@vUsmYSÂ@&MÕJn,$e(?z#:W6__]W $ c]\yx7B# D)aFh"gDlj#ݨ˜-eq1a9B Băfptղ$J]sX;[k:~3"3>sD" F?z:|ʷjF+9wE}{TPS{3. άK}Ujc":ڰݹ e2ia)|I3~g\э-u~lX`,Qm'w@[ҰR; #~AdД$rp K$.$'3@SS@z9 Cgs!( F<\lnN;z,=fܲ4%Q:(DrA* u# )6ۓR")i@ⳢaR.|Ls!Od ӼSxuA?8I6aބ#~<8==~ܐ{vmqi%|v::і;[" &Q) "0ajݔmD3Aa1qC#&C"pO/ȟpJ3k} IF44x\$" WGDdi`Aw4h\|8t΂dX6nlׅikZZ艓 Ȝo-UW8ܔ?lF>-L} d^h%EKn 3qAʫ|{$M6L@wNM@FF3>\CfvnV3ੴ2>O~ZJ:;76/X{90wUc= L ȗ.7Z'[fTx,x\4ȶu_f> stream xڥXmo¸[sE˵b--pt[M;ɒ JK 9$-ɊSCg8/ xwܾp#ت EÊ1a<]eiLKVoJ}㤪Ԛqn7)rڲqf0ᆍ%nXW$3DwM;IJ8)Kr ~I<A+;΢ÚƑMsZ'"nN*k SkNHuYt{"-I YռQ&/1 ARPJ !p f^+p"3){ɶUqYXYP|eIkϪɪzڌ\%DDfF -R) \A-IZWW"'$k]F4vMݗ {}wxʱIsFJzr s:Zoз<%4ɦ-#<P1hǙ}c~Y>99 P<W>5.y zAN iFM 邓6-b|K>jW \)xH-\$_$.H$.l1t5hMC۠-xd`Ģ怔O}q!z: TE'P-#YkoeQՎ/3NDAU-1Ӆpb!xS>) 4A!Jn bwj6f1W>jXt = Fi#`K(5h}bե2p? ЭGUg_/b#71ƥg;.3-\XJfPu0qk-ر$e3K#q c<:'U\ #fNgc!Vg1KxѵL 2?㷍tUrw#]AÄ3PWʭD "h|p0ԥM q"m!(l_7cZc:Q04\ m Y KlRoȌ8'dEO+QtIM͊|~ vp|M+@s\9#4Oˑ5 "@^*#y0FR=f%ҀZ Qzוōrΐt|rvY0 "8#\bg,]Tms/+.GW/yKg^^EA>*}Aϡ#6w.\uS}l26`Խ*J75~ƟnaO=?+8tɃ}5{4T0O 7K~+IwR!Q4l_7p(,y',hgrn&% ڐ\Vvs+,61 dt endstream endobj 1108 0 obj << /Length 1769 /Filter /FlateDecode >> stream xXY6~_GX3HQTH-Mv`A۲Ɩ\Qf}Rlw 5㛃:."I.]"F)BF$ItBДB``=i떮9nWT9}Zz'9Y&IKnlk~DE: yrE8%hgIޘ1 NmqN' 'KknꪅC"u)ȴu2ߖW5@0ei.f`7\n7Nbp+#I1)JXuʸ^4l9[k3y[^nYaM]SϖvE|gҟџ,<+Ac 1=t 82 пχJy=}]> ɊY €6o ɜ J3U>իg[,#Y~d8 9qP q@[]~. v"Cwv$m+[shP}ph%qh /ɢ bM~Շ@{C#ˠHk?վt V ꮵA* [alANq0OJv:-,lYY6[!ڹE ^t en3fY4Gc/Oi/Pz(<.cW[6u;ݖ _jx:.*5\ärE^ œ8OI*˦ޟw"HN{x E-QqWuؽ$Y N-WCDElXaKγ?G)#(z{r"Tw˓ D»clIP ͂TlB# ڊեnwB3H2W߼}8#dŅ6n+o$,ƾPdbsޠ.`gYcjjVr“wuGnTfcbW[kp͊e;?|k bQ&LE#'p !,MBq7[wgAhrDZm.bw (,v [塶Ő]`0 Aǻǯ AԋR_3ԖfBKɏmƩme6B 3'wêk/9ko_i˶gH4{tG> stream xڵX[o6~ϯ M{ȰePؒ>Eش-T<]t~<,Ɏv)z՛HbQJ$$<_f R^MU:[/g{s+ത$)ddH7b(q.hL, <1xV?TqeXVlγ(UMUiV1o^@P*b'֪\k҆ĠhzNlZU Rt (Vr0g1",aer r?K*U.֞Lgja^27B\a4c !U]mqfQ C펈d {)zUB?8I6oBs Nt;]_F$E^5ݢ%p <˱0 Y&L^p6HmXd38ΡH7FozY-di1j'`JpA sizss 򋤜>ᇝ*N42Ɠ`K A>Ym qEpwǁ}1)Idi;w@M8:~׼|U |U䱎^F*g e4ds,׃Bk'avKݪ}`SGQk}g) >Z,G^=B5.!݁ڒ!G \|`QoMXTE'q8ON;>hEȷJ<{除4;[H&߸,اOn|{Y}Ƃ*@ i&K7r׹c&Xk֜:Ph6y|8'> stream xڕY[o~ϯ0( cxeE1,v1袛"eQWT]&I{Cʒ8 @\QWU۫BRF,ZW4 *B"9[V_䣑S"C 1m }Wj}vSfUنD0 q՗ zø }uyU[w:l,uz6(k*Ǽ]_C3x(fFk*wht7 {0"dRU Ǫcm$2` 4t5U=4$ #o/j, om~MCAW5WXM1[}1abSQF? wh,Wԫy8jbdCu$Zf^+p"-UZ52$Q̽>>,i Iď::i3r04E E JEFm:})r"Ab{?EڨAV}շn޾3/T@ /ք) Lx1h$M*Fq [ ${ SMMu۪?t(A"hm  wvR+!'eLm6q N OYRΆ܉5YuХݰs5yӍ)vƝO@F>3$L П-dO!8•a4!kL rU yc7on"<~鹺%Иt_ش5Z['qrl& 4g\O$JoqOmbt gkVb j`%t_VLIIߤˋ.|H1 j#H3u@o BR% :uN <#NN9`^5@3".[iq2mc{=k1Em]Ēyml EM{"OΒ)cy ^s"'?Tu$Q?fWq$<Uæщ0D#S;V(;hh-! o|$jCaj>ʬnD3=0*Ƀ8|Պst bQHXd 76Z Xe~@ ЭGUcbҳˀPPN2W+ѩtcy#1݂g/|TT-NhpǢIp菺4\yfNgc!Vw'1KDfܼ-rȿUv6i g7ںO}A@|ї9~O ay7_" t焤RFb(4hcDQD'7Z!3„b Ei6 ƓȌHˡ Ύ p|I+@sМ 6Bs.#rlAs#|/e2nsPi@(zŅO|rvجhȅi?1"GuهV-8b1qo<;w^  X-m8R.SMM_lw9ȂIxWWyi)G>U4&c}prtŤso?.Z'c©.0Iwwp͒_> PnpvndA 0 ,:@ASHNxfǫ/tqj`W-_ƃd@l +x-"7cppkHOtBJx9GdaNw*/fx` endstream endobj 1149 0 obj << /Length 2009 /Filter /FlateDecode >> stream xَ6=_aP5CRE&Eݧ6V#KHec;䐴$kMzks4]lto<{%y/R)ɒxq^ۺj>[O٫4b ꮂ{2.(#^%#ㄳ3F3Js1(✔4C/F~'ts* ^hVn]B)qW%_t39RNj,[%B,YN(h#IIx:YoV,LoV5$W~Tljj)ˢܙpŨ[o-ŠXF8b̜~~wkאאdLT2Ք{2Ao f0;‚ObP6iIQdS(Bl|j6f2:L!+߄8HO6s/l'T?+P J2Jw*O+^x#jgo/@H_oGoyr 1Bhًzb#'"k?PjxdW'μ/6} OM;NXȀƠ!և_wxf 79kO D endstream endobj 1160 0 obj << /Length 1816 /Filter /FlateDecode >> stream xXY6~K]syLisEY) \Ȓ#CҒ-{7}+Xph<\ #Y` DqĔDeqO?~a!9YB6S0\h \"H55L$ f`6r?fd,ŵl7Ԣ*mh/]x:'ZUSF:dv-ʧP}m=tZ#Us}T~FnTUmo}9ڴKwmOhӀĈ2J',a%"K{C BH _}S !DGʬ($K}RgUeo^_9SAC;bJҕƇv;-3,m6'q )m /Pb#khU d:E1Gp^0`!͑gHK]gdig/WsLUjK;f{zר0փR8DXD%=CI1zRKyCi;k"%kxЎ̪^ ?IC+@d<7ÌiF,b.05M[g~DiWo^x{35%F}8#t<Ѧ*YhQ*%ikY65!I"Pobq\l˲ImO̦J6y ̶y0aLOTda/箬CMβFp~X+WTCնQV2,wzӤ{ "_GBȃ 9 ep ~ dBKoR#I9؃fiFoD+\I0<ʌSR-`ˆ?pȗp1SAr+^ Լ0/+GYV-ByXkRz /"RD࣫V5K}B{1V!<}s+Q6x49zn!M[ȅ{ >}$ʇbSA|Rn]ZZ[OqoɛX]ծoZ2~5 $! endstream endobj 1075 0 obj << /Type /ObjStm /N 100 /First 969 /Length 1882 /Filter /FlateDecode >> stream xZMoGW14?#@}]'40!R~_59Z ,`K53ݯ^U(.8䢒S]HŐRMYM %M'ٔSv$B.ٔ!%kIr]"2 8 #is ?r.eT'Pp`*XTU0R@- ;@SǏ,v^Nm8^x+ ST bm C;HivE8ٌJh(%[gPr tlЦ(N=Lsoz2}}ujd~ߦ~6Uwvo)XBR@@|oܳgnM_Ysū_~u1wzW7sa6鋟} sY+7?09g6>h<6ėϣ#ixؾbݎ|nBwj$ 7}yx=nv6rLòb2eoZ\_t {?vWo]E HId/gטl;~K&%{B e@2CW|;䘼bu\5$NDpUo,$Y^J'=eJ44Q}I>5UZo+h$vf6>'OX>"Ža[ h B8O#hD{[15kj~n#`pz06N GG*{hyՀ(*G\^,K5IWz_6}gG~ȷu9]_|mwj5B<)QA-ܧ%HO֝2ȭN>owjB JDՇ@ۧ&3 JpDEֳ_-:[>l-rmQB2T0m+ hXzu`$L0Ӊs4 )E55EB"3Ĉ^<\$,8ݩUPΌ8!'K#ϩ{ʻX+@TKK'ôu(B`/4o'f wCSɡ}Djߛj34wVՋur' y~O2uĺ 9' Ω}d) zՐO++P([-ND$C5x$/ `Io endstream endobj 1170 0 obj << /Length 1725 /Filter /FlateDecode >> stream xXo6_GR%{6+8OmQ2mk%OKdNmxݏ6ϳ[FqM@0F4$ƈ0XsB~V;q (>-pn6F^28{}Kg.(Q`&zh)r ct`g["L-:6vSFkvq-ֶrndSն!6|/[P %#G2,\4FǼV˕m!FEr/aF($$b#pz,h0*h!ͷt[q2'b8=A1G&⊦3◿SA=+-qAj!ۖvcH='hA+6uoj^y3.6QC}T 37["qp 4Cye1о ڴVn ‡Y,Թq|W7E8aΩQ (!Hw={r03<Z"].z"JJEs4zAWLfDշ^(܋&J;YY3a"|ux~cvY#:@u_l`\`[s{z5Zn}j2Ѓ9wcKڽi̡ɰ/(3917/kn_Z6m]Sms)Qѹ1i Y@spxwgUͺgΰATtbn UMr R(LrʭTPnLFȳ33Q''$ӯb(B DܑL(gؑ;7;Vv9Sfo?gH&cCaA}5LBQBb,$fO#C @"&SDr(Y2Q۫a&.X H(`LUfVF'c%)>AJB ?I!?1͏|C˟ou⓻ݽsi^s'Y.?uZ#Ee\u*ݶ{Y6R畁#e>\)愈>w:TwzMy{|5Љ sJsГNhA-h=l,0*쏂2^8Qy8:Y5=SC[͍ 5_0,Vҿ̗ "A E+ [ /@oKE7ׯwԃyaʅ!pXL' qpoqhq! :=cI\O)5:!ru^`MÇ_D_Jo/Sֿ:W ~:ziyz0eJ%ݷ.׭WjR*_ic}v[Mn27o gVzP ~3㗲~RZ"*Ǝ窱TҗYM̙+5 gǸNi㉅1U) 8ڻy[oQa2̝[Xc0 [`x{(oo/8Eng|Ʋ"eh 3JxCKRԶmhEZ4 $8ۻ)!-ej|Z6=WgAD/0 endstream endobj 1187 0 obj << /Length 1962 /Filter /FlateDecode >> stream xX[o6~ϯ$5KJDlm ņS;"Zed;!eIV夻{;Νz닗W{)I 7<( ;o?0`1kT&C1+U+y);KU8|9]IW>.y0 {=F1M%Ђ%>F%LGtOdyaۇ<+6#a1@ίsu>fI|N& M =$)O5K*9 FIY6B$ i?d-vE^*5Fͺ`61m/Dᆲ oNh!JT5i修ʪnq<1RzP- G虇]3` > 0R.,$ I8ITGKfI5k 4;Mݵˊñ"RKI{9_+-fB`;q$PKæn>ٙ-bI2DCz./)7VH0gЃV{uv*#F4 }Jɭ &s!8՘u\Y&xwcgK6')$& 60` dF,vȠ_@6얶hf=UrAyF~lBp@L8p A{R@Z1j zZbxp@}( |/z5LCBS}۷s Ac1Pk= f2] Ljv f8r/1:t)Z 8w/2mQ8J$ZPYrꍹ?.6=A `جhۀA X@8ȡ(G8ɦ\*y1fZB a-RX9'0$NwYj%1< {7$ܛ 1)OKsb/ 8i$){Ӥr ff LB^CBp<fwµJ/36X" +y yIL'9flYPN]W}/Mh!+aeo"/IX"_ Iz[dh3)}spi5ymC/C],FVxl)HbH !P)TtA>Ɖ,5\]|Ƞf:dz6W';4UVVڣ@Hkn8UX3b&cd y&F1&`T4>.ʚ L}8VٿrCOӟ-yF𢓗^u&xgd( nQ>BCsV3W-g'Tj\N%SVU3԰` z_-gsL辐a endstream endobj 1201 0 obj << /Length 2140 /Filter /FlateDecode >> stream xYoܸ_'2D}(wHsmrjVCeY}ofh[xsGInw+F)xJJ(\nW_UJ(0N?QNI3לrAhuDjgPv;?VI[?r4hvN)ISZd<_0 b|ÌaH8Kܦ`+w:$U^+RTT#J['^}Yǔo/Q^dK;V~4fzl*7#<6pd,z(X55c$di綽L0]_]8CaHEZ;X~֏+;>ʢ=x2C {F4'?Oya!JYv$ ͽpe8R#ܙ|N' I> :) FB*@fV\sj̀^<gFo,xI'2 F,FI_8c/䋸-^Y[T 2@p4#^ka˲ tުH2H3l/dZoY虶rXY`lo FתaAYF}FY7!GgxaϷ˳CE>SܦT=;U96b= Lev> ARWKfoh@'RBmEz?֨Ŧ]io rX+Ыw&Eق;HQXHY ]! jZCoeb|Vk$>C+ %p/G u<J+y6T/3ۋ\0s7C~ŗj $>SMQn.9ƣ8'')T/3,8MRBzñ7ic^80E2̾7'}?l4R51Js1aPrn#ʻҼ pѲ\w"hI*cH[ WQ Gs^Cg/m30xC~e#^%=r5Te":!ӗ{^HY5ۨ[XGEG/ endstream endobj 1213 0 obj << /Length 1817 /Filter /FlateDecode >> stream xX[o6~У ,/flM ]5S[ MBex;dQ}T$ERc=x{7y>ys^J҈G|1J"/( KoonB)JR-z!s^-_Z35᪚2?4UzpFoc7c rqDҤr) ī1~|-0aeAc3 )1@vVVrTcq8 axZ)0Xbu١nԔntƅo cYm1a ӡCeSS M6eWzdv"*؋L82st-c)/t[j؁^ Nz3p/4܀,j#mW}/bM$"m75>ılr#;q)Fdb0)\'-B@eUnOa4K4u}x7EE } x$ž{J;X\vc~4Ÿ=^` 4QJхH0)bݐf i]JF4ba$[%+jt #B3PN\(юA!uO Jr 22V!I]Bth9JrMY@L4eqi#UW4DWRgmXvɴkhy< 1YЋ gOrfYbyK4]}݀iT JmJ 1,C3/mT=׽Ӳo"[G .N's Lj 9NMOPh<Ҩ*SH@0BKHShMl:ThSҮ703e]6HcYrp˽A,50^۲Y5nr1P7kQf ReYȬ"Ӫ(CuiQuN܍2w$1ꇈ߷l.m#{a9UA[ Pyd9󤝛 iK˶D]|bVjKǒFz>B% endstream endobj 1227 0 obj << /Length 1621 /Filter /FlateDecode >> stream xXo6_!f(*k ž>E@۴U_y߾,يl]!0Hd~nuU)Jc]@0F!$( ij# yםXRWV?={؈a| M#gu(Iy^WRNx1d^^-i fٕovۋ-J]ډl[; TJdR ZJP%F$fFӤ3"ͻu\ٙ 9ňp00S!l(C)$&Xct֪BrdЀ%"#n`D2 w+پ0E<"p 65S#طrwEBEg{8 H-{=`(GHVĮ1LcL[R4M^ev9&3X*:-6vV^!0 ō(?p8Li4+db+m}(lV2u&[ :f({zF5Ze>d 5Kb#A[R|TsKxGz8B){޻84#Jt92f+[򏲕]V-OT:,!YKV^nKgM]ro|PxSWk͐l֙f8W<1bC'Q6TelY!$`꺠]D׭hﴻ]fYSNc1X 4lseҎqn#ZeWڅ%S"uyye ᓥ:1dl2nNGYeRX<dw}ۊF%Aged u_':1.6{Bmd˜ladF!89Z 2ct ,7ksSNܞ*1#c49[\'J&<(JPnqTև]wVgt {F'6W3 JT6oLE7Edꪍ7׎xf~JH /s(FGqq& "iNBq!Q^fCKJI{&Orλq"FJSi_:d})|,;/LNb!T7VslNAYsk!W֏m~/;$'(KK1Q.c$t 3t_.v/TUI[=XvPP$W7=DcrmrlLekcrlFr9*6áH6lqc;+{엖_ }xKD 4r 9Ckiw!?k¾X2^9jQ=}T&7&TЧp~>žyX%uOm "_7zc#WŴ4pJsJۚ\϶R&ןMTYC-;Sn37]n3v{ Կ.o endstream endobj 1238 0 obj << /Length 1903 /Filter /FlateDecode >> stream xڕ]o8='[.9mvQ誯y~C)K40 3jgH:_W?^NUA,V$[%)WQu';y"Gd>٩ϦWu*KtE¸&"Inxا8Ngԫz4Δm+ n:XI5Ko6es@'R9!:3Ads^on9 @RjU4lz^<Š@K@t獟wjWx2M@Qs^X$%#eiAD?qVK.$D@ ȗx&dc𢈎.L* qU֛:7sϢ\8I07C ږ3 g5bWG -XjyIFag Y%" !b1ի9Kǀݹ F+YxX(7,FŃH;a#{`/#Hn4H_r(η/x'K=4:KpYL\,WH0vQ |΋av|뱾dJ7LTG,-Nc!rȪˊ])M0Yݽ/fޞnrdk~ԓ^=@jR/o9XObJ3t6[` ōZBlz5=!UIL83j't][wXD qi{8޲] jgRB)'7@A>+Dlև'庹UF=h3wgpH#bDD8t*'7yu9C/3qcـ<(醻V jc.69K3]*3%=ҡ+X>V yuÍF~؍U0Zg^jc8Qw\; h Vϒ{ VJ!UoO*K+-|.'Y3AuW-^*oN~ )A][n{?Z~85[tb(:[;oG"d-b~t>g P > stream xY[o6~_G9.5EHEAdŀ[,"4~yHݬv]`S!u.߹Qj WzxEluaHℭ24VoڈR~S{qt#Y~I2ؚdε{Ԑ ݛv#^G-w ]{V栐D,ƃ'ٔ8e`lH#l:J@T/GMlJ\TJKŇ?Ut^V19',p{f%$3LiBWk2"J}F~za:'ׯ?ΰIaȓ(FkH8EYmΌ)$M:8c*GQcTgz`)D+%YQ|aFoJ4E&d\xzp{BsdzgƑ ![x!о(8vGUcN'Lٝ-Ԧ≉*nZ㎑GZ. wл>immх^h=#>aJ's,,;a5S|mM;'s([-Xi9p;l_ш?Mv'%ّ-%0Zlz0e0&15M PHZJBx>W]O$˨;EK$ e|i.|E$=  XЫxy$ơejtMIHmS/糈mbeE X;ɴ@ qƦ>4 ] O{;SF,'I|mCYHDa$G)ۊbu+nM Ͳvxhݔ{;SxTP92 Y *r`Ou_馮)6 "e*twepmM$(_FOB)J$(=&u >+kTUËA]KsYʗEgKEjU48gtYnaD|LJqۨ/s%s!ĿPC阤uQBt '#dȤrLg(=++焁mР؄#! f|rN°+f!x3bd6BQmx,ŋfZ(yI=eUk$bn $.c _"dLBYp'SegN !Rl|;UvAqeSLcu&Z,Rؑwvx<-L:)ukL.X^3L]+KXY+#3g3Ŗn%p~ip+%vVa |P!N7?U>qu2n`u(ìmdMYmn$*E;h6REmG,&s4)zgomZE@a5=a£欌o*pEY4qS=6*\g.{y3jͪ-ɡFϴ<3Îqh*`Li&!6 ehrN(clTY 3A1S˧f0nRٴ<ٲ .iJ8VC=OoG_ukqzdWWnwyshNZV;0$ fjp &rG,%7_ݻ*뭗5Ί=NzEuCKB~|rzm}M_w>*G!Yq c ؿHw]W]p3}swDU(ʉ̡݌O<$tűI [dž@ ܔpx˻u!IT }Jхel1`I72U߿g^-95|>$i4y35t? _Fߤwr endstream endobj 1263 0 obj << /Length 852 /Filter /FlateDecode >> stream xڵVn0+l$bZIѢ&N/i`02- Hr}IrMJapg̛!HF+1` 2Jt,O_1u2bJOwY3]W2#d-)3^/Po/ʬm|Z bs! ȵs0OT:GXFohRA> stream xZMs7W\@?r*˻[[}]FǪТK6A,-IIgxucc.l:ɌD)Rq#G+q]U v5ۻk![W+׼é]⩒C*\ZZ,r5Ž8ػE V p)ae1 ª5Q#,6|*H!8lVrLʎ985lܞ&eFv\Ѩ0`EC~`l])84C: V!RD#js1&N VqVS ]Ub]Dql/DeL19MdF%,MXͩvKMCDx`t0 L} 'š& bxXVZUXg,٥NX\Xm ]jJT,ԥJ6']m8c 衺̱2K 5 f7aETx!,kVjJ؆ߜ0?v%آjK'6,xY]AYD 0P ^mWiuOa%b Mv${Umӣvŋ?na2iqΗ6dz2\..NՆl1?ӽ5' wuF|F߮HV6R7r3Mde鏋E>uOoc0ħK{` B0g>lF^pnśtߜ|8ˏç\l~WUQ_2oc(ˏ+`gs+'8K=f+gr(b9 LJ=KDSqw67|{K _'nۡin09mu!4o-ww(ސ[0J8oqM+0&D'v"ɫw+yM .wTtobyMCtAnK@V: 9m!9W|p62PW@FR?M>P|btH|Aث|0?&8# ؐzy.h׾{u]L"X wçO!Wkp p .pk t]AI32𮠨_<ɽ(MU%!!2(H=gifݦDUA)Ļ Z Z(.'''>cޑSw H)Cesr) m-gPBȓfH 23h;O7;`bNCb-ZCW 1H`7h?Q}xv~o!o٧=پ=Z c}}C#wl _,_g·գTHEu^sz#nZjGܢM/69#%)(Φ2֛sDHc Ŏ疛qK&>vTS}H~-DMM$/ԑޜ$&pX2FDPҳ;_Rɾ QF/@ RkMGMI(KO** [07]TGy/Q9HAپ#(D ()2Dz-+2y LN:~:#ultnG>qE-YHy~(j丣c*37xN>oGڞJmoIlhz7J$BbM^%?.͘h8۷Irnqj,̄ ٗޜƣe?y endstream endobj 1280 0 obj << /Length 899 /Filter /FlateDecode >> stream xڽVMs0Wh8%3DH%[eh8M@:J߳%J;&cAkDЇɻR0+D A(P$C%>6ŌMQ;]ͮ\a-$G1٬QdBlׄI=`2Bv%|]tB |;~6,%XED`><_eLK'Ӟ #!Cx>Q<_EbxLw&-r 92Kk&?[SXyhͻs{^d)oc^Uj>|/k?'z6L3u߶׫sXG`<+kVz)a(*/%l2WS6!9D.Ӥ})lTSX@R;cT3òSuiB,pgF^l :b ]_j/s;0t`gq%Xܓf۶.YV'zkTwLȞQ!0cz|c 6ǭ8'Op$2]1l(N$R5W^9(>gKp99Kov*s'F1n@ؿDb8V[UeNsnpzp[ey~36]j6Eunە^Od~E/]N^]R_-\D4cUI/_?_v8b_K#nޜv(0:6[m٩r)XvGvg(% endstream endobj 1299 0 obj << /Length 1192 /Filter /FlateDecode >> stream xڝV[o6~LR`ɀ`XKVDDe%&ٯߡHڒeI`"y>w ~\.&4 JTq,"yPʒ8X]:K;0T(yP&w_TRߺ RH XN>? L4qabdq|͵ qO;/|6||}0> stream xڵV[o0~WX};4uj;TmeO]UHdqۿ߉cCҎ)v|;&h4n$ `( 澇eTFOiP\=Q:xߎnkdPeuGqg” y8$罇G&y`K 2GQe>St!~Jp( 4 Y/Τ`qw??'DTOND[\`Le]1 vW tH2-7GRC\HI=l33qLxv3kƑx0)gyZVLV㯁QTۄleXMEu4UuM;\DU]+q("7_% cpF%a l) >j;gѕ[G/icx+,͊V0>> stream xڽWI6W9@̐HIrI (Ќs(` [B[̌}-tS={G{~ޮ^C/A <1 BE#Poy}ןo_f2#4mvw0k5a(b'utW՗!$ yb32|V{BBPꏑ_$#/$MSZ:9OQ[ur uv 3v߬9 C!MԂqδZ_ NVcdېj ̺bM̀&N=*_8'-ulݟD1pEUVh 9'~hUMpT˜1M8 6{iދv(ƺ^*Pr!GӱSIgKT~-t#<2Tfht<3qPIygj S_vfW)jH;Y*Nfds6fg5I;C5J G 6iΫ2 6Uo6^auK0C7f~Mi[0X%e5)e0> stream xڥXYoF~ k]m"E&җ$VJf+ 4:|.m)ukr /ӠCpjtC'iߖԂM5 ⚛'VunNu'6Td{RweH5cEYty.Et=~_ngC\=A\1HP؉.8ZDF!y -ӦI"fh { cv@ܺa0/"1Y uv.,8ND!󄘒ܡଽg{:&4߽w,&J>jk+N6i! ^٥YFNp]n'{1%-0Ռ8KmNgjGĆԧü.oXv r] #t. ؍A,uMM%*as&@a]&r7J=x y֠V=&'ֆ,!3pj6Պ&rYU*K Ё3*ԞjYAe!ts$pB!bkWi֘eM3di54_KCPm;ji~/^FegF[,47io,QQ{,vf=#T#AH%mC`oSD)3sFuiMk%֦8)zeԧ, *4dqГ91;EN-R)zCtmWNl4cnbcZ..-~w5+IQD.h/,cU#fv*8.D z|t"wxnC+1v:2/'z v%:i` d+p 8. 6XzŮ.㞋Qm\pa6Js,i7}A՛0E\Mh|(dZ, wb =BV"R\a._59ٝ{ñP?)( 3#SjWK }$J[dZ)-ϚV&zlEP )yDV\a1h53$ѕYG]^4? C'xtQ!@\lhZ{aqwx}exӯJv yIFwlޅ_pl;JR|]U= כ$O~4Ld_)#L0 Fs07!A<_}>`>|kmw+I74<`gBf]z< |p||IK'KP"rZmHF 7IB b 7W@ dHgid;Rg\jA=a׬ytP23Pqxȝz9t:$cξ؜z?_U]5ݶ{&uakI,Z-T~QH朾*\@"9%j` endstream endobj 1274 0 obj << /Type /ObjStm /N 100 /First 965 /Length 2016 /Filter /FlateDecode >> stream xZ]o[} З$g! c.. ' lõ| Q$Wg(Ҷg!9^sv4_ Sg^1! !!_ 3txWbb`g7d)E)JuRT;{L1GU%NuڌEb#Is aPWTt5<% W0$n!1\AFX;puV5).<НSS\"@~K k 1\_2$fUԵKA)!FK'8,$u%&4nN5ƫ{ϐbKV y A ¤FI;25"0$Q#F]HK ZRLTq]MVt&yDAݖ:6 $ P'Q&]!AWO\ H*X~E8RHկ$Q#`LR#E:TWI= [YnO88 8"fua=t?|l_.J,cO/'w}[mDQl}lՃzfю-Émhl1G  ~=.ё^}:!p[A!a8alfXkӽ,Ro.0t?`a\(5֙a1Ŋ뻿 gs Um.^?$+t:ä' j p- UX{н<]翎ga^wﺿt?u?`+8M)i/$l F#:-%7cVSK#R\+YIV$a>lvZoֹ}grmw_C/lGY\\_Wk7L4Po$!ZY'P5%U* u ݫr&va'p =s3 !׫v)YO=zIw_"9彠Z،#4#cǩ͙0^K)6  !s(ܪbga{7=5Zk\ vVDUnI@:1a.\Lf{&#ڝ(#ֳ*]5r2_R?[! :-Z8LٵD푶7;@d7&ύ蔭l[%޲'TӣGuQ[/d}NHF-]^vrLe=3^QzT6!U1T63&0߭~1p`s^e%g4%h|ڙ(pK~ZO'CYK%9#6k m7CCF_h?hJ-VP endstream endobj 1364 0 obj << /Length 2246 /Filter /FlateDecode >> stream xڵZKs6Wh|4dn3u=͡xP 9($")VG.v}X(|FZ!E5!*b;V D|i3O t4;̀x0cE"x[zgZL gƐ8k{RdpJVaj"0$u(SP!q#~@=U倗PFG`E!5"L< 7q܀\L 4{TB-5ee+_pS;Ȍ'$~i0G`09 ( gq@fpnd7l87{-+(lmMZ-U7-kmB> 'c,x_U >}"NY/ ~/tLYd(dUje;vfS)|I1Wq<@+0杌M\=5~Yu5ko.a&YФ4/2X/0^4Q1杒Y6Q;`\.)mE*1pd(hqmbĉ.NO*Y飊6Z)C"sx00?/-KҏY+A:XUcTrA#J]r]Vgñ5J9%LR1x}tʹL6Ǎ[!UI G@pu+xys'r09!'#TUj,Qe<>/-zGi[b8F˫kaay|f *)"%= э鈇|V7, {&+?MmcO"wRDZjgmG3 ۘjwý$LUoC8?ìZp zr8<说]ۛq4~i &%G/NbސռZPfyr*E$XM5;ȵAԼEAc [#l>^=ң0CY#hK:IXo(hMG/CCF/+\|\+\[m_֫[-66zNI>a.)UqѨiSԫ{X;H5@r+R%3OUbx$2y"K^# endstream endobj 1379 0 obj << /Length 1629 /Filter /FlateDecode >> stream xڵY[o6~deڵ 0 hxCZ:|I%9]1PmіdYI%;R8G8^,2H*闈` F,_ lnY2K}Ho/q^1AJp9I27d+Q/1i+3*7OX[6ϱŽ]vE [/YevY$p`dB3 W_ݓz[=q%3E+[J:Dx -nW!LRY5rQhߜjvv4)baȭ~C+cv::"#cd IG3x Gʡˈ gpF8sx-H$ftqQ"ɖӉc1cMلOu֫"]m֛|`8xoJXeCW{K Alg 6ybB G' nX~݀e\;!Q*1ҸL񕵕tͣC8` .v-N3 &)#,lEa Wgon߇,F@QQI<?%ٲ1XʈxjKp ?71WM$kN .A@~]$y惢R_fI(T\m%OmIc Ku>/Z!򠣂iq;%RT`$\8*``;lB'w?{bGU/}V!.t,czF:^mV-bdimٸFe{zh\˅}Zm  S2@cH^0 h~K# endstream endobj 1390 0 obj << /Length 1203 /Filter /FlateDecode >> stream xڭWKo6Wދ C& nSEn3J;MǙ4ss~\.)" Sgq(N,e~βtn4?_\'dg~EU-xv|/F~Tuauasd7Z#su99(:wAaLj%<6WkV hab>z1J<>;֢hɀERIh뵐(XX;w&sh56x=Kf,h/混s{\;Xwu')d)(G/Z]Լ cٜ1=0FD҈3ʮ7cVfg[1ceaM<[g/\5|FƠލtuk 4 ,fZfXfN06hf~κ1EpGE|5['?cN~=LiDN WxY"zXzE蒾ޠ?z9s:īZzQ =bt H? Aང%~XCUמd܉,T $Qz%I3V~ܚ=KA7 EƲE`{!sx!iUtFTdzpzp:o;Zw07"nUN M&Fz 5Gn׻@N Fu+~`nc!B&E@ЬZLoV7t/PY![j}k e`O,yZb֧ >"9 2d߾={[c^|4ڜj.z@0A^ӗu_ 3.=y /y8Ԧ#kov2 endstream endobj 1405 0 obj << /Length 886 /Filter /FlateDecode >> stream xVK0WXˁVly 8 M4R^$.ˁNq[v *<<RDɓ G>"Aq>chDJTjy GP`ΈBLHbuBaK@q1%Bp܈S0=j(>`Ƽ}l!Qe8 B+LAso<~1cp}@ 'p@qiJׅ*JDsȆt4kNr&pͨ͘k[yhNL:BؓWmf vc\Y~z#iN#b}[Qan b_qH'(ox|X9s}'պ\ʝ p5؄t#2x(*xxn<[^IdM,dQ=ԅ`nnHpili# (MئnQma{8ךE˦5j^/⤮I%7Hw}ukgQh=So$" #j8򉌻S%JTwr=E&>G61Gc;VJi0d2{ڧF{`؀'IvS0p433`hr8sGU(tXa*Y2ygAso<,dF741OZ(og{ @ItD]MO1}WLcie"Md:'` endstream endobj 1427 0 obj << /Length 954 /Filter /FlateDecode >> stream xVn6}WyC"%ۢ6)(x_iYnd$CËӑ6(#gn9rDϓ7E"hB"bA0g!/_N/8;, A93URZg-,c҂oeՖ P`'Y]edwprm !c8 В!(Mq:IYWCԣsHfRċQ6#JucV֪Bf]PE o잼-z+E(륳֩, KsK#Z^5NֲsR܆Rz豥xu!<3^$}<{{U|!{o[ildU~w~yGg 9Zۃn^bĖ]k @g7p:c to?_lX=OG?Y^g kK>.6u'֛wK.x)ڃhZV N?5cǡy_*o>[pm?|J`|YIIgwxXlUzs|+M<=@b!g:y'a[Dp /|+,D7eaAp_dX6,̃Ǧ:_y֡ŏ/<}4ڄ TV'Կ.~> stream xڥWKo8W9@ŒzXdiE&N/iвls#K^n#ŔW 4f32++7ySlwUirK.Er[̋d@-JvTZQ$Б35S#F4u$j"TZ s[:NZR4AuE5:w$8H)VpӇhz+f}+0`]%eIM4UXdo' 8aݬTףF`TjJ’PGCwQX8F.E9i贕Kٍ1q=$f"f~doәLh7SCJ ƈ@M^ R]K|m6~Pɴw̱K,HtoK=GZ?-JWJBܾл%9 jCX|8 ߼oY@q@EQJT|'apB7 ^ڼ.BiyZn@hѫ,4/-\0Oc0'h. 'U`B*= 1 ,ڗ?uQCſeV\ʗ!@k> stream xڽW[o6~hX)V CRLKDuEEǛQ-;GI輟,.|YeCgwC' !Zs8URU1j^sQ~5F.kFQͫ8yPs̮! +cM۩-Y&0O{( 8[1ør&DݼZ, $Uh^/ȶj;4e<|u E?{X* }]R@4rkiy%T> Z6s]J o~HiUlꊕZP%FY:vQTy=IDŕwХZ Cg0K_?֭h upɁY:'[[**T(4nFʝyn؎lFlVUW Wjjs{Fp)iwc6euV+ ʊ6iY{F[ Lj:Ԓ2 IS0FVqUxi]Ή*J6C@z#c 3c"R\ev!'Q$-OSƼ؟ MnA!R| 6=3 ʦ嫱߸cm">piIٌs|Ӄd/zp[͞,}=}•Q(P#$<4s[0yڦ6Vo0EaG0USk֓&HOnNRL>Cg'_pNo-!ɹ:s9)AqB_r0 A4`~J43i-T` 4斱f4dǁ@ DL&شuU뵍k c4"@miSUъ*\!2"NImE hUez$$#\-~/ogF6ePچcRi$MV} '߭-c"?ےlۃTsQ=|t)-ܺԎ'.. endstream endobj 1355 0 obj << /Type /ObjStm /N 100 /First 977 /Length 2041 /Filter /FlateDecode >> stream xZo7~_!\r8u0 )r p=N \A։p֐Kӿp+ epx;~$grm'euY?\UV!R"de lI^|ɋ(mSy@I$؍I@Dr#B/iH7`c*zE>{AQ$8AHx r0KF9c#f|Dr R.=re) Hry'HxЍEH,MC$\A#FȤؐ<AZ l p3@0 :1mhesV-fjXѳMYNe'<LM}v'8^lU>b0a}4/$hKe0~.Ӂ;2mƶg{oc| N$s%fxTN T4TzfHC 6#`"C҃ l;Scv bv(7&c #,$=y#KJ5KX ,=$Ǿ5v^ןUFzŋɻyaf-hjڮ{(mOZFĬ5ŲL:7o"?].;}3* mK%Ab[Ub4?7/gxSڨ-% lk5_yz~^7Oyl^6]o6Whz,/1ngʹ[t'ɇvLŧU=p> *\M3>!Dt :|d,=y& tv~jvp:v&3˱!?oVeSa NLTaSҞdOKxT?WBxwqd^j2#"xY=;rFnkT?~EʹЌXx$8$3s O/Kq.i q:68F怣P,[*uQo Q6j VxE(Wlc>y{ 7t[ZE#m*(9io?lS:l9bGxx!쮗P׈5*\8 *j ԣ24 F\+- F^z@WՈpPĠTwu>gkf;;&ys2I)Wj()j-S6:z_P<$NMAJP y_WUL~ l"}v!M >E )Kb%)u;/wp/4iC p*ÃT ;@\njFNHwpڛCOHYdN-_c j3ϵ(3Va^B淔kѕ| $a_ {lqx+AH}fဉ;O6ɐN[vW 1h8{Phpoݻuʼz?dnyW5Adg+tf-i ( w\>>H'Mmuv$!Yj[_uڨ4Z$#Wj7N%DpCC=e? endstream endobj 1468 0 obj << /Length 1029 /Filter /FlateDecode >> stream xVmo6_!_l,bHzV -6m} iEdy\'lQCE2=w;~\L/KQ[=1 XFa@ʻ7K1'6r#4_2Sg8Z/J@o}ߌ:_p0D%d/kވeS|s?x,>^( ԲToZ^:狷/$>R4|08N(KA} 8 ӏO?(X@m?B'K0yq˫m) Fq 3c,%w 4Ϸei}JPJ{ff7+i2޶:]Vl:S45?f57+UqhM)b$rM䢮ۺh=.u羵խ6?;IpͳV.ZI4pDKU@?}ۙˠ-@8AzEC$?_eytzQ906ʳ V@wW*%㑈^k)­u8q#ތѬbτLI ˪ M<<NJ{7ysm+b (C GkPO!ktuMJZm+NyC/ RۏVVbw$9/HsA 3w=E4,mQo/AfcKhoxkvzIם**tX7kvekFDÌ?W"uSz fYzqfJ5$<{@ v endstream endobj 1482 0 obj << /Length 1183 /Filter /FlateDecode >> stream xVYoF~ׯ  5W܋>ZS4*IEv;{&eHEa}Zvza QZ'v]Dg8%zk}}wqӑ&|(n' IĂp g9N9C|)+!}|fh`98@^AEX`n"4>V#]LATt1 >r~Xf,#8q8}T9Dv*BL8ؐ2+y!ӴΫX!ؔ^8uojuiYtqԴL}FYd (vUV*HH#^[}Cw7qQFWyo&(FJE$WXHtCvN^2jc6rPݻ^a5Cx  CfGG0JȇIqZ~=}Pbc^\J;'z-m48Vl*zՂA-x2hWѲ}ޣ, ޷Ykf]t rE FO0YmduA_N.}<: f]ЂTQi4+IT6\uމRo4sZpnnm$)4m\6ɜn`Ij!AX{:wWARCI8$GS~|F|r<ۭ_6SLCJsY>,E}* QvSQ?ztw{aIߍ;BoLN'9Ztt$6`EhjYqCVE6ݭHDH|=`\^ P|{`%Ɖc'(Na'$`GI0aD ,-A\\ endstream endobj 1503 0 obj << /Length 1447 /Filter /FlateDecode >> stream xX[o6~$c5KR%C&ŊZ-Zex\7{oE(iv Ew. 2{/OKP);`ƽc[o~1]$/}t72+Fl&(A~EVz{,(KŇO+;icnoj*gċp8fcv-#Mp(IoZ_hjy "_nƬWK bE\jP]ͺ'1~;l.LjبBicF;$"(ֱzۋBֽIv`<5XG,v#mh߷"ݶ6"q7mb?3 OF_D7E+{͒`?;Pyge]p;q8`VOLvue8<1lzעG"! ±_?Nyl3upŒ豓/Phs~+M#,SC Pқ|0ueVC^]*IV}uPt .c\DՍIV_ʴi=uy}J+7}]b"S#oQ~^3o˺tHzfLQ^XZ7ٮ~w m* ye7^ߙCLW3;]ԃ$B,!n b5>V[qޮ BR痩w<J 쇚V\5"-oėK-t3StH-n85uinNZX 3| lixN> stream xWK6WFW\HHi7 $qNI`dZW%͡|K*ky!B<(e~].K@B0VAx@[ W. h L鷼7TJΠඊ?ʗZ5KGpjG݂q8ƞb@bBn5"l@^+1 lFQpD]>;4;AG:A) .N$Ʈ:6 mγ}/#֞qa9 ]]cgW?fH}y8^Z޾Zl>F$nh*zz򋤆v :4#(lٺNQCuJjڸ^=%0;WS~۲5߰]wGb 2?H91&7$BY_.m_./ ͡72MzUo31ɫ}N0t,|霛 sV,? :_ P&p;VusU+ywG}8hF؇IT/VU?g~Y%rOC>?qԉ5'V6NϑXpg*j"вN&<˚HղΈ~jqY)k;v~R( HD#d.o:*1?9vۛtӰl2>z:u+2 t%ܶr?cTZ%RV-#-2@qmD@>svlF<3!/JuK`r;QtHǯeUM37P*n`W2*:e@7Q?oSc*d DDFѸPcუU!Z [љ|ڏ*Oj23U7o?ץ9wM488jjYu^v@WQwZޤP$# t1|3*LxD1NF7Sp'oZ'H* endstream endobj 1532 0 obj << /Length 1140 /Filter /FlateDecode >> stream xWK6W:&V4)Z" Z%aD=/Q,;87r8VfAj6$Z ZQAh}XӜTd_d~|}" OFWYAN&Mޓ6(^:%aGZ33\09mv{\@^dy mTͶ,jl/һ9z'\-QЌXkK8t{ βlk?c3{E Am9_ΑTMq 31R MoJp I}/ }³juBF$H$)sgpJg ?S#tpUŕYrr)7BS\d6Q2C#ub{F&9V {%)WD$iX%χvZV%,KSB!^䉔˗zzPAKk[ٿlG55ѭ!8 ȝ4,TVƤ( A0P A:W,ׁbƋlb2cE+7"iћ8 5 hcaG.`fj_cH^sK4A1 `htWjzب-٠Jmظ(9Lӛ(~c]8ŞDyf (vˢX'YלgۜO5y]伾 @_AW%3gdpe/UįH3cq3{Rr|9sbOEY޾WovWHHnn[iZG6}[ZY>+*k;UZ~Nl|GċM "IzM ڠ`p?|'Ґ|I""z>$HvEK^lgϒk`'X.͕T}lqMJ)8=|#?^=ߧ/~$=ɡؼ'5'b4KM%J=;W6yDgi"9\;R* O|Z~*زG̏QxZWgEο endstream endobj 1549 0 obj << /Length 1342 /Filter /FlateDecode >> stream xڽWK6W>hG6mR]We!Jt7ΡÇlQzml8p^9!f!^dq{ "{If_%daw4b4=xzu묚HXde\~5ah=m GBA%LN8Άϻ^\7ZIB&qʾ<]h̑NϘmhL^ 3"LpR/~Y/Oj^۾̝DljTfrPé;tj.x{鋟1I<t_ÄoĎìqgVĎo 9c^!v3833IT8md\Hj9s +eײ`c czz~b` U0g(oF@HfMġiz=/cC܎0uuζJ4l˜1f-_}^\,ERM/Gm˻ /E!B T]?hp5.p}bp e b6U%m endstream endobj 1461 0 obj << /Type /ObjStm /N 100 /First 971 /Length 2064 /Filter /FlateDecode >> stream xZmo7_p!/Q mw@!k{Qy%h&}&-+KYCp8X2z_ʹbgB2U4MRIbN8=Q)x*k EY( L20XD,>zZcmL "Iǯ"pc !"e" ENVM[czK3F&H<,Y>` dغX&$,8,'*lH92qBHʛŌSTP*SxNזCi@aGH* @ű9 6X$Z/T%jfea,l#lLjq~x*{[!).sV\hї^q:d[`ʠ9kQz9ʵL lTp$K8 #7 , Vu); QN-p)'/Sc#aiD+gEtL%mE^|˕}mq3iƔXVɬ炲IBNNFOZUvU?W76?_:Ugd~.k1hIëSt®"YnuĚտIP,Y[s|w\λÇ]-dvW}#C=Cq!J bR]nԿ׋qjWfҴWWM7?B䘵%qb2=Bt^/gU..-F]mEd!%{NNTNUdTn2^{dah Kw)<qcX1,coBW"ưuj)H9PV.o'e TR$Z.Q)'0_P\ԥX/dZwMU״u]48鴹I]-V\\BJ_]QAP4QaHne7_dw_%:ڢ; %Ml1n+ڱCvdM(q@ʎ{(7*澲}e}O_罕]EEIΈaBG9Y,?mi*%\ AwH^iNM@fbp%a>=\C֟(9$FÁ  /P\ "hP4 s6dBU@Q|0VCѨ5UQ} U >^P>gƽsq2VXׄ=lO./ྞ%tP^u?Ǝw%ݸ=<ή땍<f=\!`zq<|*]xqgہjotisG/dR-J?qr|r%^eAD+=Vt@Z~F9 D3|P$D7TWahF;7mEi-zkz4)$p|%á#|>]N¨ŗ@_wjڴ+$f=^@te?P ~-zćd{{{mJ; !kVAPO==YRH8B{)uV&A /7S"io% :#(m@H0\;E#}{q\!BrV4< endstream endobj 1562 0 obj << /Length 1221 /Filter /FlateDecode >> stream xXo6_!6P$EIր=dh3Ⱥ:O]Q-k%Md"% ٺXxK=8a9y{^␆rB/ 1 |-يZ"K{&(Z9 #/'N,GҩX{%whYw# νO_{ygo@0 "" *ALQ 29 44,, ވDo g sYgOox+UTa-0UkjRj ²2›Qp[}&"zFOcc۬`LlFh&blya+IED1ZKiKϤs@͸jEBϭ,,d(2o7ch@~AzϢ`z/F,4 658(7@>21ѥkF;T$>d<$]9FݸT2/~\i+ 3LjyVDs,pssМ@?¨;C>WU-*mb.E2jHUUY]|~9\a0}_!"o4:^LMawLVcw" *ECb|"DFأ1E t}}e^G8'wx_KVׁSM|%]-q < X` Mdwi%N2A;@V|go}'<+ k*^8߇ƕF^ `> 0Zlu1d]sySHzw(pv\7U30.rc .x'M0VOHvV> stream xXY6~Qi  ڸOiJVW$ywݢC蕼@ÙoN İwW7! =3Vkö,b= 1Vi{ϫoty 8ݰV3K) ωRUMru=,  Xo4 JoʧTq6us%ɔ5( yFhuݯnAtVUBQS }%]uPiY4256(EeVsüfh/T~Nlګr5R(vYP fVrBHz1ػ9X\QF.B4˴Ÿ?;~ik݁ӆh׫ٗo2bXe AmC?8eň Fx6g#';5IKxؤ& , 4@mz Vr;ڰo{RsaӨNYjtO-Szɢ̕CQ'Fcy:);r(o4]Y\rO^PG!)t h} Gz=m"JͶʺeqXrv.i`_NgT|,"IRZm|N UӀW.Fv=A'!ȂQrw|7mFoYթa e.8* $DI_:UP;y& g滁q<_@\efCh/!W5C`v=sdky`}l|J?:y޸!rߍy0"9? oeюџGD4bq BayP9M2پYe֩hϔ(|QrȓQç󈧙Q?V&qgh' XaLȟi̻5"4apنɦz7e"'U%y٨fzJªh#4՜](AS>L ɚ~HnJ] ѝɋ}D4t*UG=O2嶈i1 rO7eƧt?)? endstream endobj 1587 0 obj << /Length 1274 /Filter /FlateDecode >> stream xW[o6~hu 6 +(5SLZ%KٰёsaP9<׏=콟,ޱKQȻxcGzkjoE%]]Mחpbdq,L9ff9ʫxj\ /(T:,$`ZVYZyS=„HSRgϾKΪx)6JqCc8 ZB.jNq!yWkM9&7߳oZgqón\p9]]I}'fFse{J:ȍ: ?pafר -Z5"Z[1Kz;nC%_9kVf}Km :Z\<⤈n_N~9e{kX(HoV^H:WzNf*)TP1 XD' uP4,v)JbK6~s2&N+ށXEֻò&.ǪiK!bP/prC8W( &boEEh (VzeO!BI[7n CYtٶwhQVWCX(Jp vQ2z`E7*J(p"ߺxpVKkp`rZUf7_uOތGR)j3IР*))&bNvNL*::Q7P 8MO#7ecr! ֐˻"H'Crv?48*8Sk~ZtyQv/B&#0U|-4\Iۢ% }A[ޛOZq-aNfB̮! 0Vr'e/ub}A̝}7+\/VJNw+)\$q)V`/[ˌVVHq3d41C)>Xt:flIBs{ևQ?(Y sY폪`6^{yYX*ňNO!1iHYS?lК ) Pv _vIۅRB??^T[UF/Xh:Ou@ڇA gBnT]+f^,\_]M>}~شco czDh7t up˭s}0D6 xVsx9t#+ endstream endobj 1605 0 obj << /Length 984 /Filter /FlateDecode >> stream xV[o6~ Ru)K ņ6SWLj%ʣٯ)Rh'i( Xw.<_'o89̓(5A' M$kJF$!DiԆ7kje'ȩ&d+ WHbڳQjDY,?^տ|7ʍzJ_U+XB`Ns++Xon/taÁ;0ǙɊ׊KTlِIWn31j1gm}L`h&>"җ|H z4&z]ɻ}}q:`mgc@b4x#gxHEmQ*+ѪM%Jk.Rm+f?KV"|.,A{'Vܠ&f Qt8zCXڪ0 tFEGWeVI y0 ?CVזN",yc^kBu&݅G$P܈ܖ$-6U7vV$ppaOZQQϕ}袢Ժ.?7ȄMXxWIxhA4OQd;]T^y.5k*`:u`t|G]r zʵ\r|K˲Tg{ F [H|䁓?v=[ohu/U=r(_U0z?jV  @L{<+IQFfɞihqZdݧ)t;^b[` иrn]=O{q^#@3H &eΈ:.;_uQs&Н0׋^زGi9E J[&cHW_YyW09uNUWK}?H0""QwlܾٖFP8<۶jh> stream xڥWK6Wŋ\RO+hQͺ! \J*nr(YUAR|`M90 ۀQJ8 $ &{QKg$d+gfy2N- ؉y, }L \ *_GbLUp1}w{D4fAF3JI r>hCXPeWb[za;cɂ{<ڈB'$MҧXjO+MS qVtIkρl,يk=x¥a$]4NL⺋sO4*g˄ŏ07z벺o=B-n݇d71 9Ԣ^5W羅5Ր;1sWy&&4sfV+rKm-YB$!t&&[c)>`p
lslxs|p ~ u̧,Qqz^[/d{Ƞ~.kep'~PeVp}&K@H -bk+ÉV1$2pK,xkdi\X 2켁bt`rkc+:<0Ww<(pqzNzϵeen~\Dc' ۢbV*U^U1 ԲOš҃螉 Қ%F{S9Ņ'[ `|}/Ά/6b6jEQZk7P& #OniV`~YG+t<r٢'fe`H{%JIVVGa{&HIu脧 >sݷW+u\[se}-헾ʈJ`{rv``%z(]6-j)M!:Cqu^Gb?)d}UK]h{u[ dx@ȅiyƤ0<~Tiqa+>7.x,RH@+B֗,Kƅsn'ݹ&w%;k'YY> mŗ~WMazk*rCv!Ym0SƃV])b'm3ۓӖЗ"p/ ߹LJ)^i돫pV'.9';iЙ`;<!y&}pzCI[wOʝ_# endstream endobj 1627 0 obj << /Length 1425 /Filter /FlateDecode >> stream xڭW6 5d[~+>-K+8Bm+ҿ~É );ȹ\L]ziGb` 8B |gr> }Z}vE =L|4V]7Lm U8 Buj+Qv6' m߈ a=7TRTb lZO1R2D!(sz<^.&L0E> J"OY4qvzk{qpn'FA{0F!v(|ˇ$43B\}fIyI x >t^ofо}$HLL#1G"lPf2zy \k=npK*LA}ۆՆBbn OWh n7<Ӿ% yua$!^v3 gj{f1 'OG$_\ZvD\n 7 --g>q0qἩ֢.5'lſ ,;J2Nif<5_I+jv6ֻ0f3gdcWfDUU x 8utӛg'i9]z= { ;^|V9[״d? (9E+L iF>y,`q'ah؟XVjx/n>\<0O!ҦыZQޖj&~ô-88xuDZT6Xmw^zfZEs 92 z;ƵN/#r`#\0bckQq9v#_vM!wZ߉dvSwŌڢQ:HzQ%a>h%\* Jf)v!Tim]UhևAI>@/ G$^uAfjܛWRd4!<;R3|Qhhi'\Xu/YOEb5 V;Ċh^0[8 L?QTZ[+ ]W ahe&mF1t53/acfm>yLӸ{R쾩Z9UCAh3 [C݇bUO.FlN6̨6]dר8j|!@,"*cqyOmovIOV5W!Ϸh߂ b^~lW'&2h"k,wX{m}ߍnSW͡#@cB3PՈ5'BU+2 Н)8Zˮ9ui};'jB;^Qa<zv.2-@lVTVX@{ҳcMc C/1E}Ջ?nٳ endstream endobj 1558 0 obj << /Type /ObjStm /N 100 /First 973 /Length 1899 /Filter /FlateDecode >> stream xZ[o[7~ׯcC9C0H[` NhAOlomC~.ENX,Cs93gs!9zHǠD0EhbJTșX;S&%ȔG A " | *ZDUDTF<^cUQ39#*RM"I)N^!PXyZc} ? D \!^,5$gHt!R..jpXQs_6J0J0~(!Şk*j& , z)gxJsbTqcfUQLI PBxPv=c@n˜! odU s+_6pSQ "(3@yRJD<+̳wݜC7'"7/kj"(+"5\ɞj2>'FhȂͩ{3>uh}'k5*8Fa:5uҎ琭U*(.f(!G@e@ڕ0<'̟q,rn,'M fZdU &uzmt>9G?v.OgNmf>Xu/61bq~l:\vU? ì /G}:f|IP)UAEN Pg+B_"o 4:lv4+M4YvH췙?طq#ٲwrem1;؄ZQ}ΕۘC ZQϻ-AЃ˧z(Q@`W_ϙ@zuw{m#t, k80zhGsa`i= c:(>lsoՔ$G"Z7S37605r1FnM΍Ay?> stream xڵWKs6W`C  ЎV&4$fˇJRUC{RDJw?~A)"d&Q8Zn%G'8ZnЧY yh~^,@! G1iɘ* '#4#8 ZO h MxOmO Ea8{eG} bC#;e]UK'\4F[6[{ܘ#@uN.$ wyGݲSJ|=$C:<8<b͹ЈT2qΌ9.3}BB𴨏<SFHqvd!!̃+@\uW#8]աJk(iDٌYUYM7R1~#Zc=d YB6؛ǨNQw=,߬bZ6qSVn%4Z>q=PKsmwwE tX|y[C>g_ABu@ٴHJ-:{joNo| ^.[:gZԏ*^4UM)aѲ;3ӈ+͢]j+(l?&ab[](=!,إ{t{wQيu[ +B=i?4X[;$@)%;S]ꚪLβ1 2H7C֏cnjj9 gix7FCc>aå> 9+VoȖ,;K`7/mA endstream endobj 1659 0 obj << /Length 1703 /Filter /FlateDecode >> stream xڽr6DH0iӤL T Ъ ,@nڋ,v%vr6:{^N$L (%QxiB Bo>Y8:8{âfQ2`cPv-/5ވZgF,1ԛoFRo噷3/KjGHe J8R8Q4ՈFo!At!$y84x2Pn8f~l̘ߌ77! e4s(10'ZJrF1vBoFG$$I: BUE] ,0"2od$l0R,P!``8`[Q)Q5lW+!Z;eYCje1A>ǘ;†>r?JG0щ 7)v׵T 'gs.|4j]XB8n]inlъtO_EQ!xD'WWؤWh6EUH˯{ڲn cƻͷQ(tnuQUD%VH]h nֲ-ɂ+>qH W!Kec{J E5O*eM;%:wp˙lf4q3ly'WEY"c7J)4^,pQ.궩zaMKٶ@b/8>| C.4C]/za]}\]͑W=%觼e?E~Y2j;0 $I{`@oyw@rt3loF,scҗb8fDw1m(cLq'Lܤa'7WCּ~x|BO2->ԣ09,&|˺5]LW1.>]]\{̴ِvT=½t$[@z Q'ϳM8Hmh]\ɳ.C&W endstream endobj 1677 0 obj << /Length 990 /Filter /FlateDecode >> stream xڭVo6~_!%Q-)o ˆ0!KVIhUlq =uz} c6ifn2% C~euY7v9@A]mV a:M(]Sߝ#}7g$fFˢѺ:%fUfMNfTDJݲsB5)p֗U$6SX񻑒-y)~*![{Iк.g=mšl63_ aoO M8V-aWdAGS)ߊb=}{6-ՌMYvV6Ksl+2c:,٘^X=|IF)c,azKH%S.9K,-J㉥-}gk&' *Ba0].#1U7~[#)օ{~<'Ę v/xbtcLyn knj!=3n8qLՐ{?זm @'/`HlW? endstream endobj 1745 0 obj << /Length 1285 /Filter /FlateDecode >> stream xZnF}WhKo4k*yD`zigfB DVZ[Vwuթ|y@7?~~р01F(c$a ov` Dխ8d1QK5"/ʧ:z_I"O-7+,.$OY/Ak{htUg=%J.!ӫb#N>0u0/uq*|Yo#&N=]Mg0JH@'qLA<ݬMOۿw|BA |<_s Lr$ [Y2oU<G'triCuCzY:Ã`UzTŋA$:>{TXyVSlC(VYmx^r6yI:02TL5 e6wSA(WAWvgO[v/> pw~\rdPH8]U\M4q P'u;m$Wr$o Q R'⺹|mI9lܨvP3ZV ɋOw8evm "CK  ?eTwz/J7Nfh{CBQގ/F-GLi]dSrI+ғW9BRSk:JU=Or$E]]sze4sǻl@*"˔U/FϵCB;!t!xs ޕ QW` qRsdOC?tu#PsMdr]晒NG l( :dɽ$;gtSdDcf/(gIRޝ>/:eّ;Sf#$Xo;n)~7icLl,m̒P`ro1@C/ҞA>2h,Eѹ;idqg&3_^*H%_ endstream endobj 1648 0 obj << /Type /ObjStm /N 100 /First 995 /Length 2738 /Filter /FlateDecode >> stream xZrG}WԣՕm(MnCA ۿY|nHF~{hãöx}<8|v>;0/N :_\ޞ{o y5̂j8xvYD8D0bd؈R 9}Xv1Zf5'C{=WSU[kZJAx3﫛Q{'V*OmOd ^yg@nVNϫ92?__Q_Q#[ tAFh%G#|@璨^(߾/..5lz3g/󁤆uHqkEA hq@icOVNjŢrfk'Y'E[?Wi9l"tmҮKoNgޮ%$ob&xɢjap}W7/Ϟ.\-kw5zr5fH\iƃ\J>#"QXɝH_""l)E$wF;#ɝ/_YHz됷foGIvDZ丁K;I(RYJP4ŧ{G=VgD1VhI`El''-gLxq=2_ A sg)rMV㽗ƈ*g;SxPdQ`fw0Ș% hy&wǁF5fd7 EҶ^p#//T Yq Rx#W-(ЧwFAjZ@<$鞫َHo=6rX/kVwc-}h/}h/ 3қoͷ[{sk\5׮vuَu ].....t5SL]3u5SL]3u5S]3w5s]3w5s]3w5K,]t5KOs?E5K׬]6c':`;>hqTq11_l[PAiB#0Qx2jz#<D #4z{wXFp|O"PtO*_@!6刱cFDyp00gF FЄ`gVF;FOY3B bbca -醌{BXPb Ef l^_l&\F<1eN`.(ZF0KU 8W6'h@H)Q)-lORvJNP+e,#EmXvPiF2BCE0(i4q;X5q .lȾ V'gb_p!tq)Kcé=ESdk\yeJfLAݻ,8ph>'w]Nu8F`By| 0;",h(#F)G6)N ?o 5DCx>VS#B#eh8zqXͽވDXyUdBLAI9䲃:=$)g. zʄi8˾P%:7aUJVX ԂPso2` bkMiBv#țQ|̂2e(A vy}U3v4`s8K#lcdڵM'3Sf֥xŘ428f46,#uu`hC7w 2`  $x`Gy?c7[?NN:}hoJwgMwӿF曎0bA_;q)ߞ6T0w%5 endstream endobj 1913 0 obj << /Length 2065 /Filter /FlateDecode >> stream x\Ko8WoR6aE Ci[[G d9M/+*%@"Hyq`]ǫ_R!, &l(Fw E|J+P~odqx|'r#uQ'PXdOoMr7 AHiE ^,?\xxW.G ~*.c!MjR\4ƻnhTDDi`NW!IiS|T#$6!x\CnVV¡rsR0d+!GY\[IzK5 mF)CꄺGyd'7=33&V5pNMoD;?:_@pf#}t2Qb 9:Xepƌ:8ؤdqWA@LQH6^23mz\*\VoJ%}_ b,tډR.z=0%<)6?q zyu T#p[S#udDo2;xܴ' oFFĨtg 2oa0dބ`LLA1g s b*<}>S#ϭzʹ\S(XE$\4gkGT:>2UA9[ւ? Bhkh Aa21Lga LwN<{yg0bB+ 4%+7R#P Y:x\gr&C|pg\p1Q>~oCq ?u^ ΚqPA9QeC=^Ks9v9ok ]|~C&4 d%/I)\)KBRqiH:SS~@l\&k^fQLF_랭\5_lk`xF!*uOP-hU,{?˭:eM/+Rw鍧9dl(  .'ÖΝg̛u01QJ(;ε7V(7/CG2@# G8~IZ_QMWay>?..XAC2kbqKR6Y }LBܛQq9v.;ٱR9eǹ'q!G%co{.GBMKis4ˁa4*oh+#~-{efU(&~>@Us !WhlbҰ-6̝ 8k㠰p}xgmY8yoJ8u@Fy7] xɨ^_Λ,ˉeq MY-{h-;mP1"L$S%?Tf/Ah [Y_ $8`ucz n4ҡ \f}$N X1FqrLeet[YeDO*> stream xڽ[ˎWplW -( A EF }Nqjz;ut.)V=bH=KH7JݨBkɍe74T7,XdVrjl!BvZn 2\14斅ĩrj YV %&g[s(ĭӬ5|V G=>.*bΪ1Jr&Czz1Z Uzh1KCK,4ch%6Sh]ػYᒦё{ 򸣆3-dE qE .i8՟0{U#sw0[- xՈ{q_s9N9|NMYh ?J*ݿ9{68"CxIFg)t<.yd;L<`*QxN&.T}4P\ kgst\LlDuf">f\U2&ٳ>\~]y "˷pwݧԾ%h/ǺAҥن9x O˾Ϟ˫p<闷ߊ9| <,7J+ JykC 9$(AI,mA'$B$iJ)I/SPY"V04(%D]H"ɆL Ȝ9&'s8d9} L,Q [ɡoVhX),_&VN ($%c6P6 ̉2Z_H"b6 I3(I cW/97,'$l= DA']b\M2cYlv6TeCT V߄ATbNzِy=f#w8d6Z[b gESdX%![ȩRѫ橊No2 >.!QMVRo=QTDQۤybaFs:HhE<,oCC[rV])OcsSKp%f$VJ`W X@@,UFx$:6'7bCxݨ˩mz~O`%oUXcGGM\IT78HjNT=SILu3՜-T=SM9>S$L5'Qʈ|}F>ePn+wLS"s(+9!ٙsrxun9VNg!taot Us9Ymg[n Iuj[$)'f$V1'PCeyz觧:ISz'q$ 7H$=#Qm[f~M~sOv~swn$[$o M9, PcpO8fLG<%qWvl$ xJ7 639.olnUw`<%76K cO endstream endobj 2074 0 obj << /Length 2056 /Filter /FlateDecode >> stream x\KoFWX4C %R!K$;I})q};TZF -c:I I9ˏ>vՇ_7_&׶bYMy^/6!t(ΛϜ}qʐIT|aT|Z;M_?\M>^Pq sv,6ʙE\Pα.FxX,BocǮ6I%y``6QmԎϨHfIv,^,)gc$͐:^0QK4~iB2$IrB2x`<8D{F<˜8ղߧ2LP'Wká敤>#HbP<z\؊Р )8; DtZ?-;08S*9f e=(42-I0({`Ÿ%YltCy<CyG@2>h׊F wiSOh`Uf3>jjqx-wf\<έLCIU;Tpa zC//XZxEϽ3 >Rc L6tDt?U_829?iK·kd4S2t+q[8T`4QFL[P7dd| C I tKB܇R {>>V#b5+7WwU}@Kc|82ebړCPPCzMR=P x0q>9XɥpW|ToK,We:y)0کs%$) KLFсj}(m<eH"!qך͸x4C "ɉ1j( %'*$jpYs KxG:0otc:kM6c&c$'YP`Y1o!oW x: 4]O#!u'ܹko CWۊhdԙB|-(5e%4@c9qϷ4Mx2%:T@Npe *-x6US0z 2@cn8oc'MuPw"1)0᠎smhDÁ7 tF+ 6;+fKtnS>=YYyWFt8D+X>D0L V+6 !Hh.G,|"GT?:v0`3I."&K$g՜ |[lғj;19VĢHC؆z :=:ݖ-^5Zz(#f*v"3lВay*ll%yq^< A7Nh-53jxklHLfo_nrK !gX龙&qk3'ِ $쵭޶0uKʗHNR(4UZߴ7xKtbxøVpT q-aש=x@ ƿr=t sxWiolzZٲ/7??OveC[W2, endstream endobj 1916 0 obj << /Type /ObjStm /N 100 /First 1014 /Length 2716 /Filter /FlateDecode >> stream xڽ[K1pz%@upbȋk8>_qz탧u6 pV_WڹjgJC 8$h>ФHK2 M}tNև#wIXBlUn4҄漞7R-Li րjۘh/S[S I&GYGA%Sw4J(% FF(I qkkM\cȜJi\#Ő]Ѡ9}8 QApQh hҔp&NK?Ϣ?Ko+-~p-pun)A@&{I{[9.vt~O/?]z?޿3^v:]1}_UrFnmFƂez"]MFP8Br'1z  8)Gm$j`$|6o~`>ꍨAu$#&5W?`>NP$Y*j~3ѯ`A"3FbCI\=1ghd6OuHGDO9fNb+xI,uA7=$25WC5w7a#+7`G-mmR:& ~nl׻8><~z~?iJP?;Sd;ܼ=@^O%|ӚHAAA̡C5@c`1d d ddddddddddd d d d d d d d d d d d d d d d d d d d d d d d d d d d d d -[ @nr -{ @r={ @<y#G @4uc'2蓺O:v6s(c!>IxB\'ޅІn= xkxaegi( Tozў^ QqNi7-dT7t fGVț9X<1_e($"x8b endstream endobj 2076 0 obj << /Type /ObjStm /N 100 /First 1014 /Length 2208 /Filter /FlateDecode >> stream xڽM+x/v $r}rp!0 Hwأ{4 h9Ӭb[M]4D],H jZcIzAK&jk$qR1DD p F)y\b.G1ϜlE1n%1QQb 4FUfwî[(:fiIu=P\\@땒u8}FXGUl}TKJe\WUAU[R+㺞J%{攴X H⒌&0)nTu5]d^ ֆp3ևZIu*KRc& X[W+->j|͓a֒H1ɹ|W`к@p$fV=1?#ȲFq'Z(2Hx81b' kLi%! 1|aRrσx.q:y:W ?w{ȝ<7 \! % C%SDEt8! r|\1N(!?{hnX҈ N288:D~zJ9P\G8!<:*%:STYG`A`P(KsTw, wv>}1BO2i 狲'5 ~@H- %NPCFoدeY2LSw-i _؁]<ސEj4#&bw70]Ms`eh8i~@0!o!1N3v/m 3.|fD$LS~5k'u$<qRёN;[e 2H8D*ǙaRb_ (1fX1=otChC0 >҅%-jHgӺhHr\qBϑ,dF9#PV́ŻnFTMC6}0J-![==Jp$G Ԍ?J<PG-W+ONcTʎOh+%d`qr=W,m*k{B4B.gbGs!X} xgًg +it$c;f<{lP1f?ucw\B2B^{$P }D> stream xZn@^Rk[5EJi4`v6J#Xh$v;S+h?0O6t'4ćIhUw[54N+H-f>O]jbҰGK**Dvʖ"$J̩&F1qǂ]#P(v?_3mL.(k-ܬ[oyC\I|fJ )V~ ~GOL8y0xJɯsO_8/0›jV}m:jE-)`gwv;pqA Q o 𡵎dNMǤ Q<E,:?V:M+c*e<¥jv

4KʆP9uK^@7"ٶ7/Dut=9A0~QRPzr=ЧA[ID$;sKUA֬&}^X%a.o=%Ƈ `Zc^(Ruilf33-OXҺF '0eu4OqR}Y endstream endobj 2077 0 obj << /Type /ObjStm /N 100 /First 1019 /Length 2444 /Filter /FlateDecode >> stream xڽM7+tܽE`Hbxw,`>$ku``<>/5jn WOI$ESr6.Ōrf!)̠г.(_r @MA .$.f@Y-P+CT C)0 mXD9a T/6SVɔ02CdO! Y!W2(a:0FVZgB{z1 XdV3ٓSŞ^UB7j譍9)R a=;al@"bMdܶ&,5Tl WAEL I#Vb 1FbKѨWFUL2FL1k1sOnoB&]ƥ1-e`EZ210XYo^9߯?|ߛ7?>KH}GۏDplBSbNsLLE8 ݿ/~mTkCQ192J\""/5"G3 tLDKq[q%fd9D]ӟJdUbMW !6uF!r5] wHL ׂ@p(6;\;66*:("Uz,\S =b/VpwV,79,LU@K+ K("#BmAh_"(/UcKV.\ªV% ?=ؾJZ/ɪp +3a+DKX1<+SThFjʠ}e5]FG}xĒxCDv y@;0sX {;N}aCx\ &vMk<}tl\fFb?=&QPhTTuȴ!jWr (P!VvM/5S2>O;1CuI2+-GcICàfKgX3B𥩵v8QEv9dŎG{}eՋ]ZO>lgg >}onN_ =`9}n?ف򀳧t7zo c+vO;E?l`G'}~'?N kNoFߌk7ԍFuÕ+wW]rwݕ+wWCond7 uQhn22222222222222222222rvٕ+gWή]9rvIÚlEWbG/=Tnhf:!ɘt؈Œu;ʅ r읁79,d $}`gCY@ּ!P &F7ȈlV*=r5bn;JD 9²`imBԶ3ă՟5P q<砄v}7! 6C 3rj왧K L."gA~OB@b)f='P&] 18Ė+tEP3C+ I8sےSiQ6/ӌ_ =9 ,.) D|,W\% e})^JN!V^K[-9@1Clb厑slrK{3rQ8| PG2(Az1{:VaeYm%ne+WE8aկJQR5*{FGi-OU;CMR1x@Wjr6t-`/JEkƂ:]j[ܞ1h7mn2&(D`˖~> stream xڜP]% !C wwwݵr{ݯREt|2ZHAV(fgLH5u6t6`UX:@:FVx22 gkdOtt^h :T\YC# oC;G.!lnh'p03w092тhJ?(L-m mtֆ|013223fQY:;G/Ofڿ\M?"?\L&.ta&ca u\lMeI)h.Aq-J௡0wv碧/)-ЙbQ[a;<#`4+##hO,khfc``0']P+Ll=~ˁ WToc!!;w `fgPCb(ikj7yPc(JC020kk?z{u˅N7WGvf~:\-roKu?O\TIgC+A[3ENb@ gcsrտ*9YuQ+T-lNN&E@ 0tt4gf&VV#t妧s]}@t~#vo8#vo3^7bKF2(o.8@~#Pv]7eW@U~#P'T#E7eqt#fOC{Хd6LN.6p6_οAApUahh :!fGoga@XAAo _E32&ZfPQ&v-@,~ZUz$eK:~FgD\217 J@37aYAL-a[A͘ o=Lt 7AM/FFPՠ@6 㿤9jfЮ?L!=PPc]($q]_k, @,F G<A%1V[o& N7!@|L !nv8bvPX*h@P8k@PV? h"9"y?.ocGHIM-@ h 8gglY~_+F;f{#Ar庚+ s)6 xڪ֎KQ-uٵB2M#W2}}4I`*V|_59GO{ hrEpݨ2 D?| :Ԙ\[)}$Y /(NB2NK;A8lG%^|*aMDaB5߅F藥_l7YrjE[&R -26ةtJ`$&5DZlB(aؑ HT\D#52&K<|T`@\ ďA%" ޴x?‘2HTdY` pŷ"m޾r'uǂU :<Vβ wXy̻ry5lZ"» nS|#o^t ]8! `ЎO> X)%;ɷ}1wTb(\JYtQ.ٚ&afrZj]s!6^nЗХռrѲdD9p3#y;'[GI%l8봲wa6.gG'pVS}zJD4c1{`{Աm-aXtLݑ"1؍t +n $-Rݎ3uwޤ"M~TT3*5j+E׬B\԰,":"KUFфȘd~oɯ9:?sO^qX^J0]0$F 2Ktƭ*ۅګe/mMB9?SBIgË鏟+7fCP |qi(pI*4mM#$w04V"{ !&TN5;,-"֨ ':m[~H.+u{uINx "b}7j|i?k1c1y*-iKelp_a21#׊9q^fS,['ExA 5Jx?]`y+`X)[qXuU{FAQ'yѶQ/r/09/'2v#&dBݹV T Xv$ hf%EgTeL/sט܊kj<.,K\|*f,C6x{QIY{fs`3T(/c&i|d%$N/MVO+uTEɁ:YCxXΊ'./-s\+ZtrN.9j,uհ.D9pR'_m E{=Q1b~;9vdgxB[ euZ/k#=jtҬO^;;HQH$ɶp#0b:Bj~Uߤ¡җ!,F`_}EjR+9I|_[I܏b#ܭJ<ߎ#3hlaֻVW*jBH~$]>Ϯ4XvGQIsI$%J~:L%cK@ف4,^E ڐXitpɩ%3nU_IHy 'fm?Lsepfl-%fӍ#ug9ဳ)NxXF)k6wRlMlD߾3n@I{_ }?( =JȯX_e 0 !@ _W1q$1މL3~Z`Ns?g `:餏-Fuh/bGpFV̟pBBEBT^D4j :RGߗP֪VTUxs:+Fê;tK!MRIʊt2 ĕisزXdѳ)~u]>`T7S;nw(ic[K ‹ r#IE꜊cnMDP"PC K @NFSWSw^BC\rK`ΗZ _7p8UԸPF 5.x"nVFTMZth+L<~TS9%{wj19ԧsu1$Ǿ{ŝFZI g#);g9{rn|YI-|W9%xe.%al'xdv:} ڀ*t^vИ{+~|zFnP:F iQ ZzJă .TVX 2ϽvLlKxk#sզGꦇp768U1 7S^atKWk;XG\tuQGeTT& nb *D$!Ŋu JV\X/ 7q/3[3S#dGR?rv-:EMK0#~=cTB7O&1&el$k,5@{eK~RTs*6*l— qx&n "&d#+gJ|)jb:ÎrE٫wOP5,,{՝..=Ȁ-;>n)N ӗXF>r 4(~&lJ_A$Kʚh??sh]^NaH\Q`'q dv~KK{D;kt2eu] 3e۾Q69#9-1XJW㸃+ඛyܿfg˾w4MCS׭y LA-󥅍l#m1} D_m&ș m2‚\|j3„HЃ82bD|*6 >VMFsjKX3@r"l Q_^ eFj]`V)vG&=On$}Wn1hKC}Ƙ@.{j?otU@rᡵ25|2.^=|P0۽"=e$Yj;^۩fۥsp*1qT%jq$>D(c7qg_*rfgwU1tq }~:yZ3f᮫Q ^fq[C&tũ8oSv{;h*SqoP6lۃW/dp5xQ.,1k!ΈitT`;EW\;%18=OvxlC(PgwG&T[ C1͇*j r/=H_oع`ecpZXcϾ`b<OyMV̅Nϖu<}TL+fөSNq@Ju|=< GGusK7i [dvez/Kt6Ag#Yzt6&zt1ïI,U㻴TYe>74ݘ|X0%p3>a!n !/h.˙]Pq\?RHPjuqKbӔ*Rme$@Yn}ުwJ +L dql |) x{s3Я|eUGaBB=j>'fĦ %iз')zTKXH;pLOaW/Uz"g+ OBnc0P,Z͜5h]2XUafltrE˳ktClzǏ4 \Sb MTp1o la=@\p@Y3XeJB #;ӄJQzpEH?t~xoWvH31ߪ]D0+U6FV|@`iˡl1/ώy$R/"^x,3RDQy_!LK9#ݝ[RV5ᵆ5FJGu61( ѡ~'O}ɳ%4G^R%ᭌ$QE7H?-$Oȸ(>y1}{HvvM; K|-vlz;8> -u7_>=^-*7QmZv1Љ2"bZل=K'KPu($Țd폊aa4f,_O{, 奌 Ux[NhOvkÇXHء\&k==:;{P$2RA5r[rR'XŒ!rLMZ5JZ)Xҋy5҆Zp$ U/݇+?V: 9ﲔ[F]90<^i;yakOge5 ®‰m`P<]NP׾HzNY^E4Z;Ao`M@nvx{pZ+gsc=xJʹm;2oKx DOFET[SWϊ&(tovJv(6o=MuD}\V6h 'P` 1&i..;%~W[CeSBOэ}252OFPHvWX FɐjHHk5"9)Hϣ-Bkls]B`}b3^hZΆU6"kh'B3r }!Ds|y”Xw'8{]wU c=6𜔒f~}]rYmu1xed4Z& \l 5%q fF[lr(r=(ty6'36[of5zg*8dl7q'}lіƊ+[nRst3QlO$}yu5Xl( ܷ(ܮ`[2a;[<Wob*D|**SԺ֪۞v&#LEXdHK#[Ɍ~h#$4No]ϙU"l ID8v8 +,a|Y#p|VvJ )!Q.S+Exgl!Q{R6TSўn۵Ur.>i>[zY 4Sl(Wb$&)Gl5 Bl;̶E:~Ϙ 5 emRMAg4Sŝ[Zv_XOzTK+9əME΄*~`F_(c@e#7j & \G[=uXo}9ybQtԑ*]k\KL(vpUӵ/O(moFP>KTz8-*5q[ֳBLuF$rkƇ`hWs//> ̺i#[| _bJճ*Sms)]36ZdWYxd_VWY+1T"j?N} II+K%Odx7u|6˧/O][U HK_E0"F2)ǿ!8ElG拉,nb5KYH?PyxͭE k*EBI[H:Q%:c=9";ϓERi07Y1AԪ,Y?J  WɢB%4?kpjp)mr(wSmx"ap j=5N0rٙu-S_^ԸaIO,Z W۝:8]*aoe?\ Y{/agJڤ  Tg,n_Bl@mxod /%F53g'[lhZO[c]g/n(O{Y/mmLq[U9PUdʲauKeLҖ ͮ?ԲԱU(AOŻhZ' PW$+0,+`@Q، 36yw)Vc_::>?y&A-w~j~Z3&d ,ʬsS=3t"IG 'zy޶Z㩸<*ueg0 /몒Y<2W,\zHXo5g:-hv3('ZÉ?P_ LjqAhqn3(DumN|Hhq%{;?譌VɺqQ{LQgo2ǧQXCB/"ٚu$g^ 5]HqG M>8s2(tC )!DJ&\oNړIT/2djpF^) ;HR޷+G]8մ#~Mx #u?Y Dn^RhMfIW]&1R}pFO}ZHI[CWwf`s=,2nqr@b z/GU._6n鳪V]$dF:TPgAiqC asS`GBM4#7f 6SO5;"0_`K\IDf%"qaɺEw2$#E 3eK{hQėu}i;\mfV~<- XN 32 P [tӞ9c-l 0 n^")ԛ88/vz/j6~SZUK@q".kA3 TxmsUス#%0ߺe !2b@Ly"xMTHӁk+Wp6vӒlX(F!B R Gu2=5lw+kў]Ң edvҨ֍T?x&GB{jxuNL95v[> B/| "տXLUzDe/R`elŗ8{(oݠib1s?KRq5Q ]ͩlVUuN0R~@sPI@V(^wXf (/D8m{L~Ńrvxiױ"Oq騤G=tAV@*lЅ!ظ囍 o089-W!]^stcdSoie.qDm}POhRQ43 6%THyr/ .[fg)++7qU%j HD.d]|!B[R$173B8moލ@wmkxO髜CySR׏{?}Tl bjyK$rWIN. 8*蓲ΗnЯdq UIȶ {d_djhþ8&:*s{qrDkuu}[vfmnEzrͱIu#  ,&# #.piiNzedzCؖ4 $wQI}W]w|y]؉帑?^:G.װo$}K|H,NӶa'7Vzo0z[ɭZ|A NNG'o?ZpدQn&q`I \{w=Yyrr:wC$F Ha'XX ^N@ 73>݊x':_֜Zs=Fã䵋"Al͞뭅AHAySFv&q_hL +Ch'؞lj . 8?bʻ4ra>~ղĦZ_ᅬ0U0 C5xe+bP6[pGw>x44_-&/EjQꛩ-δDEWLOl'_>< mt\t 3,)7^BjfȨmL(هBtPN[_{}2`M1PѾ{ڳ&QxV-w)E^kʠ\ ߲P h|~aV,^)xfFW`_z-TN@6L2~NHqPMCB1iwE\C 'oݼ- &>Ao"hMXY>ƹ{\{$}*TXaC.9STF6+V=f&᠂_!IDޚR DiAPiqsUMNMC'޽׺eFUQFQY49A /y2JcN/`ڣqW5%¿Zz\(0XHcS❳glYX= =[ggU/u=4wӚQ@i?d+_"u_7i(L@]59̲a-[6L/yu4~]m"[ !mO8.[/X\g|ƩP@019g2M?s' י+Oת_Z2Y&%GlNⶺT?aOnkM|o4ܽ׏LԆ߈E+ղS`;?4~ÈM֭hzKl:abB2:B]CN?6[Eѹ 5M$,S.BwpLIf}SqX{uXS]*MA^ð2/CKf䃃T>lLbrb+ y~ȡPi=#-S1=7^⠻) ˑ:ի쩯}>w޲/ɩٕ{b A$__SL‰sqP pQsI7RCr]CYmH+I-K%j뛵SHE9e,vdoFDst@2~w%tB&wO #o%WE&ѹ-4* |9$Î|C L5LSתjsjޮ"{C3sg< r'4mkJ:]v_k2S_!4s)XpF?hi¶1L EIq0I[46 2@x Pڣ}Y4%\nNiAc;!Jz5,]{- &SnuFf7d}V^V|AF>Wh#B1rB=wf>*[Dw>:U3 b+,?ҕ`=I.u_ܣ^Fwϟ4y1ww}rN{6H͔&#mL֪R tv mx 45)1 K5!Uj~{$Vsx7uΥmm\nq̵lׅk 3Ifu0r+D/iÆfhFhyYپ"{rU-7ussx/OJlc;w'^n)i{6nkmPgyGNZ-:/b ut_k#1u)2hG^ԝb$SUVڹ\;]G7]S,I0J3@Bڏ':P&sb6ґj`m(jZŒ`vG-Paz4Tf/gwSNԉĸ~CքM~a؃K8H&wT Ќ 6SAtY >NU8L0T7~F#izpRxBYǜ?mkPii=]lj9o=LfA H*b:Mގ`Y%:7́FIg0eIu;q'x~l4)2CEHiʙYӡ-}nĂ7r)HLTWvf`/dڥuo6Sou5V1JT#背¢ 0@Pjtbў9\9j$]#`'tmWPS'QP^s)#p4=ф8W\Ny oVXbnNbٚVī9*w|fn X9r,*raJ-r ҝW,|M  pqwfI{\( SlI[nW?GeՍ7Z}O`_0sZVBbbj7K X`0]lDrf.خ6]eG(SM?]jUD3l V>?`|c\ƌUѫ!&A'Y24תo2`#}5zp+ ;vQ. ^sW%.1IhZ+a3[[n]m {luH{7 rKnxMz VڪA775(pbF>9 ;G7_nvGlw|ܬi&u.8d+ M^Z73ܓ"`')ngS9)ZLCRk͗*cqB1܍a}.m 3fW=AsEMe${'pE!ZǕە6 -&(sU쫍OV?o ~T a=B#uz?ۮ|h %M"zK9?_"OPoO)M^T_ê`woz(Jh%l|E;W7Â1+ѳrdTԵʧoOr$Icv d~a)V#(ĉ_FTcTo՚9?p}oo42JVⓅ} #uބ&l>"a@h\2ǽb۳R vWZ_'knasӶQĪV=}]mEs^PR't4XV$A"^cIױ\PN],Q&]R뇰kk] i*E;Qs!rUΚIӕ;ˡg39TBA ;Ue\m躮>44N:1r16~;밋Tsm,쁩lM<><2C} vl>aRn=#?.F0zIVUêG8aQ_ ?'\/[x_'٠bk)}%ɖ Yd>%W~jP=o7e7c31~ec1:R:]͂nSAl1IoN^ i~+7l)=*I>Z i59Kɠ;P@; $W蘦+#ٝ[\hǦҜ՞/xrG洬\ѣ Qh> F7vKR>q">ީ(oL⸚ZIؑaiͬl3{f;W5%tf]GI8cɶz󗑚~N7&3Ȇs/DlnVE(YnfG] l˥澘yk$iHH Y \gv3pHʒŔ>Ԓ0Il ,д<~qf2w9f㗵>T(+8{2 kg?yŸT5V_h!N`g >jZɀq4^r6Bu:,';.us 01utJqOlGQy[ qF2^f&n`jb&OI%7O\cy!vAUa !)xWGQ|@x{; <(ݤd#O%>z>=2Ru+ya1iRIbDxd dPiR8$x3IڋjBt8&t T7_\ &ߞKq];wF- $d~D""$6k'9} sX\x02R$ae=ș=m ?g UiP`'#P!?^޺u}IC/u1W7[6|}6PXx'9* A< tU֬ן2g|$1Xݕpܯj'Dy/+clSvO<<\-<%a/?m}sOQ>j3Ⱜt+ v*𱮨AY/?Rk 7Yzwolfszwj{F:*m@ןͣzǓ5l{Qan a"X{FF &Rb-"y65|[}HgPR{HӔ0?i(=nfK`m*xwThtQx LdxC\8SK ~g`)):[z4 ѹ._LnϼV[='q cTٿ|v=fZIl774/\ꠄ&0j\܉3W1n4npe=0\0#ciRI7L5=FuWGv%.VUy(`:` %df/3-$N : rH9CHz&Mptb6v wog oɢ~I@T[I^(^%DpH^B- KaNqRuSɵ &uůK(f._\ 0%]&֛{QR(pÆ?фk|.Qzi"BlȶcZ߾g*8E.=]6^n3nT!X>'&!fv_K;ib*v^/ufDa~Y2V^DyXKotv'a6GR%<} O:|0ڏݮݾPqgJ0Q DCY 6}%}_Y.e^r*qk*OVg":bR![iO-UK3!r.v\Dƙ\FU+*{6jOi~?ʥјU%y|)=-aIkw&%WwvS:8? #yͰG5!ݫj 7E"t& `{8~fx=@ ؐoTf otD:f(b $tސEp%{ RO7̢9t7yVOWCPk*@ymL,6dnbOSxQ$qJa" .4[lU(*\G_XQAK'Ack1Rw {{o`~.Pe휤c2:EI5q1ءϸB5,Q;΋UGs݉lA,UoCaJ~ Svt t,)}%khe"JT>b0kC2S`"b@˥08*RF)͔ltUQ>I5HM`B6I}xw=5m>!U317N0 ҽsƲܯRBҵٓa>&lR5reH-b]HklG%5>nibHJs 2k+FZtTK-a,,gGG,Ǻ8l<[t'~ø.~P"A=Ui["1= 4' F/zwnh2K8{z@vb#b=k>ÒBOI>v_p( >( C;ѦDM<-7݃xL& P)a )*N&&ao?rC{WM>b;/2F[?9@PLJdd $z0 TUI)BNI*vP]N<3kfk"!̄y-~sYw@T1NTe%HDLGu$u㚧":Wعc55sIIaHWt=a6Og%}wKb؄evn{$pj;tjUin .51EH%'(83t#y$B;tbEy7[s'7}cɳK@H? T WR/v\Z`YMH:VK;VTpǘYMLs>~9f֮[uݱ`nj+Hy7>SKT5Cʥrz7%c }```+s7߂ϰ6sxm/=N#?)KPbEt&Arb㬌4>FR'* "8׻f2Dr Tk|N:H RtǕ6f ܑ>L"9^N}5jXUԿ74j[ϧB1yQ2Kѷ(:PJpK8|?Q):>[{D>ܒ]H=0nL*/u4N7bԊ?Ů&Cl U Hk $.?@Ƚ}6ı k1WLmeQg6/Urm  7j b:94qg~;38^]8w- JE?PG7ӶɃ={{xѝO%ސ6zwz_l1Bu==t0bB6W֊鉬n]vy HcցCc%s֛h I. JqS"^ ܎'z2ۀo,t)C2~'ɂMv~2DVͫ5D͠L}{’f^JJ=/na4 P }WAd㥃I -_,穘t-ʅʮPEfC%jȑkv^V_wC G| [kz])W5'@eKE>~ؖ_7BV*g* #qHÔ%jM)B=U')C;̄~**<%H$c)Fh.`1. d?V蹯pDR[cNa}_J,#l{8''"ORQS);r^ٔPw&rc\TtP^\W!>&Rf!$Rf:t %>I¶n^"7^&Erﴢ~׮>`+h)_CSB=A7|pV`4x_rmv5Lh$\GJtܬM5=0 rs$l/SQ5?IS;&#=؏0MDL^L_y7cenW|fjOc9Cc6Wf8Qu.CBHIhz0+;h%L+Z(CG1] 3x =K`I)L4_&.|GFv01L3BL87sa3}&@I~mNdI+d.{'^o˓ 9V ,U91P ܡΰLȅwjLz69S>,.7٦deBCA=d}ؠq\S'lzS&m\?PƧr_>bfn4YXRXMz d%~ͽXPC%1'U1iehP\@.YlBe}gzVB Ky3h`6eݧؖ}h8ϧo1pN&+xrp|SXܗວ]<3?l[Yp6 mr䳤hs;q$U_gɺ(+=SWzT,$~!E}is8,[KCfۢ}Do endstream endobj 2185 0 obj << /Length1 1384 /Length2 5903 /Length3 0 /Length 6852 /Filter /FlateDecode >> stream xڍtTT6]ҡiK:af!f`rn)KT)P$%CE}}9oZ{s]}]TXrkaHPװH\1C`)x,ho )54!Pn`q,%1Ho -C|0@_B½)xPh WWee~*p4 A W qLQP| .[vV Gah"< /) A#q!>H :z'X/r_DJ@@(O2tpPSO H/ BGw@S&37xx#(+ 505՟: =@rݐ(?$ s5SL91$HVLZJ {pfN/3n`'pF8qXo/}tD08HgǙNqG#[~`7{`({W,jja*g9UUQVXL` I @ZZ g"#O#tB{C? .7@ (?w濲L4}?~=G] N( ]}8 ^ '.ᭉÌ_nKk$u p 8ZvqgI $%41I)FC(pkƝ$,H7Q$ pN(4ůB1ވ}(AqZMoap( *N媟<+9)tOjL'y#̷hf49ΰ-MNN5Yif}_F~MLy5+"܍O Q Z=L>ҽtZ9*ldh1#F&@y] [w)˱6 b)びfb/YڰҽU]˺[Q>W:ƙyd{dqd24_mEjUߪfn@T,Pd{Z_ 7VtIܰ6rVSyI4$[B)#m{ʣH'31(W]&T6t{s-<jMCQb7~5n H[=xMh*jAKFmq|R{t>r>EJ!mifBJ[Q2X M?>? BsX9#y-++nD) =`F9^Km]yQE3C &0@'&⾏ُyuG3~vҕ< s)U!uFm"VRyNYԊ1=w|tg>i!4;W1F톱FhtWGA̡krziܫA1F b7سIRikt7"8;'a!* 3юfN/6;ήcf.i&j;A?T;1 kvTn;F2YV_y!;᳷6yxؠ%:c߽*"%7 ?}[P;Aj}-e.֗ock8B?ʹn֧:&݉d~gVlW&[k )VlN7?H!>b-<gҠ /j!jUVi>K1'R3N^uѻ1ג?|=(vǰ:g}]N:> '~ Yߜͦsӣ׃$L`DYyKWNSU92؆f& "›QY_qrriaYGFm\4"wVˇ<陬MEA~UQgqw)g^)bm;4̜#/ b3ߛ-g)$f'⽷T{wsu¹K {"'ظ7׹寮>Jq(D 6QuA,L|H|x\ZaRo%k̍8AYPʄTܲUnWdI{QrOX()n~_ sT* 2y]oJht,7 ZX]z(4hI`IͶI/kk z^)㻯V79fg]^"4$R}! طr_ys ?$I>PV"qSujgt!UIhI\*BWg/d {gTZ2 UIڽ?)H :eK)[aL V3F%dg؅UB:3ݵ{Sd/ M>h=XYcV:ӃT VIئY꺄5}.Lp6 aD\{sJKVL-륃֯ZxXK3 dʧwh>hTJYk"4$ a\qCFj>{ P g6O6vUђ.1Y5Ja{*_%L!y%b,\J=w,2FvC~9y"eydh¢LBXc ZWz;@|ܿFl`X=4Ea9l cl\W^RYGeQS6;iZ jߖ顂R5W(738*c߽-S1z뤘zyW[,-:3PXKw0M#纳B$}Tk/o֕ ~LXL7RY^QAI7`en,%wkBP9/juq5hEzЦm`DEF{yDb4t{}{̕lt7bƒa-Qo]|v>YF!&=`\='!NZC&bk`7G_'*ooN~mQPPj^^4rnzPj>'D^C r@DE=(91ϴ}xyښׄ{+9&1TlƓ寮8~HC9 >5OzH0pGY>> Mjz&XI$7ĵCRYwG_|Bjp9](?2[g% أu*`&mD'p& I,?Z9RK?3gV.0b_"y0`Y,)aEaZ9Vz<%ioaU5Bs$յ%fEeqVЈ2Vl_lv'f݅WD:kήPTnܓy#gX1!ĕG-5 s6.ӰlVh.1#QӘfN Fk,3B rj;5*|IP e)ec>A>@1#,)H=0:]n.l,0K{b\{e伉Ox]seL"se W0s8~ըt+=>tl~׉,>sg*8IqOFu:RNRWIC%<+RՍzH~{{ 1Om}=J"[{O9b*V34c6n`AHw>86rxtvYtN<_xG#c?vNZ]\7{,(,Mc5z]7?_ ,_XI6Rz 1< RۺɻY|FDN>EFR]܀/x{?(]n!PfO&y~"T*lƷfˢ OZeF>8;yJkqmI:["3)U <_o{(it'$ߑFRt>)7rpOL·^2Jvj6E.y6h憜"`WabIHw﮹bEe7UmSLʌ[W Fbq&6R+:tTr0 Tkp~ϸ"<;lPePqjwh~ݬT*F/@ ?Vd?mO:IQ@2Iۢ7h3uʓ8 #$MZbȒ'˂aG,VK׼R/Ia?Z_ܶCz>#+@re@>ܗ]n!%ؔ`L-K?V 1նj$]Ā@n/Uug/m=\AK:D*0pa""'/A endstream endobj 2187 0 obj << /Length1 1592 /Length2 8912 /Length3 0 /Length 9962 /Filter /FlateDecode >> stream xڍT6t H3twww 130CtHww Jw ! JK7ҡ{yoZs}}k?k`㐱Z'(@NCC͋ȨF8ef4P?r &D<5#(#$ * mU(f¼\vs`f 8\@@9?h tA `G `\\@g8'NFtAp;e&wk،}{0/t N`kN詨` _d쀿w'C0 ؂@-EuN'&Їx;z )P:?+sN{a 93cO ~ߗz@|lmظ `7ߜlv @[XOXr<~q6?m/l8@|o[#V ;0? ۿ=&pAa6PKIPQ%-)+ p8x<Σ ]?bU Pd}Կjv[o ࿓iB 0Gx'O濳_)993E`'uC<a K5 zUu=H/;h/sC@P8+!|[f?h/r?PXCm~o ~$yXSu8!PCg?-E 4~ a^ȃo g.?;?C P|wGX?|P_ӱvsu}Y?_ϋ Yc@BB:jd(<8юү^rc"&,r*}Q4w֔u]=٬iQܱx4sII7(UZk?6UA]cu}_<TC;4zjʲI(E "ZH;oDN̤SN&XZ$@>*P=h! A 6D)ϏQmX3~&}w+,Wu''f=Bɶ<߽aIJEۑ6 4(̓Ipþ rr:jxTO74!w;cmÐ۞פn*d08,^0NwK. sWs5~(1+DSW i濻9 $4@v/ Ć5x~*f8m'8X؏,9~C-M+@Y{._L++O[!I&Z(mFc{?' ̱xA:Cq2gyQ,Se"߲(O%iL,hOe) WnF0NhȐ7rzW'Зpb#ޓVhIesyc̅~ZUveyUbH+&g$B}c  <ߍxalwQ<%mgoLh.;dEb$d,9 ozXL՝e(^.46<e߸q'Vc]cEt57#YG$eJp'FuL)T e2A"b϶IAg$c2ř3ALJg@t<>_C_N*XwvآWVg~#1\zsyظ")d~A?P#srM;: zum=)A _H~8b{EapP "dƯh{<&LUOwE3"lxCyZpcnAN[誏T W~Eu3te{¯曏= d$Q$|4HlcYz=(Iߓ\fȕȖ;y$1 lTU>!毤$κ.;O.TMH__fsS4Ӿ_Nǎ&'s:#3տ3= V;g Vx}bV#-;ԙяkwaۤ@etj:LS_\! h>9Cq C˖UŪorN: JG;m9~ئe=k .l-@0a7Bk/^N4p+آ7$rl([(^L?o70(MTTqFbYy\̇VXg91p3z: f1J}\AE/ވw_XZXV WpgWJ aI.2_F:To(/v|cg.m:X;@kٶ1GWP+[EU1zd_(k`*յt7.j鞸j &TUuSV# Xԩ#zaؐL> &,c,xiZ_$(̽ɼFG"aq2o\8h:ZG짘vVQXlHDѦCMՓif4 P' M[/u lV7wM|]Ӆd UenqYQmd#^Ux4E 9-wC1;VB4èe{S%KG@jf!s'. SGrhtݻZbnGd&8]fbʼUuRN uDwH%g ̢=OW.r+񰔤_\[>+Ь'!qP6+1u|h!:r`O!@61;%r}^:6զ<$I)*|FN0!pIzgC,,Iկ?qNwʅb[ӯ?R>a81Oʐ,p~3d6T!30aYfR[!}m xYg$\i7a]r% ]#/E8T. 1sV ޸7GS]lV=߫+H (1K4s'd.U㕄f`դaO'Zj5 t\EE8ݧߎS̻{>}ּH8bǩe=~*7oˮ2ph1W?22/x9`8jGj^[mJ)&a2ˋ;|nYSٺS64؅)%}6J!4-k.'SC,?nzBRkԝ QI殧.fƓz<&)+{ {)m5,zE X &\30.uc `FVd|W@ Ne`?4ǥS(pr|c% a;M&VM2GݾUP?0Ztn LAc8'wD')OB|A/Xt=wQ>xb sۗc+q![7zJZrX"J20d略p(&n|%>ߓw+XSO\T|,jt`t>KזW3mZ:ٖR L[s_;K˿Ua?S6E@'cOp7g I=2+U|~Xe}Rs>ÎŚWR0 ?oMs7} 2Zɘ05p]:%;Fi^҂0+)' (F@Do3b:mU:u.B=\x;m8^5ˊ˗-VVrg]I[?ZH#qƑS3_q롷uYg0gÙ #Gwc\x~tcdh)2+NƲh)aÒxV} L*Rܤr2r G翻 7ӏx<ݽVJ a5KnZ{t_kuԐ}T¼CWC7aBS%Jl/{FdkW"$Z0YF OXvJyDSbz\>!jDMn=M|T .nT13|Y@JH|QַPM *Y|WoSBt;G}Mz+wƼ.R H?䍸U  k^AiYQNsjy2x&z~#{,bNXM␻6pz]j|<:D7`;AMS9_e$:w$jd##aQF2u8F-ߴ類pAs;Le)]+yhts@d ƇW,XZ_x|Yu(c1p.RiYM<Kɭq2~8zġ,Y:v5Q}W ¾cWSvL4]I)oC5VTJRt5VG6b`=+;.6ŭ jLԱZ\d{E b(5dé`DuʅX֛q^5̲5KK89o'vȪ 8  "e{M/ɘ [ >Y%HPaX\ڻG =F?? j}HPSOH[rM<ԗ㮡-$ߋ_R:aGe07_tdP%>AެAwŋfSAٰSz*:IuT<*F}oa 3ό\iiTȜ#w;OaC^Fk'Kbd^4rLq>>Kvd(ym/&^W:"*]VI$.EQ )v9vƬ*8fL%2{=0|xtZ[pybT ddc; qt=gudtg󒘂K :gi{i0ljj+(K}q^6Io9˨J ?޼@m]$RkK.聇~jR,槏*V]rJTHl?ʰ"L"q>5:3P["qie/6c>\B۲kvGyγ; v郔 ްO^r) p)xg$F(Gݪo muI'zt$$Az*^Bb-F$ 7bS7+E_rLR{bJ;+Aӄ VGZ( u}8iP`\mx=;_ ;3F|=EkSHXK ⟹GL7Ư6JM%\`opAK\u$rUH).c#.Q[? }sU1)J ?J1pxX,Cľa_y.v1Wt켁c2;uC㸍7Sޡn3hJ:IkJ}nZLG[X*=: R[XWvg­WLU}s *?KxBƙ2~N6Ԃ>]t$^k{'+R1銏 Lh曍Md Bҙ`!{&i E&4C* Ь-,%FapqH{~F>W_}~8B1tHM/xn@OO3%,Vv ) (c0(}~?PhSJ^h/ ~CUlR果:bQ3ku(4 ̑%o֪kwzv"۴ؽRM%o@3q]F[OIHs@Q}_ )u!L:B'ƥLh5G.ӲrXz.٪Z;}nef-5]by?w 4kPfJ,t j,4҉ɷI `WM.KAOu|{kLf;A>OGD߈ǦiTPUʮ:*>e8 9/` ,/:;Rdk"}L^ x(|vMX8@5i+XVbu2\i3N&E"OZ^G"璫ZM(p܆Bh6օV]+.W}#qouS?9mp4j"6j1ZԿfWM|00R4vN ?6 [_6iStVWzӊy5{f^a_\jn#Sj᣺i=v, 6iaʆiZ #C%9h}3kLF*+7dx1/'.EMr}J$&58E[Lxk{r05mFLSLQћ~ ބ^X=^m#͏dc/~~]%ȅ/Șr 0vZK_zne#K<=>oS$q>(>&hNkYWmK!1!|&^jΧ2:+h2':G},z 9`Ăc )- o^K*v{5яQ#NT*ND1;ZeP2mvEn8Oy=J*E[IM&.#ƶQMp h9< CHӃv>a<7zf'm52!wF<82)a endstream endobj 2189 0 obj << /Length1 1504 /Length2 8078 /Length3 0 /Length 9087 /Filter /FlateDecode >> stream xڍvTZ.)Cttw 0C H#-% 4HIH "͏zݻֽk֚[}~޽ZCM$qs UU<윜h:`=/3G }Oq=/% O0@! W4ziG'/ i,L.!!I 6 -mG 0L6P0;Z@ w%a;=@ǮhO{6h+ԝ@?*X ;hax!+=._@{Wǧ|;l4 9 ' > EWSXJ;:8 PW_ɀ]@Of bi.R+Ʉq r@ ǯ:^NN_'~>NN' ?@]@~>tqq,P9 Ad?] I{\_]z#!#"c=>l\6n>N@i*@_]prpqӱ_`k8.ZosqZ<}qKwMῪD ɹv3n므'ѺA@i 3 K{AX?*Yj6$Ǯk+_{z?\tt}6kAO>d!掛tqz=]p= %GS 5 8L @>P7| 7~zr8޿X<'d4h!juU'I3%xye6Ul1LYV[3Ur[[8njdjMe8x ;f P?]pe ;TqK!mzl_Ɔr9.wu9*DBzG[Zv -/QjiE{ђ=jq6FVq)b܃wN¡"#2ȵzEXwe|_0'd"DԎ9=ˑDɏc9~[cyЪ |RWB ϩD޳ ]UX-7.ר T޺ojv&)aKpWO -S_V X|.ΰ>4zб$o{N%ug|^,E[dbG iA;bV+՛z WXo׫euM?[}=|~c: ߬.U+DC͑=>b\gˋ~Ngh2ĢOW4G1V;ΪJCt/V0;~V>y)g @U,iPt?*Ez/[|la[ KoZĆ51,&.M-Ƿmo+B}d\o0,P1~Yu}b*~3. lMzgt.T;"Sawڝ4疂g9xskT8.;Y`$fq1&^o%wa-ۺ\|W܈|z*k uo.)5?I XXgμK~$bomx="~ N-i # gC1΢kNv[q(gqucH k/Vn(baH9>Y ͫHi:+ǐfFSϬOWz)Ao<p| S&ive-wnf@S#U@-s{(8TjmDCn '9wVep?fjyD;(Iq M>!5y#g8-<߄}8kC$[|W5ytd ZyYW#kS晪N֯A?n3LPyZ(foaɣ$2l7OZ(6#${A)/TPĹ[3/՞fcSiZjH Ĥ_YJS3:/rg\b* ["@*9s՛d$2a\݇.$+/ Y](itJYj6Ew-_e\HFq'PQڑtcL M ғK^ (ݘmwڑ(ܬ>ƗGUc}1d%Μ ̈́P7w(qV쑦{^/%prE5NJOW,z)zHyP0bNȔ(y4x s;?ay~%Zr$XWg3oiT%VV^/nҚ6.a:$ DhTݴqf.PJk+\ÍQ4Ň?_$v_fzGa>pd-t V=b}Hߞ~R+\ ZW{8=9wEҤBiLt UODEV. :bPU,owS8tR[ҮFnGvIBW,3Jv|2h{.nm .h+.yI+`է&SVDR]C(zK %%NN>Wcy͕ЄV'9wg7t_օva]:>BrI`8{ˠQڅi`ʋo~h pv Z#ǝ)_J/Zærq>[fO(h̶8Xr,۰@sVEu'ӫ`k/] R.-(b9i;ͳbn]HyBme\rCU!&rA~JW$(xחzRّqe7+ Hk)(4>k4Kf,ڽrb( !K5n7cz^M0&|HjWT I:jQ3cƖlsj3N^؁6%1 (3Tm dvdtӻlfTޟ.0k\гqB2,oR6u0LmޭÞ}ψZMln\l v'G 'uvB c<5|܋Â.wåÿ0 HZD2csҔd`<azKicUTۼRj3LcmfG !gdV~nT~L! ϕ4fZ˳Pѡy RCuA* ZWlU5ZkECv;HzPA@Oc{8`âJ*#,_eM]"$97Adr*^{*'5j˹%ķDBneKڃy^aH,yzf-m\<1#ڊ&IQy]7 [7dBqtsq (2^6Lc{"g/E3>yn]o}Q š9t|ζfG>CPI fY#vD7n^NoyQ/W03%#z:s*_ *f$vp@C9TR=:\F)X,(~3OG/YNݠZ֛yVtg:lRK%l3)^(ի{Pzq9$0m+â4TTz Xomﺽ^9 ;6.4N^@;<ֿDй+tx/!^"iT@jn5q,VbrM3$&TKK)ZKR,MSD>W&hFҭGy ;}g".!f9ȢgޮЍvߖgwyi'OZ^9$N4\aE;b5t.Iі-ܖuYص}3hޝci(ԡt_gv&/O3\_,y "TxS&c~qQϵ-Z[^WX`K<>8A]OSjJ{nvmR{1+6/n$scr+?K$*o'TYylQ(Bݍ~C>"=9#sk;oKYAŸWx?~)f4+V5-e!dwL?q0y,hK %`Folck!cNWU<_JGUOBa d\J+"oޞǵt, 0VOxVKam{j:ldHrRQmBm蔤B*&:XYq Y"mAl Ӌ򗼼έFv85L9ŗiRڏZE$bSsQ4Lj~z KM2|UoXwb.,E>|kF^s:яؗ<>w!Qdݾ+%"Z+-AMexl j6o*~s(4̱G-tf(!EqƜ:Y4=4Zbx5 F']ڞ)I(È l$覵NS=Dcg?5NRLc<7<GfXCY}AˆW<̽$?߆i ysRtś,Ңu+!"3MzK_JPvݟ\>N)b`uCt\PM[=)ϙ& /V)ϻ4 Q+rjF.uĪ.^VpC Oŕk>E 3k9Y4>҇>pC$y3S -ްRfɡƹp>`*%WB~on#ù/fu$ߔtM]cRlڞ6Y(E*Pն ]Lr!D#Lеes r  q<2Ltnu) iv%myӵW4}~AI‡a'Ϗ81{e#=Tȼb}a"+|`-@1 PCX l}ouM&0zY7nPk)qZNSaF _H73f.VD0yBQB ն2lMp.ys"6OZ.v(yX</Ὀ6w6CG]XK 94unLRxB>ZZz#*ߔ1|ktOl 0}>5$`;kv4Dãٮ_wa  p:ZAeG)ePiqsv!) `"Zc.1%`-oZ55Iȷg2z-p;*rcO#1?~k)S['B II_mɬQ/)!t)"'԰u?* Mhn,Fj75fƶDdC>lP0W~Ѻ f?)ەUL^9 ϱ<\b"{rJRj7}8b>xV'Л=9__5jx !ٝM>9'r'[Qgd Hq4a03V#V`F&*~B,xsMyTn&MJoјvTzGBsbUSGLWH!wŇX}񽮪 aH$Fz@ܹ:m2ZPBIsYњBvg֯Al_3?/b)yg=wߍH5 1v7@w-ݍ<HVixZ;{<`I9znY5>л0kE10 ཆ;@ +k,A>LMX"r._l}-2bq̺!!y(oE^ԘbߠFz($݊f<&?MË͇z{JJg,[䚃|6dMTj 6{dU/{tXFl5?tݓf4z? 2 88SD$Q/g9Hjl]Of?'XepS"Zs`mdIHu]~}<{5BvV?9;ͱfe x}<~ n˻O1;/-It86?? S򅖕8¦?MX*w^yRKr8A94b ׃d V`R8mX@Q,o}nЪhzJ!'!{V^r|huR2$>x>8NfF-,=Pn'W#S;V6 T>`8j^ wdTxT3}V^`FlH[TKMlsAnS)IQl^KEYk@H3ѹW"72< Қ,|9vpQsC߶腺cU FbPx<~p4TL4_6K8GTNɋ2%k&J8w05K)LfmD@FZ ~pӡ׀=]VhQCL6$5~>#\9S2e[I^#=A ൺ+C1m)6J’C4#e\+"jpgDu fD>eI"gG4 VE\; . VOeTBS@Ĉ ;_V=Ìy=;4.ɚ"$_Qh5:P G5ӵ 1FBaJEkey !! YOs8f:#{a-I*K]kƮ@DkT(E"6Q~G%suˠV)M#JΣF+XτMNͪ&nۗeibhg PJޮl!8 .է]_U`Đ9kF\MV!P\vcݵ mG!6XܰA] >$q`\s*I2&]=ۜ@eǡ:AdՂ5Db 륁27=̋6 "7o ¬V\ʴp^y}3qa2hю?s /#&P H4_gaPkU t&bLGIj"}Kꎮ )32ü} j>S$r3sGeQ lY }[l|Ã\x5FNj\; 3?Ck6ʢW?~qjNTѦx@z_3A}_櫁b֧GH.> stream xڍtT.!HHKw )!30 "(P JJ7J?}ZYzٍLU\P0j& 1@LLBDLL CVp[@Q>0$B94VAc@$HFNL #%C`D@}HՐ^({Ϳ ?xBQ0Ї=] pOx QB? @}(?+a ә 7`7E!((Ua.P6 ESm= A{6HtGJC = @p!XO _g!X`= #jQW5jHOO(C>u {C  n0ۯ&\}D0o_.XtP4 %&&&#+@hf^F/5`/m sbH} ~Po?%pg; AX5폌]> ؊a~}~E,lto*2ť/`Lc]F!?bE-Ĥ\7+ ]mm?OG xӉ}8bZ)Kz"`.ws(!ZHj7bhN IfDa͂Ѡ23qF.FC!`4™ l/ɄYϨ#ګz'߃sQ>R/V88 i+U,Tg,Z>c !o Y=g'=uZC-_)u*14㻞:K&[f'yA 8_?-q^IvR>D'C_eRa?#hD.D8K 4Չi{&FQrU *:"j:8:h O{ at g``ԃxђOqwԓD=XʫBZ3R!oXAb%!DW Mis1kYv4FHLǜr(V@MX&Z2Y']1힆1 D̽1+|NǼ3Ywm(@%]/_+cbLAa" kri.yRU&o}Eqct +F}UT>=L Y=^DZ\i.i_ˆa_|Hnwuh% ٷ hXET|1Y7TDl%M'ĝ蒂m(zo,i'G:;RyA/F*EMY)TZ*旎3 i_w܀Qmfn n/Mr(  q *sŞ<fG֟ SCYAo%by~4Y,RQoV:@c\9o 3}3,}$>#$xdpW+nJy8EO:1>-E djN<tp F:(#ø0I8$$de7m|dcpyY6QSrO 7}Ա)Et`*r[PWF4u_0,zIϲ]Le?+Zyd\Ei-ffF`:;E<46{cШ+XI$h>i*8>޲6WM0(?1:A5<|;2JVXB{r͝|b[/<ǣu54Y*ld>]xKGJėLRyIyK.v~z^\}-'|{iHy.nCgy,Ljds0jնSy|;%ǟ|w4ɁcDjjl.D"a6o7wXW ^>F]*G2x>\SiQs{L#[WP`_$WjՠO1/Wi&"~|8n g8ZI6?~DfLlhj/%^z):,--ˏ]t.ympڐ-k5YhnZSsH<8_=e1\jKxJOr28x)4^oǽuQ@k,DVXݗY!f%k/M{XevȲ8^DՁD1g:KZJUiԏ)jo[9:d{Cǒ9Vjܮ4m [er=ucLya-f&_7ep(SuW;M@H >1OxK3m;)} 1멁R:>g$_ #@j-FRR4OQO|{õ\DQO/)]\ h\$N+|aR7I#YiSb !ϓVɩ6>4mhTU킣lœpEМ} M~ldQ<6/ d=pп뫨[|Z碮%͒45^7}#lVGu #wصj]=fs<}/SݿSK^a?I5yC1ͫ!epҴurj9C HYM0MJKop%n>~"!  :DϏ©WsPžRs{8li3IF;^u҈ {NYuK^'g7opfx Jg:uҲIn.Tÿ yo1W5x=HHX滾!)u#(2;:CƎ;|ol0hɁajB wb[; V J͞4:)'tQ,q-噤ȋ{&"~]"T}KmMs6Tևcjo;=:r̸~R; *I}4BzлK WS]1ԋPp .rV܉k4ASH^kڲ6{GXM5%̷,mv}*ko,Gr SM gT4 aL b#S8 k;tAV71Lbŵޓ0v/ wWd~5m7^a[\jCC&-p|OBmюĮ׼0%}k[4;pd7,ζ?ӗmL[7rVaz(zл^(̏[ Xݱ|Kp=}B<dStUb-6/a!;NSM1wSZR福v Ў]Zl-8~.*A0ʜ9h{dqo 8g(],pS6w&Ќ~t%d%nߖ$Y//c|C렷Y|”AMZlroMD]?N}Vޓն_9x5pSzJcUn_[9tMe[Y+ vN|TY׹!XjaA _)5_ zϮ$_m)e m]-4Ƅ|h4/ DKkگz<(;=a- R/A+ߐ8Rx?x_iY9Vju/|v-w,SȀVgWe`ܪ5cELnKyCfpEzԪuVJcr0❤[X#qZd)0k4?B4Ơ^vP G15i 6mhW W)Dz}njքH|x^ڮ(Me ڤvlQk3Gr=?zGdBk8'hv$̧>.3{' ?k$ަxpn^y_N{Dn.gaC mu.f$pr .LGy` *l ~ߡ7ZcJW(l~զ"8kJ*q1ykDN:r}:)SwAC3TPq-C:~mBl!5O-撒2IgG)Z1_{05"xĽPEe4j*%$ n&}#ٷeN"ij.?a:?mܣԥhvTyuPBCz3yWm[N$w\ }ދL]I&]aYB &od]/;ZF2[˖=rfiμc\ tk{RQd_͹2 >],o s}qThe+j%/_PZ(QLtϾzelwa/ڮ@c +v,ft`A[1IJ* rZ =O yTpӖ.tՠ2 bX4H~ZV5@-Un.dazEw~F3x>b,;~H}Zqn#.V)(^+]im#B-iP kqLrə=7bBj$y+N+#ۧɇR&T"dۑq?l#.v,H_fg;m }BW9rU,rw.<>0]fn{R4waxQr AŁz endstream endobj 2193 0 obj << /Length1 1423 /Length2 6202 /Length3 0 /Length 7182 /Filter /FlateDecode >> stream xڍxTS6"U^;H RB B$t^&ҋTHi"={ߙgyyv6"mSC A@Y"@0)1m'0bh ]a`,Φ:hĤ@R@ @vP >Ðr(]\X>!<8p3:`#!)eX)!!A3Fj/@`0 j viM`0Bñ`Wg@" 0ↂ\F=/_~AJ'W"w0A;Q^=@zjڂXO,?4.F v85E0W #A (+ UQPe3 ŐO KpPh+8j"dB1 F! =b!SE3Ue?-˩K$ŀ$3>Dɿŝ%Kc. o?! L!?+RsC"?~3c4N  pso&S"h=AཿG`!//!(>EÉ {`p4}UQ4؄E`WW)nָ(S%!A zѮ+cp=#0N98r!;+/ @a~Q'ta0Otv q|vV!yhq#2ޢ7B9A8S}-`Liؔ/#ٰف X<}ߎ^Xh/ ̔\IfS]"/ .;0$΀*TFlbN6 V%Cnƚ&#OJm߼V,c3>~|כ&r]%VFC>k`b?=mBF riJ<}sք~z{]z5բEdslV nJtNcW⨂ Avұj;LKN-X>L ["%?=WG .dR4 4Knw>EIBo4i G1ӎƛgnl%4j6UhM;mxr& ss[;ԥ(HΌřPSOk^ U q+e~1W!lPlD8]߮Z۹ Xkv 뉽RDw=^2{ĨLaqo(:"n]pRF)8ͷ[\mnhs3;̆ɇEq9Wґw~=צ7t`Q˱;( G+Y 绸IB`>l;~Hy&B^aŚUs*{DqVXV/'^~_Ր vL:Az2,b&ϲ}|W~5|V+AtIxV0c5K*kYLF+ 6Eצͻ$w&ߑNή ҷR\[CJ1ݫ)3* 69tٔN7buE3}k L"[ o'nȩHx;F&p! C(ސEU[ޮЎ˼3,Mzy aI7db?wOccs0)֑?ݖ_Jr w%;S&)&ZD ƒxB+kB  7}GU>ˬdd,+ nMùm_LPH$ՠqӯ]ъ'{kG” >Z­5'$,XvNg6&[9?ZQK SV1͜!!◗y2Y?ɏ*fGkۍ6R.ܬ"IE3ĔdQ+$q5#mlc4VBDC~>c}or'R0e"(\B.+u&}uK8p`m𚧗t V?WέwK37'wyȤt*z]6Dj%.^36.}ٷ>"DEKW"͠vzH 7 e筮, XQ:$3Xh,=Xջ3Pϝ do{~᳝3n9V=`צyu<<Aߜů(|ߢ!'+yWJPkanRwї D\#5'XP5洄4=Nfvfd6jS7j绉 w&Gg8;!xÔH_`ě{[h+C&͹߹q|A.KOj=$YDifmL(,3lV_n]woM]̏h|87Ǫx+Ut2z5jbzIRZ,t2Ό 7u_K[T^y>(̫+W[?G(/ `$]-F3IFLj>C;Vjx:^':UO< Bh1x@ xڠ/BsɌZ/v@BgѹѼwӠT+29j׼YG#x[&:F;T8T>0 x:ܵ]Cmϋ3gH0A"R&UW',ĘD|Q/A8<kLyxE'PVnSy(Ǐ$(2KwE6mK 69C&nfH?bWgt&L~7&S%os/)3b5kY_raQjAY_'Vէ0Q n 02mb Z٘<`d `S.{u 5˩?mE h7;XLK;ʒ>ot e$Ck2doW޺rwLHh݃'P[avI79][S9-s9s7)a$OqSenM&\:u#'o }D _R59)jZ9o0_i:g!"ʈ,ᵎeO຀(Q.߾l|+8[v2ư[}l_22A&F&d3P҅զؠm*Wnzݗr%CnDyϪꞅ^iC3ޔw^EժLhp8x]IAճ$HBZ!+GϘuITNDm'--3ٙC|b7BWy!Vq2PDTؙ'gp~\u{ʖcΧ̀%[ȉYl>+UL>;6gcMOA[PHC*$$S7Cfa2Rշ.ՠj TP 36eWtYaj a% яl;<5YutZHkCs6T */~k~0wIôT<xZYg$Fə>[pX_y۸ELFXΝrB22fjI;Km)}uOvv}MqDCų% f;PRrFOGpX&=?3v* .^ci78d[‰NfOԵfjY6jlE(y/ï_HMb{ veÒe]a'x>v_\?VݡV籿ּOĂt\LΡ7)3zwCү/K_ Qx-؜&NPISZ>ո  xCCpbb"8Qv-_[-OoVT²")8.{$$/[ܕ ||doE"8r(kjR]x"#aHer=q@'svA*{Etٔ]2&/u%Py4UY]F1,y VOUf_w$-kuT(zUNt,m!~Eɏ;h j#=ˇlY퓔FK+Y&|U.Rj%`o\kGaN:E ?IZ:oƫ믰P8XEw^l*;J#2uU[dDQPI-q' |,d2}cF;9YLRW=i87ls, +e+[;ދ"kI;吋kqg-*D#.?FC< acLsP#GFMze5|ЮCbC܈ t@d秵`dT$jGh*0UkA$rt7G?$5p>ni6pȴ`:fwRyp;p%޷m$.>M%bS. <:$.0`w1e&:tk:C՚r?f YUM m%%sqvgr2Ed%ŦfXNur$й=ʖT܎o^ ኘKeN-=b,n{+xi`hڷMkJEkzYUL WH?7-g?޴{u2k$qwM*r*^2܏X;OZRXltNBt?'u_KNײU4h|C!5tS._ZVy[mϭ'_$iԋk֛:2,骣|Mr' C~4a5'm e-\5PuH'F".g")HZs.φa2n骰D3jLC.5_?Ed8ޯ6Bu=3xQ-,?~{3/*dbNuf*S8ɬX[P$6Ngz_yo49B-8/?̌lnHQwrf_Q5"-.*c ]iR 9 /k2myRak١;'gہ_ei. w!&t[Y3y4!T:SgޛrŧݶN5g(/,6Ξ cHj?Όn\m3Ccݡ* ݝhڜ%ߴfD֥!2$A maYb*LOwLlFie*, sƉg E+|,Hؔ&k8ኙUQ6xi3}7KVXY_HH|m'a_ݻ^^g[Y90b߮> g8cQy+^vq64roj*ݖId%=7@pp!{TqV$4!Qc 9ahp4ʤ2#dI Q1쮄$m?ڧ9d(^}j#bq **SuXB} D4aT%Was]MdڳА_h4h{)QrD%&ZLJ~xzRMAm:L_q@ |SA-E`Z<,}o,Q)XGӅNYd?eI0srTh5e endstream endobj 2195 0 obj << /Length1 725 /Length2 14862 /Length3 0 /Length 15411 /Filter /FlateDecode >> stream xmspe-mc6;ضmtl[ӱm[;~{[ﭯ?SO1֪z(H$A.j@Ff^333 B hbe7v4fUOwttP;а56rhڻYZ܄ݜ]\9 \,s+[ @LQI[FA @-Nƶ%W[+S) ;lLAfVo 7?̝j" j 1&511 'q3?@SMGp,'`fe0ZXś Srif@]mmj1{;W@ {w'"-5-?2.!>%'ﴒ_,U.NV]fI_-[%*j ``qq}\SW'' ߤ3 ¯.ٛXUITBL-|[EmifxpH4h"s-sBjD<!_.!|U.xi03Uq\[ R`=u,@b1*BJXISg|"jPg,C LwWw) - +u .tf9kFڊ]KZsL8^iqw}Hϐ J9%)w4Z^2UnJ;C"P5"ҦާRtqM+;tVb,ke^)lFI Z,!&rgGa|n$뷦_7O\4x{ػDi_(,beQ Kc iUa7׻y3mI0k (_9 3Uh@S;Ců⓻O0d6*D|ĐȰA.Y2Y 'sK>Nnt$ [_fhIsze69`&wzt|7 bӼ"ƕȮE媙f iӯ?= ∜`nCh1y>w,v%nVɺI/g>ą ;4--C1ޡebDuyUWLO4QʩJеjt_d/LH 3ڥ$!NLrhB67g׏ ֿZj^f25B0F~߶5 ه$?x{4LeG0G^vPهH=X{j2ޙW֭ :d9Wh% v)qm w:?;7ҼK &WNras;y DFbqyɐv&?EVpK@z43ǧګHcb_%76~ohͥzz'=6>%X8 duN,&S*F`+~ ?$m89弸'g{Y0-B(N$!ʰuu+q[C=Я ta/)S^r=0[#*ge`&,}4m<÷c,e.Э% q>Gj ΁tj:Z M8mQUKn@F^;L)'$s[l_wEA6DF!X*m~J5&gn悩SMhXa<^<è@b_!vO+ZKCGz9=b3R4S:ޮ@ 0DÂyCkuzbn) T9v|" Dqѕzy@GrD<1uJ$V`y^({?nΓ²]P8:`Ț3>* :+sg t-FOw+{?5kKCI3.w#D`I raN ɗ>В) 8\{e}rϤo +$C\Ål q4&5Brc['zɞJHx]ZlU#V9=!&.RJTфioSg5{v3Ls<8/+>uFyɾ3KL_煷 ܗ$\P4=^%d86B#\ztt g\Qqi!+y[᪮W"I4MNy9 "߲"g 8p[\e}b ڠL6HV R_lo$vbhh[Wy˜w^]&C<\}ER'Vv8U75E(`V,Q_bk0Ƚ*ٌĄWջYF.q4y& -qc`k=~Xi!VC }xMwWf|,^LV9@#JR1}2$w:~MQrOyn ZF#ydo`j6n>jMEL.%riaȸNZu 5{2d)f}#s$T`s"{.}b1Ϗ,c,:!DYqד~D;Ni.o1 XXi$R h[J-amٚs!KЇ'\ЪwcRf̘Iwz:L˒N&ѠAQxIζJޔ¬tL^A\/7%t8}FJp9FMh, 5gn7ЁSBdc;lrzNj:hƈ7CEwhgfzAB_ c.smo@S֊hڮ؀60ϳ{:;ӌ'XKt^˅.`chtڋ^#1ZNQ`|! ϐd5N5;S]Y[De\I 7 ҜۤAE&FqQV+֋jWަZvzoX\1/a\:6CKNu'ycܑ9͈r<*qܦr)L#B"!JZCʼns2ŁFE)MkR[FITߑo&)8o#TDEpl?E, VbW^\mYg$&+c) ?ذF!7^aUSzrUfKJLMf$FiZqQoxkiUV+L\ER]J҇%"aW_|}i7Lb8{Kd8):|#X'wwVCKW.R*n E'E \| ɀ  |2R0ΒyZ72=1L¼z\u` `Yk{{TdBߪTՏZ>$6c?gεřSWN+{0A6±2yax)Q,=A>d  Io%5Ħϵe[vx]Sc}tEL9Ca['t3)!n.h@v%^|uqiC/t!Q`/i\_Àp1uI~H؃ ;9{Ѥ8s*M}}r{vêel?g&_>h܃[$\~QPzl8-a6R^aqmM!woo>8uu܎E tBkƴk\,YlP&POx<.#O+;LԆ)Zx1lqxTǿ\V,OXQLA/ӚIp%S[WM7+YcC/(AB.%)2׬,'G7`i \(>h+Ry5cʌu=mfYnʡe cLG{˟(375 HITʡEL:lf,,+A{*a &e(6OuWjӌf0gA;]KشAC)v ^Wt\Wq[c^Lf~[d펶7#Bpd&&͔6V-7HG#K8aPNleoH_1G5,BG?5-Z-78 .C>V-;^nZj? cGjp&(49'^7\mS37Մ4votB5W.@ qunL4kVG PH' kPwiWRcX7@ӎM˧"WUA,<:/p]"k|ѵnB0&R}H7#ja|BTmPs?sY(S@8]!53W]V[(j,?C);OGWMgz0QF ABuʘ)ל'Tޱ=y{JpʖK5D&Y^IkLg2O$q59F8FJ 9+=OCWm2pveǐ{6r~JSi|؈MNJfs7 6T.z= cͭ (l\L(gr ϒr;]?a7dfFOj:ש} dwP;uBJ9z8OQ{jCNL#nV\,y I'O6SKT}gUUfv޾*#JRfA7` 2U i;낒jAG*Ϥ:U(b)|ݫ88ʰ5u^{vx_IC4Se,.A2̃Hšt Vy)9k= G"K/μb>*E u9kO#41`9X*Jw?/g?$sR X뒉_aH|* -T ~u{0F܊% "FW |cY/U_6Q1P٦eʃw[*M"<ßR@F6DF1/k0IJ"󫈏 Fg7,NTl. 1vǰ[xp16<="&p7z. qҹ aҀ>#@[ I ̒W9M?He;¬wyC= %Shm#?"ײ{Q[5EiUپoUwǬ%O\Q*-l% i> ˸@ ׏0#F|{Vy1S3LO *QкjLVU)g5ZcaQ9EjL])q ;an4`{dWؾPRKHXe*wmћF% n%ӫ'W1a20V]6F6SWr;=5RcjWtY5\P5Q\r:˹)mۯOj IHYR4]2:3a]hƶfc\lչ!K:N5v'1PnWσ4Us>ffv`c<Ǯ?3H>N2p1Eܵd}!Ln$2^`Tdh=BWss-04KELbn~ӽI^ r@*dO~,拵w 5cAi?Ⱥș{^:Hkw+`L8kS?Ea?1mcʸ-T0v(Ov2P/<1ֲrV'$T %EF4g(sS@A^<|b0(7@ĿKB+k(|a8}}N7Q 3b˝O%뾵-1YA“=@mUAŕB9Z#VM;%]`ҘJQk[ZpYBW=dEF.y-)lۭio#-3am2jzX@1 Qjj.oaԃtJjfI^-U+%9@I=PՄ\tIt3C ;vbXQ&9p}_qe]{rY|A Cx)B '9,+L qA\}Z^^f~ra8ͱ{i3\2ET@ bA{=MOUSC+-zXd ŅR_3t p_[HǎPxaRkmQoj*EB?MB<#"+;BÿIIK_jWL󩈥[B"|>Lw#ʹ߆N?xwv6 {83{&n)+MJCswr(!sG>X?+%j}cw ь:. 81M,K}YMf_9%Ԏ44Ad{s;nvXd+!<,h[솰~ WwڬdԶĞ_|֢ {_T-qSeX""jJ6OJD;Bx  s:`+<-L'[#K`S#cќBAGT"S+wǦT 5ɝT3yʕBy]*RA;ɌM׌@ѹ cЖD(Oq۰fj2@#~^HAn0 9ӫq9si=[Op&ʁ~J 9,fO+y ۖrkI?G`X5B \[UOBhhZy3)weK"`."6[a=`H8'1 m<߼έUIJheowZ}=.})z{ ZB*ĎJ:ȵYߖn)NTq;\W -Xwd1]S$9%܏jLֺ$qrj-M;*k*ȹH9]w YoG *߉ީ Ln;kP@7@lCg E,@]&#Y}.DuS?𖌦OisXSQ]rE?Þ.ȸrH?ww2QŊTaďP}DfE`qJK:c.̐Zs@T}Uë9o~\m|g g=H%0$rTIj꤈/3=gϊn_xO.ỽjL4mFyAGB7uIѩj ҿ=9`;6c\L5{u_SwSL=U|xnPTzy ASxJ-1;3ddikއ@Vi/ot[\Wg lUŦ}kRj!V}s%x@GC!=l4Ԭq@54(H%wrLwf0*>\0Ca$+= $zY=ˤ8[O0`{ ӵ;NI^x9E\N/gjN!EL(*6Z*z /L7%Up3^Q+cdaVL);gpy3)r %1ܣtb`:j:kuuVbGbAur,az+v>Oo5gæeP.&ڪ1Ze.-' 7 gBZ-v׮Q~xoݲ-TQ(V]XYUo-Ya6N_GD5nl.n>L:P^ڝ_ݷ @\2MK.>$#.dz}Nyиa)Q9m’8S[8;TL_戮'+_J2,ƌEC;ӷbmuɑ6G{l+"DR4.~LT:({uxNНdYKKᾒ"L`F?Vӿ?n!Z V\H5Ȋ츬 ԫfF'oǦ\tX7 )ZU[#7`*B3["zu#]?{Gѩ̆NP7h_z1a-œU{q~l+I.Ҵ4cgq W`THo̢2Q4'nc't9m1o kϻϤVVWmR3j&5fۯbcw;T鳜\чT{+ڎ)U5ܻ~:#f&6qdjr-[FԑFn37u1ܒ#pANoF{Iz-{L0;Y7YK7J|A\+Bo,wKa IҮsdu0YT K#zh3@U' 5F 40rM16?Xz@ zNH9\ėG=2"dPv p{iîT4U{L"*g&׵6{Qj#aDʋ 5hDrIǃn_s7ތ:4" [:+9נbwn4r{ݖ_>S/I nbĪSpa:[(Op\k5UB"oAԔv#}ˠu>~Ƃ8aYbzl9u[ef@3C(uߺ(匿βx[⯋:>hڻ)ֱl3[n H+i)_jeU6a.K( ]rTfXLg"&tK_pU~>u'p\h:.m&%ۼG fuv@PLeۮ'~БLj,s€Ip8A=;8\g<rJ++]kG>sk/B[dl,s'J!o֗{',EPuٙ!᪦i?ڴ^0xL2eiOwPG?[ҬD@= S@mR0sGE\bgV#kv1s!8Z?E!n;IBŷ/[>m+BtIm =5㘸r8ͱ'> stream xuSyQa"AXHx\dDg"B+1+|&WY#]AĆ#t rt&TA>Z4s:¢gBvP#X4L,SB ]3i̜!>@͝[q?,fδ6Ptw'alPXp+c62@gH4Lx`Ѹp;џb B;E`B !@5|SGa5 V ku^(o>H0fn_T06x)"o1WB;Blľ  îWALd3Ep?5wO-47˝dq\xӽsiiWsYw! 10uL 2)5,fμ87 `px.1"`P @7C0sN0aB0 Q̯4xf.=eςAp+P/AIg'ϐc0nYXm,Zn+t^fD6r)m`9o9L{c" j湥i0=gCT~Ф5EkcϝWFWO;T&#񺓛Qz|%1͏(u#%[҅S.x^Ѡ[ꨂJvU}E*&6޼d(۴dzt̬]ӣ뫻5S^ّX}Dkm60dx0t~zli^Kɚv󶞆{k'֩#%ILf=?x$6wjVurhu(237k<]iu4Mтָ'" ^&?S^PZo#fn=q-ޞ'IS 6Ɖg'v5+:+E-%F#/7삯O$1w_H\W8PAݓҨ@BT9>2hZJ?U7[qf*L&\꺪#oXl-Aih\Fѹw)}ʭDءx5{b 2+: M%w:~uxe[ؤ=j*/ާ z:V]q[e"Y)sa@&YDtd[~Lwp[:eMY1uX|ƹڪ~9qluL,a$+o[{$mr>[4|x~p7>Qi\XZT< 0\8e@<2}llDUޭ\Q=D-)p#1ve9k|U\3)J)}AؾގWuЉ<گ4kli3[}!FW7=81&A[%E R9etI犓%?Hd)g֍{}:drވ>~s@ҞhReQ? {#nq69WxKKԇn7r겜p=*VmI.xu$ #c|?M>ՙe:Y`{Yt2C eͺiۍ{6i8U捞5 K֭^]%+ ڍ#VE\~E"Pk~%lLs+ęyoj UVHF`iͶ8QO 6kKZ$M sSC] ąhv~B1Ja:`:>LcKRa-4&w([nR(UK}5*a㧬'R4>o R:`4V̷(2語rnxjo \s͓T҅ اPPhy`#qRãvEjA fR[SiNuC%eNy՝թsG9޷h{cdE>!Gm,)hi|-M7Q21dՈDZêhEm 쩒\h endstream endobj 2199 0 obj << /Length1 1626 /Length2 13208 /Length3 0 /Length 14049 /Filter /FlateDecode >> stream xڭtctݖmlyc۩8ضض* +vŶYu}Os{~3-?n@{[':QXf6@ZB^ :]m,M&@;g `֜?FggttvX:̝\>gb3q5oBNO0E{gg'KgUE1t0r`oijoWK>a>.Fv_SKg#ڟ`Npu3'z t'uo`wQhcY島_"egf`a?}n@D|02]>Kw*3D7Ho"_]mll?o 1|3Y_bdkiJh ?؊ۘOs$v柲032h,n4Ut1|o)#003O/8ڙ+O&Ϥ,&!M?<*~.'hE{X8 l,w'Po \,=:}3|< W;{ӿFsS/gy{@ ɗ.?tz{XCJT #x* _kB'yi7CX;zټ{׎MhɊ4㒀۪`+< 5x7frH(mSjZʠ0ݤ6dʸŝΝG#{ rBR_Q m Pk ӱsCɝ(= LlzVdyۛs=Bn/N>fo$z3Gdɾ=|@RdW1]x2^]S{$H[/y3&/xCHu>9s1F˨TkgG=TENҨW?Ĭ2ӟu1r00D:y%+Xac;:Vy(si1f5-z5-&\(2*)<.v @ߤE\ RB˔F;QF|\28tΕeIُ ~j op_k‘Ss[BqUn_% Kܚf#Vlp)yj#s'0s UuZPg]n*''eKg ̀S#s5}?tahWwyN 2yaw83;Ч$aXߥyRA8&m}dqW5ܰOA5i6unޥ?*3W;YarwO2MkwĆ8^~e(I]O17XTE +Nݘ7k_#EYq @](1T܋'N%nդv-aeʰ\u+vc+;~]`XjM3?bf<̶ԒcmUqU jlӠ ڷ?zKI54mEwfEmŠ8*xK}d6U&CzXtW)iM6ƹ=`qO (8*"ګND{4KAwPLX5OT[P.H1МbV+ʈe^Jwϻ"_d4 s&9{a=үrlz*eϴ7k@njXJ8sC L-/[;oRE &M۽ۓ|mPE IHBl;ZN k!p|_F#  F:KR]Lz&,5^" g,>woL * JSyChqg$xVϴȴGs r7Ov8efH8D@T6$0y9mnQٲhڜօMtX#-\Xܼ*!hg&Z5R{i`L/\Ԃߖ7'qg&ͪ-sģw_}8.ظ:Tf\8 as/5=apװToj/z |+.EE7^L#.l]cx kM05DSr1 oc_Yv3PcMZOaP/~;M%12_7xKt \A7~z`j6Vr/dbK;LUW#[]އ_ xyiw2ԋo~1kt$CG6-% jkH0 :N4߯mK5OyY9;_c1K!w:s4HD!8](P(u 2Tf&-2O>tծ0-{#1 :Tlѡ]L'Ͽ2&'1 *;peKajz|0'6,M.@˱6VrIY ؏I"Lzdu,n#ps> }9_Ԭ`!h~椮;)Wj53")P|J\ʗ}͉A(Z_k^ M@*/:)lRܥA칐C60YXu3BR^L#jCQ}67[d M.2,sVU b844cħgimFZNhmJ\!KGφkѶmZYV0r՚X]do u9!/Ko=т Ž38AWÏt}LefЧxQLTϒcpϲ H!i$>FйfsAsޚCybgoz 2 Ji49$ uՑQTqˠfTEll%G";AQ$qR%~痽h< dW8I_3 Gk]8":2c9ҝu11X7A:U3zr/ DFoW9`! H;!Ę|^9 pcN(cf5]C !19I`;)ˎrrl`< { K6A#sUTV5 \<0OӮ5˭T120TYZh!b8.ûnz\eV,lFKHܓJif电 , [iE"ۭ#)bB;Pą'룚Or#8A_76|%xt;ӔEIO;=^q6wmBq/cKק4<0[%%0 bd H=߻5 [Yv 0K 6Ȣ9l2J,w_z ܘ}6G rYq;Hik6a[oS  ,6sOFVW78ؔ(EB1}`F&ًԜ.6_~{ E~Mq&4iKTE!b 5+ri`Mv0y_Ɲ50Ma wFOc[ȌC>.t4[_He 8aN$DWQUC㴯Y@EHyTaEA[5L[Ux53~C~YZLf܂XI뮷-tߖx.mz{\@35gGN;a`gb8D-[10ZK EMgaid >)y}Nm.L`ډ [|Mܼ7)[C͈5z-co{dQj}{ltX Y^:Rի3 (Jtčkg8w =Q輪PlG57B[aR |k<<>43ds_|i+ #'BEY(e;l ;יxi.Po{EEMrŬ@-_n0ZPԯL{GklRpC[$5g%݃z|S̦4+D^Mq=68!p'U4E'>*d{1pCcJ cTg$5dSaRJ:%:t4 ͕@b'olmMBg )y]׍g3[i6 щF;j1,ὖp!&aHY! 3: 0 b3zLA,hY& 0Wj磻P E_GI)7~Jyz\Щt^Hktx;C|!E_b/$G!9dM)Aǎh#P8.*{aBmd?99-=3;]4 `"Ep.&r!K}9R,|j$GTqGݣ"K#983Խ[I12٥v[&w kڢQMGQlxxϳ}o]U%%&{uTtҗQrH-oůdc+f*3D./ (qBI;Wc|,Ncto`iO]t#YOEC>p~qTr]; M4dnJʂ. 4}a {~jj$ 9s5ĥUgBn7DXg=J U2 e)zW ؖCTSxM &4&~{&.,!TӐs /I@ǩ%<#P҅F>n=\ P4L;4ES A)Xp5_ˉ`*) #Gik|P𢨌䲺GD7 eBz$u76VZ"),ѯ+ML(N$m>{א wXz!l0!fr5HfkYY$Vb>W8F%DԫjEsDhTm#SװuW%Ųi!0Gekg/D_dWʇ-$3޷⏶.ѨZ^17veOF֍@c&hݮ`sK枯I)bdx[y30Qծu[a]Akqda]v+[ϴkb?,Bߺ6'*n뀲BOh"ܷ+CSG,rIxCk+$N[1}(pnAa  ?ꤪ<X L߄>R !?CDR1D.=9lBNzãn6P3cBW>JY ҆kkCO:n9t?JGe03íݵ(_Kηzވ'd\Ex1u!0ӽ/yfuHpqV~R*!m_}58tP|jZd꿟X{&݋EvFIU7m#o!=O風1x|(!tc-}Mn{Q(c& ;LIf& 97'^n,BW};w?i C5SFy@ìW#[L9Ѯ[ԠLq9^>K_y~0+d$Ywi .=b qH>i P?^NgZ T)ܫ*$VS<{"|^x(egN~v)r u&23Y7 Ԝ-sǭ$ˣ϶V)NJ93qKSxJC9h4"dOeb=l59fg) H&.&ظ?WϹLаOP6;idؕn@AUo s2qh^~]rUw|Q ODlh?ˀA[Scf ,{9,=|9rG@Qsrdk)F.ph@# ;>>BZRHɳV%ta24+7)[E*s`2]f %BQ{R?90k}͵7O"&ɗɕA L곰0Kb9@]3$;˞6*#N&H_"2Kt5QlEӲ ߯,ﱳPI['T~Hl,t2oGƊ ϔlDƄ!4,\ Z5e ɺMc#sjs;TRp vAJ\`PɾC#CATVݔqo)Áڬk]"=^V" j;{:.,?%#Ċ ɥEJy>i5I'p^ 72wPHp{CMw|F%'. wQ'U`Do/TԊ!=<#LvrDi!zSrK3EeqVQx HmP9^X,a ɵAAIKZj=ο'h{f%KFHպDz,̔D߁0pZ|O9d G ۾-M)lQGN40ӡ Bʿj`ڰzV+-5mNgo(sg~L(z壖s(/-꘮&4~ԛ#h]}Iڒf KehEW{V$+y{EԅnFD mZhw/%VBN\==>?t^jU ~V@lcrdw~f\ﮯf* d2fXEMWz%pL_Hn'08$& m,Y6Nrb'?^h.QuknI *xNi"uCW=|rHLp_$u#7Eu E сD6b JɬAz*BV{(7'Jo**QM%ݔo [Ңz@ h-Ƚk!Fspȫ3n F^t-x9_ -BEՔ0z`m 1M-N%[ȟlklvd<_m&0vƳ.FYhvzF~#˓w rlk~sSoYs۾z{^W)@3g&h;/qヹ Wx55qsCs5\ZT4_]ĵU K@˚l*E֎ \v+Ayr C#i=2i㹀dVja96Su Unk_PWGRS ?ɚ5dxC`^rnwgԼY0`Ij[R!TT߷ҖLgհ7 WLMʥ ;~ǨM:g~ag:6^9B G.9-iS #މf13>/z>䯀t8XɃ>!=>m 狑ml/ _;h,<:m!R;fkPNFC;)FDȮng'Z0'">J+Hfi320Z$t*;̝^lT\&*1ICM։!vY@c#t#Iz>;R(8A spco" ;ODzd~[C"4}e^S&kXC;[z7;AU HZ  jbcF$F񹂔9G>*EEDw[Gp{BXwm6q뙓챤ZGӀl-dDSv4,MF~V:ö6kBqli(&oD,A)c'[RJƫnZc>5U?v]I25N7!Rg.]~&(6"YηipM̧@շ٪}@ms B  }E;<o_rߞs?ݗM:(B9qbWUڇT `YcoVžWXX2WАkatWCv9ʪ]C$>sX;4]3Ц٠f+ՉǨBV5iւ߃(qъ 7g{CP,ϗ l%#sQX>cho?O|RazJ ۱S;S;hva la"oA:^^ӝp=-l4M1cu9x+Xcg rT<@-{/NnsI­n7Nc'(܆:w?WBnR 3=Є(9\4b է u~I'~ij|)ƢT`dYkޟ#}Ty]iPljnbÃxTx!\Qn:0mDZf, +˙m`j9_No6rDtZQ$^gTm (3ƂU?7xIVsi{mt}Xpː#EU_n)pn5f fHxnjP2]ef[fclX9:R /Kt]@F/=ΐiĹy!LvqY?*Bc_X{+޺ ,]m| v$ٓr*g`LOCX0-/H68&4_]CZjurs- A1_vXRZ{ɗcU0$.Cտ\=-Du\Gu[ YL@csOǟNRyANv\yTFw½0{sl6k%<F6𷃤R)r" !^D#ӝvocBoIԺ3XFO endstream endobj 2201 0 obj << /Length1 1630 /Length2 19105 /Length3 0 /Length 19955 /Filter /FlateDecode >> stream xڬct}&v*v:mbVձm۶;:# Wω@E%Z;:H@s `E;:y-\jt `.֖@;G'{_@u jXX*JZi%M42Ỳ.@:#`o``nOk.D]&'0# vq vXL\``ffO* /7Կt2q'_3⯧?- t')`ndg7_0'psv  /?>K&NNv^vhg7ܖ_Y G+˿nNas5 vo&v^s%G׿)w,3@ -_9_{RnvvJ&7Ș8CcgŘ[y6d]ME/5,,VZHY{U]ͬ&vg/9dg `bea/6 +k3[H `_;K׿"*!9rT^Nk(:O11GO+[/ǷMh |7 뿺 ?j`w]=fkˎf!6YyS_Y!GCʚ4 j#~VՅ27Z:qzߗ?DZK^}(Dߢf8bXqs JE`gJUͰ g;.½0 ,1 :fxH5>!Cn< _ Y1ŝۥz)M=IÛuٍ>7&k9;(ȲiExb,[q#aC*Y_m*o5etbt-Z,s- U](na*I!(.o$p`5C 9*L֐L1<"XDDtmO`_*8bw Rq*mGנa[b{>l:\x3Ǩfy S΂aKnRrìS&^V&RQ@Wq7G骤6MVn.«wӬip:~vl֍͓o mg Vg98L3 { E\wDy.ږgv׹zu{CNj%tyDTl{KqRD%JS^__"C1t{$I"m>/ԧ=ģۣs1ӌőR%`Tŭa!O$~*BY(RS]Tz~ZED ؋-{?:պ`:*L9"Ƃ7ud} q%'8V(uK=o-vHV75^;n}?tw6gye4p_K3e%@}sm4>mK&- hE[kf"ܝ7!z6Wo31#c&[7/M 'X@i}W0^% dV6>2͍$0iפ5E2I&RrYKX4z#$ ^MB9Oգh,'#ك.캐TRoaID\mK7)fϖ5W j-s{i,sde-aQ46M&bA- Ii;bo4Oy.Чm`V>BR"ɲ ZT—:|!{L%L)lA:o^ 7 {Gd5AA~qaHΌIя&@>^ށ&r<"yDBe7W_Ւ"Ts4VÅQV*Bz'V^ bJlR>ށ*I]1P:KtCr+#uq+rʏ{~[f^5j".G ߁wR͘g_T;,f_MbY9;]!4=0dS`\/~Ȗ<&b|[}np; ^= f!ssLVz1y]Hoi^ePة`oKM^Ʈd<4/cW%[i^ޤs+Y=И`&:,xBKNbp<{gfj=|YUe5IBBMv3V3 .^Syv& ;7S@/_% , e9P=udΝm)dž-\oƚNG%pTʉd%Hxe2!ƽ#, qh#tqco,Wވc;4(KV&?ahzFrE&~oXpKуeyhe6kVl>RtuIom3 5λv\?)-YhgEѕ '}}ブ9[{RX wA]v-GjW6J/!v $>igCjRHK! $Z/oeL qI=S"zžAZC8X{[+gڕi-#^c>{3){ŏ7OZ.k$u'dVe+=TA[0Kм1A5 R'U;BJBOO{P"nFxm q4C}/6{0&ssB8hg1/v Tc , S@fv3W>4,2^a>03yG/Sn$IjJx FUJQW 5Gw2öKp;lBVYFT{x*g]a9ٌrxLRt Wp"tj'~;O; ˕-(VgLI:ݞlf3o5™ }[i~-e)J7\I[&0R 3aȰ+pv 4rz@2ˈ~!Er̷?-*@߄>V _]!j6 9taow P8nAQLxn.yl*!&$ ɼ< lO*BJQB:3yER)(2#htk[.GWW:9_!Jud*ϺȇWm'`=yso t1E\сwG cdڕr_V|xk{2)%ܛR/:2S( oCBRV1a<~d{F mB,54%֭"Fy1ەUxVo]+y#;znYU%~A]zRI "ڜ`Bw57NNJ ii=AؤXD22B "jqI\kezoF#Pl)V`JOkQ3.Byh ~W/dQmetȫ3eYss%(痃9/1@uykEh*MP0tN'C0(q,aV0|g'f,4Qu.uTuvͳЊ)gaH_ΉbA$]'͘a)| _ӾX+*R/aF^VWj_̚һ*qkMžq|:YM$;0 3߾2~϶2lgE ݭ y(QUĐ *Xc/@{;qn\;.fzi =x7ſL|`^ h1$)^'eo/CM+ZHe@%3^="<ǯܟL}x 1TmfYm;Z,G7M||O6B;:Cq;^giDHȠ8ꗎڐt[ePk#JSlyTzcA]~;]LQw:sv[47}Z^Ȋ08[W%?@ӜT!Ns5LjŠy __9Yūg)8;IM} DmنQJF39}_ٮ2́Q>1cйֲ/L.vroKkz n1R#0mq#Puw"sAF;'Bzr뫲+&w3p_~Y' ~:|} jAΦ5A(_Bِ_3_*7L}LF#RḖ瀷Ȓ2ҁ 6,O3(tqMUqSPMlYxq'ۡƲ2hyϹUN洫\foQzpJ_[|B0'V')0a /{%* m!Fm#꫒ _#)oƕ~[".yy6*er/]-2io&ʍ2ҷ~4] ~AVP/[L%5; }x7k+gGFDLȀZS-*ЏxSx  ֦YX~dŠJ>ylX޺gq!!e?'GhԱɪ/*žеz^9 `a0ul c)ҭP>l|:mqIQM͗~tFF|VC1ᶞMWR3ӭ~į L2=7yM E }?> dNuh&ņt؛ԃE .ΝE-qB@-sGd=BtY*w ulxiq̱3{vY<'f˜im)EHXޝBcWnS7UBnG=ln#*+ ߠ[&˙?-*i$ X怇Л*k5nM# 8g˓.(Z ~,=I4Ƿpkr6N4S {R⛤nL Ln]pX 2͋u$iۦܸ(niv6>h6_u4IҪλ[b{R O("%&mKQ[ƅD@u;˒zG!T_|8q$u{qQ&Eʣ8 8+dx!K#HNjkE,bӘu Z4bBk<AߺdBKvE,u)@S6l鑰 x~2YTTsSir*\QVi.?OT~LS= 㨘Cp^[E4v*Sʱ_/I o 'W4zeCbyzJ,;ł="[MtȲ5ϔ({V|Q SY4B+fu0EfATT]ew(:QO!7 ~60ίJ?ؖC(sU+bI@84!?`nTרdwG槵³7h/&[j(~!Mɐp(d. j,IZP* ڔyLӞ[Lr yzC$+vyI"p dW= b^i48ow ̵Xs‰ y brF2sLD(AY]CdGA pxwaf%J"?XĭմUvA?5Y?-% _aw9 D~*'w| x HAi#4AxSn׉eg=YO}$AJ4`6=|Y6vvM)u787&X,;ԶxS'nHtGu$#m_2~.Tt9W7DM<36Yz_n @f\|Lw38ɺO`e$wӰV9=LRPgԨ؄e4NGM)C 0Y #4h a2!JDAIb3N,+gYWмZ3|MTZ|}[ʅNLd' nMhQي6KbRBI.ZR.FWCrXD™q)a{Ubg3m.aZu%2*CW0_a>epNEݗ_c"e`ŵW>=v)~'%i:cZTMgإ%M[؜s:L$@_egF26^xZq9=8BjEۋU͎f>/#[WݼΞcJ+IPF!h #L\= ~F#b'}axnE/Dcy ߭'0qC?In81<8#HE(1=c|$,y%uvwQ/?d6|S]0N 8FZ7D_T.)6uդ6XnjKPc%fWn4^YVoY>|"Gwd6_$.ݢϦ?L&O!0A>)uߑ,TPۮ)0_覥t3_VHms/;+YV:!ה$!ʱKjڢRň{n揼I.YwL?%Yi%<BWB>r3,rAŎR{nGIF 8\+>O>RlCʺ{XYA2`U)E吮0 d\LoX﫛M&3Ͳe"Ua+6q |$2/G>PǠZ'SLݫ/_Rpr9k.Wa꽛&SzemQo~{jgSNӇ^(7*sH^yQ7:p>Ov0oE_}Q$NR5J!>z*HڙF&LR.VW X oaa0/dPH)䔁?0Y eKKn, 3|M\IlM|t!E"V5(c'ލcOu_|VŨӈXlo+-VF`w uu8Lj@"/0*BzE. x^J4M#& ny~tw-qe. 0 1ޯ6Dyk2jr$nΏw/A6wCΧ/8h_DAyFхa}nfU9pߣ!SǜҼ**ҥȯxrq <`6ommB42e|Y,1dΊu/M= 31#a ov|f%"(fhT Rx/}cxrhU򻄆XԐJ5ʂLY씑K"=GuO:`[(&d k5݌Ray} N [k'޺~jl4<ß8]:m'=.$G^X?~kR1zTxfv!X-@r"sU ۈQ_aW%Ëd^>xaZ!sUAmΟEg߈]\zoģ &>/j+;GqⷞX`>_=tQ2`*5<8btWp\b#(V6 iKXlBښk~P~*Џ433o3XVpb[v=ҵmh IV-^ܦyk\IO%L'X]@0 ݛFs%͚I1qP;0g1,śZLji{U.%hDpNO bo z9~ ~2!iQɫ߫{-u?kG)ɿ0p!^=+,z9:/N]OZvʟ?2>SxoYuU^P{>) ;S5k=&M~ԯ YbO\W~ׯCŚͳH&ΐqN4a_$SңЅ}5x9 .J? Je7Vsv]MU_;+ť.25gK^lj𧞇]G˷mHyݖq%,jƁ`LrĔnd^Q\}?o|{#G1~TAxB&a 1$b&^(:=<f;InXt¶^|O"rzxJq?=v &ϚYߣW\ V5K\Āo= az)v}Wr\[Lb?uuHOS=uQڡEm0>,\HAZΥT1$|yYZ>3 i6)'`Pt@8\ ڔt(6i\@ke]&򜆹uzK1QmK}LM&t;s{1cT쎘F *%MagS(G{8)E\=RU#W7kf5)_RIYQA-6*"ۉ7Wp =?5\Զ{-ܡ][3*`mJ-_uѪFT>~a| g df1u&n BӰlmOoђ^Xx/dީB 59"Uc0L+Bc`[tBڗ $K*vfµ;s3e .eVۋЮ Ǜқ˚4,$ a\* [jރ~6-yy+yB|zfZ܃FKˤfvm7p{#4P kظyOB ܻۖupmJJAV,~:P790( W3ĩ9Z^7c+ HZsaYNڒ LLOϊ {k(,'FSul`Ny [%I͓2mj+*wζtkbSjl| D`»ޘǙ[so%WDvя|$ qTѺ*j~ KWȢ❨Ө& #Ž(O̍#@-9 pV?0=7%Y9JaU'u+,@mr_y"<|J?B8) 7г$)h闲TKPj4u`̝xT͋#-{OkDvtH~㋺݅WCsuRO~'?jSLH*f snؾ8TVz}ٱdE|Ai0"-Lѭ"f%PUŚldˡ`,,3AsE<~fӭԎDπ>3 e ~·n}nd,Hҍqq6SIkD\"'g|uqIvH:;J`}oB!#`Kt >O#%l`3jKpDYPv: =.U>J%,t_+}/4u3)fkZwjL@)ғ ݄.&~osƘr*z$OLkP/ŏNa\tH$oYMՙTz:uqGQ*V>͈eA>|_Jګp<>MӼIJ\T)7|ԲP31R3ggbt5pmZZ5 ílN-T"'2Ỷ4ee)oљ}X*Dp5ʬ}ۄ$g[Y+Z "zݸd ѡi m:Q IԊq5A(JΧ?].R|/cT}! O)^8»CŸ>3_z#Z!!U65>@Lx/lUvQn>< [MvlL~ܤ63p] f{HPW6'&X[T[5nҨsWxYmtKxB;IOI?aN y"%YiQ۶lLZ L} {>OcYgt@iv5Uc1< c^Ŕ`٫ECDc`Wxyg=:my,VϧWKZdKa4mQZ3+xM} M'.0j銺Y03Q׫Z֐p'bh`7LRB1h4,QNy2.W]٭VTLYxa<@sZHP>Qp m`.Q(DWuC. "nP@k[_ϜKu|ymTq5nDr0)oq(9}1 3/ܢ/連C+(8}8?9oBQ\Ć+fFL]Nxe,?.t(b&f9BR[3U=;n}^P?$%e7mbn4:TYVTK_ztn>w0qφ)cy/_! GW9GS?쥩%Q'NǩVe+rS̝N1,H~ @fu`F屺ݣPG.+sw^6%ߏHţQf"B(Mc,p>,sPIA4cr:Z!};^nsbw93^J1Ii72 H0zO3&NsPl 2'҉-<=i(3z7ۨ-Ŋvt1Ydor/%L:`Po_>yW,Vvk bb0VnU[BE $ jnIL&N}y_䎮xwS,k y9{A? PศI\щD*> g#$9ZdQ<YT  vvN|)?4ڴ(pjP%^?)MyɌG jF_=9ZG[!) t9n5^5vdsO 5WP ԓϾMS24I D`씔.m($ޜX.'sN7~9ϩPs>f|)pZJqҶc2 DY is8 $!߅ާCkS향ƘxxJЃ: vʇEЋA!?b67ԁMrU,8IMFRf--6_JpfsXvi|l^-6t#4?Bft*W2y"c槝IT겫`q%fjWan\@;D+iTfxbrCL ~~ʢ.Ϛ-8:02 5@ x8^ѥ=XSSܶuIoPTْJMݡv.7OЭ#B?j #`)vP҇#WaKCBn.J"" ޟ37=eO=>W߉;L\=C.D,6eQO(Wm`Y?t-g} VG#' 81rn)N3W T9)0 *lLl)U%h{ C̛HBSynKrymS`=I*a_ HVr"$H0T|r=F$.1)㻫92f~Ceˋf(?>нgf˪"|ms 5C 'z~5ʽˊ H]?![_,$'<^s+f\[~8y6g+R ޽_/\9 pߌ$yvG~Q[U{$ZbA2?&S{91HW9Le8QJ4$`'1\VcH\Yy{1rPih)^A|E3ճ უM1:4wW$(c :fpwαԍYi;|;' ꒇw]\dKi@JJNrqUh}}-T^59ڻtuQeX|)5\[ת`繤7S d Nvzf Jp7@ɨfeH#wP#JkK'NJ9 G<*YsȐ@LU+R‘kG8+$daM4ìKw!! J$ -^?#ܗw@߻o%vNEM|0={{Mz 8,dJ  ImeDA!i.w rAW4TB-k^h:⯙0WY2O[rYذ1aFx~B>BҶ[mamU]7R"*ߝġL[R:KJt?S9岚a0.y"QQ,܎bVSn0J~ l[QgЛ(DYJ"QkDus23յa7O焩JuRڼU"K^"va@៾Q {cye[4H3@2/3̗iԝ+?s ߘ~? D83X&^V8SjWxg6w)脻t,%Bimf5x5g>gICg?O 6 qF_ɖF?==.N+aA>/KKaw|vC(a6P+(|JYcƪq&Cn@?7L#JlJtV+盋u)|O#Kf炆Rd^$KX U((~!?YH5b,,Θ,掕 ¿i>QA۴8yơHB7kr u."QkB[Z`ڕ9ikmfnݍQan7#܍A1bPCS)ήuZ i};;2=ncq<*&gSc[]D׷F 8ϖ}+@z5:N+׮mDcgMע)6C9z8 $CFT0X!p)XDulGW'Bxp?*1`,M+7AnK4't:8N-s6WskZ[Q!4w.xpN Aw\.\nwᶇ5hs6Y ]5r@8 ypJv` YP~*F(cC9^H %9t9aiGG|"4YViOAUY g¡ﭞLeom܈ OH+b{20)fZȧ1@ЕNaDɘJOoCetTnd]+~ŔQq乧 'PD\,H&p͒zi19CQאԋq7P;>=ǂ%ip.6aB9 dfP+j).>c߄$.1M׋ Hk0)J9q:İD={kS)jʴo`ғ!Hw֟]| yȿ(G2}ӸeKpD0W%runߐL.oT[,6 #57u,' [̚@gRnY+ DgRŬlUǃ[C8LMucuép陧YӐί v5Ri ӭ5-(6@"3faLZ09 &=شR߯(-s(Z዆*H endstream endobj 2203 0 obj << /Length1 1644 /Length2 11120 /Length3 0 /Length 11968 /Filter /FlateDecode >> stream xڭwc|ofXƶmNc4m4ml&sΙ;3_fΧ µ܀@*: 9,\>zbٙڸMCnnOBN0%{ggS' #Ŀt4v؛Xٛ-̇d pzel=?b98Idg_Nf6@g:K6xc9\6 ,1M]>b[Ί=_r3WйiߙH`4gTw c῏[oߡ%\mlm?_;d{ hl7c[߭5J&ba;jظ9K(F%e)9U}ҫ| !3\>E4PDMgbq_gyc'@/)ARu13U:9}P:? h dolR;<) 9PڨVTPc6isuOfˆ'xOKFWv+A)RfP:Lۓ*%/;X`/ 0L5av6}+<9ttG9862=#U(i̓J9[DfHŔU*4`ZslZ.nԦm1Ot.o)=]i_fdKa=dbRtN_55F.ɱK d&:i;TYf ֐тXF ۡk)n g/2# \龑a-s1>/lh5ص;[{Xϡ1acSzjei f*8ڔ@r ~G֝\=PB3WևZҌRk_X.[600ģY#@UL G U yC5):t$+L08gGYYšT[]"}^m;Z&nBϊNL}G_@54>~α\o}ܕP Ԣ i2z\ XvfZ[p +Ǘ[AbuE'S灍 :f^bI!q43!ߌb}HKojD^J%Kh}A-rRK񚦮Yk>UT͢[pU)]4p יy}ķA.b,Šno%u&)o՘0C[o6\Tȁ ]1,@v<"1} %0nς::3 ՂO8rF3$;5[ߪ EcmA+5 Gx$& c|gNԩpLA 쾭eب. 3?~-zm/ev2"JB*hϐ"%FĆkq+y61SVHy5k$7\wب$m&#NojـB3PfL"4r b9oc`S/6^߱^ \9` IL}[wQ`@ROʃ7s7@,/8iH_uv3͋j/KdS5+*MM_]+3Uai;&70Jt*ɔ؈3*_68_LpofOu#YoPfZ)`rjf6\+5?eT$g(qb ݘluG&H')QE d2AtW[й)'33-\jSvUukN Q,Fs6#_ٹտrؗ>KefF-Bu&~ԡeܔ"{q:UkɆYű_6iE+zk bH?0QᓭNq5y!9Q_yL W/EI/YX{xXJ/crX46vvHmA&,+ZЮx( "rv?rUŖ*;!ZH "ӓ? 1PYD.^ߣ:KJ+EݮސW[sQFO _-UoG?{Îd˿ZH{;ᘊ ԱİPP*a9F>?*:Df0@ֶ3t >[Fne6 [ "5?>@2+1v(׻ȹ7WyvG!Fdq[V/GXiu9pGR6O>AX8(<>ņ΃%OǶ) J-;[o׀D~ajAX!tH緰v]O9Q"2W %77)ÆDrGK^+ Ǖ諭e(JS B_$| ݼRM;Wl:7t,[KCٚ ܨAA|%gYXf`oڭtx|dq0~K |"! (CJ%.A qf wV vk.?؞ \)g-ت¼GBhK=g-n9]dk +p 1%*Ca,&췑bg m\!DiI>~nql:ٵ=֘) q ǽA9d$kzI2s= f=f޷`V#ʳ⑻NϛW9)( 4_^Gix46ȋcnne掿!z CS0E[?8z@1<_,Q!RaEӏWx$5/+ zEC@(X0if`>|J嫚mmXT#4 [Op Kgvh9#%a"1wd51~;9XEqT M*|BJzEˍ^KUn~CQ7ʞZ_!Z*? ,f .8:u0ǔס"ӥoؓ:ҋj>YԨ?{ & iAMf<\V̳_bA>R/q!ԢnG O%+>Gېf1ߚ05rJ)%lHsZWqv)-[?Yj yՆP ZJ lx(()6m"{?FxX7T{W \HGݬyU琢Pz+EOH;6VHgz&Kψ}݊|-pR3eg;R5XlO`yb淵ӐGqH&< fŌN6 huIdFe5bbY^>KKJ7xlnFqP*IN? لEQ?u^1 []yߟJ(0 OȹmVS@[XݨN2l$ӫVhJK8{(-/1O Jlkk9W! ǭmIscƂ{XE%bQ0@ɀQWx(ݲȦd%^|wX1|RV*E`_1R}mUѽQT7.`gЌ<ןixIR[_%z9H ܯ(%Ӗ3)+c՜5c7z7!z|FOIRH݊ j>EB5ٙ |׳טZJt'/PK-m9 47XI^yB?ݟ59]P0n=F[!d)UzixeMk"w0{KvKP9]fx|eq?;@ԹRğEqVY u_:YaOb ̓7xilzy$:uW?<#qI͉/pB6(lMKGW#L;h_B^Nu~l_Ρ* oL_:|Bq2m>rEΔ́ΚӁwT\cZ_azs5Dx7,ͻF}&L}GOELC6Y?\ϟ Ocd8ɯ'xxHK.QOjaW$g~U>o/Q`˅X5A@o~2x^#j"~&=̣˷5.4rP4qBYg.ωD-ap6fjz.{9G_~ 3&g%41 ت®43- sdN"YR:95Rȼ+[$>Q5D.PO/j? SNڋgjZIypJfXC A`Zٛ}?oQxDkI-.!YFQДkW-^U>U r^[p*>qVYFhGr="iU쑢W_t/uC ;l-?u~5𔍾V/qo]a~.Jshԙ 8js?)E(W'~ۈS: #!#7nt!?Hϼ0b2F^;lA 7ozHٍbKƘsե#+ v z~$U%kNvX_ۤA#;,TVhߗ?䇙&sJ"ܸ_1lMpiɡ eX"HcqSF-Ds!z܄H;\Kˆ,KX7oq7uS^N|GH`EF|#Zu6pr!7EDى Y*@io3cʔc Y\ #yB 56ed|. 29[mJSHKVqKܾ;-LJkb g.=^*ǂ`ڻ ڡJXl̟9ج.kIlgH_Yz _+AIRs_7ifW=Ge^iKT Ωㅵ7Hws뜌5YN)G>;]WLH]XA9#'6lѳJJ`*Ɵ*$"3;lI@• y[o%M#$;jpjʲQě\u\pc!ىʼnd᪍ P\}߫u+!5ߞ=+r\M=ihq)BGwZWs^w/*/An;Td1WJh K+3h`Znc??ngpW{]gk%CFV$SROyфQmUX@Z,f\DؼSY>ǐM8U"(f7 &l\A|jeOfʑgFx4K m9_37*άSgorhjB=ycƉ `𣷤 `oڮIPhEb2 )tDf4m{o)cN6z_RUT+ݮBGk*eŮϟ n5~.=͝&{=[˽ }Y>q̹&@YxU΅]tqwTr t>NJgSe1 /~&CZ#:/4T$3dvgf]3}໐AnT)@?eJ#UPJ v)?BQS꥔^Ifb /|k~:)=yc,>Z'nTg:B}UU1VKmp|7}o;W5>>Z 0wE;wtpg]4f5-Pq9“ߠۚLW՗J|I9i>6'_}sVe[x,h07q<89lYxHBD+_o+kTg_5J5, ivTɓl#&Sl1d\UFu}ymhkj<5[Q ?uh|KU2ӱi[~TOr<u2fG{ Ȉٱ^Y%f>TR8PC6Et˫)v3Ȧb/sL=vcOhދ[A\}0N,?"k$ \O@ՐgAx\q46W4:&LkLߩ(%/wK 4'gcvcXF %Gzx1UR_ԺdN䘻'ɼ8k0=PA8żiԣ*u'Z܁_Ɔ%B*aQ#FƘU0 lIkbPl(* ;tlwZ>V<_ef N46$bKN|׳pΗeKf?ŦO PMБŕMđv0ݐe͐1@`#3 3ԣ뒱`?ItwT K6'{nݩ2d.cM905P"*i9)䦜C$~*^GoQIl IԜ6_ghTuugߥD2vuA 'W0jk 7iɊnNڻaxf'4`?{8-&ϥ^H 䩏د]kɒC@[ |໳u?߸ vqxD=Njes\{7ݖWVi7wN+8W &\C e1R+ɶ&HX_?X:J>SMG% N6O&?0ppX0Úw#OP"}[ }a[-TLI*汽i+Rƴ"Jقk-mi_OMLͳLT#"LCn`SA!di0-mpi1*&ī-G UT1KpЫ4gb:럢?y'ʵXd{7ym\ ) )0yݪXh9;"QĮ!Jd?l1 endstream endobj 2205 0 obj << /Length1 1647 /Length2 15742 /Length3 0 /Length 16589 /Filter /FlateDecode >> stream xڭcx].F'tl۶bv:6;mfw־9>Gq{QP*1%Xy.N< @sg#_Bhlio'n hM@++ fp4pPkj -,\6 [_׆j@ 0ĔeR)o.6&yK`f`bogjOiN}8N _3 Dm->,Fv`igbbOfJhW/י%7t0r'_`oW埒uu6s8ݝe Z:l< h4\,+z#_ ߪ7l_\\ݐ0]쾦ًy?SwMpjXhd } y%5 F;{@eM'a5[-\(OE :Q&ڣJo?ٞzb; ߯0c;8nKFԧm)0<r_N>;V1 m0TXEz[pINbuccT{0=4W+Y ℸL~MQ?:Ҋ.كG[&xIL,yc=k4hmY WŔV~E h;t"+pQb?{zBaE;Mַ%*4ȶVǝ @<`1)O3ܩOY 쮒"t9RaYO3'nh9O<·G2hV"ֳh's܆}GC?Slↅ?eYhzȕ[lm , ThLn>WJ@pNZVgө \+-ٚ)s X/^dGӶJC*FUl"6{B< B+g{O>D.]cG6h+~Z^MHr!<=8!mvhf +,Dx}裯Pˡ&h$UjOxR6#7{,=ėFQ*BlV * ;!q%l hƖ9sNOaK FW&դ)&؞%U>}0/MGgHkgg a{4sH#MQZd[O FrvH ʾ{H@= øjI(=(;"t9`e?w"c~C%L5?H)D(gg>1_~gsUh,n!13?L^%vL v \-#CLk#mIfIҨdlӇ2*"߭?C%iiHܢb? )gb؊+Ȗz R)}v 6J+i3nR*ED6v%-)m*=&KxYّ1hrVw&n7!]2yfᨸ32yM˥D {'҈!2tF@sМxM2+apfFM-GN0keƄqCQ."_,E@CKB X擮6w^T'~NWOi͢tDi$sS`:"L3*EQ&J18ť iߓgMƵ@(Z$e>^^a5M#7к(Qx3S`-z}+sfr0an֜TӔBLB~Mxzq}Oٵ] "J>XmmŲ }dY ȃg`)zF360'YI,NjMr".hawu{DwLL+JsCkc(/hlsRY0 xL'3VhL((ZP4T)>uq; #<1EMIa;L!sc}W4ʇfiڤHe/qk ̄XO^piwq!ϕY_Oq[[ 4|]2e.~= ~; ?V4-TDG@ Ø,w{.L0`mih %Zԫիg\S0^`swRR'r14 T p[ X^:Y.Em&'+M,+?PCգ0f=zK5C:Āmd5K"EXt[D%OTLn*n{^^"h0aXrK}ujޖ?S艃Od$s,L w=yk6 ,0aCh ?>}_Yvy Re*!d^gCo@{YT` =) WyY6,PMH瓚@Ȼ`Xb?lNſFX\(\H$ ]8\P^Q]xG}ڼ8i6f9gM-O)^H|_-dXO99Eel?z /kmeܬ[㳖&!([} Wb@\Z6y(CD>tՌ\Ku߄%u ۸Ls\sB+$&fq1|-X %cRCSAYZ0 I?Eїc~RGJ?_xhјm]bҁV7M!l:Qmi 0@, ms—\X,,bZ"/m6N4{zUxU3g(WWMV~2VȈA>M NQ&ug 2.<!#:kGaWDm=똵8E58 ʯ gw+ew~}pV֓p:tUw,:NG+1[Kt_dqn}fdH q"†6=)~n ~S0>{'RH/%hCm*\2J],RܓR7%7MenKzP@wEhdJyw2ڜgOSl3^(.QD5voMMD#1\n, @{C7%z$k`<1nzMҧB)#Gw{@X}x6nittRv\|a=MDW26}dk5yDb~[Qu@#yo"I MLnS?htҭ?"of++XL67 僈7%TfpoL|/҉؃w}ƐIFL Y J& dq$U}x勋n"K qN1;jAMc2w:'ɹG^-RKZF7ڛ* C?irG ~Forԅ)BS qEܠ*jpu AEd f93/5c⅊rΝg,?nQ;ՖSϚr%)8ST_Ѫ,^b~8(ӉeCbӌ/ 8-8?9,~J9+Ư?=?K:ηމIQ CԻQ3Nqp3[k0R p(4 ʣ~ђS 3soAC/A٤ F'zOʛ鐋PW%},E w.OxNVW$jht~x7*Zq;#X UIn>T>㽁tQ[p5(2Y}|n?yaP41OHlNJ(y=JuInȣرXD>9Xi=> _WC=O7r_fl;> Me>O;MJxIXd aY_!͎-hnF!>D ӛLt=l+aڶLʹ^ں0.l-k1vfϼu_AdM$´r%I %[n\-'>ٍXcnW{rZޝ>zr|@m߿e۟2>;L8.n$BԽOm\pjީeǁWs?*4l"^UC <:enH1|k*VN 6=9I#uV3Vˬ6~31b>l$3]P!Y]ݔpzvؼ9pM ֭4{#|r@V.dPDՠ>euNH4dڱmvkWwdHֲ䛳J .H6<^ɽqX:;cNIt{.T.W6BLDGEd?c#O0k):P+`F Z#[ {R Os}tTAW0 9x6(IWlC v!]V%HMDu 4fe~~~17&>/W!Mo?°jpfǿ'iv\R#eZHEYjօ[9ls5 2n;92E?bQs N~:DƃA=A>^?C1Frt}%Eai_PJNKğ nxZeJ3@SeG'a$XnyK2~L ͞mj+W,piqiD?[.nd7 fj-=ev&p}lXOv ؐu 6’v dWTtG-z6&ҝX׎FQ4!ڙU3Ώ&H4̄z\P|yr{vI(AO|}A8|+X>^8iwz)a\}e1lv< +rW3`-8FN U-klN U60"߄ﱃZs/L|P=}WM(kFM WLe2Il}`9s@?t5F毡&\溁3m\)XY Cc(ڸOUX)߷+ZK(jQ:֞4M9g|_E-{؝(jN+^uJHoAte县epPU*f_g9;G`zZ m[0Nǻ:^,*_0: 3HT<6⠇<#l^" >H/'t[4m~)]ׇ[}sl`/sC&;b]BD(5VG &܆Mot{9aof&y T}B(۝1lrV=Gq=1f ِJG4ݴC{[-YM XW'VS )26\/WRw]Mj],Y){hqm]}-#]iӾ>& ]?hHvKZWkjD6]Z ɩ^"\=JStc{Alhe7a7w7X1m ҫEMVդ@\T1pƑ9uzeήgśBv҅'p0_sH/eY!i$,\ r4hDȰ^̢ 7;s)??oDќHƯF7ҮSbw\dTN tUިJFb*Z(=9j=M1# Z"|%<52U(:bZb(7܁c1y9l ڎwN zρ$9ÁjSx;\M쒢}QIYpR,v9[Ri&4@E}~(T<`v{zh[@jϼ,arsEaud9=[4Y(^ctD?zީNm$ phR$bMq3 w`Xp #oGRR! xkzYUQ ml2g ϡ 0WX} ,Wa~ BWzTtdRƨRL*9ڛt!jȻ]Bu]Qg#z!QaiE>H8Zv/nluiB͂X7!^̰!8;~F+.i Ud̘^͹lLV<ģS_\ Ixloz.2fl7JN{ꄯ_g/KӋCdڻ@EBA|\s|մ FF(Rbh!u!['8mC8ϖ!eI1/ڪݵx*IS7BWݖk`gKvƬ`ex[yD#rVhWM%'Jaq cD*jIqtv,!"/< otq$ G1CZ>u`o݁nA'e]%Zg,1H>y,VxM\ p7&ROChU/I<5Z֞!g2a,V8,w;ݓ t}I' >SuTgmq׻-X#znagRCmBVɰxGx= +<orӖK;/ t]E2͑,T\Ӂ'8^V(ǝm1wJX lR=(\[HׯMhҕKhb6\00[߂Sҙ߹fdUy5@.`w68UJ$>w1?As䣞˧%GSbObeetEef; F0ϋJl 0+b02}_Q\ЋPӸf9C4'B*H aΌB h#=rn{ \/>=tyբ+plQn,бOg`ZÑg<(=}8lǙ y ' 'e"M9 :sǾr Cٽi+1|f|];KQ!\ !kn$5;nP.ض5g+|U2B"\f|ngeK~28o_w17Opa?B+][S01J9.E lV9ND\Yh~ǔA,y5<7Ȏƫ$Q/l}al)'>l5.(8@PbD#@4QA~ *{<_[ru啘DC )!yϬANwc nhŘx~-3ngXۆ1wű%? F$c6șF$*t33ojpF" z< S!균/ IVL^p\y|*J|z.E Wr@[@ )UpqM &s>=Pڌ vuLDw I0MdiOW.OG7H9 |ܬVo8l(9P+s:A%c^q;%͎ØM8xn>ME\% I\E׶bEΆ ?Z1lV@big%heso =fx (="zq` 3 3YU> 0Vsc_ $7? 3 Q lŸj[E5Dyq%y^sZ8Pax"&r$(DgX0gX@e16ᅤ[MQ` A9Lx?:2L{}W]β [GdNIr`Jb{n+'U߾JbjPѻ蒧cA. mUq?2RaHn@νl^n=* tE™ ybtUa՛0~_%8qa;NG Z)ը$`7aMs}~:]$l0h}9M<`!b߂3AHN}`h:ph0!oeUB#g"8g.+woWޘdůTLoO_Qt.Jec~jP1ÎOЫU$&Hf0@j]w Q-,EEILV}Iĸz8!'HbfO 1mZi zc߹]. ܛ +trן>M{gձ2.F!rdP`"jz\$V ^(3-+ wWφ3U+MW,pu_BgG|_D`v$>KCᾌ|x2i z~~#s$Xt%CaM`KU_|"/djAZdTN*kh*MКSwC8 ^zn]tO'sSLk 3]2]9@ns;C_B)ʂ~/έY m+T?Ƹ֧`r~)ӺdP" Y4Q>OD%4V:pHá!0Q~68A7;ߡs}pA]A+̴ &˽ zTt8%( , vdg˴0AI=HJ(q;. fa@/=sud\lB%i,~=kN^gb\O=<{뾶pzĊNdF ϧ]̛j\)KyVR|>O'qaXU^, qy 4Ҷ[& m13a[D+kA,=VE/1|\p^e(ji,u ~$Y*`4%qiiB pZLEI,"sHH?acW)7V.sdYT)0#Zv+mͳb@`$̷^F&Q:,}%6ʃ]2jN/5-DHd+$x֊^.u2'ܿ@p!pp5RaB FbgV4*F)W|v7c؞_9^fpE!,j7S5:تULj+Y ;ELl|=ߔꒆ~J\s\Mk# KVG/p69Isw-~M[VYĈ;Ax܄w.§LMMkB-$)pn2?zpIu #͓La"Z-}܋F_@/-$sbų bW)"D{Zis.?\KW:4ЀX`eACYTė\lzG͸87tO mQGb<2ʔ+FXWW^i bQee ?Ʀ0dŝZҊ2Fj){BBS6+m]7?l4![сu~D+S! =+Ck?ͺM/>jYyQ7P-M6Xv\b-,v?Xܐ¢-jn[ v=|>.###tGp߻B;QH_HNR3 Q aVWMLd ,ߥEd>T 駾~lc?+|1-&2?Vq{Uilvn?૬`fCENx$]VWHKN~R'&wafȠ|YC^H񎯣џ_ZuǍ.Z)FCWs>>|?mE>?}%C?8iĠ_7C+H Z;[E Mk٤~u=+9~ Wɞ-S͹mLn魟S(E~ƕxGD <h+dnC?;_gJ\9?oJs/%Qsi>Lz*?dfxfVq)~ޓq𲺂G'@ >#ey4)y`DdbD+Ѩ/Y3< 2@eQi}ofrs t۰<5Jr7cFz xD$z0ܙ44~7fXB1B<`=}5eXI,7֮ |יE #u'GaTgʾDYhr5ȓosl_y* {XTVFb`FPF&,XNRI\ZU{%7lgKoqJ8"Z6Hl1Б YxQF_,j؆}x*ޅ*# "|dP۫agU[퀮uþPXi3NVfvD{L92NYt3 <+J ֍+󩮌X)O(μd \Rݨ3k6ch7Q]Q"DGT_ޛKS w7TXe GNm5?B;C/[.xI~i>H9َ$u4'tQ)'w Anq)OXra9ڴ RC%9ӵ{Aj ΀'g5\0oa*VkjyQݖѫKϒ:U3,zLCR̙?8,Yoe.(%V }!V (Uv=feI^c>+#Xjn{sq4I_6T_sI}m5Z{q,~eixuk[qomh7{ +%bQ8{v zD>\-ɯoZԠɻ" w<U)bi-IJ~0d' 9",\A‘u/O8?Uy&2X3cHW,nZxźzl GX*{@QR5M;@ɄMu('1xZz+KNsneV\(d#Ї:(3IrrZ9x7; endstream endobj 2165 0 obj << /Type /ObjStm /N 100 /First 988 /Length 3940 /Filter /FlateDecode >> stream x[koF_1yIZ'umB[[Yr$9M^]`Q$$/ù>ΈVR{&:0)gAt DHf$B1 0,HeR8z8&e;< Fƥ!"6R?+Yd*&c~VdPYG:@* ZD@,DEB9 ,ZZt2GP+5(KmRraЦHNgY*O6~T񖞡R hmx2x@hj M%\i`g=` Ri'"1vK&9=tO)Kf!(*z xS*jc6+{f'Iyx͑cYi#(Er [(ǂ_`A(X|2F4,HN<) $VJ;B0J((?؇s'a`f#ґ m:(-(Td1jJOĘ*(h(aqRK)Я!<Eލ[Pu`|ov48"4<*&G)} 8Ex: jHCfCD$ٝǏw%{`Om? /G ?(?./죌 @q)lAZxtc3~}UYx~ J"B/ %p5kp[tf[ "lܹlf-$yI@ {ᷨ 02FQ@d.tB*Hen@F2F8pv0 qR4 "WیPd Dz Li &P4&/AkVD2z*&{ Ŀ@z!}a= "(0-f' Te g )G@D(b L8(4wqm*"">QRD‚c%)$PON+AmPnb ePݢG(DuD%'L+AlqU6W5/ /p˰ 9%RT:HY^)KXd c' Pf6Cq! e#u1m} 27ELBט~wh88)OocF}Nwłtp hs>Gsz^W6{mAiqko[uVbDI4Tj  ØHv7jp$CH&ZPYHm*Ԇ()4 zګ#yuy7f9S!YRϧS[utL"2of$s|-S r(XM5$E0qA%,`Mj)"H&~A$@=fciZMcS7<ъIeKK,4b =l!5SJBu <~hOO dӊ;yy> 5c.uN4ҤJhZX/=rBL5tw5~Iyۦ?]iuƨj=~$|@>h:>#|5>v$jЧUc$-tzwJ>y5~=a+g˦MQmy@ƚnS&lIJʽuK($}VzOQ/tZ4F}Ueh秌_vRt V;FDm#4:IX @ 1uv(I%RkNS[=(´*h/=]-ZNL-Tܐm6.vK77~/=hxш>w%ݜn|[~!Qd"ҵ;䷽¿ܕq y/.ix C>+]1_˒;~׿_,0xz o'<{WKsva*:!@ eU2AZ=km\/VfH|H2TŐ0YiKn%a[]iƴduF5ʦo"_ϒ~َA.`ʲPl/~8|uَ҈ڔ"~pTA"EHo_{"- vSII[ݭ f0 e!vGt3uߍf(</NNO铪%rJOۘ>nȇOMvJ>іjZ㑜grO/ޜߍN:4. 7OI3-]ɢ-I,6SR/.؉tVt3Rm:??PIuVveQO%XTؙX+LE C:ag[Ѳb{]l]hS}5y7`!ib!w,Bg,l9+21*!֜Ɇ˚֊{ps!jD{뜹-҃?GcʐJN]r|=p0_N`60Z,WYQWMl }^o~v;mo_2aU:hm <1aZ&Am}k9x^xSxr+VysݽmzP U?1e9Latm{yqs;Ls!KWtU>_'clF|5Xb/Uef{Jk 9ѷ= 4ەIY$$j+&&\BKZ8a+*9{XMO ֚ [*iȪ B3Jj&!UEdPWU?;΄(1 endstream endobj 2209 0 obj << /Type /ObjStm /N 100 /First 878 /Length 2167 /Filter /FlateDecode >> stream xڥAs7sk 40SJU*)aS-mnI4YHIy3Cbi6 9h# `~;X/:tMjPF|W-7ɑ u$3A9 99(ccj 13 P&$w,v>KPy` @(2*4njFkq-I;􎶰)%qiR!RyCG)`PewDž#5IPB^(zI#ZIC}p8Q'r4e6H~80EfّZ|/}ss_~}]h\sq|.v `"v} p~ۿT wi{lwg 2_Q/Np:^Sܦ1Hc{q'DG覀q ǫKK99AWD~.& :SsӞu❟~OwO\Y嵊L4\lq`ANlզH|X&UD\i4i\~<.OOrx>OZՙ|g,Ĵ|[ BkbySus3rB,(bp6'8 ;Pn.׃*ƶ& 9cgb'f[Tł-6pL6 W 5H6$d @ I*4\  mQ` W 56 D @ Q*`  hmD@T&ۄI0i&LՄ6a&L S5aM fTMl&a¤0U&ۄI0i&LՄh\L3a:w+s1?t 1*LbGB/E!FW1uUX  5H6$d @ I*4\  mQ` @ @D jblAP@ T@@P@6*@ x46'x ^*ۄ0cgb' >V),k[v_aV뵝Wvmyn\qj~[v[aVVfm&ylXajZvWaVkUVmWyjTQj~ZvSaV+TFm&yhPAjYvOawV+oO⯩` o7mrҤ}ad>!WO([N\P?-_}˻a;iny?y禗?=s3φwo^Mv7S^_zS$Y\}~ pV'vVɸ_n~Rki6cj|GجYr0.eӇ*3Vm)gqjpT~+ cD0s0HtV\j貐/úZ \M-uҼu_/7j_97w׫)wJzu/˩z۾,wj{K峽j?~N6f" B S2eԝc=)hLuD1WIAc?bٕ︧Rv_;LJUOg~wOd7{=I~ uWrىz5>v/d]S%"v3y37ZvwX=}9HY>^+5Ϗ3{Du*/T f endstream endobj 2222 0 obj << /Type /ObjStm /N 100 /First 1061 /Length 4756 /Filter /FlateDecode >> stream xڝ\v#Whg! >wdV-G>$U'jHbvٝ9h"Ƀ!wx/Oig=Oৼ`b9DH1 ?D;AQISSDK`h B EvF.Rlû]bM>aDK9Jh,-l>Wrr6].Y޲_v% Ю ߕR#d,g~eMU1Fq_Y'`MIMVD9!Ϗ$lQٚM$X@adks75VZbk.K\bkdd9 YF"[Zq>1yd&q>Dƅe}B<%ւEe*f yb\PBZ^p`Gx16/QZL$s)XH ,,lN i$u [˖9[$y#r ?lQƩ ydk(l[D\$l6k}2?+ W FIh#G%%z%yVG6iYVc7YVCjx氦Eao_?}<}}ۿ<]bݒW{D>${atO'6̊Izw _|^?jq??tX3_xr#nqؠjpoOZ+n ^JQR%H9oLJG2potڛ@ l2V%^ m7 bqؕ"dbO`f3'֬H+/Q+fc睉"me+un@cA$km,nǸ#7iBMlvYL1|?{n Pɖ?6 +5kmvrM6FNL%KNAZ3.n^VU֊}*ٟjk[IHVrG vEb]vljjy] SsIUmiE|ֆp.'";."Ipk%cCWѪt̵}Y;QC oV_^+o:S.ViUZe?OHvu_ɮjBZCfe_} /aMh>mSKrUX~:R+H݆mOI8Us8Mfu>,~*f3GacC67'jx ZxY~e,O$T K V?cvɳ 춟B.SQ#Dȿ:, l#WPuu w od[~r^L_ڻ 4CiIP4nzWu7Vx:s$Wo_8auEe؅f'2!Q_ӯFRʯ˗D2ҹd&HRTUjJq0rt_rZG2BCݧЂ[m"#N-Nб-H IiV "O3 8fm0$@8t/Zp,ʺ몚x\7"ǵcˬ79ڱgSl왗qm<j }B-u2Rj*Ye~)/Q Dma)ֱ EA-Ab&?v,}J Pj RgT6()-(4 ر|)6v, @^܂r b>Oir#&VR >E {zk! >"$JXKU>~%$+$tL|2ҮTdd끔$plD_ O2“dµKN͌VX^:rjo3A\ 3pޚQCE[ųfpT$?OjpQA~mpaPzzYI2eثai W䲛7rQ t6~/d6ɰBZlT9HJ4٪H[@|gdѦ f*HaAiUmR/?_:ҬW)Hˤ 3{ Ur>- >i AZEZ TҢ樢>5'3O7' Tz"jH'W +y9񩗟 )GEA*f1 Ru^v&izl{?u?24$ hi h\hb4q?}骋W_[*KP U S/? @ QKR!=nI hiKVFZ4evKk#>j.P.[%`\C ]Dvγ:VƸJ4$4H땳 X V"M[ Y "5{DA-̃:0zzN}C EIb\g=PN}W]h'OWk\*G$ɐ3'GC{<-r:P7r_ji*_a\!I}Q FR`Ou7Ww yz&t{[8_(G"UHZ ݭko# IGzwiH:8A-9g\M0 C+E?HQA bڣUQNg1bNf] Z9׬Agk=*}Sن}?q*;'-W-0 { -@6-.M/I] (&A0Wm#`U=0n^0*w͐:d1 i<) 띋yV !j e=$u2aYw'.+=0Wy`w4[/z 0s2|2/R1b8rhy\/8 e$g<'ҒW3>9cԗ<'ђ] 0j]*v"0p+W:ktɺ](&AasƁaiy`Nj*A/-gI0 IT$ *nc@)h=/LwEiI(A0Io`k0E04Yo?k~Iz$;"D6 Hm6GThwyrO(RDqޯ~$KYKYKYEYEȶQ 0ԩ\_zݕ_z'/dF TL-l&l$y$BW^M/)N0`F`^} 0LvY=!Tѫ@}H \L/ ӫQQ̓j%pE׋4^$PL(WA8} dq*\yiE?9+c)W%pL?p C1},ɧoiz8Wg &Š>bP%d1ɺizHA ԡ@A #c\[t饣u<8fp)p̠zoY &~7{azHbkWTNAP&EH0%p 3@LA}%P&/!)ACȃ,PPgAt} Mo" 33 3 3T1WU @C,2n *EiUlש~D~L/#)տPaF˃aFb5b5b\4$Ph]GpYYe$8S3:m6d16d16d14$p̨"nj8,Fd1zM.驿e endstream endobj 2365 0 obj << /Producer (pdfTeX-1.40.21) /Author()/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20210119180436-08'00') /ModDate (D:20210119180436-08'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020) kpathsea version 6.3.2) >> endobj 2323 0 obj << /Type /ObjStm /N 42 /First 412 /Length 1481 /Filter /FlateDecode >> stream xڍXMo7WX $([?ᦧ"Nʒ!hˡ/r9GMI o(Y5Hj$Md%uƒudƓ3Vb\e/w>s9K+G;M诜% 2`gus0?bC\qYQ8 Rvb!C(;]Ըۤqya*QhF U0G}CtP`0.y_?r4}0yk'@K0kJv(ְOց0Ɍ_4pOërM)䡇zxli9s҃KHӬ}=2f```h-@Ѿ&v,t] ,Q+@2 i>^ [+EFC`,"XD'PFs>um 8$h&ͿsK&!]8& 'je|M.x#0;åQ6 ,0 |gvn"X` \%7$vŀJ.^fZDŽqL)14 C|u{}AD& Z"&vkP %P %vߺb]1A0 0 5h "#LA$LA$םA}A3|cp'apR;8_brw1oy){O?v;.7K~? wǂ\?rC endstream endobj 2366 0 obj << /Type /XRef /Index [0 2367] /Size 2367 /W [1 3 1] /Root 2364 0 R /Info 2365 0 R /ID [ ] /Length 5446 /Filter /FlateDecode >> stream x%Y$Y~33gV5zf}Ͼ}E#"jPE %1LxA0h)іb.b)lZ⅂x4w}==UFFH"|t1sMj `\S Vll4=6j+΃j;.j'.j.jO.ZoB Rrp%R[vp5Qۮvp-djnN AڌFؤPflM.Rf-UjvŶbն]6v]2{b]4n]0<b7lQ=Ka85< 1<'>R$Rv00߱j)ØjXj{NvJ-djcF[r5_76ujG C i!ZC;j7b3EV;h%v-6qZOvhgjF#Pj_+݆ͨ6x "WӆG}xr5샦ZifPɁfR;PRfU [ 5`;50QOdբ@Em0j8=8)PVNK4`'!*3LmJ-ujtk mP;SŗܤVܢvU-Flmj cPFRFfMS[n`Z8~D mV[j(Mj-t88AZl(ŃCj:`pDBC3YEBP o uFЭ#=5 4Jji+;{NG:18 Nuv;h؁]@sp2ВF8d ft@ ހyqL1aq6́I `>,55|!Nu.0O '!pz ;B X.-'cԘj-8O{Y0@=u0!/&` +a52a 6f16;`'L. {`/pB a8GpVW!aЫ.mp qV}aO aĞf?\s, ~n3=8+u^d\f}|sp.Epұo{s]{Cҹy]wOw >{ Ccx"1|۾S=^kxཏ5 ʫyLafA.QG%E@m.8ǜK>j8כ^7i445}'[N4YNka3pZptSmmv4ݰGf*EwpþԸXǤ8Sp>3pι:{ /% W*܄ qZL 8vv3G67^­Ը.܇cpAzq /=0􄡷vBG=.{RSeLd'f=1YO6z0~$'=i{S_ld'k6sێ 6#9=z3OO,zqbwbo DdE45>Øٞ'p7>R^&4!".53c0H79;5 6΅y0AߏYbX`9GUրz`{y qQ@&B1 jWӓ.&9؟=3(tu7y\MWmg _d >O]cn@~gw#Xlkx,fy!va=z:_n3[oRܶ]s`ms$~{>.ۋ6@c{Aj|>_Mr-o6o합yyX6mV۬텡%5㳻ڶ]ළ`v\ڎuBqʺ}(51U\o U{Ln3fe{t ov*ٞ!3ilķilLgEoߎs'bLwXT߿ހд> J*]_*4[DݕT l^___]]]X-Jij%_iʁJ"* )^|"Q%/TWq ҿՎWYW"P@Dr؉uXpJ*aҿ@u8Ø/,Uy,p^2 ɕb:Ҟ1)U\>0]3TtWtW8-Œt1Uاzd5B㻔N}*j1ZqxrԚg,עDk,Etcmo)0쫵ZO{A`=l-66&py v8akJ/.CS^3iCpQp:Rz$f9'!+8 We"\?Z2v!O~5jpW|ZvbbWvJ?`,s OSDV׉תUw Hrm+|KwwFu'q ݥ뢵Krw,v1)]λLwRۥ%.8ݥ:kwIe{{ [Kw.]o!ݸ"oextJ_{F%{E㫱ڍLR|$wI؍UNbEЮc@~J#feX6]japMJz\Js>XXX4&ؘҿn!Cl Gan?!C·t%bA!C[hg7ӓ<$ydc( Cj础 ?$~H!CcҐ,C3}Rs_[ĢݧOw߂Zb1K5ges̲b>X/ }KDpM~Oîܹ<EoO|>}Z'>?J} b*#7>}BT;sԿ71 }9b?}% 0& ,Jc}aL\ `!,J?;`Ij^>)f9}NX3a lmv.&qds15w?;CC9 n}Lip_c spN棿/eWSǛM݁W]{{1sx 5[dž-X-X-WpT4R'ಘS-`1,+2X\\ SS?jjjjjaVl   7  lMORja༠` {Y\q$}+V V V V V k3oa5@mAmAmAmAmaMoo+/ڂڂڂڂY555umAooooMh98( _JLErMrMrMrMrMrMr7sHIIIII]Zׄ׬"Ps^s^s^3]EkkkkkkkkkCyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy=r> c00 f0X`1, VX `3l  Ӱ v `?ЂCpQ8Sp>3py\+pup=[a&|5sW+C( .ܙ'ŰrΖ̓I*@Yl-dt&s} ీuYf#DE#-7l⏾˹4ūi;Յ4>Y.?WGrՕ4ƫxb+!& [C<.fK~k&>p!C\#n4$$$$7JJӗ/M_UUUUUUUUUUUUUUՒRzԫ^-jWKZRzԫsi\?ZԜ,5g9KYjRs"P_________r^r^jRsԜ,5g9KYjRsԜ%o\XJS),5g9KYjRsԜ,5g9KYjRs$$$$$$$\6RëMqY0$̅y0BXa ,eVUZ u6Fa lmv4ogLI endstream endobj startxref 341631 %%EOF ggthemes/tests/0000755000176200001440000000000013774436616013240 5ustar liggesusersggthemes/tests/spelling.R0000644000176200001440000000024113774436616015175 0ustar liggesusersif(requireNamespace('spelling', quietly = TRUE)) spelling::spell_check_test(vignettes = TRUE, error = FALSE, skip_on_cran = TRUE) ggthemes/tests/testthat/0000755000176200001440000000000014002057473015061 5ustar liggesusersggthemes/tests/testthat/test-gdocs.R0000644000176200001440000000104313774436616017275 0ustar liggesuserscontext("gdocs") test_that("gdocs_pal works", { pal <- gdocs_pal() expect_is(pal, "function") n <- 3 vals <- pal(n) expect_is(vals, "character") expect_eqNe(length(vals), n) }) test_that("scale_fill_gdocs works", { expect_is(scale_fill_gdocs(), "ScaleDiscrete") }) test_that("scale_colour_gdocs works", { expect_is(scale_fill_gdocs(), "ScaleDiscrete") }) test_that("scale_color_gdocs works", { expect_eqNe(scale_color_gdocs(), scale_colour_gdocs()) }) test_that("theme_gdocs works", { expect_is(theme_gdocs(), "theme") }) ggthemes/tests/testthat/test-stata.R0000644000176200001440000000273613774436616017324 0ustar liggesuserscontext("stata") test_that("stata_pal works", { p <- stata_pal() expect_is(p, "function") expect_is(attr(p, "max_n"), "integer") n <- 5 vals <- p(n) expect_hexcolor(vals) expect_length(vals, n) expect_warning(stata_pal()(100)) }) test_that("scale_colour_stata works", { expect_is(scale_colour_stata(), "ScaleDiscrete") }) test_that("scale_color_stata works", { expect_eqNe(scale_colour_stata(), scale_color_stata()) }) test_that("scale_fill_stata works", { expect_is(scale_fill_stata(), "ScaleDiscrete") }) test_that("scale_shape_stata works", { expect_is(scale_shape_stata(), "ScaleDiscrete") }) test_that("theme_stata works", { expect_is(theme_stata(), "theme") for (i in c("s2mono", "s1mono", "s2manual", "s1rcolor", "s1color")) { expect_is(theme_stata(scheme = i), "theme") } }) test_that("theme_state raises error with invallid scheme", { expect_error(theme_stata(scheme = "dsagasagdadgaga"), regexp = "`scheme` must be one of") }) test_that("stata_shape_pal works", { p <- stata_shape_pal() expect_is(p, "function") n <- 5L vals <- p(n) expect_is(vals, "integer") expect_length(vals, n) expect_true(all(vals < 0)) expect_warning(p(100)) }) test_that("stata_linetype_pal works", { p <- stata_linetype_pal() expect_is(p, "function") n <- 5L vals <- p(n) expect_eqNe(vals, c("solid", "84", "23", "F414", "F4")) }) test_that("scale_linetype_stata works", { expect_is(scale_linetype_stata(), "ScaleDiscrete") }) ggthemes/tests/testthat/test-calc.R0000644000176200001440000000165013774436616017104 0ustar liggesuserscontext("calc") test_that("calc_shape_pal works", { pal <- calc_shape_pal() expect_is(pal, "function") expect_is(attr(pal, "max_n"), "integer") n <- 5L shapes <- pal(n) expect_is(shapes, "integer") expect_true(all(shapes < 0)) expect_eqNe(length(shapes), n) }) test_that("calc_pal works", { pal <- calc_pal() expect_is(pal, "function") expect_is(attr(pal, "max_n"), "integer") n <- 5L expect_hexcolor(pal(n)) expect_warning(pal(100)) expect_error(pal(-1)) }) test_that("calc_shape_pal raises warning for large n", { expect_warning(calc_shape_pal()(100)) }) test_that("theme_calc works", { expect_is(theme_calc(), "theme") }) test_that("scale_colour_calc works", { expect_is(scale_colour_calc(), "ScaleDiscrete") }) test_that("scale_fill_calc works", { expect_is(scale_fill_calc(), "ScaleDiscrete") }) test_that("scale_shape_calc works", { expect_is(scale_shape_calc(), "ScaleDiscrete") }) ggthemes/tests/testthat/test-theme_map.R0000644000176200001440000000023413774436616020136 0ustar liggesuserscontext("theme_map") test_that("theme_map works", { thm <- theme_map() expect_is(thm, "theme") expect_eqNe(thm$panel.background, element_blank()) }) ggthemes/tests/testthat/helper-utils.R0000644000176200001440000000117613774436616017645 0ustar liggesusersis_hexcolor <- function(x) { pattern <- stringr::regex("^#[a-f0-9]{6}$", ignore_case = TRUE) out <- stringr::str_detect(x, pattern) out[is.na(out)] <- FALSE out } expect_hexcolor <- function(object) { # capture object and label act <- quasi_label(rlang::enquo(object)) valid <- is_hexcolor(act$val) expect( all(valid), glue::glue("Not all elements of {act$lab} are hex colors.") ) invisible(act$val) } # Needed to fix CRAN issues due to changes in all-equal function # See https://github.com/Ryo-N7/tvthemes/issues/15 expect_eqNe <- function(...) { testthat::expect_equal(..., check.environment=FALSE) } ggthemes/tests/testthat/test-wsj_pal.R0000644000176200001440000000112513774436616017636 0ustar liggesuserscontext("wsj") test_that("theme_wsj works", { expect_is(theme_wsj(), "theme") }) test_that("wsj_pal works", { p <- wsj_pal() expect_is(p, "function") expect_is(attr(p, "max_n"), "integer") expect_hexcolor(p(3)) }) test_that("theme_wsj works", { expect_is(theme_wsj(), "theme") }) test_that("theme_wsj raises error with invalid palette", { expect_error(wsj_pal("asdgasa"), regexp = "valid palette") }) test_that("scale_colour_wsj works", { expect_is(scale_colour_wsj(), "ScaleDiscrete") }) test_that("scale_fill_wsj works", { expect_is(scale_fill_wsj(), "ScaleDiscrete") }) ggthemes/tests/testthat/test-economist.R0000644000176200001440000000357013774436616020205 0ustar liggesuserscontext("economist") test_that("economist_pal fill=FALSE works", { p <- economist_pal(fill = FALSE) expect_is(p, "function") for (i in 1:9) { expect_hexcolor(p(i)) } }) test_that("economist_pal fill=TRUE works", { p <- economist_pal(fill = TRUE) expect_is(p, "function") for (i in 1:9) { expect_hexcolor(p(i)) } }) test_that("economist_pal raises warning with large number", { expect_warning(economist_pal()(10)) }) test_that("scale_colour_economist equals scale_color_economist", { expect_eqNe(scale_color_economist(), scale_colour_economist()) }) test_that("scale_colour_economist works", { expect_is(scale_color_economist(), "ScaleDiscrete") }) test_that("scale_fill_economist works", { expect_is(scale_fill_economist(), "ScaleDiscrete") }) test_that("theme economist works", { expect_is(theme_economist(), "theme") }) test_that("theme economist with horizontal=FALSE works", { thm <- theme_economist(horizontal = FALSE) expect_is(thm, "theme") expect_eqNe(thm$panel.grid.major.y, element_blank()) }) test_that("theme economist with dark panel works", { thm <- theme_economist(dkpanel = TRUE) expect_is(thm, "theme") expect_eqNe(thm$strip.background$fill, purrr::pluck(dplyr::filter(ggthemes_data$economist$bg, name == "dark blue-gray"), "value")) }) test_that("theme economist_white works", { thm <- theme_economist_white(gray_bg = FALSE) expect_is(thm, "theme") expect_eqNe(thm$panel.background$fill, "white") expect_eqNe(thm$plot.background$fill, "white") }) test_that("theme economist_white with gray background works", { thm <- theme_economist_white(gray_bg = TRUE) expect_is(thm, "theme") expect_eqNe(thm$plot.background$fill, purrr::pluck(dplyr::filter(ggthemes_data$economist$bg, name == "light gray"), "value")) }) ggthemes/tests/testthat/test-banking.R0000644000176200001440000000125013774436616017607 0ustar liggesuserscontext("banking") test_that("bank_slopes runs", { x <- 1:5 y <- runif(length(x)) out <- bank_slopes(x, y) expect_eqNe(length(out), 1L) expect_is(out, "numeric") }) test_that("bank_slopes with method=\"as\" runs", { x <- 1:5 y <- runif(length(x)) out <- bank_slopes(x, y, method = "as") expect_eqNe(length(out), 1L) expect_is(out, "numeric") }) test_that("bank_slopes with invalid method throws error", { expect_error(bank_slopes(1:5, 1:5, method = "aor")) }) test_that("bank_slopes works with cull = TRUE", { x <- c(1, 1, 2) y <- runif(length(x)) out <- bank_slopes(x, y, cull = TRUE) expect_eqNe(length(out), 1L) expect_is(out, "numeric") }) ggthemes/tests/testthat/test-tufteboxplot.R0000644000176200001440000000017213774436616020737 0ustar liggesuserscontext("geom-tufteboxplot") test_that("geom_tufteboxplot works", { expect_is(geom_tufteboxplot(), "LayerInstance") }) ggthemes/tests/testthat/test-base.R0000644000176200001440000000235313774436616017115 0ustar liggesuserscontext("base") test_that("theme_base runs", { expect_is(theme_base(), "theme") }) test_that("theme_par runs", { expect_is(theme_par(), "theme") }) test_that("theme_par recognizes las", { withr::with_par(list(las = 1), { thm <- theme_par() expect_eqNe(thm$axis.title.x$angle, 0) expect_eqNe(thm$axis.title.y$angle, 0) }) withr::with_par(list(las = 2), { thm <- theme_par() expect_eqNe(thm$axis.title.x$angle, 90) expect_eqNe(thm$axis.title.y$angle, 0) }) withr::with_par(list(las = 3), { thm <- theme_par() expect_eqNe(thm$axis.title.x$angle, 90) expect_eqNe(thm$axis.title.y$angle, 90) }) }) test_that("theme_par recognizes tck", { withr::with_par(list(tck = 1), { expect_eqNe(theme_par()$axis.ticks.length, grid::unit(-1, "snpc")) }) }) test_that("theme_par recognizes xaxt", { withr::with_par(list(xaxt = "n"), { thm <- theme_par() for (i in c("axis.line.x", "axis.text.x", "axis.ticks.x")) { expect_eqNe(thm[[i]], element_blank()) } }) }) test_that("theme_par recognizes yaxt", { withr::with_par(list(yaxt = "n"), { thm <- theme_par() for (i in c("axis.line.y", "axis.text.y", "axis.ticks.y")) { expect_eqNe(thm[[i]], element_blank()) } }) }) ggthemes/tests/testthat/test-fivethirtyeight.R0000644000176200001440000000100013774436616021405 0ustar liggesuserscontext("fivethirtyeight") test_that("theme_fivethirtyeight works", { expect_is(theme_fivethirtyeight(), "theme") }) test_that("scale_fill_fivethirtyeight works", { expect_is(scale_fill_fivethirtyeight(), "ScaleDiscrete") }) test_that("scale_colour_fivethirtyeight works", { expect_is(scale_colour_fivethirtyeight(), "ScaleDiscrete") }) test_that("fivethirtyeight_pal works", { p <- fivethirtyeight_pal() expect_is(p, "function") expect_is(attr(p, "max_n"), "integer") expect_hexcolor(p(3)) }) ggthemes/tests/testthat/helper-vdiffr.R0000644000176200001440000000107213774436616017760 0ustar liggesusersexpect_doppelganger <- function(title, fig, path = NULL, ..., user_fonts = NULL, verbose = FALSE) { # need to call conditionally because vdiffr listed in Suggests (#124) testthat::skip_if_not_installed("vdiffr") vdiffr::expect_doppelganger(title, fig, path = path, ..., user_fonts = user_fonts, verbose = verbose) } ggthemes/tests/testthat/test-canva.R0000644000176200001440000000133213774436616017267 0ustar liggesuserscontext("canva") test_that("canva_pal works", { p <- canva_pal() expect_is(p, "function") expect_hexcolor(p(4)) }) test_that("canva_pal works with alt palette", { expect_hexcolor(canva_pal("Pop art")(4)) }) test_that("canva_pal raises warning with to large n", { expect_warning(canva_pal()(10)) }) test_that("canva_pal raises error with invalid palette", { expect_error(canva_pal("adsffafd"), regexp = "not a valid name") }) test_that("scale_colour_canva works", { expect_is(scale_colour_canva(), "ScaleDiscrete") }) test_that("scale_color_canva works", { expect_eqNe(scale_color_canva(), scale_colour_canva()) }) test_that("scale_colour_canva works", { expect_is(scale_fill_canva(), "ScaleDiscrete") }) ggthemes/tests/testthat/test-solarized.R0000644000176200001440000000143513774436616020177 0ustar liggesuserscontext("solarized") test_that("theme_solarized_works", { expect_is(theme_solarized(), "theme") expect_is(theme_solarized(light = FALSE), "theme") }) test_that("theme_solarized_2_works", { expect_is(theme_solarized_2(), "theme") expect_is(theme_solarized_2(light = FALSE), "theme") }) test_that("scale_colour_solarized works", { expect_is(scale_colour_solarized(), "ScaleDiscrete") }) test_that("scale_color_solarized works", { expect_eqNe(scale_colour_solarized(), scale_color_solarized()) }) test_that("scale_fill_solarized works", { expect_is(scale_fill_solarized(), "ScaleDiscrete") }) test_that("solarized_pal works", { pal <- solarized_pal() expect_is(pal, "function") n <- 5L values <- pal(n) expect_is(values, "character") expect_eqNe(length(values), n) }) ggthemes/tests/testthat/test-show.R0000644000176200001440000000064213774436616017162 0ustar liggesuserscontext("shapes") test_that("show_shapes works", { # creates plot using base plotting system, so just run code --- any # errors / warnings will be caught. x <- 1:10 expect_eqNe(show_shapes(x), x) }) test_that("show_linetypes works", { x <- 1:5 expect_eqNe(show_linetypes(x), x) }) test_that("show_linetypes works with labels = FALSE", { x <- 1:5 expect_eqNe(show_linetypes(x, labels = FALSE), x) }) ggthemes/tests/testthat/test-few.R0000644000176200001440000000311413774436616016760 0ustar liggesuserscontext("few") library("ggplot2") test_that("few_shape_pal works", { out <- few_shape_pal() expect_is(out, "function") expect_true(!is.null(attr(out, "max_n"))) pal0 <- out(0) expect_identical(length(pal0), 0L) pal3 <- out(3) expect_identical(length(pal3), 3L) expect_warning(out(10)) }) test_that("few_shape_pal works", { out <- scale_shape_few() expect_is(out, c("ScaleDiscrete", "Scale", "ggproto")) }) test_that("few_pal runs", { p <- few_pal("Medium") expect_is(p, "function") expect_is(attr(p, "max_n"), "integer") out <- p(5) expect_is(out, "character") expect_eqNe(length(out), 5L) # should use the first accent color expect_eqNe(out[[1]], ggthemes::ggthemes_data$few$colors$Medium$value[[2]]) expect_warning(p(10)) }) test_that("few_pal works with n = 1", { out <- few_pal("Medium")(1) expect_eqNe(out, ggthemes::ggthemes_data$few$colors$Medium$value[[1]]) }) test_that("few_pal raises error with bad palette", { expect_error(few_pal("Foo")) }) test_that("scale_colour_few works", { expect_is(scale_colour_few(), "ScaleDiscrete") }) test_that("scale_color_few works", { expect_eqNe(scale_color_few(), scale_colour_few()) }) test_that("scale_fill_few works", { expect_is(scale_fill_few(), "ScaleDiscrete") }) test_that("theme_few works", { expect_is(theme_few(), "theme") }) test_that("theme_few draws correctly", { df <- data.frame(x = 1:3, y = 1:3, z = c("a", "b", "a"), a = 1) plot <- ggplot(df, aes(x, y, colour = z)) + geom_point() + facet_wrap(~ a) expect_doppelganger("theme_few", plot + theme_few()) }) ggthemes/tests/testthat/test-tufte.R0000644000176200001440000000041413774436616017326 0ustar liggesuserscontext("tufte") test_that("theme_tufte works", { thm <- theme_tufte() expect_is(thm, "theme") }) test_that("theme_tufte works with ticks = FALSE", { thm <- theme_tufte(ticks = FALSE) expect_is(thm, "theme") expect_eqNe(thm$axis.ticks, element_blank()) }) ggthemes/tests/testthat/test-stat_fivenumber.R0000644000176200001440000000016413774436616021376 0ustar liggesuserscontext("stat-fivenumber") test_that("stat_fivenumber works", { expect_is(stat_fivenumber(), "LayerInstance") }) ggthemes/tests/testthat/test-theme_solid.R0000644000176200001440000000023513774436616020474 0ustar liggesuserscontext("theme_solid") test_that("theme_solid works", { thm <- theme_solid(fill = "red") expect_is(thm, "theme") expect_eqNe(thm$rect$fill, "red") }) ggthemes/tests/testthat/test-igray.R0000644000176200001440000000023113774436616017307 0ustar liggesuserscontext("igray") test_that("theme_igray works", { thm <- theme_igray() expect_is(thm, "theme") expect_eqNe(thm$plot.background$fill, "gray90") }) ggthemes/tests/testthat/test-shapes.R0000644000176200001440000000323113774436616017462 0ustar liggesuserscontext("shapes") test_that("circlefill_pal works", { pal <- circlefill_shape_pal() expect_is(pal, "function") expect_eqNe(attr(pal, "max_n"), 5L) n <- 4L values <- pal(n) expect_is(values, "integer") expect_eqNe(length(values), n) }) test_that("scale_shape_circlefill works", { expect_is(scale_shape_circlefill(), "ScaleDiscrete") }) test_that("tremmel_shape_pal works", { pal <- tremmel_shape_pal() expect_is(pal, "function") expect_eqNe(attr(pal, "max_n"), 3L) n <- 3L values <- pal(n) expect_is(values, "integer") expect_eqNe(length(values), n) }) test_that("tremmel_shape_pal works for all values", { for (i in 1:3L) { expect_eqNe(length(tremmel_shape_pal()(i)), i) expect_eqNe(length(tremmel_shape_pal(alt = TRUE)(i)), i) expect_eqNe(length(tremmel_shape_pal(overlap = TRUE)(i)), i) } }) test_that("scale_shape_tremmel works", { expect_is(scale_shape_tremmel(), "ScaleDiscrete") }) test_that("cleveland_shape_pal works", { pal <- cleveland_shape_pal() expect_is(pal, "function") expect_eqNe(attr(pal, "max_n"), 4) n <- 3 vals <- pal(n) expect_eqNe(length(vals), n) }) test_that("tremmel_pal arg n3alt is deprected", { expect_warning(tremmel_shape_pal(n3alt = FALSE)) expect_warning(tremmel_shape_pal(n3alt = TRUE)) }) test_that("cleveland_shape_pal works with overlap = FALSE", { pal <- cleveland_shape_pal(overlap = FALSE) expect_is(pal, "function") expect_eqNe(attr(pal, "max_n"), 5) n <- 3 vals <- pal(n) expect_eqNe(length(vals), n) expect_is(vals, "integer") expect_true(all(vals < 0)) }) test_that("scale_shape_cleveland works", { expect_is(scale_shape_cleveland(), "ScaleDiscrete") }) ggthemes/tests/testthat/test-scales_tufte.R0000644000176200001440000000002213774436616020653 0ustar liggesuserscontext("scales") ggthemes/tests/testthat/test-excel.R0000644000176200001440000000265713774436616017312 0ustar liggesuserscontext("excel") test_that("excel_clasic_pal works", { pal <- excel_pal() n <- 5L values <- pal(n) expect_is(values, "character") expect_eqNe(length(values), n) }) test_that("excel_clasic_pal with line = TRUE works", { pal <- excel_pal(line = TRUE) n <- 5L values <- pal(n) expect_is(values, "character") expect_eqNe(length(values), n) }) test_that("calc_shape_pal raises warning for large n", { expect_warning(excel_pal()(8)) }) test_that("excel_new_pal works", { pal <- excel_new_pal() n <- 5L vals <- pal(n) expect_is(vals, "character") expect_eqNe(length(vals), n) }) test_that("excel_new_pal raises error for bad n", { expect_warning(excel_new_pal()(7)) }) test_that("theme_excel works", { expect_is(theme_excel(), "theme") }) test_that("excel_new_pal raises error with bad theme name", { expect_error(excel_new_pal("adfaasdfa"), regexp = "`theme` must be one of") }) test_that("scale_fill_excel works", { expect_is(scale_fill_excel(), "ScaleDiscrete") }) test_that("scale_colour_excel works", { expect_is(scale_colour_excel(), "ScaleDiscrete") }) test_that("scale_colour_excel works", { expect_is(scale_fill_excel_new(), "ScaleDiscrete") }) test_that("scale_fill_excel works", { expect_is(scale_colour_excel_new(), "ScaleDiscrete") }) test_that("theme_excel with horizontal = FALSE works", { thm <- theme_excel(horizontal = FALSE) expect_eqNe(thm$panel.grid.major.y, element_blank()) }) ggthemes/tests/testthat/test-tableau.R0000644000176200001440000000657513774436616017632 0ustar liggesuserscontext("tableau") test_that("tableau_color_pal works", { pal <- tableau_color_pal() expect_is(pal, "function") expect_is(attr(pal, "max_n"), "integer") n <- 3 vals <- pal(n) expect_is(vals, "character") expect_eqNe(length(vals), n) }) test_that("tableau_color_pal direction = -1 works", { n <- 4L expect_true(all(tableau_color_pal(direction = -1)(n) == rev(tableau_color_pal()(n)))) }) test_that("tableau_color_pal works with diverging palette", { n <- 3L pal <- tableau_color_pal("Orange-Blue Diverging", type = "ordered-diverging")(n) expect_is(pal, "character") expect_eqNe(length(pal), n) }) test_that("tableau_color_pal raises error with invalid palette", { expect_error(tableau_color_pal("dsaga")) }) test_that("tableau_shape_pal raises error with bad palette", { expect_error(tableau_shape_pal(palette = "gender")) }) test_that("tableau_shape_pal works", { n <- 3 pal <- tableau_shape_pal()(n) expect_is(pal, "integer") expect_is(attr(tableau_shape_pal(), "max_n"), "integer") # all unicode expect_true(all(pal < 0)) expect_eqNe(length(pal), n) }) test_that("scale_shape_tableau works", { expect_is(scale_shape_tableau(), "ScaleDiscrete") }) test_that("scale_colour_tableau works", { expect_is(scale_colour_tableau(), "ScaleDiscrete") }) test_that("scale_colour_tableau works with diverging scales", { expect_is(scale_colour_tableau(type = "ordered-diverging", palette = "Orange-Blue Diverging"), "ScaleDiscrete") }) test_that("scale_colour_tableau works with sequential scales", { expect_is(scale_colour_tableau(type = "ordered-sequential", palette = "Blue-Green Sequential"), "ScaleDiscrete") }) test_that("scale_fill_tableau works", { expect_is(scale_fill_tableau(), "ScaleDiscrete") }) test_that("scale_fill_tableau works with diverging scales", { expect_is(scale_fill_tableau(type = "ordered-diverging", palette = "Orange-Blue Diverging"), "ScaleDiscrete") }) test_that("scale_fill_tableau works with sequential scales", { expect_is(scale_fill_tableau(type = "ordered-sequential", palette = "Blue-Green Sequential"), "ScaleDiscrete") }) test_that("tableau_gradient_pal works", { p <- tableau_gradient_pal() expect_is(p, "function") expect_hexcolor(p(seq(0, 1, by = 0.1))) }) test_that("tableau_seq_gradient_pal works", { p <- tableau_seq_gradient_pal() expect_is(p, "function") expect_hexcolor(p(seq(0, 1, by = 0.1))) }) test_that("tableau_div_gradient_pal works", { p <- tableau_seq_gradient_pal() expect_is(p, "function") expect_hexcolor(p(seq(0, 1, by = 0.1))) }) test_that("scale_colour_gradient_tableau works", { expect_is(scale_colour_gradient_tableau(), "ScaleContinuous") }) test_that("scale_fill_gradient_tableau works", { expect_is(scale_fill_gradient_tableau(), "ScaleContinuous") }) test_that("scale_colour_gradient_tableau works", { expect_is(scale_colour_gradient2_tableau(), "ScaleContinuous") }) test_that("scale_fill_gradient_tableau works", { expect_is(scale_fill_gradient2_tableau(), "ScaleContinuous") }) test_that("classic colors are in the correct order", { # Issue #96 pal <- tableau_color_pal("Classic 20")(20) expect_eqNe(pal[[1]], "#1f77b4") expect_eqNe(pal[[20]], "#9edae5") }) ggthemes/tests/testthat/test-pander.R0000644000176200001440000000162113774436616017451 0ustar liggesuserscontext("pander") test_that("scale_colour_pander works", { expect_is(scale_colour_pander(), "ScaleDiscrete") }) test_that("scale_fill_pander works", { expect_is(scale_fill_pander(), "ScaleDiscrete") }) test_that("palette_pander works", { colors <- palette_pander(5) expect_hexcolor(colors) }) test_that("palette_pander random_order=TRUE works", { colors <- palette_pander(5, random_order = TRUE) expect_hexcolor(colors) }) test_that("theme_pander works", { expect_is(theme_pander(), "theme") }) test_that("theme_pander works with gm = FALSE", { thm <- theme_pander(gM = FALSE) expect_is(thm, "theme") expect_eqNe(thm$panel.grid, element_blank()) }) test_that("theme_pander warns about ff argument", { expect_warning(theme_pander(ff = ""), regexp = "deprecated") }) test_that("theme_pander warns about fs argument", { expect_warning(theme_pander(fs = 1), regexp = "deprecated") }) ggthemes/tests/testthat/test-ptol.R0000644000176200001440000000052713774436616017162 0ustar liggesuserscontext("ptol") test_that("ptol_pal works", { p <- ptol_pal() expect_is(p, "function") expect_is(attr(p, "max_n"), "integer") expect_hexcolor(p(11)) }) test_that("scale_colour_ptol works", { expect_is(scale_colour_ptol(), "ScaleDiscrete") }) test_that("scale_fill_ptol works", { expect_is(scale_fill_ptol(), "ScaleDiscrete") }) ggthemes/tests/testthat/test-geom-rangeframe.R0000644000176200001440000000016413774436616021235 0ustar liggesuserscontext("geom-rangeframe") test_that("geom_rangeframe works", { expect_is(geom_rangeframe(), "LayerInstance") }) ggthemes/tests/testthat/test-hc.R0000644000176200001440000000150213774436616016570 0ustar liggesuserscontext("hc") test_that("hc_pal works", { pal <- hc_pal() expect_is(pal, "function") n <- 5 values <- pal(n) expect_is(values, "character") expect_eqNe(length(values), n) }) test_that("hc_pal raises error with invalid palette", { expect_error(hc_pal(palette = "asdgasdgasdgas"), regexp = "not valid") }) test_that("scale_colour_hc works", { expect_is(scale_colour_hc(), "ScaleDiscrete") }) test_that("scale_color_hc works", { expect_eqNe(scale_colour_hc(), scale_color_hc()) }) test_that("scale_fill_hc works", { expect_is(scale_fill_hc(), "ScaleDiscrete") }) test_that("theme_hc works", { expect_is(theme_hc(), "theme") expect_is(theme_hc(style = "darkunica"), "theme") }) test_that("bgcolor raises warning", { expect_warning(theme_hc(bgcolor = "darkunica"), regexp = "deprecated") }) ggthemes/tests/testthat/test-colorblind.R0000644000176200001440000000112613774436616020327 0ustar liggesuserscontext("colorblind") test_that("colorblind_pal works", { p <- colorblind_pal() expect_is(p, "function") expect_hexcolor(p(4)) expect_is(attr(p, "max_n"), "integer") }) test_that("colorblind_pal raises warning with to large n", { expect_warning(colorblind_pal()(20)) }) test_that("scale_colour_colorblind works", { expect_is(scale_colour_colorblind(), "ScaleDiscrete") }) test_that("scale_color_canva works", { expect_eqNe(scale_color_colorblind(), scale_colour_colorblind()) }) test_that("scale_fill_colorblind works", { expect_is(scale_fill_colorblind(), "ScaleDiscrete") }) ggthemes/tests/figs/0000755000176200001440000000000013774436616014170 5ustar liggesusersggthemes/tests/figs/deps.txt0000644000176200001440000000010313774436616015656 0ustar liggesusers- vdiffr-svg-engine: 1.0 - vdiffr: 0.3.0 - freetypeharfbuzz: 0.2.5 ggthemes/tests/figs/few/0000755000176200001440000000000013774436616014751 5ustar liggesusersggthemes/tests/figs/few/theme-few.svg0000644000176200001440000002035213774436616017355 0ustar liggesusers 1 1.0 1.5 2.0 2.5 3.0 1.0 1.5 2.0 2.5 3.0 x y z a b theme_few ggthemes/tests/testthat.R0000644000176200001440000000007413774436616015224 0ustar liggesuserslibrary(testthat) library(ggthemes) test_check("ggthemes") ggthemes/R/0000755000176200001440000000000013774436615012276 5ustar liggesusersggthemes/R/show.R0000644000176200001440000000371613774436615013410 0ustar liggesusers#' Show shapes #' #' A quick and dirty way to show shapes. #' #' @export #' @param shapes A numeric or character vector of shapes. See #' \code{\link[graphics]{par}()}. #' @param labels Include the plotting character value of the symbol. #' @seealso \code{\link[scales]{show_col}()}, \code{\link{show_linetypes}()} #' @return This function called for the side effect of creating a plot. #' It returns \code{shapes}. #' @example inst/examples/ex-show_shapes.R show_shapes <- function(shapes, labels = TRUE) { n <- length(shapes) ncol <- ceiling(sqrt(n)) nrow <- ceiling(n / ncol) x <- c(shapes, rep(NA, nrow * ncol - length(shapes))) x <- matrix(x, ncol = ncol, byrow = TRUE) x <- x[nrow(x):1, ] plot(0, 0, xlim = c(1, ncol(x)), ylim = c(1, nrow(x)), type = "n", xlab = "", ylab = "", axes = FALSE) for (i in seq_len(ncol(x))) { for (j in seq_len(nrow(x))) { points(i, j, pch = x[j, i]) if (labels) { text(i, j, x[j, i], pos = 1, col = "gray70") } } } invisible(shapes) } #' Show linetypes #' #' A quick and dirty way to show linetypes. #' #' @export #' @param linetypes A character vector of linetypes. See #' \code{\link{par}()}. #' @param labels Label each line with its linetype (lty) value. #' #' @seealso \code{\link[scales]{show_col}()}, \code{\link{show_linetypes}()} #' #' @example inst/examples/ex-show_linetypes.R #' @return This function called for the side effect of creating a plot. #' It returns \code{linetypes}. #' @importFrom graphics plot show_linetypes <- function(linetypes, labels = TRUE) { n <- length(linetypes) plot(0, 0, xlim = c(0, 1), ylim = c(n, 1), type = "n", xlab = "", ylab = "", axes = FALSE) for (i in seq_along(linetypes)) { abline(h = i, lty = linetypes[i]) } if (labels) { axis(side = 2, at = seq_len(n), tick = FALSE, labels = linetypes, las = 2) } else { axis(side = 2, at = seq_len(n), tick = FALSE, labels = seq_len(n), las = 2) } invisible(linetypes) } ggthemes/R/calc.R0000644000176200001440000001041113774436615013320 0ustar liggesusers#' Theme Calc #' #' Theme similar to the default settings of LibreOffice Calc charts. #' #' @inheritParams ggplot2::theme_grey #' @export #' @family themes calc #' @example inst/examples/ex-theme_calc.R theme_calc <- function(base_size = 10, base_family = "sans") { (theme_foundation(base_family = base_family, base_size = base_size) + theme(rect = element_rect(colour = "black", fill = "white"), text = element_text(colour = "black"), line = element_line(colour = "gray70"), # 13 pt plot.title = element_text(size = rel(1.3)), legend.title = element_text(size = rel(1)), legend.text = element_text(size = rel(1)), axis.title = element_text(size = rel(1)), axis.line = element_blank(), panel.border = element_rect(fill = NA, colour = "gray70"), panel.grid.minor = element_blank(), panel.grid.major.x = element_blank(), legend.position = "right", legend.direction = "vertical", legend.background = element_rect(colour = NA), legend.key = element_rect(colour = NA))) } #' Calc color palette (discrete) #' #' Color palettes from LibreOffice Calc. #' This palette has 12 values. #' #' @family colour calc #' @export #' @example inst/examples/ex-calc_pal.R calc_pal <- function() { values <- unname(ggthemes::ggthemes_data$calc$colors[["value"]]) max_n <- length(values) f <- manual_pal(values) attr(f, "max_n") <- max_n f } #' LibreOffice Calc color scales #' #' Color scales from LibreOffice Calc. #' #' @inheritParams ggplot2::scale_colour_hue #' @family colour calc #' @rdname scale_calc #' @export #' @seealso See \code{\link{theme_calc}()} for examples. scale_fill_calc <- function(...) { discrete_scale("fill", "calc", calc_pal(), ...) } #' @export #' @rdname scale_calc scale_colour_calc <- function(...) { discrete_scale("colour", "calc", calc_pal(), ...) } #' @export #' @rdname scale_calc scale_color_calc <- scale_colour_calc #' Calc shape palette (discrete) #' #' Shape palette based on the shapes used in LibreOffice Calc. #' #' @export #' @family shapes calc #' @example inst/examples/ex-calc_shape_pal.R calc_shape_pal <- function() { values <- ggthemes::ggthemes_data$calc$shapes[["pch"]] f <- manual_pal(unname(values)) attr(f, "max_n") <- length(values) f } #' Calc shape scale #' #' See \code{\link{calc_shape_pal}()} for details. #' #' @inheritParams ggplot2::scale_x_discrete #' @family shapes calc #' @export #' @seealso \code{\link{theme_calc}()} for examples. scale_shape_calc <- function (...) { discrete_scale("shape", "calc", calc_shape_pal(), ...) } # PT_TO_MM <- 0.352778 # # # Default font is Liberation Sans # theme_libre <- function(base_size = 10, # base_family = "sans") { # colorlist <- list(gray = "#B3B3B3") # theme_bw(base_family = base_family, # base_size = base_size) + # theme( # text = element_text(colour = "black"), # line = element_line( # linetype = "solid", # colour = colorlist$gray, # size = 0.5 * PT_TO_MM # ), # rect = element_rect( # fill = "white", # linetype = "solid", # colour = colorlist$gray, # size = 0.5 * PT_TO_MM # ), # panel.grid.major = element_line( # linetype = "solid", # colour = colorlist$gray, # size = 0.5 * PT_TO_MM # ), # axis.title = element_text( # size = 9 # ), # axis.text = element_text( # size = 10 # ), # axis.ticks = element_line( # colour = colorlist$gray # ), # panel.background = element_rect( # colour = colorlist$gray, # size = 0.5 * PT_TO_MM # ), # title = element_text( # face = "plain", # hjust = 0.5 # ), # plot.title = element_text( # size = 13, # hjust = 0.5 # ), # plot.subtitle = element_text( # size = 11, # hjust = 0.5 # ), # panel.grid.major.x = element_blank(), # panel.grid.minor = element_blank(), # legend.position = "right", # strip.background = element_blank(), # strip.text = element_text(size = 9), # legend.title = element_text( # size = 9 # ) # ) # } ggthemes/R/few.R0000644000176200001440000001123613777021472013177 0ustar liggesusers#' Color Palettes Few "Show Me the Numbers" #' #' Qualitative color palettes from Stephen Few (2012) #' \emph{Show Me the Numbers}. There are three palettes: #' Light, Medium, and Dark. Each palette comprises nine colors: #' gray, blue, orange, green, pink, brown, purple, yellow, red. #' For \code{n = 1}, gray is used. For \code{n > 1}, the eight non-gray #' colors are used. #' #' #' Use the light palette for filled areas, such as bar charts. #' Use the medium palette for points and lines. #' Use the dark palette for highlighting specific points #' or for small and thin lines and points. #' #' @references #' Few, S. (2012) \emph{Show Me the Numbers: Designing Tables and Graphs to Enlighten}. #' 2nd edition. Analytics Press. #' #' \href{https://www.perceptualedge.com/articles/visual_business_intelligence/rules_for_using_color.pdf}{"Practical Rules for Using Color in Charts"}. #' #' @export #' @param palette One of \Sexpr[results=rd]{names(ggthemes:::rd_optlist(ggthemes::ggthemes_data$few$colors))} #' @family colour few #' @example inst/examples/ex-few_pal.R few_pal <- function(palette = "Medium") { palette <- ggthemes::ggthemes_data$few$colors[[palette]] if (is.null(palette)) { stop("palette must be one of: ", paste0("\"", names(ggthemes::ggthemes_data$few$colors), "\"", collapse = ", "), call. = FALSE) } ## The first value, gray, is used for non-data parts. values <- palette[["value"]] max_n <- length(values) - 1L f <- function(n) { check_pal_n(n, max_n) if (n == 1L) { values[[1L]] } else { unname(values[2L:(n + 1L)]) } } attr(f, "max_n") <- length(values) - 1L f } #' Color scales from Few's "Practical Rules for Using Color in Charts" #' #' See \code{\link{few_pal}()}. #' #' @inheritParams ggplot2::scale_colour_hue #' @inheritParams few_pal #' @family colour few #' @rdname scale_few #' @export scale_colour_few <- function(palette = "Medium", ...) { discrete_scale("colour", "few", few_pal(palette), ...) } #' @export #' @rdname scale_few scale_color_few <- scale_colour_few #' @export #' @rdname scale_few scale_fill_few <- function(palette = "Light", ...) { discrete_scale("fill", "few", few_pal(palette), ...) } #' Theme based on Few's "Practical Rules for Using Color in Charts" #' #' Theme based on the rules and examples from Stephen Few's #' \emph{Show Me the Numbers} and "Practical Rules for Using Color in Charts". #' #' @references #' Few, S. (2012) \emph{Show Me the Numbers: Designing Tables and Graphs to Enlighten}. #' 2nd edition. Analytics Press. #' #' Stephen Few, "Practical Rules for Using Color in Charts", #' \url{https://www.perceptualedge.com/articles/visual_business_intelligence/rules_for_using_color.pdf}. #' #' @inheritParams ggplot2::theme_bw #' @family themes few #' @export #' @example inst/examples/ex-theme_few.R theme_few <- function(base_size = 12, base_family="") { gray <- "#4D4D4D" black <- "#000000" theme_bw(base_size = base_size, base_family = base_family) + theme( line = element_line(colour = gray), rect = element_rect(fill = "white", colour = NA), text = element_text(colour = black), axis.ticks = element_line(colour = gray), legend.key = element_rect(colour = NA), ## Examples do not use grid lines panel.border = element_rect(colour = gray), panel.grid = element_blank(), strip.background = element_rect(fill = "white", colour = NA) ) } #' Shape palette from "Show Me the Numbers" (discrete) #' #' Shape palette from Stephen Few's, "Show Me the Numbers". #' The shape palette consists of five shapes: circle, square, triangle, plus, #' times. #' #' @references Few, S. (2012) #' \emph{Show Me the Numbers: Designing Tables and Graphs to Enlighten}, #' Analytics Press, p. 208. #' #' @export few_shape_pal <- function() { shapes <- ggthemes::ggthemes_data[["few"]][["shapes"]] max_n <- nrow(shapes) f <- function(n) { check_pal_n(n, max_n) shapes[["pch"]][seq_len(n)] } attr(f, "max_n") <- max_n f } #' Scales for shapes from "Show Me the Numbers" #' #' \code{scale_shape_few()} maps discrete variables to up to five easily #' discernible shapes. It is based on the shape palette suggested in #' Few (2012). #' #' @param ... Common \code{\link[ggplot2]{discrete_scale}()} parameters. #' @references Few, S. (2012) #' \emph{Show Me the Numbers: Designing Tables and Graphs to Enlighten}, #' Analytics Press, p. 208. #' @seealso \code{\link{scale_shape_few}()} for the shape palette that this #' scale uses. #' @export scale_shape_few <- function(...) { discrete_scale("shape", "few", few_shape_pal(), ...) } ggthemes/R/utils.R0000644000176200001440000000175413774436615013570 0ustar liggesusers#' Magic Number: Points to Millimeters #' @noRd PT_TO_MM <- 0.352778 charopts <- function(x) { paste(sprintf("\\code{\"%s\"}", x), collapse = ", ") } # copied from ggplot2 "%||%" <- function(a, b) { if (!is.null(a)) a else b } # copied from ggplot2 ggname <- function(prefix, grob) { grob$name <- grid::grobName(grob, prefix) grob } rd_optlist <- function(x) { paste0("\\code{\"", as.character(x), "\"}", collapse = ", ") } check_pal_n <- function(n, max_n) { if (n > max_n) { warning("This palette can handle a maximum of ", max_n, " values.", "You have supplied ", n, ".") } else if (n < 0) { stop("`n` must be a non-negative integer.") } } #' Extract colors from ggthemes data #' #' @param path A character vector of the path in \code{ggthemes_data}. #' @param colors A character vector of color names. #' @noRd get_colors <- function(path, colors) { x <- dplyr::filter(ggthemes::ggthemes_data[[path]], .data$name %in% colors) x <- unname(x[["value"]]) } ggthemes/R/geom-tufteboxplot.R0000644000176200001440000002052113774442507016102 0ustar liggesusers#' Tufte's Box Plot #' #' Edward Tufte's revisions of the box plot as described in #' \emph{The Visual Display of Quantitative Information}. #' This functions provides several box plot variants: #' \itemize{ #' \item{A point indicating the median, a gap indicating the #' interquartile range, and lines for whiskers.} #' \item{An offset line indicating the interquartile range #' and a gap indicating the median.} #' \item{A line indicating the interquartile range, #' a gap indicating the median, and points indicating #' the minimum and maximum values} #' \item{A wide line indicating the interquartile range, #' a gap indicating the median, and lines indicating the minimum and #' maximum.} #' } #' #' @section Aesthetics: #' \itemize{ #' \item x [required] #' \item y [required] #' \item colour #' \item size #' \item linetype #' \item shape #' \item fill #' \item alpha #' } #' #' @references Tufte, Edward R. (2001) The Visual Display of #' Quantitative Information, Chapter 6. #' #' McGill, R., Tukey, J. W. and Larsen, W. A. (1978) Variations of #' box plots. The American Statistician 32, 12-16. #' #' @seealso \code{\link{geom_boxplot}()} #' @inheritParams ggplot2::geom_point #' @param outlier.colour colour for outlying points #' @param outlier.shape shape of outlying points #' @param outlier.size size of outlying points #' @param outlier.stroke stroke for outlying points #' @param median.type If \code{'point'}, then the median is represented by a #' point, and the interquartile range by a gap in the line. If #' \code{median.type='line'}, then the interquartile range is represented by #' a line, possibly offset, and the median by a gap in the line. #' @param whisker.type If \code{'line'}, then whiskers are represented by lines. #' If \code{'point'}, then whiskers are represented by points at #' \code{ymin} and \code{ymax}. #' @param voffset controls the size of the gap in the line representing the #' median when \code{median.type = 'line'}. This is a fraction of the range #' of \code{y}. #' @param hoffset controls how much the interquartile line is offset from the #' whiskers when \code{median.type = 'line'}. This is a fraction of the #' range of \code{x}. #' @family geom tufte #' @export #' #' @example inst/examples/ex-geom_tufteboxplot.R geom_tufteboxplot <- function(mapping = NULL, data = NULL, stat = "fivenumber", position = "dodge", outlier.colour = "black", outlier.shape = 19, outlier.size = 1.5, outlier.stroke = 0.5, voffset = 0.01, hoffset = 0.005, na.rm = FALSE, show.legend = NA, inherit.aes = TRUE, median.type = "point", whisker.type = "line", ...) { layer( data = data, mapping = mapping, stat = stat, geom = GeomTufteboxplot, position = position, show.legend = show.legend, inherit.aes = inherit.aes, params = list( outlier.colour = outlier.colour, outlier.shape = outlier.shape, outlier.size = outlier.size, outlier.stroke = outlier.stroke, voffset = voffset, hoffset = hoffset, median.type = median.type, whisker.type = whisker.type, na.rm = na.rm, ... ) ) } #' @rdname geom_tufteboxplot #' @usage NULL #' @format NULL #' @export #' @importFrom ggplot2 draw_key_pointrange ggproto_parent GeomBoxplot GeomSegment GeomPoint #' @importFrom scales alpha #' @importFrom grid grobTree GeomTufteboxplot <- ggplot2::ggproto("GeomTufteboxplot", ggplot2::GeomBoxplot, setup_data = function(self, data, params) { data <- ggproto_parent(GeomBoxplot, self)$setup_data(data, params) x_range <- diff(range(data$x)) y_range <- max(data$ymax) - min(data$ymin) data$hoffset <- params$hoffset * x_range data$voffset <- params$voffset * y_range data }, draw_group = function(data, panel_scales, coord, fatten = 2, outlier.colour = "black", outlier.shape = 19, outlier.size = 1.5, outlier.stroke = 0.5, varwidth = FALSE, median.type = c("point", "line"), whisker.type = c("line", "point"), hoffset = 0.01, voffset = 0.01 ) { median.type <- match.arg(median.type) whisker.type <- match.arg(whisker.type) common <- data.frame( colour = data$colour, linetype = data$linetype, fill = alpha(data$fill, data$alpha), stroke = data$stroke, shape = data$shape, group = data$group, stringsAsFactors = FALSE ) if (whisker.type == "line") { whiskers <- data.frame( x = data$x, xend = data$x, y = c(data$upper, data$lower), yend = c(data$ymax, data$ymin), size = data$size, alpha = data$alpha, common, stringsAsFactors = FALSE ) whiskers_grob <- GeomSegment$draw_panel(whiskers, panel_scales, coord) } else if (whisker.type == "point") { whiskers <- data.frame( x = data$x, y = c(data$ymin, data$ymax), size = data$size, alpha = data$alpha, common, stringsAsFactors = FALSE ) whiskers_grob <- GeomPoint$draw_panel(whiskers, panel_scales, coord) } if (median.type == "point") { middata <- data.frame( x = data$x, y = data$middle, size = data$size * data$width, alpha = data$alpha, common, stringsAsFactors = FALSE ) middle_grob <- GeomPoint$draw_panel(middata, panel_scales, coord) } else if (median.type == "line") { middata <- data.frame( y = c(data$upper, data$middle) + c(0, - data$voffset / 2), yend = c(data$middle, data$lower) + c(data$voffset / 2, 0), x = data$x + data$hoffset, xend = data$x + data$hoffset, size = data$size * data$width, alpha = data$alpha, common, stringsAsFactors = FALSE ) middle_grob <- GeomSegment$draw_panel(middata, panel_scales, coord) } if (!is.null(data$outliers) && length(data$outliers[[1]] >= 1)) { outliers <- data.frame( y = data$outliers[[1]], x = data$x[1], colour = outlier.colour %||% data$colour[1], shape = outlier.shape %||% data$shape[1], size = outlier.size %||% data$size[1], stroke = outlier.stroke %||% data$stroke[1], fill = NA, alpha = NA, stringsAsFactors = FALSE ) outliers_grob <- GeomPoint$draw_panel(outliers, panel_scales, coord) } else { outliers_grob <- NULL } ggname("geom_tufteboxplot", grobTree( outliers_grob, whiskers_grob, middle_grob )) }, draw_legend = ggplot2::draw_key_pointrange, default_aes = ggplot2::aes(weight = 1, colour = "black", fill = "grey20", size = 0.5, alpha = NA, shape = 19, stroke = 0.5, width = 1, linetype = "solid", outlier.colour = "black", outlier.shape = 19, outlier.size = 1.5, outlier.stroke = 0.5) ) ggthemes/R/stata.R0000644000176200001440000003217013774457636013546 0ustar liggesusers#' Stata color palettes (discrete) #' #' Stata color palettes. See Stata documentation for a description of #' the schemes, \url{https://www.stata.com/help.cgi?schemes}. #' #' All these palettes support up to 15 values. #' #' @param scheme \code{character}. One of \code{"s2color"}, #' \code{"s1rcolor"}, \code{"s1color"}, or \code{"mono"}. #' #' @export #' @family stata colour #' @example inst/examples/ex-stata_pal.R stata_pal <- function(scheme="s2color") { colors <- ggthemes::ggthemes_data[["stata"]][["colors"]][["schemes"]][[scheme]] max_n <- length(colors) f <- manual_pal(colors[["value"]]) attr(f, "max_n") <- max_n f } #' Stata color scales #' #' See \code{\link{stata_pal}()} for details. #' #' @inheritParams stata_pal #' @inheritParams ggplot2::scale_colour_hue #' @family colour stata #' @rdname scale_stata #' @export scale_colour_stata <- function(scheme="s2color", ...) { discrete_scale("colour", "stata", stata_pal(scheme), ...) } #' @export #' @rdname scale_stata scale_fill_stata <- function(scheme="s2color", ...) { discrete_scale("fill", "stata", stata_pal(scheme), ...) } #' @export #' @rdname scale_stata scale_color_stata <- scale_colour_stata #' @importFrom ggplot2 margin theme_stata_base <- function(base_size = 11, base_family = "sans") { ## Sizes relsz <- sapply(as.numeric(stata_gsize), `/`, y = as.numeric(stata_gsize$medium)) names(relsz) <- names(stata_gsize) theme_foundation() + theme(line = element_line(size = 0.5, linetype = 1, lineend = "butt", colour = "black"), rect = element_rect(size = 0.5, linetype = 1, fill = "white", colour = "black"), text = element_text(family = base_family, face = "plain", colour = "black", size = base_size, hjust = 0.5, vjust = 1, angle = 0, lineheight = 1, margin = margin(), debug = FALSE), title = element_text(), ## Axis axis.line = element_line(), axis.text = element_text(size = rel(relsz["medsmall"])), axis.text.x = element_text(vjust = 1), axis.text.y = element_text(angle = 90, vjust = 0.5), ## I cannot figure out how to get ggplot to do 2 levels of ticks axis.ticks = element_line(), axis.title = element_text(size = rel(relsz["medsmall"])), axis.title.x = element_text(), axis.title.y = element_text(angle = 90, vjust = 0), # axis.ticks.length = stata_gsize$tiny, # axis.ticks.margin = stata_gsize$half_tiny, axis.ticks.length = unit(4 / 11, "lines"), legend.background = element_rect(linetype = 1, size = rel(stata_linewidths[["thin"]])), legend.spacing = unit(1.2 / 100, "npc"), legend.key = element_rect(linetype = 0), legend.key.size = unit(1.2, "lines"), legend.key.height = NULL, legend.key.width = NULL, legend.text = element_text(size = rel(relsz["medsmall"])), legend.text.align = NULL, ## See textboxstyle leg_title legend.title = element_text(size = rel(relsz["large"]), hjust = 0), legend.title.align = 0.5, legend.position = "bottom", legend.direction = NULL, legend.justification = "center", legend.box = "vertical", ## plotregion panel.background = element_rect(), panel.border = element_blank(), panel.grid.major = element_line(), panel.grid.minor = element_blank(), panel.grid.major.x = element_blank(), panel.spacing = unit(0.25, "lines"), ## textboxstyle bytitle bytitle strip.background = element_rect(linetype = 0), strip.text = element_text(size = rel(relsz["medlarge"])), strip.text.x = element_text(vjust = 0.5), strip.text.y = element_text(angle = -90), plot.background = element_rect(linetype = 0, colour = NA), # Stata subtitle plot.title = element_text(size = rel(relsz["large"]), hjust = 0.5, vjust = 1), # Stata subtitle plot.subtitle = element_text(size = rel(relsz["medium"]), hjust = 0.5, vjust = 1), # Stata note plot.caption = element_text(size = rel(relsz["small"]), hjust = 0, vjust = 0), plot.margin = unit(rep(0.035, 4), "npc")) } #' @importFrom tibble deframe #' @importFrom stringr str_c theme_stata_colors <- function(scheme="s2color") { stata_colors <- ggthemes::ggthemes_data[["stata"]][["colors"]][["names"]] stata_colors <- deframe(stata_colors[, c("name", "value")]) schemes <- c("s2color", "s2mono", "s2manual", "sj", "s1color", "s1rcolor", "s1mono", "s1manual") if (scheme == "s2color") { color_plot <- stata_colors["ltbluishgray"] color_bg <- "white" color_fg <- "black" color_grid <- stata_colors["ltbluishgray"] #color_grid_major <- stata_colors["ltbluishgray"] fill_strip <- stata_colors["bluishgray"] color_strip <- NA color_title <- stata_colors["dknavy"] color_border <- NA legend_border <- "black" } else if (scheme %in% c("s2mono", "s2manual", "sj")) { color_plot <- stata_colors["gs15"] color_bg <- "white" color_fg <- "black" color_grid <- stata_colors["dimgray"] #color_grid_major <- stata_colors["dimgray"] fill_strip <- stata_colors["gs13"] color_strip <- NA color_title <- "black" color_border <- NA legend_border <- "black" } else if (scheme == "s1color") { color_plot <- "white" color_bg <- "white" color_fg <- "black" color_grid <- stata_colors["gs14"] fill_strip <- stata_colors["ltkhaki"] color_strip <- "black" color_title <- "black" color_border <- "black" legend_border <- "black" } else if (scheme == "s1rcolor") { color_plot <- "black" color_bg <- "black" color_fg <- "white" color_grid <- stata_colors["gs5"] fill_strip <- stata_colors["maroon"] color_strip <- "white" color_title <- "white" color_border <- "white" legend_border <- "black" } else if (scheme %in% c("s1mono", "s1manual")) { color_plot <- "white" color_bg <- "white" color_fg <- "black" color_grid <- stata_colors["gs14"] fill_strip <- stata_colors["gs13"] color_strip <- "black" color_title <- "black" color_border <- "black" legend_border <- "black" } else { stop(str_c("`scheme` must be one of: ", str_c(sort(schemes), collapse = ","), ", ")) } theme(line = element_line(colour = color_fg, linetype = 1), rect = element_rect(fill = color_bg, colour = color_fg, linetype = 1), text = element_text(colour = color_fg), title = element_text(colour = color_title), axis.title = element_text(colour = color_fg), axis.ticks.x = element_line(colour = color_fg), axis.ticks.y = element_line(colour = color_fg), axis.text.x = element_text(colour = color_fg), axis.text.y = element_text(colour = color_fg), legend.key = element_rect(fill = color_bg, colour = NA, linetype = 0), legend.background = element_rect(linetype = 1, colour = legend_border), panel.background = element_rect(fill = color_bg, colour = color_border, linetype = 1), panel.grid.major = element_line(colour = color_grid), strip.background = element_rect(fill = fill_strip, colour = color_strip, linetype = 1), plot.background = element_rect(fill = color_plot)) } #' Themes based on Stata graph schemes #' #' @param scheme One of "s2color", "s2mono", "s1color", #' "s1rcolor", or "s1mono", "s2manual", #' "s1manual", or "sj" #' @inheritParams ggplot2::theme_grey #' @export #' @family themes stata #' #' @details These themes approximate Stata schemes using the features #' \pkg{ggplot2}. The graphical models of Stata and ggplot2 differ #' in various ways that make an exact replication impossible (or #' more difficult than it is worth). #' Some features in Stata schemes not in ggplot2: #' defaults for specific graph types, different levels of titles, #' captions and notes. These themes also adopt some of the ggplot2 #' defaults, and more effort was made to match the colors and sizes #' of major elements than in matching the margins. #' #' @references \url{https://www.stata.com/help.cgi?schemes} #' #' @example inst/examples/ex-theme_stata.R theme_stata <- function(base_size = 11, base_family = "sans", scheme="s2color") { ## Sizes (theme_stata_base(base_size = eval(base_size), base_family = base_family) + theme_stata_colors(scheme = scheme)) } #' Stata shape palette (discrete) #' #' Shape palette based on the symbol palette in Stata used in scheme s2mono. #' This palette supports up to 10 values. #' #' @export #' @family shapes stata #' @seealso See \code{\link{scale_shape_stata}()} for examples. #' @importFrom purrr map_dfr map #' @importFrom tibble as_tibble #' @importFrom stringr str_replace stata_shape_pal <- function() { ## From s1mono, ignore small shapes shapes <- c("circle", "diamond", "square", "triangle", "X", "plus", "circle_hollow", "diamond_hollow", "square_hollow", "triangle_hollow") statadata <- ggthemes::ggthemes_data[["stata"]][["shapes"]] shapenames <- tibble::deframe(statadata[, c("symbolstyle", "unicode_value")]) values <- as.hexmode(str_replace(shapenames[shapes], "U\\+", "")) values <- -as.integer(values) out <- manual_pal(values) attr(out, "max_n") <- length(shapes) out } #' Stata shape scale #' #' See \code{\link{stata_shape_pal}()} for details. #' #' @inheritParams ggplot2::scale_x_discrete #' @family shape stata #' @export #' @example inst/examples/ex-scale_shape_stata.R #' @importFrom ggplot2 discrete_scale scale_shape_stata <- function(...) { discrete_scale("shape", "stata", stata_shape_pal(), ...) } #' Stata linetype palette (discrete) #' #' Linetype palette based on the linepattern scheme in Stata. #' This palette supports up to 15 values. #' #' @family linetype stata #' @export #' @seealso \code{\link{scale_linetype_stata}()} stata_linetype_pal <- function() { values <- ggthemes::ggthemes_data[["stata"]][["linetypes"]] f <- function(n) { values[seq_len(n)] } attr(f, "max_n") <- length(values) f } #' Stata linetype palette (discrete) #' #' See \code{\link{stata_linetype_pal}()} for details. #' #' @inheritParams ggplot2::scale_x_discrete #' @family linetype stata #' @export #' @example inst/examples/ex-scale_linetype_stata.R scale_linetype_stata <- function(...) { discrete_scale("linetype", "stata", stata_linetype_pal(), ...) } ## Text sizes (from style definitions ado/base/style/gsize-*.style) stata_gsize <- lapply(c(default = 4.1667, full = 100, half = 50, half_tiny = 0.6944, huge = 6.944, large = 4.8611, medium = 3.8194, medlarge = 4.1667, medsmall = 3.4722, miniscule = 0.3472, quarter = 25, quarter_tiny = 0.34722, small = 2.777, tenth = 10, third = 33.33333333333, third_tiny = 0.46296, tiny = 1.3888, vhuge = 9.7222, vlarge = 5.5556, vsmall = 2.0833, zero = 0) / 100, unit, units = "npc") # Line width styles ado/base/style/linewidth-*.style # original values in npc * 100 # provide this in terms of relative values to medium stata_linewidths <- c(medium = 0.3, medthick = 0.45, medthin = 0.25, none = 0, thick = 0.8, thin = 0.2, vthick = 1.4, thin = 0.15, vvthick = 2.6, vvthin = 0.01, vvvthick = 4.2, vvvthin = .000001) / 0.3 # Stata margin styles # From ado/base/style/margin-*.style stata_margins <- list(bargraph = c(3.5, 3.5, 3.5, 0), bottom = c(0, 0, 0, 3), ebargraph = c(1.5, 1.5, 1.5, 0), esubhead = c(2.2, 2.2, 0, 4), horiz_bargraph = c(0, 3.5, 3.5, 3.5), large = c(8, 8, 8, 8), left = c(3, 0, 0, 0), medium = c(3.5, 3.5, 3.5, 3.5), medlarge = c(5, 5, 5, 5), medsmall = c(2.2, 2.2, 2.2, 2.2), right = c(0, 3, 0, 0), sides = c(3.5, 3.5, 0, 0), small = rep(1.2, 4), tiny = rep(0.3, 4), top_bottom = c(0, 0, 3.5, 3.5), top = c(0, 0, 3, 0), vlarge = rep(12, 4), vsmall = rep(0.6, 4), zero = rep(0, 4)) # s1mono line # linepattern p1line solid # linepattern p2line dash # linepattern p3line vshortdash # linepattern p4line longdash_dot # linepattern p5line longdash # linepattern p6line dash_dot # linepattern p7line dot # linepattern p8line shortdash_dot # linepattern p9line tight_dot # linepattern p10line dash_dot_dot # linepattern p11line longdash_shortdash # linepattern p12line dash_3dot # linepattern p13line longdash_dot_dot # linepattern p14line shortdash_dot_dot # linepattern p15line longdash_3dot ggthemes/R/clean.R0000644000176200001440000000473113774436615013510 0ustar liggesusers#' @title Clean ggplot theme #' #' @description Clean ggplot theme with no panel background, black axis lines #' and grey fill colour for chart elements. #' #' @author Konrad Zdeb \email{name.surname@@me.com} #' #' @param base_size Base font size. #' @param base_family Base font family. #' #' @family themes #' @export #' #' @example inst/examples/ex-theme_clean.R theme_clean <- function(base_size = 12, base_family = "sans") { ( theme_foundation(base_size = base_size, base_family = base_family) + theme( axis.line.x = element_line( colour = "black", size = 0.5, linetype = "solid" ), axis.line.y = element_line( colour = "black", size = 0.5, linetype = "solid" ), axis.text = element_text(size = ceiling(base_size * 0.7), colour = "black"), axis.title = element_text(size = ceiling(base_size * 0.8)), panel.grid.minor = element_blank(), panel.grid.major.y = element_line(colour = "gray", linetype = "dotted"), panel.grid.major.x = element_blank(), panel.background = element_blank(), panel.border = element_blank(), strip.background = element_rect(linetype = 0), strip.text = element_text(), strip.text.x = element_text(vjust = 0.5), strip.text.y = element_text(angle = -90), legend.text = element_text(size = ceiling(base_size * 0.9), family = "sans"), legend.title = element_text( size = base_size, face = "bold", family = "sans" ), legend.position = "right", legend.key = element_rect(fill = "white", colour = NA), legend.background = element_rect(colour = "black"), plot.background = element_rect(colour = "black"), plot.title = element_text(size = ceiling(base_size * 1.1), face = "bold"), plot.subtitle = element_text(size = ceiling(base_size * 1.05)) ) ) } ggthemes/R/igray.R0000644000176200001440000000231013774436615013530 0ustar liggesusers#' Inverse gray theme #' #' Theme with white panel and gray background. #' #' @section Details: #' #' This theme inverts the colors in the \code{\link[ggplot2]{theme_gray}()}, a #' white panel and a light gray area around it. This keeps a white #' background for the color scales like \code{\link[ggplot2]{theme_bw}()}. But #' by using a gray background, the plot is closer to the #' typographical color of the document, which is the motivation for #' using a gray panel in \code{\link[ggplot2]{theme_gray}()}. This is #' similar to the style of plots in Stata and Tableau. #' #' @inheritParams ggplot2::theme_grey #' @export #' @family themes #' @seealso \code{\link[ggplot2]{theme_gray}()}, #' \code{\link[ggplot2]{theme_bw}()} #' @example inst/examples/ex-theme_igray.R #' @importFrom ggplot2 theme_gray theme_igray <- function(base_size = 12, base_family = "") { (theme_gray(base_size = base_size, base_family = base_family) + theme(rect = element_rect(fill = "gray90"), legend.key = element_rect(fill = "white"), panel.background = element_rect(fill = "white"), panel.grid.major = element_line(colour = "gray90"), plot.background = element_rect(fill = "gray90"))) } ggthemes/R/geom-rangeframe.R0000644000176200001440000000676113774452342015462 0ustar liggesusers#' Range Frames #' #' Axis lines which extend to the maximum and minimum of the plotted data. #' #' @section Aesthetics: #' \itemize{ #' \item colour #' \item size #' \item linetype #' \item alpha #' } #' #' @inheritParams ggplot2::geom_point #' @param sides A string that controls which sides of the plot the frames appear on. #' It can be set to a string containing any of \code{'trbl'}, for top, right, #' bottom, and left. #' @export #' #' @details This should be used with `coord_cartesian(clip="off")` in order to #' correctly draw the lines. #' #' @references Tufte, Edward R. (2001) The Visual Display of #' Quantitative Information, Chapter 6. #' #' @family geom tufte #' @importFrom ggplot2 layer #' @example inst/examples/ex-geom_rangeframe.R geom_rangeframe <- function(mapping = NULL, data = NULL, stat = "identity", position = "identity", ..., sides = "bl", na.rm = FALSE, show.legend = NA, inherit.aes = TRUE) { layer( data = data, mapping = mapping, stat = stat, geom = GeomRangeFrame, position = position, show.legend = show.legend, inherit.aes = inherit.aes, params = list( sides = sides, na.rm = na.rm, ... ) ) } #' @rdname geom_rangeframe #' @usage NULL #' @format NULL #' @export #' @importFrom ggplot2 Geom #' @importFrom scales alpha GeomRangeFrame <- ggplot2::ggproto("GeomRangeFrame", ggplot2::Geom, optional_aes = c("x", "y"), draw_panel = function(data, panel_scales, coord, sides = "bl") { rugs <- list() data <- coord[["transform"]](data, panel_scales) gp <- gpar(col = alpha(data[["colour"]], data[["alpha"]]), lty = data[["linetype"]], lwd = data[["size"]] * ggplot2::.pt) if (!is.null(data[["x"]])) { if (grepl("b", sides)) { rugs[["x_b"]] <- ggname("range_x_b", segmentsGrob(x0 = unit(min(data[["x"]]), "native"), x1 = unit(max(data[["x"]]), "native"), y0 = unit(0, "npc"), y1 = unit(0, "npc"), gp = gp)) } if (grepl("t", sides)) { rugs[["x_t"]] <- ggname("range_x_t", segmentsGrob(x0 = unit(min(data[["x"]]), "native"), x1 = unit(max(data[["x"]]), "native"), y0 = unit(1, "npc"), y1 = unit(1, "npc"), gp = gp)) } } if (!is.null(data[["y"]])) { if (grepl("l", sides)) { rugs[["y_l"]] <- ggname("range_y_l", segmentsGrob(y0 = unit(min(data[["y"]]), "native"), y1 = unit(max(data[["y"]]), "native"), x0 = unit(0, "npc"), x1 = unit(0, "npc"), gp = gp)) } if (grepl("r", sides)) { rugs[["y_r"]] <- ggname("range_y_r", segmentsGrob(y0 = unit(min(data[["y"]]), "native"), y1 = unit(max(data[["y"]]), "native"), x0 = unit(1, "npc"), x1 = unit(1, "npc"), gp = gp)) } } ggname("geom_rangeframe", gTree(children = do.call("gList", rugs))) }, default_aes = ggplot2::aes(colour = "black", size = 0.5, linetype = 1, alpha = NA), draw_key = ggplot2::draw_key_path ) ggthemes/R/theme-map.R0000644000176200001440000000150013774436615014272 0ustar liggesusers#' Clean theme for maps #' #' A clean theme that is good for displaying maps from #' \code{\link[ggplot2]{geom_map}()}. #' #' @inheritParams ggplot2::theme_grey #' @example inst/examples/ex-theme_map.R #' @export #' @importFrom ggplot2 %+replace% theme_map <- function(base_size = 9, base_family = "") { theme_bw(base_size = base_size, base_family = base_family) %+replace% theme(axis.line = element_blank(), axis.text = element_blank(), axis.ticks = element_blank(), axis.title = element_blank(), panel.background = element_blank(), panel.border = element_blank(), panel.grid = element_blank(), panel.spacing = unit(0, "lines"), plot.background = element_blank(), legend.justification = c(0, 0), legend.position = c(0, 0)) } ggthemes/R/base.R0000644000176200001440000003131613774436615013337 0ustar liggesusers#' Theme Base #' #' Theme similar to the default settings of the \sQuote{base} R graphics. #' #' @inheritParams ggplot2::theme_bw #' @export #' @family themes #' @example inst/examples/ex-theme_base.R theme_base <- function(base_size = 16, base_family = "") { theme_foundation() + theme(line = element_line(colour = "black", lineend = "round", linetype = "solid"), rect = element_rect(fill = "white", colour = "black", linetype = "solid"), text = element_text(colour = "black", face = "plain", family = base_family, size = base_size, vjust = 0.5, hjust = 0.5, lineheight = 1), panel.grid = element_blank(), strip.background = element_rect(colour = NA), legend.key = element_rect(colour = NA), title = element_text(size = rel(1)), plot.title = element_text(size = rel(1.2), face = "bold"), strip.text = element_text(), axis.ticks.length = unit(0.5, "lines") ) # TODO: get margins right } # Notes for generating a theme that uses par() for its values. # # $xlog # [1] TRUE # # $ylog # [1] TRUE # # Justification of strings in text, mtext, and title # # text = element_text(vjust = par()$adj, hjust = par$adj()) # $adj # [1] 0.5 # # $ann # [1] TRUE # # $ask # [1] FALSE # # Background. rect = element_rect(fill = par()$bg) # $bg # [1] "white" # # # Type of box drawn around the plot # # Which sides of the box to draw # $bty # [1] "o" # # # magnification of text and symbols relative to the default. ggplot uses base_size instead. # $cex # [1] 1 # # # mag of axis relative to current setting of cex # # axis.text = element_text(size = rel(par()$cex.axis)) # $cex.axis # [1] 1 # # mag of axis relative to current setting of cex # # axis.title = element_text(size = rel(par()$cex.lab)) # $cex.lab # [1] 1 # # # magnification of plot title relative to cex # # plot.title = element_text(size = rel(par()$cex.main)) # $cex.main # [1] 1.2 # # # ggplot does not have subtitles # # magnification of subtitle relative to cex # # strip.title = element_text(size = rel(par()$cex.sub)) # $cex.sub # [1] 1 # # $cin # # character size in inches # [1] 0.2000000 0.2666667 # # # default plotting color - not part of theme in gggplot # $col # [1] "black" # # # color for axis annotation # # # $col.axis # [1] "black" # # color for x and y labels # # axis.text = element_text(colour = par()$col.axis) # # # color for x and y labels # # axis.title = element_text(colour = par()$col.lab) # $col.lab # [1] "black" # # # color for main titles # # plot.title = element_text(colour = par()$col.main) # $col.main # [1] "black" # # # color for subtitles # # strip.title = element_text(colour = par()$col.sub) # $col.sub # [1] "black" # # # size of default character # $cra # [1] 14.4 19.2 # # # numerical values for how single characters rotated. Nothing similar in ggplot # $crt # [1] 0 # # # size of default characters in inches # # Is this base size? # $csi # [1] 0.2666667 # # # size of default character in user coord # # not relevant # $cxy # [1] 0.1859782 0.3665854 # # # device dimensions. not relevant # $din # [1] 11.236111 8.847222 # # # error reporting. not relevant # $err # [1] 0 # # # default font family # # base_family = par()$family # $family # [1] "" # # # color of foreground in plots. Used in axes and boxes around plots. # line = element_line(colour = par()$fg) # rect = element_rect(colour = par()$fg) # text = = element_text(colour = par()$fg) # $fg # [1] "black" # # # gives NDC coordinates of figure region in display device # $fig # [1] 0 1 0 1 # # # figure region dimensions in inches # # TODO: use for aspect ratio? # $fin # [1] 11.236111 8.847222 # # # which font to use for text. # # 1 = "plain" # # 2 = "bold" # # 3 = "italic" # # 4 = "bold.italic" # text = element_text(face = c("plain", "bold", "italic", "bold.italic")[par()$font]) # $font # [1] 1 # # # font to use for axis # axis.text = element_text(face = c("plain", "bold", "italic", "bold.italic")[par()$font]) # $font.axis # [1] 1 # # axis.title = element_text(face = c("plain", "bold", "italic", "bold.italic")[par()$font]) # $font.lab # [1] 1 # # axis.title = element_text(face = c("plain", "bold", "italic", "bold.italic")[par()$font]) # $font.main # [1] 2 # # strip.title = element_text(face = c("plain", "bold", "italic", "bold.italic")[par()$font]) # $font.sub # [1] 1 # # # default number of tick-marks in x and y, and label lenghth. # Not sure how that can be used # $lab # [1] 5 5 7 # # # style of axis labels. # # TODO: code that sets axis.text.x and axis.text.y angle according to its values. # $las # [1] 0 # # # line end style # line = element_line(lineend = par()$lend) # $lend # [1] "round" # # # line height # text = element_text(lineheight = par()$lheight * par()$??) # $lheight # [1] 1 # # # Line join style # # not sure how this is used in ggplot # $ljoin # [1] "round" # # # line mitre imit. Not used in ggplot2. # $lmitre # [1] 10 # # # Line type # # line = element_line(linetype = par()$lty) # $lty # [1] "solid" # # # Line width? # # Does this set size? ?? # # Maybe: line = element_line(size = par()$lwd) # $lwd # [1] 1 # # # margin size in inches # plot.margin = par()$mai # $mai # [1] 1.360000 1.093333 1.093333 0.560000 # # # Number of lines of margin. How is this different than mai? # $mar # [1] 5.1 4.1 4.1 2.1 # # $mex # [1] 1 # # # changes layout. ggplot uses facets. # $mfcol # [1] 1 1 # # # used for layout # $mfg # [1] 1 1 1 1 # # # changes layout. ggplot uses facets. # $mfrow # [1] 1 1 # # # margine line in mex units for axis title, axis labels, and axis.line # $mgp # [1] 3 1 0 # # # ignored in R # $mkh # [1] 0.001 # # # irrelevant to ggplot # $new # [1] FALSE # # # size of outer margins in lines of text # # TODO: what is this in ggplot # $oma # [1] 0 0 0 0 # # # regions inside out margins in NDC # # TODO: ? # $omd # [1] 0 1 0 1 # # # size of outer margins in inches # # TODO??? # $omi # [1] 0 0 0 0 # # # irrelevant # $page # [1] TRUE # # # dfault plotting symbol. not in themes. # $pch # [1] 1 # # # Plot dimensions in inches. # $pin # [1] 9.582778 6.393889 # # # Plot region as fractions of current figure region. # $plt # [1] 0.09730532 0.95016069 0.15372057 0.87642072 # # # point size of text (not symbols) # base_size = par()$ps # $ps # [1] 16 # # # type of region to be drawn. s = square. m = maximal. # # not sure how this maps to ggplot # $pty # [1] "m" # # # not used # $smo # [1] 1 # # # string rotation in degrees # # this is for text() plots not titles and labels # $srt # [1] 0 # # # length of tick marks # # use this to set axis.ticks.length # $tck # [1] NA # # # length of tick marks # $tcl # [1] -0.5 # # # extremes of user coord of plotting regsion # $usr # [1] -0.0381697 0.9924122 0.2730712 1.0279588 # # # used for generating ticks # $xaxp # [1] 1 10 3 # # # used to generate axis # $xaxs # [1] "r" # # # any values other than "n" implies plotting x axis. # $xaxt # [1] "s" # # $xpd # [1] FALSE # # $yaxp # [1] 2 10 -4 # # $yaxs # [1] "r" # # # any value other than "n" implies plotting y axis. # $yaxt # [1] "s" # # # positioning of text in margins by axis and mtext. # $ylbias # [1] 0.2 # #' Theme Par #' #' Theme which uses the current \sQuote{base} graphics parameter values #' from \code{\link[graphics]{par}()}. #' Not all \code{par()} parameters, are supported, and not all are relevant to #' \pkg{ggplot2} themes. #' #' Currently this theme uses the values of the parameters: #' \code{"code"}, "\code{"ps"}", \code{"code"} \code{"family"}, \code{"fg"}, #' \code{"bg"}, \code{"adj"}, \code{"font"}, \code{"cex.axis"}, #' \code{"cex.lab"}, \code{"cex.main"}, \code{"cex.sub"}, \code{"col.axis"}, #' \code{"col.lab"}, \code{"col.main"}, \code{"col.sub"}, \code{"font"}, #' \code{"font.axis"}, \code{"font.lab"}, \code{"font.main"}, #' \code{"font.sub"}, \code{"las"}, \code{"lend"}, #' \code{"lheight"}, \code{"lty"}, \code{"mar"}, \code{"ps"}, \code{"tcl"}, #' \code{"tck"}, \code{"xaxt"}, \code{"yaxt"}. #' #' This theme does not translate the base graphics perfectly, so the graphs #' produced by it will not be identical to those produced by base graphics, #' most notably in the spacing of the margins. #' #' @inheritParams ggplot2::theme_bw #' @export #' @family themes #' @example inst/examples/ex-theme_par.R theme_par <- function(base_size = par()$ps, base_family = par()$family) { faces <- c("plain", "bold", "italic", "bold.italic") half_line <- base_size / 2 thm <- theme_foundation() %+replace% theme(line = element_line(colour = par()$fg, size = 0.5, lineend = par()$lend, linetype = par()$lty), rect = element_rect(fill = par()$bg, colour = par()$fg, size = 0.5, linetype = par()$lty), text = element_text(colour = par()$fg, face = faces[par()$font], family = base_family, size = base_size, angle = 0, margin = margin(), vjust = par()$adj, hjust = par()$adj, lineheight = par()$lheight, debug = FALSE), axis.title = element_text(size = rel(par()$cex.lab), colour = par()$col.lab, face = faces[par()$font.lab]), axis.text = element_text(size = rel(par()$cex.axis), colour = par()$col.axis, face = faces[par()$font.axis]), axis.text.x = element_text(margin = margin(t = 0.8 * half_line / 2, b = 0.8 * half_line / 2)), axis.text.y = element_text(margin = margin(r = 0.8 * half_line / 2, l = 0.8 * half_line / 2)), axis.ticks = element_line(colour = par()$fg), legend.title = element_text(colour = par()$fg), legend.text = element_text(colour = par()$fg), legend.spacing = unit(0.2, "cm"), legend.key = element_rect(colour = NA), panel.spacing = unit(half_line, "pt"), panel.spacing.x = NULL, panel.spacing.y = NULL, panel.background = element_rect(fill = NA, colour = par()$col), panel.grid = element_blank(), plot.background = element_rect(colour = NA), plot.margin = unit(par()$mar, "lines"), plot.title = element_text(size = rel(par()$cex.main), face = faces[par()$font.main], colour = par()$col.main, margin = margin(b = half_line * 1.2)), strip.text = element_text(size = rel(par()$cex.sub), face = faces[par()$font.sub], colour = par()$col.sub), strip.text.x = element_text(margin = margin(t = half_line, b = half_line)), strip.text.y = element_text(margin = margin(l = half_line, r = half_line)), strip.background = element_rect(colour = NA) ) las <- par()$las if (las == 0) { # parallel to axis thm <- thm + theme(axis.title.x = element_text(angle = 0), axis.title.y = element_text(angle = 90)) } else if (las == 1) { # horizontal thm <- thm + theme(axis.title.x = element_text(angle = 0), axis.title.y = element_text(angle = 0)) } else if (las == 2) { # perpendicular thm <- thm + theme(axis.title.x = element_text(angle = 90), axis.title.y = element_text(angle = 0)) } else if (las == 3) { # vertical thm <- thm + theme(axis.title.x = element_text(angle = 90), axis.title.y = element_text(angle = 90)) } # ticks if (! is.na(par()$tck)) { thm <- thm + theme(axis.ticks.length = unit(- par()$tck, "snpc")) } else { thm <- thm + theme(axis.ticks.length = unit(- par()$tcl, "lines")) } # plot x or y axis if (par()$xaxt == "n") { thm <- thm + theme(axis.line.x = element_blank(), axis.text.x = element_blank(), axis.ticks.x = element_blank()) } if (par()$yaxt == "n") { thm <- thm + theme(axis.line.y = element_blank(), axis.text.y = element_blank(), axis.ticks.y = element_blank()) } thm # TODO: get margins right } ggthemes/R/ptol.R0000644000176200001440000000256513774436615013407 0ustar liggesusers#' Color Palettes from Paul Tol's "Colour Schemes" #' #' Qualitative color palettes from Paul Tol, #' \href{https://personal.sron.nl/~pault/}{"Colour Schemes"}. #' #' Incorporation of the palette into an R package was originally inspired by #' Peter Carl's [Paul Tol 21 Gun Salute](https://tradeblotter.wordpress.com/2013/02/28/the-paul-tol-21-color-salute/) #' #' @export #' @family colour ptol #' @references #' Paul Tol. 2012. "Colour Schemes." SRON Technical Note, SRON/EPS/TN/09-002. #' \url{https://personal.sron.nl/~pault/data/colourschemes.pdf} #' @example inst/examples/ex-ptol_pal.R ptol_pal <- function() { colors <- ggthemes::ggthemes_data[["ptol"]][["qualitative"]] max_n <- length(colors) f <- function(n) { check_pal_n(n, max_n) colors[[n]] } attr(f, "max_n") <- max_n f } #' Color Scales from Paul Tol's "Colour Schemes #' #' See \code{\link{ptol_pal}()}. These palettes support up to 12 values. #' #' @inheritParams ggplot2::scale_colour_hue #' @inheritParams ptol_pal #' @family colour ptol #' @rdname scale_ptol #' @export #' @example inst/examples/ex-scale_colour_ptol.R scale_colour_ptol <- function(...) { discrete_scale("colour", "ptol", ptol_pal(), ...) } #' @export #' @rdname scale_ptol scale_color_ptol <- scale_colour_ptol #' @export #' @rdname scale_ptol scale_fill_ptol <- function(...) { discrete_scale("fill", "ptol", ptol_pal(), ...) } ggthemes/R/fivethirtyeight.R0000644000176200001440000000475713777020616015645 0ustar liggesusers#' Theme inspired by FiveThirtyEight plots #' #' Theme inspired by the plots on #' \href{https://fivethirtyeight.com}{FiveThirtyEight}. #' #' @inheritParams ggplot2::theme_grey #' @family themes fivethirtyeight #' @export #' @example inst/examples/ex-theme_fivethirtyeight.R #' @importFrom grid unit theme_fivethirtyeight <- function(base_size = 12, base_family = "sans") { colors <- deframe(ggthemes::ggthemes_data[["fivethirtyeight"]]) (theme_foundation(base_size = base_size, base_family = base_family) + theme( line = element_line(colour = "black"), rect = element_rect(fill = colors["Light Gray"], linetype = 0, colour = NA), text = element_text(colour = colors["Dark Gray"]), axis.title = element_blank(), axis.text = element_text(), axis.ticks = element_blank(), axis.line = element_blank(), legend.background = element_rect(), legend.position = "bottom", legend.direction = "horizontal", legend.box = "vertical", panel.grid = element_line(colour = NULL), panel.grid.major = element_line(colour = colors["Medium Gray"]), panel.grid.minor = element_blank(), # unfortunately, can't mimic subtitles TODO! plot.title = element_text(hjust = 0, size = rel(1.5), face = "bold"), plot.margin = unit(c(1, 1, 1, 1), "lines"), strip.background = element_rect())) } #' FiveThirtyEight color palette #' #' The standard three-color FiveThirtyEight palette for line plots comprises #' blue, red, and green. #' #' @family colour fivethirtyeight #' @export #' @example inst/examples/ex-fivethirtyeight_pal.R fivethirtyeight_pal <- function() { colors <- deframe(ggthemes::ggthemes_data[["fivethirtyeight"]]) values <- unname(colors[c("Blue", "Red", "Green")]) max_n <- length(values) f <- manual_pal(values) attr(f, "max_n") <- max_n f } #' FiveThirtyEight color scales #' #' Color scales using the colors in the FiveThirtyEight graphics. #' #' @inheritParams ggplot2::scale_colour_hue #' @family colour fivethirtyeight #' @rdname scale_fivethirtyeight #' @seealso \code{\link{theme_fivethirtyeight}()} for examples. #' @export scale_colour_fivethirtyeight <- function(...) { discrete_scale("colour", "economist", fivethirtyeight_pal(), ...) } #' @rdname scale_fivethirtyeight #' @export scale_color_fivethirtyeight <- scale_colour_fivethirtyeight #' @rdname scale_fivethirtyeight #' @export scale_fill_fivethirtyeight <- function(...) { discrete_scale("fill", "economist", fivethirtyeight_pal(), ...) } ggthemes/R/hc.R0000644000176200001440000000701213775062642013007 0ustar liggesusers#' Highcharts Theme #' #' Theme based on \href{https://www.highcharts.com/}{Highcharts} plots. #' #' @references #' #' \url{https://www.highcharts.com/demo/line-basic} #' #' @inheritParams ggplot2::theme_bw #' @param style The Highcharts theme to use \code{'default'}, #' \code{'darkunica'}. #' @param bgcolor Deprecated #' @example inst/examples/ex-theme_hc.R #' @family themes hc #' @export theme_hc <- function(base_size = 12, base_family = "sans", style = c("default", "darkunica"), bgcolor = NULL) { if (!is.null(bgcolor)) { warning("`bgcolor` is deprecated. Use `style` instead.") style <- bgcolor } style <- match.arg(style) bgcolor <- switch(style, default = "#FFFFFF", "darkunica" = "#2a2a2b") ret <- theme(rect = element_rect(fill = bgcolor, linetype = 0, colour = NA), text = element_text(size = base_size, family = base_family), title = element_text(hjust = 0.5), axis.title.x = element_text(hjust = 0.5), axis.title.y = element_text(hjust = 0.5), panel.grid.major.y = element_line(colour = "#D8D8D8"), panel.grid.minor.y = element_blank(), panel.grid.major.x = element_blank(), panel.grid.minor.x = element_blank(), panel.border = element_blank(), panel.background = element_blank(), legend.position = "bottom", legend.key = element_rect(fill = "#FFFFFF00")) if (style == "darkunica") { ret <- (ret + theme(rect = element_rect(fill = bgcolor), text = element_text(colour = "#A0A0A3"), title = element_text(colour = "#FFFFFF"), axis.title.x = element_text(colour = "#A0A0A3"), axis.title.y = element_text(colour = "#A0A0A3"), panel.grid.major.y = element_line(colour = "#707073"), legend.title = element_text(colour = "#A0A0A3"))) } ret } #' Highcharts color palette (discrete) #' #' The Highcharts uses many different color palettes in its #' plots. This collects a few of them. #' #' @section Palettes: #' #' The following palettes are defined, #' #' \itemize{ #' \item{\href{https://www.highcharts.com/demo}{default}} #' \item{\href{https://www.highcharts.com/demo/line-basic/dark-unica}{dark-unica}} #' } #' #' @param palette \code{character} The name of the Highcharts theme to use. #' #' @family colour hc #' @export hc_pal <- function(palette = "default") { if (palette %in% names(ggthemes::ggthemes_data$hc)) { manual_pal(unname(ggthemes::ggthemes_data$hc[[palette]])) } else { stop("Palette `", palette, "` not valid. Must be one of ", stringr::str_c("`", names(ggthemes::ggthemes_data$hc), "`", collapse = ", "), call. = FALSE) } } #' Highcharts color and fill scales #' #' Colour and fill scales which use the palettes in #' \code{\link{hc_pal}()} and are meant for use with #' \code{\link{theme_hc}()}. #' #' @inheritParams ggplot2::scale_colour_hue #' @inheritParams hc_pal #' @family colour hc #' @rdname scale_hc #' @export scale_colour_hc <- function(palette = "default", ...) { discrete_scale("colour", "hc", hc_pal(palette), ...) } #' @rdname scale_hc #' @export scale_color_hc <- scale_colour_hc #' @rdname scale_hc #' @export scale_fill_hc <- function(palette = "default", ...) { discrete_scale("fill", "hc", hc_pal(palette), ...) } ggthemes/R/excel.R0000644000176200001440000001356713774436615013535 0ustar liggesusers#' Excel 97 ugly color palettes (discrete) #' #' The color palettes used in Microsoft Excel 97 (and up until Excel 2007). #' Use this for that classic ugly look and feel. For ironic purposes only. #' 3D bars and pies not included. Please never use this color palette. #' #' @param line If \code{TRUE}, use the palette for lines and points. Otherwise, #' use the palette for area. #' @family colour excel #' @export #' @example inst/examples/ex-excel_pal.R excel_pal <- function(line = TRUE) { if (line[[1]]) { manual_pal(ggthemes::ggthemes_data$excel$classic$line) } else { manual_pal(ggthemes::ggthemes_data$excel$classic$fill) } } #' Excel (current versions) color palettes (discrete) #' #' Color palettes used by current versions of Microsoft Office and Excel. #' #' @param theme The name of the Office theme or color theme #' (not to be confused with ggplot2 themes) from which to derive the color #' palette. Available themes include: #' \Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$excel$themes))} #' @family colour excel #' @example inst/examples/ex-excel_new_pal.R #' @export excel_new_pal <- function(theme = "Office Theme") { allthemes <- ggthemes::ggthemes_data$excel$themes if (!theme %in% names(allthemes)) { stop("`theme` must be one of ", paste0(names(allthemes), collapse = ", ")) } values <- unname(allthemes[[theme]][["accents"]]) f <- manual_pal(values) attr(f, "max_n") <- length(values) f } #' Excel 97 ugly color scales #' #' The classic "ugly" color scales from Excel 97. #' #' @inheritParams excel_pal #' @inheritParams ggplot2::scale_colour_hue #' @family colour excel #' @rdname scale_excel #' @export #' @example inst/examples/ex-theme_excel.R scale_fill_excel <- function(...) { discrete_scale("fill", "excel", excel_pal(line = FALSE), ...) } #' @export #' @rdname scale_excel scale_colour_excel <- function(...) { discrete_scale("colour", "excel", excel_pal(line = TRUE), ...) } #' @export #' @rdname scale_excel scale_color_excel <- scale_colour_excel #' Excel (current versions) color scales #' #' Discrete color scales used in current versions of Microsoft Office and Excel. #' #' @inheritParams excel_new_pal #' @inheritParams ggplot2::scale_colour_hue #' @family colour excel #' @rdname scale_excel_new #' @example inst/examples/ex-theme_excel_new.R #' @export scale_colour_excel_new <- function(theme = "Office Theme", ...) { discrete_scale("colour", "excel_new", excel_new_pal(theme), ...) } #' @export #' @rdname scale_excel_new scale_color_excel_new <- scale_colour_excel_new #' @export #' @rdname scale_excel_new scale_fill_excel_new <- function(theme = "Office Theme", ...) { discrete_scale("fill", "excel_new", excel_new_pal(theme), ...) } #' ggplot theme based on old Excel plots #' #' Theme to replicate the ugly monstrosity that was the old #' gray-background Excel chart. Please never use this. #' This theme should be combined with the \code{\link{scale_colour_excel}()} #' color scale. #' #' @inheritParams ggplot2::theme_grey #' @param horizontal \code{logical}. Horizontal axis lines? #' @return An object of class \code{\link[ggplot2]{theme}()}. #' @export #' @family themes excel #' @example inst/examples/ex-theme_excel.R theme_excel <- function(base_size = 12, base_family = "", horizontal = TRUE) { gray <- "#C0C0C0" ret <- (theme_bw() + theme(panel.background = element_rect(fill = gray), panel.border = element_rect(colour = "black", linetype = 1), panel.grid.major = element_line(colour = "black"), panel.grid.minor = element_blank(), legend.key = element_rect(colour = NA), legend.background = element_rect(colour = "black", linetype = 1), strip.background = element_rect(fill = "white", colour = NA, linetype = 0))) if (horizontal) { ret <- ret + theme(panel.grid.major.x = element_blank()) } else { ret <- ret + theme(panel.grid.major.y = element_blank()) } ret } #' ggplot theme similar to current Excel plot defaults #' #' Theme for ggplot2 that is similar to the default style of charts in #' current versions of Microsoft Excel. #' #' @inheritParams ggplot2::theme_grey #' @return An object of class \code{\link[ggplot2]{theme}()}. #' @export #' @family themes excel #' @example inst/examples/ex-theme_excel_new.R #' theme_excel_new <- function(base_size = 9, base_family = "sans") { colorlist <- list(lt_gray = "#D9D9D9", gray = "#BFBFBF", dk_gray = "#595959") theme_bw(base_family = base_family, base_size = base_size) + theme( text = element_text( colour = colorlist$dk_gray, size = base_size ), line = element_line( linetype = "solid", colour = colorlist$gray ), rect = element_rect( linetype = 0, colour = "white" ), panel.grid.major = element_line( linetype = "solid", colour = colorlist$gray, size = 0.75 * PT_TO_MM ), panel.grid.minor = element_blank(), axis.title = element_blank(), axis.text = element_text( colour = colorlist$dk_gray, size = 9 ), strip.background = element_rect( fill = NA ), strip.text = element_text( colour = colorlist$dk_gray, size = 9 ), axis.ticks = element_blank(), panel.background = element_blank(), panel.border = element_rect(colour = NA), title = element_text( face = "plain", hjust = 0.5 ), plot.title = element_text( size = 14, hjust = 0.5 ), plot.subtitle = element_blank(), legend.position = "bottom", legend.text = element_text( size = 9, colour = colorlist$dk_gray ), legend.title = element_blank(), ) } ggthemes/R/colorblind.R0000644000176200001440000000216113777021514014537 0ustar liggesusers#' Colorblind Color Palette (Discrete) and Scales #' #' An eight-color colorblind safe qualitative discrete palette. #' #' @rdname colorblind #' @references #' Chang, W. "\href{http://www.cookbook-r.com/Graphs/Colors_(ggplot2)/#a-colorblind-friendly-palette}{Cookbook for R}" #' #' \verb{https://jfly.iam.u-tokyo.ac.jp/color} #' #' @export #' @inheritParams ggplot2::scale_colour_hue #' @family colour #' @seealso The \pkg{dichromat} package, \code{\link[scales]{dichromat_pal}()}, #' and \code{\link{scale_color_tableau}()} for other colorblind palettes. #' @example inst/examples/ex-colorblind.R colorblind_pal <- function() { values <- unname(ggthemes::ggthemes_data[["colorblind"]][["value"]]) f <- manual_pal(values) attr(f, "max_n") <- length(values) f } #' @rdname colorblind #' @export scale_colour_colorblind <- function(...) { discrete_scale("colour", "colorblind", colorblind_pal(), ...) } #' @rdname colorblind #' @export scale_color_colorblind <- scale_colour_colorblind #' @rdname colorblind #' @export scale_fill_colorblind <- function(...) { discrete_scale("fill", "colorblind", colorblind_pal(), ...) } ggthemes/R/solarized.R0000644000176200001440000001401713774461357014421 0ustar liggesusers#' Base colors for Solarized light and dark themes #' #' @param light \code{logical} Light theme? #' #' Creates the base colors for a light or dark solarized theme. See #' \url{https://ethanschoonover.com/solarized/}. This function is a port #' of the CSS style example. #' #' @keywords internal solarized_rebase <- function(light = TRUE) { basecolors <- deframe(ggthemes::ggthemes_data$solarized$Base) rebase <- if (light) { basecolors[c(paste0("base", 3:0), paste0("base0", 0:3))] } else { basecolors[c(paste0("base0", 3:0), paste0("base", 0:3))] } names(rebase) <- paste0("rebase", c(paste0("0", 3:0), 0:3)) rebase } solarized_accent_list <- function() { paste0("\\code{\"", names(ggthemes::ggthemes_data$solarized$Accents), "\"}", collapse = ",") } #' Solarized color palette (discrete) #' #' Qualitative color palate based on the Ethan Schoonover's Solarized #' palette, \url{https://ethanschoonover.com/solarized/}. This palette supports #' up to seven values. #' #' @note #' #' For a given starting color and number of colors in the palette, #' the other colors are the combination of colors that maximizes the #' total Euclidean distance between colors in L*a*b space. #' #' @param accent \code{character} Starting color. #' @export #' @family solarized colour #' @example inst/examples/ex-solarized_pal.R solarized_pal <- function(accent = "blue") { palettes <- ggthemes::ggthemes_data[["solarized"]][["palettes"]][[accent]] max_n <- length(palettes) f <- function(n) { check_pal_n(n, max_n) palettes[[n]] } attr(f, "max_n") <- f f } #' Solarized color scales #' #' See \code{\link{solarized_pal}()} for details. #' #' @inheritParams ggplot2::scale_colour_hue #' @inheritParams solarized_pal #' @family colour scales #' @rdname scale_solarized #' @family solarized colour #' @export #' @example inst/examples/ex-scale_solarized.R scale_fill_solarized <- function(accent = "blue", ...) { discrete_scale("fill", "solarized", solarized_pal(accent), ...) } #' @export #' @rdname scale_solarized scale_colour_solarized <- function(accent = "blue", ...) { discrete_scale("colour", "solarized", solarized_pal(accent), ...) } #' @export #' @rdname scale_solarized scale_color_solarized <- scale_colour_solarized #' ggplot color themes based on the Solarized palette #' #' See \url{https://ethanschoonover.com/solarized/} for a #' description of the Solarized palette. #' #' Plots made with this theme integrate seamlessly with the Solarized #' Beamer color theme. #' \url{https://github.com/jrnold/beamercolorthemesolarized}. #' There are two variations: \code{theme_solarized} is similar to #' to \code{\link[ggplot2]{theme_bw}()}, while \code{theme_solarized_2()} is #' similar to \code{\link[ggplot2]{theme_gray}()}. #' #' @rdname theme_solarized #' @inheritParams ggplot2::theme_grey #' @param light \code{logical}. Light or dark theme? #' @export #' @family themes solarized #' @example inst/examples/ex-theme_solarized.R theme_solarized <- function(base_size = 12, base_family = "", light = TRUE) { rebase <- solarized_rebase(light) ret <- (theme_bw(base_size = base_size, base_family = base_family) + theme(text = element_text(colour = rebase["rebase01"]), title = element_text(color = rebase["rebase0"]), line = element_line(color = rebase["rebase01"]), rect = element_rect(fill = rebase["rebase03"], color = rebase["rebase01"]), axis.ticks = element_line(color = rebase["rebase01"]), axis.line = element_line(color = rebase["rebase01"], linetype = 1), legend.background = element_rect(fill = NULL, color = NA), legend.key = element_rect(fill = NULL, colour = NULL, linetype = 0), panel.background = element_rect(fill = rebase["rebase03"], colour = rebase["rebase01"]), panel.border = element_blank(), panel.grid = element_line(color = rebase["rebase02"]), panel.grid.major = element_line(color = rebase["rebase02"]), panel.grid.minor = element_line(color = rebase["rebase02"]), plot.background = element_rect(fill = NULL, colour = NA, linetype = 0))) ret } #' @rdname theme_solarized #' @export theme_solarized_2 <- function(base_size = 12, base_family = "", light = TRUE) { rebase <- solarized_rebase(light) ret <- (theme_foundation(base_size = base_size, base_family = base_family) + theme(text = element_text(color = rebase["rebase01"]), title = element_text(color = rebase["rebase0"]), line = element_line(color = rebase["rebase01"]), rect = element_rect(fill = rebase["rebase03"], color = NA), axis.ticks = element_line(color = rebase["rebase01"]), axis.line = element_line(color = rebase["reabase01"], linetype = 1), axis.title.y = element_text(angle = 90), legend.background = element_rect(fill = NULL, color = NA), legend.key = element_rect(fill = NULL, colour = NULL, linetype = 0), panel.background = element_rect(fill = rebase["rebase02"], colour = NA), panel.border = element_blank(), panel.grid = element_line(color = rebase["rebase03"]), panel.grid.major = element_line(color = rebase["rebase03"]), panel.grid.minor = element_line(color = rebase["rebase03"], size = 0.25), plot.background = element_rect(fill = NULL, colour = NULL, linetype = 0))) ret } ggthemes/R/wsj.R0000644000176200001440000001067713777021227013227 0ustar liggesusers#' Wall Street Journal theme #' #' Theme based on the plots in \emph{The Wall Street Journal}. #' #' This theme should be used with \code{\link{scale_color_wsj}()}. #' #' @references #' #' \url{https://twitter.com/WSJGraphics} #' #' \url{https://pinterest.com/wsjgraphics/wsj-graphics/} #' #' @inheritParams ggplot2::theme_grey #' @param color The background color of plot. One of \code{'brown', #' 'gray', 'green', 'blue'}. #' @param title_family Plot title font family. #' @family themes wsj #' @example inst/examples/ex-theme_wsj.R #' @export #' @importFrom ggplot2 element_line element_rect element_text element_blank rel theme_wsj <- function(base_size = 12, color = "brown", base_family = "sans", title_family = "mono") { colorhex <- ggthemes::ggthemes_data$wsj$bg[color] theme_foundation(base_size = base_size, base_family = base_family) + theme(line = element_line(linetype = 1, colour = "black"), rect = element_rect(fill = colorhex, linetype = 0, colour = NA), text = element_text(colour = "black"), title = element_text(family = title_family, size = rel(2)), axis.title = element_blank(), axis.text = element_text(face = "bold", size = rel(1)), axis.text.x = element_text(colour = NULL), axis.text.y = element_text(colour = NULL), axis.ticks = element_line(colour = NULL), axis.ticks.y = element_blank(), axis.ticks.x = element_line(colour = NULL), axis.line = element_line(), axis.line.y = element_blank(), legend.background = element_rect(), legend.position = "top", legend.direction = "horizontal", legend.box = "vertical", panel.grid = element_line(colour = NULL, linetype = 3), panel.grid.major = element_line(colour = "black"), panel.grid.major.x = element_blank(), panel.grid.minor = element_blank(), plot.title = element_text(hjust = 0, face = "bold"), plot.margin = unit(c(1, 1, 1, 1), "lines"), strip.background = element_rect()) } #' Wall Street Journal color palette (discrete) #' #' The Wall Street Journal uses many different color palettes in its #' plots. This collects a few of them, but is by no means exhaustive. #' Collections of these plots can be found on the WSJ Graphics #' \href{https://twitter.com/WSJGraphics}{Twitter} feed and #' \href{https://pinterest.com/wsjgraphics/wsj-graphics/}{Pinterest}. #' #' @section Palettes: #' #' The following palettes are defined, #' #' \describe{ #' \item{rgby}{Red/Green/Blue/Yellow theme. #' Examples: \url{https://twitpic.com/b2e3v2}. Up to four values.} #' \item{red_green}{Green/red two-color scale for good/bad. Examples: #' \url{https://twitpic.com/b1avj6}, \url{https://twitpic.com/a4kxcl}.} #' \item{green_black}{Black-green 4-color scale for 'Very negative', #' 'Somewhat negative', 'somewhat positive', 'very positive'. #' Examples: \url{https://twitpic.com/awbua0}.} #' \item{dem_rep}{Democrat/Republican/Undecided blue/red/gray scale. #' Examples: \url{https://twitpic.com/awbua0}.} #' \item{colors6}{Red, blue, gold, green, orange, and black palette. #' Examples: \url{https://twitpic.com/9gfg5q}.} #' } #' #' @param palette \code{character} The color palette to use: . #' \Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$wsj$palettes))} #' #' @family colour wsj #' @export wsj_pal <- function(palette = "colors6") { palettes <- ggthemes::ggthemes_data[["wsj"]][["palettes"]] if (palette %in% names(palettes)) { colors <- palettes[[palette]][["value"]] max_n <- length(colors) f <- manual_pal(unname(colors)) attr(f, "max_n") <- max_n f } else { stop(sprintf("palette %s not a valid palette.", palette)) } } #' Wall Street Journal color and fill scales #' #' Colour and fill scales which use the palettes in \code{\link{wsj_pal}()}. #' These scales should be used with \code{\link{theme_wsj}()}. #' #' @inheritParams ggplot2::scale_colour_hue #' @inheritParams wsj_pal #' @family colour wsj #' @rdname scale_wsj #' @export scale_colour_wsj <- function(palette = "colors6", ...) { discrete_scale("colour", "wsj", wsj_pal(palette), ...) } #' @rdname scale_wsj #' @export scale_color_wsj <- scale_colour_wsj #' @rdname scale_wsj #' @export scale_fill_wsj <- function(palette = "colors6", ...) { discrete_scale("fill", "wsj", wsj_pal(palette), ...) } ggthemes/R/ggthemes-package.R0000644000176200001440000000107113774436615015614 0ustar liggesusers#' ggthemes #' #' This package contains extra themes, scales, and geoms, and #' functions for and related to \pkg{ggplot2}. See #' \url{https://jrnold.github.io/ggthemes/} for documentation. #' #' @name ggthemes #' @docType package #' @importFrom ggplot2 ggplot theme ggproto aes draw_key_path #' @importFrom grid grobTree grobName gTree gList segmentsGrob gpar #' @importFrom scales manual_pal div_gradient_pal seq_gradient_pal #' @importFrom graphics abline axis text points #' @importFrom methods hasArg as #' @importFrom graphics par NULL globalVariables(".data") ggthemes/R/pander.R0000644000176200001440000002262013777021275013667 0ustar liggesusers#' A ggplot theme originated from the pander package #' #' The \pkg{pander} ships with a default theme when the 'unify plots' option is #' enabled via \code{panderOptions}, which is now also available outside of \pkg{pander} internals, like \code{evals}, \code{eval.msgs} or \code{Pandoc.brew}. #' @inheritParams ggplot2::theme_bw #' @param nomargin suppress the white space around the plot (boolean) #' @param ff font family, like \code{sans}. Deprecated: use \code{base_family} instead. #' @param fc font color (name or hexa code) #' @param fs font size (integer). Deprecated: use \code{base_size} instead. #' @param gM major grid (boolean) #' @param gm minor grid (boolean) #' @param gc grid color (name or hexa code) #' @param gl grid line type (\code{lty}) #' @param boxes to render a border around the plot or not #' @param bc background color (name or hexa code) #' @param pc panel background color (name or hexa code) #' @param lp legend position #' @param axis axis angle as defined in \code{par(les)} #' @export #' @example inst/examples/ex-theme_pander.R theme_pander <- function(base_size = 12, base_family = "sans", nomargin = TRUE, ff = NULL, fc = "black", fs = NULL, gM = TRUE, gm = TRUE, gc = "grey", gl = "dashed", boxes = FALSE, bc = "white", pc = "transparent", lp = "right", axis = 1) { if (hasArg(ff)) { base_family <- ff warning("Argument `ff` deprecated. Use `base_family` instead.") } if (hasArg(fs)) { base_size <- fs warning("Argument `fs` deprecated. Use `base_size` instead.") } if (requireNamespace("pander", quietly = TRUE)) { if (missing(nomargin)) nomargin <- pander::panderOptions("graph.nomargin") if (missing(base_family)) base_family <- pander::panderOptions("graph.fontfamily") if (missing(fc)) fc <- pander::panderOptions("graph.fontcolor") if (missing(base_size)) base_size <- pander::panderOptions("graph.fontsize") if (missing(gM)) gM <- pander::panderOptions("graph.grid") if (missing(gm)) gm <- pander::panderOptions("graph.grid.minor") if (missing(gc)) gc <- pander::panderOptions("graph.grid.color") if (missing(gl)) gl <- pander::panderOptions("graph.grid.lty") if (missing(boxes)) boxes <- pander::panderOptions("graph.boxes") if (missing(bc)) bc <- pander::panderOptions("graph.background") if (missing(pc)) pc <- pander::panderOptions("graph.panel.background") if (missing(lp)) lp <- pander::panderOptions("graph.legend.position") if (missing(axis)) axis <- pander::panderOptions("graph.axis.angle") } ## DRY tc <- ifelse(pc == "transparent", bc, pc) # 'transparent' color ## default colors, font and legend position res <- theme(text = element_text(family = base_family), plot.background = element_rect(fill = bc, colour = NA), panel.grid = element_line(colour = gc, size = 0.2, linetype = gl), panel.grid.minor = element_line(size = 0.1), axis.ticks = element_line(colour = gc, size = 0.2), plot.title = element_text(colour = fc, face = "bold", size = base_size * 1.2), axis.text = element_text(colour = fc, face = "plain", size = base_size * 0.8), legend.text = element_text(colour = fc, face = "plain", size = base_size * 0.8), legend.title = element_text(colour = fc, face = "italic", size = base_size), axis.title.x = element_text(colour = fc, face = "plain", size = base_size), strip.text.x = element_text(colour = fc, face = "plain", size = base_size), axis.title.y = element_text(colour = fc, face = "plain", size = base_size, angle = 90), strip.text.y = element_text(colour = fc, face = "plain", size = base_size, angle = -90), legend.key = element_rect(colour = gc, fill = "transparent"), strip.background = element_rect(colour = gc, fill = "transparent"), panel.border = element_rect(fill = NA, colour = gc), panel.background = element_rect(fill = pc, colour = gc), legend.position = lp) ## disable box(es) around the plot if (!isTRUE(boxes)) { res <- res + theme(legend.key = element_rect(colour = "transparent", fill = "transparent"), strip.background = element_rect(colour = "transparent", fill = "transparent"), panel.border = element_rect(fill = NA, colour = tc), panel.background = element_rect(fill = pc, colour = tc)) } ## disable grid if (!isTRUE(gM)) { res <- res + theme(panel.grid = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank()) } ## disable minor grid if (!isTRUE(gm)) res <- res + theme(panel.grid.minor = element_blank()) ## margin if (nomargin) res <- res + theme(plot.margin = unit(c(0.1, 0.1, 0.1, 0), "lines")) ## axis angle (TODO: DRY with ifelse in the default color etc. section) if (axis == 0) res <- res + theme(axis.text.y = element_text(colour = fc, family = base_family, face = "plain", size = base_size * 0.8, angle = 90)) if (axis == 2) res <- res + theme(axis.text.x = element_text(colour = fc, family = base_family, face = "plain", size = base_size * 0.8, angle = 90, hjust = 1)) if (axis == 3) res <- res + theme(axis.text.y = element_text(colour = fc, family = base_family, face = "plain", size = base_size * 0.8, angle = 90), axis.text.x = element_text(colour = fc, family = base_family, face = "plain", size = base_size * 0.8, angle = 90, hjust = 1)) res } #' Color palette from the pander package #' #' The \pkg{pander} ships with a default colorblind and printer-friendly #' color palette borrowed from \verb{https://jfly.iam.u-tokyo.ac.jp/color/}. #' #' @param n number of colors. This palette supports up to eight colors. #' @param random_order if the palette should be reordered randomly before #' rendering each plot to get colorful images #' @export #' @family colour pander #' @example inst/examples/ex-palette_pander.R palette_pander <- function(n, random_order = FALSE) { ## default (colorblind and printer-friendly) colors cols <- c("#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7", "#999999", "#E69F00") if (requireNamespace("pander", quietly = TRUE)) { cols <- pander::panderOptions("graph.colors") } if (isTRUE(random_order)) cols <- sample(cols) if (length(cols) < n) cols <- rep(cols, length.out = n) cols[1:n] } #' Color scale from the pander package #' #' The \pkg{pander} ships with a default colorblind and printer-friendly color #' palette borrowed from \verb{https://jfly.iam.u-tokyo.ac.jp/color/}. #' @inheritParams ggplot2::scale_colour_hue #' @inheritParams palette_pander #' @family colour pander #' @rdname scale_pander #' @seealso \code{\link{theme_pander}()} #' @export scale_color_pander <- function(...) { discrete_scale("colour", "pander", palette_pander, ...) } #' @rdname scale_pander #' @export scale_colour_pander <- scale_color_pander #' @rdname scale_pander #' @export scale_fill_pander <- function(...) { discrete_scale("fill", "pander", palette_pander, ...) } ggthemes/R/tableau.R0000644000176200001440000002441013777021543014030 0ustar liggesusers#' Tableau Color Palettes (discrete) #' #' Color palettes used in \href{https://www.tableau.com/}{Tableau}. #' #' @details Tableau provides three types of color palettes: #' \code{"regular"} (discrete, qualitative categories), #' \code{"ordered-sequential"}, and \code{"ordered-diverging"}. #' #' \itemize{ #' \item{\code{"regular"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["regular"]]))}} #' \item{\code{"ordered-diverging"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["ordered-diverging"]]))}} #' \item{\code{"ordered-sequential"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["ordered-sequential"]]))}} #' } #' #' @export #' @param palette Palette name. See Details for available palettes. #' @param type Type of palette. One of \code{"regular"}, \code{"ordered-diverging"}, or \code{"ordered-sequential"}. #' @param direction If 1, the default, then use the original order of #' colors. If -1, then reverse the order. #' #' @references #' \url{http://vis.stanford.edu/color-names/analyzer/} #' #' Maureen Stone, 'Designing Colors for Data' (slides), at the #' International Symposium on Computational Aesthetics in Graphics, #' Visualization, and Imaging, Banff, AB, Canada, June 22, 2007. #' #' Heer, Jeffrey and Maureen Stone, 2012 'Color Naming Models for #' Color Selection, Image Editing and Palette Design', ACM Human #' Factors in Computing Systems (CHI) #' \url{http://vis.stanford.edu/files/2012-ColorNameModels-CHI.pdf}. #' #' @family colour tableau #' @example inst/examples/ex-tableau_color_pal.R tableau_color_pal <- function(palette = "Tableau 10", type = c("regular", "ordered-sequential", "ordered-diverging"), direction = 1) { type <- match.arg(type) palettes <- ggthemes::ggthemes_data[["tableau"]][["color-palettes"]][[type]] if (!palette %in% names(palettes)) { stop("`palette` must be one of ", paste(names(palettes), collapse = ", "), ".") } values <- palettes[[palette]][["value"]] max_n <- length(values) f <- function(n) { check_pal_n(n, max_n) values <- values[seq_len(n)] if (direction < 0) { values <- rev(values) } values } attr(f, "max_n") <- length(values) f } #' Tableau color scales (discrete) #' #' Categorical (qualitative) color scales used in Tableau. #' Use the function \funclink{scale_colour_gradient_tableau} for the sequential #' and \funclink{scale_colour_gradient2_tableau} for the diverging continuous #' color scales from Tableu. #' #' @param palette Palette name. See \funclink{tableau_color_pal} #' for available palettes. #' @param type Palette type. One of \code{"regular"}, \code{"sequential"}, #' or \code{"diverging"}. See \funclink{tableau_color_pal}. #' @inheritParams tableau_color_pal #' @param ... Other arguments passed on to \funclink{discrete_scale}. #' @family colour tableau #' @rdname scale_color_tableau #' @export #' @seealso \code{\link{tableau_color_pal}()} for references. #' @example inst/examples/ex-scale_color_tableau.R scale_colour_tableau <- function(palette = "Tableau 10", type = "regular", direction = 1, ...) { discrete_scale("colour", "tableau", tableau_color_pal(palette, type, direction), ...) } #' @export #' @rdname scale_color_tableau scale_fill_tableau <- function(palette = "Tableau 10", type = "regular", direction = 1, ...) { discrete_scale("fill", "tableau", tableau_color_pal(palette, type, direction), ...) } #' @export #' @rdname scale_color_tableau scale_color_tableau <- scale_colour_tableau #' Tableau Shape Palettes (discrete) #' #' Shape palettes used by #' \href{https://www.tableau.com/}{Tableau}. #' #' Not all shape palettes in Tableau are supported. Additionally, these #' palettes are not exact, and use the best unicode character for the shape #' palette. #' #' Since these palettes use unicode characters, their look may depend on the #' font being used, and not all characters may be available. #' #' Shape palettes in Tableau are used to expose images for use a markers in #' charts, and thus are sometimes groupings of closely related symbols. #' #' @export #' @param palette Palette name. #' @family shape tableau #' @example inst/examples/ex-tableau_shape_pal.R tableau_shape_pal <- function(palette = c("default", "filled", "proportions")) { palette <- match.arg(palette) shapes <- ggthemes::ggthemes_data$tableau[["shape-palettes"]][[palette]] f <- manual_pal(shapes[["pch"]]) attr(f, "max_n") <- nrow(shapes) f } #' Tableau shape scales #' #' See \code{\link{tableau_shape_pal}()} for details. #' #' @export #' @inheritParams tableau_shape_pal #' @inheritParams ggplot2::scale_x_discrete #' @family shape tableau #' @example inst/examples/ex-scale_shape_tableau.R scale_shape_tableau <- function(palette = "default", ...) { discrete_scale("shape", "tableau", tableau_shape_pal(palette), ...) } #' Tableau colour gradient palettes (continuous) #' #' Gradient color palettes using the diverging and sequential continous color #' palettes in Tableau. See \funclink{tableau_color_pal} for discrete color #' palettes. #' #' @param palette Palette name. #' \itemize{ #' \item{\code{"ordered-sequential"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["ordered-sequential"]]))}} #' \item{\code{"ordered-diverging"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["ordered-diverging"]]))}} #' } #' @param type Palette type, either \code{"ordered-sequential"} or #' \code{"ordered-diverging"}. #' @param ... Arguments passed to \code{tableau_gradient_pal}. #' @family colour tableau #' #' @export #' @example inst/examples/ex-tableau_seq_gradient_pal.R tableau_gradient_pal <- function(palette = "Blue", type = "ordered-sequential") { type <- match.arg(type, c("ordered-sequential", "ordered-diverging")) pal <- ggthemes::ggthemes_data[[c("tableau", "color-palettes", type, palette)]] scales::gradient_n_pal(colours = pal[["value"]]) } #' @export #' @rdname tableau_gradient_pal tableau_seq_gradient_pal <- function(palette = "Blue", ...) { tableau_gradient_pal(palette = palette, type = "ordered-sequential", ...) } #' @export #' @rdname tableau_gradient_pal tableau_div_gradient_pal <- function(palette = "Orange-Blue Diverging", ...) { tableau_gradient_pal(palette = palette, type = "ordered-diverging", ...) } #' Tableau sequential colour scales (continuous) #' #' Continuous color scales using the sequential color palettes in Tableau. #' See \funclink{scale_colour_tableau} for Tableau discrete color scales, #' and \funclink{scale_colour_gradient2_tableau} for diverging color #' scales. #' #' @export #' @inheritParams tableau_seq_gradient_pal #' @inheritParams ggplot2::scale_colour_hue #' @param guide Type of legend. Use \code{'colourbar'} for continuous #' colour bar, or \code{'legend'} for discrete colour legend. #' @family colour tableau #' @rdname scale_colour_gradient_tableau #' @example inst/examples/ex-scale_colour_gradient_tableau.R #' @importFrom ggplot2 continuous_scale scale_colour_gradient_tableau <- function(palette = "Blue", ..., na.value = "grey50", guide = "colourbar") { continuous_scale("colour", "tableau", tableau_seq_gradient_pal(palette), na.value = na.value, guide = guide, ...) } #' @export #' @rdname scale_colour_gradient_tableau scale_fill_gradient_tableau <- function(palette = "Blue", ..., na.value = "grey50", guide = "colourbar") { continuous_scale("fill", "tableau", tableau_seq_gradient_pal(palette), na.value = na.value, guide = guide, ...) } #' @export #' @rdname scale_colour_gradient_tableau scale_color_gradient_tableau <- scale_colour_gradient_tableau #' @export #' @rdname scale_colour_gradient_tableau scale_color_continuous_tableau <- scale_colour_gradient_tableau #' @export #' @rdname scale_colour_gradient_tableau scale_fill_continuous_tableau <- scale_fill_gradient_tableau #' Tableau diverging colour scales (continuous) #' #' Continuous color scales using the diverging color scales in Tableau. #' See \funclink{scale_colour_tableau} for Tabaleau discrete color scales, #' and \funclink{scale_colour_gradient_tableau} for sequential color scales. #' #' @inheritParams tableau_div_gradient_pal #' @inheritParams ggplot2::scale_colour_hue #' @param guide Type of legend. Use \code{'colourbar'} for continuous #' colour bar, or \code{'legend'} for discrete colour legend. #' @family colour tableau #' @export #' @rdname scale_colour_gradient2_tableau #' @example inst/examples/ex-scale_colour_gradient2_tableau.R scale_colour_gradient2_tableau <- function(palette = "Orange-Blue Diverging", ..., na.value = "grey50", guide = "colourbar") { continuous_scale("colour", "tableau2", tableau_div_gradient_pal(palette), na.value = na.value, guide = guide, ...) } #' @export #' @rdname scale_colour_gradient2_tableau scale_fill_gradient2_tableau <- function(palette = "Orange-Blue Diverging", ..., na.value = "grey50", guide = "colourbar") { continuous_scale("fill", "tableau2", tableau_div_gradient_pal(palette), na.value = na.value, guide = guide, ...) } #' @export #' @rdname scale_colour_gradient2_tableau scale_color_gradient2_tableau <- scale_colour_gradient2_tableau ggthemes/R/scales.R0000644000176200001440000001466513774457477013720 0ustar liggesusers# Much of this code is copied from the labeling package. .simplicity <- function(q, Q, j, lmin, lmax, lstep) { eps <- .Machine$double.eps * 100 n <- length(Q) i <- match(q, Q)[1] v <- ifelse( (lmin %% lstep < eps || lstep - (lmin %% lstep) < eps) && lmin <= 0 && lmax >= 0, 1, 0) 1 - (i - 1) / (n - 1) - j + v } .simplicity.max <- function(q, Q, j) { n <- length(Q) i <- match(q, Q)[1] v <- 1 1 - (i - 1) / (n - 1) - j + v } .coverage <- function(dmin, dmax, lmin, lmax) { range <- dmax - dmin 1 - 0.5 * ( (dmax - lmax) ^ 2 + (dmin - lmin) ^ 2) / ( (0.1 * range) ^ 2) } .coverage.max <- function(dmin, dmax, span) { range <- dmax - dmin if (span > range) { half <- (span - range) / 2 1 - 0.5 * (half ^ 2 + half ^ 2) / ( (0.1 * range) ^ 2) } else { 1 } } .density <- function(k, m, dmin, dmax, lmin, lmax) { r <- (k - 1) / (lmax - lmin) rt <- (m - 1) / (max(lmax, dmax) - min(dmin, lmin)) 2 - max( r / rt, rt / r ) } .density.max <- function(k, m) { if (k >= m) { 2 - (k - 1) / (m - 1) } else { 1 } } .legibility <- function(lmin, lmax, lstep) { 1 } #' Pretty axis breaks inclusive of extreme values #' #' This function returns pretty axis breaks that always include the extreme values of the data. #' This works by calling the extended Wilkinson algorithm (Talbot et. al, 2010), constrained to solutions interior to the data range. #' Then, the minimum and maximum labels are moved to the minimum and maximum of the data range. #' #' \code{extended_range_breaks} implements the algorithm and returns the break values. #' \code{scales_extended_range_breaks} uses the conventions of the \pkg{scales} package, and returns a function. #' #' @param dmin minimum of the data range #' @param dmax maximum of the data range #' @param n desired number of breaks #' @param Q set of nice numbers #' @param w weights applied to the four optimization components (simplicity, coverage, density, and legibility) #' @return For \code{extended_range_breaks}, the vector of axis label locations. #' For \code{scales_extended_range_breaks}, a function which takes a single argument, a vector of data, and returns the vector of axis label locations. #' @references #' Talbot, J., Lin, S., Hanrahan, P. (2010) An Extension of Wilkinson's Algorithm for Positioning Tick Labels on Axes, InfoVis 2010. #' @author Justin Talbot \email{jtalbot@@stanford.edu}, Jeffrey B. Arnold, Baptiste Auguie #' @rdname range_breaks #' @export extended_range_breaks_ <- function(dmin, dmax, n = 5, Q = c(1, 5, 2, 2.5, 4, 3), w = c(0.25, 0.2, 0.5, 0.05)) { eps <- .Machine$double.eps * 100 if (dmin > dmax) { temp <- dmin dmin <- dmax dmax <- temp } if (dmax - dmin < eps) { #if the range is near the floating point limit, #let seq generate some equally spaced steps. return(seq(from = dmin, to = dmax, length.out = n)) } n <- length(Q) best <- list() best$score <- -2 j <- 1 while (j < Inf) { for (q in Q) { sm <- .simplicity.max(q, Q, j) if ( (w[1] * sm + w[2] + w[3] + w[4]) < best$score) { j <- Inf break } k <- 2 while (k < Inf) { dm <- .density.max(k, n) if ( (w[1] * sm + w[2] + w[3] * dm + w[4]) < best$score) break delta <- (dmax - dmin) / (k + 1) / j / q z <- ceiling(log(delta, base = 10)) while (z < Inf) { step <- j * q * 10 ^ z cm <- .coverage.max(dmin, dmax, step * (k - 1)) if ( (w[1] * sm + w[2] * cm + w[3] * dm + w[4]) < best$score) break min_start <- floor(dmax / (step)) * j - (k - 1) * j max_start <- ceiling(dmin / (step)) * j if (min_start > max_start) { z <- z + 1 next } for (start in min_start:max_start) { lmin <- start * (step / j) lmax <- lmin + step * (k - 1) lstep <- step s <- .simplicity(q, Q, j, lmin, lmax, lstep) c <- .coverage(dmin, dmax, lmin, lmax) g <- .density(k, n, dmin, dmax, lmin, lmax) l <- .legibility(lmin, lmax, lstep) score <- w[1] * s + w[2] * c + w[3] * g + w[4] * l if (score > best$score && lmin >= dmin && lmax <= dmax) { best <- list(lmin = lmin, lmax = lmax, lstep = lstep, score = score) } } z <- z + 1 } k <- k + 1 } } j <- j + 1 } breaks <- seq(from = best$lmin, to = best$lmax, by = best$lstep) if (length(breaks) >= 2) { breaks[1] <- dmin breaks[length(breaks)] <- dmax } breaks } #' @rdname range_breaks #' @param ... other arguments passed to \code{extended_range_breaks_()} #' @return A function which returns breaks given a vector. #' @export extended_range_breaks <- function(n = 5, ...) { function(x) { extended_range_breaks_(min(x), max(x), n, ...) } } # from scales package zero_range <- function(x, tol = 1000 * .Machine$double.eps) { if (length(x) == 1) return(TRUE) if (length(x) != 2) stop("x must be length 1 or 2") if (any(is.na(x))) return(NA) if (x[1] == x[2]) return(TRUE) if (all(is.infinite(x))) return(FALSE) m <- min(abs(x)) if (m == 0) return(FALSE) abs( (x[1] - x[2]) / m) < tol } # from scales package precision <- function(x) { rng <- range(x, na.rm = TRUE) span <- if (zero_range(rng)) abs(rng[1]) else diff(rng) 10 ^ floor(log10(span)) } #' Format numbers with automatic number of digits #' #' @param x A numeric vector to format #' @param ... Parameters passed to \code{\link{format}()} #' #' @references Josh O'Brien, #' \url{https://stackoverflow.com/questions/23169938/select-accuracy-to-display-additional-axis-breaks/23171858#23171858}. #' @author Josh O'Brien, Baptise Auguie, Jeffrey B. Arnold #' @return A character vector. #' \code{smart_digits_format()} returns a function with a single argument #' \code{x}, a numeric vector, that returns a character vector. #' #' @rdname smart_digits #' @export smart_digits <- function(x, ...) { if (length(x) == 0) return(character()) accuracy <- precision(x) x <- round(x / accuracy) * accuracy format(x, ...) } #' @rdname smart_digits #' @export smart_digits_format <- function(x, ...) { function(x) smart_digits(x, ...) } ggthemes/R/economist.R0000644000176200001440000002166513774462545014434 0ustar liggesusers#' Economist color palette (discrete) #' #' The hues in the palette are blues, grays, and greens. Red is not #' included in these palettes and should be used to indicate #' important data. #' #' @param fill Use the fill palette. #' @family colour economist #' @export #' @example inst/examples/ex-economist_pal.R economist_pal <- function(fill=TRUE) { colors <- deframe(ggthemes::ggthemes_data[["economist"]][["fg"]]) if (fill) { max_n <- 9 f <- function(n) { check_pal_n(n, max_n) if (n == 1L) { i <- "dark blue" } else if (n == 2L) { i <- c("blue", "dark blue") } else if (n == 3L) { i <- c("blue-gray", "dark blue", "blue") } else if (n == 4L) { i <- c("blue-gray", "dark blue", "blue", "gray") } else if (n %in% 5:6) { ## 20120901_woc904 i <- c("blue-gray", "dark blue", "light blue", "blue", "light green", "dark green") } else if (n == 7L) { # 20120818_AMC820 i <- c("blue-gray", "dark blue", "blue", "light blue", "dark green", "light green", "gray") } else if (n >= 8L) { # 20120915_EUC094 i <- c("blue-gray", "dark blue", "blue", "light blue", "dark green", "light green", "dark red", "pink", "gray") } unname(colors[i][seq_len(n)]) } } else { max_n <- 9 f <- function(n) { check_pal_n(n, max_n) if (n <= 3) { # 20120818_AMC20 # 20120901_FBC897 i <- c("dark blue", "blue", "light blue") } else if (n %in% 4:5) { # i <- c("dark blue", "blue", "light blue", "red", "gray") i <- c("dark blue", "blue", "light blue", "blue-gray", "gray") } else if (n == 6) { # 20120825_IRC829 i <- c("light green", "dark green", "gray", "blue-gray", "light blue", "dark blue") } else if (n > 6) { # 20120825_IRC829 i <- c("light green", "dark green", "gray", "blue-gray", "light blue", "dark blue", "dark red", "pink", "brown") } unname(colors[i][seq_len(n)]) } } attr(f, "max_n") <- max_n f } #' Economist color scales #' #' Color scales using the colors in the Economist graphics. #' #' @inheritParams ggplot2::scale_colour_hue #' @inheritParams economist_pal #' @family colour economist #' @rdname scale_economist #' @seealso \code{\link{theme_economist}()} for examples. #' @export scale_colour_economist <- function(...) { discrete_scale("colour", "economist", economist_pal(), ...) } #' @rdname scale_economist #' @export scale_color_economist <- scale_colour_economist #' @rdname scale_economist #' @export scale_fill_economist <- function(...) { discrete_scale("fill", "economist", economist_pal(), ...) } #' ggplot color theme based on the Economist #' #' A theme that approximates the style of \emph{The Economist}. #' #' \code{theme_economist} implements the standard bluish-gray #' background theme in the print \emph{The Economist} and #' \href{https://www.economist.com/}{economist.com}. #' #' \code{theme_economist_white} implements a variant with a while #' panel and light gray (or white) background often used by \emph{The Economist} #' blog \href{https://www.economist.com/blogs/graphicdetail}{Graphic Detail}. #' #' Use \code{\link{scale_color_economist}()} with this theme. #' The x axis should be displayed on the right hand side. #' #' \emph{The Economist} uses "ITC Officina Sans" as its font for graphs. If #' you have access to this font, you can use it with the #' \pkg{extrafont} package. "Verdana" is a good substitute. #' #' @inheritParams ggplot2::theme_grey #' @param horizontal \code{logical} Horizontal axis lines? #' @param dkpanel \code{logical} Darker background for panel region? #' @param gray_bg \code{logical} If \code{TRUE}, use gray background, else #' use white #' background. #' #' @return An object of class \code{\link[ggplot2]{theme}()}. #' #' @export #' @family themes economist #' #' @references #' \itemize{ #' \item \href{https://www.economist.com/}{The Economist} #' \item \href{https://spiekermann.com/en/itc-officina-display/}{Spiekerblog, "ITC Officina Display", January 1, 2007.} #' \item \url{https://www.economist.com/help/about-us} #' } #' #' @example inst/examples/ex-theme_economist.R theme_economist <- function(base_size = 10, base_family = "sans", horizontal = TRUE, dkpanel = FALSE) { bgcolors <- deframe(ggthemes::ggthemes_data[["economist"]][["bg"]]) ## From measurements ## Ticks = 1 / 32 in, with margin about 1.5 / 32 ## Title = 3 / 32 in (6 pt) ## Legend Labels = 2.5 / 32 in (5pt) ## Axis Labels = 2 ## Axis Titles and other text ~ 2 ## Margins: Top / Bottom = 6 / 32, sides = 5 / 32 ret <- theme_foundation(base_size = base_size, base_family = base_family) + theme(line = element_line(colour = "black"), rect = element_rect(fill = bgcolors["ebg"], colour = NA, linetype = 1), text = element_text(colour = "black"), ## Axis axis.line = element_line(size = rel(0.8)), axis.line.y = element_blank(), axis.text = element_text(size = rel(1)), axis.text.x = element_text(vjust = 0, margin = margin(t = base_size, unit = "pt")), axis.text.x.top = element_text(vjust = 0, margin = margin(b = base_size, unit = "pt")), axis.text.y = element_text(hjust = 0, margin = margin(r = base_size, unit = "pt")), ## I cannot figure out how to get ggplot to do 2 levels of ticks ## axis.ticks.margin = unit(3 / 72, "in"), axis.ticks = element_line(), axis.ticks.y = element_blank(), axis.title = element_text(size = rel(1)), axis.title.x = element_text(), axis.title.y = element_text(angle = 90), # axis.ticks.length = unit( -1/32, "in"), axis.ticks.length = unit( -base_size * 0.5, "points"), legend.background = element_rect(linetype = 0), legend.spacing = unit(base_size * 1.5, "points"), legend.key = element_rect(linetype = 0), legend.key.size = unit(1.2, "lines"), legend.key.height = NULL, legend.key.width = NULL, legend.text = element_text(size = rel(1.25)), legend.text.align = NULL, legend.title = element_text(size = rel(1), hjust = 0), legend.title.align = NULL, legend.position = "top", legend.direction = NULL, legend.justification = "center", ## legend.box = element_rect(fill = palette_economist['bgdk'], ## colour=NA, linetype=0), ## Economist only uses vertical lines panel.background = element_rect(linetype = 0), panel.border = element_blank(), panel.grid.major = element_line(colour = "white", size = rel(1.75)), panel.grid.minor = element_blank(), panel.spacing = unit(0.25, "lines"), strip.background = element_rect(fill = bgcolors["ebg"], colour = NA, linetype = 0), strip.text = element_text(size = rel(1.25)), strip.text.x = element_text(), strip.text.y = element_text(angle = -90), plot.background = element_rect(fill = bgcolors["blue-gray"], colour = NA), plot.title = element_text(size = rel(1.5), hjust = 0, face = "bold"), plot.margin = unit(c(6, 5, 6, 5) * 2, "points"), complete = TRUE) if (horizontal) { ret <- ret + theme(panel.grid.major.x = element_blank()) } else { ret <- ret + theme(panel.grid.major.y = element_blank()) } if (dkpanel == TRUE) { ret <- ret + theme(panel.background = element_rect(fill = unname(bgcolors["dark blue-gray"])), strip.background = element_rect(fill = unname(bgcolors["dark blue-gray"]))) } ret } #' @rdname theme_economist #' @export theme_economist_white <- function(base_size = 11, base_family = "sans", gray_bg = TRUE, horizontal = TRUE) { if (gray_bg) { bgcolor <- get_colors(c("economist", "bg"), "light gray") } else { bgcolor <- "white" } theme_economist(base_family = base_family, base_size = base_size, horizontal = horizontal) + theme(rect = element_rect(fill = bgcolor), plot.background = element_rect(fill = bgcolor), panel.background = element_rect(fill = "white"), panel.grid.major = element_line(colour = get_colors(c("economist", "bg"), "dark gray")), strip.background = element_rect(fill = "white")) } ggthemes/R/banking.R0000644000176200001440000000767713774436615014053 0ustar liggesusers## 45 degrees in radians FORTY_FIVE <- base::pi / 4 calc_slopes <- function(x, y, cull = FALSE) { dx <- abs(diff(x)) dy <- diff(y) s <- dy / dx touse <- if (cull) { abs(s) > 0 & is.finite(s) } else { is.finite(s) } list(s = s[touse], dx = dx[touse], dy = dy[touse], Rx = diff(range(x)), Ry = diff(range(y))) } #' Bank Slopes to 45 degrees #' #' Calculate the optimal aspect ratio of a line graph by banking the #' slopes to 45 degrees as suggested by W.S. Cleveland. This #' maximizes the ability to visually differentiate differences in #' slope. This function will calculate the optimal aspect ratio for #' a line plot using any of the methods described in Herr and Argwala #' (2006). In their review of the methods they suggest using median #' absolute slope banking ('ms'), which produces aspect ratios which #' are generally the median of the various methods provided here. #' #' @param x x values #' @param y y values #' @param cull \code{logical}. Remove all slopes of 0 or \code{Inf}. #' @param method One of 'ms' (Median Absolute Slope) or 'as' (Average #' Absolute Slope). Other options are no longer supported, and will use #' 'ms' instead with a warning. #' @param weight No longer used, but kept for backwards compatibility. #' @param ... No longer used, but kept for backwards compatibility. #' #' @section Methods: #' #' As written, all of these methods calculate the aspect ratio (x #' /y), but \code{bank_slopes} will return (y / x) to be compatible #' with \code{link[ggplot2]{coord_fixed()}}. #' #' \strong{Median Absolute Slopes Banking} #' #' Let the aspect ratio be \eqn{\alpha = \frac{w}{h}}{alpha = w / h} #' then the median absolute slop banking is the #' \eqn{\alpha}{alpha} such that, #' \deqn{ #' median \left| \frac{s_i}{\alpha} \right| = 1 #' }{ #' median |s_i / alpha| #' } #' #' Let \eqn{R_z = z_{max} - z_{min}}{R_z = z_max - z_min} for \eqn{z = x, y}, #' and \eqn{M = median \| s_i \|}{M = median | s_i |}. Then, #' \deqn{ #' \alpha = M \frac{R_x}{R_y} #' }{ #' alpha = M R_x / R_y #' } #' #' \strong{Average Absolute Slope Banking} #' #' Let the aspect ratio be \eqn{\alpha = \frac{w}{h}}{alpha = w/h}. #' then the mean absolute slope banking is the #' \eqn{\alpha}{alpha} such that, #' \deqn{ #' mean \left| \frac{s_i}{\alpha} \right| = 1 #' }{ #' mean |s_i / alpha| = 1 #' } #' #' Heer and Agrawala (2006) and Cleveland discuss several other methods #' including average (weighted) orientation, and global and local orientation resolution. #' These are no longer implemented in this function. In general, either the #' median or average absolute slopes will produce reasonable results without #' requiring optimization. #' #' @references #' Cleveland, W. S., M. E. McGill, and R. McGill. The Shape Parameter #' of a Two-Variable Graph. Journal of the American Statistical #' Association, 83:289-300, 1988 #' #' Heer, Jeffrey and Maneesh Agrawala, 2006. 'Multi-Scale Banking to 45' #' IEEE Transactions On Visualization And Computer Graphics. #' #' Cleveland, W. S. 1993. 'A Model for Studying Display Methods of Statistical #' Graphs.' Journal of Computational and Statistical Graphics. #' #' Cleveland, W. S. 1994. The Elements of Graphing Data, Revised Edition. #' #' @return \code{numeric} The aspect ratio (x , y). #' #' @seealso \code{\link[lattice]{banking}()} #' @export #' @example inst/examples/ex-bank_slopes.R bank_slopes <- function(x, y, cull = FALSE, weight = NULL, method = c("ms", "as"), ...) { method <- match.arg(method) FUN <- bank_slopes_funs[[method]] # Heer produces functions with the target alpha = w/h = x/y xyrat <- FUN(calc_slopes(x, y, cull = cull), ...) # but coord_fixed ratio is the aspect ratio y/x 1 / xyrat } bank_slopes_funs <- list() bank_slopes_funs[["ms"]] <- function(slopes, ...) { median(abs(slopes$s)) * slopes$Rx / slopes$Ry } bank_slopes_funs[["as"]] <- function(slopes, ...) { mean(abs(slopes$s)) * slopes$Rx / slopes$Ry } ggthemes/R/theme-solid.R0000644000176200001440000000126413774436615014636 0ustar liggesusers#' Theme with nothing other than a background color #' #' Theme that removes all non-geom elements (lines, text, etc), #' This theme is when only the geometric objects are desired. #' #' @param base_size Base font size. #' @param base_family Ignored, kept for consistency with \code{\link{theme}()}. #' @param fill Background color of the plot. #' @family themes #' @example inst/examples/ex-theme_solid.R #' @export theme_solid <- function(base_size = 12, base_family = "", fill = NA) { theme_foundation() + theme(line = element_blank(), text = element_blank(), rect = element_rect(fill = fill, size = base_size, colour = NA, linetype = 0)) } ggthemes/R/theme-foundation.R0000644000176200001440000000301213774436615015663 0ustar liggesusers#' Foundation Theme #' #' This theme is designed to be a foundation from which to build new #' themes, and not meant to be used directly. \code{theme_foundation()} #' is a complete theme with only minimal number of elements defined. #' It is easier to create new themes by extending this one rather #' than \code{\link[ggplot2]{theme_gray}()} or \code{\link[ggplot2]{theme_bw}()}, #' because those themes define elements deep in the hierarchy. #' #' This theme takes \code{\link[ggplot2]{theme_gray}()} and sets all #' \code{colour} and \code{fill} values to \code{NULL}, except for the top-level #' elements (\code{line}, \code{rect}, and \code{title}), which have #' \code{colour = "black"}, and \code{fill = "white"}. This leaves the spacing #' and-non colour defaults of the default \pkg{ggplot2} themes in place. #' #' @inheritParams ggplot2::theme_grey #' #' @family themes #' @export #' @importFrom ggplot2 theme_grey theme_foundation <- function(base_size=12, base_family="") { thm <- theme_grey(base_size = base_size, base_family = base_family) for (i in names(thm)) { if ("colour" %in% names(thm[[i]])) { thm[[i]]["colour"] <- list(NULL) } if ("fill" %in% names(thm[[i]])) { thm[[i]]["fill"] <- list(NULL) } } thm + theme(panel.border = element_rect(fill = NA), legend.background = element_rect(colour = NA), line = element_line(colour = "black"), rect = element_rect(fill = "white", colour = "black"), text = element_text(colour = "black")) } ggthemes/R/canva.R0000644000176200001440000000435613774461262013515 0ustar liggesusers#' 150 Color Palettes from Canva #' #' 150 four-color palettes by the #' \href{https://www.canva.com/learn/}{canva.com} design school. #' These palettes were derived from photos and "impactful websites". #' #' @format A named \code{list} of character vector. #' The names are the palette names. The values of the character vectors #' are hex colors, e.g. \code{"#f98866"}. #' #' @references #' \itemize{ #' \item{Janie Kliever, \href{https://www.canva.com/learn/100-color-combinations/}{100 Brilliant Color Combinations and How to Apply Them to Your Designs}, #' \emph{Canva.com}, June 20, 2015.} #' \item{Mary Stribley, \href{https://www.canva.com/learn/website-color-schemes/}{Website Color Schemes: The Palettes of 50 Visually Impactful Websites to Inspire You}, #' \emph{Canva.com}, January 26, 2016.} #' \item{Schwabish, Jonathan. #' \href{https://policyviz.com/2017/01/12/150-color-palettes-for-excel/}{150+ Color Palettes for Excel}, #' \emph{PolicyViz}, January 12, 2017.} #' } #' @example inst/examples/ex-canva_pal.R "canva_palettes" #' Canva.com color palettes #' #' 150+ color palettes from canva.com. See \code{\link{canva_palettes}()}. #' #' @param palette Palette name. See the names of \code{\link{canva_palettes}()} #' for valid names. #' @return A function that takes a single value, the number of colors to use. #' @export #' @example inst/examples/ex-canva_pal.R canva_pal <- function(palette = "Fresh and bright") { if (!palette %in% names(ggthemes::canva_palettes)) { stop("Palette ", sQuote(palette), " not a valid name.", call. = FALSE) } manual_pal(unname(ggthemes::canva_palettes[[palette]])) } #' Discrete color scale using canva.com color palettes #' #' Color scale for canva.com color palettes described in #' \code{\link{canva_palettes}()}. #' #' @param ... Arguments passed to \code{\link{discrete_scale}()}. #' @inheritParams canva_pal #' @export scale_colour_canva <- function(..., palette = "Fresh and bright") { discrete_scale("colour", "canva", canva_pal(palette), ...) } #' @export #' @rdname scale_colour_canva scale_color_canva <- scale_colour_canva #' @export #' @rdname scale_colour_canva scale_fill_canva <- function(..., palette = "Fresh and bright") { discrete_scale("fill", "canva", canva_pal(palette), ...) } ggthemes/R/tufte.R0000644000176200001440000000312113774436615013545 0ustar liggesusers#' Tufte Maximal Data, Minimal Ink Theme #' #' Theme based on Chapter 6 'Data-Ink Maximization and Graphical #' Design' of Edward Tufte *The Visual Display of Quantitative #' Information*. No border, no axis lines, no grids. This theme works #' best in combination with \code{\link{geom_rug}()} or #' \code{\link{geom_rangeframe}()}. #' #' @note #' The default font family is set to 'serif' as he uses serif fonts #' for labels in 'The Visual Display of Quantitative Information'. #' The serif font used by Tufte in his books is a variant of Bembo, #' while the sans serif font is Gill Sans. If these fonts are #' installed on your system, then you can use them with the package #' \bold{extrafont}. #' #' @inheritParams ggplot2::theme_grey #' @param ticks \code{logical} Show axis ticks? #' #' @references Tufte, Edward R. (2001) The Visual Display of #' Quantitative Information, Chapter 6. #' #' @family themes tufte #' @example inst/examples/ex-theme_tufte.R #' @export #' @importFrom ggplot2 theme_bw theme_tufte <- function(base_size = 11, base_family = "serif", ticks = TRUE) { ## TODO: start with theme_minimal ret <- theme_bw(base_family = base_family, base_size = base_size) + theme(legend.background = element_blank(), legend.key = element_blank(), panel.background = element_blank(), panel.border = element_blank(), strip.background = element_blank(), plot.background = element_blank(), axis.line = element_blank(), panel.grid = element_blank()) if (!ticks) { ret <- ret + theme(axis.ticks = element_blank()) } ret } ggthemes/R/shapes.R0000644000176200001440000001341013777021331013667 0ustar liggesusers#' Shape palette from Cleveland "Elements of Graphing Data" (discrete). #' #' Shape palettes for overlapping and non-overlapping points. #' #' @param overlap \code{logical} Use the scale for overlapping points? #' #' @note #' #' In the \emph{Elements of Graphing Data}, W.S. Cleveland suggests #' two shape palettes for scatter plots: one for overlapping data and #' another for non-overlapping data. The symbols for overlapping data #' relies on pattern discrimination, while the symbols for #' non-overlapping data vary the amount of fill. This palette #' attempts to create these palettes. However, I found that these #' were hard to replicate. Using the R shapes and unicode fonts: the #' symbols can vary in size, they are dependent of the fonts used, #' and there does not exist a unicode symbol for a circle with a #' vertical line. If someone can improve this palette, please let me #' know. #' #' Following Tremmel (1995), I replace the circle with a vertical #' line with an encircled plus sign. #' #' The palette \code{cleveland_shape_pal()} supports up to five values. #' #' @example inst/examples/ex-cleveland_shape_pal.R #' @references #' Cleveland WS. \emph{The Elements of Graphing Data}. Revised Edition. Hobart Press, Summit, NJ, 1994, pp. 154-164, 234-239. #' #' Tremmel, Lothar, (1995) "The Visual Separability of Plotting Symbols in Scatterplots", \emph{Journal of Computational and Graphical Statistics}, #' \url{https://www.jstor.org/stable/1390760} #' #' @family shapes #' @export cleveland_shape_pal <- function(overlap = TRUE) { shapes <- if (overlap[[1]]) { ggthemes::ggthemes_data$shapes$cleveland$overlap$pch } else { ggthemes::ggthemes_data$shapes$cleveland$default$pch } max_n <- length(shapes) f <- manual_pal(shapes) attr(f, "max_n") <- max_n f } #' Shape scales from Cleveland "Elements of Graphing Data" #' #' @inheritParams ggplot2::scale_x_discrete #' @inheritParams cleveland_shape_pal #' @export #' #' @family shapes #' @seealso \code{\link{cleveland_shape_pal}()} for a description of the palette. #' @references #' Cleveland WS. The Elements of Graphing Data. Revised Edition. #' Hobart Press, Summit, NJ, 1994, pp. 154-164, 234-239. #' scale_shape_cleveland <- function(overlap = TRUE, ...) { discrete_scale("shape", "cleveland", cleveland_shape_pal(overlap), ...) } #' Filled Circle Shape palette (discrete) #' #' Shape palette with circles varying by amount of fill. This uses #' the set of 3 circle fill values in Lewandowsky and Spence (1989): #' solid, hollow, half-filled, with two additional fill amounts: #' three-quarters, and one-quarter. #' #' This palette supports up to five values. #' #' @references #' Lewandowsky, Stephan and Ian Spence (1989) #' "Discriminating Strata in Scatterplots", Journal of #' the American Statistical Association, \url{https://www.jstor.org/stable/2289649} #' @example inst/examples/ex-circlefill_shape_pal.R #' @family shapes #' @export circlefill_shape_pal <- function() { values <- ggthemes::ggthemes_data[["shapes"]][["circlefill"]][["pch"]] max_n <- length(values) f <- manual_pal(values) attr(f, "max_n") <- max_n f } #' Filled Circle Shape palette (discrete) #' #' @export #' #' @inheritParams ggplot2::scale_x_discrete #' @family shapes #' @seealso #' \code{\link{circlefill_shape_pal}()} for a description of the palette. scale_shape_circlefill <- function(...) { discrete_scale("shape", "circlefill", circlefill_shape_pal(), ...) } #' Shape palette from Tremmel (1995) (discrete) #' #' Based on experiments Tremmel (1995) suggests the following shape palettes: #' #' If two symbols, then use a solid circle and plus sign. #' #' If three symbols, then use a solid circle, empty circle, and an #' empty triangle. However, that set of symbols does not satisfy the #' requirement that each symbol should differ from the other symbols #' in the same feature dimension. A set of three symbols that #' satisfies this is a circle (curvature), plus sign (number of #' terminators), triangle (line orientation). #' #' This palette supports up to three values. #' If more than three groups of data, then separate the groups into #' different plots. #' #' @param overlap use an empty circle instead of a solid circle when #' \code{n == 2}. #' @param alt,n3alt If \code{TRUE}, then when \code{n == 3}, #' use a solid circle, plus sign and #' empty triangle. Otherwise use a solid circle, empty circle, and empty #' triangle. #' @family shapes #' @references #' Tremmel, Lothar, (1995) "The Visual Separability of Plotting Symbols in Scatterplots" #' Journal of Computational and Graphical Statistics, #' \url{https://www.jstor.org/stable/1390760} #' @export tremmel_shape_pal <- function(overlap = FALSE, alt = FALSE, n3alt = NULL) { if (!is.null(n3alt)) { warning("`n3alt` is deprecated. Use `alt` instead.") alt <- n3alt[[1]] } max_n <- 3L palettes <- ggthemes::ggthemes_data$shapes$tremmel f <- function(n) { check_pal_n(n, max_n) if (n == 1) { palettes[["1"]]$pch } else if (n == 2) { if (overlap[[1]]) { palettes[["2-overlap"]]$pch } else { palettes[["2"]]$pch } } else if (n >= 3) { out <- rep(NA_integer_, n) out[1:3] <- if (alt) { palettes[["3-alternate"]]$pch } else { palettes[["3"]]$pch } out } } attr(f, "max_n") <- max_n f } #' Shape scales from Tremmel (1995) #' #' @inheritParams ggplot2::scale_x_discrete #' @inheritParams tremmel_shape_pal #' #' @seealso \code{\link{tremmel_shape_pal}()} for a description of the palette. #' @example inst/examples/ex-scale_shape_tremmel.R #' @family shapes #' @export scale_shape_tremmel <- function(overlap=FALSE, alt=TRUE, ...) { discrete_scale("shape", "tremmel", tremmel_shape_pal(overlap = overlap, alt = alt), ...) } ggthemes/R/gdocs.R0000644000176200001440000000722113774436615013522 0ustar liggesusers#' Theme with Google Docs Chart defaults #' #' Theme similar to the default look of charts in Google Docs. #' #' @inheritParams ggplot2::theme_grey #' @export #' @family themes gdocs #' @example inst/examples/ex-theme_gdocs.R theme_gdocs <- function(base_size = 12, base_family="sans") { ltgray <- "#cccccc" dkgray <- "#757575" dkgray2 <- "#666666" theme_foundation(base_size = base_size, base_family = base_family) + theme(rect = element_rect(colour = "black", fill = "white"), line = element_line(colour = "black"), text = element_text(colour = dkgray), # title is aligned left, 20 point Roboto Font, plain plot.title = element_text(face = "plain", size = rel(20 / 12), hjust = 0, colour = dkgray), # No subtitle or captions, so treat like other text plot.subtitle = element_text(hjust = 0, size = rel(1), face = "plain", colour = dkgray), plot.caption = element_text(hjust = 0, size = rel(1), face = "plain", colour = dkgray), panel.background = element_rect(fill = NA, colour = NA), panel.border = element_rect(fill = NA, colour = NA), # no strips in gdocs, so make similar to axis titles strip.text = element_text(hjust = 0, size = rel(1), colour = dkgray2, face = "plain"), strip.background = element_rect(colour = NA, fill = NA), # axis titles: Roboto 12pt, plain. axis.title = element_text(face = "plain", colour = dkgray2, size = rel(1)), # axis text: Roboto 12pt, plain axis.text = element_text(face = "plain", colour = dkgray, size = rel(1)), # only axis line on the x-axis. black. axis.line = element_line(colour = "black"), axis.line.y = element_blank(), # no axis ticks axis.ticks = element_blank(), # grid lines on both x and y axes. light gray. no minor gridlines panel.grid.major = element_line(colour = ltgray), panel.grid.minor = element_blank(), # legend has no border legend.background = element_rect(colour = NA), # legend labels: Roboto 12, dark gray legend.text = element_text(size = rel(1), colour = dkgray), # no legend title - use same as legend text legend.title = element_text(size = rel(1), colour = dkgray2, face = "plain"), legend.key = element_rect(colour = NA), legend.position = "right", legend.direction = "vertical" ) } #' Google Docs color palette (discrete) #' #' Color palettes from Google Docs. #' This palette includes 20 colors. #' #' @family colour gdocs #' @export #' @example inst/examples/ex-gdocs_pal.R gdocs_pal <- function() { values <- ggthemes::ggthemes_data$gdocs$colors$value f <- manual_pal(values) attr(f, "max_n") <- length(values) f } #' Google Docs color scales #' #' Color scales from Google Docs. #' #' @inheritParams ggplot2::scale_colour_hue #' @family colour gdocs #' @rdname scale_gdocs #' @export #' @seealso See \code{\link{theme_gdocs}()} for examples. scale_fill_gdocs <- function(...) { discrete_scale("fill", "gdocs", gdocs_pal(), ...) } #' @export #' @rdname scale_gdocs scale_colour_gdocs <- function(...) { discrete_scale("colour", "gdocs", gdocs_pal(), ...) } #' @export #' @rdname scale_gdocs scale_color_gdocs <- scale_colour_gdocs ggthemes/R/ggthemes_data.R0000644000176200001440000000033013774436615015211 0ustar liggesusers#' Palette and theme data #' #' The \code{ggthemes} environment contains various values used in #' themes and palettes. This is undocumented and subject to change. #' #' @format A \code{list} object. "ggthemes_data" ggthemes/R/stat-fivenumber.R0000644000176200001440000000643713774442044015537 0ustar liggesusers#' Calculate components of a five-number summary #' #' The five number summary of a sample is the minimum, first quartile, #' median, third quartile, and maximum. #' #' @param na.rm If \code{FALSE} (the default), removes missing values with #' a warning. If \code{TRUE} silently removes missing values. #' @param probs Quantiles to use for the five number summary. #' @inheritParams ggplot2::stat_identity #' @return A data frame with additional columns: #' \item{width}{width of boxplot} #' \item{min}{minimum} #' \item{lower}{lower hinge, 25\% quantile} #' \item{middle}{median, 50\% quantile} #' \item{upper}{upper hinge, 75\% quantile} #' \item{max}{maximum} #' @seealso \code{\link[ggplot2]{stat_boxplot}()} #' @export stat_fivenumber <- function(mapping = NULL, data = NULL, geom = "boxplot", probs = c(0, 0.25, 0.5, 0.75, 1), na.rm = FALSE, position = "identity", show.legend = NA, inherit.aes = TRUE, ...) { layer( data = data, mapping = mapping, stat = StatFivenumber, geom = geom, position = position, show.legend = show.legend, inherit.aes = inherit.aes, params = list( probs = probs, na.rm = na.rm, ... ) ) } # From ggplot2:::NO_GROUP NO_GROUP <- -1 # Copied from ggplot2:::has_groups has_groups <- function(data) { data$group[1L] != NO_GROUP } #' @export #' @format NULL #' @usage NULL #' @rdname stat_fivenumber #' @importFrom ggplot2 resolution remove_missing StatFivenumber <- ggplot2::ggproto("StatFivenumber", ggplot2::Stat, required_aes = "y", non_missing_aes = "weight", setup_data = function(data, params) { data$x <- data$x %||% 0 data <- remove_missing( data, na.rm = FALSE, vars = "x", name = "stat_fivenumber" ) data }, setup_params = function(data, params) { params$width <- params$width %||% (resolution(data$x %||% 0) * 0.75) if (is.double(data$x) && !has_groups(data) && any(data$x != data$x[1L])) { warning( "Continuous x aesthetic -- did you forget aes(group=...)?", call. = FALSE) } params }, compute_group = function(data, scales, width = NULL, na.rm = FALSE, probs = c(0, 0.25, 0.5, 0.75, 1)) { if (length(probs) != 5) { stop("'probs' should contain 5 quantiles.") } probs <- sort(probs) if (!is.null(data$weight)) { mod <- quantreg::rq(y ~ 1, weights = weight, tau = probs, data = data) stats <- as.numeric(stats::coef(mod)) } else { stats <- as.numeric(quantile(data$y, probs = probs)) } names(stats) <- c("ymin", "lower", "middle", "upper", "ymax") df <- as.data.frame(as.list(stats)) if (is.null(data$weight)) { n <- sum(!is.na(data$y)) } else { # Sum up weights for non-NA positions of y and weight n <- sum(data$weight[!is.na(data$y) & !is.na(data$weight)]) } df$x <- if (is.factor(data$x)) data$x[1] else mean(range(data$x)) df$width <- width df$relvarwidth <- sqrt(n) df } ) ggthemes/NEWS.md0000644000176200001440000002317214001707004013151 0ustar liggesusers# ggthemes 4.2.4 - Fixing URLs for CRAN submission again. # ggthemes 4.2.3 - Fixing URLs for CRAN submission again. # ggthemes 4.2.2 - Fixing URLs for CRAN submission. # ggthemes 4.2.1 - Conditionally use the vdiffr package in tests so it complies with suggested package policy (#124) - Fix error in `expect_equal` functions (#123) - Fix errors in `geom_tufteboxplot` and `stat_fivenumber` due to missing imported objects from ggplot2 (#117, #121) - Fix text labels in top axis in `theme_economist` (#115) - Update documentation on `geom_rangeframe`; it should be used with `coord_cartesian(clip="off")`. (#120) # ggthemes 4.2.0 - Add `theme_clean()` (Thanks @konradzdeb, #105) - Add `direction` argument to `scale_color_tableau()` and `scale_fill_tableau()` (Thanks @vadimus202, #112) # ggthemes 4.1.1 - Fix bugs in `geom_rangeframe` and `geom_tufteboxplot` caused by failing to import `alpha`. (Thanks @flying-sheep, #110) # ggthemes 4.1.0 - Add `type` argument to `scale_color_tableau` so that sequential and diverging palettes can be used in discrete scales. (Thanks @onesandzeroes, #108) - Fix colors in "Purple" and "Blue-Teal" palettes in `tableau_color_pal()`. (Thanks @leonawicz, #109) # ggthemes 4.0.1 - Fix bugs in `tableau_color_pal()`. Wrong colors in "Tableau 20" theme (Thanks @friskin, #95), and incorrect order of classic color palettes (Thanks @luca-scr, #96). - Fix fatal bug in `theme_solarized()` and `solarized_rebase()`. (Thanks @mdodrill-usgs, #97) # ggthemes 4.0.0 - Added palettes and based on current versions of Excel: `excel_pal_new()`, `scale_colour_excel_new()`, and `scale_fill_excel_new()`. Excel '97 based scales keep the same names. - Added `theme_excel_new()` which is based on the chart defaults of current versions of Excel. - Added Tableau 10 palettes and renamed old palettes in `tableau_color_pal()`, `scale_color_tableau()`, `scale_fill_tableau()`, and others. The continuous sequential and diverging palettes are improved by including more intermediate steps. - Updated `theme_gdocs()` to current look. - Updated `scale_color_gdocs()` and `fill_color_gdocs()` to current color. - Added `scale_shapes_few()` and `few_shape_pal()` with a shape scale and palette from Stephen Few's "Show Me the Numbers". - Removed `stata` argument from `scale_*_economist()` and `theme_economist()`. - Changed the format of the `ggthemes_data` object. - Changed behavior of `few_pal()`. If `n = 1`, use gray. If `n > 1` use non-gray colors. - Changed `tremmel_shape_scale()` to use `alt = TRUE` by default - Deprecated `tremmel_shape_scale()` argument `n3alt`. Use the `alt` argument instead. - Added a pkgdown site. - Removed vignette. Move all examples to man pages. - Bugfix: Fix `theme_few()` (#91) - Bugfix: Update themes to be consistent with `ggplot>=3.2.0` # ggthemes 3.5.0 - Bugfix: Fix RGB colors in `scale_color_few()`, `scale_fill_few()`, and `few_pal()` (#89, @bpbraun) - Update documentation to include mentions of the maximum number of values that discrete scales support (#85) # ggthemes 3.4.2 - Bugfix: Fix example code in `theme_economist()`. Thanks @carlganz #81. - Remove suggests dependencies: `reshape2`, `plyr`, `tidyverse` # ggthemes 3.4.1 - Bugfix: Resolve duplicate palette names in `canva_palettes()`. Thanks @Eluvias (#78) # ggthemes 3.4.0 - Add color palettes from canva.com: `canva_palettes()`, `canva_pal()`, `scale_colour_canva()`. - Use `NEWS.md` instead of `NEWS` - Update Economist examples to put y-axis on the right side. # ggthemes 3.3.0 - Update themes to changes in ggplot 2.1.0.9000. Thanks @juliasilge (#71) - `tufte_boxplot()` uses `position="dodge"` by default. Thanks @jgellar (#68) - Bugfix: Fix errors in `geom_rangeframe()` in new version of ggplot2. Thanks @coulmont (#70) # ggthemes 3.2.0 - Bugfix: In function `bank_slopes()`, remove methods `ao`, `gor`, and `lor`. These methods were not producing reliable results, and should not produce results much different than `ms` or `as`. If used, they will produce a warning, and `ms` will be used instead. (#68) # ggthemes 3.1.0 - Add `ptol_pal()`, `scale_colour_ptol()`, and `scale_file_ptol()` based on Paul Tol's qualitative color palettes. Thanks @jmlondon. (#65) # ggthemes 3.0.4 - Fix panel.grid.major.y colors for `theme_hc()`. Thanks @flying-sheep! (#64) # ggthemes 3.0.3 - Bugfix: remove `lintr` tests that broke with new `testthat`. # ggthemes 3.0.2 - Bugfix: export `ggthemes_data()` # ggthemes 3.0.1 - Bugfix: Remove border around legends in `theme_gdocs()`. Thanks SandyMuspratt! Pull request #53. - Bugfix: Remove border around legends in `theme_calc()`. - Bugfix: Add colour and fill values to `theme_foundation()`. This restores its behavior to version 2.2.1. Fixes Issue #56. # ggthemes 3.0.0 - For `geom_tufteboxplot()` and `GeomTufteboxplot`, option `median.type` supports only `line` and `point` options. Added option `whisker.type` which allows for whiskers to be specified by lines or points. - Changed default stat for `geom_tufteboxplot()` to `stat_fivenumber()`. - Added `theme_base()` and `theme_par()` - Removed `scale_(x|y)_tufte()`. See issue #49 - `theme_foundation()` rewritten. Removed `use_sizes` argument. - Import rather than depend on `ggplot2` - Update geoms, scales, and themes to ggplot >= 2.0.0 # ggthemes 2.2.1 - bugfix: fix R CMD check notes due to change in how it handles non-base default packages: - bugfix: fix bad URLs # ggthemes 2.2.0 - Added `theme_map()` from @hrbrmstr # ggthemes 2.1.1 - bugfix: use title case in package title; refer to ggplot2 in title - bugfix: fix non-escaped URLs in colorblind.R - bugfix: fix broken URL in few.R - bugfix: remove non-ascii characters in shapes.R - bugfix: use `requireNamespace()` instead of `require()` # ggthemes 2.1.0 - New theme and scale based on Highcharts JS: `scale_*_hc()`, `theme_hc()`. Thanks jbkunst! # ggthemes 2.0.0 - New options for `geom_tufteboxplot()`. `median.type` takes values "point", "box", or "line". Option `usebox` is no longer supported, and equivalent to `median.type="box"`. Thanks weitzner! Issue #13, PR #19. - All theme functions have `base_size` and `base_family` as first two arguments. This affects `theme_economist_white()`, `theme_excel()`, `theme_pander()`, `theme_solid()`, and `theme_tufte()`. Thanks ptoche! Issue #25. - `theme_pander()`: Options `ff` and `fs` are deprecated; use `base_family` and `base_size` options instead, respectively. # ggthemes 1.9.0 - added vignette - added themes / scales based on factory defaults of pander package: `pander_palette()`, `scale_color_pander()`, `scale_fill_pander()`, `theme_pander()`. Thanks daroczig. - added additional fill and gradient color scales: `scale_fill_fivethirtyeight()`, `scale_colour_gradient_tableau()`, `scale_fill_gradient_tableau()`, `scale_fill_continuous_tableau()`, `scale_colour_gradient2_tableau()`, `scale_fill_gradient2_tableau()`. Thanks bowerth. # ggthemes 1.8.0 - added themes and color scale from fivethirtyeight.com: `theme_fivethirtyeight()`, `fivethirtyeight_pal()`, `scale_color_fivethirtyeight()` # ggthemes 1.7.0 - added a new breaks algorithm: `scales_extended_range_breaks()`, `extended_range_breaks()` - added scales which implement the breaks algorithm: `scale_x_tufte()`, `scale_y_tufte()` - added new label format: `smart_digits()`, `smart_digits_format()` # ggthemes 1.6.1 - fix bug in `theme_wsj()` (issue #17) # ggthemes 1.6.0 - added `theme_solid()` # ggthemes 1.5.1 - fix failures in R CMD check # ggthemes 1.5.0 - added alternative Solarized theme: `theme_solarized_2()` - `theme_solarized()`: adjusted the colors - added LibreOffic Calc themes and palettes: `theme_calc()`, `calc_pal()`, `scale_fill_calc()`, `scale_colour_calc()`, `cacl_shape_pal()`, `scale_shape_calc()` - added Google Docs themes and palettes: `theme_gdocs()`, `gdocs_pal()`, `scale_fill_gdocs()`, `scale_colour_gdocs()` - fixed some examples # ggthemes 1.4.0 - fix bug in default palettes of `scale_colour_excel()` and `scale_fill_excel()`. # ggthemes 1.3.4 - added Tableau sequential colour palettes: `tableau_seq_gradient_pal()`, `scale_colour_gradient_tableau()`, `scale_fill_gradient_tableau()`. - added Tableau diverging colour palettes: `tableau_div_gradient_pal()`, `scale_colour_gradient2_tableau()`, `scale_fill_gradient2_tableau()`. - `tableau_colour_pal()`: added palette "cyclical # ggthemes 1.3.3 - fix issue #11: error with fonts and `theme_wsj()` in Windows # ggthemes 1.3.1 - `bank_slopes()` returns y/x aspect ratio to be compatible with `coord_fixed()` - improved documentation # ggthemes 1.3.0 - renamed `theme_excel2003()` to `theme_excel()` - replace `scale_fill_excel2003()` and `scale_fill_excel10()` with `scale_fill_excel()` - replaced `scale_colour_excel2003()` and `scale_colour_excel10()` with `scale_colour_excel()` - replaced `excel2003_pal()` and `excel10_pal()` with `excel_pal()` - renamed `theme_base()` to `theme_foundation()` # ggthemes 1.2.0 - added colorblind scales: `colorblind_pal()`, `scale_*_colorblind()`. # ggthemes 1.1.0 - added Wall Street Journal themes, palettes, scales: `theme_wsj()`, `wsj_pal()`, `scale_colour_wsj()`, and `scale_fill_wsj()`. - added function `bank_slopes()` : methods for determining the optimal slope ratio. - added `theme-foundation()`: a theme designed to be easy to extend into new themes. - added NEWS file ggthemes/MD50000644000176200001440000003014414002057473012371 0ustar liggesuserscffe5bab32580a269af522af22fc56cc *DESCRIPTION 96faf3348c5df5a6ee330dcf75970416 *NAMESPACE 8da05136204ac051e949702f7e1b8955 *NEWS.md ef516b8bef0b0cfb0e8313a4f44241cc *R/banking.R 0277da237e54f91509b38a4812ae9e60 *R/base.R 39c326e5f5d0f2d2f797f2cb59021c20 *R/calc.R 6d58f9d27ee03b10e71b6aadc59cee00 *R/canva.R ab8d7d48fedaef923171f86f017ce5dd *R/clean.R 0485a184a9967335125fe078814d77e7 *R/colorblind.R a931a93afce5ba695e07356c4ebc4ac4 *R/economist.R 8729443d7d497387aed50ec1de1752e9 *R/excel.R 2c3815848555d1c8458f824481c31000 *R/few.R 7000093f5f639928fe3d00d89dcfcd20 *R/fivethirtyeight.R c054a122435d62bff93348629be61efc *R/gdocs.R 5254222701bd595f8d7864c0d6c05337 *R/geom-rangeframe.R 4c1b2b0a3ee7c76283608728b2335d33 *R/geom-tufteboxplot.R 9f9b7bdc11aebcef3d303cb9014092a6 *R/ggthemes-package.R a37b58e707a70274853206ae66f7f668 *R/ggthemes_data.R 62c54f0eb8dfc42f323b7376185510b5 *R/hc.R 4671a00350588698c2397fb5622489be *R/igray.R 23cc3cd586805b5c9edfbc950e0030de *R/pander.R 5944e858a54e36f5d5cf667cab206876 *R/ptol.R 1646edbd4899123fc58ce049d0e32d8b *R/scales.R 5e724c997fa0975cfc6951f974ae582f *R/shapes.R 45df0b7b6b4a5f22a41bb9cfbba87bf5 *R/show.R ec43de6d4363d59486b5e0c1f4f62ecd *R/solarized.R 983884864d72fe706d93e1c3184a92f5 *R/stat-fivenumber.R 5a7a9acde652016f853e79cdb970b7e1 *R/stata.R 02e4290008102697b022c34cf44cdb59 *R/tableau.R 84f8fb05368fbb8427d690aa3febb792 *R/theme-foundation.R f27ae450272f12528e07ffc653a92923 *R/theme-map.R 4e5c3cf75eeec5331ff191ae730b3b17 *R/theme-solid.R f8b67fe51e8d31bd2ab03efb70147dd7 *R/tufte.R 2d0ef6891848fdaa3880f18e80a61ab1 *R/utils.R 5a1172b5f75705c1fe1f596aa71835d2 *R/wsj.R 93fbfa7eebb077c0f85d4b1f82436daf *build/ggthemes.pdf 0ca3d6ffdc8f782e707f4c5e4e7779da *data/canva_palettes.rda 9ddeef3af99a4d529e4984ea666a8f39 *data/ggthemes_data.rda 81ff727c2618273e734e41cc9b427142 *inst/WORDLIST d217a660e1cf584f0a311bc7a79fe5a7 *inst/examples/ex-bank_slopes.R 8a7aa608a3f27bf71ee394e6904072d6 *inst/examples/ex-calc_pal.R 7497a0f23baff51a1bf82c3362c9b876 *inst/examples/ex-calc_shape_pal.R f951d6ad8e88cc808ce92bbfb9fb78f9 *inst/examples/ex-canva_pal.R 788c7c03e5936b8c1e0d0eb5f2945737 *inst/examples/ex-circlefill_shape_pal.R 4cf7f031a4160f634a30938ca012b312 *inst/examples/ex-cleveland_shape_pal.R 7c4e68cf5eaa4a7fc1682a3181fafe0f *inst/examples/ex-colorblind.R b898bc5dce52c5825d16f46cc726fbf6 *inst/examples/ex-economist_pal.R b7fc2896898242ae68eb972ece9e5cf5 *inst/examples/ex-excel_new_pal.R 4953d0c35f4bda05bfd2e042d9cbdf20 *inst/examples/ex-excel_pal.R d4e6105c9128ac31dfaa5c895dbffc2d *inst/examples/ex-few_pal.R 97916233fd580dfdb6a472114b64d620 *inst/examples/ex-few_shape_pal.R 92e42499c32654ce543da988e6f1ab56 *inst/examples/ex-fivethirtyeight_pal.R eb6a318646dc1d6e10a3de214b0f7984 *inst/examples/ex-gdocs_pal.R 1d2870d18db408889d3320565c522fa6 *inst/examples/ex-geom_rangeframe.R ac37dff54b6796335a61068b590b66e3 *inst/examples/ex-geom_tufteboxplot.R 8c5d0c33430555668fe9d0ceb37bf981 *inst/examples/ex-palette_pander.R aa47cf7e65727cf425fe694dd017bafa *inst/examples/ex-ptol_pal.R a63f2e674398a4f47f7d2f2d44be7db6 *inst/examples/ex-scale_color_tableau.R 88388911ca9e7570d4ef2b8ec587d631 *inst/examples/ex-scale_colour_excel_classic.R b895f8190ea94e4d742cddecf494dcc9 *inst/examples/ex-scale_colour_excel_new.R ebf66ca09cb9fbcb9d7ade32f1dcb450 *inst/examples/ex-scale_colour_gradient2_tableau.R 1c349e0e1a4de87536d534df4da6f417 *inst/examples/ex-scale_colour_gradient_tableau.R a9d71c1910ed43d147f1ff9a0d047856 *inst/examples/ex-scale_colour_ptol.R cb35e002caab3906e7870e36c0042aaa *inst/examples/ex-scale_linetype_stata.R dbe67e1f5e567c5614700fd261b95752 *inst/examples/ex-scale_shape_stata.R d37fb9f90f8c390b3e819c29bb509345 *inst/examples/ex-scale_shape_tableau.R 1b7f685f9eb20fa89b89a11f26e3771e *inst/examples/ex-scale_shape_tremmel.R 8b69eac5a6521f259dd3beef33a29246 *inst/examples/ex-scale_solarized.R 088fbcb5ac12612aa1bf093a4a83e254 *inst/examples/ex-show_linetypes.R 7c24ec130d3ab12da38f38ef0b95029c *inst/examples/ex-show_shapes.R 1c8bbf7be026119b96a1beff3cc89770 *inst/examples/ex-solarized_pal.R 060f798e1f83b45edd335f086cbe86cd *inst/examples/ex-stata_pal.R 83c80b7ac0f626e90e0855ff37034b7f *inst/examples/ex-tableau_color_pal.R 5d0896a26893659962f21351c097dde6 *inst/examples/ex-tableau_div_gradient_pal.R 48a883f834c056dd2fc042cf2afe6965 *inst/examples/ex-tableau_seq_gradient_pal.R d9f66a4f7f05ccfc167334b8ebf2f204 *inst/examples/ex-tableau_shape_pal.R 463dff9392582f08b1ed1f9ec7b95c13 *inst/examples/ex-theme_base.R ad4d816657fa5623d5ad5a17ce780c04 *inst/examples/ex-theme_calc.R 3ade873b0052af4200cbe9030ff3df91 *inst/examples/ex-theme_clean.R 481e5524c372685f54b6f5b42592fa3a *inst/examples/ex-theme_economist.R 266b6768ac3d3240fd7f2286d9340b66 *inst/examples/ex-theme_excel.R 74540b17ce58c703d97a712028363f45 *inst/examples/ex-theme_excel_new.R 6b6d641d02c15fd7e12816cfb91183b8 *inst/examples/ex-theme_few.R aa03aa46f2357ef15ac4f3916862d575 *inst/examples/ex-theme_fivethirtyeight.R 15ec52ca9064f1a111dc7657840d30cc *inst/examples/ex-theme_gdocs.R e9a21478409254c049a0d78cf7a8c0e0 *inst/examples/ex-theme_hc.R 7631a1a8b1865c38ee2e98d882f2a1a1 *inst/examples/ex-theme_igray.R 9d9707fa0b12796f369c1141d5e41308 *inst/examples/ex-theme_map.R 4e313ef3a94e870f355a3ede6062e2d5 *inst/examples/ex-theme_pander.R e55e80fd4386a55ccd39bf136d862e26 *inst/examples/ex-theme_par.R aa7ef9cf6c3fb7370bb2a118018341c0 *inst/examples/ex-theme_solarized.R fe0a2ab5ab68487e3da919cce21a7fa7 *inst/examples/ex-theme_solid.R ff6faf71ef038d04cb311d088a86736d *inst/examples/ex-theme_stata.R 120d1aebef9f949845312aeb48c30494 *inst/examples/ex-theme_tufte.R 4a71389ed478d2986c9e7f247b868018 *inst/examples/ex-theme_wsj.R 192dab02abc6871bc2ae70432d23a0f5 *man/bank_slopes.Rd 4665ed6b93074c33ef0c24bc3c22a510 *man/calc_pal.Rd eabcb9eda397cda58ca28f2a51333cde *man/calc_shape_pal.Rd 83a58dae32829b9f039e0be9e2f9d11d *man/canva_pal.Rd a1a64b1f9b02d3c6d07100d4341e3ebb *man/canva_palettes.Rd d5d7dbfdbaa993048c262c7935c7fffc *man/circlefill_shape_pal.Rd a4f8607d8da8117b039a42d7ace73908 *man/cleveland_shape_pal.Rd aac24bf70c27e02087f5d5088ddb1376 *man/colorblind.Rd 77bf3324885a7eb667842738543a19c6 *man/economist_pal.Rd adf94a2243ba293d6b04d759ee4c988f *man/excel_new_pal.Rd d82f2a1e69c1edf414358ddf0b510a0c *man/excel_pal.Rd 2fd73a9d05d2f7ff369ad9c9dc8b9ed2 *man/few_pal.Rd 60ec6986bca1c54772229e5f31ae504e *man/few_shape_pal.Rd db2ec1462e0af723999952c03256d4b0 *man/fivethirtyeight_pal.Rd 03046a5b791d4a7d4df883525bd52e8a *man/gdocs_pal.Rd 25d32e19a20b792fce9fcdac42b51a25 *man/geom_rangeframe.Rd 31f2d20a32e3034ab5cdad289c3a4317 *man/geom_tufteboxplot.Rd bde1f647133538a8d94d6e25f381b38e *man/ggthemes.Rd 3f3add9a59bd391152ccd6ae85513407 *man/ggthemes_data.Rd 4846e9e747245ac7b1646107b65938c9 *man/hc_pal.Rd 13eb7ead192e3cd93e0f852c377422af *man/macros/funclink.Rd 347f4d4ddfc92021c3b845b375bb35cd *man/palette_pander.Rd 796fec73ccd2deb1af81831458d39801 *man/ptol_pal.Rd f0c606a80d9e3750246aa228dfea171a *man/range_breaks.Rd df823be6f92e37bfba443ab52853ba8b *man/scale_calc.Rd e40402aa94fc46a585cb9a573bfd5664 *man/scale_color_tableau.Rd 03bf2d2ddf186c9991458f90ee22b80c *man/scale_colour_canva.Rd 26ca79b01ee562a8f524d218806c40a9 *man/scale_colour_gradient2_tableau.Rd 9d34764916b72014744a7068a555fab8 *man/scale_colour_gradient_tableau.Rd c095a6e2578b4cd9a676904cea1e045b *man/scale_economist.Rd c5cf0df62e08f63050efd39369f32c69 *man/scale_excel.Rd d862f70f36281d34ea8ebf822e41e01a *man/scale_excel_new.Rd 184efc332e51e6f766c3162704c34094 *man/scale_few.Rd 660b3a9384640ec65fabb55e9372c4c4 *man/scale_fivethirtyeight.Rd dbe408e477428433d3d217b523ebfc17 *man/scale_gdocs.Rd fefafd2bdcd04e5c67d6e9ac0432517d *man/scale_hc.Rd 06ede03451296bf50c3860e5e6795712 *man/scale_linetype_stata.Rd 4dbd6de6cc3a043fdda6a1a253ee5f6f *man/scale_pander.Rd 639ab6ddd9e6355d658658c21005cdc3 *man/scale_ptol.Rd 670b83a7af4a5fd3fb9b87625a608da1 *man/scale_shape_calc.Rd a71026e440b48010ba0510234915be38 *man/scale_shape_circlefill.Rd 643cda92d72047651a0245ec39d2d3b8 *man/scale_shape_cleveland.Rd a76894abc7faa02cce3cce483c58677c *man/scale_shape_few.Rd ba21d4a26a5fb0045a847175a3555342 *man/scale_shape_stata.Rd b7f13c1319a3650a4e1dc18c4362ab3a *man/scale_shape_tableau.Rd 22df84260144949c401100ed0b481e6d *man/scale_shape_tremmel.Rd dcbdb5ced1ff2ad7c118e7da777424a6 *man/scale_solarized.Rd 435eca533382621f846b7e273d55dd66 *man/scale_stata.Rd a7955ae86c688adb809b4b297001e59d *man/scale_wsj.Rd 8f9069298329562e94c1bae6bdd64eba *man/show_linetypes.Rd 1693af21e63e3cff1b1fad2a5476de96 *man/show_shapes.Rd 3d0300f50600ec732ba2c18b94239b0b *man/smart_digits.Rd d33399382841aa5af8921a345e372a41 *man/solarized_pal.Rd 0461d57ce0b53527edc7df5589f2b80a *man/solarized_rebase.Rd 329182d775ec9d56cfa25d4eda16db44 *man/stat_fivenumber.Rd 4e481cc395024ec2950a8007663dcaeb *man/stata_linetype_pal.Rd b7f5e86788895fcae0bfac81a357bb46 *man/stata_pal.Rd 7502b35031401389a5e9da0b31c134f6 *man/stata_shape_pal.Rd dcdb2a99d6380424a17507b1c8901d45 *man/tableau_color_pal.Rd 45cd72fdebf341a9b2a2e7dca4e5b532 *man/tableau_gradient_pal.Rd e692c711ef3af89b476a1cc1c12d3dfd *man/tableau_shape_pal.Rd 5c986cfa4e5ecd97b8ffb8db7452812a *man/theme_base.Rd 673d0b621aa019b654d242275ce7ea6a *man/theme_calc.Rd 0d28040934ca95411b23aea586a61e4d *man/theme_clean.Rd 97e72d1120a8c29040d50a81fd2ab519 *man/theme_economist.Rd d40f6fc22963351a7ac8af5bcd3bf061 *man/theme_excel.Rd 82440e4ed2591a6264692bd1ac0c2123 *man/theme_excel_new.Rd 7e058a7109f02d5f8ad1d8694f7eb84c *man/theme_few.Rd e207b9556e24cbfc1a94478ff421b5ee *man/theme_fivethirtyeight.Rd 9d31458efaa17fed661a55c5f2c9483a *man/theme_foundation.Rd cbdfab37e751195aaada5daa6a0913a4 *man/theme_gdocs.Rd 461758498a4a38475a5cc7d42d5be8ef *man/theme_hc.Rd 47ae5c3efb2ca013fbd32205b60407fa *man/theme_igray.Rd 2a75b4d697f1daba7322f405d8df9257 *man/theme_map.Rd 1964fe9e1514d9e1145136d422a6feef *man/theme_pander.Rd 1dd3da786a5bd96ff289ee3e6e0278b5 *man/theme_par.Rd a2b530a7065bc0b6d9d618464b10f763 *man/theme_solarized.Rd cae14ced45c7de5e2ea01b2c2c9d0933 *man/theme_solid.Rd 5001b9fcdecc71fa32e26873dbc39f5a *man/theme_stata.Rd 94a94f89d4c2027394e04f3c62727e70 *man/theme_tufte.Rd f39a19c2f2cdbea98cb9122e00c842ff *man/theme_wsj.Rd 69640c553f55e7b29382de6714ee9114 *man/tremmel_shape_pal.Rd 73eb81b3f12be62d732bf803b5b6a064 *man/wsj_pal.Rd b0ab17eb094c0a55dc40999f1f0c666a *tests/figs/deps.txt 1638d9c9f506b9751d57a6602061eacc *tests/figs/few/theme-few.svg 0622a97a2aaa3c342f09636052c2d7f5 *tests/spelling.R d220aef089ea1a857ed208d7a1bffc96 *tests/testthat.R 30dd48c6b2308bad580db967dc8fad7c *tests/testthat/helper-utils.R db408a0fde7fb629ee758a4f3dcccc19 *tests/testthat/helper-vdiffr.R 403c0363f08d9f9388928119aae57ce4 *tests/testthat/test-banking.R 529ac2ce5673819fa28dcad5e3d25021 *tests/testthat/test-base.R d6a6f30985f09a2af7e7211fa5d48d30 *tests/testthat/test-calc.R 79c51355f562276365dd26eeab8595f0 *tests/testthat/test-canva.R e41fa2918d44254455b6cd51044e7eb5 *tests/testthat/test-colorblind.R 3b3a4f2f328b1f9eb7a172af69e3b47e *tests/testthat/test-economist.R 75ca214eb169678a17b937139e1c71c5 *tests/testthat/test-excel.R af39ba164db0bd8f370827d7af5a2a2f *tests/testthat/test-few.R 676bb456b5b89ce6d9889a041db16efa *tests/testthat/test-fivethirtyeight.R 7470e5be0f0fb413438c7298de464419 *tests/testthat/test-gdocs.R f7ba6ca1639ea3ebea3892f982ac8896 *tests/testthat/test-geom-rangeframe.R dbcbd642a21c18b19d85add6807a157f *tests/testthat/test-hc.R 0793b622211ea63703b59a1ddf36ded7 *tests/testthat/test-igray.R 2f0e1aa4256e0aa7608f97cadc49ba92 *tests/testthat/test-pander.R b2e37501be8f4d0e3b193152dd24fb0e *tests/testthat/test-ptol.R a2dfb5b5b281dfcb62561085b5b4cea9 *tests/testthat/test-scales_tufte.R e8d239dace467de68fad59cb1638320b *tests/testthat/test-shapes.R b567065fcfb08c5fd8fa007b9928da90 *tests/testthat/test-show.R f8e4a85b3391619292b6b241deccb1b0 *tests/testthat/test-solarized.R 4ae606c1aefd3078444c4b316f89ddd0 *tests/testthat/test-stat_fivenumber.R 98654b4fc8b9ba89e7e6c80d43081fbd *tests/testthat/test-stata.R 22af1a44f63958860cc5e22ab95e221c *tests/testthat/test-tableau.R aefe55e6827f6bccd6b5adfb6b3f457b *tests/testthat/test-theme_map.R 60bb532e53990f729f5c5aa78bfdd494 *tests/testthat/test-theme_solid.R bb577ff493c6b098c66af7270863e141 *tests/testthat/test-tufte.R 77b616b42366dbe57488260dc829c6d1 *tests/testthat/test-tufteboxplot.R c025a2e632bd3a38002e45bc1bb94588 *tests/testthat/test-wsj_pal.R ggthemes/inst/0000755000176200001440000000000013774436616013053 5ustar liggesusersggthemes/inst/examples/0000755000176200001440000000000013774436616014671 5ustar liggesusersggthemes/inst/examples/ex-theme_tufte.R0000644000176200001440000000054313774445250017733 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point() + scale_x_continuous(breaks = extended_range_breaks()(mtcars$wt)) + scale_y_continuous(breaks = extended_range_breaks()(mtcars$mpg)) + ggtitle("Cars") p + geom_rangeframe() + coord_cartesian(clip="off") + theme_tufte() p + geom_rug() + theme_tufte(ticks = FALSE) ggthemes/inst/examples/ex-theme_stata.R0000644000176200001440000000107713774436616017731 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~ am) + labs(title = "Graphs by car type", x = "Weight (lbs.)", y = "MPG") # s2color p + theme_stata() + scale_colour_stata("s2color") # s2mono p + theme_stata(scheme = "s2mono") + scale_colour_stata("mono") # s1color p + theme_stata(scheme = "s2color") + scale_colour_stata("s1color") # s1rcolor p + theme_stata(scheme = "s1rcolor") + scale_colour_stata("s1rcolor") # s1mono p + theme_stata(scheme = "s1mono") + scale_colour_stata("mono") ggthemes/inst/examples/ex-theme_par.R0000644000176200001440000000040313774436616017367 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_par() # theme changes with respect to values of par par(font = 2, col.lab = "red", fg = "white", bg = "black") p + theme_par() ggthemes/inst/examples/ex-theme_gdocs.R0000644000176200001440000000024013774436616017703 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_gdocs() + scale_color_gdocs() ggthemes/inst/examples/ex-ptol_pal.R0000644000176200001440000000013413774436616017236 0ustar liggesuserslibrary("scales") show_col(ptol_pal()(6)) show_col(ptol_pal()(4)) show_col(ptol_pal()(12)) ggthemes/inst/examples/ex-tableau_color_pal.R0000644000176200001440000000036113774436616021075 0ustar liggesuserslibrary("scales") palettes <- ggthemes_data[["tableau"]][["color-palettes"]][["regular"]] for (palname in names(palettes)) { pal <- tableau_color_pal(palname) max_n <- attr(pal, "max_n") show_col(pal(max_n)) title(main = palname) } ggthemes/inst/examples/ex-theme_wsj.R0000644000176200001440000000046113774436616017414 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) + ggtitle("Diamond Prices") p + scale_colour_wsj("colors6", "") + theme_wsj() # Use a gray background instead p + scale_colour_wsj("colors6", "") + theme_wsj(color = "gray") ggthemes/inst/examples/ex-show_shapes.R0000644000176200001440000000013213774436616017745 0ustar liggesuserslibrary("scales") show_shapes(shape_pal()(5)) show_shapes(shape_pal()(3), labels = TRUE) ggthemes/inst/examples/ex-theme_map.R0000644000176200001440000000051413774436616017365 0ustar liggesuserslibrary("maps") library("ggplot2") us <- fortify(map_data("state"), region = "region") gg <- ggplot() + geom_map(data = us, map = us, aes(x = long, y = lat, map_id = region, group = group), fill = "white", color = "black", size = 0.25) + coord_map("albers", lat0 = 39, lat1 = 45) + theme_map() gg ggthemes/inst/examples/ex-calc_shape_pal.R0000644000176200001440000000010413774436616020337 0ustar liggesuserslibrary("ggplot2") \dontrun{ show_shapes(calc_shape_pal()(13)) } ggthemes/inst/examples/ex-economist_pal.R0000644000176200001440000000015013774436616020256 0ustar liggesuserslibrary("scales") show_col(economist_pal()(6)) ## fill palette show_col(economist_pal(fill = TRUE)(6)) ggthemes/inst/examples/ex-theme_fivethirtyeight.R0000644000176200001440000000034413774436616022027 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars, aes(x = wt, y = mpg, colour = factor(gear))) + geom_point() + facet_wrap(~am) + geom_smooth(method = "lm", se = FALSE) + scale_color_fivethirtyeight() + theme_fivethirtyeight() p ggthemes/inst/examples/ex-scale_shape_tableau.R0000644000176200001440000000022713774436616021373 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, shape = factor(gear))) + facet_wrap(~am) p + scale_shape_tableau() ggthemes/inst/examples/ex-fivethirtyeight_pal.R0000644000176200001440000000006613774436616021502 0ustar liggesuserslibrary("scales") show_col(fivethirtyeight_pal()(3)) ggthemes/inst/examples/ex-solarized_pal.R0000644000176200001440000000015713774436616020261 0ustar liggesuserslibrary("scales") show_col(solarized_pal()(2)) show_col(solarized_pal()(3)) show_col(solarized_pal("red")(4)) ggthemes/inst/examples/ex-theme_few.R0000644000176200001440000000054513774436616017375 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_few() + scale_colour_few() p + theme_few() + scale_colour_few("Light") p + theme_few() + scale_colour_few("Dark") ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, shape = factor(gear))) + theme_few() + scale_shape_few() ggthemes/inst/examples/ex-scale_colour_excel_new.R0000644000176200001440000000025013774436616022126 0ustar liggesuserslibrary("ggplot2") ggplot(mtcars, aes(x = wt, y = mpg, colour = factor(gear))) + geom_point() + ggtitle("Cars") + theme_excel_new() + scale_colour_excel_new() ggthemes/inst/examples/ex-theme_base.R0000644000176200001440000000035713774436616017527 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_base() # Change values of par par(fg = "blue", bg = "gray", col.lab = "red", font.lab = 3) p + theme_base() ggthemes/inst/examples/ex-scale_color_tableau.R0000644000176200001440000000063113774436616021410 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) + theme_igray() palettes <- ggthemes_data[["tableau"]][["color-palettes"]][["regular"]] for (palette in head(names(palettes), 3L)) { print(p + scale_colour_tableau(palette) + ggtitle(palette)) } # the order of colour can be reversed p + scale_color_tableau(direction = -1) ggthemes/inst/examples/ex-theme_pander.R0000644000176200001440000000065413774436616020066 0ustar liggesusersrequire("ggplot2") if (require("pander")) { p <- ggplot(mtcars, aes(x = mpg, y = wt)) + geom_point() p + theme_pander() panderOptions("graph.grid.color", "red") p + theme_pander() p <- ggplot(mtcars, aes(wt, mpg, colour = factor(cyl))) + geom_point() p + theme_pander() + scale_color_pander() ggplot(mpg, aes(x = class, fill = drv)) + geom_bar() + scale_fill_pander() + theme_pander() } ggthemes/inst/examples/ex-gdocs_pal.R0000644000176200001440000000005513774436616017361 0ustar liggesuserslibrary("scales") show_col(gdocs_pal()(20)) ggthemes/inst/examples/ex-theme_economist.R0000644000176200001440000000157213774436616020615 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) + # Economist puts x-axis labels on the right-hand side scale_y_continuous(position = "right") ## Standard p + theme_economist() + scale_colour_economist() # Change axis lines to vertical p + theme_economist(horizontal = FALSE) + scale_colour_economist() + coord_flip() ## White panel/light gray background p + theme_economist_white() + scale_colour_economist() ## All white variant p + theme_economist_white(gray_bg = FALSE) + scale_colour_economist() \dontrun{ ## The Economist uses ITC Officina Sans library("extrafont") p + theme_economist(base_family="ITC Officina Sans") + scale_colour_economist() ## Verdana is a widely available substitute p + theme_economist(base_family="Verdana") + scale_colour_economist() } ggthemes/inst/examples/ex-geom_rangeframe.R0000644000176200001440000000055213774444751020545 0ustar liggesuserslibrary("ggplot2") ggplot(mtcars, aes(wt, mpg)) + geom_point() + geom_rangeframe() + coord_cartesian(clip="off") + theme_tufte() # In the example above, # `coord_cartesian(clip="off")`` ensures that the full width of the line is drawn. # if you know a better way to fix this, # please open an issue or PR on github https://github.com/jrnold/ggthemes/issue ggthemes/inst/examples/ex-show_linetypes.R0000644000176200001440000000014613774436616020503 0ustar liggesuserslibrary("scales") show_linetypes(linetype_pal()(3)) show_linetypes(linetype_pal()(3), labels = TRUE) ggthemes/inst/examples/ex-scale_colour_excel_classic.R0000644000176200001440000000041013774436616022754 0ustar liggesuserslibrary("ggplot2") ggplot(mtcars, aes(x = wt, y = mpg, colour = factor(gear))) + geom_point() + ggtitle("Cars") + theme_excel() + scale_colour_excel() ggplot(diamonds, aes(x = clarity, fill = cut)) + geom_bar() + scale_fill_excel() + theme_excel() ggthemes/inst/examples/ex-tableau_div_gradient_pal.R0000644000176200001440000000045613774436616022423 0ustar liggesusersx <- seq(-1, 1, length = 100) r <- sqrt(outer(x ^ 2, x ^ 2, "+")) palettes <- ggthemes_data[["tableau"]][["color-palettes"]][["ordered-diverging"]] for (palname in names(palettes)) { col <- tableau_div_gradient_pal(palname)(seq(0, 1, length = 12)) image(r, col = col) title(main = palname) } ggthemes/inst/examples/ex-scale_colour_gradient2_tableau.R0000644000176200001440000000076013774436616023537 0ustar liggesuserslibrary("ggplot2") df <- data.frame( x = runif(100), y = runif(100), z1 = rnorm(100), z2 = abs(rnorm(100)) ) p <- ggplot(df, aes(x, y)) + geom_point(aes(colour = z2)) palettes <- ggthemes_data[["tableau"]][["color-palettes"]][["ordered-diverging"]] for (palette in head(names(palettes))) { print(p + scale_colour_gradient2_tableau(palette) + ggtitle(palette)) } # If you need to reverse a palette, use a transformation p + scale_colour_gradient2_tableau(trans = "reverse") ggthemes/inst/examples/ex-colorblind.R0000644000176200001440000000032713774436616017557 0ustar liggesuserslibrary("ggplot2") library("scales") show_col(colorblind_pal()(8)) p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_igray() + scale_colour_colorblind() ggthemes/inst/examples/ex-geom_tufteboxplot.R0000644000176200001440000000121613774436616021174 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars, aes(factor(cyl), mpg)) # with a point for the median and lines for whiskers p + geom_tufteboxplot() # with a line for the interquartile range and points for whiskers p + geom_tufteboxplot(median.type = "line", whisker.type = "point", hoffset = 0) # with a wide line for the interquartile range and lines for whiskers p + geom_tufteboxplot(median.type = "line", hoffset = 0, width = 3) # with an offset line for the interquartile range and lines for whiskers p + geom_tufteboxplot(median.type = "line") # combined with theme_tufte p + geom_tufteboxplot() + theme_tufte() + theme(axis.ticks.x = element_blank()) ggthemes/inst/examples/ex-excel_new_pal.R0000644000176200001440000000017013774436616020231 0ustar liggesuserslibrary("scales") for (i in names(ggthemes::ggthemes_data$excel$palettes)) { show_col(excel_new_pal(theme = i))(6) } ggthemes/inst/examples/ex-theme_calc.R0000644000176200001440000000047013774436616017513 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) + theme_calc() p + scale_color_calc() q <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, shape = factor(gear))) + facet_wrap(~am) + theme_calc() q + scale_shape_calc() ggthemes/inst/examples/ex-theme_excel_new.R0000644000176200001440000000025713774436616020565 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_excel_new() + scale_colour_excel_new() ggthemes/inst/examples/ex-palette_pander.R0000644000176200001440000000004313774436616020412 0ustar liggesusers\dontrun{ palette_pander(TRUE) } ggthemes/inst/examples/ex-scale_colour_ptol.R0000644000176200001440000000047713774436616021146 0ustar liggesuserslibrary("ggplot2") p2 <- ggplot(mtcars, aes(x = wt, y = mpg, colour = factor(gear))) + geom_point() + geom_smooth(method = "lm", se = FALSE) + scale_color_ptol("cyl") + theme_minimal() + ggtitle("Cars") ggplot(diamonds, aes(x = clarity, fill = cut)) + geom_bar() + scale_fill_ptol() + theme_minimal() ggthemes/inst/examples/ex-scale_colour_gradient_tableau.R0000644000176200001440000000063513774436616023456 0ustar liggesuserslibrary("ggplot2") df <- data.frame( x = runif(100), y = runif(100), z1 = rnorm(100), z2 = abs(rnorm(100)) ) p <- ggplot(df, aes(x, y)) + geom_point(aes(colour = z2)) + theme_igray() palettes <- ggthemes_data[["tableau"]][["color-palettes"]][["ordered-sequential"]] for (palette in head(names(palettes))) { print(p + scale_colour_gradient_tableau(palette) + ggtitle(palette)) } ggthemes/inst/examples/ex-circlefill_shape_pal.R0000644000176200001440000000034113774436616021550 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars, aes(x = mpg, y = hp, shape = factor(cyl))) + geom_point() p + scale_shape_tremmel() p + scale_shape_circlefill() p + scale_shape_cleveland() p + scale_shape_cleveland(overlap = TRUE) ggthemes/inst/examples/ex-theme_solid.R0000644000176200001440000000027613774436616017727 0ustar liggesuserslibrary("ggplot2") ggplot(mtcars, aes(wt, mpg)) + geom_point() + theme_solid(fill = "white") ggplot(mtcars, aes(wt, mpg)) + geom_point(color = "white") + theme_solid(fill = "black") ggthemes/inst/examples/ex-stata_pal.R0000644000176200001440000000023513774436616017376 0ustar liggesuserslibrary("scales") show_col(stata_pal("s2color")(15)) show_col(stata_pal("s1rcolor")(15)) show_col(stata_pal("s1color")(15)) show_col(stata_pal("mono")(15)) ggthemes/inst/examples/ex-scale_linetype_stata.R0000644000176200001440000000054213774436616021623 0ustar liggesusersrequire("ggplot2") if (require("tidyr") && require("dplyr")) { rescale01 <- function(x) { (x - min(x)) / diff(range(x)) } gather(economics, variable, value, -date) %>% group_by(variable) %>% mutate(value = rescale01(value)) %>% ggplot(aes(x = date, y = value, linetype = variable)) + geom_line() + scale_linetype_stata() } ggthemes/inst/examples/ex-cleveland_shape_pal.R0000644000176200001440000000044713774436616021404 0ustar liggesusers### (discrete). library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, shape = factor(gear))) + facet_wrap(~am) + theme_bw() # overlapping symbol palette p + scale_shape_cleveland() # non-overlapping symbol palette p + scale_shape_cleveland(overlap = FALSE) ggthemes/inst/examples/ex-theme_solarized.R0000644000176200001440000000074613774436616020613 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) # Light version with different main accent colors for (accent in names(ggthemes::ggthemes_data[["solarized"]][["accents"]])) { print(p + theme_solarized() + scale_colour_solarized(accent)) } # Dark version p + theme_solarized(light = FALSE) + scale_colour_solarized("blue") # Alternative theme p + theme_solarized_2(light = FALSE) + scale_colour_solarized("blue") ggthemes/inst/examples/ex-calc_pal.R0000644000176200001440000000005413774436616017163 0ustar liggesuserslibrary("scales") show_col(calc_pal()(12)) ggthemes/inst/examples/ex-theme_hc.R0000644000176200001440000000257313774436616017211 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_hc() + scale_colour_hc() p + theme_hc(bgcolor = "darkunica") + scale_colour_hc("darkunica") dtemp <- data.frame(months = factor(rep(substr(month.name, 1, 3), 4), levels = substr(month.name, 1, 3)), city = rep(c("Tokyo", "New York", "Berlin", "London"), each = 12), temp = c(7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6, -0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8, 24.1, 20.1, 14.1, 8.6, 2.5, -0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0, 3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6, 4.8)) ggplot(dtemp, aes(x = months, y = temp, group = city, color = city)) + geom_line() + geom_point(size = 1.1) + ggtitle("Monthly Average Temperature") + theme_hc() + scale_colour_hc() ggplot(dtemp, aes(x = months, y = temp, group = city, color = city)) + geom_line() + geom_point(size = 1.1) + ggtitle("Monthly Average Temperature") + theme_hc(bgcolor = "darkunica") + scale_fill_hc("darkunica") ggthemes/inst/examples/ex-tableau_seq_gradient_pal.R0000644000176200001440000000047613774436616022433 0ustar liggesuserslibrary("scales") x <- seq(0, 1, length = 25) r <- sqrt(outer(x ^ 2, x ^ 2, "+")) palettes <- ggthemes_data[["tableau"]][["color-palettes"]][["ordered-sequential"]] for (palname in names(palettes)) { col <- tableau_seq_gradient_pal(palname)(seq(0, 1, length = 12)) image(r, col = col) title(main = palname) } ggthemes/inst/examples/ex-bank_slopes.R0000644000176200001440000000064613774436616017734 0ustar liggesuserslibrary("ggplot2") # Use the classic sunspot data from Cleveland's original paper x <- seq_along(sunspot.year) y <- as.numeric(sunspot.year) # Without banking m <- ggplot(data.frame(x = x, y = y), aes(x = x, y = y)) + geom_line() m ## Using the default method, Median Absolute Slope ratio <- bank_slopes(x, y) m + coord_fixed(ratio = ratio) ## Using culling ## Average Absolute Slope bank_slopes(x, y, method = "as") ggthemes/inst/examples/ex-excel_pal.R0000644000176200001440000000012113774436616017354 0ustar liggesuserslibrary("scales") show_col(excel_pal()(7)) show_col(excel_pal(line = FALSE)(7)) ggthemes/inst/examples/ex-theme_excel.R0000644000176200001440000000050513774436616017710 0ustar liggesuserslibrary("ggplot2") # Line and scatter plot colors p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_excel() + scale_colour_excel() # Bar plot (area/fill) colors ggplot(mpg, aes(x = class, fill = drv)) + geom_bar() + scale_fill_excel() + theme_excel() ggthemes/inst/examples/ex-theme_clean.R0000644000176200001440000000027013774436616017671 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars, aes(x = wt, y = mpg, colour = factor(gear))) + geom_point() + facet_wrap(~am) + geom_smooth(method = "lm", se = FALSE) + theme_clean() p ggthemes/inst/examples/ex-scale_solarized.R0000644000176200001440000000026113774436616020570 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_solarized() + scale_colour_solarized() ggthemes/inst/examples/ex-scale_shape_stata.R0000644000176200001440000000024513774436616021072 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, shape = factor(gear))) + facet_wrap(~am) p + theme_stata() + scale_shape_stata() ggthemes/inst/examples/ex-few_pal.R0000644000176200001440000000014513774436616017043 0ustar liggesuserslibrary("scales") show_col(few_pal()(7)) show_col(few_pal("Dark")(7)) show_col(few_pal("Light")(7)) ggthemes/inst/examples/ex-scale_shape_tremmel.R0000644000176200001440000000031313774436616021417 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars, aes(x = mpg, y = hp, shape = factor(cyl))) + geom_point() p + scale_shape_tremmel() p + scale_shape_tremmel(alt = TRUE) p + scale_shape_tremmel(overlap = TRUE) ggthemes/inst/examples/ex-canva_pal.R0000644000176200001440000000162713774436616017360 0ustar liggesusersrequire("ggplot2") require("tibble") if (require("purrr") && require("scales") && require("dplyr")) { canva_df <- map2_df( canva_palettes, names(canva_palettes), ~ tibble( colors = .x, .id = seq_along(colors), palette = .y ) ) ggplot(canva_df, aes( y = palette, x = .id, fill = colors )) + geom_raster() + scale_fill_identity(guide = FALSE) + theme_minimal() + theme(panel.grid = element_blank(), axis.text.x = element_blank()) + labs(x = "", y = "") show_col(canva_pal("Fresh and bright")(4)) show_col(canva_pal("Cool blues")(4)) show_col(canva_pal("Modern and crisp")(4)) } ggthemes/inst/examples/ex-theme_igray.R0000644000176200001440000000021613774436616017722 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_igray() ggthemes/inst/examples/ex-tableau_shape_pal.R0000644000176200001440000000014113774436616021053 0ustar liggesusers\dontrun{ # need to set a font containing these values show_shapes(tableau_shape_pal()(5)) } ggthemes/inst/examples/ex-few_shape_pal.R0000644000176200001440000000013713774436616020224 0ustar liggesusers\dontrun{ # need to set a font containing unicode values show_shapes(few_shape_pal()(5)) } ggthemes/inst/WORDLIST0000644000176200001440000000150613775062400014232 0ustar liggesusersACM Agrawala al Analytics AppVeyor Argwala Banff Beamer behaviour Bembo blosxom bowerth bugfix Bugfix calc Calc canva Canva cartesian cgi charactger CMD colores colour Colour continous coord cran daroczig de devtools et extrafont fivethirtyeight FiveThirtyEight gdocs geoms Geoms ggplot github grey Hanrahan hc Heer hexa Highcharts http https impactful Impactful InfoVis ITC jbkunst JS Kliever Lewandowsky LibreOffic lifecycle linepattern linetype Linetype linetypes Lothar lty Maneesh McGill nd Officina paletas paul Pinterest pkgdown PolicyViz ptoche ptol pts quartile rcolor rstudio Saenz SandyMuspratt Schoonover's Schwabish sj solarized Solarized Spiekerblog SRON stata Stata Stribley Tabaleau Tableu Tejeda thatn tol Tol Tol's tradeblotter Tremmel tufte Tufte Tufte's unica unicode vdiffr Verdana weitzner wordpress WS wsj WSJ Zdeb