From 4b5d2887cb1b90042b115a584c3ce391e5011b1a Mon Sep 17 00:00:00 2001 From: zhaomingwork <61895407+zhaomingwork@users.noreply.github.com> Date: Sat, 15 Apr 2023 22:17:28 +0800 Subject: [PATCH] add java wrapper suppport (#117) --- .clang-format | 101 ++++++ java-api-examples/Makefile | 61 ++++ java-api-examples/README.md | 88 +++++ java-api-examples/modelconfig.cfg | 14 + java-api-examples/src/DecodeFile.java | 174 ++++++++++ java-api-examples/test.wav | Bin 0 -> 134570 bytes .../com/k2fsa/sherpa/onnx/EndpointConfig.java | 29 ++ .../com/k2fsa/sherpa/onnx/EndpointRule.java | 30 ++ .../com/k2fsa/sherpa/onnx/FeatureConfig.java | 23 ++ .../k2fsa/sherpa/onnx/OnlineRecognizer.java | 304 ++++++++++++++++++ .../sherpa/onnx/OnlineRecognizerConfig.java | 53 +++ .../com/k2fsa/sherpa/onnx/OnlineStream.java | 86 +++++ .../onnx/OnlineTransducerModelConfig.java | 48 +++ sherpa-onnx/jni/jni.cc | 188 ++++++++++- 14 files changed, 1196 insertions(+), 3 deletions(-) create mode 100755 java-api-examples/Makefile create mode 100755 java-api-examples/README.md create mode 100755 java-api-examples/modelconfig.cfg create mode 100644 java-api-examples/src/DecodeFile.java create mode 100644 java-api-examples/test.wav create mode 100644 sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/EndpointConfig.java create mode 100644 sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/EndpointRule.java create mode 100644 sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/FeatureConfig.java create mode 100644 sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/OnlineRecognizer.java create mode 100644 sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/OnlineRecognizerConfig.java create mode 100644 sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/OnlineStream.java create mode 100644 sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/OnlineTransducerModelConfig.java diff --git a/.clang-format b/.clang-format index c65e7720f..1ca453f84 100644 --- a/.clang-format +++ b/.clang-format @@ -7,3 +7,104 @@ Standard: Cpp11 DerivePointerAlignment: false PointerAlignment: Right --- +Language: Java +JavaImportGroups: [ 'java', 'javax', 'javafx', 'org', 'io', 'com', 'de.gsi' ] +AccessModifierOffset: -4 +AlignAfterOpenBracket: DontAlign +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignEscapedNewlines: DontAlign +AlignTrailingComments: false +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortLambdasOnASingleLine: None +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: None +AllowShortIfStatementsOnASingleLine: Never +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: Yes +BinPackArguments: true +BinPackParameters: true +BraceWrapping: + AfterClass: false + AfterControlStatement: Never + AfterEnum: false + AfterFunction: false + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + BeforeCatch: false + BeforeElse: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakBeforeBinaryOperators: All +BreakBeforeBraces: Custom +BreakBeforeInheritanceComma: false +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: BeforeComma +BreakAfterJavaFieldAnnotations: true +BreakStringLiterals: true +ColumnLimit: 0 +CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: false +ConstructorInitializerAllOnOneLineOrOnePerLine: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 8 +Cpp11BracedListStyle: false +DerivePointerAlignment: false +DisableFormat: false +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: true +ForEachMacros: + - forever # avoids { wrapped to next line + - foreach + - Q_FOREACH + - BOOST_FOREACH +IncludeCategories: + - Regex: '^= 1600 || i == (buffer.length - 1)) { + chunkIndex = 0; + streamObj.acceptWaveform(chunk); // feed chunk + if (rcgOjb.isReady(streamObj)) { + rcgOjb.decodeStream(streamObj); + } + String testDate = rcgOjb.getResult(streamObj); + byte[] utf8Data = testDate.getBytes(StandardCharsets.UTF_8); + + if (utf8Data.length > 0) { + System.out.println(Float.valueOf((float) i / 16000) + ":" + new String(utf8Data)); + } + } + } + streamObj.inputFinished(); + while (rcgOjb.isReady(streamObj)) { + rcgOjb.decodeStream(streamObj); + } + + String recText = "stream:" + rcgOjb.getResult(streamObj) + "\n"; + byte[] utf8Data = recText.getBytes(StandardCharsets.UTF_8); + System.out.println(new String(utf8Data)); + rcgOjb.reSet(streamObj); + rcgOjb.releaseStream(streamObj); // release stream + rcgOjb.release(); // release recognizer + + } catch (Exception e) { + System.err.println(e); + e.printStackTrace(); + } + } + + public static void main(String[] args) { + try { + String appDir = System.getProperty("user.dir"); + System.out.println("appdir=" + appDir); + String fileName = appDir + "/test.wav"; + String cfgPath = appDir + "/modelconfig.cfg"; + String soPath = appDir + "/../build/lib/libsherpa-onnx-jni.so"; + OnlineRecognizer.setSoPath(soPath); + DecodeFile rcgDemo = new DecodeFile(fileName); + + // ***************** */ + rcgDemo.initModelWithCfg(cfgPath); + rcgDemo.streamExample(); + // **************** */ + rcgDemo.initModelWithCfg(cfgPath); + rcgDemo.simpleExample(); + + } catch (Exception e) { + System.err.println(e); + e.printStackTrace(); + } + } +} diff --git a/java-api-examples/test.wav b/java-api-examples/test.wav new file mode 100644 index 0000000000000000000000000000000000000000..256e4afd3031955e967d715eaab47c839d574ec2 GIT binary patch literal 134570 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 z zZceK7jV81%qgz+-|Lx`E-iOWZ#U=b^FKfszrpXHzGZkni%lCU`zUnnB+imuJw@TUR zDomGnbs##uKUfn#oTzP@_OitHW}km4+y6F=h>?$bRkrkccA3S#RUU!v}GpYzEQ zuNge7Bl;|P4Rj+XlMyy>cLbK8KAG6767;&@ZSgd%TRL0}Q(H+KSOoVIO}x2< z1uBo9_*I;<#JT2Fi`p1IIGdUfR5B}nTiW)t(rN#yZ5<@OjOGrU*U9q>DJup0#V~Jo z1^2LJ|1%Z)K`8D+K5;qE_A~GD0?Yk13ArNbO0Z!){9d78r8usL2qg{X&4A+*{MQNW z_Tea6@l{LYkvFv%)+xjaOct}<9sCtP29-RMHrc&Nor1#RhA%O7 zW@WR7=;)njj%&qWHI!UIP1GckR~`~-!Jg)`>x;-oUMO!K)?y#YY%QDD6$*%=hKIzx z7a)UMpvcQ`%nR`K5ZZeWnH?K8r6IX=Gk%pQkv2bZ1`aqR0#DMg%fs=gy=@SO%Pfg?9nn2TS>2(1i9Un7pA}ae{&_CidPG2lf`JB@)=BXTQwgW z`Hk78$KDV>05e^HOKY>4<>CDXn9uOdHu-bZx7f4tJUg}7A-pwp$GfreYrQ*IO>~K0(ot-$V`*tW~^secNQTOv;_H(4Y zy;pp4fqi(9>=shbk}mccKoh3IgZGJkqx-|Et8l!=TK4eYqvi05@N&@&p7UwbeSA!A z|1IVBzQJ!roM2^@J&jUB;gd>cb$soPmVU{>;l;zfdEc-mohq=-(E z9dd79*yk;zr3tNF4;^mDlmARRD?qCqWPppQgxbTp9+BHz%+Buf^j+j@X5t?D;Z(Dy zzEwwdfNy&WU$+&5c{|M3K|ESL9Gv{m1c0_Cr?k?W`buiA=;B9reQj1F*DM$eZM>)Q z{Ye?Y-@X2IXP%!lyp3TROG?M_8%507iRQw-ND}hN9La~6dAZieto{D`c~9EGUDTO&sR>aG>_mV_uV|4d^tRl>KZhQpHe6NhYGnyy3HPS zI`64^pRZP+1!VezIQ>CczX_~X8)sZWbg;@^-zPrE&^7TRJ$v2X*{Ob0$izcVIPkB;Cc6XuGNv)2R6jihk)BLMC?mXOG zO%y-NS4LO~$G4ll?Zk>itixkg5ls#&2LI{Gg6w{mGnpw8Tm~7PfahOWmQA23T^P-yu{<{Lh6LIFh ziGP^!=Mg{BH zianUtexB_xt*hc>hS`bjnT*D_fYp!CP6K!?1!YWzdHR!xE}lJ_INl3;HQ$cp#LMNv zOIH_>wzh{2u_^C(n$h&GI!3ccY89RDZL&%#{Tl^>3`Xdwgz4Ym$~dtzn`- z{Q4m3@*Tv#Phyu}#KgQWR+=QLdRx@AiZ$OR*V8;Rdvg)894k98*X|9l_Gr#zR7Z7) zr7bKXj_y-_kZ*oOJoXHmHp8AwaYp4#Lf*l`w@Lny@xA-I8YS;%`8oza#%HLeAD)&a zt#o1ol>94cEJo5_wI`inz9@@X-TPI=@!t=rf2`VV4usK>Ki!Qvti>aDu=Zt6WgXTq zKeSo|_nh$CHAvTcc;B<;r~d=B&9g%#%tE~>^}leJE|_{Ez`n^x^+2J)3PT%3zn&a=xN92d8hx;+C^mSWqa^6i!@5iS4wq24_KibKI9SpeKaZQNiTnb zO)Al?C{sI_R5roA4YcMEPc+DD9##K*(&T}sq0Sy^TgLFfCscL*mTV1ez7dPZ+b5c) zl}~>)eRtZ)#CP%kne_S(X3XTGc^q6ThjGemzW`B69}bs;t^ zzB_RwZA5zW^mS=V6Zge)1b6W{tw_l2sv&pCnf`1Ixq0`;BaT;bT&$ATvxwu#?MmwiendCjq(vDHne?tGsU_DxW)Y+c5 zACs)3SA0TZUfMnBY3YxrJ)GDP^uY>WQRBNHtRT}B-M$;uKA-0^ehZ(*Y>$gQ0Y@H$ zYSp&Hii?MSNIpgjJGhHwfb8b;e9Dbh(FqZJNO0o!(;jBC&#vw3fODt(epKwSG z^-6V}@4*DWs~l?t34bEqS^~lL46|Und$3;5lI=HWS5(tiSq({N8TAbiYJD}_?cIxd zJmZIq!x^cJp2@euKT{)uWITUbId_p&Pw$h~!pw(jg4gBY*0O}rtsI>*xz6ju?>+0| zu)q61RC6v@Nizj{>@1Q@q~6qxb&Uy0S8x&|)B_cT5Ynw-8i}3Bb`<589>?Omt4e3O zit0m7_sH5qr(XVRfV{hjpb^Rc-#M`;6-Il({`aNBQ*(He)9FT83LZ zV1)zh=XW@`+~J_)20X&U83i*=W^@eYFXAf`o6`2AFHGN_mMv|Yj>Rm&Uv#Xvm?WPr zl$NQ7!(ndr8IlpBU4P17ed|WdLL#^sJirCgGn4HyX@b|iEQVa9+vg!Z?^Y4kBj(n` zaDv~-r+lCTXdJwf%@l@a;h5z9jA9v+-SBfy#=_*Z)bilz#JIG+>D|-6vx>AtF83vE zV;7dGSFZ}Un!lVZoE!nSgc;xC4jz$th$+1G~qm~;?BBZS6??J>)njf;j&cA zU~2p>6TT8@Ys}bMf&u@`{GOR^cDpfNBWQs`Yo{akR~iuAtkuH}y{Y64=41|rk?vsI zhvS-O1Yek`(+LCg6rTN7NbpCwhQnf@Ix=LB!svOS$kDVon#_E&-nl1|!_B5D<1WGc zP~itq;gO&{q}Pdut`;VkR33YyGL%6p1^mf)lw zbYtkmWN$OF9(8NUJu(=L%rIG{&gM8oR)M97Zf9shI~K7X(WK6W(AjEo^sQ4l%Yu$& zxqgvbIGjpkALUu@OB-W1(&KH^KE5ML z9}MCT*84)7S7K zlTB7#!oxPlc^q-`>`Wn;`m%1dL{CHG?sYxBBMSH;Vs&(~?=v$&wy>IRGJ z3VK~;{v~WfUpOPGa$apuqN%7YpspL}bsXZzX7ccT*qlY;$p_S#4c6~^L*f;3TG33? z?k1c*oA#TG-mb*6iO`aD@wZ~9_v*E|^D zK6dl_%nr=x2C_B~bu+xsXK?nZ@JH;?Fy3vR81tCe?#75ZsN z+A5^ZU^5HT@vh>!`f?79S@XFf&ZW5fx_0Hya5Pz%<>%vYBn`x-2V))O?FO+Nm*WL= z-@cN#J28X)t~8JMm>FzqobPY=rjcT;Lq2t#H7w!B)66j|rRV+T zD9Hv+7{__Bn|I!Lz1P9FEsDrEo;z zMd#2yaZ92np7dAz?F~UgQCS}me68>!+39=O&N5K%3wGoWdgxBn~1^#V5BT!ZKv{|{dh}6a%0$mMl`XSZ)I_t;Q?-v^~)n~RYzxSfy4kAvcFB6EkQqf z%j0HEd|)QrSQe`buBje>b|E=C*#L$3;FRq#ynV(hYVt(e|aK=C8 zyuLtR_p8acB2GRi9zKap*}$v*U~0$YWOW!bA^%!fRMd!ktWVx1Z}L-E0>km0NZ@)A ze|vmFJIr%CY-SJqThuo_5$cr=C@Ae4Q#|c$tT?T+*x<$4pVVj$bnr7uXiGQJ@Iw? zMltK?Cij0gTNA?`e9fzV2JbXvOBQ0JzIPtu@!8kfiL1fw>QO#(OXnkM9UkXL%O*-= z1t-B;`^`|S9()BiZD$Gg@>q@O*_Wo0G{J{77opw#P z#b0nI`bV;&JMdNeVT63LqV3GZ`H_b9gb!ZgSL?~_P36=6Og0iHY^Sa5o%dfjw;Nfb zepXT2tIfw_{r_@SSyVYRVpA|iv%tQO;>wB-xCVz&(j6SivT}-iE zH>ir;;4-DL9u+ckl%X5mlYfWnXa?5ncxQH}m~9{WGB z_GDi6IeXeqon%e__cKoF4y@uaXm5H@+8ltIcH!{GLu!<;>R(>8}*(QCwVW!xKT~+52Dzyc3?C=Ukhhm zR*atmr<_gX`Ue^MM8vR0U1dVYLM=D;)rIQj#cy(B>=r%LzsdNuRH^l&T9A;Qy`VO^ zpJ$XEv5FQlvk6}93{Q5Gb)3Q-z9{4RYG%(>Za(8)Z0;xazAFo5b{~{cntwfw(cXjG zKh1LQ4{zlUisDXx#~OE+TW+jA;1AyH1G;&fTwK*b{gZVxlXcu+rgRqBD+rnFw}eT) z;+NmBlB&LH)7wYrO(WGp3wX&Ta+29FCe=ykOR^@zy`qm?>Fsv04*vLizBMZ!TgvZ5 z2;*b+dlIiRjJD>IS^PXWZ*t`4@vZS4EJd1?d~D*?Gv-^rr8XjuXyYCgl~c%7RtR{m zc(JpY1|9gM$NB57P}@`p=MxwruRSk;(KCM!lQhb|I`XuQokyY6-_Gk6?9e6p{1lXv z-#Y$*y?3)4$JK2d6ANrI`KYw{PjBcW9|~DKYxY%Td7h5CjjDBFZqyIY<7Np5pWnyl();i9hu`{e9FBnx_KLFE(rakOq+0J8p_KK* zN4#YnHF>_`x)!qQrEP|_cr*A?1=$1fm>FOt<>`OIaSkLq+02?<&idS_lhr+RR?~|| ztOw84B=PqS4Gcz;;TQgICqFT>*H-7GlyW23GgjUWauqUEUWt`&1{=5aODH>W^H)w;{Keb zj|c7S8vNuqUZg%O@qkk~F9-NO57*FygFC{1$#HStW+S`$YXbRT^6(y}{(LvsB9lSo*pWjVoil$nfRbe)X$GOe(ul4!m)f!C1 z+zhq%Bh}zNqu*&iOVUD4F0XpgKK$`%d5E5NuCWuTj`bcc5-hA6V zHJdK*#d_uYID>dFRX*){d4+}W%>mQiE|aL)5JY6l2f#;_S+gVjKnZaHf|TIkxicSV=+)y=khO1cE*0}b2cwo#~a~R8LLHbQFZ(MmpJuf@A9L# z=#0+zW$G59Y-@A}W?q`nmLx{Cp+~U5z1gTg!n<{k)Fcf*VIQ|SnX9o5CV{@|*399GqcG`2{j-+Vcy}gfdkdJw1E3IiC>Ol%9_*ZBT&hGkfao)Gc9EkuJ8@J z%}PqBt2*X%U%_oO#7h6huFs>L{Y64G=vNEY^$okV01vVa{yeX)_Zf%^t7`S@NMT>+ zvEF-Z(*^dv(|#Xz8q8BiD6+OZ$ekqSIMnv5oLhEv$jc$8Z+vI7eXA)J+{7-`@u^WJ zc)PsIIacB3Os#4m`gn+r4WpHV#rU(uuuYVyu z2b|mt9%?$Np69dn!iyKJ{C2CZiG8o_H=FqVYHB1;@SaIOUB{D6q%Ae*uVmsYpL|LwPr2`HzO_iieKKFmA55BDGN{-bqk&i08@ zSew4ALKXXdo@H2!`)SS-HqxJ5F4HErgcQ0!2s6C*FZjwM_`9gnFTWgcDN#>(&tKO% zqdZlV$!vqkdW_s;!R}pP=jUZ&t0D5XDva&ir*xuVKNv~{(4BqeytUhv~bPHMf~Ol9tR9=uW9 z-iLJNZ&Gu!eYlpUmLNY>t+$0U8mMA_iLCK@wkDD3F z^%DL(LLNKW;|ccS52(AA+WL7sS9YJ)2F9On{`F=P!G4t?oCWI)<-4l0R)5pby^zNM zyZw~>azQ>lWWV>4#nYrIx+8Ig_x#eHkLJOK;!Iv5{UtNK*fv)CQ(1sY5KuG!ErqSU zLxo~g%Q94sBmr48=SvsZ?*i7;4|lP}&fLh8JjH)>gfk}v)70(svp>yg&7E!rxJsL6 z$^A?s@r~svEApf_vh8R1I0h%%f8S4y^ghcl0_?H56biIDUm@mQz4!@X5Y@i zViz!3d)eT>V4alem>i<{26nnD8G6sVtYvee?z$`Ds=T6@M)WS4m^y*Yin8yg?BShG z>>gj`>{ve4U7Kk8JI=d2-uEc&las(}wq&>Nf_6&yqZdh5qzP;^LWH`N{G7tQMcL?b z-oLufDe0-MA$ANKlZQ);1W$;WnF`K<7leN00?k}^Zd)ig=d_@bQ#-}`nG$` zPkA=;EFSfIH+i<7Y4I@HRuK08#+g4$BF{O?XqMNLPWT2fQBK(ZM!2^rkGN1B-34g! zVLSRR4>OmwKF%hcW)34q-cpiZLR?}2x{U|ZWJYIg8O7P8M>G%A7cIXwDqpRq>qU!BK z&S54yeGj{GiN37iFP@cuZskPpApbX~687gmzYb%A|EE@by>%|k(ve_Bz#CpOpwP9V z+TVOvc3Rzl)&w;jOR*n+iebyLhwXT@x7mzevubqZi7ecER%R*4 z-JbH5Q%>_BKmDy|`wY5T#wV}wYX!DrE1uy1dz0XkO4xx%VTb`f_5V6egC5vfY}{l% zA*g?NhJ6es3^ehbcanpAZ0QBhciboc?ANb6{NJj2!v5zrnW$jaU(c*u^xP~j_657J z7bf||>w9)&GaZ;iBAz0x_xS$67oYZ=JFIIZ>oCLFjv@IY=|I0MjUON~?Bmy9SapQ| zd)4c8-x>7T2K`i<{p>!kJ-p&iG$`1OBQ(wp)1EO0D-@uu`>pFK&od9w_(nHL3jbFI zx_tzaY|DzZguU)18#l|=9=FOFp8I}vxtIBpIb@?1D{({W3XJ-_X$%`wHhn7o2qLGW z7=<{5aT|}>m{0FSr-GaL<~X+xt?p~9I_@lE_B$_m)5pfDHsdFQ$qR3?_@A=_XT$_0 zX?9~QS1(9#2rD~+@99ToA7RUGQun<-OUpZpB?G&4ja`9PV3?X2g0DEoYMr_ zK8ZX`p=IOk-}54+KCDqwSf_@cyNNtpCV9VSo#7UoR?zFaI!oSyzi)6t8%f;?-ZJQA zT?UIT=A-Ay<;?Xf=xYru`g|63F>Ddcn-13aC695?NuFYbQcf|rgR&Hzx|0>IL2~Lr ze)o~eN8rDPq^_Pn>p?Gf+ugcZe+&K<+#1=8q_y@`-AVay>mTW<#_{XKdg-FfYxU%~Xw4YX&A-?#E!!JPO5UO$rigIW9cms35hN1Zm(%xo8>*(}HEWsy!U*^|`_U%31{yo-biJg4gpUeDvg>%@*UTm}a zA8ExYsPP)x6!csN9my5#XH9z+tTourU`HRY<_E-`55d*V?Qe6t7fi8g<|_|oeOCiJ zT!rqIVLuAkwFF)Jlja5We4Fjo8fW;SSFpO3UTd>tV2gEcwXgs8+U|tEq8q^t5W)1e zV77ZO|0u-222)`2k*u3}okG@G+@6-;g@fq)4kuO4s)JW>FKA`I2Tu|FtFpgU@~Zm( zzh2(=23^-By+=VSz0p(W@!r9ly5N0-`x1lSZ}#~AFX4>t8$mX-&SP=G%#lO?Y;Nnt%Z8q9RdD8b;fMt;X97z8)aygu&Jmw4PJEgM{L#wYBvU+b(Um`gH+HowH% z45Zn?{DIzCum14NGi=WbvJn$~&zrRBeXIS_F8{(xUzITqZg;+e2Gw<%k6KSJIxvi0 zk5iEl+*7-NznbUIMgCl3mBEU}kV^MTk;Uuus^(DhINtj{?UUolsaUXQG5CFb>USzy zhv2F1fId1n{W1`4kT0ylH`c%e-lB%|HtX)gQ%)h3lkMyWn4|A$S}-N_=d8Hqvirqr zI?2xDzo}K$B!9L23OW)Ww3jWtYSXOxw4V9PIg(O_;vHvQkh^n=|PmGj;? zKdfERrW{p(@&r@mF!VOh$GTN;qz2YqKSh35{Ec+Gw#okTs6 zQ+}FPko62QsbMmn5CH~v=?1fF?jg^Q_*!Z2)X2^^Bn|2QXPeszPl~B)$;XTNU5&0O@^|OpJ%TzQD9a+>kIpT~kYl z;vlqNn6w3Xk)v)H`c~KVK%ek5ZE8uItCP*2+<$(=4A%bQ!yaa7-x4YX6&^^-ZIbU> zJV$A@Adjly|J!qRWQXq5JF}l2xaStWm_&p6!tnj+QUS=alX$l&pV^LQ?Ji2G$dZ0e z(tAS^&3(0!o{DjL^-Ak>4;XXeLI^I-1@o7Ih12Zk2)K2qb4Mq@BDy0DU{ZkzQ1R^+eHw2S)q}hd;yw=&$5SEBuUH_p-W!qW=EoaOK6$XG^PX%H&W|@*ZoSq+1=_$TG_g9CYu-U%p<~ zgvW|LyS6jC2}ksrTi|!6Hk)b?)M9?8DrhY^FG8z^xXqX}N=hWRw<7bt6%b1mQ`YGWimwYzh(Fi)GH#)Z{fCBm(2j_IRm6J(fL>q7rK3l#+! zsgL-EFPy>k?qB)Rrw+?{=I7YER=mMNk>a|vUz3B}WEs}c9x$aAaLW$%? z@;h2x(ixI`)w)~JhKksPzn$G}p=aE$v0YU`DV;&nF(Z{dTZH%jMg3L4pY-*NnY!kG zRHb|=@SE7b)%0=^yBYIT6Y0j6{QWs>O)v>>iFbOKwMemH9c1sGvcI{V$E#^A+`Z7l z{W;&Nr0D1L-9=9tQ)aUl=N%h~InS%dJ;l!rg{-cJIErB{|8XumtYL4eSg5h5+N&yU zotsIP@oAca^Q%&?+m*pyC9bx`pkK0lDvu5?I^lkn1>fl5E=WIV^bw2dmGff`o zsq!$m@2D!Pm&-FA7pE0WjSKzdr(a;j%7liiWWSf+8(<&Ggnmio36*0z&sf`UY-PX< zRfBo&$4q^tLv9;u_yo@sQ<+zUhHbXun%1@*e%g>aWEEpQQ%}0s9l{SLK zuBAPApX`2w#Tn=m?-p})u-6m(R6F^RTD~%$b?xh`fnJwZSG${U{0xirvUw4C$=>v| zrR4Jf*?dm-`?LC1zESh@EL(SlCrJ5MR#y@2{Q%~x15c0@Pnza*Cz8+4)IhIiAvZbA zG0rW+I_mI2VQj)uno-^^uTYN`bT%~heh=_zpPQ_ngg@`H_gApUe|X-2eJbsLcCm)N zA;Awwdtutul@*yHp1ov>#^V^a++vIDp%R{}qbJ;Ew}$fUUx+lO;|NTz_vry>NRFV6 zDQh|8;LeGunwg+52lwwbDU~ks@e^G_pUKVqX}{<4DK+`>v+Ub)8Z%Bs=mm8h@2eQO zB7a&aH3%cMMIEsjBpBsvKD`3`*8&Svk4Nn06T79=HGOgehOD=I;Mq|A@K=8SNw4a% ztlH_CDxD&s1JKq{KHv-fyC9tpZp40)rwQgMo>0G3RqahMQ@?F$tL)l`dd$m1eqH&h z?>+Y}8G(b4$`kO+B#izv7PNxMX()fTOQv=;y`*hW%BeH3%}M+{AAk8gD}E_ej-hU@~xPns82pC(#{T7W>{q@|E@2`Js*2G(&zTF zmf2*Zm0g(5d+QFdmnV~b;LWkg3NjMkd!Op|FzDsVLrQ`knE@=xmpT~su{UK^Ugiyb zj79p1c02|D6kwNgss{~bIyS*qm2p0MRZ?B2|8s%Y3?2M0;Ql>Bi}=^))^b-?7Iy*+Jew7X)2y%YK5Bf#`mbQA{&er&Jaalm z$Q;*{jW|ya1MM%zHwL$qY{K15QJWQ0UGSGWlbx#MCM8}~-|(B>6ioe`!=21oZ7u@7Ah85VN&!&iMUlA->ae9+2 zv>NgYD&6zb<^Q0Qpkg^)9q|cl=NszXnj}lOZ{#7>RafO8?^LDKO@HD``X$$4Bd+P6 zd!2qx7lU5ngU?w>71%cHnWF4aKBz8;7}KDjTDa;v_>oyMTQykj#p0sXxZGY@b;FO+ z-?K1h(4{+*HMvIqg8JM$X-FA4>HR*jr@Fi6<<;Ba6JL;b8)OYZmhwAXUUl42Pzmr2 z?f6feSpn*<3c2SZlV{=K^N`2_SmX~f*n~!WX;phz(ekX(NYyX}?8+-9n=X_${7c^N zXT2eAVYaFUaz?Mh$Q^iy^|ZM&l>0xd;m`QO*RZW^RXRMY*5G;k`cU!`a7G2;%qApv z9qhN!uOKcjXNPyf@^xtLK5O}$O^w^VZ=lv@{810jep)5U$N0@_p}S?(TZW%fFW1Z6 zI&t^MC#)@)Xq`*XLNJptxJ|o_y!AUOBRi>jD5yfdxZAORP}NybC2vLbs^hICgH+ZP z3H>XUI4(Q#0PE0%g;^c9pUIn5BCRpG+?>|X$SNjUM=SUH zTqVQ%$51;4qTJe7qD>hql)=ub}hl26(6uhnFC57!I#4sUSp zP}!_kq3||&r2k0tK^A@+%=xDEoWt4AB)y%n%q`Ri-e?9+51ig^db2y(LVTEl+<)SA zHq(h=WO1v==MA!#fQ71%-a;bgQTk%L(x#`KelTC=6};ln&~fbd-q3v}6f98_vPey1 zT~%8j+MA{1r6Cr$aA+H!IMrDn7jq=+L2$pNYFO8BbTsI!zYg4w2DTvD0QU z(iD1m92ff{zu6xy`r4|3+Nr`ag>xaG&rCXakrtGY*fvuJx!KKCeJ zf0|TwWW!Ad;kCtMDo^eW9ig#RbhkYc8U_`$woAoAK~2hiv?H$?vM1a>H9lNMH|c7( zl6|8#rA4^03a+0+wL@RQX)~Ss_bmG{l|~tkp@h~}(yzR7l0Vy!yZsjpc2PG(RHbT`@f@KERQ zPWV|;a#00SW0eu#!wG{z|6pcHLtjJql9OcP&g5l#QBqaI;Kb9aEDj_xlE12?s>drw z@hwfo&%ylQt~-xw~p6rPt)_-vHz@iZ`zBhg?gJz zGe(tua8KPori|P~PJfi)D;)YTzz}>@k<@Z_EKhQY9`Ye7*{15pxDdZJtJCQtT{yMu z)St;#yz$4ZNIn?;9#4FSr>H1S3GT-lsj|NUw0XiUIdkv??yG}*iaDp^>XOc+4OVM7 zRkzVoZcyK(zHYC5xh?z$yw+0QwK<&h60iR?Jklijt$X9TB`T>x-Q^y+`&51oPo&Ee zy+%HkBy+Kx+1d6&bfX);R+QG~gfM;;73L75&auWOskc?^+#|N`m4&JPas%*Xx_b}2 z)+Stwwk`^TC@6%41VH~aj2^y~7xoKgpmoQ&OoVV6CBIU0TG2i7Z^a*uSBgIqpBsS5J9~FX&1%|ErurNLa!@Wo2Q-X+w9;(*6_3BH_7YqASYC4 zpGdpk+?KCHw}ksx#pUoXX0k0*{di1fuZF6+>M(f@6LwCj^bBsYe<^-n{H}Ou-BS<6 zUyXkkuV9+bb!^FCmVF-lQJBS;%95@T<1`U1W%Aw6()N8S081vnR>7P{*Fq7N_$g~S zlYAWS(NRtCTRd$I6_=lfb3`79RClS&PAke4{)8@1gK>w+az3Oxr(t44{1Gc?X;M<9 zc$@gp_?mbX?|Q3UNWp=>i&h4*m&vrE?7&^2U!aRZ?9D1N@iQ;@zr?#_>PekqeP~xO zxn&AD9Vy<9rH$j|CadY|Wp=|UePBx>lg)=qxew`tnKG+Lax;5bEV(FAEioxxG=3o# zwvw9hzVW%L#Ru`W{j6b#2whh>Yt>YI@RTzy!}j)pKa$R)1&deQq?W<%fND#c*CdKT zSNn7d?Isgf)7H4NEFNAIDHiP-ogQ5oou-%Ms_Ok5>h^bquEEpOQitX7`y>|o>~MT< zY-8+=*lV#9vDT(zor(|EKd>h`9J}2Y#(mt`e(6TG6}r=g@r}E%yyZl1{b+fKAyyw)}ePtq_4{8LZaxg(D6Ts zTlLZ9if@k1ip`I$ioG7&6|3z$+R}~Iti&9id#_HT;Ucj_D39KU9nQHMw0i>1D$ci; zPAxLiWV?#;uhsh3r>RZFlx9ZCnBK19wM1lEq)c>DG_1Gzf%LrTTce$$2lOyJ93B(e z&NDYo4N(o9JMoH{RVh7%hho3Q{*2vWD%NlDC)D2_bh3qc@oM71WT1shQM;#(<@NgL$u>&Xk`=6^BJb|q$x=2L;r=E=&Q-5Kk`_le)N;* z_tE9i;nCYnfH@y-8h%A}_HCH?%`nbsHoHaQV*G>n%J_Tn*Ub$4*Tji^iJ|JEK7evI z>O}A8`M0@gd#il@7&h-InaHZDtLN}4d375VNPSE@N3j(#9VJ(>53NX19kUKM=nyTZ zv*)A88GTpJ=)7tfEgteKV-h`TwFj9;hAWm%%O zOnMV&s3)|4uUKfdlNk>u{RahpkIg+uV)m$s+9x(EZ#r5%oY*e;grRuHJ&;ZTsOD_= zP8~ImMe69RX|7_vyN-(2P1b5_O5k=jeL6f+8iTh6y4g$HAM@&}KYU^0TR7)fBBxuB zdg;=*n(X169~KMUEHfNb5{#CWy-0UEh>^cidQ&gVoHzhK*TsJ2`X zD&*eT&v=i|^)@ZEuCC$AW+nZpif4&zZh5i7^I{F`p&G$6swUefTIp|@VqZ>@ijJxn z-xa@wSm=R#(?J~U8D#j|P2 z^|*%Vd{$ArzSQ%tR2lHBJt)Mt2c0&*@Tmvv)oSQ*AYU3VA`S7;=dhrM)7p!XvXSW8 z_P(}Pt8jZ$-Ky#{I>C!PA+lT!YkkcEpCnT?aV#NKDutk(7NWQhVc&UTrJb_b_j>;; zc*N=A^*w6V#zT1LU;131u?SKe13hge|1shJ@8I{d}tw0nZWPt(o4}xd@|nr zw0qTtA0y=pRf*Kp!TmgZ65P*qP5n+y=sQCv@nti>^62a6z<<5%EUu{Jsf}?lu}7R* zQ*2aC+ROgQV)J3l8q;7(#v;i}Y&xy_-{f+e)qzA$O7W$|ZJKW7<|5)^?>zoq3Sv!?4vB zd{k!~!+E%cctR%#3Df2rEJv|6@4I*X=Z;>M}XsTw*8 z!`Ft{pT?Kgl;v};)Y~t7HkwGd^uU$$*y4m4`UN@!8N^|@hdcBK77#~zS#|F zRwGewn2dF^`J0FB;6Vtr6bm|z4=g}V{_h@~;cRFe49z@6D?Y$sZuL~3%b#|GJ%fon7o0~A zPmo{7Yc{`Erdf|?^>m(3-pO)pz{WK9v!~4x7>koUU=@F{rwi2s-)xfMQ{>_^Pb;fJ z!d75Z`rwI{Jvzl*)DlCs0NzIU?fMT@}w^Z4{~x?;BDsfOtT zxgUCNuQTscHA|Jm0z0r_t;F=Fu{^40)!-`Z^<9A9I-+P7U31*X%*P~0V<Ih)CC^2S@@CIBoChl|8e2oQ?h!{^_USPibqkx( z6Jz(e|zY4v@zAl4GB|6bAlAlZ!Exb=PBC+H4&!PCDeGMa<?;e+B*wduX14a7 z(;=K~sv-A_u0JLtU3@(|mTi^qe#uj}U@J?hbSs0eYzmDpW2sUyoL&9oR!>kYbhp#! zL>jxPJAIV4-fl&wA%*FDUrE`KL!Nsnwl1j18Y>?;-tR#^{TrFFoKC)@sAHD>*dhks zh=rbNRc%?0OyBXgHFTtl_o!cblx-b~abJi5+KYp_DlWW7Ts_GX9Kr!rwu+%%gH)f^ z!w6jwN6!&e1)eCu2Yo^|U#0gi`t&zt95;IZ^Y$UgqYS~)%#uf1>+_db`Ab$%mGwT3 z?F;Vy>1GWx5`SCMVI2NnXR$7vAM$kBH_cVhir^ zUKgFmQn~70*x&m+(Su|?=qo%#yXvX0Sb`V0fHBKU8Zv3>7cAfqx^WYU+-1L}dit)S zh{j$`NkX94Um1-i7bckk~XX=;re(Co0Ab<3!Cs@Pw1h+$+_8vEgwi=V& zPCoaUtct6Co~}M`mLbEp)h9jA;#ZOR$u9Sh;yH`5p7rf!FL~z0-sO`0xQFD;W$S;} zy^xS&3M}4nRlTdp*+}Pguk7wMJG#jpOo9!E%OMOUo1;nRLiwCEv?jP^;Xf>QKCc|S z_*pw0WVN2P`=!|XKUnOKV2Z_X&?dI>GWP93@AEc)pG}Uezt7rfzD;R%x(ie}P&74E z*69(lnTy?CgP&^%vmddq&+m-Y182 zgPQDrWugvXuz$w5UBJkdry0|HZ&a)~9U?CT8wYna=fXX=#dHo8mp>RT6#kubK13#F zuMzO=M818Mul<>fvf%Yq13m52XL|mb^mnRVo5Z$G_3xEd zc$j4^%{q@Ezehx0jY#1{(_KF0v)77X=ab1kI=qU?4#;B49^R$-f?XWYP2&0?dnv&fIYArG@4x$vIT zXk1=Dw>}F~Pl5ZsPNuU;Q~9@&{QNw=Fo8ELEtjJ$_kwfVK~_!p zhoIK~yr+DV4&;*soQ#vYL$>Oysa1t!Ao{^oSCaMEp5R81G|!Na?(Qdft@!4RkYBy5 zz02;W+L4{4*zkL-(2BG?{NhJ49ob9@C?5`{%!b8QJE5n^CYLnC?p&pz)16Hb6-;B{ zrkxm_JUE^{<|$m&y?-ozC0+{4vLTTlHalV!vtgmU7|Xiqyn@{QBq#YV&3PK;s|9;@ zm372c@eM_JkelG7W1*V*OyA9lHb26i_BS~@CEj_BKIFw8%;wEY!(VeePbBq;uEC&B z{3*O)EPf#VzxY0DxFazD(yt)$%_fTb3Z`udyS<2;3T|27=4-d$$lfAJkHW!E`rC2L z>HBI7=F!H9X0=*~zJ zYh9FIsEqyGK;NEc4I0BM*&vVcV)-w<-h(_UsvQ`ss&ohTpaKmKa|wk$eg7+@lEHGPx3W)!!99yc7jfdZ@gC7k%l@~mhhW0an^C49DEtpvKvczP_Dt< zCuv=ANcY=`WVmf)N@QE)zesk|#ByLPw?)Q8YDIn^r)PPsV`Sqya&SGGD(6?4GLF5`!t@IG>ej7@t$XN9~p<6+JeFT2q)Akl3|vp+tAtZm3CpA%zaN>%$UUOW_+y2sLzdW zrWp-Q_{hO$oK6O{UM<+Vd`={o#`j}rzu#wBQ=!mq*ym=Mfnm^N&^MAsLTd9IpOcIs zuy-Yh>95eeX6_yf-{9%nVUiy=MWKMnNM>%BqEI3<1CujCHSIIlhb5+I+>khD^45uX zb~6-a;APt36dLf?6>oOVy@ylYg$3nk5^$goY;Ld*j>U z+p(sFv%ns3Jqm1DwrqnvDqsJN$4A-b1%+v1#5o4io^?S-gb5&5&y)zz=?7j zYw_4sS&q|*wxZuE5KAumyGNYTpLTp_EeD;+%k=#-mVb+=<^z*{&#H`=gHQQ15lcLT zS<6kk&Z(I@pVr$cK8&d=YzEGX$l=Hdvzf+5N|~@8XFbQtTK^#v`bHvWVs5-yyktCE z{Q7t~jPmpLq%dyg_e4__9o1Ol;_Ss$7T`@x_OGU9yic~XhsI;+215a@-PJNF(b|4C zG?il^cIg3pPHwpDpVUBhrUO~(;KrBAZk*X1*>4)oICJjal=~_ga-X}ITQ?+wnQ-gl z&&J!w8^x=~Yxuomd}Mrs%u^riOfy_vUr#ky)Yg)gd_hM($EnoEsPu(}2c%*cwcKX1 z&A>E14H!-dD(`z^_`J@W;FFN#o(#%Zkg72` zC5pN0;&pR^OUKjW7u|MI$b8&2@oM_e+skClmGhe`R;Vdf8Hz#fskiASR%@#0{V+s! z62p2_4zs*sg+Jx0Ze)LdNYv3;{|GcTI4zwFrOW&sH~sH1E9hYwPs}8P?BQXdJv`a- zsqf&3h2{}`W@d6(cW#`Gor|T#tHejsmM&~pe|+I6sOlL!NRWLV#23C|E$!j7gLr_8 zV(tI2w6hWg6WirR7Q|P?PsdyEfOXW0)L_#pVsV=2G;b_VUMcb#+1wlXpJ_BDBlGw* zr;PclnOXqX%{7VVM0~kyQ`>k8xu*g0Z&CAKPGQwk$&q65ZV>68ykuP+M%{Jo)edEZ z)9~S9$y%rZ2I#r@w?0zx(Pl$lk6^rYG-!Al+Yb!mp?A+)IyfwC3E)^ z=9vFR0g@+L?)mYQphLuvD0CPk`8*F>*H)6;*n zj$+XTk$jP7&5LRj`h@Kppi=F&ch=qsq z=|$|sFsxtmP)@e@e!lEpjAI+q(pSjycQhyUMblE2(enG?zS5$oZX)oDp|#;BBj+Pe zM!$&u8@(F+PWGp!>2l2?pNDS@Lt;E?1Jige%bi`HSWOx_$_F;Jj_L8g}LcNpW^S!3p&7`HvyuMD{jKTXV*;sYk`)U15$2}At z5;+~YH~Mn)J+lwTM!QE#MK?z7i@X~?51S8{Be?=6e#dT|bFTf!#e?>vGr1@zH=GXx z8HP3gWXA_U^gpNN#zEI3nb|_$*_~|e4#=5W=QFQM?vw*u=f05dF_^_j#bGrmXWdfP z4&q!a)A7D}RaHpDplHu%?P$_nQTIkZ;}6=07D2ENq~0?9Yn2H&sra`n=Z5$<@xS8b ztsyD`d7m|IBmO(dL$#u>`|L+d1hX4nYyyAx5&<88y&v%&*TcW1Rbe#1zaB_7gGyVo zos&bAO^?eJ85sFA5;Nz&rm2{BM9)UvG}r7sH76ac!qjC|2V>-X_L~CqvXdDj2erz{ zR%eaA#lAJfyRQ|4RfAGrF>&B44B`$f*RweGbJ&Zg#Rqjnao5W=2aG^PXWS3llOLzD zPd(845LZ_>hHVZXfw+ppTscg&`&MT5mhci@bvDE{Lv7P({iCB{{oe5WEHTXi(L{ZI z@k?2ZhseW9@x)&;EJZ{$1^J)fuoM&VL?y69AF$KSe0G?w{0Q|0H$>GIiLVYi0`MNc ziprW|W0tGkxUAB%tc=I4;V88ChO_+@$5Ba*$v4w9!2oyZn7yO)yXWN22Bs!ka2Tx{ISV#FV0X~Uwjzn#uI zEMF}g;A(tAaqP@$tY<&?^>NJGFt+-A7Ajrb^(B}? z2;0#?yuJ&Tslnpxv&z3%yHA(1B5z?+KUVE%}I||1a#A=tyirWuigkKQ# z2e&dVftg#7$kLdfGIpb}>fYDIHGgN-dCj0{8FDi%c=Y~w&?jXNYl?^dgvnp9(ukSS zFT&j^8odO+(^ZVvhNg{!KTkN>PH@^WQF~jmyi6|loOR^z3WZM5_eJbr9q;kIRgA(g z)w8FCNM}*H9!&2T!yg}}@AX8ZGw?s(;`9HIt@xY19uXaW;9c8@mM@dzH_3BF6|%?3 z)NYJHa4T}Uv+YfC50KD%pvAZFb|+MU+-NTftA0xt8*Zk7E$RB7PGdCowGvwsf|%m) zOk7NSD=B$G1pgks=BRrAU}Ejv@XSMgsx4mXUbrL#-E5Fo>WXR0ojRiybsGu&!tdYP zg&e-x$^WjxU!>Un;4a!>@(FX;-f6N9{Y8Xj$>dk!^a1w2G<$c!>VF|!$4FH+?DSpY zq^@>)CQfsw=Q)Ktx|Y=~nWQ)WLJXf{C`bFA`YOUgV$`4Q!yYR+DA$on7IsEm{r^JW zcf=}gQh{C_>vIp?4*KZw`}`wf?|H0lOW64)w(1(@?~-4cGJmC<&12%dDe&(9u&D|A z5Zo|c0e4dwuX>AY)m4$k4*dJ`dFuzFn*k z%p(crdkkP5f{ySqZ1!pYzfeA*E6%f`rzvDLMXca1-r!Nu?oipJU=qvMBF>XI*%Xb7 z@_H9!Ve}x%1$4#mm0)X+`0Q==p^bM~0y$nzyp@ckz7^j#=gGD?(;cFSU=B$gD|mzV zYpTk23dtT}Z7ZGkY0~?$GZ{<l@b}6`{H<+XKDvs`Bd%qc@I3w!}hVoPQ zS?!*QAS_SKCpPG}TQ^{v| zoxw7HW{jn-i9Bkgh9z62I+Ll6LA8I{>|{w?S!EWdki6ITY6s@0wcxk@NlS)al9}9& zQ@c0xmB_v?ZtT&t%gMoF?k81p&qxN{#4F`b9@1+UaHk1!c+F}~s8_BfB97{bTTJF7 zY2|TG<>=Q47V{PL1uadpU4rp?+Nv9{>ZM7*-}LaOv}sUbGm+{`q4(2fi0T?Z?r)|I zl>>YXyE>M(orVC?>CQ>-^#duonwlX`T8poCCw3^xN_-$*(c=;tj3Hm_-qxUtI9Dil z+HESrVrBF49Y%Ol_3`T#ssg&J9E#RV- z@S=OJM0JP7IS+@YBmIIYg1Yze#%wVtR+;mHU&z0-~0FGHxf*z7|uC#D84DxGfNy{*BxC zTwb=foZ9pBW*+|;+{ayu%pOmECI41U1pJ_9Dn_50vahS0b6NF^U(mc^c!cFXe>%yo zXYse)9vQV{=*fH zV>$NfM-6W78qH1~buza&tKV3ON_HehGH>)fXYEuqna~`#r%&0Bwd~0YbhoD5+w*>} zZx1Jti5JE7!5ocWWY995#anR08zgZgKfE)j^A)RZ;t7)&h!|!lxG^ihuJ`i>uVaWC z>o*;P%Ph!0947mJ(&VNv%uW9PioTC-R(v17Q^MC;S@R`U{TzMB&l_%|OQ+>QZ*#sw zS=an<Fxu==iax0%fK zy;#))u>Kb$whK&fg_MqDb6&@qKjX~HlG)F(e(AERyV$ZRa6p_i=)AKd5i5Ry1RbXP zi*S>n&jPHWS%9`dM z%v5gZB))+}s9CJ6`_X*$MTR-12b#os$nJ`{>rL*cv-d6B% zliAgrG_4!^{G9JU!z(S9X}b}YFX1%PoOx@zS((plWCw>pF*WUZd2)F#ul%piJ%$}R z!1FxJk30t%EVR0zJoA(+91`3}Kg-{Pc@#mGIhc)p*)FI2d#?Z44iC-6?DS++2Jnbo zc#XULzSM3G<;UKI9)d{#8RGA3P+V=cqPaX+aCiDcu=WVMU&U8OlF(aO+B53hgWk$t z*^DF`^(7widKII8*{>m_>2rSUbEnkW_x9r{_mbb;K0kxs9YoW6z(l8##buR)o73|1 z&G*0}Yv^5BkyUBWS4w5V9BbRAk9iUwc$T(yBJ(SqWjhg4Fq3YVoa;$Br)}it+q8&y z?JyKIPEM+x{BNMs&+uEzyi-F_TTXePb8y3PasLv}oGxm{%V zLo%OLW`~)AHFbeA9>-K3WuIr-$ryj}fPLCTo@c|npJr)H4Uy8H)>H+*v{s}L+!pef zXzRYv?>tk`x710`{S4Oh0dd=T9KugHzc#pmS}JT?cvZyvm*olPiXBd<#VIW>aXy&` zo)6{-)wOe%ajj3%z*(Z?K0MT6(arsGA*bb_$I67Su?IQS(e-BmYN?;<@Ao{R6PTXS zv?#agzPZk#F>ZUYJYWwMRE<;*HNnbumUVbeF6p$6y4%HpcR?%n$ynBsB^&IgUiW8x z5kYag@>y0Uu%jxjdU_$UJKND#b03^|n^W4rul$ge53DV2eZ+}$5Hnu1O9R-f!))){ zp5rxnr~AbP734XN>r>0Hh6hyIxfK?F`nack)J}cv#IKU_k5%J*&mKSKQyy@Bg~&)d z=;?}RZ!GR&gRDt&KRXvLy@R*tNY<87@E~G5sIv#Mi>;n<2cxV!(TNz_+2$=VXr_6sZ-$w|%Vx^Z?)WuPE@M2=HEc%k!-7 zQ2I6-54hFNG?D>qgZuwV6=n{#c7x>F)~T>c;~P6$^=`eQ71@nlDhHx)*m0lpGHssj zgj1NAHa>r6GMJsV1?x8lFa4|MX`+uc%=(qKifO8P^O=7?*?o+cMUz|guPx-oKZ3d% zvGC8*lQ+cm3*|d%VB?Bg!!~tZ^I-Vu{Nhg5rYT#pf*t#dkC<*vhwRQIHt}hDGs-F_ z_`L6VjNtZ;;NH9Xc4-}i`WCy@0A8)+9j1s`R$?m}!4=P`K+mgwps4J@PihHv$+guZ z!P8ij?2y!Kh_{f~sSN8?jdVV!nqZ5wxS%?>A0IHBy|2nAkKx_wiDBxnzynyVQvTkS zeeKDPEyC>_fXm#5%HBu31STZ8vpF*;NGv6I&D~6|VIF88e{2oE;nD!480Cvm`6B%ry7e;u#inf)In%loCXe9n^$;j4b3lh+`GgeWqY1a^)s zny4b+F)~z2eeWvLbrCjL;T?9dMN7OxRi5bs`?An;xV4_VJnbYta;__!)W;+sTc|kB z@FrQw;7-voVz767+DPZw)p_+1>E7*KZsFs``2JvCWn-NF)9OY)HeYU1R$bU1;`-a+ zoF8dJHkIZxMWFXO*%#E^-YXXPlhk%5i|>%hGmuy|5r#WDc>HaiV}`w3&*PL~<%7Dm z9gypO2(_-K+wLd+M|0+qu

?RL^%2n{t3JoMlBVXz_5*li^c>>3{>oO|4kMfaAX6 zNmG39HH_U$$)wui%6RsDiSF#ntIlO9M)x~8)Al^=(>`ODe;vk)42J@iILVk>E`phm z!Q}qG`1YV;ZL)YbyQe*wcDGLq>cCF&(i8mrYbr60Ld<*pt1(0vOxOFCWp8AiAN!tw z)qLD8-cB;VBDqW1y1dB*uDgq_lkBo&-z8p1wuS>T@Q^`IMv%eZ&DX5+TJ0H!c-MX^ z*N3aF$%CElgL|q=Cxh8XPkPRmWDS~nf?N6I8rZgj^l>0O7$BsgV(Q=M%){`&UOl?M zCU5j}M`gML+tJ6_yv(oF;JXH-g8LdKc=wx=3leqZiw3D^o|5b$%6=Js%m{7Zj}vff zpxHOTaydj`o9)xDsvIh?=}-IlW6;H&G`yxNiWK}2bo4wyBKO(j?Ve_!pL^T6AHh&% zz?7|dG(l0LwNYc2g0e3==~toLpuX)oEXcWJAwTmx30>n%bFepo9eYB2JBNpy zBmcVy6LPzpS#2Ko_v8rPXaNcCBA%M(d4s8AX=%Uv*?1N+4G>HvMlt!9)cLi{zX$~;ffpJl(z80V0!Zk?|2lN z`^I@x^S|q0i0N5A{BGE=8kupqMHX_-#^Es_a*p*~4lK!|T zd^pK^hjsiKewn3$Y)@9*RcY1ZlT5PSk!)+PZ)A5argcn(7lY2Y=Y>YS|J(l`!M`7*}{Ku zQRUdL8ub1QTl%YKYRTGM4@Hc!s=Zd5NkU@&C+NPf;GMt4(G-*Y*~mf#6Z?XxVs*)C zX=|U!Vl;ss#zTWi)@34(u}<|tV1rMn0R5gc=XB@nNUt_3KsJ%IzmvU14XxElofRqM zc9IR)yjwhReU_uKKkuNSKeDD>oJmlLKA*4n1->~g;`)gUZ*>+`@ix1%>WBYhH5T%N zFWC2&Alf%stb57BF0#1TcNXy6Z~5MhR<_7@uHeIZTK|6jcRmfSOWK}?#it~r>{LVF z@vq73t=ZS5>_ZK9Z?;`%hvlm$3J>y5J!oNVn*SVnd?^ zieQG~ch0g^>MD&qhe4eI168t$<<4#rd3Z>~{t$f`2|?W<3XF?`FR&*oS)E|E<_C0q zI|(b|RGM3RcN&=sr?uW{g1(FOa%Yp|ogQZF(_|)-uo}jk-qW6l@)rUQKW1mvn zPj_ckjyQu4ea394IAq7pv)*mRaXDypevHf|mh@{H`!oLUc3$pxtJzMDwumBM_XL~i z@+7~u@q!h+-%TR!PU7getmrWD^>USSlli0(B<*gmfNwj&cJ!l9MR?%A@?^Jf!KA#P zk~PRj>f1 zuwfU(N*g@yMo<2(6IkOM`mo=}CSDdv#jernp2XRW@c+PEFo-wTpo25Sc=cn^Inn}vek z@w1ohbBX$Yni2h)y6_~iSX)kCDcI7GBj9q~^2w5@VV>DKj(lba)le?$f+m^}Qj zwRQ6J{q4{b{+*kx{oQ9j%gdIvuCwq?FkdOJcdM2atxoe?=TurwvtO-gT7Oo31RGO| z-zY|Mck$M<#juZ&mx>tv=Fn0>-3dpq2ElytJ?dGf!UeCZi`&F&{Rw@vaS}o2!vVZ$ zkmq|ALU>L5wbAqUajvyU=fB={fQaos(m0Mi?u-xVuJ-R0EX2>W=SI)`B3b#DROfQq zK}B#dqxNRc8PsamU*85ctjKawR3D?U#oUoc)a?~fsaqXR>WmZkBCGD91_?P1 z^^}C*M$v>1p||;2_VaD~HpH_&0(YLrsJ~14?|~sga$o@`@f>#Kc@-t={F;Svi|{JJ zEkom+-c2mgL#*6N8Qm+g!;6H z_?(q=ER7s>w63Y1>~*VJPjBZt+X;MHUuT-IW5I-}VOWHRoM(zO{An^%ekWQKh8RU> zx3glwl(T33>}K976C$W6`&|rEk`LSXiFa;pzs{1>wtnigHH}u`S5cMBEo$p;QSlhu z>$6aeNdmg=WbNO<3svmQGZ?$gcI_yQz9f!5EUH~?ZGD_1O?*uxxsC%&3t-E z8c{&}l%1{@B6-!Js?H=}S=QOP!(3c@f(6}SpI@VY?R`&vSneBs@O8GiEruePE_R+a z|0&!4GsG5j?LJC7m#|qy{lrW^ogJomRNuwh*oy7yJA-?ArfL zI)9EFOz^ce@X;Zh#qG3iqTT)3dTOhz9EVH%SQhMnc|*rSzo;$=`eEJ`FOTCjhr$(Y zq2Zu+@eKB4n!T-Qx2{5qi^*Ac)~uGuw5qeI3$eFm<$7Tghw}t8c&N2bB$&(mx7R7B zeb%36{dt;4J%^*nMGJ1_4<6=Y#_*599T5QzzC=Q!*nmQ+D{_Z2WH7IT^)JJGm;G;W zAJRWi=O0dGJs*3zihsJ!DF>eu)LXQLP1~{5&0w5r zwBj27zS~*Ovg&}9Ywtum(eD19?+xB`t2|0xo}dYTFwow;PlFDq9J!R1o6oMue?NpN zc}ktrSZ6pvFT+F_qn~}NMBjtjkUgY(6jasGb5?P7d0?~bFi=#K7=dKsr1pxl{Fl97 zYaOF_(hj1k{H*X<_T?uQ{%dk|92=WY4A|HX&*rm&8OO~?@qAIlQB|)c@t&PY(TJ=H zu$km)wz{KW3rzQEj12cCLV-Va6)rnr-BI3FPQGIE@K7}oUnbaGd?E#+j5BeR< zB@bpb{SH$E*lQVIIfX>^;wkDu8)dDgywk5C^5{V3CPURfkkL}&@`0p&4cl@e?NK*2 z9VJgS%<#$2@_Yz=t)uhfNa2S(#}(Exm=oSq{(m2Puo zT?LvD<88;%j$U-)V`miDyideGJ$QrPlR>xLxn!->E_kI7ZGCv&-cy)3QlBRAE7hgl3I2L0J z7>S3t?32fZmXXmxY}o412{F_zdp65%JxV+r>9mVKT1s&r_52GRE@>@ zGxa^MHC<g>dmzT@ks=uNX!X7cv5c(S_h+M1l1 z`UW?(4Dxv;ZH_LRC3b0DXmRSdXKm$B zxSa%kk^D>r#9H#7pKdl&)iRG4eJ+*oyj-Yx7?|)+w7-fz1CsP z9ucA32HiYBD_{118GL66dU-QxFG%-GgvMg#USKzO%66^dCxgi!<#mNL43A{D^6-sa zMU&Im?Q$~rKS3(N?SiA})_X9)a5<){;&#gj>NO4{n4bJk4S5f-+lH); z*cX#k#QmN8>}fJRnLU37xBiCDyrzHQlE`&NC?g!x7kV!i;xbIqPAs?w3K_=s-eCW- z+1GzDv3XPL`TP3N$7VWRi*_Gl1$OYso9xn~=8X5Y-+$Sekyya97^(N=P49)Ho;U3& zpDf+i$y?#u*WlUd(Eg+R>q9)@_3}jz@-E#&f0zKTlbF0;Y*TxmW)0Q#WipOH^A35 z*s{9hqdHj}M^nG1w@*QZ+o7<}M2-!3k~X3Ju+UW=`d#+f;ig(tm=1|)~}sSPrXLfFwcYe zkHVs~Uz0uQU|1&PTeGWPHlwI+WPapYq-nHwG#nl6{_!0qBlZdJR~37|Nsf1_@&2E@ z=efiynDx14nC*45a(%JJucq=YqSGCm!%2L}t#)CJuDn;Wa_&K0@KCt!04&moLFY*&=pLvaJ?u94Oj8KUglEByrj*e`GHy;% z??fKikV1M)+F8w+L?6;pgQVU8%^nmf^^kWf;O9d2q;UA0-KhcTy-f-~Wm~SQOa6u} z{)MdH0nbk2YahlT^u&u*mA$L(j_E6rNc4v2UC|EFd(3L8?pEKX;VYi(EmgraQ`^Kb zq2#M>SiUoHi)l@jbZ4y5CG)u`_ZbNA8R)1m)H2;W-Xg19F#M~jGSjhH$LVCc{d|&) zzK_%2&MQ4(P1V@uYpHQ$>tQ&$zTT?>k$RC=-8g+#_toc-{(3i8o6fj`gnfg(dRfJL zKly~;5+mg~Dq2Z9J&J1**Aj!}N1lUL0uQ$v?>ocNA>4r0AuQ8o6A{=v7usbKc z$CF~}m1e)ZV_sByH$2yM6Zr`JiFMhl!n83r_F$EI@kZ?5lTKllJxO3(o?vem;8Hr7 zs5aY-rviyT3~7BLu_qDS#&wr-xj{Vlpp~}|->4Ta9%+)*-Eu1Wq4U`0rse;I?+bq_ z-;oKa&5%(#tdFgMj-!v_i{h)}xe_nvTFNEkaw)k?{Y*WU?qikB9qD@YUrye56aB~c>;8INZ^%@6t0%+-M#)x@a?f zMsG$3MEC1Xd?dV6G`LzWvRiVZ{+?+^05lB4zd2R7h_vu72==8`zG?zyCtd( zyRvJz( zv4XMeu{^QsW4Ffoxeju3d}gAjXyaA>thX%nPocWjki_dQ6jAh0P5DIHsMOo~pL-^9 zBt9^)@#c7CeOtlw$jkAM60?(C$@B(mm|!1j+JP(4D(OAbC#64|o{`=*x>R3toA7g? zE@=;_Bc5%hT;2GKv41mnWggGW87mj77kfTdES{10*G@Dg6MgZx{qgWU&2fA}rN_^5 zM*~=@JKZI*0LpkEan!8D^!Vji(fG^p9ZoVHUzb>&91s77)rZ`w|7}2YPxOKGZ_;yT z{FlBk{Sw=`HIm;do(gq#i$cw0GtY5dd}6Fn>|ExV%&0%x#=eP-jSo+BOeT}Bd!ET@ zs)BSzPc{kdcJp4ZIGb9bH{t6WQV%EJ(owi4KG5{W9Hwcm)Qy)%uhdxDaVJl@JoH2O zMC9FQMtaxuAJS`NG|woPu|2(6`o`#`NWn;%uz3h+$Q2 zipP4#9*(z8l!xwSnf3Rf>d_Krde)CTtOGZ9gl%;ii!~(Vfxy>3h>VXS|j1ZpPyozot(~Pedz3TSq#D>xW9D z_WOP#U6`Y&HO3zd}i6$bFsa#?j~~P!L@9pXLp1ygeHZ5568m!B0VFsOvuX< zX{lx+J=8+o>;bIN=epO5#Sg`D>GX^w;<{Z|=&S4qC;pvQBRn*6e{^AVe{?{4os8KT zGcuZFtWLi#eO7c@WUDT?5~17DelrVmpH9TDV$EV_GLK~zh!r3et784*GZG_I6aB14 zxpt_qF3H#ue4UW-ONpyHDl{yRpW=_?X=vJNUns3`XgKEe z&eT91!2jr)EgSzewlj7y*3C0KW>V-3n4m7+Vp3>ycnp;HMKnixgY*$}q(yot{k>>3 zS|O4@jLl2yp%Y+<-rHvJpJVsM{>=P7bAM);*ekK~vDf0o6Q3uBCre;Y7O|ew@M}?3 zS8bg~t8lv6p3Oo*2k&0k_ps`dmlD^R8E{62hJAG?y@?LgGbe(?DIk>hy zn2py&ZNZ%xEByThnS_EWmOEo`0_;2Yqux?%ON}sxu z;;QwOHdpy3UVRy)Rs;s0fbq!`hoadO-Jz6sB@ zOe9rKz3NHdwOIyasQSZ}c<;Wd1=lB!$UWr3?Z3jG*27MJr@pK{EbzQ(`5*Yym#~uI z&_6Kj$FfIxo#^{^6n8AbZDeD$H)AZn zR!{q%xdaoShz1bqt!Ay(@vmcv7NW}f*6I!>9n3qRn=$4XAJ-?k9qRljJi-+4^;q=v zP{DLNI9}9n+}z|h%>&&5M?4~;DG9+B6ET&7=#rsUrc>_@pEt7YB3*sl{ECTK!nH8o ztEsQ#Nj9ll`VY1mqYJ#dj_|ild3{(-(-3I+>y+96QBZdh{W3X7Kv|a}+eyXsk#|%- zz8d-pv-p^K1tp-&3W>Geqjmg6sGyu_5O>Koy~GclOq&^MpbD@lYk5%jZ_el;*1ICC zS~WaXgqOh|FUEC@7B$Q_1G#`nz<0;Hd6$xAhPO3=ahllS*R(g(75>BreFSx1j{NJ- zF_EhJsOyJ^g_f%#vdgLCzk8NE*Ou-Gvc+NoB}%BD|(vtBHSHmwajZ6 zWU_SI$YAgExHZ&@{Hs^9Sa`H5>Z)mPinB79fQHHD`NvN@f_=(pfz0uJ~#y74kC`b|#YM(oKeu-5mi zRvvX2A-v%ldE~c5Hr28+6{m36ABrMds6Kf{My-s@S$F*5A(3%Od5<~j=}zmIdf79K z(;s@jyXdbEy@Rig;iKAYz<3gybr@=tMn{4Q};T}E^ZC~ zXlm_5(-y|?T~o;9QY>Xj6;QQI;eXrQh!0G%O29>*s8L#hoBzof^bVa?HE_y2k_f#h zZwgp6JYFAj8ox78PA)s{cmN$+AjcU>t~1-^MRRxaK;hHKb`@vP7bD*e(=Zc8EhRS1 z6X_f2Y(C1rI*C_{CN9V@6i<5^TlSFN`X|WM*?42KQOB@%|L}tG{kY!| zRy36DuPVMS5>INkM!J+BX=1Z&h8gYvxdo@O5G3cJ&Q zZ7ohtif2u6yoKGrk3HRox6i~X*HT0EqxkJ4R1?&VXD0ir$!Q01zGgaiS)T7@$bBTe zDrWx0LfB}YdcBNP$z=D$4{S{KcnCJhlgKTq{ywdOSq&}i*>QQ5X?mVds(5+SPaKvJ zDV2QP1c2Af6~Dlmw2=88Ckn32-gi@{uvnJrD><4jIGscC89(p^*?5R0EMH9isD$3T z9vFt7R2;|jrw^kqljZwTJWU6-B7;Agg+D4~+Ujm+@fHcWL|)75maLohN9fb=ccuhP zr`g}(R9}}{yCC}4?ZlVtF}tS{3HU;mv_xnE z?{m&%;l5t|_~HJta>4w>b9#^l)8*lqhbAgPgZmc$!ng!awv@*XD$s9~85xdEm~Ot# zgha{2|0C)w;G;O+K7M<_-HN*tg1fsFcY-^?-HQ~5;#S<}gW}5qeMp&DRC37>`&$F6S_r zf|uk`_L=NM4B}_wv7Tkfyy+<~Up#@dsTh5mPPPUQ*y#Nv#7#E)`uPeGb?68Vzr$z_ z1)XdnSL=5Z5(DP>ww|KiF#(DcM2*xmAgXr~v9I@3)Z}0dqbi`P@bG)#{leQ*AN$o8 z?(QW@yBp7ADsovHE1ozYbHH=-UMSIpfjp})mcIfkwl8)sl6~k;J%uWFcaq7^i2hCw zQpnA#KYn#f^2S>0)Is9r5k2_^cYdXAHVh6Pj&#>22AIb^M)hkjv4GUXN(+&-_?vt~ zV&d6_k+l@eWLAwt2P$1yXWqY!Om#1)F&N43Pvkla$SgIZ+5kRUk9MlzUc*mL!74yC zed&;y&SW!E64!1|UDAAdGzD}K#F`V!STEr<+Vm3GY6IA3H`Ne-z>!VKh&>>7_=A=B z-ugs0jD>w#iG^wpR=WmOa?+dlU^f>FmlH43Wd_$` zYBcm@(E)Jy1UP>J8OJ@4b*ZGRJ{>=F1 zBA)msRkV+Z5MLoOyBYlYj4F#!T)Vt87XDV{dlc>^yu1x7{fO3YWEH}ftOb*UDw2$x z-=A4JONk|Wz{Bye8GXQo+p!$u(RVMI(~!dHfgOEJ#&8}z&qVz~DR+V|o9}k`@$hS` z`?EXz5HXW2tfRNb7o8`F3}79qPw1wqXc#?FdOneyUuek}GG4RExlJMmF&eqlQ`e`_ z=Wg`B54}Ihc?Z!F#i`=xPEmc^IrORZ!n7sWCfaR1`nmh0$rdVU+8~Xs&f~T9q@x3!m%6Oz%+I6 z4gN;+onmZrA<-GpO*5(2JHg6`=b4Ss39HlxjTws1(46)JGj8qt(fqr}7KEbtj}TL@ zhR*LvZhZjqv5K|_Q**QeYq}>qU3iZ0621lQKu-#u7nGINe#WwT`fAYKU8r2Z`wG+( zh85dSMmrsTa&odDLENVs7C4CLXC2n|PRLUg%CQ#U1@ijLbHTD`p2Z{T{p(`ItDrZB zqXW-#?i94bzxV_>s8%=&PW}xIyo^z*&w6HM$hZWI)FXto190ct-~c;f`Keo}eXrkO?5X+D_Z9#Wf^T-|tltK_`jBv$y< zQ;-;?7yVZpyu|ZEsVYbcek}nGZVs1h2jdlCEs?}LF=!A`tP|es#BB!iJe0=x=bgcO zVW69I{wrjqq7X-l45CPe=Qaa=8%SPuAi6gYdA$X8=uVCHFtAj6GaIolbvRq87yHw# zKt{DVdAom|aHlms;u{djR?GscFCO2IbTTuW^ofl*`7!F>8 z2AM}jsV{RhN3cd{Yj}DrHB2d~j7#X*>MSOw*n(P!r^vKsfTcxB4}yLMkUduA!!^9v zX3QICOzyWlxY>gZ?ZOydL%TIX(zCOoSyAsP>M8aSBmRyrl*HSG=M!W=-rK|ZC5Xk% z1xL4`j`FGK3@TFPDS+20QkK=vhtWJr|#&fnY4c*_Tr1DBAKx7o;c1eGJXxv0B7Ld@$@1X zjoY0}>90f@*5PaXN0lwlN%wqk&U@Ek$FmZT7{eT_bMV=AkkKV(6>nx_dx00ay1TFy z55vR4yI}e9K;1xA(r-^q`UkfwS>l4|@Ab4c4BQzB|K>C`5?WoIDhO&wRzN{Le>f#x z$e+-!HnlDnOeSj(_M`@x(KqDw3oAylf~DgNyD`e?n)bw@|$aO#r zgFyt_;EH3^MkdAj&Ol>5#7ZS1UzUuXq+%`EQIr zvja;zlA7e)`0KIoBaWc?2EikD$ihA(i}BIzMHTrH=&{yRk(ZJ(Bn2#nyPYJ&-c)5&tQ;1EjY3m_Qs_e^tF4I{NfH) zES*5*Yi_D_gQ4~i&aXj@-V3rHuc-05j8~i%WEa^PMJ_uNHJDGy-hUuI)quY5^UY_y zxlZI2>*8JJpz7ov)vCkDE!Hy@@gUVvbK#lUpoKMzZ%VRRzoEa^QOQ&XoOcIo_Q|cp z_>KnKtcQy)qLX6NZmkR-1seOPpnZ-u9f%awMnkToO6nZAO*2xe!x0&YMxDZ%{NO1z z39u2Ph%#x$O;%QNlYVb!{LKVJ9*XgFucpv(8xgiIzTD7tAKutKkZ4vio892izF@{d zMC-iNI`ya3OUX>eLaQ%lO|Fti>Tsm?6!DJO0iT%B*~gm%$*qa4`IEcdLB`|x&%)ya z&>r8(&F$t{EU~bJA;k7x)5l}PZt6k>Mbq+OU#gS6NJ>TO5bl09R;37I_|;LO5$1(a0b86L!f?`NZl^5XHOa`I8Lc^waR zoss&LWNQ0xhfLtSXjtKJIOPaZxCQMqggTJZ@X|mcOx>{tZSl{igYr&LLtB-5MxyGD zrwUSwTaK$%LWb5bTVW)lH3aSrgWLY5LShpZzc0O5LGE=Ncm11f6})&9@39mu(o=c6 zA%QKaRN00%)P%7~$DG&ib`HrwDQJq71i z?vaAXRax*`5)jG_zPZZ%>Z1uh`8R=*ViJRS$O;;g;2K0zo^YMJptsYEqz@z>MlD=M zMmGmEY+@?R+k*=GVPzGUxWwK$?pXs2QWg0uL>0<+eyR2A)*`o&na>%BhP}hJMuMc@ z@Lv>AR$MBp{zH2AQV-Xb^D=?JCSr#NAZab(pB;Rcls0^zjxG|E9D&cVkal0=uJKuK z=O(zRJG{_>yKW~IRi6<}g>L@A-G9Mz)IIdmvyGnsgwT@ z(UY`fOCKWbdwHF79Y2rxV$`cqPq-Ls>4MV}Arq~jQg-gp4~hI0KI}w$x*(sL4?BZz zL!rZQQ>Qo@Pre6{@r8Kif77B)@JD=pt*3K;fwG&C%wyQ!OQ6{6v^0PbFN5}rjXjRb zt3FRMUr8UbL-CD7hS!j9KFbIvpe}7I^y!0!>q+cAI@jHS9PeZldH#u0ht{m8eWMsn zhgP1Zr`OPq|1f^*(FAv}I5CMqM8{k7pgl9w{;$;QX@$VHaQ+E!d{26oiOQn5Aiv`D zFpSY&#g=*yuS>u_GGf6w%8u)RZKmPi;6_1TOj;ELjdK7#(dq z89jZPD9AaucfO|xa&Z9;{*0y?3`N?oT8?HqOruv*p@Zgz$3v^Ur=G3>v%wpBI)azC zgZ(f0N0B#9OH85<*_l9o-4jjtnqKaLI#Y-&ni7lX#Mc zyAFErWL{5JVmf*b@hHz2Wa}0Dm>Nl|KzrkO5@8QVQD5XCCw2@Q^cEy@pVjYHQIAyz zKPdrRyOq^K_Cfg=wD&(KRuzQunY`zEstN}{>msbAm4dw7U`DY35)}mw>`%m{M*P47jP(TnYEK@H=JvdHdk`18 zrS)p4^!e4_3v@V-(Ra|VFa5j7TwOso4yML12cGUhuB~To+~&$D7_FPwzUP%wyR2&JfM4kHzY8&q$b>s1K(mSQm#BIREvpwCR z>MAhbUeH1x>T&xa>$Bm++vKD7;@PeSU*Do7Pw^qn(bu)uzW(T&EO==Dxh>G7y|AAl zVDm0S5C4L*4l>e%kj~?v%eu^P-i98_<*CK<0iN*9PSCWTH2$2vhOp9CAtDjc{q3ET z+%b{U!{5)D>mLigdFcN^CHr5@g4yTismIjN?BaKAJTKkc)M@mA`p1Z@UgQ4#J(I}O zR-mS~HvZ#2s)<{Hfn$<6n&$Dlcsc0KBvku;r#FG{(<`V~mm1N@o)UOM0dU)1#)OJj zdY=SZEJyZ)^M|923;TyLwxf{nfBih&!XM0O{v8npjN5MNz9@G$=)WM`-UEuQ)lD6^gOnh+D6E_(VW9* zeSTI|>x5i)gM(R%11(;QS*`Q2TFZ%!_3>W2I7TRFBp3O>(P+1v&U^ntBDuxj zlgMbGEqGS-{DYB(9;`4G#j_H7kbvsM5Ptg{&btU*2g5;Q(HIZtb47m(Cmu98f|pd% zY483{9IzF-;}}}$0Hal!tVbWb(%Q7{yuX{HIbn634(O_+jC(4ljo)!LQ}yu|KKT!> zlNNn85i6103H6V6LWtU3#%>)&drW}RrRh&|xF#OYa4$fwlkjZssnmk+cXyywh$yq> z8qeqhlZ?d{{YERgFiY#4=b@X^iAgrq>o8Z2_3w6)sVeE8MKr!D9_V$(Z>0Yn7-Flx z5aYei{}4pHl%v0cydU~`)_~K^-`Tl>o{a14_7`!Q_;-UpL;PCxN-LWU2iwHJZVg0N z9fx)=$eDNZXL0Uh8)w74pPWPPIy{SV{tnJ{e@-ZN+sTJSSMh@29ci|LP77+vFA%S7 zu~IXJo5_B@ zas2LlYC1yvk)5W@l9>xH4WX(b8dzb({Y-PtHt?C1-s*B&oUc!p#duMstp6hPv~~zX!VgU`6Ioed9Ch>VSrLYElio7>kt4zZJ@t2W=$8 z6Dh*TKL*Q=_g8eb5d$xT9-T}(wqUJ)g&SWYC%wSOE3m#>;lb1B!*8DI%m=uItfWTk zrF43MYp;Vwi=&b2a_vOOS`*?uWzoWSkp$2KPhA**WMzV06OpM?uAb$6l6d&;brxJ$u4chLCl zK%EspXj#D#ezf`vY||q2b10VQBU0a(SV&j@P;|uuH!gXa=uSz`S-ir-Zd*lk$)y)% z=GIy8%t`Fd-ypT_P$)fm?+te66RWSxgKskVvr`c_5^H%D`JTdPrz9Gx*?t+oKp;>s z#z%LM{~D_lR)r_pG5fk1GPRm^7Q!x;W^6S3YXg|~8hQ-e@0;U~ zj)di8{=#T<Ldid!!mZCG(FD+7A z2d^^~Hf|s7O9?`{iT_a$`##ZM&pF`PNBzioe;Z=5S%_B$VbL~%GDaXpS{ZFMXC-j{ z@=w7(zk)_g#0X}9%MOBQvUzG?eb-{|W+RJD;J8{yqnpWQExwK&q z{RqP2d4ROP!5U`8qHf|kgSf|M{Hy`YAlm^-n8mYVSD`uL;8P|+&bBeu`S5SG{`6T! z%i;eOAjL97fxeLmTSkli#Gf0%*#CvjS%ZH%509xAcW8t+Z~%)Q0L`AFH3FeYZ;;0e zW~R;KuEU{))@zQ9^(c%E&IYD9irwsl2c3!$PKsaJ6@DCs#EwAM{X;VsYd0Oe z(*Ug38NJq?k-3Bp_>2eZ#b@aQKP2XtrC6b|9B6wI^oWAD5lX*%Qpe#!r6!DB9QM25 zy`86R1&G_VWl!E#Bl`1}@hn2y!oe7kXloJBxJ#TiE&pW(Tm3>j!o}B%4d=c^)?*-1 zdT#7RJfCXN{t)OnF8*XSIDRKqpfKE`=*3X<;9b1j-;vJ>*nJ=V+-%ya^_q*Y$@|jG zSwFJ*8NHMp&eT&R6ngoARqFAi6YMr3-xNg=beF zhgr}qEg1Q>Sl38U^bdUFn9w>4XQbrwU-&!<{fddCJ^($1Lji|=#pCq}doY%sC1NXx zwVe#L;_<6~aD5|sqm^y7%493<`Ib>l#V97?x(+(05Y|=a*1?umB0D*PKDWbe)gvx6 z0ROZId%eiZC1ISk#zq?6A0S81;Ja_oHx4#r1tXk`@4rHg*Z8F6`CV50zG}!}HhkMA zv?7Fdq~M#W+$Sej&4_RQE5FIanQ5TvH>h6@KF>%Gb8BT<7srAIn`;Jc)v9o1-a zbk0b~t0d8qRQ%4xx~Pxe;MWw;wITZ%u`8L8RXy7_4RmaTHMmZuf@xPEfJPs5d? zVZ~f@@nK|*!W-zm5pU)rk?fpM`VFI=A5D=5`4~d0t1}kOiAnUpk8TA81G(2|?$Dg; zKBVXIx$+I7M#2i$k=5DA-)6XC2aJdwyMShh-7%hqO|oYpo~X0avlnmNQ3qcZBrq4*RsDpx`MPdsI*7Ws|H zWNYT9Oy_9?bE)O1MLkJO=Lg>THt=ID+NbQtS>gyixl(sDVtulHv55l@|2wly z=e*|dW(T;T9OIu88S^oMhtQCVplcrL*VMOX?ta$HSk20$Q>aK7M%?!xbj^#0rTFE3 z;x56^MXP39WaeTva?9C?PbQ$U&C7^gXT{N zcs?3L>&iETuLF^LmzL~-LpEU9wWh&IdV3dpoD>f*1^PcSS|k;FnUKvV*bS}ly9r(2 z7;dY^C@f=y2Eh%3=!<5@zeoR+;o7wszmZ5&Fp||0ouf5$^Kq>o$jlM$aE-X{az^hN z74)AO0Yz-M=wg zLWr`wa*q=sKT7s!5ENVp2c981d5EgE*VJpoht734a}U%!hQ|F!9g0?6YYt7;Q+;^_ z-i!`qGZLwN587ZI z?~54Q#o+Tb@RQb8EkU-Ru*nidp^bOk7w%)zqPV6-y+J^m(cJG$+&C8FQXGyggndbb zrb@wmp3~;d@ZveRU2E)XoKAD^bMX8lw42ud)H6F1qkW=dqte2y!td|Utx3`1$vLK{ zT56@0s#t@%a6>-EH4D1(E2FUi4bm6Pn+Z?g81;Swm^oO5OlEpAQh{WmtGLxU(v`f+ zY^b`QwGUG;qrU;DU`5-X zBXjZkl5?F!_0u`%`57Hl0PWX`*yset;~Z$~16n>OvNse7{R2#O201xR%id8%lFWHW ztG=_nCNe$=8#|Tu=R$jb!P~mZ*e!x8qqtTtknn8cz^l*)imNArp6Q@wZmd*JJncaK zf6jMWx4ji39fM~>{!P0ElU;5~ML`AX8k>+yokXsA8}xle4ktR%$h^$C9?z9GqQC4a zG+ME%1=7+3-7yzVI}ROB5V`+MO!+A*J-;U3c^m4^M$Tt~T)U%F@?lBxGWH2+_f2%+ z9c;us+Ia>Xw*X7E7%3f$1}=_W&~rF0(uRe!r9V_`$+$M4h1F`-oB!xWbU!echEaRj`+1uTv6oKWL2x<;RRt^!iXgQN2@Nn z=cxeN!|N28_2cy6ANKB{AwN)sP!SvW2U_eOdL9|hDo2aQqw5x;@wO84xr_FA$M%WV zhO?f|GonZbk@s6z!VN^k4zVqUo@3FS%g~h#`F$s{$@#!Uk&&n$m5 zVsA^MxAg>$jO0EZGpqCh^+l>Q+)5VoG%dcs>o(bW557_+?B*Es#C5P#0j@k9YCfb6 zEDJN>I$?!JQ7bhK$E1H>5(a2Ab#{GINFYPeV)n3VNu7#{LX<#z$@((B5lo zTXL|Ni=0cI6n8GlS!LnO+>C*+(icYHI$C=STwDpSCI&gsn{3z7L-&Z(-y)Cm8rjJW z)wOcm9k5?T`mTKKP3RSu+LGc__;$cDH>DyZgcUe`W1Zp!)ExDu+Ptq>>W$`U4S!P=2FhvyotweC#jy&?yzeHrFcRyYoJ`Vj zq=)%Prgp0Y^PWPGqyZe;Kt)6*A|YdFWg_hGWUSkBPY&)}6D|EG^BXrp#fe~d!!+5X3o{nWST4Ad?W2tImx5^ra}>M(frDwca0Sg1JT@4;hT#j4>mu{aZ`&Y8wK-21RU|GG)gj$^($v@tu z2J4VnV`@2CR%>UqV{3%ntPXmvMthTBD;}fy{zj_|BRg1(bxeOCJIk?#U6A+wXwA;7 z%_VGh4q7IsmE&mT2Yi@bP~$krFBTZE0y)>-wD3<_I+l97(cr@|)LyHGeY$CRALjMe zA`hF#V2}W+kFFw7D~K=8MAr_0svT%w1JG;@=vN4dED7oo=1q@9`i{msjU5|JCae@$ z`M1dOOxjk8bx6~)##S;`6DWjMYD2qM!K0DDe?y@A7rfBA=*9(5L2E08dE#;ZCHfv zvSNSc!JjGUduL?eC^|C^V_AvpdT-=rC@V9}BiDY48nFMU1ph&O=?4fhCU77V5G`=HOIN;W%{S5whd3GvD0uSZAHRpGFXYRp%x-kTa(FGsCr4P>S= zG8N1w8UKwjp8%)!<(que11538`Na-{IeRlAB^ceJ*u-DZIH^D%DWP0UEa?yI$5Xb4 zV55atAw6p?s{bmv!Esoe!aVu<8TIAMs7s$rYo|cZ!>lL#nzrVJPZuLePl&Dc1#vzA z|CR+^Y$AjHiMoJt=%RMW&!6a_xzx|irG8;AH3Ey+TLzytrIH~vD;CA19%K{pHw8rA z3=cr-AZB7qj-b%P6ABFDLDU1qd*2DDI2Hf4@p5!E<=MOQAnFL4(=1u8Nb z!0ps$4PjKXQ8V?5dGuSTyc)xZ_u@64YX8Hmi2T-<3wosjG>@n7>1MR-q>rG7>G}%ChLp%CuJ~ zRcQ4cX!tldZa3JsFNnMmh%7d_+3VQtMa)BJOg&>(W(dBZ>gp8RY2O*PC%y#CP$&UL z8U)opQO{Nr)O89kq$Dwm$@o0)$hu`j%eRG+1Hj}VtO_*@{oaFDAEW7;Q2kRBInRtH zV7@w1w;%4DgpKKfJhw)kOXHVR;=M3D8W)=r%XrfV(S94i-_5W*IZS=f3DzE&Mcqw( zBsv!Jgue0Y(nma_;Ul$2$yr&u47O+vmi{q1z7cv>YdK}7oio9`_wZVBF}mH68Cjt< ztUh*tnLvLb-3O@uTaP^&&Z|FEE`W~DjDHhGB?z%qEW{jeY7a17XQ&#;sHcKMFC*hx zr)n71IV(|S4>|m;R053yuhl`)lQRSLJ=}Q|{@m+3gq&Zby{<0_-?f4_E`l_xqa&_j z)k|{qzp#K&;Jd99DTuyM~o@X8mD0YP+y!}Oet=>FI6+g32|SY){(Bb<;*|M$LYREu4JD__8u z0Z36<^!_w_itnuC(T!_dqoq~3*D56aGu5nx7}*x^}EqFJ!OFOI|c=3S-r^4$n3Ecz}ABwV?gUX!~AR^O|VVEJ(f| ztNaAyyvz95Jwe4KLBuK1pKodNHgx?gw0#HsvIdNF2QbnU+ISGm8Rll=?D62uJ81Y) zL>HL)GzE^!Zq%X&|R59P5k5YC$h*(VwEUH!akS<$Oa1 zpVHS0V7j@;RcqQ=7<8$5r#nH$qo8V2s2T(+dJoUt00W=pIU>v9!I5ke(NXiLX&r%= z@dwAxqhZ6Clah<^7>p%j{ues0DKWx1c=xC9HLkIKh|g0PDanoGSH&Z*!Fo4Usah+^ zemVAQ^H~Xgtqp~HgHoFCDuYb@2kMs$Jw?y`K_y~I+Lf5}z(>y+ z?UC4^B={6BsYBND4)0=Lv=ZZ4WMmTvV+c5|4Q=acJjy*___+8=J@K7R(z1leWDxS1 zpSu;nf5{B@mqKP+p$YY@9!36GL4x+>W^_xy4MFT>h9kp0Z_%6bk9VRa*1|Chk@*pz zqrUXAEs|daAEYGqGnI+2CLp2^4J7xGjNMh@DSF=DbhN&nvsWE_Q4O44jd)8_{G||T zo_Y`?8Umk;f-`3lH&~CxIEybB6-`ne{n-buT8^#W1ICq~ei?-EFW&BJkV!bGRO?+P z!J_|yP4}4A-lx4+z{KbAk>$Z1LiP{xz6Yt?iXS%-Ez$)HS{jPzS&olD##)DUF6vi8j_|UT7(DYl@*(#k=c4TPJhw9yIU^ytY($SCz1Ns$Lt9tdgHK8YYC6 zYyHJw?$eRD&}cF->uAMA+IAa#^e>+m@!<5djw7`1F!Fww|1R-51>Qag8r=dK)k@X9 zxPBS#BODdk#M|#68B|Qs4(Y9aAid^Lv?ktUGicfi#4?$_tVYt0kWKv;eW8eLWN>0) z#z?F7rp7jFFD38k;Mv@aV0A2iA6hyUOTL%!e#Bghxaj-}*o0nafGNyZnFvk|fsd=e zDe>{@&fqO+)>K8VqL|@9#&3?P2GZJ`y?FIS_m4&1Cg4#F0(k-0dH5(F^j3aj;g|K%K%%MUnS% z$bUhsY#Mm>9d!H~ivPwalw_2DVU%BjHgBOfPayrQq=(Mm$z7JxT1k6v=vJ4p&V}~( z_#Yuv+tE?;!A7f)uA^wr7t{*J#C~bsUSTtzr!N}#0<~JD@e{Toy)i-arHKd@L2?p7 zo2%&74aT1sf(OwSeyBrF%0Mf{LF+;79&pAO+PM&l&tQ`^9f6K&2HML<&mHpJ%B=OJ zWr?v#M`+V1v`+_KL$Ho(iFiCjUj|^Yd_>c8N>WajF%p=oC%A%vDS;eL4ywv<0xkt02^VM51K&`hfFtz_cUsrYq5q}xYK@*b4j ziEPhAGxfr*=;>=oKy{ik{e$?%JF1fJqR%(e((24q`{KKSg};jJ%!a<-N^NKvB!3;8 z{E95eD|qyq;nAe%#0K!;a7M2enm<4OjaETlOPp;jzTSN@Vu4_d_8|9Bw0{hqn&R&B zjE*>k)SrZVSMXguc=8>%a~>R3%fwnsq4k5Y@*%|I$}-X~7~2r$AI5NB``)qYOD;6% zY9dE@IBOW_Xgl|vh9&q7{+$OsL(!y(p@a})LD2X|koN|7NUI_Kh0fA5d+N}#DMT|T z(WX9p{(%f{K(?o4uH!GAZfV~I;)$Qbdsi}^b z3_fdu-M)_3*a`delKKhFAhz7fQlA-{^$dA0ftLLXeenqi zPeknMD!##XG?fqkgM2%_Tzq`?FUZgms92aQYc=lTc)bnbO|4sAnwCW+*M6E_UgCWj zBQ>1+G(}4f<7$!NqS>H@Fy!(sdVeCne+TVaBJabYaZk>x4p$^5RI_`pp>5yr-c`DU>nla`KEz9n=?owSKbMwN1AVN7dhw9Jj2u&id@Jft z($J>5TwyKam<7&L9xww|;JNWpZ^4fZx%+SQa3>n1A)ah{s*rBrUB6Qz#B_>iSyD!opWHrJ8-;oNEsp~H<6ZWQ1d^clTpdE z{>|Czuv0r3m2I>{tM4ub>-XZy3(zoiv65qXE=79gB)+D`zY?qM6{Ih-iNRmu4lU8T z-x%EsP+rgHUdxCU#&(=XL*#&m$D>(0qOXo44V!4y0kq+KPiioCJGROo*dvUfp7?N; zP3ubUUGeYOm!R8C=nxYr=z#apob~hKdS5u23s;-?Qadzjc5?J@ zK!9;fe0dx?Xb7CzlN|mcdiXnt;R`LRg+JH}tTzdIPNUr&*cyUMAAw{_VreUa{9ePi z&5)!;=$&-b)9xaMI1LPXg*Mg0gFeY!5-_g6g5IWp7gCao+T_GxZNmWXdpzJEXDyyW zAhP;`d~+Ej{s@t=HH?um?qlKkA)tk7P=6Wq5&5WAeg`)xGa5!ULtFSL8)&~De(7!E z&fURQp>S6#?)U>6s^?8tVGh_vB<2M&lL;x0gzHpcoZqdZO-rzb&*At+ zpp2K$FE-p+lmE05NFYy3y2!Y%0i)E#p0+3BsmT6CqK}#}Fpm*QhQ3yzm2TG*rQNXigm7&o!N_wm9K<6#Y8+#BPA zrFZt>|D8qt+d_$j;M9VQRTeyMuQLZdn4Jos`JfQLn;HuhlT5>ARs%WDjD}V2B{vlu zn;OcG2BkgX+SD-8Bdy+i9e&c#^Dv;z5G z!V?Jun~p`^pOEpZOiWd}F$@{FjD^^OJy?lvvK{GCJzWsq_fF!_Z)sT`DD@C+P!9RL zN+iXP51=P)EkpywK`ykixSkpHH@fFA(lZK<+<;YF!PRaU-$> z=IaALv_TW!q%DP!@>^&rJ?GHRFSNq7@;Xzw<^=BD1FfeDwHTm=M9j_(W)xSFyYRrX zV?oJPiHB6i-@FNRqA=TDD{&`7H=IHa2ZFU{z|ooE@;^Xi6|w4@zz@;D3k6k2hE{LS z8mW<)&v_0CE#o(Zuy|9j&gsy%J;>O!!Q<-;B3K6(j$+J5a%49D>j{d9*k8?mOYusU zKv`Aatj3qy#N6E{taDKU4m^tvj7d)KrCSZ$+Z}BsUuh=XaT^@#VoidGBD$>l{X3d- z7cIQUh}9#OeUP=PTB4&fqr>`wyHjzkW>6w3_ss(p7Nart8!dT=>_-dQQ_P(8v?_h`x0&KtBHGR91YEyQ;M@k;}-ROi{2VBP0&h1=l8NL*_g zmi8#Tv4jlN8?0Xl(aIxkG^nx~i_s2rQx&by5KQ-ojO7FDbtlH{33YYNus*4%UDtEO z!c8_~DNFa~PjYpP=R=!bx-mUeVxtB zglhh$XpxI#_KRe72;ynO&%`w3rn0ol^z(Bl*| zY6^<3f?u?r(ToLZdhS++BR<1L@*J{Yo%)lRT*hqeR^C}ul|=PsaT-!>6Wjlso+XEy zE1cyCf<)fJJ4N_S zb+-8+ns{KXF8rzzxb-ajQv_684~-j&L_EO{kB*!VCAvGosYiP*dG9bUIn;T8WgSiw zCmKE6L51gYPY-HdS~D}eI5Jj|Ie*{WGU!BAJ08LZZj0>w1($`P^FF$b8J+e-aY_=W z>xefzhB~&|*p5K>sR8!3HluPB9X^*hN-Spe^n=Torvh(pK)TN$H-TKWmy_JP$s3*d z_uIVjya}Cx%pbW$1kC4lCTsD97M)=J=Tzq@bk*9{XYo8LqpMa^9Z?nUFbBGR8sojf zpud%1yFs3u#9$6!4U(ee%CW|4XU4o6oRkOZ{X+aWpYsAq&Ou*7(6*W%Itwm8j7>O+ z2At|C24^qu#%JxW``!}XdQK^-8L!c%*KlN3H2XZNg$lAlTLGsHD|S~W^O}W7;|Ko& zPdwr+eennboDpDvok&$5wCiFjv3IbBN`EX#Nn+R1_%G0HdVWYA`0NH6IR*CR1X{2u zXf84u>^U-g1g-ohxF@>7W8r@C9JK3^*XP~JDlvzs%^b!2?$qe#V9<72W-@2=CiCub zE@Csw`41sQm)yc=kvX1Uv5ydBnGF5I0QjoCKSX2d7m9 zmHVi63&%zaUF*3WEf~v9;Ly)llYilj_U>n2Tc5{Q-B;H=&&-KGyln!G2Mh=pn z_a8EL=1&q<&O78k>e=DsX4R(qFpe6{pcJ{4Qk@AusT2%_dj2H{PTXA&4=U`BLWZwgi-`rwm}02th`O6AO^94K<5U$za6VS+zs)q3@;OYH|#~&-0&s7QOrqL$!e0{0`~G8+d!wC z|E+IX_*B+dY~|bGQu~O0y+fvJ9W%>rlH18bPB+w@#ype*^!OvTY6}uRmzlU(_;#mT z6TaQ+NeX{;0c#upqlEY`lNsnitn-#z6wNENttaKEqHaB&R%B*RJiy1h#L9fvSc9i= z_?Ym_tcT=m{{}RbK-}$MzbBl zH#m${+Dk-X7Do!8b6bMXLWu%J;`~SGlULZx+q~}Mp*;iHv>-Y=f=tH>UmM?Wa;|ZS zDirptbryQ_uqO035b-ci9Df`)E35bRBb!tgPL9mliX(~3F9ikMBW9WfB(=o->K>)K zdWR=Ak(>9(UM^%{0`_=4lKYSQ3y39@Nc2Fg`=40fOn5Knpifh*ww?!~`C}w+&X8%**HqaxkvZ;JupAZ9cXdIRS!q`x>IkNQ7qa1T?j@pA9*ZlR-2(gh z8O$4n5$FQ-=79vrFM=wLu%1>9ZvqED#687IpuuF|uDOr>-#z=B;;cOS5gXWzy8Ddy z&IQ19l|gNLS(9=htCz&|_Ht%n$ zwvjCw;v%190yeWI|7&Vd50K-cU(-;aJXmkk3U>&n+^^iJ{hN5Nck$ zz)aZMd1xKYaIHudV?SB^k@zxosU`e^-g<&13TG|uaQ6&zG7e)wOA*a)$oj?sJRc=B z8LdNZLuLfN_bhWVdvBAQYVK?SY3IkIEduUc;;BfsYBX45J-qY*9pj==s)K-bfltT4 zyHgxLeVayJWe*y61u>$z*wk)huR5^m=`?J_F*vRaI=(a6zH-RKQ#U_tZGjXu0h7LE z<-gq^&mL44t_2gdgO;hmGy|}QRqksuOf=&%AGMt7LHrluusfqVeMbX_mhjsS< z0=eu5K~98sR=VlY*}v1X0^oxU#0Vzf_3nj2d%%W=K?cLgxC|nOoD{F@H~g}~$X!o# z|3dUOSU@|IZKR*J>7bY5z=qxdE&;n^qN~0<9cU`Gr|Z$A|=ELqq?ICQgRk zZNPZdfrfXnU9;egblCZnXrS%j<4DZ=?E?pt0eufcq7#D<8lwM7!7=g=6Zsz#*MEdZ z--_6fgKX7Db3WvrMNB5ubzAYPBH+L`^ll@ZcAopaA?NlEzBo?QV1uU!@|u{qK_6ry zj9-pJGPfX`rHOOY0KGlMV@~eh1F!cWf}524Rw1%klqgSnXB2Xh+~0-gEC28nCvM-0 zD9Rjqc$vtxDx)+5?}n!uPp&A)YLbtrV2kZ^#PV#x%Xoyn>Bp5mGr|EN-=|pWMOc~# zto&CMYyZ(*3gv%A{!(Da`k|)^QLj>tI8qQkeP^^vGUqK6`-&#skA7`IWPv&Y^uh|( z#_Pdqpv#cg+RW6+13-mYrzT2uqGvmo+*Q01z&LmRwNc&e+{3nIPw?HjJb7__O0zZwHR&&p^8n;3WnENdhp3TJ7{Av~kapb^!9Y%n>k zzG&=n{tEC^KaO0+Yf3_$gH{t-O@+e%r1%ed;Af^@KP>H3-b+G_W9IkAiEKA9{(4$? zCbDw|be|JUvmH8Z2G2x7lZ-=)ZA42W2=eAXx_nYq~jV0 zC>GhgT+pvH(cBy+lNpZgNke>~FJrp}tT!9!)2yIdjK>tl>UZSmZ=$pJ(0u>V163?e z2fqw7b+U_yU!9}x|8n&MoVSc`^d!S6#0m7wTFt0yLcb1ysxyG~Yhh{Y5VI_ZOlHD* zMn@9-Sk&8Kkwx%GFR)N?Xsoq&Rm;DFyLTd{ni^D@4BpRzWEVmEgb|gPi-xa3MRW){ z>Lrn>p?F-c=;J%&z5vqxkH_axY|+E&gSXLr(VY4Cr4GZ4#Zx%4&W&f=t2^ z#y2s1(G59Mep$8I>4+$&#lqw@wH6DAtna`I@8H|s$Y^2WtYNg}0ABD|JoV~CG*go~ ziA0nu0ehLqrq#wu_QPIHK+El>t+yGwDCnPLU=fGtuefa+SGdE7rX@=@2qe9Nh{Q;u zc-1(|B{LC@)>71_CN!;$XBEg?g{MXe))E(0ZGg6&MC=yOixqI_R_=6(n4t?|(=!*Z zaF^A@w`QYf{vqC|nCtJz)fQ?O78A8;2QAXl*J!+QB6AJtZ+Wz;gZDTETVD{nRvgN9 zM51SLuZ`Se36c{+KC30jYdrG0AHEC(pEhO`Te4Ln;uuKWI4@G$0NpeNxm!-Qe;JZI z1})GL9?{I28jM5{BdMQ>Dcqo6M`*o9Hk8*HY|2jVs9fSo`gI82cnv+$84Z<#&tKq* zXlS*R+^Zr!nr1E>gY)kZO}dZ&t!lv~M5c!@vhBfu^=Vmo?x-hu`nc93D0RYYhlsA6 zVGBh&X@2$v==Lw%rj_C}WAZcTjb+o}nq<(X1Z@w26Slw+*T`c22WGm47T5wsC!=8o z(nnROh0x3D&>{uMMRTwAqfZXdk273fxyWn0tDlFttDbUwh9mcpm6yoi8=?$)p4Uh2 z>;qM%hMKjwUO(*bUXaXN;!i#-&=-1pm-+~;SfzTyrEu^(D7}ZL7NiRPDsGn>M#ZIHFzNZvRoH3GTl3Jt#`|IyknWD}Ef zkIL{{EAHAEi45V+H4HtAVwFoV+QEF+9=bPxy7?H#0HTdIxK1d3!d+VOidOxgH-289 zkb&on+kNh!^#ne1Olv$wg-Uw1v7V(G6)Gl&|1z?rU_U-b^yF*J<;rGwu_Dx{0H1?xZa0jZgIC4{O9Fr>7Zs_`jmyeq);xhxno@J6vP$F zuoa^h8PJ^$DCs@FlAaI_NlHtiVCCkvYWt~FS& zC!Dhct_g(-5BSwp^wK`g{fqaLjQV#X-9g;1I$EGQV;MvnB+*{(5{rG!YAJ?p(-_C4 zogbm)19-)b%{$um&gh`yTyY)aI~N?ah<2^T-fqU0EaktM;E`#_(Vyt}9oXR0jO|^t zq^@&|QMv&?--1R@xz-oPf~c<D0sM+GA+gtK9bm6bJ*c1#ry(#``;cc+2YzWA=^Xk+_p)1O{LkzQJj4 z*ihg8+nt!JgmE>= z-91MCHut#(O*OuujOhs|DjR*kShIb!Oq4#sSf6DJHFonpnoClw-bLklk$CAdHshu> zZ8Se4Dw60zX=%FuIR75^krvRZ2FJMi5w5HI$Q~c(%A(yBT5^rCmUM=p@8Z(hRB(jq zx6;$cjAlOr{YYo_QzL~*I4e3DPxI$RXFb_ivY=Y*d-U!iS3b%84spjrhFi6Nz_dVf zM=vtYPZ*OA+*2!p#z2Fngns#uMa>WuUQ+Z+^R-%HJsPp!6fGA_T(=sUM@T3gJ(gy7 zxwqA~4-8dLaVK%j9xTWqdKqD*-qO-r%UU6eIWfcADb!IFge2rW z{P@;vuc188#xnoE;v8uPUF`;Zc@8RStPW!_{@1G=^z3i6+J303QIu{FuDZu>Wiv!q z*+fZsLL=pg8L?lCCa_P-77xo7c#sp#-hE3S#4oDTxyQAxa?MllpGHr27B7km)x(FJ z^_074d(AK3afR>3R*EkrC2_b@LSE83+Dp#8c~&*8i3WelR(wX&ec`^cz}D(Nhfb2q z3rO@??yX*3qfd`%ne^fhGiDk&mhz!*(YbOWI58z-lLb!ItQyImYE1KDp>pw_hj$&z z$mpfw%;db%fC`ecC1xz+Km{-8<8&Z~m zBU#y#Wh}tidb)aba3U+!u+`-bb^P9DvrosLSyh+*9)eD{!BZSgS(xUtF7! zYo-TBrbSkCebFXAS1-sJg?Sa^y#TM${IUx7YK)Y%2VDqdbY<&okWL7=qP;;qx^Gj? zs%P+PC1_BbyX7&uPg)|4p>Z-sB{5qfcuxD84KAISgEI?3#iDE_*hJ0JT%(d{eHD69 zl|HL#wX``WKa|Kti?bU#3HR#yNx5z;-y^Bj@^KCRVy9X^D##P?H;nwP1KwF(a2KKY<{b`N%u)hcS zQ*H0xXqx?ef700K8_158L@V_Vk>v+m=`phP+`L|LZRvmyXn^@15Q zoiG1IcUArMHW16^pPM|>jRxs#=9?XCyJ*)xoO_fuoHh33in-FiKWz-zO(a)!Io2;a z!Fjs2Fz6nmM|PP{?W?M8FPjjmbf>O(n%@aW>MGZef9bUcNUM4%4EYG{C%y9@eR*zr z^dFy3%%<;!uJ0qsLOT}kTsK-$c3gNyR}ZCi7kP<(w>ewrLpb4u8OaYubBCd`H9`UC zUpv1~d=TB(K&>n-e()j7(($qfZyCeK++WlczL%A|%H7VhNxSI2SGnU2`X$O+zv3Rf zQokOu$rF%Pe8!dZ{+y9}Ll5OeelTPB(Tt*P-*>c#)l!6yXpPzlrD`)GmT`a z?P|6BB=t+)Llk2jqyNO1>VevlgsbY>(gc~%7eQzP$#x!OydbZ9=%E7Wro3ifc38Sw zmE?hF#ms20bf$&ssWwr>woP&yi%qK)$<}CfpQLCCt-&L!orT{^@5!3yW7Cy&pFG@8 z|K&HDQ2M$oo|JS_88mh|qlGG?jjFIoLzVyeowRy!URJ+LvzOs_rP+#cyqM8!`oF}_ zZ={b4qtA+)`)J>8YD0cnk;5Pk(L);2QX~(@wORdV>6D+d3vr!-Yz2(|F31rb(~%;a ztN!Gpmx?~9&!U_*VS8!h1V+n=Uc!#zPx*Zg_Af$%x{RjAQk*HxYP~^?XjHb?Msp^C zf8;O7DrzhVB{TZ4QAm!al5Ezk)-U5Fod=*=qhbOIKrBe5LqVKs4ye( zqOa8gdY8@;y;(dJT_O3Ghv5f@2k>nG_tRR_(b;0sF7di-l{|6VX3fwQ9<|&5M)o`R zmCyB+SHxypXj>_Z`JFZjx62m2Mq^6H$zt6ywn#phw50UpX%L{cqaeclSPyw9todn< z$dfq58PckH$zlk@DaNnultGfLRm~>9(Z=LXVq1=LM4zX4oiJw|=IYw?oc3K<*j)zc zZpYs3z@y$seqalmp1!9!4Eo$`JnhYVw~=GkN^Zf9$;X#H6H=B3xgVP*Yx)mY-OcAd zV>S1fPpv>Ko33wV*|je#xR2i)pr?mvo%MVbNfjnOMjwyTL&Y}LXQ9?}?8#2bzUXL# zXC+@iRoy}cid!%lI!ZMSB!~k~NZ5)K%o`Tgxb_YLn$U$EM@@w41fgqP09> zjhL*eVn~;GUB;?iG)L4%wNlhpANJ7;>ru#$5S8>2&HiHB^OH`ZmZ%~`pi$8#8pv}# zVa88h!YQt+=<7MtYPCbH(8ik7v_SUt7X6dQD|@RwZ4vv|p^Na3Hem$o8{6~rF6*o_ z^gDfjm6xTK;sC-niU_Em;#ZA_cus!q5z}IgEmbT!`(%3Z6%8mvXi=A9oQg+9HQH41&Zyj9@6xU@XobDM5T?9i z#Q>#)WhfWRb;D-*Qn3(;G=3BlMks) zYr)8Ot;(jAVXAVb&eeNmkd;tXB{rS=tNCROyxiJ&&-L*vHJ>#YA6I^6Gd9J2n(`UU z|MIe%;q^A-GnoJCac+HH4cN2}O#^dspPa)BpRy9og@WKdcopw6AsbLU<|Trc8i5X1(jTI;z!Y+VN@kyOXQy z$?yBJ^(1eky?$){$!HCthG#Ids)m!<8e;Yb@;;F72AS{ro4vlg_amdyi%l#2X_ba9 zym#ik8~4(Ex|sK#9MxI9xR36q`wZqv1GtCo@;lpb?lhFoVZ0Axe+b{}-nwi5pKa8= zdT=k@Lu&_iH1uf&?L~KuM6jW~Xj~u9y)K(7EvgwWzN#7Z>g?C#cmp#UielKaYqO`g zhE@oyX87b+!wurDQfws*2MQ}Hm!_A+c*1nTc8c_5g7?#T(i%*c3_K@^P!3pe2Spte z?MiHLp0Z^6Pg?@?j=Uqq!|h%?j>&J(|BCU(Kq7?)g|H-jl0W-Wv`A-bW@0DvI&*)m|RQaRwC$0Wgluue-+jV2ZWU=K5%gW2<%cd&!C)6dx zrAXX9Y>{3z9w8L7$5C) zfc(<}vKM-;;-BQBX0kVn*G%?jnIk$nh5hNgPbZ%-g^Y$~Tu!EXV+t?(K9SF<)OhgOy|sT=Bx?k>bl<~^IP3@Jm2U# zy1%}e%r>3&s^x08GD8cf{#rytr`QgI%v^DVwOcknXCrI`8prk6EOv zt4E+YMWdAWu$%g2{Q;p#p{(Qd(|QKVjadIeSji$^)iEg3FMKK7q?TE9E&L_9Qp8>T zla#3)ibJVwdRMGoX9ztAKSV_4gf0}Hx6yd5Zl~O`BHT8bBneiOUa>oyK~}z3zTQWJ zz?6GZOj~G7G4+pptIfu`h0uhJgcEEIDJptGku2Hz*k}*wAmtb0qp^PBmE7pBl<2l( z_^gUuD?XzLwjwF|)Sjwo(y}Sqq4kdC^(*F~XtFSY;vP8+Mo=6>7>uA;M=29QDZ>#(P>O>J6eZV7u@xZ- zUArXcLu+-}U+M}%9J;5CNXzH9aSiM1OZO`Z6vTT0K64v{Bah!A7{#+?BeWK#`lWRR z)F-t|t<=>OYqtN}cH6$#NQ_#bvxIfDsc&kDDlpW7h)9HuKImPxNSp4e{7_CdMeP-H zQ655wOj+|xCim)3k$XJ_*?42T7vOV@)JYf;C#nQsAHcPKe zePpbSW`GJ;diYP+RJc^OM+jONR!4=c6|>Vz-zrn9cf}GES5O8~`QRwVTW|zs&7Lr` zya`1l6i1NHpjd`t1~y9M@||$6-K@P+R789B8ba}^jS2s01tkIUJmhtJF+PK`U_$sp z_sSkB3So~(##EglA4QRT<&z`iNuGgZNiDLm|8Vo4B9UPx9;tWhu6I3SQ4yz zD31FAdn}ok=b&}sX zkInx!iY)I%*OnfUc2V#3sh4sV%8M(jrgo?bMlF-qW$RL;v#frUuHXB`(ZWpSI$W6?9D6Mz%r6be8s|jf9(JM-&xSBviIW z=gPO#O5^sr!qE}Y_C%bcc&Q@DvQi06AC*rQCbrpz*!11vU+eL!zC@e-Uca{3+-4#Y z7)vK4t)A*-sij}ZD^{jhnn`}P{BK1AY_);pTG3V;r*{5dU&;Gc+*JOztz(j|R8&`5 zH3H2mm!V1++cJ%SaxL*_yYQC4vQ8&^^QZuYw5`>9kQ(MLUHqRo`sm&hoH?og-qbicl+-r>M2Q6SlN* zTt#4YmSUJTq8D*bVNFHmq~~m=Q2I`oS6Wh9SsGMY_t{T9r}&w4u(da$i1e=Xk<~%c zNz!@Rr0?vW@TKwz5#MTG+AboKAgw4%D64FdrN?A*WPvRTh{*G3#B6-Z<`nFx%eL#> z|5dOPA>mv-*F^OVih}94>DX-EPsfy- z%D^{5#)_0_6DAfu3o@@v?CYhgXX1QaQL!}PO<_9aw1hizf%FttvlS&4{pJ37T>shJ zqRtie)-_dWp;`_h!L0nRtJ^jTrK^`|*`$kAi;@DGXiYoirj%JztJ9lb3B}v|n((F2 ze2}3)1kzNy^%4b?>lF2LZBascUKKC06T+Oz=SJj;l?#;aRa{ZJDgnAVLPsgis0fNS zMH#L2khh_{pOCEDsdrIZ_tcuZmiE>Q(f!pk{ZdCn0ZUocaEQLDcTrz*LNOiFh})OO zK$I7vwr2?Y+fAb{D%-0lTdK3P%DAe3Y$R0I5?5HtsTNPXq7kumY-*cE#nMUb(`v!C zg4%jmvZAV3$;_Fm`Lg(3bQCqjud>G0BFcWq0@_@(wdN7Wq}i=Sx4C=ib-ip}Kf>Aw z;|qJoLU#*=M|>-LBpHgvZ)C4@p5A52WCvs!EymZoWY9G_T2+tIAVNga9zruZA}u3q z6@g);Q>-7WcOA7EON+3Cdo2DEcD8=3&1TAr)z$UAjcVEKp){GWvN8d}a_{+GSGCC7 zVs3fXs&|P%`9jea3F|E74|FZ7@hnQSK0w5~t(eo5RVDt$=+~!40}Bu9N$au}%33P7 zq}n;{D?4;^zPxGlGip?n6_K%6KDZaLw zn2vIlir++3%p71(Q97Na+?n!8iUcV(x8MBYAlKMWq{!x%lx^g$VPbp8gjeMw{XS;(vWjrHtpQ;Q}G;6KdR`aeHpI)npe<{+p*u=q>aYVCP zRF$q{3yGD@<9&{a0@_&MJnE_y1Ds`IYBPudDxx-*c-lhFns46q%Y|HjDRXgF^U}Sv z4v_A+mUbv(Yh!4tU{dr<*+g4Or7W^?iHD)DVm^9T4pX*S7FV@~+O%etB0S0+s)k73 zhy0JbYKM-$6aN-xkuX?_&f(R>Z%a4Hb3(Wf#s`cLn6ue>>1u^nwTl2VFes&uj0A^V?Z2P)2^_`S^;>3l_b zZ2qW(iL2=Ds_C$~DZQ&^MYSSop)9PTDYA32o6_nw+OPi0ip#5!y|mgmxv^-XnS2ua zQiR|7TZ)Sa5!?8Oyfh(ZML#V4^`CqTo3pd{Suqlwsfuq^g9w>hzec&b2pw!SzTV?8 zMi$pt3}Zbk>vO4M$s!9`bJ-hV5gk)s6v?x(Jo#bjpGH+yU*B7crcu_2TH9%Dps1rK zLnw=9qjrj3sYXWQp=g%qZDU@F&}lSuyojN@jr`d7%$1sH7`#Z+`vd?5Lh^p&Cqwu(&>u1e(yc~>4+JRvzPZd#-IJKa-l zRkfX+!yr^_>!fWITD5>ei9$5;T!mQ_g|tyc`3dp`rRO3de2S(hvZcCm>1xe(xq)t1 zC5tj!whrhNnqT=XO;%HOQdZJt!d74dm$AvN&B5L&=QWG>8RVg+@~$JwO6hZ|$xuCvMN&CcQ$Kq1%D^qMi8+G52cE zXGinDj&^5edJksA_oO|&Y1Kep{h2GTwXlcK*58?PI-2=XuD#uPopkC?N#! zr?K>lKnk+-nhm>{Z2{jcGSr&S+4_a3_9wraZQdjHg&lN68N~T)5n0AL21O_%x71(; z(OzgoE8H&OsQwd@uy{iIT0?Rr|0|ET#C*TZ9Mc)X9;%97NB&N^&CQIn5YjfVlF*Ve zp{n)~(h|=oBPZms&*a%u$t8>^{GsfV=2zKyH@4kRp_h$9DK;gWs92TV^qo8k`4ftY=}NZt(MBn)y;BWxLKHJYDiQ+qG}S^2vstzz|u zb-dP?&kd|FvXN~Q+j_RO=0EMNWLwKG)|fN(zRGNim)lU_|@MzK~4pTLaf@yr#U#NIgOqL2EyX>Y9gPT!Ab{}1y%mUG5JpV6!XFr2EF zVIEb&jO1(`8OL{HdDkpyyRYlmtBx>xzf&t?YjyNoO;zsnH)COIdsK_ljq$S8L3%2d z9bJ8Drn7K}YL*(YHQ-b8XH)?r&a7;>RC8W5BSvV=VrH8a6)LcqNSlq6owiXA$&O+^ zlBHB8vL+m?xU*sms#uoBu+_?no+}ohXrrcJ1g&S4cjX7xdL4-Z&9;j z=cB`fU1tI+k|2sR)s+)k}8QR-vfsL$x5P22pj%C|2ni#p)Bo zv2KG|QK=tWFDzhJR)ds{?20|?#C`}?Q}(hWFWJ*Jth>-0+u9tf9Biy?Lo9W3EOv9& zmC^AQyjrofVbgnCey6=wSmBOroy0Q^5 z71yT!b!JOmx|Xi`e@)#%PQx$|1<>=NqIQFjimH^PAcAPCZV*R6Y*=sx?!=b=W{8AF zwqwV3#`YxnvVY>Mq+eG%)(KZR+Qj#Mm%2{4sW<&iwR%^7Td_Clw%+vn^vh!$@n7;W zSY@o(6#tMIpFI5a?4OH)61pdW;?Iw?QhmrTbmRa#!NoLvjo0r(|oWkbglwQ5@*3A=u%n9?*KLc}T0b OR%w5NhRh%K*9gC_r)+cp literal 0 HcmV?d00001 diff --git a/sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/EndpointConfig.java b/sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/EndpointConfig.java new file mode 100644 index 000000000..5f4b6d16a --- /dev/null +++ b/sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/EndpointConfig.java @@ -0,0 +1,29 @@ +/* + * // Copyright 2022-2023 by zhaoming + */ + +package com.k2fsa.sherpa.onnx; + +public class EndpointConfig { + private final EndpointRule rule1; + private final EndpointRule rule2; + private final EndpointRule rule3; + + public EndpointConfig(EndpointRule rule1, EndpointRule rule2, EndpointRule rule3) { + this.rule1 = rule1; + this.rule2 = rule2; + this.rule3 = rule3; + } + + public EndpointRule getRule1() { + return rule1; + } + + public EndpointRule getRule2() { + return rule2; + } + + public EndpointRule getRule3() { + return rule3; + } +} diff --git a/sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/EndpointRule.java b/sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/EndpointRule.java new file mode 100644 index 000000000..5a1714f64 --- /dev/null +++ b/sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/EndpointRule.java @@ -0,0 +1,30 @@ +/* + * // Copyright 2022-2023 by zhaoming + */ + +package com.k2fsa.sherpa.onnx; + +public class EndpointRule { + private final boolean mustContainNonSilence; + private final float minTrailingSilence; + private final float minUtteranceLength; + + public EndpointRule( + boolean mustContainNonSilence, float minTrailingSilence, float minUtteranceLength) { + this.mustContainNonSilence = mustContainNonSilence; + this.minTrailingSilence = minTrailingSilence; + this.minUtteranceLength = minUtteranceLength; + } + + public float getMinTrailingSilence() { + return minTrailingSilence; + } + + public float getMinUtteranceLength() { + return minUtteranceLength; + } + + public boolean getMustContainNonSilence() { + return mustContainNonSilence; + } +} diff --git a/sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/FeatureConfig.java b/sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/FeatureConfig.java new file mode 100644 index 000000000..069b7897d --- /dev/null +++ b/sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/FeatureConfig.java @@ -0,0 +1,23 @@ +/* + * // Copyright 2022-2023 by zhaoming + */ + +package com.k2fsa.sherpa.onnx; + +public class FeatureConfig { + private final int sampleRate; + private final int featureDim; + + public FeatureConfig(int sampleRate, int featureDim) { + this.sampleRate = sampleRate; + this.featureDim = featureDim; + } + + public int getSampleRate() { + return sampleRate; + } + + public int getFeatureDim() { + return featureDim; + } +} diff --git a/sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/OnlineRecognizer.java b/sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/OnlineRecognizer.java new file mode 100644 index 000000000..7716fd5a8 --- /dev/null +++ b/sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/OnlineRecognizer.java @@ -0,0 +1,304 @@ +/* + * // Copyright 2022-2023 by zhaoming + * // the online recognizer for sherpa-onnx, it can load config from a file + * // or by argument + */ +/* +usage example: + + String cfgpath=appdir+"/modelconfig.cfg"; + OnlineRecognizer.setSoPath(soPath); //set so lib path + + OnlineRecognizer rcgOjb = new OnlineRecognizer(); //create a recognizer + rcgOjb = new OnlineRecognizer(cfgFile); //set model config file + CreateStream streamObj=rcgOjb.CreateStream(); //create a stream for read wav data + float[] buffer = rcgOjb.readWavFile(wavfilename); // read data from file + streamObj.acceptWaveform(buffer); // feed stream with data + streamObj.inputFinished(); // tell engine you done with all data + OnlineStream ssObj[] = new OnlineStream[1]; + while (rcgOjb.isReady(streamObj)) { // engine is ready for unprocessed data + ssObj[0] = streamObj; + rcgOjb.decodeStreams(ssObj); // decode for multiple stream + // rcgOjb.DecodeStream(streamObj); // decode for single stream + } + + String recText = "simple:" + rcgOjb.getResult(streamObj) + "\n"; + byte[] utf8Data = recText.getBytes(StandardCharsets.UTF_8); + System.out.println(new String(utf8Data)); + rcgOjb.reSet(streamObj); + rcgOjb.releaseStream(streamObj); // release stream + rcgOjb.release(); // release recognizer + +*/ +package com.k2fsa.sherpa.onnx; + +import java.io.*; +import java.util.*; + +public class OnlineRecognizer { + private long ptr = 0; // this is the asr engine ptrss + + private int sampleRate = 16000; + // load config file for OnlineRecognizer + public OnlineRecognizer(String modelCfgPath) { + Map proMap = this.readProperties(modelCfgPath); + try { + int sampleRate = Integer.parseInt(proMap.get("sample_rate").trim()); + this.sampleRate = sampleRate; + EndpointRule rule1 = + new EndpointRule( + false, Float.parseFloat(proMap.get("rule1_min_trailing_silence").trim()), 0.0F); + EndpointRule rule2 = + new EndpointRule( + true, Float.parseFloat(proMap.get("rule2_min_trailing_silence").trim()), 0.0F); + EndpointRule rule3 = + new EndpointRule( + false, 0.0F, Float.parseFloat(proMap.get("rule3_min_utterance_length").trim())); + EndpointConfig endCfg = new EndpointConfig(rule1, rule2, rule3); + OnlineTransducerModelConfig modelCfg = + new OnlineTransducerModelConfig( + proMap.get("encoder").trim(), + proMap.get("decoder").trim(), + proMap.get("joiner").trim(), + proMap.get("tokens").trim(), + Integer.parseInt(proMap.get("num_threads").trim()), + false); + FeatureConfig featConfig = + new FeatureConfig(sampleRate, Integer.parseInt(proMap.get("feature_dim").trim())); + OnlineRecognizerConfig rcgCfg = + new OnlineRecognizerConfig( + featConfig, + modelCfg, + endCfg, + Boolean.parseBoolean(proMap.get("enable_endpoint_detection").trim()), + proMap.get("decoding_method").trim(), + Integer.parseInt(proMap.get("max_active_paths").trim())); + // create a new Recognizer, first parameter kept for android asset_manager ANDROID_API__ >= 9 + this.ptr = createOnlineRecognizer(new Object(), rcgCfg); + + } catch (Exception e) { + System.err.println(e); + } + } + + // use for android asset_manager ANDROID_API__ >= 9 + public OnlineRecognizer(Object assetManager, String modelCfgPath) { + Map proMap = this.readProperties(modelCfgPath); + try { + int sampleRate = Integer.parseInt(proMap.get("sample_rate").trim()); + this.sampleRate = sampleRate; + EndpointRule rule1 = + new EndpointRule( + false, Float.parseFloat(proMap.get("rule1_min_trailing_silence").trim()), 0.0F); + EndpointRule rule2 = + new EndpointRule( + true, Float.parseFloat(proMap.get("rule2_min_trailing_silence").trim()), 0.0F); + EndpointRule rule3 = + new EndpointRule( + false, 0.0F, Float.parseFloat(proMap.get("rule3_min_utterance_length").trim())); + EndpointConfig endCfg = new EndpointConfig(rule1, rule2, rule3); + OnlineTransducerModelConfig modelCfg = + new OnlineTransducerModelConfig( + proMap.get("encoder").trim(), + proMap.get("decoder").trim(), + proMap.get("joiner").trim(), + proMap.get("tokens").trim(), + Integer.parseInt(proMap.get("num_threads").trim()), + false); + FeatureConfig featConfig = + new FeatureConfig(sampleRate, Integer.parseInt(proMap.get("feature_dim").trim())); + OnlineRecognizerConfig rcgCfg = + new OnlineRecognizerConfig( + featConfig, + modelCfg, + endCfg, + Boolean.parseBoolean(proMap.get("enable_endpoint_detection").trim()), + proMap.get("decoding_method").trim(), + Integer.parseInt(proMap.get("max_active_paths").trim())); + // create a new Recognizer, first parameter kept for android asset_manager ANDROID_API__ >= 9 + this.ptr = createOnlineRecognizer(assetManager, rcgCfg); + + } catch (Exception e) { + System.err.println(e); + } + } + + // set onlineRecognizer by parameter + public OnlineRecognizer( + String tokens, + String encoder, + String decoder, + String joiner, + int numThreads, + int sampleRate, + int featureDim, + boolean enableEndpointDetection, + float rule1MinTrailingSilence, + float rule2MinTrailingSilence, + float rule3MinUtteranceLength, + String decodingMethod, + int maxActivePaths) { + this.sampleRate = sampleRate; + EndpointRule rule1 = new EndpointRule(false, rule1MinTrailingSilence, 0.0F); + EndpointRule rule2 = new EndpointRule(true, rule2MinTrailingSilence, 0.0F); + EndpointRule rule3 = new EndpointRule(false, 0.0F, rule3MinUtteranceLength); + EndpointConfig endCfg = new EndpointConfig(rule1, rule2, rule3); + OnlineTransducerModelConfig modelCfg = + new OnlineTransducerModelConfig(encoder, decoder, joiner, tokens, numThreads, false); + FeatureConfig featConfig = new FeatureConfig(sampleRate, featureDim); + OnlineRecognizerConfig rcgCfg = + new OnlineRecognizerConfig( + featConfig, + modelCfg, + endCfg, + enableEndpointDetection, + decodingMethod, + maxActivePaths); + // create a new Recognizer, first parameter kept for android asset_manager ANDROID_API__ >= 9 + this.ptr = createOnlineRecognizer(new Object(), rcgCfg); + } + + private Map readProperties(String modelCfgPath) { + // read and parse config file + Properties props = new Properties(); + Map proMap = new HashMap<>(); + try { + File file = new File(modelCfgPath); + if (!file.exists()) { + System.out.println("model cfg file not exists!"); + System.exit(0); + } + InputStream in = new BufferedInputStream(new FileInputStream(modelCfgPath)); + props.load(in); + Enumeration en = props.propertyNames(); + while (en.hasMoreElements()) { + String key = (String) en.nextElement(); + String Property = props.getProperty(key); + proMap.put(key, Property); + // System.out.println(key+"="+Property); + } + + } catch (Exception e) { + e.printStackTrace(); + } + return proMap; + } + + public void decodeStream(OnlineStream s) throws Exception { + if (this.ptr == 0) throw new Exception("null exception for recognizer ptr"); + long streamPtr = s.getPtr(); + if (streamPtr == 0) throw new Exception("null exception for stream ptr"); + // when feeded samples to engine, call DecodeStream to let it process + decodeStream(this.ptr, streamPtr); + } + + public void decodeStreams(OnlineStream[] ssOjb) throws Exception { + if (this.ptr == 0) throw new Exception("null exception for recognizer ptr"); + // decode for multiple streams + long[] ss = new long[ssOjb.length]; + for (int i = 0; i < ssOjb.length; i++) { + ss[i] = ssOjb[i].getPtr(); + if (ss[i] == 0) throw new Exception("null exception for stream ptr"); + } + decodeStreams(this.ptr, ss); + } + + public boolean isReady(OnlineStream s) throws Exception { + // whether the engine is ready for decode + if (this.ptr == 0) throw new Exception("null exception for recognizer ptr"); + long streamPtr = s.getPtr(); + if (streamPtr == 0) throw new Exception("null exception for stream ptr"); + return isReady(this.ptr, streamPtr); + } + + public String getResult(OnlineStream s) throws Exception { + // get text from the engine + if (this.ptr == 0) throw new Exception("null exception for recognizer ptr"); + long streamPtr = s.getPtr(); + if (streamPtr == 0) throw new Exception("null exception for stream ptr"); + return getResult(this.ptr, streamPtr); + } + + public boolean isEndpoint(OnlineStream s) throws Exception { + if (this.ptr == 0) throw new Exception("null exception for recognizer ptr"); + long streamPtr = s.getPtr(); + if (streamPtr == 0) throw new Exception("null exception for stream ptr"); + return isEndpoint(this.ptr, streamPtr); + } + + public void reSet(OnlineStream s) throws Exception { + if (this.ptr == 0) throw new Exception("null exception for recognizer ptr"); + long streamPtr = s.getPtr(); + if (streamPtr == 0) throw new Exception("null exception for stream ptr"); + reSet(this.ptr, streamPtr); + } + + public OnlineStream createStream() throws Exception { + // create one stream for data to feed in + if (this.ptr == 0) throw new Exception("null exception for recognizer ptr"); + long streamPtr = createStream(this.ptr); + OnlineStream stream = new OnlineStream(streamPtr, this.sampleRate); + return stream; + } + + public float[] readWavFile(String fileName) { + // read data from the filename + Object[] wavdata = readWave(fileName); + Object data = wavdata[0]; // data[0] is float data, data[1] sample rate + + float[] floatData = (float[]) data; + + return floatData; + } + + // load the libsherpa-onnx-jni.so lib + public static void loadSoLib(String soPath) { + // load libsherpa-onnx-jni.so lib from the path + + System.out.println("so lib path=" + soPath + "\n"); + System.load(soPath.trim()); + } + + public static void setSoPath(String soPath) { + OnlineRecognizer.loadSoLib(soPath); + OnlineStream.loadSoLib(soPath); + } + + protected void finalize() throws Throwable { + release(); + } + + // recognizer release, you'd better call it manually if not use anymore + public void release() { + if (this.ptr == 0) return; + deleteOnlineRecognizer(this.ptr); + this.ptr = 0; + } + + // stream release, you'd better call it manually if not use anymore + public void releaseStream(OnlineStream s) { + s.release(); + } + // JNI interface libsherpa-onnx-jni.so + + private native Object[] readWave(String fileName); + + private native String getResult(long ptr, long streamPtr); + + private native void decodeStream(long ptr, long streamPtr); + + private native void decodeStreams(long ptr, long[] ssPtr); + + private native boolean isReady(long ptr, long streamPtr); + + // first parameter keep for android asset_manager ANDROID_API__ >= 9 + private native long createOnlineRecognizer(Object asset, OnlineRecognizerConfig config); + + private native long createStream(long ptr); + + private native void deleteOnlineRecognizer(long ptr); + + private native boolean isEndpoint(long ptr, long streamPtr); + + private native void reSet(long ptr, long streamPtr); +} diff --git a/sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/OnlineRecognizerConfig.java b/sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/OnlineRecognizerConfig.java new file mode 100644 index 000000000..3b8e05ecf --- /dev/null +++ b/sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/OnlineRecognizerConfig.java @@ -0,0 +1,53 @@ +/* + * // Copyright 2022-2023 by zhaoming + */ + +package com.k2fsa.sherpa.onnx; + +public class OnlineRecognizerConfig { + private final FeatureConfig featConfig; + private final OnlineTransducerModelConfig modelConfig; + private final EndpointConfig endpointConfig; + private final boolean enableEndpoint; + private final String decodingMethod; + private final int maxActivePaths; + + public OnlineRecognizerConfig( + FeatureConfig featConfig, + OnlineTransducerModelConfig modelConfig, + EndpointConfig endpointConfig, + boolean enableEndpoint, + String decodingMethod, + int maxActivePaths) { + this.featConfig = featConfig; + this.modelConfig = modelConfig; + this.endpointConfig = endpointConfig; + this.enableEndpoint = enableEndpoint; + this.decodingMethod = decodingMethod; + this.maxActivePaths = maxActivePaths; + } + + public FeatureConfig getFeatConfig() { + return featConfig; + } + + public OnlineTransducerModelConfig getModelConfig() { + return modelConfig; + } + + public EndpointConfig getEndpointConfig() { + return endpointConfig; + } + + public boolean isEnableEndpoint() { + return enableEndpoint; + } + + public String getDecodingMethod() { + return decodingMethod; + } + + public int getMaxActivePaths() { + return maxActivePaths; + } +} diff --git a/sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/OnlineStream.java b/sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/OnlineStream.java new file mode 100644 index 000000000..557b4d8dc --- /dev/null +++ b/sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/OnlineStream.java @@ -0,0 +1,86 @@ +/* + * // Copyright 2022-2023 by zhaoming + */ +// Stream is used for feeding data to the asr engine +package com.k2fsa.sherpa.onnx; + +import java.io.*; +import java.util.*; + +public class OnlineStream { + private long ptr = 0; // this is the stream ptr + + private int sampleRate = 16000; + // assign ptr to this stream in construction + public OnlineStream(long ptr, int sampleRate) { + this.ptr = ptr; + this.sampleRate = sampleRate; + } + + public long getPtr() { + return ptr; + } + + public void acceptWaveform(float[] samples) throws Exception { + if (this.ptr == 0) throw new Exception("null exception for stream ptr"); + + // feed wave data to asr engine + acceptWaveform(this.ptr, this.sampleRate, samples); + } + + public void inputFinished() { + // add some tail padding + int padLen = (int) (this.sampleRate * 0.3); // 0.3 seconds at 16 kHz sample rate + float tailPaddings[] = new float[padLen]; // default value is 0 + acceptWaveform(this.ptr, this.sampleRate, tailPaddings); + + // tell the engine all data are feeded + inputFinished(this.ptr); + } + + public static void loadSoLib(String soPath) { + // load .so lib from the path + System.load(soPath.trim()); // ("sherpa-onnx-jni-java"); + } + + public void release() { + // stream object must be release after used + if (this.ptr == 0) return; + deleteStream(this.ptr); + this.ptr = 0; + } + + protected void finalize() throws Throwable { + release(); + } + + public boolean isLastFrame() throws Exception { + if (this.ptr == 0) throw new Exception("null exception for stream ptr"); + return isLastFrame(this.ptr); + } + + public void reSet() throws Exception { + if (this.ptr == 0) throw new Exception("null exception for stream ptr"); + reSet(this.ptr); + } + + public int featureDim() throws Exception { + if (this.ptr == 0) throw new Exception("null exception for stream ptr"); + return featureDim(this.ptr); + } + + // JNI interface libsherpa-onnx-jni.so + private native void acceptWaveform(long ptr, int sampleRate, float[] samples); + + private native void inputFinished(long ptr); + + private native void deleteStream(long ptr); + + private native int numFramesReady(long ptr); + + private native boolean isLastFrame(long ptr); + + private native void reSet(long ptr); + + private native int featureDim(long ptr); +} diff --git a/sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/OnlineTransducerModelConfig.java b/sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/OnlineTransducerModelConfig.java new file mode 100644 index 000000000..1e45e3717 --- /dev/null +++ b/sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/OnlineTransducerModelConfig.java @@ -0,0 +1,48 @@ +/* + * // Copyright 2022-2023 by zhaoming + */ + +package com.k2fsa.sherpa.onnx; + +public class OnlineTransducerModelConfig { + private final String encoder; + private final String decoder; + private final String joiner; + private final String tokens; + private final int numThreads; + private final boolean debug; + + public OnlineTransducerModelConfig( + String encoder, String decoder, String joiner, String tokens, int numThreads, boolean debug) { + this.encoder = encoder; + this.decoder = decoder; + this.joiner = joiner; + this.tokens = tokens; + this.numThreads = numThreads; + this.debug = debug; + } + + public String getEncoder() { + return encoder; + } + + public String getDecoder() { + return decoder; + } + + public String getJoiner() { + return joiner; + } + + public String getTokens() { + return tokens; + } + + public int getNumThreads() { + return numThreads; + } + + public boolean getDebug() { + return debug; + } +} diff --git a/sherpa-onnx/jni/jni.cc b/sherpa-onnx/jni/jni.cc index bb81ec583..8a861e8f8 100644 --- a/sherpa-onnx/jni/jni.cc +++ b/sherpa-onnx/jni/jni.cc @@ -2,6 +2,7 @@ // // Copyright (c) 2022-2023 Xiaomi Corporation // 2022 Pingfeng Luo +// 2023 Zhaoming // TODO(fangjun): Add documentation to functions/methods in this file // and also show how to use them with kotlin, possibly with java. @@ -12,7 +13,6 @@ #include #include - #if __ANDROID_API__ >= 9 #include "android/asset_manager.h" #include "android/asset_manager_jni.h" @@ -207,7 +207,6 @@ JNIEXPORT jlong JNICALL Java_com_k2fsa_sherpa_onnx_SherpaOnnx_new( SHERPA_ONNX_LOGE("Failed to get asset manager: %p", mgr); } #endif - auto config = sherpa_onnx::GetConfig(env, _config); SHERPA_ONNX_LOGE("config:\n%s", config.ToString().c_str()); auto model = new sherpa_onnx::SherpaOnnx( @@ -301,7 +300,7 @@ Java_com_k2fsa_sherpa_onnx_WaveReader_00024Companion_readWave( SHERPA_ONNX_LOGE("Failed to get asset manager: %p", mgr); exit(-1); } - + SHERPA_ONNX_LOGE("Failed to read %s", p_filename); std::vector buffer = sherpa_onnx::ReadFile(mgr, p_filename); std::istrstream is(buffer.data(), buffer.size()); @@ -332,3 +331,186 @@ Java_com_k2fsa_sherpa_onnx_WaveReader_00024Companion_readWave( return obj_arr; } + +// ******warpper for OnlineRecognizer******* + +// wav reader for java interface +SHERPA_ONNX_EXTERN_C +JNIEXPORT jobjectArray JNICALL +Java_com_k2fsa_sherpa_onnx_OnlineRecognizer_readWave(JNIEnv *env, + jclass /*cls*/, + jstring filename) { + auto data = Java_com_k2fsa_sherpa_onnx_WaveReader_00024Companion_readWave( + env, nullptr, nullptr, filename); + return data; +} + +SHERPA_ONNX_EXTERN_C +JNIEXPORT jlong JNICALL + +Java_com_k2fsa_sherpa_onnx_OnlineRecognizer_createOnlineRecognizer( + + JNIEnv *env, jobject /*obj*/, jobject asset_manager, jobject _config) { +#if __ANDROID_API__ >= 9 + AAssetManager *mgr = AAssetManager_fromJava(env, asset_manager); + if (!mgr) { + SHERPA_ONNX_LOGE("Failed to get asset manager: %p", mgr); + } +#endif + sherpa_onnx::OnlineRecognizerConfig config = + sherpa_onnx::GetConfig(env, _config); + SHERPA_ONNX_LOGE("config:\n%s", config.ToString().c_str()); + auto p_recognizer = new sherpa_onnx::OnlineRecognizer( +#if __ANDROID_API__ >= 9 + mgr, +#endif + config); + return (jlong)p_recognizer; +} + +SHERPA_ONNX_EXTERN_C +JNIEXPORT void JNICALL +Java_com_k2fsa_sherpa_onnx_OnlineRecognizer_deleteOnlineRecognizer( + JNIEnv *env, jobject /*obj*/, jlong ptr) { + delete reinterpret_cast(ptr); +} + +SHERPA_ONNX_EXTERN_C +JNIEXPORT jlong JNICALL +Java_com_k2fsa_sherpa_onnx_OnlineRecognizer_createStream(JNIEnv *env, + jobject /*obj*/, + jlong ptr) { + std::unique_ptr s = + reinterpret_cast(ptr)->CreateStream(); + sherpa_onnx::OnlineStream *p_stream = s.release(); + return reinterpret_cast(p_stream); +} + +SHERPA_ONNX_EXTERN_C +JNIEXPORT bool JNICALL Java_com_k2fsa_sherpa_onnx_OnlineRecognizer_isReady( + JNIEnv *env, jobject /*obj*/, jlong ptr, jlong s_ptr) { + sherpa_onnx::OnlineRecognizer *model = + reinterpret_cast(ptr); + sherpa_onnx::OnlineStream *s = + reinterpret_cast(s_ptr); + return model->IsReady(s); +} + +SHERPA_ONNX_EXTERN_C +JNIEXPORT void JNICALL Java_com_k2fsa_sherpa_onnx_OnlineRecognizer_decodeStream( + JNIEnv *env, jobject /*obj*/, jlong ptr, jlong s_ptr) { + sherpa_onnx::OnlineRecognizer *model = + reinterpret_cast(ptr); + sherpa_onnx::OnlineStream *s = + reinterpret_cast(s_ptr); + model->DecodeStream(s); +} + +SHERPA_ONNX_EXTERN_C +JNIEXPORT void JNICALL +Java_com_k2fsa_sherpa_onnx_OnlineRecognizer_decodeStreams(JNIEnv *env, + jobject /*obj*/, + jlong ptr, + jlongArray ss_ptr, + jint stream_size) { + sherpa_onnx::OnlineRecognizer *model = + reinterpret_cast(ptr); + jlong *p = env->GetLongArrayElements(ss_ptr, nullptr); + jsize n = env->GetArrayLength(ss_ptr); + std::vector p_ss(n); + for (int32_t i = 0; i != n; ++i) { + p_ss[i] = reinterpret_cast(p[i]); + } + + model->DecodeStreams(p_ss.data(), n); + env->ReleaseLongArrayElements(ss_ptr, p, JNI_ABORT); +} + +SHERPA_ONNX_EXTERN_C +JNIEXPORT jstring JNICALL Java_com_k2fsa_sherpa_onnx_OnlineRecognizer_getResult( + JNIEnv *env, jobject /*obj*/, jlong ptr, jlong s_ptr) { + sherpa_onnx::OnlineRecognizer *model = + reinterpret_cast(ptr); + sherpa_onnx::OnlineStream *s = + reinterpret_cast(s_ptr); + sherpa_onnx::OnlineRecognizerResult result = model->GetResult(s); + return env->NewStringUTF(result.ToString().c_str()); +} + +SHERPA_ONNX_EXTERN_C +JNIEXPORT bool JNICALL Java_com_k2fsa_sherpa_onnx_OnlineRecognizer_isEndpoint( + JNIEnv *env, jobject /*obj*/, jlong ptr, jlong s_ptr) { + sherpa_onnx::OnlineRecognizer *model = + reinterpret_cast(ptr); + sherpa_onnx::OnlineStream *s = + reinterpret_cast(s_ptr); + return model->IsEndpoint(s); +} + +SHERPA_ONNX_EXTERN_C +JNIEXPORT void JNICALL Java_com_k2fsa_sherpa_onnx_OnlineRecognizer_reSet( + JNIEnv *env, jobject /*obj*/, jlong ptr, jlong s_ptr) { + sherpa_onnx::OnlineRecognizer *model = + reinterpret_cast(ptr); + sherpa_onnx::OnlineStream *s = + reinterpret_cast(s_ptr); + model->Reset(s); +} + +// *********for OnlineStream ********* +SHERPA_ONNX_EXTERN_C +JNIEXPORT void JNICALL Java_com_k2fsa_sherpa_onnx_OnlineStream_acceptWaveform( + JNIEnv *env, jobject /*obj*/, jlong s_ptr, jint sample_rate, + jfloatArray waveform) { + sherpa_onnx::OnlineStream *s = + reinterpret_cast(s_ptr); + jfloat *p = env->GetFloatArrayElements(waveform, nullptr); + jsize n = env->GetArrayLength(waveform); + s->AcceptWaveform(sample_rate, p, n); + env->ReleaseFloatArrayElements(waveform, p, JNI_ABORT); +} + +SHERPA_ONNX_EXTERN_C +JNIEXPORT void JNICALL Java_com_k2fsa_sherpa_onnx_OnlineStream_inputFinished( + JNIEnv *env, jobject /*obj*/, jlong s_ptr) { + sherpa_onnx::OnlineStream *s = + reinterpret_cast(s_ptr); + s->InputFinished(); +} + +SHERPA_ONNX_EXTERN_C +JNIEXPORT void JNICALL Java_com_k2fsa_sherpa_onnx_OnlineStream_deleteStream( + JNIEnv *env, jobject /*obj*/, jlong s_ptr) { + delete reinterpret_cast(s_ptr); +} + +SHERPA_ONNX_EXTERN_C +JNIEXPORT jint JNICALL Java_com_k2fsa_sherpa_onnx_OnlineStream_numFramesReady( + JNIEnv *env, jobject /*obj*/, jlong s_ptr) { + sherpa_onnx::OnlineStream *s = + reinterpret_cast(s_ptr); + return s->NumFramesReady(); +} + +SHERPA_ONNX_EXTERN_C +JNIEXPORT bool JNICALL Java_com_k2fsa_sherpa_onnx_OnlineStream_isLastFrame( + JNIEnv *env, jobject /*obj*/, jlong s_ptr, jint frame) { + sherpa_onnx::OnlineStream *s = + reinterpret_cast(s_ptr); + return s->IsLastFrame(frame); +} +SHERPA_ONNX_EXTERN_C +JNIEXPORT void JNICALL Java_com_k2fsa_sherpa_onnx_OnlineStream_reSet( + JNIEnv *env, jobject /*obj*/, jlong s_ptr) { + sherpa_onnx::OnlineStream *s = + reinterpret_cast(s_ptr); + s->Reset(); +} + +SHERPA_ONNX_EXTERN_C +JNIEXPORT jint JNICALL Java_com_k2fsa_sherpa_onnx_OnlineStream_featureDim( + JNIEnv *env, jobject /*obj*/, jlong s_ptr) { + sherpa_onnx::OnlineStream *s = + reinterpret_cast(s_ptr); + return s->FeatureDim(); +}