Mercurial > hg > Papers > 2014 > kaito_mid_thesis
changeset 0:8bf606ea2dba
add all files
author | Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 03 Nov 2013 22:15:28 +0900 |
parents | |
children | cc02718aa4be |
files | 2013_mid.pdf 2013_mid.tex figure/.DS_Store figure/codesegment.pdf figure/continuation.pdf figure/env_code.pdf mediabb.sty pic/.DS_Store pic/emblem-bitmap.eps |
diffstat | 9 files changed, 1555 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/2013_mid.tex Sun Nov 03 22:15:28 2013 +0900 @@ -0,0 +1,139 @@ +\documentclass[twocolumn,twoside,9.5pt]{jarticle} +\usepackage[dvips]{graphicx} +\usepackage{picins} +\usepackage{fancyhdr} +\pagestyle{fancy} +\usepackage{mediabb} +\usepackage{float} + +\lhead{\parpic{\includegraphics[height=1zw,clip,keepaspectratio]{pic/emblem-bitmap.eps}}琉球大学主催 工学部情報工学科 卒業研究発表会} +\rhead{} +\cfoot{} + +\setlength{\topmargin}{-1in \addtolength{\topmargin}{15mm}} +\setlength{\headheight}{0mm} +\setlength{\headsep}{5mm} +\setlength{\oddsidemargin}{-1in \addtolength{\oddsidemargin}{11mm}} +\setlength{\evensidemargin}{-1in \addtolength{\evensidemargin}{21mm}} +\setlength{\textwidth}{181mm} +\setlength{\textheight}{246mm} +\setlength{\footskip}{0mm} +\pagestyle{empty} + +\begin{document} +\title{Continuation based C コンパイラの LLVM 3.4 上での実装} +\author{105711B 氏名 徳森 海斗 指導教員 : 河野 真治} +%\date{2013年11月3日} +\maketitle +\thispagestyle{fancy} + +\section{背景及び研究目的} +現代社会においてプログラムは様々な場所で用いられ,その用途に応じて求められる要素も様々である.例えば Real-time な制御が重要視される場合には速度が,組込みシステムなどのメモリが制限される環境では軽量なプログラムが求められる.軽量で高速であるという条件に最も適しているのはアセンブリ言語であるが,低レベル過ぎてわかりづらい上に,アーキテクチャへの依存性が高いため汎用的でない.当研究室ではそういった要求に応える言語として Continuation based C (以下 CbC) を提案している. +CbC のコンパイラは2001年に micro-c をベースとしたものが開発され,続いて2008年の研究により GCC ベースのものが開発された.これにより GCC の持つ最適化の恩恵を受けることに成功している.しかし、 Mac OS X の最新版である Mavericks が C コンパイラとして GCC ではなく clang を用いるようになったことや, LLVM にも GCC 同様に強力な最適化機能が存在し,さらにエラーメッセージが GCC に比べ丁寧であるという特徴を持つことから, GCC から clang に移り変わる人々も少なくない.そこで本研究では, micro-c , GCC に続く LLVM/clang ベースのコンパイラの開発を行う. +\section{Continuation based C (CbC)} +CbC のでは処理をコードセグメントという単位で記述し,コード間の移動に goto (軽量継続)を用いる. +構文は C と同じであるが, ループ制御や関数コールが取り除かれる. + +\subsection{継続 (goto)} +コードセグメントの記述は C の関数の構文と同じで, 型に ``\verb+__code+'' を使うことで宣言できる. +コードセグメントへの移動は ``goto'' の後にコードセグメント名と引数を並べて記述することで行える. +この goto による処理の遷移を継続と呼ぶ. +図\ref{fig:cs}はコードセグメント間の処理の流れを表している. + +\begin{figure}[htpb] + \begin{center} +\scalebox{0.30}{\includegraphics{figure/codesegment.pdf}} + \end{center} + \caption{コードセグメント間の継続(goto)} + \label{fig:cs} +\end{figure} + +\subsection{コードセグメント (code segment)} +コードセグメントは C の関数と異なり戻り値を持たず, 処理が終われば次のコードセグメントへと処理を移る. +C において関数呼び出しを繰り返し行う場合, 呼び出された関数の引数の数だけスタックに値が積まれていく. +しかし, 戻り値を持たないコードセグメントではスタックに値を積んでいく必要な無く, スタックは変更されない. +このようなスタックに値を積まない継続,つまり呼び出し元の環境を持たない継続を軽量継続と言い,軽量継続により並列化, ループ制御, 関数コールとスタックの操作を意識した最適化がソースコードレベルで行えるようになる. + +\section{LLVM/clang 3.4 上での実装} +ここではLLVM/clang 3.4 上でどのように CbC コンパイラを実装するかについて述べる. +%CbC コンパイラを実現するには以下の機能を実装する必要がある. +%\begin{itemize} +%\item ``\_\_code"のパース +%\item goto シンタックスの追加 +%\item 軽量継続の実装 +%\item 環境付き継続の実装 +%\end{itemize} + +\subsection{``\_\_code"のパース} +予約語は clang/include/clang/Basic/TokenKinds.def で登録する.登録する予約語がC,あるいはC++のどの規格で使用されるものかもここで記述し,これによりclangのパーサーが``\_\_code"をkw\_\_\_codeとして認識するようになる. + +\subsection{goto シンタックスの追加} +通常, goto のシンタックスは ``goto ラベル名;" となっている.CbC ではこれに加え,``goto codeSegment();"の形でコードセグメントを呼び出すシンタックスを追加する必要がある. + +\subsection{軽量継続の実装} +軽量継続の実装は Tail Call Elimination (末尾除去)の強制によって実現する. これによりコードセグメント間の移動に call ではなく jmp 命令が用いられるようになる.図\ref{fig:continue}は Tail Call Elimination が行われた際のプログラムの処理を表している. +funcB は jmp 命令で funcC を呼び出す. +funcC は, 戻り値を funcB ではなく funcA へと返すことになる. + +\begin{figure}[htpb] + \begin{center} +\scalebox{0.25}{\includegraphics{figure/continuation.pdf}} + \end{center} + \caption{Tail Call Elimination} + \label{fig:continue} +\end{figure} + +\subsection{Tail Call Elimination の強制} +LLVM で Tail Call Elimination を行う場合,対象となる関数の isTailCall というフラグを true にした上で, アーキテクチャ によって異なるいくつかの条件を満たす必要がある.現在は x86/x86-64 と PowerPC がこの最適化を利用できる.これらのアーキテクチャでの条件を以下に示す. +%isTailCall を true にする処理は TailCallElim という Pass によって行われる.通常この Pass は Optimize level が 2 以上の場合にのみ有効化されるが, コード内に``\_\_code"が含まれる場合にはこの Pass を有効化し,コードセグメントに対してのみ処理を行うように改変した. +\begin{itemize} +\setlength{\itemsep}{0mm} +\item caller と callee の calling convention が fastcc, cc10, cc11 のいずれかである. +\item 関数呼び出しが return の直前に行われており, void 型である. +\item 可変長引数リストを使用していない. +\item tailcallopt が有効になっている. +\item byval parameter を使用していない. +\item PIC/GOT を用いる場合,visibility が hidden か protected である必要がある. +\end{itemize} +%また,X86/X86-64 の場合には Sibling call optimization というものがあり,いくつかの条件を満たすことで Tail Call Elimination と同様の最適化を受けることができるが, 別アーキテクチャのサポートも考え, Tail Call Elimination を用い, Sibling call optimization は使用しない. +\subsection{環境付き継続} +CbC には通常の C の関数からコードセグメントに継続する際, + その関数から値を返す処理への継続を得ることができる. +これを環境付き継続といい,Cとの互換性を持たせるためにこの機能が必要となる. +環境付き継続は, CbC で定義した以下の二種類特殊変数によって実現される. +\verb+__environment+ は, 環境を表す情報である. +\verb+__return+ は, 環境付き継続によって継続した後,環境付き継続を行った関数の呼び出し元に戻り値を返すためのものであり, 関数の戻り値と \verb+__environment+ の二つの引数を持つ +コードセグメントである. 例えば, 図\ref{fig:env_code}のように使うと, \verb+main()+ は 1 を返す. + +\begin{figure}[htpb] + \begin{center} +\scalebox{0.33}{\includegraphics{figure/env_code.pdf}} + \end{center} + \caption{\_\_return, \_\_environment 変数の使用例} + \label{fig:env_code} +\end{figure} + +環境付き継続の実装案には複数あり, 例えばGCC 版の CbC コンパイラでは内部関数を用いることで環境付き継続を実現している.この他には setjmp , longjmp を用いた実装案, Exception を用いた実装案,LLVM IRを用いた実装案がある. + +%GCC内部では, \verb+__return+ は, 関数内で定義された \verb+_cbc_internal_return+関数へのポインタを返す. +%戻り値は, \verb+cbc_internal_return+ 関数内で定義された変数\verb+retval+を通して返される(図\ref{fig:ret_val_code}). + +\section{現状及び今後の課題} +今後は本稿でも述べたとおり、LLVM/clang 上での CbC コンパイラの実装を行っていく.実装後はGCC版とLLVM版のCbCコンパイラそれぞれでコンパイルしたプログラムの性能比較を行う予定である. +%また,LLVM版とGCC版でCbCコンパイラを実現するために変更を加えた箇所を比較し,どちらが実装を容易に行えるかも判別する. + +\begin{thebibliography}{9} +\bibitem{1}与儀 健人. ``組み込み向け言語Continuation based C の GCC 上の実装". 琉球大学 情報工学科 学位論文(修士), 2008 +\vspace{-3mm} +\bibitem{2}大城 信康,河野 真治. ``Continuation based C の GCC 4.6 上の実装について". 第53回プログラミング・シンポジウム, 2011 +\vspace{-3mm} +\bibitem{3}LLVM 3.4 documentation.\\ ``http://llvm.org/docs/index.html" +\vspace{-3mm} +\bibitem{4}``Clang" CFE Internals Manual - Clang 3.4 documentation.\\ ``http://clang.llvm.org/docs/InternalsManual.html" +\vspace{-3mm} +\bibitem{5}LLVM API Documentation.\\ ``http://llvm.org/docs/doxygen/html/index.html" +\vspace{-3mm} +\bibitem{6}Clang API Documentation.\\ ``http://clang.llvm.org/doxygen/" +\vspace{-3mm} +\end{thebibliography} +\end{document} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mediabb.sty Sun Nov 03 22:15:28 2013 +0900 @@ -0,0 +1,99 @@ +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{mediabb}[2006/10/26 v1.9 iNOUE Koich! <inoue@ma.ns.musashi-tech.ac.jp>] +\@ifpackageloaded{graphics}{}{\RequirePackage[dvipdfm]{graphicx}} +\define@key{Gin}{usebb}[true]{\expandafter\let\expandafter\if@usebb\csname if#1\endcsname} +\let\if@usebb\iffalse +\define@key{Gin}{mediaboxonly}[/MediaBox]{\@ifundefined{Gread@find@#1}% + {\def\Gread@rect@box{/MediaBox}\expandafter\let\expandafter\if@Gread@find@only\csname if#1\endcsname}% + {\def\Gread@rect@box{#1}\let\if@Gread@find@only\iftrue}} +\let\if@Gread@find@only\iffalse +\def\Gread@rect@box{/MediaBox} +\define@key{Gin}{autoebb}[always]{\csname Gread@ebb@#1\endcsname} +\def\Gread@ebb@always{\let\if@Gread@ebb@always\iftrue} +\let\if@Gread@ebb@always\iffalse +\let\Gread@ebb@true\Gread@ebb@always +\def\Gread@ebb@never{\let\if@Gread@ebb@never\iftrue} +\let\Gread@ebb@false\Gread@ebb@never +\let\if@Gread@ebb@never\iffalse +\let\Ginclude@pdf\Ginclude@eps +\def\Gread@pdf#1{% + \begingroup + \if@usebb\else + \@tempcnta\z@ + \loop + \ifnum\@tempcnta<\@xxxii + \catcode\@tempcnta14 + \advance\@tempcnta\@ne + \repeat + \@tempcnta127 + \loop + \ifnum\@tempcnta<\@cclvi + \catcode\@tempcnta14 + \advance\@tempcnta\@ne + \repeat + \let\do\@makeother\dospecials\catcode`\ 10 + \catcode\endlinechar10 + \immediate\openin\@inputcheck#1 + \ifeof\@inputcheck + \@latex@error{File `#1' not found}\@ehc + \else + \Gread@true + \let\@tempa\@empty + \let\@tempb\@empty + \loop + \read\@inputcheck to\@tempc + \ifeof\@inputcheck + \Gread@false + \else + \edef\@tempa{\@tempb\@tempc}\let\@tempb\@tempc + \edef\@tempc{\@tempa\Gread@rect@box}% + \csname Gread@find@\Gread@rect@box\expandafter\endcsname\@tempc[\@nnil]\\% + \fi + \ifGread@ + \repeat + \immediate\closein\@inputcheck + \fi + \fi + \ifGin@bbox + \else + \Gread@bmp{\Gin@base.bb}% + \fi + \endgroup + \expandafter\Gread@parse@bb\@gtempa\\} +\def\def@Gread@find#1#2{\ifx\@nnil#2\expandafter\@gobble\else + \@namedef{Gread@find@#1}##1#1##2[##3##4]##5\\{% + \ifx\@nnil##3\else + \gdef\@gtempa{##3##4 }% + \if@Gread@find@only + \Gread@false + \else + \def\Gread@rect@box{#1}% + \fi + \Gin@bboxtrue + \fi + \if@Gread@find@only\else + \csname Gread@find@#2\expandafter\endcsname\@tempa#2[\@nnil]\\% + \fi}% + \expandafter\def@Gread@find\fi{#2}} +\def@Gread@find{/MediaBox}{/CropBox}{/BleedBox}{/TrimBox}{/ArtBox}\@nnil +\@namedef{Gread@find@/ArtBox}#1/ArtBox#2[#3#4]#5\\{% + \ifx\@nnil#3\else + \gdef\@gtempa{#3#4 }% + \Gread@false + \Gin@bboxtrue + \fi} +\def\Gread@bmp#1{% + \if@Gread@ebb@never\else + \if@Gread@ebb@always\else + \immediate\openin\@inputcheck#1 % + \ifeof\@inputcheck + \Gread@ebb@always + \else + \immediate\closein\@inputcheck + \fi + \fi + \immediate\write18{\if@Gread@ebb@always\else[ '\Gin@base\Gin@ext' -nt '\Gin@base.bb' ] && \fi + \ifx\@nnil\filename@area\@nnil\else cd '\filename@area' && \fi ebb '\filename@base\Gin@ext'}% + \fi + \Gread@eps{#1}} +\DeclareGraphicsRule{.pdf}{pdf}{*}{}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pic/emblem-bitmap.eps Sun Nov 03 22:15:28 2013 +0900 @@ -0,0 +1,1317 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%HiResBoundingBox: 0.000000 0.000000 451.000000 246.000000 +%APL_DSC_Encoding: UTF8 +%%Title: (Unknown) +%%Creator: (Unknown) +%%CreationDate: (Unknown) +%%For: (Unknown) +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 0 0 451 246 +%%EndComments +%%BeginProlog +%%BeginFile: cg-pdf.ps +%%Copyright: Copyright 2000-2004 Apple Computer Incorporated. +%%Copyright: All Rights Reserved. +currentpacking true setpacking +/cg_md 141 dict def +cg_md begin +/L3? languagelevel 3 ge def +/bd{bind def}bind def +/ld{load def}bd +/xs{exch store}bd +/xd{exch def}bd +/cmmtx matrix def +mark +/sc/setcolor +/scs/setcolorspace +/dr/defineresource +/fr/findresource +/T/true +/F/false +/d/setdash +/w/setlinewidth +/J/setlinecap +/j/setlinejoin +/M/setmiterlimit +/i/setflat +/rc/rectclip +/rf/rectfill +/rs/rectstroke +/f/fill +/f*/eofill +/sf/selectfont +/s/show +/xS/xshow +/yS/yshow +/xyS/xyshow +/S/stroke +/m/moveto +/l/lineto +/c/curveto +/h/closepath +/n/newpath +/q/gsave +/Q/grestore +counttomark 2 idiv +{ld}repeat pop +/SC{ + /ColorSpace fr scs +}bd +/sopr /setoverprint where{pop/setoverprint}{/pop}ifelse ld +/soprm /setoverprintmode where{pop/setoverprintmode}{/pop}ifelse ld +/cgmtx matrix def +/sdmtx{cgmtx currentmatrix pop}bd +/CM {cgmtx setmatrix}bd +/cm {cmmtx astore CM concat}bd +/W{clip newpath}bd +/W*{eoclip newpath}bd +statusdict begin product end dup (HP) anchorsearch{ + pop pop pop + true +}{ + pop + (hp) anchorsearch{ + pop pop true + }{ + pop false + }ifelse +}ifelse +{ + { + { + pop pop + (0)dup 0 4 -1 roll put + F charpath + }cshow + } +}{ + {F charpath} +}ifelse +/cply exch bd +/cps {cply stroke}bd +/pgsave 0 def +/bp{/pgsave save store}bd +/ep{pgsave restore showpage}def +/re{4 2 roll m 1 index 0 rlineto 0 exch rlineto neg 0 rlineto h}bd +/scrdict 10 dict def +/scrmtx matrix def +/patarray 0 def +/createpat{patarray 3 1 roll put}bd +/makepat{ +scrmtx astore pop +gsave +initgraphics +CM +patarray exch get +scrmtx +makepattern +grestore +setpattern +}bd +/cg_BeginEPSF{ + userdict save/cg_b4_Inc_state exch put + userdict/cg_endepsf/cg_EndEPSF load put + count userdict/cg_op_count 3 -1 roll put + countdictstack dup array dictstack userdict/cg_dict_array 3 -1 roll put + 3 sub{end}repeat + /showpage {} def + 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin + 10 setmiterlimit [] 0 setdash newpath + false setstrokeadjust false setoverprint +}bd +/cg_EndEPSF{ + countdictstack 3 sub { end } repeat + cg_dict_array 3 1 index length 3 sub getinterval + {begin}forall + count userdict/cg_op_count get sub{pop}repeat + userdict/cg_b4_Inc_state get restore + F setpacking +}bd +/cg_biproc{currentfile/RunLengthDecode filter}bd +/cg_aiproc{currentfile/ASCII85Decode filter/RunLengthDecode filter}bd +/ImageDataSource 0 def +L3?{ + /cg_mibiproc{pop pop/ImageDataSource{cg_biproc}def}bd + /cg_miaiproc{pop pop/ImageDataSource{cg_aiproc}def}bd +}{ + /ImageBandMask 0 def + /ImageBandData 0 def + /cg_mibiproc{ + string/ImageBandMask xs + string/ImageBandData xs + /ImageDataSource{[currentfile/RunLengthDecode filter dup ImageBandMask/readstring cvx + /pop cvx dup ImageBandData/readstring cvx/pop cvx]cvx bind}bd + }bd + /cg_miaiproc{ + string/ImageBandMask xs + string/ImageBandData xs + /ImageDataSource{[currentfile/ASCII85Decode filter/RunLengthDecode filter + dup ImageBandMask/readstring cvx + /pop cvx dup ImageBandData/readstring cvx/pop cvx]cvx bind}bd + }bd +}ifelse +/imsave 0 def +/BI{save/imsave xd mark}bd +/EI{imsave restore}bd +/ID{ +counttomark 2 idiv +dup 2 add +dict begin +{def} repeat +pop +/ImageType 1 def +/ImageMatrix[Width 0 0 Height neg 0 Height]def +currentdict dup/ImageMask known{ImageMask}{F}ifelse exch +L3?{ + dup/MaskedImage known + { + pop + << + /ImageType 3 + /InterleaveType 2 + /DataDict currentdict + /MaskDict + << /ImageType 1 + /Width Width + /Height Height + /ImageMatrix ImageMatrix + /BitsPerComponent 1 + /Decode [0 1] + currentdict/Interpolate known + {/Interpolate Interpolate}if + >> + >> + }if +}if +exch +{imagemask}{image}ifelse +end +}bd +/cguidfix{statusdict begin mark version end +{cvr}stopped{cleartomark 0}{exch pop}ifelse +2012 lt{dup findfont dup length dict begin +{1 index/FID ne 2 index/UniqueID ne and +{def} {pop pop} ifelse}forall +currentdict end definefont pop +}{pop}ifelse +}bd +/t_array 0 def +/t_i 0 def +/t_c 1 string def +/x_proc{ + exch t_array t_i get add exch moveto + /t_i t_i 1 add store +}bd +/y_proc{ + t_array t_i get add moveto + /t_i t_i 1 add store +}bd +/xy_proc{ + + t_array t_i 2 copy 1 add get 3 1 roll get + 4 -1 roll add 3 1 roll add moveto + /t_i t_i 2 add store +}bd +/sop 0 def +/cp_proc/x_proc ld +/base_charpath +{ + /t_array xs + /t_i 0 def + { + t_c 0 3 -1 roll put + currentpoint + t_c cply sop + cp_proc + }forall + /t_array 0 def +}bd +/sop/stroke ld +/nop{}def +/xsp/base_charpath ld +/ysp{/cp_proc/y_proc ld base_charpath/cp_proc/x_proc ld}bd +/xysp{/cp_proc/xy_proc ld base_charpath/cp_proc/x_proc ld}bd +/xmp{/sop/nop ld /cp_proc/x_proc ld base_charpath/sop/stroke ld}bd +/ymp{/sop/nop ld /cp_proc/y_proc ld base_charpath/sop/stroke ld}bd +/xymp{/sop/nop ld /cp_proc/xy_proc ld base_charpath/sop/stroke ld}bd +/refnt{ +findfont dup length dict copy dup +/Encoding 4 -1 roll put +definefont pop +}bd +/renmfont{ +findfont dup length dict copy definefont pop +}bd +L3? dup dup{save exch}if +/Range 0 def +/DataSource 0 def +/val 0 def +/nRange 0 def +/mulRange 0 def +/d0 0 def +/r0 0 def +/di 0 def +/ri 0 def +/a0 0 def +/a1 0 def +/r1 0 def +/r2 0 def +/dx 0 def +/Nsteps 0 def +/sh3tp 0 def +/ymax 0 def +/ymin 0 def +/xmax 0 def +/xmin 0 def +/setupFunEval +{ + begin + /nRange Range length 2 idiv store + /mulRange + + [ + 0 1 nRange 1 sub + { + 2 mul/nDim2 xd + Range nDim2 get + Range nDim2 1 add get + 1 index sub + + 255 div + exch + }for + ]store + end +}bd +/FunEval +{ + begin + + nRange mul /val xd + + 0 1 nRange 1 sub + { + dup 2 mul/nDim2 xd + val + add DataSource exch get + mulRange nDim2 get mul + mulRange nDim2 1 add get + add + }for + end +}bd +/max +{ + 2 copy lt + {exch pop}{pop}ifelse +}bd +/sh2 +{ + /Coords load aload pop + 3 index 3 index translate + + 3 -1 roll sub + 3 1 roll exch + sub + 2 copy + dup mul exch dup mul add sqrt + dup + scale + atan + + rotate + + /Function load setupFunEval + + + clippath {pathbbox}stopped {0 0 0 0}if newpath + /ymax xs + /xmax xs + /ymin xs + /xmin xs + currentdict/Extend known + { + /Extend load 0 get + { + 0/Function load FunEval sc + xmin ymin xmin abs ymax ymin sub rectfill + }if + }if + + /Nsteps/Function load/Size get 0 get 1 sub store + /dx 1 Nsteps div store + gsave + /di ymax ymin sub store + /Function load + + 0 1 Nsteps + { + 1 index FunEval sc + 0 ymin dx di rectfill + dx 0 translate + }for + pop + grestore + currentdict/Extend known + { + /Extend load 1 get + { + Nsteps/Function load FunEval sc + 1 ymin xmax 1 sub abs ymax ymin sub rectfill + }if + }if +}bd +/shp +{ + 4 copy + + dup 0 gt{ + 0 exch a1 a0 arc + }{ + pop 0 moveto + }ifelse + dup 0 gt{ + 0 exch a0 a1 arcn + }{ + pop 0 lineto + }ifelse + + fill + + dup 0 gt{ + 0 exch a0 a1 arc + }{ + pop 0 moveto + }ifelse + dup 0 gt{ + 0 exch a1 a0 arcn + }{ + pop 0 lineto + }ifelse + + fill +}bd +/calcmaxs +{ + + xmin dup mul ymin dup mul add sqrt + xmax dup mul ymin dup mul add sqrt + xmin dup mul ymax dup mul add sqrt + xmax dup mul ymax dup mul add sqrt + max max max +}bd +/sh3 +{ + /Coords load aload pop + 5 index 5 index translate + 3 -1 roll 6 -1 roll sub + 3 -1 roll 5 -1 roll sub + 2 copy dup mul exch dup mul add sqrt + /dx xs + 2 copy 0 ne exch 0 ne or + { + + exch atan rotate + }{ + pop pop + }ifelse + + /r2 xs + /r1 xs + /Function load + dup/Size get 0 get 1 sub + /Nsteps xs + setupFunEval + + + + + + dx r2 add r1 lt{ + + 0 + }{ + dx r1 add r2 le + { + 1 + }{ + r1 r2 eq + { + 2 + }{ + 3 + }ifelse + }ifelse + }ifelse + /sh3tp xs + clippath {pathbbox}stopped {0 0 0 0}if + newpath + /ymax xs + /xmax xs + /ymin xs + /xmin xs + + dx dup mul r2 r1 sub dup mul sub dup 0 gt + { + sqrt r2 r1 sub atan + /a0 exch 180 exch sub store + /a1 a0 neg store + }{ + pop + /a0 0 store + /a1 360 store + }ifelse + currentdict/Extend known + { + /Extend load 0 get r1 0 gt and + { + 0/Function load FunEval sc + + + + + { + { + dx 0 r1 360 0 arcn + xmin ymin moveto + xmax ymin lineto + xmax ymax lineto + xmin ymax lineto + xmin ymin lineto + eofill + } + { + r1 0 gt{0 0 r1 0 360 arc fill}if + } + { + + + + + 0 r1 xmin abs r1 add neg r1 shp + } + { + + + r2 r1 gt{ + + 0 r1 + r1 neg r2 r1 sub div dx mul + 0 + shp + }{ + + + + 0 r1 calcmaxs + dup + + r2 add dx mul dx r1 r2 sub sub div + neg + exch 1 index + abs exch sub + shp + }ifelse + } + }sh3tp get exec + }if + }if + + /d0 0 store + /r0 r1 store + /di dx Nsteps div store + /ri r2 r1 sub Nsteps div store + /Function load + 0 1 Nsteps + { + 1 index FunEval sc + d0 di add r0 ri add d0 r0 shp + { + + d0 0 r0 a1 a0 arc + d0 di add 0 r0 ri add a0 a1 arcn + fill + + + d0 0 r0 a0 a1 arc + d0 di add 0 r0 ri add a1 a0 arcn + fill + }pop + + + /d0 d0 di add store + /r0 r0 ri add store + }for + pop + + currentdict/Extend known + { + /Extend load 1 get r2 0 gt and + { + Nsteps/Function load FunEval sc + + + + + { + { + dx 0 r2 0 360 arc fill + } + { + dx 0 r2 360 0 arcn + xmin ymin moveto + xmax ymin lineto + xmax ymax lineto + xmin ymax lineto + xmin ymin lineto + eofill + } + { + + + xmax abs r1 add r1 dx r1 shp + } + { + + r2 r1 gt{ + + + + calcmaxs dup + + r1 add dx mul dx r2 r1 sub sub div + exch 1 index + exch sub + dx r2 + shp + }{ + + r1 neg r2 r1 sub div dx mul + 0 + dx + r2 + shp + }ifelse + } + } + sh3tp get exec + }if + }if +}bd +/sh +{ + begin + /ShadingType load dup dup 2 eq exch 3 eq or + { + gsave + newpath + /ColorSpace load scs + currentdict/BBox known + { + /BBox load aload pop + 2 index sub + 3 index + 3 -1 roll exch sub + exch rectclip + }if + 2 eq + {sh2}{sh3}ifelse + grestore + }{ + + pop + (DEBUG: shading type unimplemented\n)print flush + }ifelse + end +}bd +{restore}if not dup{save exch}if + L3?{ + /sh/shfill ld + /csq/clipsave ld + /csQ/cliprestore ld + }if +{restore}if +end +setpacking +%%EndFile +%%EndProlog +%%BeginSetup +%%EndSetup +%%Page: 1 1 +%%PageBoundingBox: 0 0 451 246 +%%BeginPageSetup +cg_md begin +bp +sdmtx +[ /CIEBasedA 5 dict dup begin /WhitePoint [ 0.9505 1.0000 1.0891 ] def +/DecodeA { { 1.8008 exp } bind exec} bind +def +/MatrixA [ 0.9642 1.0000 0.8249 ] def +/RangeLMN [ 0.0 2.0000 0.0 2.0000 0.0 2.0000 ] def +/DecodeLMN [ { 0.9857 mul} bind { 1.0000 mul} bind { 1.3202 mul} bind ] def +end ] /Cs1 exch/ColorSpace dr pop +[ /CIEBasedABC 4 dict dup begin +/WhitePoint [ 0.9505 1.0000 1.0891 ] def +/DecodeABC [ { 1.8008 exp } bind { 1.8008 exp } bind { 1.8008 exp } bind ] def +/MatrixABC [ 0.4295 0.2318 0.0204 0.3278 0.6722 0.1111 0.1933 0.0960 0.9578 ] def +/RangeLMN [ 0.0 0.9505 0.0 1.0000 0.0 1.0891 ] def +end ] /Cs2 exch/ColorSpace dr pop +%%EndPageSetup +/Cs1 SC +1 sc +q +0 0 451 246 rc +0 246 m +451 246 l +451 0 l +0 0 l +h +f +0.60000002 i +0 0 0 1 setcmykcolor +111.76596 202.81165 m +110.20593 201.28641 108.88751 199.56763 107.90891 197.71027 c +105.75609 193.62228 104.43982 188.83307 104.92006 184.19055 c +105.65408 177.10065 109.19324 170.87027 113.39337 165.2901 c +117.81967 159.41132 122.82057 153.96204 128.0706 148.81357 c +132.22687 144.7374 136.60381 140.90536 141.06769 137.17297 c +141.06769 137.17297 142.23466 138.25497 143.56769 140.08899 c +144.7249 141.68073 145.88605 144.05676 146.41486 145.34192 c +150.37337 154.9621 152.95833 166.61832 151.86409 177.01877 c +151.08528 184.41821 149.36505 193.2063 145.28447 199.55975 c +142.24835 204.2872 137.63116 208.65149 131.92557 209.64954 c +124.93436 210.87225 116.99205 207.9231 111.76596 202.81165 c +h +162.11165 135.12994 m +170.23468 135.33896 178.40063 135.58899 186.61853 136.04599 c +188.98267 136.17685 191.36844 136.32138 193.73473 136.42294 c +204.24261 136.86923 214.77298 137.63583 224.73029 141.28235 c +233.90622 144.64169 242.45691 149.88193 246.46088 159.18472 c +248.0799 162.94824 248.76358 166.97955 250.19727 170.79803 c +251.82413 175.12616 255.04889 179.95609 259.66974 181.34387 c +263.72458 182.56262 268.46881 181.97876 272.03717 179.64764 c +279.47263 174.78925 282.41602 163.87802 281.05457 155.45227 c +279.57031 146.26083 274.496 137.81165 267.76373 131.47177 c +261.26361 125.35068 252.97644 122.02249 244.59564 119.3194 c +231.53696 115.10651 217.29672 115.34085 203.71909 114.73639 c +199.6897 114.55768 195.65649 114.44049 191.62331 114.50882 c +188.52759 114.56158 185.28929 114.51471 182.13893 114.55185 c +179.00804 114.58795 175.86066 114.88968 172.73131 114.70413 c +172.66832 114.70026 172.24203 114.62604 172.21127 114.66315 c +172.52719 114.27838 173.17564 114.04202 173.58878 113.78033 c +174.22107 113.37799 174.84119 112.95609 175.45346 112.52448 c +176.67123 111.66608 177.85764 110.76471 179.05511 109.87994 c +184.33423 105.97366 188.78732 100.96576 192.39304 95.495056 c +193.37354 94.008759 194.29126 92.483307 195.14378 90.920837 c +198.00034 85.681732 199.96323 79.916992 201.0238 74.049805 c +201.17722 73.204102 201.31087 72.350525 201.42233 71.491211 c +202.42799 63.491272 200.82846 55.491089 197.52199 47.530334 c +197.23871 46.874023 196.93974 46.225525 196.62915 45.583008 c +193.75339 39.657104 189.60008 34.225586 184.64482 29.889587 c +182.91055 28.372009 181.07347 26.969543 179.1214 25.745117 c +178.06866 25.086792 176.98563 24.479309 175.8831 23.908997 c +169.46075 20.584839 162.50714 18.373901 155.36555 17.262634 c +147.92755 16.105408 140.30402 16.016479 132.92412 17.62384 c +131.05498 18.030212 129.20732 18.548828 127.39432 19.160034 c +113.15013 23.964783 102.26048 32.213928 90.798065 41.583008 c +83.572571 47.488281 74.716164 52.213806 65.717979 54.723572 c +55.072914 57.693237 43.733055 57.680542 32.76738 57.905212 c +26.310265 58.037231 19.29364 59.068359 15.115433 64.551758 c +12.409317 68.104492 10.42749 72.704956 10.885803 77.248077 c +11.160706 79.973694 12.191513 82.87796 13.414703 85.323151 c +15.014771 88.524475 17.414612 90.923889 20.187286 92.944366 c +21.653442 93.907196 23.193993 94.690491 24.780807 95.313568 c +41.649223 102.67688 59.925621 93.364258 73.610123 83.557495 c +82.079376 77.487366 90.180389 70.953979 97.969452 64.036194 c +100.23077 62.028198 102.47234 59.998962 104.71471 57.969788 c +110.35907 52.860291 116.37869 48.147461 123.13553 44.592773 c +125.09991 43.559448 127.11258 42.618103 129.16484 41.7724 c +132.99931 40.193298 136.96854 38.637573 141.11601 38.161011 c +149.60187 37.18634 159.06671 39.811462 165.50375 45.536133 c +171.93393 51.254883 174.67804 59.965698 173.7944 68.381836 c +172.3802 81.850555 163.38118 92.567352 153.59015 101.21097 c +149.90558 104.4639 146.02911 107.54395 141.98418 110.3389 c +141.6761 110.55179 138.96027 108.39362 138.60722 108.18069 c +137.2664 107.37015 135.85674 106.67194 134.40215 106.09085 c +131.48076 104.92291 128.36797 104.19437 125.23221 103.94052 c +112.61497 102.92383 96.615051 111.72369 99.815186 126.9249 c +100.64093 130.85846 104.633 135.02448 108.60287 135.72958 c +109.86151 135.95227 109.98706 136.00204 111.25516 135.92291 c +111.60959 135.90048 113.02081 135.77548 113.37578 135.76862 c +113.08412 135.77448 107.7858 140.24911 107.56773 140.42291 c +99.118774 147.11337 95.066101 150.69632 88.644699 159.43671 c +86.852264 161.87509 85.236496 164.44745 83.840698 167.13388 c +80.844009 172.89948 78.339996 179.41907 78.376251 186.00302 c +78.417107 193.60474 80.489578 201.09485 84.408051 207.59888 c +86.442642 210.9758 88.840042 214.15152 91.451996 217.10263 c +95.652679 221.84894 100.86171 225.69852 106.44032 228.677 c +113.30977 232.34485 120.92508 234.83337 128.73125 235.2688 c +141.47881 235.98163 153.0755 230.3176 161.30014 220.76483 c +163.36995 218.3606 165.3055 215.68771 166.88071 212.92993 c +169.13704 208.97876 170.81528 204.74146 172.17075 200.40546 c +176.40068 186.87128 175.66721 172.08313 172.35725 158.42877 c +171.40366 154.49338 170.10141 150.58994 168.48178 146.8761 c +166.90024 143.24911 164.90852 139.82919 162.88947 136.43271 c +162.81282 136.30377 162.28694 135.14172 162.11165 135.12994 c +h +162.11165 135.12994 m +f +244.69958 75.160583 m +244.70056 73.28949 243.17224 71.757202 241.30115 71.754333 c +218.703 71.721069 l +216.8324 71.718201 215.29965 73.246521 215.29721 75.117554 c +215.26599 98.200592 l +215.26355 100.07172 216.54239 101.60199 218.10828 101.60199 c +219.67419 101.60199 220.95496 100.07172 220.95496 98.200592 c +220.95496 79.417389 l +220.95496 77.546295 222.48572 76.016052 224.35681 76.016052 c +235.55701 76.016052 l +237.4281 76.016052 238.95834 77.546295 238.95834 79.417389 c +238.95834 98.200592 l +238.95834 100.07172 240.24448 101.60199 241.81577 101.60199 c +243.38708 101.60199 244.67517 100.07172 244.67615 98.200592 c +244.69958 75.160583 l +h +244.69958 75.160583 m +f +270.87292 75.10437 m +270.87292 73.233276 269.58871 71.703003 268.01743 71.703003 c +266.44617 71.703003 265.16098 73.233276 265.16098 75.10437 c +265.16098 87.907074 l +265.16098 89.778168 263.63071 91.308441 261.75964 91.308441 c +257.87683 91.308441 l +256.00571 91.308441 254.47543 89.778168 254.47543 87.907074 c +254.47543 75.10437 l +254.47543 73.233276 253.19513 71.703003 251.62973 71.703003 c +250.0643 71.703003 248.784 73.233276 248.784 75.10437 c +248.784 92.220551 l +248.784 94.091614 250.3143 95.619995 252.18539 95.618011 c +267.46277 95.597504 l +269.33386 95.595551 270.86511 94.063293 270.86511 92.192261 c +270.87292 75.10437 l +h +270.87292 75.10437 m +f +282.52484 75.10437 m +282.52484 73.233215 281.23874 71.703003 279.66742 71.703003 c +278.09613 71.703003 276.81 73.233215 276.81 75.10437 c +276.81 75.10437 276.81 86.20108 276.81 86.20108 c +276.81 88.072113 278.09613 89.602448 279.66742 89.602448 c +281.23874 89.602448 282.52484 88.072113 282.52484 86.20108 c +282.52484 86.20108 282.52484 75.10437 282.52484 75.10437 c +h +282.52484 98.546753 m +282.52484 96.902222 281.23874 95.556488 279.66742 95.556488 c +278.09613 95.556488 276.81 96.902222 276.81 98.546753 c +276.81 100.19128 278.09613 101.53699 279.66742 101.53699 c +281.23874 101.53699 282.52484 100.19128 282.52484 98.546753 c +h +282.52484 98.546753 m +f +302.95154 75.026672 m +302.54529 73.200439 300.68201 71.705383 298.81091 71.705383 c +294.19763 71.703369 l +292.32654 71.703369 290.46323 73.196533 290.05502 75.022705 c +286.19958 92.301056 l +285.79135 94.127228 286.7435 95.621338 288.31482 95.621338 c +289.88608 95.621338 291.57455 94.144806 292.06674 92.340118 c +295.62338 79.307922 l +296.11557 77.503204 296.91345 77.506165 297.39587 79.313751 c +300.87634 92.364502 l +301.35873 94.17215 303.05505 95.644806 304.64587 95.636993 c +306.23666 95.628174 307.20541 94.127228 306.79919 92.301056 c +302.95154 75.026672 l +h +302.95154 75.026672 m +f +333.70007 84.822266 m +333.70007 82.951172 332.1698 81.420868 330.29868 81.420868 c +316.22058 81.420868 l +314.34949 81.420868 312.82605 82.351532 312.83386 83.488312 c +312.84167 84.625031 314.37878 85.555695 316.24988 85.555695 c +324.61511 85.555695 l +326.48621 85.555695 328.01648 86.849609 328.01648 88.431671 c +328.01648 90.013641 326.48621 91.307617 324.61511 91.307617 c +320.73425 91.307617 l +318.86316 91.307617 317.33289 89.777344 317.33289 87.906281 c +317.33289 79.416962 l +317.33289 77.545898 318.86316 76.015625 320.73425 76.015625 c +330.328 76.015625 l +332.1991 76.015625 333.72937 75.044922 333.72937 73.859375 c +333.72937 72.672852 332.1991 71.702148 330.328 71.703125 c +315.02136 71.705078 l +313.15027 71.706055 311.62 73.236328 311.62 75.107422 c +311.62 92.22464 l +311.62 94.095703 313.15027 95.626007 315.02136 95.625 c +330.29868 95.622101 l +332.1698 95.621124 333.70007 94.09082 333.70007 92.219757 c +333.70007 84.822266 l +h +333.70007 84.822266 m +f +356.25061 93.46579 m +356.25061 92.279266 354.72034 91.308594 352.84927 91.308594 c +346.97424 91.308594 l +345.10318 91.308594 343.57288 89.77829 343.57288 87.907227 c +343.57288 75.104492 l +343.57288 73.233398 342.28775 71.703125 340.71646 71.703125 c +339.14517 71.703125 337.85709 73.233398 337.85315 75.104492 c +337.81799 92.220642 l +337.81409 94.091797 339.34143 95.622009 341.21255 95.622009 c +352.84927 95.622009 l +354.72034 95.622009 356.25061 94.651306 356.25061 93.46579 c +h +356.25061 93.46579 m +f +378.72168 75.107483 m +378.72168 73.236389 377.19144 71.706055 375.32031 71.705139 c +363.76364 71.703186 l +361.89258 71.702209 360.36227 72.672852 360.36227 73.859436 c +360.36227 75.044983 361.89258 76.015686 363.76364 76.015686 c +369.67972 76.015686 l +371.55078 76.015686 373.08109 77.251038 373.08109 78.759796 c +373.08109 80.269562 371.55078 81.504944 369.67972 81.50589 c +363.73438 81.507843 l +361.86325 81.50885 360.33301 83.039093 360.33301 84.910187 c +360.33301 92.22467 l +360.33301 94.095764 361.86325 95.626068 363.73438 95.625061 c +375.32031 95.622131 l +377.19144 95.621185 378.72168 94.650452 378.72168 93.464905 c +378.72168 92.278381 377.19144 91.307648 375.32031 91.307648 c +368.8887 91.307648 l +367.01758 91.307648 365.4873 90.072327 365.4873 88.562561 c +365.4873 87.052826 367.01758 85.817444 368.8887 85.81842 c +375.32031 85.820374 l +377.19144 85.82132 378.72168 84.291077 378.72168 82.419983 c +378.72168 75.107483 l +h +378.72168 75.107483 m +f +414.42694 73.859802 m +414.42694 72.673218 412.89667 71.704468 411.0256 71.705444 c +403.93967 71.713257 l +402.06857 71.714294 400.5383 73.24646 400.5383 75.117615 c +400.5383 87.073608 l +400.5383 88.944702 399.00803 90.474976 397.13693 90.474976 c +395.74631 90.474976 l +393.87521 90.474976 392.34494 91.445679 392.34494 92.631256 c +392.34494 93.81778 393.87521 94.788483 395.74631 94.788483 c +397.13693 94.788483 l +399.00803 94.788483 400.5383 96.318756 400.5383 98.18985 c +400.5383 98.200592 l +400.5383 100.07166 401.82346 101.60193 403.39474 101.60193 c +404.96603 101.60193 406.25119 100.07166 406.25119 98.200592 c +406.25119 98.18985 l +406.25119 96.318756 407.78146 94.788483 409.65256 94.788483 c +411.0256 94.788483 l +412.89667 94.788483 414.42694 93.81778 414.42694 92.631256 c +414.42694 91.444733 412.89667 90.473999 411.0256 90.473999 c +409.65256 90.473999 l +407.78146 90.473999 406.25119 88.943726 406.25119 87.072632 c +406.25119 79.417419 l +406.25119 77.546326 407.78146 76.016022 409.65256 76.016022 c +411.0256 76.016022 l +412.89667 76.016022 414.42694 75.045349 414.42694 73.859802 c +h +414.42694 73.859802 m +f +440.60672 69.137634 m +440.60672 67.266541 439.07642 65.735352 437.20532 65.733337 c +429.26974 65.725525 l +427.39865 65.723572 425.86838 66.693298 425.86838 67.879883 c +425.86838 69.066345 427.39865 70.037048 429.26974 70.037048 c +431.4924 70.037048 l +433.36353 70.037048 434.8938 71.567383 434.8938 73.438477 c +434.8938 75.115173 l +434.8938 76.986237 433.36353 78.513611 431.4924 78.510712 c +421.91037 78.493103 l +420.03928 78.490173 418.509 80.017548 418.509 81.888641 c +418.509 92.220673 l +418.509 94.091736 419.79416 95.622009 421.36444 95.622009 c +422.93475 95.622009 424.21994 94.091736 424.21994 92.220673 c +424.21994 86.229462 l +424.21994 84.358368 425.75021 82.828094 427.62134 82.828094 c +431.4924 82.828094 l +433.36353 82.828094 434.8938 84.358368 434.8938 86.229462 c +434.8938 92.220673 l +434.8938 94.091736 436.17892 95.622009 437.75024 95.622009 c +439.32153 95.622009 440.60672 94.091736 440.60672 92.220673 c +440.60672 69.137634 l +h +440.60672 69.137634 m +f +251.90887 33.203613 m +251.90982 31.33252 250.38055 29.79834 248.50943 29.792542 c +240.36295 29.771057 l +238.49188 29.765137 236.96161 28.230957 236.96161 26.359863 c +236.96161 24.338379 l +236.96161 22.467285 238.49188 20.937073 240.36295 20.937073 c +248.50943 20.937073 l +250.38055 20.937073 251.91083 19.91748 251.91083 18.671387 c +251.91083 17.425354 250.38055 16.408691 248.50943 16.412598 c +233.61298 16.440002 l +231.74188 16.443848 230.21259 17.977112 230.21356 19.848145 c +230.21942 30.848206 l +230.22037 32.719238 231.75165 34.249512 233.62274 34.249512 c +241.75748 34.249512 l +243.6286 34.249512 245.15887 35.779785 245.15887 37.650879 c +245.15887 39.672363 l +245.15887 41.543457 243.6286 43.07373 241.75748 43.07373 c +227.12469 43.07373 l +225.25357 43.07373 223.72284 41.543457 223.72284 39.672363 c +223.72284 19.80719 l +223.72284 17.936035 222.20328 16.405762 220.34637 16.405762 c +218.48944 16.405762 216.96844 17.936035 216.96649 19.80719 c +216.944 44.203613 l +216.94208 46.074768 218.47134 47.60498 220.34247 47.60498 c +248.50165 47.60498 l +250.37274 47.60498 251.90399 46.074768 251.90497 44.203613 c +251.90887 33.203613 l +h +251.90887 33.203613 m +f +282.54193 13.608154 m +282.54193 11.737061 281.01166 10.202881 279.14056 10.198975 c +269.05853 10.173584 l +267.18744 10.169739 265.65717 11.185303 265.65717 12.431396 c +265.65717 13.67749 267.18744 14.697083 269.05853 14.697083 c +272.38858 14.697083 l +274.2597 14.697083 275.78998 16.227295 275.78998 18.098389 c +275.78998 20.11792 l +275.78998 21.989075 274.2597 23.522217 272.38858 23.5271 c +259.52338 23.554504 l +257.65228 23.559387 256.12201 25.092529 256.12201 26.963684 c +256.12201 37.963684 l +256.12201 39.834717 257.64154 41.36499 259.49802 41.36499 c +261.35446 41.36499 262.87396 39.834717 262.87396 37.963684 c +262.87396 31.412842 l +262.87396 29.541809 264.40424 28.011536 266.27533 28.011536 c +272.38858 28.011536 l +274.2597 28.011536 275.78998 29.541809 275.78998 31.412842 c +275.78998 37.963684 l +275.78998 39.834717 277.30948 41.36499 279.16592 41.36499 c +281.02237 41.36499 282.54193 39.834717 282.54193 37.963684 c +282.54193 13.608154 l +h +282.54193 13.608154 m +f +314.13388 19.807434 m +314.13388 17.936279 312.60358 16.406006 310.73248 16.406006 c +291.11337 16.404053 l +289.24228 16.404053 287.71198 17.934326 287.71198 19.805481 c +287.71198 37.963623 l +287.71198 39.834717 289.23148 41.36499 291.08896 41.36499 c +292.94635 41.36499 294.46588 39.834717 294.46588 37.963623 c +294.46588 24.338623 l +294.46588 22.467529 295.99615 20.937256 297.86725 20.937256 c +303.85944 20.937256 l +305.73053 20.937256 307.2608 22.467529 307.2608 24.338623 c +307.2608 37.963623 l +307.2608 39.834717 308.79111 41.36499 310.6622 41.36499 c +310.73248 41.36499 l +312.60358 41.36499 314.13388 39.834717 314.13388 37.963623 c +314.13388 19.807434 l +h +314.13388 19.807434 m +f +439.2514 19.826843 m +439.2514 17.955688 437.72113 16.424438 435.85004 16.422485 c +416.34219 16.408813 l +414.47113 16.40686 412.94086 17.425415 412.94086 18.671509 c +412.94086 19.917603 414.47113 20.937134 416.34219 20.937134 c +429.05511 20.937134 l +430.92621 20.937134 432.45648 22.220337 432.45648 23.788696 c +432.45648 25.357056 430.92621 26.642212 429.05511 26.643188 c +416.25238 26.65686 l +414.38129 26.657837 412.85101 28.190063 412.85101 30.061157 c +412.85101 37.951782 l +412.85101 39.822876 414.38129 41.354126 416.25238 41.355103 c +435.75824 41.362915 l +437.62933 41.363892 439.15961 40.345337 439.15961 39.099243 c +439.15961 37.853149 437.62933 36.833618 435.75824 36.833618 c +424.71136 36.833618 l +422.84024 36.833618 421.31003 35.550415 421.31003 33.982056 c +421.31003 32.413696 422.84024 31.129517 424.71136 31.12854 c +435.85004 31.120728 l +437.72113 31.119751 439.2514 29.588501 439.2514 27.717407 c +439.2514 19.826843 l +h +439.2514 19.826843 m +f +326.05594 19.807129 m +326.05594 17.935974 324.53641 16.405701 322.67996 16.405701 c +320.82352 16.405701 319.30399 17.935974 319.30399 19.807129 c +319.30399 44.203552 l +319.30399 46.074707 320.82352 47.604919 322.67996 47.604919 c +324.53641 47.604919 326.05594 46.074707 326.05594 44.203552 c +326.05594 19.807129 l +h +326.05594 19.807129 m +f +329.16574 20.942261 m +327.35229 21.400269 325.86691 23.306519 325.86691 25.177612 c +325.86499 27.831909 l +325.86499 29.703003 327.34836 31.609314 329.16187 32.068237 c +342.15991 35.359314 l +343.97339 35.818237 345.45776 35.124878 345.45776 33.818237 c +345.45776 32.511597 344.00269 30.965698 342.22534 30.383667 c +333.56909 27.547729 l +331.79172 26.965698 331.79172 26.014526 333.57104 25.435425 c +342.20187 22.620972 l +343.9812 22.04187 345.44113 20.498901 345.44702 19.193237 c +345.45288 17.887573 343.97339 17.19519 342.15991 17.653198 c +329.16574 20.942261 l +h +329.16574 20.942261 m +f +376.08286 13.524109 m +376.08286 11.653076 374.55261 10.118835 372.68152 10.11499 c +362.60144 10.0896 l +360.73038 10.085693 359.20007 11.101257 359.20007 12.347412 c +359.20007 13.593506 360.73038 14.613037 362.60144 14.613037 c +365.93152 14.613037 l +367.80261 14.613037 369.33289 16.143311 369.33289 18.014404 c +369.33289 20.035828 l +369.33289 21.906982 367.80261 23.440186 365.93152 23.444092 c +353.06433 23.471375 l +351.19324 23.475342 349.66296 25.008484 349.66296 26.879639 c +349.66296 37.879639 l +349.66296 39.750732 351.1825 41.281006 353.03897 41.281006 c +354.89542 41.281006 356.41492 39.750732 356.41492 37.879639 c +356.41492 31.328857 l +356.41492 29.457764 357.94519 27.92749 359.81628 27.92749 c +365.93152 27.92749 l +367.80261 27.92749 369.33289 29.457764 369.33289 31.328857 c +369.33289 37.879639 l +369.33289 39.750732 370.85144 41.281006 372.70786 41.281006 c +374.56433 41.281006 376.08286 39.750732 376.08286 37.879639 c +376.08286 13.524109 l +h +376.08286 13.524109 m +f +407.65485 19.889404 m +407.65485 18.01825 406.12457 16.487976 404.25348 16.487976 c +384.63437 16.487976 l +382.76328 16.487976 381.23294 18.01825 381.23294 19.889404 c +381.23294 38.047546 l +381.23294 39.91864 382.75247 41.448914 384.60992 41.448914 c +386.46735 41.448914 387.98688 39.91864 387.98688 38.047546 c +387.98688 24.420593 l +387.98688 22.5495 389.51715 21.019287 391.38824 21.019287 c +397.38043 21.019287 l +399.25153 21.019287 400.7818 22.5495 400.7818 24.420593 c +400.7818 38.047546 l +400.7818 39.91864 402.3121 41.448914 404.1832 41.448914 c +404.25348 41.448914 l +406.12457 41.448914 407.65485 39.91864 407.65485 38.047546 c +407.65485 19.889404 l +h +407.65485 19.889404 m +f +390.40884 75.125366 m +390.40884 73.254272 389.12372 71.723999 387.55237 71.723999 c +385.98111 71.723999 384.69595 73.254272 384.69595 75.125366 c +384.69595 75.125366 384.69595 86.222046 384.69595 86.222046 c +384.69595 88.09314 385.98111 89.623413 387.55237 89.623413 c +389.12372 89.623413 390.40884 88.09314 390.40884 86.222046 c +390.40884 86.222046 390.40884 75.125366 390.40884 75.125366 c +h +390.40884 98.56778 m +390.40884 96.923248 389.12271 95.577515 387.55142 95.577515 c +385.98013 95.577515 384.694 96.923248 384.694 98.56778 c +384.694 100.21231 385.98013 101.55801 387.55142 101.55801 c +389.12271 101.55801 390.40884 100.21231 390.40884 98.56778 c +h +390.40884 98.56778 m +f +/Cs2 SC +0 0.54901999 0.42745101 sc +283.92609 50.121887 m +285.79718 50.121887 287.32748 51.652649 287.32748 53.523254 c +287.32748 53.523254 287.32748 55.919739 287.32748 55.919739 c +287.32748 57.790344 285.79718 59.321106 283.92609 59.321106 c +283.92609 59.321106 283.37726 59.321106 283.37726 59.321106 c +281.50616 59.321106 279.97589 57.790344 279.97589 55.919739 c +279.97589 55.919739 279.97589 53.523254 279.97589 53.523254 c +279.97589 51.652649 281.50616 50.121887 283.37726 50.121887 c +283.37726 50.121887 283.92609 50.121887 283.92609 50.121887 c +h +294.70636 48.946106 m +294.70636 47.0755 293.17609 45.544739 291.30502 45.544739 c +291.30502 45.544739 275.99835 45.544739 275.99835 45.544739 c +274.12726 45.544739 272.59698 47.0755 272.59698 48.946106 c +272.59698 48.946106 272.59698 60.542786 272.59698 60.542786 c +272.59698 62.413391 274.12726 63.946106 275.99835 63.948059 c +275.99835 63.948059 291.30502 63.965637 291.30502 63.965637 c +293.17609 63.96759 294.70636 62.438782 294.70636 60.568176 c +294.70636 60.568176 294.70636 48.946106 294.70636 48.946106 c +h +294.70636 48.946106 m +f +319.81052 57.021606 m +319.81052 55.756958 318.28024 54.721802 316.40915 54.721802 c +315.9306 54.721802 l +314.05951 54.721802 312.52924 53.19104 312.52924 51.320435 c +312.52924 48.922974 l +312.52924 47.052368 310.99899 45.521606 309.12787 45.521606 c +308.54974 45.521606 l +306.67865 45.521606 305.14838 47.052368 305.14838 48.922974 c +305.14838 51.320435 l +305.14838 53.19104 303.6181 54.721802 301.74701 54.721802 c +301.23138 54.721802 l +299.36029 54.721802 297.83002 55.756958 297.83002 57.021606 c +297.83002 58.286255 299.36029 59.321411 301.23138 59.321411 c +301.74701 59.321411 l +303.6181 59.321411 305.14545 60.852173 305.14154 62.722778 c +305.13568 65.120239 l +305.13177 66.990845 306.65912 68.521606 308.53021 68.521606 c +316.40915 68.521606 l +318.28024 68.521606 319.81052 67.48645 319.81052 66.221313 c +319.81052 64.956177 318.28024 63.921021 316.40915 63.921021 c +315.9306 63.921021 l +314.05951 63.921021 312.52924 62.885864 312.52924 61.621216 c +312.52924 60.356567 314.05951 59.321411 315.9306 59.321411 c +316.40915 59.321411 l +318.28024 59.321411 319.81052 58.286255 319.81052 57.021606 c +h +319.81052 57.021606 m +f +384.02142 48.922791 m +384.02338 47.052185 382.49506 45.521423 380.62393 45.521423 c +380.04584 45.521423 l +378.17474 45.521423 376.64447 47.052185 376.64447 48.922791 c +376.64447 51.320251 l +376.64447 53.190857 375.1142 54.721619 373.2431 54.721619 c +372.69623 54.721619 l +370.8251 54.721619 369.29486 53.190857 369.29486 51.320251 c +369.29486 48.922791 l +369.29486 47.052185 367.76459 45.521423 365.89349 45.521423 c +365.31537 45.521423 l +363.44427 45.521423 361.91403 47.052185 361.91403 48.922791 c +361.91403 65.070251 l +361.91403 66.940857 363.44427 68.471619 365.31537 68.471619 c +365.89349 68.471619 l +367.76459 68.471619 369.29486 66.940857 369.29486 65.070251 c +369.29486 62.722595 l +369.29486 60.85199 370.8251 59.321228 372.69623 59.321228 c +380.60635 59.321228 l +382.47745 59.321228 384.0097 57.790466 384.01163 55.919861 c +384.02142 48.922791 l +h +384.02142 48.922791 m +f +357.83304 47.809875 m +357.83304 46.544739 356.3028 45.510559 354.43167 45.512024 c +346.51373 45.517883 l +344.64264 45.519348 343.11237 47.051086 343.11237 48.921692 c +343.11237 55.90802 l +343.11237 57.778625 341.58206 59.309387 339.711 59.309387 c +339.15433 59.309387 l +337.2832 59.309387 335.75296 60.344543 335.75296 61.609192 c +335.75296 62.87384 337.2832 63.908997 339.15433 63.908997 c +339.711 63.908997 l +341.58206 63.908997 343.11237 64.944153 343.11237 66.208801 c +343.11237 67.47345 344.64264 68.508606 346.51373 68.508606 c +347.0899 68.508606 l +348.96097 68.508606 350.49127 67.47345 350.49127 66.208801 c +350.49127 64.944153 352.02155 63.908997 353.89261 63.908997 c +354.43167 63.908997 l +356.3028 63.908997 357.83304 62.87384 357.83304 61.609192 c +357.83304 60.344543 356.3028 59.309387 354.43167 59.309387 c +353.89261 59.309387 l +352.02155 59.309387 350.49127 57.778625 350.49127 55.90802 c +350.49127 53.511536 l +350.49127 51.64093 352.02155 50.110168 353.89261 50.110168 c +354.43167 50.110168 l +356.3028 50.110168 357.83304 49.075012 357.83304 47.809875 c +h +357.83304 47.809875 m +f +410.18707 55.809631 m +410.18707 53.939026 408.6568 52.408264 406.78568 52.408264 c +392.70755 52.408264 l +390.83649 52.408264 389.31305 53.390686 389.32086 54.59137 c +389.32867 55.792053 390.86578 56.774475 392.73688 56.774475 c +399.43414 56.774475 l +401.30524 56.774475 402.83551 57.344299 402.83551 58.041077 c +402.83551 58.737854 401.30524 59.307678 399.43414 59.307678 c +398.88727 59.307678 l +397.01617 59.307678 395.4859 57.776917 395.4859 55.906311 c +395.4859 53.509827 l +395.4859 51.639221 397.01617 50.108459 398.88727 50.108459 c +406.815 50.108459 l +408.6861 50.108459 410.21637 49.073303 410.21637 47.808716 c +410.21637 46.544006 408.6861 45.50885 406.815 45.509338 c +391.50836 45.510315 l +389.63727 45.510803 388.10699 47.041565 388.10699 48.912231 c +388.10699 60.510803 l +388.10699 62.381409 389.63727 63.911682 391.50836 63.911682 c +406.78568 63.908752 l +408.6568 63.908752 410.18707 62.377502 410.18707 60.506897 c +410.18707 55.809631 l +h +410.18707 55.809631 m +f +228.07758 214.98465 m +224.3139 209.75613 222.07367 208.23221 218.06 202.57495 c +217.5444 201.77368 217.03854 200.96509 216.54825 200.15555 c +216.14789 199.33081 215.80023 198.48221 215.52097 197.60721 c +214.87445 195.4324 214.07755 194.51831 214.07755 192.11795 c +215.81003 193.65112 216.74359 195.65112 218.34323 196.78494 c +219.24167 197.42114 219.7182 198.54565 220.53848 199.30298 c +224.47409 205.03201 231.67523 207.4324 235.95844 212.72583 c +237.39056 213.7063 238.9296 214.57153 240.46478 215.43826 c +241.49014 216.01639 242.51166 216.595 243.49994 217.20871 c +244.48822 217.82251 245.44327 218.47144 246.34949 219.19067 c +247.01166 219.84503 247.54291 220.37189 248.10931 220.93536 c +248.67572 221.49875 249.27728 222.10037 250.08197 222.91333 c +248.86322 222.94656 247.26163 222.94656 245.48816 222.87476 c +244.85934 222.77029 244.23038 222.63406 243.60342 222.46951 c +241.09174 221.81125 238.59369 220.70288 236.42719 219.51047 c +235.80804 219.28589 235.17133 219.0759 234.51898 218.89035 c +233.86273 218.70438 233.19083 218.5437 232.48969 218.41675 c +231.88226 218.09058 228.70258 215.29422 228.07758 214.98465 c +h +198.74359 160.11792 m +198.59515 160.81522 199.67526 180.49878 201.04045 188.89963 c +201.11081 189.52615 201.18701 190.15161 201.27289 190.77615 c +201.61081 193.27173 202.07758 195.74487 202.73973 198.17944 c +202.79047 198.68286 202.85101 199.18484 202.91747 199.6853 c +203.5932 204.69119 205.11273 209.55005 208.15179 214.06812 c +208.68109 214.97977 209.24359 215.88553 209.83347 216.78296 c +210.42331 217.68143 211.03851 218.57153 211.67917 219.45386 c +212.00729 219.87579 212.3432 220.29764 212.69089 220.71851 c +214.80612 223.57104 217.64981 225.78882 220.81393 227.68579 c +221.34122 228.00174 221.87833 228.30981 222.42136 228.62134 c +222.67911 228.68924 228.20844 231.69949 230.86273 232.72928 c +231.14594 232.86014 231.42914 232.99103 231.71234 233.1218 c +231.99359 233.25269 233.87054 233.90408 234.54047 234.07156 c +234.70258 234.08521 236.65424 234.56375 237.07806 234.61792 c +240.20499 235.47192 243.81833 235.49734 247.50583 235.00854 c +248.03311 234.93777 248.55853 234.8494 249.08585 234.73801 c +249.52335 234.58475 251.41013 234.37723 251.87686 234.21802 c +253.51944 233.65747 255.27725 233.61789 259.07803 231.21808 c +259.38864 230.96753 263.52722 229.56818 265.87683 226.51834 c +266.12689 223.81812 265.37689 221.56812 265.07806 219.66821 c +264.59763 216.63599 264.8183 216.05695 263.4726 212.38354 c +263.2616 211.83081 263.04483 211.29962 262.82416 210.79517 c +262.6073 210.29178 262.38663 209.81613 262.16986 209.37427 c +261.34756 208.23904 260.53314 207.10718 259.70303 205.98849 c +258.04092 203.75073 256.31241 201.5657 254.35931 199.51587 c +253.96872 199.10669 253.56635 198.70337 253.14056 198.31717 c +249.47644 195.60718 245.47647 192.40698 241.10538 190.65454 c +240.63077 190.41577 240.14639 190.17648 239.65814 189.93433 c +236.73041 188.48221 233.68695 186.91483 230.4057 185.87576 c +229.87836 185.64917 229.34906 185.42264 228.81976 185.19601 c +225.64789 183.8396 222.47208 182.51639 219.45258 180.96561 c +218.73386 180.5965 215.78073 178.98322 215.07758 178.58475 c +207.83347 175.26733 198.77684 160.90894 198.74359 160.11792 c +h +198.74359 160.11792 m +f +ep +end +%%Trailer +%%EOF