From 2741508520a55cb920492c14b405aea465e50b93 Mon Sep 17 00:00:00 2001 From: Joseph Henry Date: Tue, 20 Dec 2016 12:57:59 -0800 Subject: [PATCH] macOS static lib build target update, minor android/unity3d updates --- ext/lwip/src/include/lwip/arch.h | 6 +- integrations/Unity3D/Assembly-CSharp.csproj | 23 ++- integrations/Unity3D/Assets/MainScene.unity | Bin 78280 -> 75472 bytes .../Unity3D/Assets/ZeroTierSockets_Demo.cs | 3 +- .../ProjectSettings/GraphicsSettings.asset | Bin 4256 -> 4376 bytes .../ProjectSettings/ProjectVersion.txt | 3 +- integrations/Unity3D/Unity3D.sln | 6 - .../android_jni_lib/java/jni/Android.mk | 133 +++++++++-------- .../android_jni_lib/java/jni/Android.pico.mk | 121 +++++++++++++++ .../android_jni_lib/java/jni/Application.mk | 6 +- .../java/jni/Application.pico.mk | 16 ++ .../android/example_app/app/build.gradle | 4 +- .../joseph/example_app/MainActivity.java | 17 +-- .../app/src/main/jniLibs/README.md | 99 ++++++------- integrations/android/example_app/build.gradle | 3 +- .../gradle/wrapper/gradle-wrapper.properties | 4 +- .../project.pbxproj | 139 +++++++++++++++++- make-linux.mk | 19 +-- make-mac.mk | 21 ++- src/debug.h | 2 + src/service.cpp | 17 ++- src/sockets.c | 2 +- src/stack_drivers/lwip/lwip.hpp | 6 +- src/stack_drivers/picotcp/picotcp.hpp | 4 - src/tap.hpp | 6 +- zerotierone/osdep/Binder.hpp | 2 + zerotierone/osdep/OSUtils.cpp | 2 + 27 files changed, 469 insertions(+), 195 deletions(-) create mode 100644 integrations/android/android_jni_lib/java/jni/Android.pico.mk create mode 100644 integrations/android/android_jni_lib/java/jni/Application.pico.mk diff --git a/ext/lwip/src/include/lwip/arch.h b/ext/lwip/src/include/lwip/arch.h index 372cea1..598fb83 100644 --- a/ext/lwip/src/include/lwip/arch.h +++ b/ext/lwip/src/include/lwip/arch.h @@ -67,7 +67,11 @@ typedef uint16_t u16_t; typedef int16_t s16_t; typedef uint32_t u32_t; typedef int32_t s32_t; -typedef uintptr_t mem_ptr_t; + #if defined(__ANDROID__) + typedef unsigned long mem_ptr_t; + #else + typedef uintptr_t mem_ptr_t; + #endif #endif /** Define this to 1 in arch/cc.h of your port if your compiler does not provide diff --git a/integrations/Unity3D/Assembly-CSharp.csproj b/integrations/Unity3D/Assembly-CSharp.csproj index 84397dd..8f15e50 100644 --- a/integrations/Unity3D/Assembly-CSharp.csproj +++ b/integrations/Unity3D/Assembly-CSharp.csproj @@ -19,7 +19,7 @@ full false Temp\bin\Debug\ - DEBUG;TRACE;UNITY_5_3_OR_NEWER;UNITY_5_3_5;UNITY_5_3;UNITY_5;ENABLE_NEW_BUGREPORTER;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_FRAME_DEBUGGER;ENABLE_GENERICS;ENABLE_HOME_SCREEN;ENABLE_IMAGEEFFECTS;ENABLE_LIGHT_PROBES_LEGACY;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_PLUGIN_INSPECTOR;ENABLE_SHADOWS;ENABLE_SINGLE_INSTANCE_BUILD_SETTING;ENABLE_SPRITERENDERER_FLIPPING;ENABLE_SPRITES;ENABLE_SPRITE_POLYGON;ENABLE_TERRAIN;ENABLE_RAKNET;ENABLE_UNET;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;INCLUDE_DYNAMIC_GI;INCLUDE_GI;INCLUDE_IL2CPP;INCLUDE_DIRECTX12;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;ENABLE_LOCALIZATION;ENABLE_ANDROID_ATLAS_ETC1_COMPRESSION;ENABLE_EDITOR_TESTS_RUNNER;UNITY_STANDALONE_OSX;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_GAMECENTER;ENABLE_TEXTUREID_MAP;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_LOG_MIXED_STACKTRACE;ENABLE_UNITYWEBREQUEST;ENABLE_CLUSTERINPUT;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_OSX;UNITY_TEAM_LICENSE + DEBUG;TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_5_0;UNITY_5_5;UNITY_5;UNITY_64;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_GENERICS;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITERENDERER_FLIPPING;ENABLE_SPRITES;ENABLE_TERRAIN;ENABLE_RAKNET;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;INCLUDE_DYNAMIC_GI;INCLUDE_GI;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_PLAYMODE_TESTS_RUNNER;ENABLE_SCRIPTING_NEW_CSHARP_COMPILER;UNITY_STANDALONE_OSX;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_GAMECENTER;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_VIDEO;ENABLE_VR;ENABLE_CLUSTERINPUT;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_OSX;UNITY_TEAM_LICENSE prompt 4 0169 @@ -36,12 +36,13 @@ + - /Applications/Unity/Unity.app/Contents/Frameworks/Managed/UnityEngine.dll + /Applications/Unity/Unity.app/Contents/Managed/UnityEngine.dll - /Applications/Unity/Unity.app/Contents/Frameworks/Managed/UnityEditor.dll + /Applications/Unity/Unity.app/Contents/Managed/UnityEditor.dll @@ -49,11 +50,23 @@ + + /Applications/Unity/Unity.app/Contents/UnityExtensions/Unity/GUISystem/UnityEngine.UI.dll + /Applications/Unity/Unity.app/Contents/UnityExtensions/Unity/Networking/UnityEngine.Networking.dll - - /Applications/Unity/Unity.app/Contents/UnityExtensions/Unity/GUISystem/UnityEngine.UI.dll + + /Applications/Unity/Unity.app/Contents/UnityExtensions/Unity/PlaymodeTestsRunner/UnityEngine.PlaymodeTestsRunner.dll + + + /Applications/Unity/Unity.app/Contents/UnityExtensions/Unity/UnityAnalytics/UnityEngine.Analytics.dll + + + /Applications/Unity/Unity.app/Contents/UnityExtensions/Unity/UnityHoloLens/RuntimeEditor/UnityEngine.HoloLens.dll + + + /Applications/Unity/Unity.app/Contents/UnityExtensions/Unity/UnityVR/RuntimeEditor/UnityEngine.VR.dll diff --git a/integrations/Unity3D/Assets/MainScene.unity b/integrations/Unity3D/Assets/MainScene.unity index 212f2353ab9ed45050a1d4d17e2dc16e4e81d536..aec336874b2d9afbc11643cb27c1132ab4c63e8e 100644 GIT binary patch literal 75472 zcmeHw37lL-wfF5LCLsX{iwLODfk;9UvdR)nGCfO{fk`rCgMg59X70>1>FFN2dy-59 zX@vKTqCQka2#X1VqO2lfo<2=5_{2}P=L12MU47sNF7WX4r}_T>I(6=?d#7hI1H&iF zR8rGb|6BLecIwor+SbVYTNw6#m|1?ok0Hwb_gHC9PfGM$>KDB6JEmm@=&jQd%`OZ1Cj`A z!aD@+sjz#)%KK$JAL4BTjRn9Mekd%w0e%{M#A#jJx7a%ZJmDcj;-dmQ;e842@4+%(qXT@1_XN`OF#L>{&!jAdcvDb5 zc;+$AeJsADsVUo8%;a;mo!M+A*SgFvmGD#af(JF}b$)=huda+2+tb;sUo4rY&3?gC zU|~M%du!88>sr!H{_?hhUu?@~o4xkc%bNV0zhFguo!6W$rO%jlru+^^D|i=q}x|Frb}&bv?06Tst1ohV!__O+kfsS-+9P?Kl#fs zi4%bS6vd;pL$3M(gVK~)ay@fZ148VJU@Tq3RVfL-68O7-ksE}ok_aQ*mITIHp-p%p zeuTxyRW3fx;^Zn9Kg!}vx8Mm=>k}*>vhww`I7Pr!)v}6hvtj%o&!HIhz*!9d=fs!yFaW;U(54= z7_RXi7{fJQ)|(se$KYqY2fRaI^{$7G9!RHO}%HM^Tbz+1ke#vhPe?Qy|f0)4prxbVue)7oS0WSRT6#NXIgr#A; zOwS8&6CX^$Mp)c+9d+?BNXBs+56Yn;pKM6m};RCQPA8LC! zHiomF82-2zu6zr5Y3MBVa}fGYFEKygN-3Ogt<7ii1+U<>dTYJ3K#TItzPRfATrpGX zf~O&q^V0={Usg&NN-i)j$KIm4eQn0im6omR5`qCT@0`wbDPM@83kvzpTyqSp&y|As zEIpePkX@VKxF}un3z>A5X^V9q?W-52v-xGEf}d+GwJ|_8UGU@n`RQhVS%>d4!3@9L z-&pD_Ft5ux@}=5*eqDy1I=>~|nJq2#Te5yr30<#EMK^q@U(9Da83J#G!E2DWCchZL z!n~Q@vbJ-r-=6MZ2U*)$Ealt7x1~F6$h5YV_;^_-iPz_vGX*3Dsc-5;)}-XFM(v{0 zyyU@uOuhJ|ai>1J=8UWF=t>;HMt${=Xs5Z3L21flh@Lx53MC40G8IU8UW&g7BS6@A zC}>TmStcFnG*1M^@U%3FFNB+zsA3_0mc@tTmqx>9;bwU4?1@ul{J6!#PIHLY;CbaQ znRh)e>@)@cw#7}SnIg@E_Ykn(!p?y;oo2Zl#5)X)k?~SMfNX&8XK{9#inDx@*c;dOl)tcAAQB2DS~B zd19w2_)yd7+-bwJE}@OX4mGOh4&W?f=`|j{in|ckw@3oSmkN z?+u1xc@+oAreE`$1S)U!-7N?zea33+ZfazRia?iz?;wa_cjNe6Ag$)}#s}0V|y5<zh>?F9y2N7Y%cp`umrKe_^jrg_Rg+9d?l2N_H z{8^OVSeGf5(#RG3wfXjr>Lv3wcI0!&PdA{>NIbxe>E>o+)DeuRjK*{!-R`49C{jvl zszVfD_fA5C6`6ipa5kw-3grbm5qTSP^OY#OquPVavwlhPsN0a9+e35emQJ= zR6y7!O&?&|p7a6L7UwftOi z^A?wZli-v!+Gm(PAQgtc-G-<9(DXC>ci>CFnm)jUPk8si|0FEKN*};5qEP-G7|Vct z0N*1{h5lu@nRb>f@x|%&i!js<8lLsnbY`;60ocAe>PLO&O3S-CIC3`brRnBOXHnd? ztr>h-Hs9e3T$|0bul2HibE{uh$aiRqOm94?6RoeQkS`X)CYi}C^;^*bstZ1J!E~+@ zV#v>Cmt{8jUXwb~O--EzsA7#-%otD-NyD@`&~d-xHSHlf+-DJhYfn4#;O~6%{7YAT z^Qm7=`S~Aaq$$xafF-xwgwiM1V%~|23>QnTGS?EPc^KlIwL-2XqP4=Fj@*ntmDX3w{dTWcm{bE5m)_LVr0h(l?q*nRt{w zHJ3{CnLpBFye@swT!_o?bPd9=Y(#S*F0E9{M~3@?yX7OpeW61Qv=ua1KGa+!UMaUf zqkM=P&BaTZcu|(+^)?(e7ltXhvrBiG zzGrzFqcPjz)Hj)a%eFcVQD3aa0A{`KJ%vP|r04u1IpL8T&%9@G*O1K1AA0O&O7o{- znMRsOdxM|l*wdsfd8nuMHV)5NF7ftu46y#RH>DGAZ%W5)Zy!K=SZ~{{)80&bPI z6RE6p!uFQ%eg!(mA)VxT(@S_sl!Ekf^MNs65YNgZ+4=io>u2)OPt4R z%&gCsFs}zQ)VuY+W*@rz$4@QDv>u!PPTNhh)?agK{=TX;|M%!?@BQ&L7mWYeN`zW9 zgglAa7s${^KTsy#b3cGrdh7=%H`s3C{lM#~clFi}XnNxPfTm{@(pnA6{BA}2I}>HW zGGRZEzymFZlWo7xw$JCp+aPa#WBVWJ2Z%@Y4fX>PUiu%6HykZ=*SivBLnop)vLC3V z7xh)|nu&C(-jyhqna&7((YuI8SL_GeY4SxD7riSCzr^Cw4}>`KVCb+OgpSnvGUNBWB!0;d%vTefU9c>- zvBb;7hj^cclX99k`vJj+dUwFN%i>1{_^?Phj|*_o+g1N(KR}bfNQiXUACkW52g<~U zdp`zF`NwjWet`Ihi2l#I5PlnBMxn}Y><0uNZuImH`PwUzFY3iYXRk=Ujtg)p=NbfJz927+Vfwcrzl|1W zJD?%X@zfgN%G>pZrl*QvnfTC1`J@0#dPM)ydaovK?664r)C73K`vL-Ng=O8=!V3K%9>$d3 zw_wS)b;My*&S?G4Gnn9R{ZdcGtFR(hxs1kqEr6v_{6`jNe@{bvEAor+ig~}DV09S& zNgMto;xJ0*d5crt&?t^^pNY3Y;DG*a;P~%R4k>-cyWbGO7dtrH#e0D>{gh8MN?&Kb z8wED_HiWOU;VHLhD3@4|OM$ZD$kcAIMYkqmFFug-q&%f2{%sH z=Qy%eH=MFo6|OL1LbNGeEG0GPdJa4_s1urohUfd^MBPM$> zdyMC`*v!Hu#11Mt5wsW!#rP2zFgK};Te9|SsC-PIjUFlWOKth)#h6S6YUYHi3$2}; z*Q!l7wGmW5=hKCNBHaK^-L|jIc5#xE_aCKm8(pPI=#3An7(WtJgoun}l}h5?{f+UJ;>x321Jrq!%4;JI$glEmK|Q&{l_!cfBwSy`_^8+@r9k&U$K46wRdJ8y6Sx7;y4rub3Ul`vm6Gs{zR&b zQi%2v?3MeX^;65DMitlkQ^45z4uPd%FUKBx6)d#?&i>G7ys8C+v#qi|t=g+-{UMze zyh}RN`f1{H4l|hGt~Nn>Dh-&PPFT`O!qUX)j5SzyI!6S!Q6mWJiI5|Z+paC5XI5;JMy-3ELYFwzmNKg54v zacccC`Wb4p*B@HkX#FS+rk`|vWbw&Cc!~GN@H1X&{hkwE1({y3|(B~rPlA_ z8n0;mOpnCNPK5DN>-Q?eOMZ0eXuL-2cfxDDqVkq?geyR0W zikDiyi)*|_>vz(l`4z37^kvlhcf8Mfq}ETP_`V6jjn;4Qgm)OQiLm6gxeN@$@FxJ{ zz7z7N(fSQ8?Ooel%3us1ZFkiHE_6<}bZUUp#QD6|VBP7|1-Q^T+tQgwA~10}q1GQw z&jJ&c;S=76LE}@f)PmVIyfSea4rh`@1GYlrUE4M!s z;0f>DpfM4a^?oLalqEc70lkG5KP$k8dZz=+SbTMWM`vZ$1bB2-CQTfMvofS}HezGE zYYCQ#5BJUiem*So)kGX7J}c8~Fu~n?`2jAoGMhn%^x3}&{SlE-T`R+!ruM!UfTck`7CaG3?! zY3b)lq-?@R^3}ocDdN#tkaLI|8=VEAx+}QM$~+DF%vTYXMrUPSuy{#egLCw}+op&8 zf2H)SCyf;8MANf@xUtdnYz%Ojl^HWs!gT?6XJrlt&U9`f4x{pF5^&c0hY6O6N897M z44Wbzl~?BxH#XWHKVtE|4j-_HoN1M%jrP?Mj~O1zNOPIb&9U5b#_^{3mgH7&M6RB? z{01&ssJFpy;iyr)OYPP$v;HCrCT6CfCYx_shj7NjA@^de&2T$hbf5Av+RXwwS@R=RI}6b(tOC@{T=W zuQPvq-N#Ouv;DULk-Y;He=RXvJgbi?TFwJrp98ABK!88XE>}(H) zrHLy?hZsz7x3lG7S~>yw(xeuC4pumr_PnH_vklz}m0NZ`GMEl=@-gxE!OCDo1|L*b zi60ijsgx3z!8GX%E}?m4mR(d?o5XTU5sxZslZhJ}Ro0FPa8cG?fS={e!8Fa_5*iAj zY|1mDJet9Dig;96lfks$?qH6CX(|6V<`UZVNF3z=+c8aC4%8V;a90j+FfI9#$s`Q6 z%H$sorfIaD-hx03$HBA?&bC4+=Eo7l&0xA(!gFwTFF?{UgK7Md&Nkpbvp5ISG)n*1 z!13Rsyixk3^Rf-!Kpdv8%Bd)0y1YbfM%{46mBhiNCRMLcIIn7{DX#kl3NDpUzp&n~ zF5;6kv(}W!VzW5)PQ-B{$P8@*-p=}Q(@UwY@Y)93v1tcT7&bpP)hQ-1FDCzi9v(xL32rWLld!OcqjU$&s6 z<8(PCl+m=Rr93I2;53qsnidT|jX`fw=Cm3mAT=!-N@Oldu7#U8HLZk~>a#?{XJM_m zd;#B6VHFkQS354_5YdcG z{^`*}uekeLcU)Ds?^h1K>6bU1cKSG^>$fItgCi8yt@coZ?WX_jhV6sxhWs9mP(%|r z&f?l`R721aMA&X*6ECN2N5aNOD4f0{ead^!OPY4J4e@fCjyOjsf{TX3={Vwt5r)xt zKMpr>j!O>c+ONB6nz5>hrO~gy+A=+jWigpk%*vm(JcoUAc67rYV}XCz;>fyMOrJ ziHi4y)I7@mcY{FRC z#=!+rauA;h-upHVr87JTAEm=ID4pK66Dys)5Wd>H6QwgMz2n@{hV)S%rpIDF_cLgS>qPthG5n+E zUHOcQkCe`(7C(?6jJAv$;by$=BA61K`TY^R#JO;w<(x$NAA_Gf^KJ(}7WnhlPf5e@ zvMr_`4NZ2?gtOPR*zHwFbMPQ8IPf)N&JVwY#Qu3SLbSma(QfgjfR7KUie`S49WnPe z6*4$aB9Hw}=9^zdVsF|2HJzAVEy?^Yw&^$9%~tlQ`C!YOhhzc$C_uKUAzdBWbeHt> zL%i?RJvi!ttEc?;t=Io~<=IDmV%uMv+Aesy=H|QJ_1T6Wer@>&Tkb*`or(fxSq*B) z!gtj427CJc_w?-LXTp8}HtgwTp*97K?Kte|2RHVJJd18rct6TW@WG8e?gkj`2d10y zNurDfH};??OgU^rKRLLuXK-VWtQkZX`Z)t3@+7*@zdXR-8XJ3#gfd9|_e@wC)qi!v z$yo*y+@1U8#vYZo+-Nk@(pdwXCQc`9u zu)zd(^L1{3%SNfRrGFlYluh`^TGvMyK1Dpb)^$E{W1}0B$^kALr9KM!!+>1?OT+YU zLrj-g{G$RJoExRUi-sRABwl9t=;vz}0ZycdN7M5!#Ep%n=U)R{*51Aj`V99mSmARi z|DC{@&dtPO$hS<-y}-#=A17EQ9^EMQ35HD(kIK)Bi5nZ0pPvlyg!c$&<46WW|5Lz) zezd)OI>4jt<=+B4+FmXR@MwGa3~`uvd-*KEGVy48`5bYWcze0jV1m1R_4xpgwwKFD zq-?@R`05J`pCTS@FP9THHrigU2=Hio*#ev<-d?UGSSB8AFIN$V(Rj7JTx~GH-F#gW z;L-N-MG`5S@R59N1uXfB^5-_<#zy(`+5nHXmoEXQiMN;Q1U9(aUaluz?w+161Fn>w zuMjsjnw}d1JlbBq3cON#`5JMUczfZzjHD;pUT$L86vIc`3uilb46e z9Mi49JuhkE-G-QU!8Z){HduF0$qy|4^%(v`i{Bo@b-eJ60GIx8D2OwCcfe}@xDxRm z1e|kT-y~ikJ$C}Fl%8+Ja81wl7_RC0_W+mAF~=ib%B61u_sWbT`g#3#7(PWjIv)QI z;>Jcl$NX-9%Y5Dx(8qsswm5$9j_4s(7T-Y-M)ijV;H0~gV0GVTs3UtnBc5<7ZJg}q z9NY-X-J_gGluf9?I=Sx6d=qR0m9>6;pJ_IU;x{;hN+w8~e4Y(&7WixN-6t0N`AI6C z)#q@WrFB>13*ADdxDMa*a=GGUA4m753(fW^zXi3YnvK{Lu(lOp|1&4gWCtzEtTET2GFxUakyynl3do#PLK2!9{Xk8&<74FTL>KuGyD-1c0A?Qc(?oo++_ z${A|*hB`al*Y#IyT*67_N)E`R3k_KQv$-gv=LKvkVCVW@FDB4U@$ z&@}8?ds@Qe^PZM4Ri%ZdWEucfGgqZ$a@a6Pf1pmH>}?5C)3X=igl2$Pqv;tH;Bqn^ z3!5s{Xjsonn((ZI6X0XoIqY@u6X7E+OPFDJE^iWlC#)NOE_}qfgekb3w3dR8v>CS> zUgO;_hHJdCgxNjb1A_2EzY%`YKQO>$+q2R)OPEf6l|IYQO^@d5-2pBq<8ca${6i+S zZ3KrpcyA};X+6F-2tO>sSMLjOIT^1Fe&+Wu*o3jsZ|@FwaF;)m0WK=% zIq+jyUp!4aorZLHw{bKRbL_|oLc+Vn)&7~(1!lGl5$3@6wU?c4_snXs> zh|(F3ca#NK)k_OT+TniuBYPw-q5s zsN%~lE+Qnvn=LLPB*fQS+=!5r;5@XFvpZ~>B0`8qM{6QNh)0{Ih!DYf$IIEs8`CZ# zgt&~NwR|W-q@1N`YWc9~YJG7g<*Tr)U$T|f3ulu#Y6Lr(e$K`3u{cGD(xIq$7=EUQ zB1FSKfi!A*-s9kIy;Fp^bp8i^(xC{UVN-VLxFW=*6N(VwpO^41=_Fxk;&jFuOmLTu zh!Em3`sLwZEFb1W^aI(=as+VvH=n$__%w@)2q_yn4Je0GEY7YzkrJHwS`D1^$2;_i z^AmI8>;jekHsGJO_|Y-^T8mF~@NWR)4tkcuBv{YH8!gYtL3rtk>1Vq>Ccs7XK5gl% zF3s{uf=~VgoP08s;Zrz_3g?XX`v@5h7K){1ZRzIx25xt;`(Hv}QJ!B-uEg$`y!o2Z zoKeJ3nW z(Zt&(8aW~pzA!;6aY;+NuiJAN4R*g_&}l;8DgpDV>}FrFl9`qLxUyHLI3JhSU|d?N z!({{JHW&ur6%Dw?ptOLyK*HVj;Dl$U{q2-BM}6+I&pfm84|h`)p-d#N z(6E16EKaz{<30CJ!C#4hbpOj8t`zNIn@1K;8+dq8( zX{?83{zk*nsGL$dd{!x6?6U7SA&U)zu#rO*D!^Fmzdvww1NrEk<8gs;hO#C!oJZ2ECRl~Lnl zBdW@S*rz=8#qeup({SXJUC1T*#$+rLwR`tNS3mjV3of7W@qfSScRT)m#iKu=GB6J| z!N)LUYF4V6-k6#d-V;+Zx=Kt<;ocvnRyuK}RyuuUYNZorYNg{c^-QF3E-WiQ&eTeW z&l1K;V^uoJ)Re&ZREJ;p^i>5n;rO1ZSxWFMB0!yW-B$kKhaNxo?w1}}zW?6o3y)w& z)q=>GcN*5&wc><}>FQY!u^fAWqp&f9g!>#OqAy^tH~EPQ1>Pj$3D2ArMqh zu+CIaP!Z8j`B-N(ET5IYsR&Sbu+BU$2~@^h$HB*PVB2t)J9KPo1d$V7$6}=AhM#Te zP!I_&3K@Be^g~5i@RKYaD$0T{wYUf((h~eEi;ExZebh4@95 z4m&s+4gVRqnNBLoG+I8_!A+csGL7Q5!cCltGL7PQ!cClMqEUPo+{8mgIpN&~Mf?F^ ztgFLdX&9dMsQeHr%F_0fACe|4!%K(qsP&J3Wsc{C_^}qB6yU-q$6I`|!5O#U^%g(I;N<{6&Ejkyh|V)ARG-BddYstN zBjH_sP;z-_DK#)$ASk*U!}B6R(`kvm>|E#*D$vg78+gTD0_fZ)=v-b{lSxx86@^qi zxQ@~6S;vF$=E6dH11~m|%$Yk7DSV9szs@#zMrrO7c0VKwwaX6K($0H;g3cFTo0*FZ z-Rw(t>@`Fv1v6fdawxE{hj|ZdKJle_`(9r4%TxZba@OsCYPs%(b64G1NZdH)>Sr^F z`|r4tmAe%dbu_pdV9G&eJt_%*HoC#1=c8-m6#hCI=bj4+9i3=JTgS8LY>t^FNfD3E z=7h5(QTpL5iLC9_3xP5HN&Hqy|5(74 z=u`Mtq8|!>p?@mEk^VURR-#YgUx_}2egLQ@fHpKK1i;M7=@LN$| zpR{z1@UQOs-URpf;p&YU%11qV*m`B5SWY*hkmRj{*}!YooOwG^KF3e(mif3qiTA=T z^*j7D2K)TnhNmVMns`wlZslND+@xg08ZHCA|EbibD<59*aMQ&nPCNR}rr*Bj^56XG zQ}3Pq_)lM$w`}R~8nVGTHfw{6oMCkjinXZNp-wB}D=HRTvBsuEot!#eT&LyxY;NJ? zujr5zDa);ww>7v*E5Z<+K<$%OO7H z)M)X2@#{`4>6B1>%4xX`zn=}yDTzN~N(FJ7c=yLI4aN61q$dwI;|-^r1g9!SJe+b8 zylC-o%1Q7pi?e&BVSY)!3^(bpd!|wR61a(n-Lr)MqQ%)g(=dDk=-h1FcFHLg()l)U z(g~-WgwDMd*X~)TW*)LQ>zRh-z)|8eaFdRVI#MRyClK%R7N>eZ!}R~A1AQESq`&+<9{&aq~%j(amM4N zgw8gEUkaS`#}kKPc;cKsCO*NSf|Gt1aQwGZPCPk)AO81e?k9_R7R;Zta)42TV={OI zYR;Z18{TOXe%HS;<8NrhavZM~^tfiR!CZ;nCO4tyKrPvn&2%L3J%7&kT4LUepKVU& zTaxQR#RHYLe5)MW8u28HypWm4baa^8)+_Pu*dU9oo5Otub{%G2OyD2Ab;M)L}62Q0&|#%bCRfRcz|ZvNKY=JgwZ zX{*1*Vo5x?9AVx8d#lB^1DlMn!-3sqvFAXDoJ1)*`hv3nrOHI5alo;CvEMPL^o4C7d7v5ifuD(8 zWwFihbRb@)@0tC!jKz=l%06MaJZrHIhD6UIbd1_+bx#F2utdUH;_wVw3GjF-z{nBTb;+YC(0ugYRc6qKefWwB{ThxB&L{`ASD zcN#F|mz@@S6qwSx%VHf9Lweu0Sb0)N@BV%M!_d0{*ae`=^gUp)X_Lb;eb8c$5<~rt zM7aO57*`E7%|Ef&B~!yVj=mt%fZ*PCU|Q!BEtZ@Xrul@czOmSZ1EzVKWw8^chv81N z*n_}S?tai>JZJ<(XyooEYW{Nt=}iEpdArzRw*k|#`lQ7cegKLB@jUQ1bQ4O*wt%TGP%L!`GEn9}R8nD@bu-Z>V#9GIrBV6g|$2`asB{$Q%1_X;pA zzdJ2fMoUzA`Ynr1n;Xj0?H1df3VGw-Ep|_J7{@dJ_G1&ri@?r9+R1;2-{4j#kK<*X64X&i|wor%VmSb9y}?` z$JFB*&H`EQ6=2G1(=4_TEmnDBy2Zwzg=x9Wu-L*yA-!vUcZs3b0qkFFn!jkVSAbmy zjJ&qhVq4J?HO<>Bc0*&B=4&ms{gg0{lg9721|+q7JCJlrg@RY zrY#TY?P#B2=$!^k%Xz28o&%=*cbCO3M{C#q{QDM5o))Hgm&K;73gejj@G}wzFy)sj zi#-KQ)10!{Mzq*E%YW4t+j&Mv?|bKbeJ#u2IbfamC2#Do*cx#94e%cTyVGJL!AZ(j z&y8N~^5MU-``s7gmjqS-&t%SQlxGAlygpOVH_R6&ciR$ zx71=U0@M61v)JaQFu%(!_F!{J?+Z(BY9+l_fN33FZn4eC&2@N2zPiF<(-6DrqFXF> zLR*;TD=oG#6UH&3_8}8T2e5NMi)kKdvFCtkn)k987skffIvQoM8`g#Nez^H2gn-Tk zO!@R4i#29LdOxz*bHKEJ`#%-SQyZobJKAz7`M9LsPfT_Itjl~vT7`C_HTI@w& zsssN{F$fnetKVCU2WDv5A8_(Uqym0mT9*e}Y%4HL^Sdl|!sc*{bCAW_APkh=UZ92M z=-smY^q+9unC|EQvG>o_eQ#><5r9mXU;k~+M0I~*|Kn5YZoKp}=%pmgeIw+SV$wN& z-Dq&8jOCx|x|L4D7vAdp58wYj|Dh$HnDw8(7;^15K7}%cnSI6Q3O{+@yeGDvzVhh@ zChfmUQ1b|X*tx60q7r81oBZO`P8^}ywR&wQwk~FJt1-)gTJdDGe<&dU+!)|BU!=VIofCIa{FslsDx z%T>(Ss7H>REw5Zw`>}&o&AqMAHuuX{UIe=3s)si|KL^j|j-Ni#`1ijsHRlJ(X>*SL z(7wRSphGM3At_d*7>lP;3h z>n~^tu@t0VjfspA8Y5|>GhUQ@1@G|#nr_e7Rvp89rl9fF+;{K2D2u=V^Sm3sHqpg` zhrKzJsdUbWVRc@JZk;!x{9;x(c{UQiD{v1oZgy&hvzw73=mvKKbnYtpAS@@rwQNIN zb;0O+u20`_G2>?W(e`RIU78R6YFn@L;*aiGI9DzCNZ2bgq`qbxzuC$Cj4zn*8oO=*`S!O>AO7-7omFZnGa)|%8~0yOW**8_=<}!t?9mKI2w9<$ zIezB?Lo?TA&#W=?f_h$!=2`he{Tdl%rpp}h=ZE9DE45{NP(+d|soLvQkG`-LC@Jvb`yf$GDRUkQ1a^`vF<&+h-ot5+BeU3EP96&VqxvvQt7 zRLdhoy1P{FXgg&HU0b4C*PiIswJFLS@~S=G-SFc;=vBHNruD#I9h1Omj6UPIMzNlL zE78-jO!OU&0musr>mX@i#fZ$l`uNx|TqxzbV zo{*RK$j_QCEpPt5oyHT?SsMKGdS4YicBXwWT5i1sRk`c(y{?7xJzXoOTi4Rbdz?PW z@Eo>fyw$D1Ei3~je|2r2afXIG$jR; zt4^pl@{6hWxGrZtyO_^yPLrI2{02~w%k>&(i(i=`qLuhS&KIlEe2TwZMg30HsAP3>GuDu>#@iR8<p36*irK-rB&v! z@?K2_pGWV(XgT#3Ol7FfxiGBmA*P#g)%orDf#@T3zq00saqB(<#wF&mT6OjGt8}8z z%T-$r`9tl@KR;mKR~`$;ue$$`@9CJ;rJ-%j#d>mU-MDjPx(Ax?=pJdhbq_V$DElI; z<8WCiSXCN`vSmEFr8@TEH9eFVc#n2H=z2h$m-V^K%>;CI^mkmN=~DXq9n>?!(p8t1llm+D zDu3zsGz_EP%+Rgh)R4cp|E2?2~EHk77F_<4dbqVDHi?JclO4d z^CjQ+%2)21`HkmyA&mBA(cm$krpx88-sIHQo3nHO`zJH1R$uYOxwG!LXRf~Y&mK3k zZm%4G`93X=STRMs%18Pg6(8!iQgrLLROBPh!&p8_PMCi5fbbII(C@nF4o%zF!{~Q$bnAC>bnAC@l4eT*wKJ@b{;bMW05UQ(H*I0<{DZhu4XlXCgujkt%2^-UY&zYK&PtmWafiEd8Kv+h%2Tj$=$)uoN4c^lL19XLt85&nS~Q|q_3 z(M0sz-Zh+#p{XaujOrcoTV7!HLSip|ZC}^JwQq9Q;)CyX5t*(BYybLstaIqM#nHU& zxmU^PRRw<%{rLFWMfx&q9~`4Cb_E z^|?KgmZnST?}_gy#~=F1(z&#B>wEufIZj>6U0>65?P-0D-vFKN7xK$9ej&+)woH?M zVsgp+`3?1p=dpnHV6^;t3#NRiX9O^8a1H?6dQQOWDfjfuf@nJT%zru$5`EA0y*9b0 z>C*bz6aPi`$GrLF9{c}!xc{_}EaB^~DO0AnMca#8%dM9n!8u2ImITAUW8&}?G>BQxo;_@3W|L9ZKr{&~g zakt7fcZ{g#hcK+3FYV(zs!!ihfAFjQZ2(kqXu96&{H1dn znolW_R0sq-U2-@ zhxrvxpKJJvznWgHFaEyW_946cp?x0W%yk?n8cU`;aT~;hS~dXdw0> zYk5SNEauUE*8SE=&%9z#Jrj$vj`G);Pg;y4LkC3W>G@oYFEl;NI}M|9jdR*DqjF1r zF`qQExOG>5=95TI)8)#w-sVl-sPmBV@vD|qT%Xf?%JXv7fpE;*I3;=PamOA%YgThh zOOro+#`Lw*_5GfHwcL7oPF(w2ckhv&jmGDCb{gG!wi?~6>(iIlcCPgYW-gO7^*pzP zG4ib``8_#0$;bULqQkRI+5Cb3Zf8IGs*I*9^0KLQ~H-$P*MvA*X( za54=C-R*gov0dF2<$Ve1?wyOi+p|yk!u_^S&#vQJdbS1AD9NA!B|k@xhx_4;qN|Gc6C6O;1MkAa@Lo;fA=P=!XW9pOb_)aF>>KD(9 z7I6iimRp5K0i^w%dp3cdd&)q1E-Kx6ZYp_@x*Pht;JBxO=l>Yp7~Gt!99aa z`?)>tDIHh$%FhZ$jqWL$>~F>ynx6Sk z`!u)h==sBZU;937VDKq&X#2&qtk{uGP!E1Jy#kf1l5m8To|IZYF}Zlj@?`Cj#f#_FE}w_qZ_h@{vA2-g zm+2i546AoY(9N~tx=aB_34{OA*( zOIAzYn5<@6dEOxnpWkn$GKT-<$ily?**1rE?d} zJ@mJ&3v0vFEl;NI}M|9t-=6V<(B-GFM>XFT-iLy=mHq0KA<)or)OxG*tNpKgKCj*r#qfHM6y18yl+I6J9)6jh zYqmY`!01SfNAJC&J2XA>rSgg1qr-QUN4Xa~W@0@02YkEx_gyV5e?!09_cKUIQ`4#O z^LL=;5sw|+0K&*^(_ zmU)1%+~|szfAp#A({ggLxLf&4?;hlHyDW6`VUEhe8g>Sf6p|U5IptCZ13F z)k-Km6F}=Td{5scX_p@>I;|sdM@o- z@!Sb5kBWt5LDiE~1`yV}BCh69@D9KyAo59Re2yX@FjShtVu6JWH&d`uIT%)`d zelOvkiR;Q=)tNM}4i)7q^SkAcljYp@ZyeSyyo;Ffi4S|1e_>9#h6k!#RnC`9fw>9v41h!IN?pw-J_b^gxz-=;c;};2xtU zpNpa%=iE)-NzWclrF7_>tCe16I@uTO$tc}uxSr*CG+g()IOESO^!i<4CmrL(SW_+R9bADAns?bkaGTL50jQ;8N?|Z4CccbQa;i2|pVRRK- znl6{mdXo=t^>ewjJSr4b04YDY`$F{YX$I0g3*;x(+dz)z^nPr{6Pi8qk?zUSdJf-J zm-3PE@96J%PSd6I`8znC)3ObJwVXnvyG!{?+de}Ccag)bca@XBXd8JRC4L7&&({0W zLC!Hf^B3c%anH_l$D!``^6t5at}IqvTqs5Usthx~E%QC-;2{`mL8ix*4sbZVw!w%f``{uzciQzxqtrCpXP4cy4BvF z&XkCp-Ezeh*w?TLJlw%GaG0$rJlny&3^WFE{ur5HGMlVEZPpzQJtt5Fr{+8Q2x)lg z%XMDrgLU4{P0$x4P4XKJ*&m0FvSPzFSPjd9}B zc)RDTdwx|0DbI)RdMabg@0MBnVei7hSVuXmZp$IZ)gqiecV6l4)O0Do^0&ACF5XY8rn3b<-P|=f*_ux_!CCT?>E!xMq11^DOuC;r zT{>~ps1-%TglH73uS<3m^6N9relt_hBv(n(3Hk*D+YqON*jMpUbGnpHZpbrwT>G8#37}Jn8lmj4PAPW`~xh7wx3T=<|4|fbuGq(zzzT zn9NHtwL;1!^EpE?UMdB@HCxBCclvLkv-N+F2BLl4T_;9n=VaG`nje;S4Rnj+)%xkDdp|q$bG4;Pe)T} zJ8@X4o0B|9xbnU8p846I7c|rluQ&$b*5fY1J)+3Vp6Yp7 zJoXm6a1k%^zBJU!-VNF?Kn$mE{`I^kfggb1A-EZ~2(D-GBZu-Xrc#%i`vkm{lh-b5SW{AW8aN=deUH&Xj zJgRV;{}BOR-;~1e%#b!uZHd-mEI`4Oz(S% zgHK&uCN*zCb1aigE$GbniF7QPDDm1>FO0?gnkqQzqM24WRJaMJN89|RjpzDJ8675- z&NTROc>QJsP5X)FCD9GBmS_fC7HsennKa<4RJ3JTYsyczCgaWC-%toY+I-rp3l6@n z^fzbzW5wLNUs-$epU+=)TdL@`(Kr4&R`kQKZ=C|!w&7+11}l}W=G&lrgO#fPm5P;? z6^oT$RjSR@E4R|BN>xqV<)5omu2Ep6(v?sfg}H{ms#FE|vymt&!2j5QkISD%-sX=- zmHZL>dIk882V98%am0&pBVD%9IX=L({Aa<>{F#8?Lj2#y@CD?5Kk)+mCkA+tw;hIb zE&Mb(lW=RJrtu36eu9Nl&p!b_>;7coFkXE%Qf;fNld0IIWFixdmv_c!d{+3WOspyJ zHgq($#WEEgnM^VPYGpLhxBJmdl^>6G!M8A( zYVsE+n>*q@!*1}s*O7O>=sxwuRgrBcPTX|)EjQkj8oyutqEGoZo%fHkR{VJO>X#;b zle)+B585>8SPXU)-cCoMuXW)K=w$V&_davYub%nR)6@2wymjR3Pd&5j;xQXnt-2su zePq|Xt8V!R?cTIOo%9Afuex*m&vagC=V{+)=cV)7S6xlF`{+Ra4>b0>RgaJS(T&r7 zdgmAay5ij9Kfe8#&#V}F&@T^Pweim5yJikMZ{+>peiot_w4#Gn6zcNUKclhK*4emE zvNTqPTV=qg$+VC%3_BgpRk%4kW6x0Iy2mKP^<2+zsAmt)*fZ2Ur6C^qut!8b>=_o~ zWA_YgKDnNu=F?&LM0(&e9=MLzl_%FT)O;>AeAqKAB+rB%_^6&?G3%oqUS5rG%s2K7 zH6PW}^KOT?8aI1}8Xw}VfW^2MUJlh+7G7}#T!yM1<8FA#hdsk03xCky>>1kl_YKaG zqm4go@Tmc=<9!5v#(N^}Lh-6ru|T}j5!~i4@y-b067S3a*YRRXM#Vb|zlGwZKHB^x zz0^?~mv~PO;S%pD0j}fyBm7J+rl$(VI|s1MU*hG+#>ORHPE**p#QT8&AEL_f@9?u6 z=i!!eXG?J~3^?)m0bb-C3v4p(3BXDMe26y(*h1W_FQozQ*1Iy`h4j2Uz%`$<4WEi0 z_*4er-TG1$;F{05hR=c?_$&;F#Iv$r5?7d8%y$)am z=4q*iXX6%qX8w!){~%z^e~4rMKNR3a-Vxw&yy0_B4}3lxgm?L@4)7w6^2|1T*7U$9 z8iaTGGzPe~+vVWH`q&ik(fCq>H(U4>7@>a_79T%it{* z&XNA5z?sjj#G&lM=UNj!W`!r8+YNrMg?|Uw!?;F?8vzx;8X0_fsFw^T!k-#pXJ_(Tc>NdcM9UH zGVyj1*YT=!)tPi{3c~AnC0*wM*Xb&D(sh1-k5K7~8vYlMkK$kKr0YV4ug2}|@1*OZ zfY1I;y0QVT^Z6s-&vadkTc>M;YLBim_(v?9GlbAZr9YPtFCfpQfD6gY1wS9Zk$a6VyC68<0J`PyR3smwyYwyY=NWL3p>muwPlI zzFZUFZhg5n;P2L#&oX>9ZU{wtBJJjN0Ux)%Tp!?Wec3|(DqU`U*-Csf`Hyhw%MC$z zx4zs6yik3)DZt(O@;UNR{N4Jpjp0?g-1@SexRTSYFP{%^x4wJMG5`tlXxijP}gZX>SbaqG+NfD6@^uM$^$-1>4yfETH8 z%4?`E>_6X$Tld>_|8_ULv@>_%*8O3PKWOl;h4Aki{O%C`u)*&MaNQ3X3g)yMU&k%& z;|l2QSm2cBUgE_OgmLBh2H-;Spv`h{k!ME;7kU0Y!1YSOM8wPX?wi1MKD#R^-(vV` z+@8CV@@>UO+;q8kWz#1v~bw$Y%Or+&o1IMeP1caEmLAb z-|=8#-#4qBdTBG-827o_seMZm%iAqaRdOTO5rkIjugzHA`dCXV{mW8OEUa=_!K+Nh zlc|b$vS}S~<>4yDl4Pna8dqK~<+XT?UKD6G9*>iS->gYkjm0u*I_Is5r72!OR>2l` z#51w>c+5|M$HHi{U)7OPE3#fgdn%Uk8#2+150dTE%exw3Vy&n(2+YJC_$6`!lqX_s zDw<`fSWAnaV!8@pI;|#<8&wW8apeGsEQi!2GJY!Blwk(Q@^mWN-WqFS0+vNnEq>;7 z4H)t=zf-MS^S3hD)}BmYg_;SAN1J>uPOBWN#PSjFWnJyeB()@D+~sM+7)!6KY>hH& z7x`U{$!MzCP-|le-#Dvd%~&96(a2$+89=)JiR!j*3I$A z(!_#9Ggsz4EJdYbh&z#~jK<@qr;;61K^IMjLNQJR2FwNi3AsgkoiQLU_A{+Xtk<{s zUU{meqfN1IYGtCu&mz=M3X%tuLmk^1<6TU-;>9e>Siu*@lTq8>kV(Z7EmnYvWHN4f zDYa;5z;tN>8JKACb9sY&?C>?n6}rl3%14=^Zqd_`&LrC$NLNr)KnX(~kmoAmvBbK1 zT`AO4XT_Q`t)SNX(dMOzc$fDkOy2EZ9QM0cpLr!x8=H7p=B;s`95wX%2k!g&4OIu< za^&s5xqao?6JUY+!uQ<$UZ&Sg(A z_)++kCXzU(W*Gix3;!jWNKP@Jhog4_SzQGVH5vZBxa}?khm^#R32@y6bLdF?ScNkU zTAs@dKF-1^|4jyuSUBZmmy3MHhw%Fieq0ED!r;dnyswK&ZL62Z8nE)urFt5*dVj5- z^0D4u7wh!nT;E@wfN@1T$UqBWot5zjg4O%!WV}N)+MOQP{TrH6zMohe%`~+dmddS+ z#nM!@ZyNi$)~+;n92o8kVb2<)P3!d2RdqGsROPRYqLJ1Or-8Z>(Y9EVE8G8r*;%t_ z_!(Q@vwhT-QD-k*QhxO}K0kB*Z$A9QMMod{trN4qyZhN?EWQ}-BHV*!XVC2YGiHZ9 zYMLGD(vi4j#KG!Z4lk>%n4KXAH4k`$!E`$%n??9@bNjiLrN9+C9dLirwLCCa6L`BKja{|J?? z(ZHFm8N>~L8eP$!nSdo;dpp3a0N2xm;|>4WUBFmI2oCxYO$8#FaemG+{-67kQrr?=RwJIkFy0 zymmQO1>s#gupq#7UmMGeS?2RX+?tQBr+0uq{;Mq{Qcsx=I}KjV@G2iPpGSd{51@e0 zc9hpI41R`%lh1DrAKDw6&ub=ptqI@PKDeHIKsOolCeb+OWyB4q9*XCtyXvD|P0@75 zOi)yIn0Wv*$j=S^!<5j>$G>2H1Y&axA+r>f(Y(U7&76!)*iAVd{#CeXj&oxZch`^}n@~U9T{^m(MSO6#o-|`C&}`g` zykz%u5^mi+9o(&_yU{uyWYte~vx*~1ueKxKWR*>KvvT;u$VTd|?q(4m+^wg(S%bUv zBp=v~9^9?xcDq-i&glHn-Qs`sZoSDv^stRn>3Y~OgfB~b)dv4?fDiS~1{O2;>Hv3# z!D|BC9R^2R=#&j(y+7<>V7#mB9W7aF{;!$N1nh2t6Aeen+5eWBm4t&GQ-*7?oW zIG(`2e(=86kJ?!i@BHz+qnAC>eR{0rT3dQ|qH=J-LQl*NE?8*& z8CxdjW2bL2<F%^~5); zbU7m}wE&CE2;1{z2(I(fJ;7zU!TZ|d9$bhqTU`Hl_Ny+$9^$HKhMTwpr!E3|*~RCt z`Duu4Qfn(f8Zuqj%#4jJemb*IZBAPpOBnj%Xs2kPrQ4N9e&^02Tl6&E3Z_f z&Yg4E6WlexAwDbI?ND~C0%xhz@WMsq-FMEqdlJTG62zwbup4FXI{~emaE(u=1o9&ynL7?c3^<(X&~u*9c1D5YX89juJf7G z%;e9wc`^Svyq7cZ4k4H&?xyQdhAkuRrfUpwb-TvqumIQmxeCvGV<)r_f2N}l|09U2 z+vU$rsK$%D?;?L-2UVV_bR8JS&@xml&LtP2)v;TQXY)FL|rVRvdxK=r^t;URBvFT;gSA zv-wNBtZX*_I(W&SmCX(>{8eQuz@L@P4ln#!*=+utyC#2K*|z1$uSR@c4j1`#Wy|5h zUspEbMIMc52E1t$-iu#t>|CS6%BFGG=p1X|KQzXaaAnEr6(zTj<;}|&x8QiTWB`JPd(v?kK6Y9ZWL;h*acpn#M@SU@r!%NH+gJ; z6<(J#FN7Jt+Jr8|1vpwRRi0>x`|0YKYUV3jWASF}UPp+9IFM5rnEGTgvoyt*mZ&q2 z|M9JbyQh>L{o0USyElIHV+T(L#_dk%c&dx`<8tFhGE|QAbTI7*gzM>GT9za8V<>LP zSLPq>6&q60G~WBcw8Ce25MIwT2p`HIe0sAV!e@VkFIP{vd~%JoUMuQpi|ceePuZz6 z(sN&dJfps|&WG&>M+yv2`(bafWIZNM`(fkk`4cBE8((H{+7IH~SN#|0FXC2VmHi;i z*qfvYuk43~uQ#}|9~PcAxUwG>&b0!{!}`FBdA;59vRSx^EBj&LR~el4gO`N=9NY}A z8fz#3@mlctstRNFUX+K(cy zO!0XZ@xEwq+7Djj{|0^!L|tInMsV{Idm#EVUSS%y^;z2w&4>Jt0UyRo`@xI+iJxfj z2^v;7^I4Q~U8YDWv0QN&6Rcanw~^Rgb?*o0{Ss zJO8o89 zK4H5od~Ca1i#%}ba+%JDZK&rbLw@Gf0l0aI-d8HOvCCx|XFr7Yl=-Rpbt;V84^jO( zg}eO_+GSoG6fLm&A*x@eaNQ4)bg4mGDmQ(lZh-*9Y5yMy6t+Un!#z8C0^RC${ZlpPfiS}_oaSo8}*CgU~^R%C-Ni@freC20PwW)&dH?nJq5X;kkE#GRaOC=js z5WF18)81hm6|_7ZZJ{kxp7KOft9pY{b!BT3>dCgKdR5(QKVH6q@#y!vbbFG&PURufT*D>^QNo2g6A|iQ zqcJ^(_sKZ*mX88#K#XWf)X-d=dv5^U!KRW|*0la*ZmRgU6Q8So;kLT+F|43JW?|vx z)gMDnLq!8c!@xrKvgG3$hM~mEh`WYi7;#+0w;97g8TL~sacy{L5Xhf~oL87X4LPqc ze>N7ph*L?=g>+PW8ggE8JBRNyxb9$Qy@nO^&~ThU;qg5ff+E|#ZK=zXYKEp=Q?3Wq+rpdMyd zD;iH*j|4pwO)BvMpdz}?j=C_O#!({}S!NWK!$$$ClbC$wyUJ^E9!Bnq4dao(CvJT1 zk&CaJb@{*F@Y2q|U;orkSSSl{vw(R~`A^bL^_PX-Q!j>!(NiymaWV6${N%wxp;A#1 z`_qdNKH*-B@abzWM)-t#F~VmgpQ8rx7XslxqQ@saKjY0a*S!BT|MvXzEB^EVt-%J|%G%(U1-1mg>dNZO z?y0~ibWa6#9B73KYzpxH6qxV{7ntzrYk>)$aDfRQyTGWhHMk2EnD7Y~nDCJTql(rd zFPDK&5pHFzkZ{4JTdSr6P%y+fow&xttGb=V5un=ov;b#*s&1!+#|*Blm4&Y}xUyCX z*ZkXnQ+92w^7(6PmBWR1nGY$T{W+TL2YZ& zxpRF~8?R@}FtM)RQ92WGU-!AkudO>{?9(-C{Cx>Im7*LhK+PtZ=di1%!Q zSV}!<^aRifY4nM}`=imqC#=!Jr>`0ZP~7@#H1xtA~H@s9j&bj5$7wTygX2PmWW{o^m__TA>_gY4#__ zg-5|T=;}@T=?uM$1D6+d<7}l(RUl(ij@AppAQ}XKOcPb)##HWnx^|>r?WZX z_6eqj7jyew?cAe&(;_L0gYZN6Otr2LD}b}+)9R@HWpMlEGP`x@pt{E@~9x+&_eu8l1Uphp#g@^;>YJYc;$~7q!&$ z^3!!7Pz<$#^h&yD3v67{rSmTrUed)lba?&F{(AU{DT{6Kj{sx3Xt8bn5-%;bjZ3_= z*fuWlvfS)=FN2@)hAnmk7~`eIw)sfB>RVmN+zoeC|yNju@vn%vWvg3t8SAD{(c zjR+3{Sp#VqNMkMGzuvxmDSQ~04y|jn@ab!RK=`nQDp#CbK6~m9FmBdpIn{x+(Qdhz zkF?}$q3or6_HLQhgK*m|?;L}x7D~0S+G3w(aPqRl&oek%D2;22T4HdvP`oJTcF1`K z+>BR`DROwd!PS_;vdkYgxE@pJ@EkX6!p+u3w@}2j<&k_i0yNtqT?#MbJ@e=$Ca1+n9P@2zO24{KlVtVgFi|}o@SthE5Qn;3r;mGG$g=zk@ zSg;F#<27J(ji{Mv!T#v)~OWfo?9yc$^2jR~a3e`yAHh;EI8rS;s8~7>D1l+u2 ziS#dU6Q^9f$e;C2T0pi?_7drEFlBhQP`sqv4>velC|-h3G`Mb|vH^aI!F3Czah^C> z1)TL%w@}*HxN4!iZJwH-?eqLc{y`!+LkE+{V?$}fU|sdhFvHWz zs&S^C8Mhjx+*G+^SuHbO5sPwKPtRYA2MrTWk;QVSaEAlmJ>5tXuT!F016ot%z^`r( zja@Iez9|#c?U+f#1KOtBiPOT?N1J0EY64%)`%5azQ+_lUOP`M{9~{oP=9}tFHQkf> z?*DM^MsVHu=l^=^mOuS*{tG`T+3yecJUyPqV$l${v1|sWuB@jjRZop28xI<9R$8!7 z7b_=m8V}-ZEWI*q6xijOkDG>$Gk<0ooQ|<$y0OgR zuOj>~@X?JW@gna)DAW6JQ%>Dj=E94dY@|dUTTV8X_PXX=@FD+Waq|-6W!cu#YtBlh z)^QuUv3e3Ft^B9gIAJZ1wtTWhjw_ZaEEX>9$l!2oLCfQfesdCsNvAn9SmtvLkw>ay zuN-%5kbxr)*p$Odj2#%a(vSiMaziK6G64$`QP zwX_75hw}(dqr!L`zzhcD_-W$}PL?fS>MnWKMVp&-)4=`5(s@u2hD}LvQ*8&v%l;! z@mcnjj>D~<&uX>b4jv~1qZ%u7>gDiqgOi3};G)gxVuNdQn!{aln!}q+cx_H|c-r9F zoNAoa|8n4{x!RnT<-%_@;n{fE@_gCg%A6WG$>(n19#1hQE}yNh$nIK zzH;J~@wP?}-#2LSt5V5!sR+@|GdiH}O{ru$9qa&zHZ}1x2fjMYU%wm^OVs-Lab9nsw@14B($Y+0@eRS*1ADnyY(G_gS-oS0w zbZE4`vO4)ab)1;2p0bt=SfQ-tXsJJ0D}2IPD}4HzwZbQywZccTmc_jdH8H%-L!2Fe z=_XyOro&Bq9)4?Z6H_%E36z>H@v53`aMpB*SJiZd>)C;N@L;~_j+5q(^2jyNJSRka_(O>5w$C(_i8TQ!fST(lG%3kIeMejYiG6X(}*%Pfa}YFk!X zorS@X8{frCVNKO+I~Vw z_=GE)@Ubf!-#R)4a#G<{vsxTM{^;g^p-GpjY!+T^a9!DQ;m){J60fRk7B2Cs%BFD5|HFpAp3=+7Dg0Gsv-k*qRyJFH;m^uu z%fAj@%C9Tiw!D0!afdkzaN*BUij50@j#4zPH@VS>P(L|JDF+4RQZy4f%bPfjo5tNu zWye~0Z*LumoD9HD}0W(a2i?RL%I&Hjrg_j55vv& zRz_KzTKhcw#kk*(+w&rd|8}HR%4=c>m;9U*;6)z!+yOuNoDkryK2Hwe!e>f=Yd+tE zpM0hUxXXv>v*i>%(*j)cc?^E?VdG_omvqet;lc;yY{F|kzkrW?W)UusKeI!)@Hxrg ze5XNut!pj5$kmTF;eYR4FDzB5jkeepi)O;Oqn&}$ zfMVMT+6BNFf023a4nyPjY_9{}t#19?orZQ5o}LOi>vYNt&h9d_T@Y##oR|MF|-{c^JQ7S>Q^jIuN$;a z?7$441=i3~e+T#FM}iq6Fpsf}vHTQ4E*+(_bm3 ziS^n+3zx%x8rtYX^!FOO5l-a%rJ?Nt?NXG(|ETzs%6iWjS~VKUa5+3{Xe-fBhGl81 zQ7=QN9XDYeOc)xc`@(5Y8rpTBg>|sq&>liV8;hyFjZ( zm^YNZ6f?Lt!qCud;!!WE9Uo@uL$RS<1zHtoudC-!!Ev4UktL z6uW)+v7xO*rzxEFpBP%}jC@&6xHwkJv|k0<<@mMpda|KKX6C1TilOZQEo>*I8rsX~ zc!kqG=Z1SYjPZ_ybqeS8TtnLiS~#yyGqgGAoQ2!|4;Wf22CU)uK3?%3%NgHQpk0Yy zJAGFeTI7`c_&#B1J3uSLL#UcTn{%b1y$*{Pj&H`VzqgX{MdswEZ>FK$3R*aQvka|l zZhn5wHndJyyl{N;Z#v;@#&iC_?Z~qHHvB$AdkC~}8@|KP z>MHZ=%D)@h8W`koUO)e-N0cm^K?~QFUmMzy3-Z(c8$-Jbv^gPNdcn|s2MZgH?-!pq z{v77@=+pDl{-1_+D`=lU7&P;^wT=9xq0On*{kn3{$_?!qL)#1*$2sHGt)F|=&~|~= z4t$upH7)(sRZ5l_u*~7URL0OA2Q6%~It;Dz4DbuJM;i<+3kwvsSsM-Qs>S*FGX0cV zPE~k2KnvTD8HQE{D-+hinTGZhXyJ00WoV=8^5eVdrK?nYb3nTW@uCQE>wNi~p*;>- zIPKdEt@F(Mv~M>weljnd_RkyIRm<{aIb-4>YY@G+1GI437a3X^EM7S6wTAW-XyLRk zHnh=a<;SQ=YTm-`KE^UD1C_dP=!{lWaS?>4juYFfBH zlsx&olBF87uq`h&w5LD|r@hS3+M&T!C_LMimmAs+lyEq{@2>w^Ba-BGgLVOa?Q-8~ zXlqvMa*u-^H#)J)(2CdO*Q4K!TJ0mK*9lr!mtHiq(b4?;{Jo*=0xfLM{$Oa;&H4HH zlA*0ctl{*Xx&E}ZlqCyV*q+rJ+GvCb=VybV-3nSbKbINW%PslweYXB~plJJB^L6Pu zL)!sbxE@_^Xlr8mRg zwAQZt^er&7&Q1C0JECO(bGN)_s0{eEW|zhxjA1 zixIC~wj&MgD$t$)ty|sNCXX_-)(i8~cYvXFUX&kS*VA*6GNcc*FXPvaZpcD|wAWoR(l-iHkB0z>Nt?bE;yQ@2jTg@)FNgon$0boU!d z&fkF+wr7VJTIWad%i&N%8+{4N0ds_Q`!L4P=6ozaUtWw)W|F)$pixdcUw&_BuY-0o zXx-}8Y50SoZMzI$s895g(2#&|zu=FCcGt)AWf`-GC5QPC(84-+n4zt_B0uei8`{gD z%|HU|w2w8k2pU_*evU*$Of0TDcAWhaK11(||2W`3#r~F%WdU#o4dI!D--nF_BTUGGx{%V{dgmaXF>!84eRzKF5il(~s1CeI^HSb8k$n#GA z@3otsJhk@Kn|}1E%A1OBZ$ydj>DpF?R=LFU9;yh1EQR0P*-|EB_$zhX3KlpYeyF-c zZt9CXhh`6Xgle`RfsaV~)0WpvoO7+K_ZElaNR6Y~=|LQLuO2BXtR zTRH*`od1>J{*As|l3%@rwe?Nbq(t9jtx5Dv)};no-(;Q4m6N(+U!prc;3t92rl$o)IGRFPKlGh(w~t>+%AWpz5kNWTYtZx^q#wCm454+ z-$eVBEq(3Pj^L&rb~U)e{)@9rL$(y{A^QP)yx6bO+sO3ZrfMAb73Yy(Xu@do_~GC* z+$>)dIPG+^q*-)C{1O>$sjVDg`Z&;SYp%~kaxA>C3VzuKz);zF4sD12vecCP4@^1S z(8|2s_976V2S*`2kp6MuM{M2Qd)h_XhU-<2J=gZJ+;n@Gle2J|a;W4-4#{`fc1Y^y zb0(PVGZ4EYdlJMi`xj`3sJmwKrqa)Uw(ms|WbcINEPrLpLOL&@aonSkp8po&Cu1G= zDfauR8`V|V`GH$s+J@``jW_ANU*Y)N(1=5XcL_cEgr6H=&vG#Qq2?i(pP*OP-{`jc zsWPujJeaG3TgLFjWxa)NS*N7i?tjR-1aX6STHx@8WMZfO(gmc1f$%ebCy zS%0Ei*7^IHrF^vDW%mbVZ;Z6hvgbwWf$WbN=>DMW*Kq|5mpA=#yCLbb%OFSXF+6p8 zk9sX~NnZ2!-8BAS|E1QCZt$f;$VRpgm*iV-L2Y|1dM|n>`F3Y|yHyzX|`w|^Au)lrpBZ|DXzRLU<r`-i!@r_;N)_76o@m{!^IMYrthpqrQJc4$xNFW1=Y zz9Ra3HB_;MJVty9POxo@Wd?MD0P!VyjdN)NC(+_efq{)x=1TZ0?fjQ-omBdxA1;9& zW=rqiRi<=(%k`^*xs*^=74#O;!+o`X`ndt9hMYIjXi9Ie*|1yB7e393q!(*WOL-Fq>U_Y+ERgY)taY#=>q} z-(;Vz=$q`n6@8Pvy41H(xYgUPt;sl#;~a=N7}-PY%Gf`>v-|HkK91h)#LD9RkRG?! zC%qH7-k#ohfz908=AWf+LcQYrvs{u+?a!97|EIfEk@9AI2q>MFkiGv(zV#N$)<5YN ziT=rcY|%ey#|PTp$zF0-&i?70^j*VwC+#VC_gn8oF5$`FccQ&>^Id%5{1-g`SMn*J zl0$4gll}UlXR;4p^i1~b544`iI|MnY=nAKke!1O{^x5+PIcksL`()olu6MegajeNp z(y4vfQsNac9OJl$OY*6=VAL~-N9JfmujIWA@yq)d*hlBZ5%3cNP1LVHv2Se zUcI@QzuhK)%-Ko(mv>R5T;#nK@yk0dv2WJ2Ele-^#^uPNxw?IZBr^LzMciZ}t=!oQj)NSe+l|yjm z7q4-+?YV?~dEKc{`R}Xa`hi$?lKfBw-NPScvkXn%VH5i!@1}{pk@wgJy8j{X)wv?N zcBCi!BG1VBg{$A>5%AgB-|>~mB|P~%*w2+5&;3e1<&b=rt!MJ?qUf2tlPG#7?=Mo% zxZd85b7SIXFB_1tJSCI&D(TK$fu0yhbSI2!vb}!i@?iJ_FgJeH_q^=Z-Lvm`aX09| z)SU}jz$J3o`qrEM+V<6W$xnYWt914CpDUUB^@mF2x&Q0&JlmSB128Ws`B5ON0?5`Y zc}G?BO5Qycy^{A-saKpQGI|x6H1mW3(Jgs@HV{rZ!umtM+-^wvM6Z~x+@-_caoH&7 z(~{j=-q;GAdaloUC31;=@V7U;y7Z+lmaISL$0dJxxvun`s8^C7x%|y{+5K{P7g_X5 z-Xj*hl6Q{9FYhN)&$u5$@5I47FK`dUehhhU+LgL*dL}v`@2HZ8=$siFiLElfFPC}Q z4_7|+=x_Vo9~U_#PW}#5fBe&qqi)mvCw?_~d? z=$)JkB6=rhh)|9(xM~0JxuQ%*T774kpCK9$8z^U-xN--2V_^E_c0Z|@yz9)WCU&5PidG7zZeGS_`k!w%uw0t-1Y(JG;7V}dPF4*GR z+NVX9E?ih!vt&Vj5#%9~e|ZE8u=P>Sml1uGb7Mpw<%}7o=U=g3K+e9g#DlYcdMNW* z`8)zX{kDT5my{cSduxZ^X?Bo(uLby)St^pjn~Bq=O>;B1N1xg-mz1*TB8kJ|1uittnatY7=>D}II|4fFe zZ{&O)y)}WDGBQCg(?qp2=BL1FdIr_Laz_f5Yh%oeASQw9KjG z^C%cz+F>_%$R~2W)AfutgO{XJ`?96ntKHT$Z4;W>44T?$P02P*+QVPTx88!;^I>8m zMDOIRFwr|XS4{kJ1{w8`<4Uz3zJBF^^!X^WoQ+0z?h5NsVSSYS0CHXypBMX0xAX@O zp(ivR9`o$12fXYU+;^Zqn85s)*C#y{d8PdL`)=C@FFK+!)ts|Ox13EzH!rh{pgp0# zgZtqBxqa}3^l)FD_Zx_P@RA=PHFLan`z!C>i5-+P48`urd55%nw9VGM-;#|n{r>Pk ztOv+>jE}CAy@xaYP%XytFKb~#FU&a#|6~W*9ONGmWb-&-F5qfwx+t;^si9F83 zj8xST(Km&E6_lxzCw{x;^gl@tz+&h=URx4NFL}c*5_d<h*;~l;7Se-#wZAkF z>!gw&%$uGryT2r3EU`m!*09(e>HE{}{43^V<-BB9R@biV$^OdNH=jqqXJ>!cr$jEP zKm6^jpY%?fm*tw!2Wt|TuE2*-BW-w(3m>{npW|k60iWbs0a5_j?Vy~kA^IohON;)= zS=8c}bE~P3?CYT&430Y+h&E8p(+-4HjzEtLOuyW@kfJMcCLbx%{+T%q)9!itm*+aI z{o&g>*Gc4*IQjc-YyU(yBoCw{IG-g-5vGj;?VZ&A71D!ubNeUxA-YiL*KYshTzauT za^Aey8#$Z)U)BD}nfb1qeX}?6jD04NU?Kaov%l@1$R+iMzwf5@kMjh<`glU0Z5XMk zVw2PBCHdA{AiMpOvJ?H2Zw!e3$@d7vFW)YpKJxuCHE(YQf%xR}fX&~_w-wxU^i3~i z{$A=9dB|DgbW5AadWg$y6TM1|3GuGk0q0cqXFr?BYwPQ~ZT?<#g_$bnx6>^)jBZ|& z^-saSgY)$m$?4f)EMeLt^FNOAxV-###GhIEL zv8*?+4Tuet@42{g_s#yvGh*jBZpIa|bJ^Wq_QBoWu57>ToXBO{x!&4k_5nmloJSj7Q}=KP)$0cG=Qb|2tFq^PjDNK2aZeN6K|u87ZgC z`n*q`ty?>v=gs36W#9Y7XLMR^9T)z+KTE2}d2`~sC2#Kkvu|h4UtDtZA6lsMxXQ}Z zPato$^o5;MD=xmqD_?TvuOPd7>2$i7?W3IC29P~@VlU*ILSirE`$OWFZxzvg9DrN( zpBC%sje#gH`G%4a&-~bVN=Wk6#iidQdnFlC-v6ar>vf!?5pR%P)qQeGjb_ z7L8$hyhL8fbN;^D`c0xE%p`fAnr_*XN;j{;ev{|9^PF0L2jcv{LVEaa?l(z(Xw579 z*X}pT8Ny-*1^)IsP2eHnNkMiA2u|x7bOtCxi?M&Jo+OL6n|3kjz>B`tQJ0s7?Ii;?ClSja3XMgAS zMK0mV-`?88aKBHU+gIihBro-EkZ&$rz$f`sfD}Nsp2_!8MbG3rsG?``%~a|c?Uy?5 zL?4(sAoB(CE!RLeN}upa)3 zT*8yTz1y!frJud_w@?ldr(!d*<<3HwR*!Nb*A|UJrlR z&Kg?~d}CYeoqUg5{POK?vSK@{zJk%vmCpEW1JcgQcf)NvBHs^YoV+-HQJqZ1HYM?~ zRV*CP-r{SZnOIXa&b{~gt02Mm!J2%vxWKu5W$W;>=c|w$@~z`SPg7pD346MPuN#g! zXkWHY+PLc$JMW@7pWT0wZ=g#%C*L-ga+U9(JN>7#mqjMc8kqCqFDZTx~2al zx~h3eUY&>b>hAA(WkVl;2J8k++BF@lhrc41t#7^Ai+B2YagrZBWS4?%y^{SWqF3?_ zd(kV|FG0Oxxee6#?}(Neo%u5MPoHFukd(dVC;Fs(JNrBS6S;&Ze+S2Z`6VU!luyYa zww_7d7d<;*thb3FMbAbVKlO}v9nVq4??Cj$!N%L)@TWU>^-bR>4=*_jmTno((rup) zAm@4#7n@DD^x5ggCALldu3hM%&wj^lFH&8#cKDboi>?Cq_D9lX>uYcJ&*t?`96w5a z*y#+r#g-Aj@aefq54o?A*9FG^A?@|fH~#aD|2*SA)A%#r~IyiL&U zcFd9R+E#}C!%pt6;H4nz4{e9u*bymTIrr-pKPylHr{t4Mf(+eXs`AP{Q048~g#Lw= zDZl^XKD8&GZQtZOr()m6bid))w?mDex|e&ux;-9EM7cX=!0g;;6OSu9(`#S7r(bN9 zv3riK+A{YL?4>vo>o&($Z8_?cN^ljr9YLO3$%GpCIlxjc=S5RHH}Rgv~oazm`yZ>9uI z`qS@pf`1CZHir2i_EjV`M>EmL#w4T9q##F}4@DErk+rF08=^n1DW2?TJ}#10pADTB zsYzfs8Eu{#;ll)RhFWA}EFOm^+7`#AqIg#%nQChF)8K~`P)vN2u{qruU5E65bGoB3 z?XU0f6PZY}+Ce7rqOPPFeG<>4kYDLcG|}XzBT1c2EwH?iWI}Na=Ss?NiKdzvJwr3j zjs!lt7VqMlT#`$fWP386Z0VX7DNje%MpKb!TIY}A97|J#Y*Q{v?BK&>C|EAL5*Zb%-e9L68&7nLH6j|2WrSvM|J{=N5`?KX4oX^&V|1F>!_ z`2lu4UPD3YHdNW;A$Di%qRxv*61#J_@zc&w#(|nQ7-RS{uH4l(`y%0G?~VBNuavKg v!Y4K-k6;5Lm(&^l_SV1ISJ#bMmb@gL+LtZm-dpZDi3B^6G^MA%l3)KH*0L&g diff --git a/integrations/Unity3D/Assets/ZeroTierSockets_Demo.cs b/integrations/Unity3D/Assets/ZeroTierSockets_Demo.cs index b4f101a..0de2d9f 100644 --- a/integrations/Unity3D/Assets/ZeroTierSockets_Demo.cs +++ b/integrations/Unity3D/Assets/ZeroTierSockets_Demo.cs @@ -217,6 +217,7 @@ public class ZeroTierSockets_Demo : MonoBehaviour void Start() { + Debug.Log ("Start()"); // Set defaults InputField input; GameObject go; @@ -234,7 +235,7 @@ public class ZeroTierSockets_Demo : MonoBehaviour input.text = "Welcome to the machine"; // Create new instance of ZeroTier in separate thread - zt = new ZTSDK ("zerotier/", "8056c2e21c000001"); + zt = new ZTSDK (".", "8056c2e21c000001"); } // Terminate the ZeroTier service when the application quits diff --git a/integrations/Unity3D/ProjectSettings/GraphicsSettings.asset b/integrations/Unity3D/ProjectSettings/GraphicsSettings.asset index 96548d5ef7218d34a18c32ab9fc5ee6908d02ebe..530995de588753f88eb5f387afa21cf741d2e28b 100644 GIT binary patch literal 4376 zcmeH~%WoV-5XO7fHjiLPNO%PD0Kz+flh`;AaKidYjO}FOHRdUt_HNsrXm(~bJ1g5l zLVG|+JkF6g`#l)3(L9 zcQ|h1ZbD~Vu7Q$|d#AyLxOX|;yWaiUM=>sAWb6DHbTZbQl8<}P;6mI(j`zmBNBbzo zz1MNG-W$*v_dYaAKJNVn7vl0^q~z=TfM&(G4?1q*ehr;*kDyWVagQ2YhBoXq0^1M+`2+J>ht7+()&K;(8x*+{FC_I^#Z$M#;y0!r($& zoo@2;?-?DeExoUBU)pt*de-%#;4}5Tcd5679*r6Y@ zzc+2%i{y}$50*@xvj%H^2y6(Acl>MQ9oi4*{LfkYIdVwKuUh}uBQ50F{aVQJ%kYCK z;!=)Bmh(9hWs@iUd}4XUaZ}Ih;Qe4%$RTN+zp{MMV9n|02kWPrWY;O3qR#hd5AFj8= zMB5M0t8U1;iXCmNOsO>$$Eq$GD+^IwiAp7j$BfklFw;Y4#t+o&6gm}|Z0Jrpb5X4Y zs+Ras*y4m*tW;QS%9`TbXp?YWt;^bWIssrxHIt1?QQVLL#}^__Uxt?`*7pATMsiUG zk)9j2W&#;2^v8oux!sx#YeBoN>LxeZS7H@JSeQeZRV>Tcmtis)1vX2)tY+*ds)dYX zJ4hB}qF@w=C11sb$~9Jq(~@cBjEGf;I-;^HhiJFdq-@pF45G~i*<@aYiNm|W5kQ;C zVvk#g7ot^^KR=lDu2WBQggsd85nNzA+ z38Wuprjbqg@nqCk^+Wy8X00(&RZSUVJM(k4L)q|aySg(&|KZgcWSk>s<}!~gB8)muGORBH97)~@sT|HInXV9gxlJWjt*9N>RO?hb#15>in)AD&wvt$;Mth%o71*o5 z|EU1a9h-iCvVH3My(XiV(Wj*L`u#7X>-WTrzVrTL=J=cpN$0N_)%}0I^Zz&o^vkQY g&Gbu|{=t*R0sS4feG=-W%vc(4w@=!q;-v!cFPL*5%K!iX literal 4256 zcmeH~-HsGR6vt2R&Mtx|g5Vdrh=Qo#^5upY2rja_^0CH&F@|t6DSB#W+RSuMYI?G} zF(DJKd;+gGG4X~QqAy{*yj6Vewc!Zx;Bk(DQoU z^1NKnLGb6*^S0-KJcRzYv){oiqpTiTh4zo*y!U01+}6JbL0SJH^3izx?|NSD=V5XP z`+OWRSU=;uM>ry{$rbcx*~Nd~^O@51IszUn(tkGVe}27=l4oO9ZXhD#)BeEoTIsy} z{@J`UrSpDBzG&-V9~ub4I3IZ)WOh|D?hn zI6hzDzdL@i!k;*Ps={aSfWeaBe$Rw;vYum(^Lazb`8mhWTI~6f#4b5y)J@T4a!Q?)mN9G)K%Ka zlzit+z1G!X8YS@n%d5Jr!p(dQ;8J&8Z4R!+VRzWlEgO%Hb)&lpit(tB`CDZo6{nYz zu8Vw8>RpwtC8jrafC?B6bR#rc$Bn)UH5Ze0rsMfr-zd}8X=TTMuatK2D8n@AsWb|q zuSV@o+Ee{TYNCE0Ee2aj+C?*Wxvq5|A<7|z61PO!LjT}ZeOd| npF2B$rGEAbjfL}eG22_vrwaN$_pU&nx%|BWI_;taxd1)|e}a2l diff --git a/integrations/Unity3D/ProjectSettings/ProjectVersion.txt b/integrations/Unity3D/ProjectSettings/ProjectVersion.txt index 558807b..66e05aa 100644 --- a/integrations/Unity3D/ProjectSettings/ProjectVersion.txt +++ b/integrations/Unity3D/ProjectSettings/ProjectVersion.txt @@ -1,2 +1 @@ -m_EditorVersion: 5.3.5f1 -m_StandardAssetsVersion: 0 +m_EditorVersion: 5.5.0f3 diff --git a/integrations/Unity3D/Unity3D.sln b/integrations/Unity3D/Unity3D.sln index 9019aea..5a2d770 100644 --- a/integrations/Unity3D/Unity3D.sln +++ b/integrations/Unity3D/Unity3D.sln @@ -3,8 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 11.00 Project("{0BF2C6BC-4121-AE75-A3F9-F3A441421429}") = "Unity3D", "Assembly-CSharp.csproj", "{7214E491-EE9D-B906-A42D-2F3EA3DCD8FE}" EndProject -Project("{0BF2C6BC-4121-AE75-A3F9-F3A441421429}") = "Unity3D", "Assembly-CSharp-Editor.csproj", "{CCA76E42-E9D5-4CBF-3222-F488C499DCF3}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -15,10 +13,6 @@ Global {7214E491-EE9D-B906-A42D-2F3EA3DCD8FE}.Debug|Any CPU.Build.0 = Debug|Any CPU {7214E491-EE9D-B906-A42D-2F3EA3DCD8FE}.Release|Any CPU.ActiveCfg = Release|Any CPU {7214E491-EE9D-B906-A42D-2F3EA3DCD8FE}.Release|Any CPU.Build.0 = Release|Any CPU - {CCA76E42-E9D5-4CBF-3222-F488C499DCF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CCA76E42-E9D5-4CBF-3222-F488C499DCF3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CCA76E42-E9D5-4CBF-3222-F488C499DCF3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CCA76E42-E9D5-4CBF-3222-F488C499DCF3}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/integrations/android/android_jni_lib/java/jni/Android.mk b/integrations/android/android_jni_lib/java/jni/Android.mk index a495bf3..02b1ebd 100644 --- a/integrations/android/android_jni_lib/java/jni/Android.mk +++ b/integrations/android/android_jni_lib/java/jni/Android.mk @@ -2,35 +2,31 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) -ZTSDK := ../../../../../src -ZT := ../../../../../zerotierone +ZTSDK := $(ZT1)/.. +ZT := $(ZTSDK)/zerotierone +LWIP := $(ZTSDK)/ext/lwip/src LOCAL_MODULE := ZeroTierOneJNI -LOCAL_C_INCLUDES := $(ZT1)/include -LOCAL_C_INCLUDES += $(ZT1)/ext/lwip/src/include -LOCAL_C_INCLUDES += $(ZT1)/ext/lwip/src/include/lwip -LOCAL_C_INCLUDES += $(ZT1)/ext/lwip/src/include/lwip/priv + +LOCAL_C_INCLUDES := $(LWIP)/include +LOCAL_C_INCLUDES += $(LWIP)/include/lwip +LOCAL_C_INCLUDES += $(LWIP)/include/lwip/priv + +LOCAL_C_INCLUDES += $(ZTSDK)/src +LOCAL_C_INCLUDES += $(ZTSDK)/src/stack_drivers/lwip +LOCAL_C_INCLUDES += $(ZTSDK)/src/stack_drivers + +LOCAL_C_INCLUDES += $(ZT1)/include LOCAL_C_INCLUDES += $(ZT1)/node LOCAL_C_INCLUDES += $(ZT1)/ LOCAL_C_INCLUDES += $(ZT1)/service LOCAL_C_INCLUDES += $(ZT1)/osdep -LOCAL_C_INCLUDES += $(ZTSDK)/src -LOCAL_C_INCLUDES += $(ZTSDK)/stack_drivers/lwip - LOCAL_LDLIBS := -llog # LOCAL_CFLAGS := -g -# Netcon files -LOCAL_SRC_FILES := \ - $(ZTSDK)/rpc.c \ - $(ZTSDK)/proxy.cpp \ - $(ZTSDK)/sockets.c \ - $(ZTSDK)/service.cpp \ - $(ZTSDK)/tap.cpp - # ZeroTierOne ext files -LOCAL_SRC_FILES += \ +LOCAL_SRC_FILES := \ $(ZT1)/ext/lz4/lz4.c \ $(ZT1)/ext/json-parser/json.c \ $(ZT1)/ext/http-parser/http_parser.c \ @@ -42,7 +38,6 @@ LOCAL_SRC_FILES += \ $(ZT1)/node/C25519.cpp \ $(ZT1)/node/CertificateOfMembership.cpp \ $(ZT1)/node/DeferredPackets.cpp \ - $(ZT1)/node/Dictionary.cpp \ $(ZT1)/node/Identity.cpp \ $(ZT1)/node/IncomingPacket.cpp \ $(ZT1)/node/InetAddress.cpp \ @@ -63,59 +58,67 @@ LOCAL_SRC_FILES += \ $(ZT)/node/Utils.cpp \ $(ZT)/osdep/Http.cpp \ $(ZT)/osdep/OSUtils.cpp \ + $(ZT)/osdep/ManagedRoute.cpp \ $(ZT)/osdep/BackgroundResolver.cpp -# lwIP api files -LOCAL_SRC_FILES += \ - $(ZT)/ext/lwip/src/api/api_lib.c \ - $(ZT)/ext/lwip/src/api/api_msg.c \ - $(ZT)/ext/lwip/src/api/err.c \ - $(ZT)/ext/lwip/src/api/netbuf.c \ - $(ZT)/ext/lwip/src/api/netdb.c \ - $(ZT)/ext/lwip/src/api/netifapi.c \ - $(ZT)/ext/lwip/src/api/sockets.c \ - $(ZT)/ext/lwip/src/api/tcpip.c -# lwIP core files -LOCAL_SRC_FILES += \ - $(ZT)/ext/lwip/src/core/def.c \ - $(ZT)/ext/lwip/src/core/dhcp.c \ - $(ZT)/ext/lwip/src/core/dns.c \ - $(ZT)/ext/lwip/src/core/init.c \ - $(ZT)/ext/lwip/src/core/mem.c \ - $(ZT)/ext/lwip/src/core/memp.c \ - $(ZT)/ext/lwip/src/core/netif.c \ - $(ZT)/ext/lwip/src/core/pbuf.c \ - $(ZT)/ext/lwip/src/core/raw.c \ - $(ZT)/ext/lwip/src/core/stats.c \ - $(ZT)/ext/lwip/src/core/sys.c \ - $(ZT)/ext/lwip/src/core/tcp_in.c \ - $(ZT)/ext/lwip/src/core/tcp_out.c \ - $(ZT)/ext/lwip/src/core/tcp.c \ - $(ZT)/ext/lwip/src/core/timers.c \ - $(ZT)/ext/lwip/src/core/udp.c +#lwip +LOCAL_SRC_FILES += $(LWIP)/core/init.c \ + $(LWIP)/core/def.c \ + $(LWIP)/core/dns.c \ + $(LWIP)/core/inet_chksum.c \ + $(LWIP)/core/ip.c \ + $(LWIP)/core/mem.c \ + $(LWIP)/core/memp.c \ + $(LWIP)/core/netif.c \ + $(LWIP)/core/pbuf.c \ + $(LWIP)/core/raw.c \ + $(LWIP)/core/stats.c \ + $(LWIP)/core/sys.c \ + $(LWIP)/core/tcp.c \ + $(LWIP)/core/tcp_in.c \ + $(LWIP)/core/tcp_out.c \ + $(LWIP)/core/timeouts.c \ + $(LWIP)/core/udp.c + +LOCAL_SRC_FILES += $(LWIP)/core/ipv4/autoip.c \ + $(LWIP)/core/ipv4/dhcp.c \ + $(LWIP)/core/ipv4/etharp.c \ + $(LWIP)/core/ipv4/icmp.c \ + $(LWIP)/core/ipv4/igmp.c \ + $(LWIP)/core/ipv4/ip4_frag.c \ + $(LWIP)/core/ipv4/ip4.c \ + $(LWIP)/core/ipv4/ip4_addr.c + +#LOCAL_SRC_FILES += $(LWIP)/core/ipv6/dhcp6.c \ +# $(LWIP)/core/ipv6/ethip6.c \ +# $(LWIP)/core/ipv6/icmp6.c \ +# $(LWIP)/core/ipv6/inet6.c \ +# $(LWIP)/core/ipv6/ip6.c \ +# $(LWIP)/core/ipv6/ip6_addr.c \ +# $(LWIP)/core/ipv6/ip6_frag.c \ +# $(LWIP)/core/ipv6/mld6.c \ +# $(LWIP)/core/ipv6/nd6.c -# lwIP core/ip4 files -LOCAL_SRC_FILES += \ - $(ZT)/ext/lwip/src/core/ipv4/autoip.c \ - $(ZT)/ext/lwip/src/core/ipv4/icmp.c \ - $(ZT)/ext/lwip/src/core/ipv4/igmp.c \ - $(ZT)/ext/lwip/src/core/ipv4/inet_chksum.c \ - $(ZT)/ext/lwip/src/core/ipv4/inet.c \ - $(ZT)/ext/lwip/src/core/ipv4/ip_addr.c \ - $(ZT)/ext/lwip/src/core/ipv4/ip_frag.c \ - $(ZT)/ext/lwip/src/core/ipv4/ip.c \ # lwIP netif files LOCAL_SRC_FILES += \ - $(ZT)/ext/lwip/src/netif/etharp.c \ - $(ZT)/ext/lwip/src/netif/ethernetif.c \ - $(ZT)/ext/lwip/src/netif/slipif.c + $(LWIP)/netif/ethernetif.c \ + $(LWIP)/netif/ethernet.c + +# Netcon files +LOCAL_SRC_FILES += \ + $(ZTSDK)/src/rpc.c \ + $(ZTSDK)/src/proxy.cpp \ + $(ZTSDK)/src/sockets.c \ + $(ZTSDK)/src/service.cpp \ + $(ZTSDK)/src/tap.cpp \ + $(ZTSDK)/src/stack_drivers/lwip/lwip.cpp # JNI Files -LOCAL_SRC_FILES += \ - com_zerotierone_sdk_Node.cpp \ - ZT_jniutils.cpp \ - ZT_jnilookup.cpp +#LOCAL_SRC_FILES += \ +# com_zerotierone_sdk_Node.cpp \ +# ZT_jniutils.cpp \ +# ZT_jnilookup.cpp -include $(BUILD_SHARED_LIBRARY) +include $(BUILD_SHARED_LIBRARY) \ No newline at end of file diff --git a/integrations/android/android_jni_lib/java/jni/Android.pico.mk b/integrations/android/android_jni_lib/java/jni/Android.pico.mk new file mode 100644 index 0000000..4d259c8 --- /dev/null +++ b/integrations/android/android_jni_lib/java/jni/Android.pico.mk @@ -0,0 +1,121 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +ZTSDK := $(ZT1)/.. +ZT := $(ZTSDK)/zerotierone +PICO := $(ZTSDK)/ext/picotcp + +LOCAL_MODULE := ZeroTierOneJNI + +LOCAL_C_INCLUDES := $(PICO)/modules +LOCAL_C_INCLUDES += $(PICO)/include +LOCAL_C_INCLUDES += $(PICO)/build/include +LOCAL_C_INCLUDES += $(PICO)/build/include/arch + +LOCAL_C_INCLUDES += $(ZTSDK)/src +LOCAL_C_INCLUDES += $(ZTSDK)/src/stack_drivers/picotcp +LOCAL_C_INCLUDES += $(ZTSDK)/src/stack_drivers + +LOCAL_C_INCLUDES += $(ZT1)/include +LOCAL_C_INCLUDES += $(ZT1)/node +LOCAL_C_INCLUDES += $(ZT1)/ +LOCAL_C_INCLUDES += $(ZT1)/service +LOCAL_C_INCLUDES += $(ZT1)/osdep + +LOCAL_LDLIBS := -llog +# LOCAL_CFLAGS := -g + +# ZeroTierOne ext files +LOCAL_SRC_FILES := \ + $(ZT1)/ext/lz4/lz4.c \ + $(ZT1)/ext/json-parser/json.c \ + $(ZT1)/ext/http-parser/http_parser.c \ + +# ZeroTierOne files +LOCAL_SRC_FILES += \ + $(ZT1)/service/OneService.cpp \ + $(ZT1)/service/ControlPlane.cpp \ + $(ZT1)/node/C25519.cpp \ + $(ZT1)/node/CertificateOfMembership.cpp \ + $(ZT1)/node/DeferredPackets.cpp \ + $(ZT1)/node/Identity.cpp \ + $(ZT1)/node/IncomingPacket.cpp \ + $(ZT1)/node/InetAddress.cpp \ + $(ZT1)/node/Multicaster.cpp \ + $(ZT)/node/Network.cpp \ + $(ZT)/node/NetworkConfig.cpp \ + $(ZT)/node/Node.cpp \ + $(ZT)/node/OutboundMulticast.cpp \ + $(ZT)/node/Packet.cpp \ + $(ZT)/node/Path.cpp \ + $(ZT)/node/Peer.cpp \ + $(ZT)/node/Poly1305.cpp \ + $(ZT)/node/Salsa20.cpp \ + $(ZT)/node/SelfAwareness.cpp \ + $(ZT)/node/SHA512.cpp \ + $(ZT)/node/Switch.cpp \ + $(ZT)/node/Topology.cpp \ + $(ZT)/node/Utils.cpp \ + $(ZT)/osdep/Http.cpp \ + $(ZT)/osdep/OSUtils.cpp \ + $(ZT)/osdep/ManagedRoute.cpp \ + $(ZT)/osdep/BackgroundResolver.cpp + +# picoTCP files +LOCAL_SRC_FILES += \ + $(PICO)/stack/pico_device.c \ + $(PICO)/stack/pico_frame.c \ + $(PICO)/stack/pico_md5.c \ + $(PICO)/stack/pico_protocol.c \ + $(PICO)/stack/pico_socket_multicast.c \ + $(PICO)/stack/pico_socket.c \ + $(PICO)/stack/pico_stack.c \ + $(PICO)/stack/pico_tree.c \ + +# picoTCP files +LOCAL_SRC_FILES += \ + $(PICO)/modules/pico_aodv.c \ + $(PICO)/modules/pico_arp.c \ + $(PICO)/modules/pico_dev_loop.c \ + $(PICO)/modules/pico_dev_mock.c \ + $(PICO)/modules/pico_dev_null.c \ + $(PICO)/modules/pico_dev_tun.c \ + $(PICO)/modules/pico_dns_client.c \ + $(PICO)/modules/pico_dns_common.c \ + $(PICO)/modules/pico_dns_sd.c \ + $(PICO)/modules/pico_fragments.c \ + $(PICO)/modules/pico_hotplug_detection.c \ + $(PICO)/modules/pico_icmp4.c \ + $(PICO)/modules/pico_icmp6.c \ + $(PICO)/modules/pico_igmp.c \ + $(PICO)/modules/pico_ipfilter.c \ + $(PICO)/modules/pico_ipv4.c \ + $(PICO)/modules/pico_ipv6_nd.c \ + $(PICO)/modules/pico_ipv6.c \ + $(PICO)/modules/pico_mdns.c \ + $(PICO)/modules/pico_mld.c \ + $(PICO)/modules/pico_mm.c \ + $(PICO)/modules/pico_nat.c \ + $(PICO)/modules/pico_olsr.c \ + $(PICO)/modules/pico_posix.c \ + $(PICO)/modules/pico_slaacv4.c \ + $(PICO)/modules/pico_sntp_client.c \ + $(PICO)/modules/pico_socket_tcp.c \ + $(PICO)/modules/pico_socket_udp.c \ + $(PICO)/modules/pico_strings.c \ + $(PICO)/modules/pico_tcp.c \ + $(PICO)/modules/pico_tftp.c \ + $(PICO)/modules/pico_udp.c + +# Netcon files +LOCAL_SRC_FILES += \ + $(ZTSDK)/src/rpc.c \ + $(ZTSDK)/src/proxy.cpp \ + $(ZTSDK)/src/sockets.c \ + $(ZTSDK)/src/service.cpp \ + $(ZTSDK)/src/tap.cpp \ + $(ZTSDK)/src/stack_drivers/picotcp/picotcp.cpp + + +include $(BUILD_SHARED_LIBRARY) diff --git a/integrations/android/android_jni_lib/java/jni/Application.mk b/integrations/android/android_jni_lib/java/jni/Application.mk index d28c397..32c4f20 100644 --- a/integrations/android/android_jni_lib/java/jni/Application.mk +++ b/integrations/android/android_jni_lib/java/jni/Application.mk @@ -1,7 +1,7 @@ NDK_TOOLCHAIN_VERSION := clang APP_STL := c++_static -APP_CPPFLAGS := -g -O3 -DSDK_BUNDLED -DZT_DEBUG -DSDK_DEBUG -DLWIP_DEBUG -DSDK_LWIP=1 -DSDK_IPV4=1 -DSDK -fPIC -fPIE -fvectorize -Wall -fstack-protector -fexceptions -fno-strict-aliasing -Wno-deprecated-register -DZT_NO_TYPE_PUNNING=1 -APP_CFLAGS := -g -DSDK_BUNDLED +APP_CPPFLAGS := -D__ANDROID__ -v -g -O3 -DSDK_BUNDLED -DSDK_DEBUG -DSDK_LWIP=1 -DSDK_IPV4=1 -DSDK -fPIC -fPIE -fvectorize -Wall -fstack-protector -fexceptions -fno-strict-aliasing -Wno-deprecated-register -DZT_NO_TYPE_PUNNING=1 +APP_CFLAGS := -v -g -DSDK_BUNDLED APP_PLATFORM := android-14 # Architectures @@ -13,4 +13,4 @@ APP_ABI += armeabi-v7a #APP_ABI += mips #APP_ABI += mips64 #APP_ABI += x86 -#APP_ABI += x86_64 +#APP_ABI += x86_64 \ No newline at end of file diff --git a/integrations/android/android_jni_lib/java/jni/Application.pico.mk b/integrations/android/android_jni_lib/java/jni/Application.pico.mk new file mode 100644 index 0000000..72f06c8 --- /dev/null +++ b/integrations/android/android_jni_lib/java/jni/Application.pico.mk @@ -0,0 +1,16 @@ +NDK_TOOLCHAIN_VERSION := clang +APP_STL := c++_static +APP_CPPFLAGS := -v -g -O3 -DSDK_BUNDLED -DSDK_DEBUG -PICO_SUPPORT_IPV4=1 -DPICO_SUPPORT_TCP=1 -DSDK_PICOTCP=1 -DSDK_IPV4=1 -DIPV4=1 -DIPV6=1 -DSDK -fPIC -fPIE -fvectorize -Wall -fstack-protector -fexceptions -fno-strict-aliasing -Wno-deprecated-register -DZT_NO_TYPE_PUNNING=1 +APP_CFLAGS := -g -DSDK_BUNDLED +APP_PLATFORM := android-14 + +# Architectures +# APP_ABI := all + +#APP_ABI += arm64-v8a +#APP_ABI += armeabi +APP_ABI += armeabi-v7a +#APP_ABI += mips +#APP_ABI += mips64 +#APP_ABI += x86 +#APP_ABI += x86_64 diff --git a/integrations/android/example_app/app/build.gradle b/integrations/android/example_app/app/build.gradle index ee857cf..05c5fc6 100644 --- a/integrations/android/example_app/app/build.gradle +++ b/integrations/android/example_app/app/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 23 - buildToolsVersion "23.0.3" + buildToolsVersion '25.0.2' defaultConfig { applicationId "com.example.joseph.example_app" minSdkVersion 15 @@ -22,7 +22,7 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.4.0' - compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha1' + compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha5' testCompile 'junit:junit:4.12' androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2' androidTestCompile 'com.android.support.test:runner:0.5' diff --git a/integrations/android/example_app/app/src/main/java/com/example/joseph/example_app/MainActivity.java b/integrations/android/example_app/app/src/main/java/com/example/joseph/example_app/MainActivity.java index 73cdfff..79be3f4 100644 --- a/integrations/android/example_app/app/src/main/java/com/example/joseph/example_app/MainActivity.java +++ b/integrations/android/example_app/app/src/main/java/com/example/joseph/example_app/MainActivity.java @@ -27,6 +27,7 @@ public class MainActivity extends AppCompatActivity { String nwid = "8056c2e21c000001"; // Set up service final ZTSDK zt = new ZTSDK(); + final String homeDir = getApplicationContext().getFilesDir() + "/zerotier"; new Thread(new Runnable() { public void run() { @@ -133,8 +134,7 @@ public class MainActivity extends AppCompatActivity { } // UDP Echo ZTSDK - if(mode==4) - { + if(mode==4) { // Remote server address (will be populated by recvfrom() ZTAddress remoteServer = new ZTAddress(); ZTAddress bindAddr = new ZTAddress("0.0.0.0", 8080); @@ -145,16 +145,15 @@ public class MainActivity extends AppCompatActivity { int sock = zt.socket(ZTSDK.AF_INET, ZTSDK.SOCK_DGRAM, 0); Log.d("ZTSDK", "binding..."); - if((err = zt.bind(sock, bindAddr, nwid)) < 0) + if ((err = zt.bind(sock, bindAddr, nwid)) < 0) Log.d("ZTSDK", "bind_err = " + err + "\n"); - if((err = zt.listen(sock, 0)) < 0) + if ((err = zt.listen(sock, 0)) < 0) Log.d("ZTSDK", "listen_err = " + err); ArrayList addresses = zt.get_addresses(nwid); - if(addresses.size() < 0) { + if (addresses.size() < 0) { Log.d("ZTSDK", "unable to obtain ZT address"); return; - } - else { + } else { Log.d("ZTSDK", "App IP = " + addresses.get(0)); } @@ -164,10 +163,10 @@ public class MainActivity extends AppCompatActivity { zt.fcntl(sock, ZTSDK.F_SETFL, ZTSDK.O_NONBLOCK); // ECHO - while(true) { + while (true) { // RX - if((err = zt.recvfrom(sock, buffer, 32, 0, remoteServer)) > 0) { + if ((err = zt.recvfrom(sock, buffer, 32, 0, remoteServer)) > 0) { bufStr = new String(buffer).substring(0, err); Log.d("ZTSDK", "read (" + err + ") bytes from " + remoteServer.Address() + " : " + remoteServer.Port() + ", msg = " + bufStr); diff --git a/integrations/android/example_app/app/src/main/jniLibs/README.md b/integrations/android/example_app/app/src/main/jniLibs/README.md index 8b9b102..229e587 100644 --- a/integrations/android/example_app/app/src/main/jniLibs/README.md +++ b/integrations/android/example_app/app/src/main/jniLibs/README.md @@ -5,68 +5,61 @@ Welcome! Imagine a flat, encrypted, no-configuration LAN for all of the instances of your Android app. This short tutorial will show you how to enable ZeroTier functionality for your Android app with little to no code modification. Check out our [ZeroTier SDK](https://www.zerotier.com/blog) page for more info on how the integration works. In this example we aim to set up a minimal [Android Studio](https://developer.android.com/studio/index.html) project which contains all of the components necessary to enable ZeroTier for your app. -*NOTE: For Android JNI libraries to build you'll need to install [Android Studio](https://developer.android.com/studio/index.html) the [Android NDK](https://developer.android.com/ndk/index.html). Currently only Android NDK r10e is supported and can be found [here for OSX](http://dl.google.com/android/repository/android-ndk-r10e-darwin-x86_64.zip) and [here for Linux](http://dl.google.com/android/repository/android-ndk-r10e-linux-x86_64.zip). You'll need to tell our project where you put it by putting the path in [this file](android/proj/local.properties), you'll need to install the Android Build-Tools (this can typically be done through the editor the first time you start it up), and finally you should probably upgrade your Gradle plugin if it asks you to. If you don't have these things installed and configured we will detect that and just skip those builds automatically.* +*NOTE: For Android JNI libraries to build you'll need to install [Android Studio](https://developer.android.com/studio/index.html) the [Android NDK](https://developer.android.com/ndk/index.html). Currently only Android NDK r10e is supported and can be found [here for OSX](http://dl.google.com/android/repository/android-ndk-r10e-darwin-x86_64.zip) and [here for Linux](http://dl.google.com/android/repository/android-ndk-r10e-linux-x86_64.zip). You'll need to tell our project where you put it by putting the path in [this file](android_jni_lib/proj/local.properties), you'll need to install the Android Build-Tools (this can typically be done through the editor the first time you start it up), and finally you should probably upgrade your Gradle plugin if it asks you to. If you don't have these things installed and configured we will detect that and just skip those builds automatically.* -If you want to skip these steps and just take a look at the project, go [here](example_app). +If you want to skip the following steps and just take a look at the project, go [here](example_app). *** -**Step 1: Select build targets** - - Specify the target architectures you want to build in [Application.mk](android/java/jni/Application.mk). By default it will build `arm64-v8a`, `armeabi`, `armeabi-v7a`, `mips`, `mips64`, `x86`, and `x86_64`. -**Step 2: Build Shared Library** - - `make android_jni_lib` - - The resultant `build/android_jni_lib_YOUR_ARCH/libZeroTierOneJNI.so` is what you want to import into your own project to provide the API to your app. Select your architecture and copy the shared library into your project's JNI directory, possibly `/src/main/jniLibs/YOUR_ARCH/`. Selecting only the architectures you need will *significantly* reduce overall build time. +**Step 1: App Code Modifications** + - In your project, create a new package called `ZeroTier` and class file within called `ZTSDK.java` and copy contents from `src/wrappers/java/JavaWrapper.java` + + - Start the service -**Step 3: App permissions** + ``` + String nwid = "8056c2e21c000001"; + // Set up service + final ZTSDK zt = new ZTSDK(); + final String homeDir = getApplicationContext().getFilesDir() + "/zerotier"; + new Thread(new Runnable() { + public void run() { + // Calls to JNI code + zt.start_service(homeDir); + } + }).start(); + while(!zt.running()) { } + ``` + + - Join network and start doing network stuff! + + ``` + zt.join_network(nwid); + int sock = zt.socket(zt.AF_INET, zt.SOCK_STREAM, 0); + int err = zt.connect(sock, "10.9.9.203", 8080, nwid); + // zt.recvfrom(), zt.write(), etc... + ``` + +**Step 2: App permissions** - In order for your application to write the auth keys and network files to the internal storage you'll need to set a few permissions in your `AndroidManifest.xml` file at the same scope level as ``: -``` - - -``` + ``` + + + ``` -**Step 4: App Code Modifications** - - Create new package called `ZeroTierSDK` in your project and add a new file called `ZeroTierSDK.java` containing: +**Step 3: Set NDK/SDK paths** + - Specify your SDK/NDK path in `android_jni_lib/proj/local.properties`. For example: -``` -package ZeroTier; -public class ZeroTierSDK { - public native void startOneService(String homeDir); - public native void joinNetwork(String nwid); - public native void leaveNetwork(String nwid); - public native boolean isRunning(); - static { System.loadLibrary("ZeroTierOneJNI"); } // Loads JNI code -} -``` + ``` + sdk.dir=/Users/Name/Library/Android/sdk + ndk.dir=/Users/Name/Library/Android/ndk-r10e + ``` - - Start the service +**Step 4: Select build targets** + - Specify the target architectures you want to build in [Application.mk](android_jni_lib/java/jni/Application.mk). By default it will build `arm64-v8a`, `armeabi`, `armeabi-v7a`, `mips`, `mips64`, `x86`, and `x86_64`. For each architecture you wish to support a different shared library will need to be built. This is all taken care of automatically by the build script. -``` -final SDK zt = new SDK(); -final String homeDir = getApplicationContext().getFilesDir() + "/zerotier"; - -new Thread(new Runnable() { - public void run() { - // Calls to JNI code - zt.zt_start_service(homeDir); - } -}).start(); -``` - - - Join network and perform network call - -``` -while(!zt.zt_running()) { } -zt.zt_join_network("XXXXXXXXXXXXXXXX"); - -// Create ZeroTier socket -int sock = zt.zt_socket(zt.AF_INET, zt.SOCK_STREAM, 0); - -// Connect to remote host -int err = zt.zt_connect(sock, "10.9.9.203", 8080); -``` - -*** - -*Note for the curious on JNI naming conventions: In order to reference a symbol in the JNI library you need to structure the package and class in your Android Studio project in a very particular way. For example, in the ZeroTierSDK we define a function called `Java_ZeroTier_SDK_zt_1start_1service`, the name can be broken down as follows: `Java_PACKAGENAME_CLASSNAME_zt_1start_1service`, so as we've defined it, you must create a package called `ZeroTier` and add a class called `SDK`.* \ No newline at end of file +**Step 4: Build Shared Library** + - `make android_jni_lib` + - The resultant `build/android_jni_lib/ARCH/libZeroTierOneJNI.so` is what you want to import into your own project to provide our API implementation to your app. Select your architecture and copy the shared library `libZeroTierOneJNI.so` into your project's JNI directory, possibly `/src/main/jniLibs/ARCH/libZeroTierOneJNI.so`. + - Selecting only the architectures you need will *significantly* reduce overall build time. diff --git a/integrations/android/example_app/build.gradle b/integrations/android/example_app/build.gradle index aff4f41..f330f0b 100644 --- a/integrations/android/example_app/build.gradle +++ b/integrations/android/example_app/build.gradle @@ -1,11 +1,12 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. + buildscript { repositories { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.1.2' + classpath 'com.android.tools.build:gradle:2.2.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/integrations/android/example_app/gradle/wrapper/gradle-wrapper.properties b/integrations/android/example_app/gradle/wrapper/gradle-wrapper.properties index bb42b01..b580b84 100644 --- a/integrations/android/example_app/gradle/wrapper/gradle-wrapper.properties +++ b/integrations/android/example_app/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Dec 28 10:00:20 PST 2015 +#Thu Dec 15 15:58:49 PST 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https://downloads.gradle.org/distributions/gradle-2.14-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip diff --git a/integrations/apple/ZeroTierSDK_Apple/ZeroTierSDK_Apple.xcodeproj/project.pbxproj b/integrations/apple/ZeroTierSDK_Apple/ZeroTierSDK_Apple.xcodeproj/project.pbxproj index d41a557..7dd75a1 100644 --- a/integrations/apple/ZeroTierSDK_Apple/ZeroTierSDK_Apple.xcodeproj/project.pbxproj +++ b/integrations/apple/ZeroTierSDK_Apple/ZeroTierSDK_Apple.xcodeproj/project.pbxproj @@ -159,6 +159,71 @@ 7CC004D11D131E37003E68DC /* http_parser.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003571D1217A1003E68DC /* http_parser.c */; }; 7CC005201D1324B3003E68DC /* lz4.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CC0035A1D1217B2003E68DC /* lz4.c */; }; 7CC005211D1324B3003E68DC /* http_parser.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003571D1217A1003E68DC /* http_parser.c */; }; + 7CD785601E08C7B500E03BF0 /* lwip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C2228CF1DCC1193006A2661 /* lwip.cpp */; }; + 7CD785611E08C7B500E03BF0 /* rpc.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C7D527B1DBEADD200896C93 /* rpc.c */; }; + 7CD785621E08C7B500E03BF0 /* service.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C7D527D1DBEADD200896C93 /* service.cpp */; }; + 7CD785631E08C7B500E03BF0 /* sockets.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C7D527F1DBEADD200896C93 /* sockets.c */; }; + 7CD785641E08C7B500E03BF0 /* tap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C7D52801DBEADD200896C93 /* tap.cpp */; }; + 7CD785661E08C7B500E03BF0 /* ManagedRoute.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C7AF0231DFA1B5C00AABE75 /* ManagedRoute.cpp */; }; + 7CD785671E08C7B500E03BF0 /* BackgroundResolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF58E1DBAD10A006585E7 /* BackgroundResolver.cpp */; }; + 7CD785681E08C7B500E03BF0 /* DeferredPackets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5891DBAD0BF006585E7 /* DeferredPackets.cpp */; }; + 7CD785691E08C7B500E03BF0 /* OneService.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5821DBACB3E006585E7 /* OneService.cpp */; }; + 7CD7856A1E08C7B500E03BF0 /* C25519.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5121DBAC872006585E7 /* C25519.cpp */; }; + 7CD7856B1E08C7B500E03BF0 /* CertificateOfMembership.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5141DBAC872006585E7 /* CertificateOfMembership.cpp */; }; + 7CD7856C1E08C7B500E03BF0 /* Cluster.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5161DBAC872006585E7 /* Cluster.cpp */; }; + 7CD7856D1E08C7B500E03BF0 /* Identity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF51E1DBAC872006585E7 /* Identity.cpp */; }; + 7CD7856E1E08C7B500E03BF0 /* IncomingPacket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5201DBAC872006585E7 /* IncomingPacket.cpp */; }; + 7CD7856F1E08C7B500E03BF0 /* InetAddress.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5221DBAC872006585E7 /* InetAddress.cpp */; }; + 7CD785701E08C7B500E03BF0 /* Multicaster.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5251DBAC872006585E7 /* Multicaster.cpp */; }; + 7CD785711E08C7B500E03BF0 /* Network.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5291DBAC872006585E7 /* Network.cpp */; }; + 7CD785721E08C7B500E03BF0 /* NetworkConfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF52B1DBAC872006585E7 /* NetworkConfig.cpp */; }; + 7CD785731E08C7B500E03BF0 /* Node.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF52F1DBAC872006585E7 /* Node.cpp */; }; + 7CD785741E08C7B500E03BF0 /* OutboundMulticast.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5321DBAC872006585E7 /* OutboundMulticast.cpp */; }; + 7CD785751E08C7B500E03BF0 /* Packet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5341DBAC872006585E7 /* Packet.cpp */; }; + 7CD785761E08C7B500E03BF0 /* Path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5361DBAC872006585E7 /* Path.cpp */; }; + 7CD785771E08C7B500E03BF0 /* Peer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5381DBAC872006585E7 /* Peer.cpp */; }; + 7CD785781E08C7B500E03BF0 /* Poly1305.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF53A1DBAC872006585E7 /* Poly1305.cpp */; }; + 7CD785791E08C7B500E03BF0 /* Salsa20.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF53D1DBAC872006585E7 /* Salsa20.cpp */; }; + 7CD7857A1E08C7B500E03BF0 /* SelfAwareness.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF53F1DBAC872006585E7 /* SelfAwareness.cpp */; }; + 7CD7857B1E08C7B500E03BF0 /* SHA512.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5411DBAC872006585E7 /* SHA512.cpp */; }; + 7CD7857C1E08C7B500E03BF0 /* Switch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5441DBAC872006585E7 /* Switch.cpp */; }; + 7CD7857D1E08C7B500E03BF0 /* Topology.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5461DBAC872006585E7 /* Topology.cpp */; }; + 7CD7857E1E08C7B500E03BF0 /* Utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5481DBAC872006585E7 /* Utils.cpp */; }; + 7CD7857F1E08C7B500E03BF0 /* Arp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF4F81DBAC841006585E7 /* Arp.cpp */; }; + 7CD785801E08C7B500E03BF0 /* Http.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF4FD1DBAC841006585E7 /* Http.cpp */; }; + 7CD785811E08C7B500E03BF0 /* OSUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF4FF1DBAC841006585E7 /* OSUtils.cpp */; }; + 7CD785821E08C7B500E03BF0 /* PortMapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5021DBAC841006585E7 /* PortMapper.cpp */; }; + 7CD785831E08C7B500E03BF0 /* ControlPlane.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF4F11DBAC80C006585E7 /* ControlPlane.cpp */; }; + 7CD785841E08C7C300E03BF0 /* tcp_in.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5901DBADA69006585E7 /* tcp_in.c */; }; + 7CD785851E08C7C300E03BF0 /* tcp_out.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5911DBADA69006585E7 /* tcp_out.c */; }; + 7CD785861E08C7C300E03BF0 /* tcp.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5921DBADA69006585E7 /* tcp.c */; }; + 7CD785871E08C7C300E03BF0 /* err.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5871DBACEC3006585E7 /* err.c */; }; + 7CD785881E08C7C300E03BF0 /* ethernet.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5851DBACE7E006585E7 /* ethernet.c */; }; + 7CD785891E08C7C300E03BF0 /* tcpip.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C969C7B1DBAA61700BD3F7F /* tcpip.c */; }; + 7CD7858A1E08C7C300E03BF0 /* autoip.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C969C731DBAA5FF00BD3F7F /* autoip.c */; }; + 7CD7858B1E08C7C300E03BF0 /* dhcp.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C969C741DBAA5FF00BD3F7F /* dhcp.c */; }; + 7CD7858C1E08C7C300E03BF0 /* etharp.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C969C751DBAA5FF00BD3F7F /* etharp.c */; }; + 7CD7858D1E08C7C300E03BF0 /* icmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C969C761DBAA5FF00BD3F7F /* icmp.c */; }; + 7CD7858E1E08C7C300E03BF0 /* igmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C969C771DBAA5FF00BD3F7F /* igmp.c */; }; + 7CD7858F1E08C7C300E03BF0 /* ip4_addr.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C969C781DBAA5FF00BD3F7F /* ip4_addr.c */; }; + 7CD785901E08C7C300E03BF0 /* ip4_frag.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C969C791DBAA5FF00BD3F7F /* ip4_frag.c */; }; + 7CD785911E08C7C300E03BF0 /* ip4.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C969C7A1DBAA5FF00BD3F7F /* ip4.c */; }; + 7CD785921E08C7E200E03BF0 /* inet_chksum.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C969B3E1DB99E7900BD3F7F /* inet_chksum.c */; }; + 7CD785931E08C7E200E03BF0 /* init.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C969B3F1DB99E7900BD3F7F /* init.c */; }; + 7CD785941E08C7E200E03BF0 /* ip.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C969B401DB99E7900BD3F7F /* ip.c */; }; + 7CD785951E08C7E200E03BF0 /* mem.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C969B411DB99E7900BD3F7F /* mem.c */; }; + 7CD785961E08C7E200E03BF0 /* memp.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C969B421DB99E7900BD3F7F /* memp.c */; }; + 7CD785971E08C7E200E03BF0 /* netif.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C969B431DB99E7900BD3F7F /* netif.c */; }; + 7CD785981E08C7E200E03BF0 /* pbuf.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C969B441DB99E7900BD3F7F /* pbuf.c */; }; + 7CD785991E08C7E200E03BF0 /* raw.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C969B451DB99E7900BD3F7F /* raw.c */; }; + 7CD7859A1E08C7E200E03BF0 /* stats.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C969B461DB99E7900BD3F7F /* stats.c */; }; + 7CD7859B1E08C7E200E03BF0 /* sys.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C969B471DB99E7900BD3F7F /* sys.c */; }; + 7CD7859C1E08C7E200E03BF0 /* timeouts.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C969B4B1DB99E7900BD3F7F /* timeouts.c */; }; + 7CD7859D1E08C7E200E03BF0 /* udp.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C969B4C1DB99E7900BD3F7F /* udp.c */; }; + 7CD7859E1E08C7E200E03BF0 /* json.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C0463251DE362BD003E2B0E /* json.c */; }; + 7CD7859F1E08C87A00E03BF0 /* proxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C7D527A1DBEADD200896C93 /* proxy.cpp */; }; + 7CD785A01E08C87A00E03BF0 /* def.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C969B3C1DB99E7900BD3F7F /* def.c */; }; + 7CD785A11E08C87A00E03BF0 /* dns.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C969B3D1DB99E7900BD3F7F /* dns.c */; }; 7CEAF4F61DBAC80C006585E7 /* ControlPlane.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF4F11DBAC80C006585E7 /* ControlPlane.cpp */; }; 7CEAF5071DBAC841006585E7 /* Arp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF4F81DBAC841006585E7 /* Arp.cpp */; }; 7CEAF5091DBAC841006585E7 /* Http.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF4FD1DBAC841006585E7 /* Http.cpp */; }; @@ -1148,6 +1213,71 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 7CD7859F1E08C87A00E03BF0 /* proxy.cpp in Sources */, + 7CD7858A1E08C7C300E03BF0 /* autoip.c in Sources */, + 7CD7858B1E08C7C300E03BF0 /* dhcp.c in Sources */, + 7CD7858C1E08C7C300E03BF0 /* etharp.c in Sources */, + 7CD7858D1E08C7C300E03BF0 /* icmp.c in Sources */, + 7CD7858E1E08C7C300E03BF0 /* igmp.c in Sources */, + 7CD7858F1E08C7C300E03BF0 /* ip4_addr.c in Sources */, + 7CD785901E08C7C300E03BF0 /* ip4_frag.c in Sources */, + 7CD785911E08C7C300E03BF0 /* ip4.c in Sources */, + 7CD785A01E08C87A00E03BF0 /* def.c in Sources */, + 7CD785A11E08C87A00E03BF0 /* dns.c in Sources */, + 7CD785841E08C7C300E03BF0 /* tcp_in.c in Sources */, + 7CD785851E08C7C300E03BF0 /* tcp_out.c in Sources */, + 7CD785861E08C7C300E03BF0 /* tcp.c in Sources */, + 7CD785921E08C7E200E03BF0 /* inet_chksum.c in Sources */, + 7CD785931E08C7E200E03BF0 /* init.c in Sources */, + 7CD785941E08C7E200E03BF0 /* ip.c in Sources */, + 7CD785951E08C7E200E03BF0 /* mem.c in Sources */, + 7CD785961E08C7E200E03BF0 /* memp.c in Sources */, + 7CD785971E08C7E200E03BF0 /* netif.c in Sources */, + 7CD785981E08C7E200E03BF0 /* pbuf.c in Sources */, + 7CD785991E08C7E200E03BF0 /* raw.c in Sources */, + 7CD7859A1E08C7E200E03BF0 /* stats.c in Sources */, + 7CD7859B1E08C7E200E03BF0 /* sys.c in Sources */, + 7CD7859C1E08C7E200E03BF0 /* timeouts.c in Sources */, + 7CD7859D1E08C7E200E03BF0 /* udp.c in Sources */, + 7CD7859E1E08C7E200E03BF0 /* json.c in Sources */, + 7CD785871E08C7C300E03BF0 /* err.c in Sources */, + 7CD785881E08C7C300E03BF0 /* ethernet.c in Sources */, + 7CD785891E08C7C300E03BF0 /* tcpip.c in Sources */, + 7CD785601E08C7B500E03BF0 /* lwip.cpp in Sources */, + 7CD785611E08C7B500E03BF0 /* rpc.c in Sources */, + 7CD785621E08C7B500E03BF0 /* service.cpp in Sources */, + 7CD785631E08C7B500E03BF0 /* sockets.c in Sources */, + 7CD785641E08C7B500E03BF0 /* tap.cpp in Sources */, + 7CD785661E08C7B500E03BF0 /* ManagedRoute.cpp in Sources */, + 7CD785671E08C7B500E03BF0 /* BackgroundResolver.cpp in Sources */, + 7CD785681E08C7B500E03BF0 /* DeferredPackets.cpp in Sources */, + 7CD785691E08C7B500E03BF0 /* OneService.cpp in Sources */, + 7CD7856A1E08C7B500E03BF0 /* C25519.cpp in Sources */, + 7CD7856B1E08C7B500E03BF0 /* CertificateOfMembership.cpp in Sources */, + 7CD7856C1E08C7B500E03BF0 /* Cluster.cpp in Sources */, + 7CD7856D1E08C7B500E03BF0 /* Identity.cpp in Sources */, + 7CD7856E1E08C7B500E03BF0 /* IncomingPacket.cpp in Sources */, + 7CD7856F1E08C7B500E03BF0 /* InetAddress.cpp in Sources */, + 7CD785701E08C7B500E03BF0 /* Multicaster.cpp in Sources */, + 7CD785711E08C7B500E03BF0 /* Network.cpp in Sources */, + 7CD785721E08C7B500E03BF0 /* NetworkConfig.cpp in Sources */, + 7CD785731E08C7B500E03BF0 /* Node.cpp in Sources */, + 7CD785741E08C7B500E03BF0 /* OutboundMulticast.cpp in Sources */, + 7CD785751E08C7B500E03BF0 /* Packet.cpp in Sources */, + 7CD785761E08C7B500E03BF0 /* Path.cpp in Sources */, + 7CD785771E08C7B500E03BF0 /* Peer.cpp in Sources */, + 7CD785781E08C7B500E03BF0 /* Poly1305.cpp in Sources */, + 7CD785791E08C7B500E03BF0 /* Salsa20.cpp in Sources */, + 7CD7857A1E08C7B500E03BF0 /* SelfAwareness.cpp in Sources */, + 7CD7857B1E08C7B500E03BF0 /* SHA512.cpp in Sources */, + 7CD7857C1E08C7B500E03BF0 /* Switch.cpp in Sources */, + 7CD7857D1E08C7B500E03BF0 /* Topology.cpp in Sources */, + 7CD7857E1E08C7B500E03BF0 /* Utils.cpp in Sources */, + 7CD7857F1E08C7B500E03BF0 /* Arp.cpp in Sources */, + 7CD785801E08C7B500E03BF0 /* Http.cpp in Sources */, + 7CD785811E08C7B500E03BF0 /* OSUtils.cpp in Sources */, + 7CD785821E08C7B500E03BF0 /* PortMapper.cpp in Sources */, + 7CD785831E08C7B500E03BF0 /* ControlPlane.cpp in Sources */, 7CC005201D1324B3003E68DC /* lz4.c in Sources */, 7CC005211D1324B3003E68DC /* http_parser.c in Sources */, ); @@ -1411,7 +1541,6 @@ "-DSDK_BUNDLED", "-DSDK_DEBUG", "-D__XCODE__", - "-DLWIP_DEBUG", "-DSDK_IPV4", "-DUSING_BRIDGING_HEADER", "-DSDK_LWIP", @@ -1466,6 +1595,8 @@ "$(SRCROOT)/../../../ext/lwip/src/include/ipv4/", "$(SRCROOT)/../../../zerotierone", "$(SRCROOT)/../../../ext/lwip/src/include/", + "$(SRCROOT)/../../../ext", + "$(SRCROOT)/../../../src", ); INFOPLIST_FILE = ZeroTierSDK_Unity3D_OSX/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; @@ -1474,6 +1605,8 @@ "-DSDK", "-D__UNITY_3D__", "-DSDK_BUNDLED", + "-DSDK_IPV4=1", + "-DSDK_LWIP=1", ); PRODUCT_BUNDLE_IDENTIFIER = "zerotier.ZeroTierSDK-Unity3D-OSX"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1490,6 +1623,8 @@ "$(SRCROOT)/../../../ext/lwip/src/include/ipv4/", "$(SRCROOT)/../../../zerotierone", "$(SRCROOT)/../../../ext/lwip/src/include/", + "$(SRCROOT)/../../../ext", + "$(SRCROOT)/../../../src", ); INFOPLIST_FILE = ZeroTierSDK_Unity3D_OSX/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; @@ -1499,6 +1634,8 @@ "-DUSE_SOCKS_PROXY", "-D__UNITY_3D__", "-DSDK_BUNDLED", + "-DSDK_IPV4=1", + "-DSDK_LWIP=1", ); PRODUCT_BUNDLE_IDENTIFIER = "zerotier.ZeroTierSDK-Unity3D-OSX"; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/make-linux.mk b/make-linux.mk index 106ba9d..7193bb5 100644 --- a/make-linux.mk +++ b/make-linux.mk @@ -32,7 +32,7 @@ CXXFLAGS=$(CFLAGS) -fno-rtti include objects.mk # Target output filenames -SHARED_LIB_NAME = libztlinux.so +STATIC_LIB_NAME = libzt.a SDK_INTERCEPT_NAME = libztintercept.so SDK_SERVICE_NAME = zerotier-sdk-service ONE_SERVICE_NAME = zerotier-one @@ -41,7 +41,7 @@ ONE_ID_TOOL_NAME = zerotier-idtool LWIP_LIB_NAME = liblwip.so PICO_LIB_NAME = libpicotcp.so # -SHARED_LIB = $(BUILD)/$(SHARED_LIB_NAME) +STATIC_LIB = $(BUILD)/$(STATIC_LIB_NAME) SDK_INTERCEPT = $(BUILD)/$(SDK_INTERCEPT_NAME) SDK_SERVICE = $(BUILD)/$(SDK_SERVICE_NAME) ONE_SERVICE = $(BUILD)/$(ONE_SERVICE_NAME) @@ -178,7 +178,7 @@ jip: # ------------------------------------------------------------------------------ # Build everything -linux: one linux_service_and_intercept linux_shared_lib +linux: one linux_service_and_intercept linux_static_lib # Build vanilla ZeroTier One binary one: $(OBJS) $(ZT1)/service/OneService.o $(ZT1)/one.o $(ZT1)/osdep/LinuxEthernetTap.o @@ -216,10 +216,10 @@ endif # Build both intercept library and SDK service (separate) linux_service_and_intercept: linux_intercept linux_sdk_service -# Builds a single shared library which contains everything +# Builds a single static library which contains everything linux_static_lib: pico $(OBJS) $(CXX) $(CXXFLAGS) $(STACK_FLAGS) $(DEFS) $(INCLUDES) $(ZTFLAGS) -DSDK_SERVICE -DSDK -DSDK_BUNDLED $(PICO_DRIVER_FILES) $(SDK_INTERCEPT_C_FILES) $(SDK_SERVICE_CPP_FILES) src/service.cpp -c - ar -rcs build/libzt.a picotcp.o proxy.o tap.o one.o OneService.o service.o sockets.o rpc.o intercept.o OneService.o $(OBJS) + ar -rcs build/libzt.a picotcp.o proxy.o tap.o one.o OneService.o service.o sockets.o rpc.o intercept.o $(OBJS) # Builds zts_* library tests linux_static_lib_tests: @@ -308,7 +308,7 @@ check: -./check.sh $(SDK_INTERCEPT) -./check.sh $(ONE_SERVICE) -./check.sh $(SDK_SERVICE) - -./check.sh $(SHARED_LIB) + -./check.sh $(STATIC_LIB) -./check.sh $(BUILD)/android_jni_lib/arm64-v8a/libZeroTierOneJNI.so -./check.sh $(BUILD)/android_jni_lib/armeabi/libZeroTierOneJNI.so -./check.sh $(BUILD)/android_jni_lib/armeabi-v7a/libZeroTierOneJNI.so @@ -323,16 +323,9 @@ TEST_OBJDIR := $(BUILD)/tests TEST_SOURCES := $(wildcard tests/api_test/*.c) TEST_TARGETS := $(addprefix $(BUILD)/tests/$(OSTYPE).,$(notdir $(TEST_SOURCES:.c=.out))) -LIB_TEST_SOURCES := $(wildcard tests/shared_test/*.c) -LIB_TEST_TARGETS := $(addprefix $(BUILD)/tests/$(OSTYPE).,$(notdir $(LIB_TEST_SOURCES:.c=.out))) - $(BUILD)/tests/$(OSTYPE).%.out: tests/api_test/%.c -$(CC) $(CC_FLAGS) -o $@ $< -$(BUILD)/tests/$(OSTYPE).%.out: tests/shared_test/%.c - #-$(CC) $(CC_FLAGS) -o $@ $< - -$(CXX) $(CXXFLAGS) $(LDFLAGS) $(INCLUDES) $(STACK_FLAGS) $(DEFS) -DSDK_SERVICE -DSDK -DSDK_BUNDLED -Isrc tests/shared_test/zts.tcpserver4.c -Lbuild -lzt -ldl -o $@ $< - $(TEST_OBJDIR): mkdir -p $(TEST_OBJDIR) diff --git a/make-mac.mk b/make-mac.mk index 63cd752..248b564 100644 --- a/make-mac.mk +++ b/make-mac.mk @@ -32,7 +32,7 @@ CXXFLAGS=$(CFLAGS) -fno-rtti include objects.mk # Target output filenames -SHARED_LIB_NAME = libztosx.so +STATIC_LIB_NAME = libzt.a INTERCEPT_NAME = libztintercept.so SDK_SERVICE_NAME = zerotier-sdk-service ONE_SERVICE_NAME = zerotier-one @@ -41,7 +41,7 @@ ONE_ID_TOOL_NAME = zerotier-idtool LWIP_LIB_NAME = liblwip.so PICO_LIB_NAME = libpicotcp.so # -SHARED_LIB = $(BUILD)/$(SHARED_LIB_NAME) +STATIC_LIB = $(BUILD)/$(STATIC_LIB_NAME) SDK_INTERCEPT = $(BUILD)/$(INTERCEPT_NAME) SDK_SERVICE = $(BUILD)/$(SDK_SERVICE_NAME) ONE_SERVICE = $(BUILD)/$(ONE_SERVICE_NAME) @@ -91,6 +91,7 @@ CODESIGN_INSTALLER_CERT= # Debug output for ZeroTier service ifeq ($(ZT_DEBUG),1) DEFS+=-DZT_TRACE + #CFLAGS+=-Wall -fPIE -fvisibility=hidden -pthread $(INCLUDES) $(DEFS) CFLAGS+=-Wall -g -pthread $(INCLUDES) $(DEFS) STRIP=echo # The following line enables optimization for the crypto code, since @@ -98,7 +99,8 @@ ifeq ($(ZT_DEBUG),1) #ext/lz4/lz4.o node/Salsa20.o node/SHA512.o node/C25519.o node/Poly1305.o: CFLAGS = -Wall -O2 -g -pthread $(INCLUDES) $(DEFS) else CFLAGS?=-Ofast -fstack-protector - CFLAGS+=$(ARCH_FLAGS) -Wall -flto -fPIE -pthread -mmacosx-version-min=10.7 -DNDEBUG -Wno-unused-private-field $(INCLUDES) $(DEFS) + CFLAGS+=-Wall -fPIE -fvisibility=hidden -pthread $(INCLUDES) $(DEFS) + #CFLAGS+=$(ARCH_FLAGS) -Wall -flto -fPIC -pthread -mmacosx-version-min=10.7 -DNDEBUG -Wno-unused-private-field $(INCLUDES) $(DEFS) STRIP=strip endif @@ -184,7 +186,7 @@ one: $(OBJS) $(ZT1)/service/OneService.o $(ZT1)/one.o $(ZT1)/osdep/OSXEthernetTa ios: ios_app_framework ios_unity3d_bundle # Build all OSX targets -osx: osx_app_framework osx_unity3d_bundle osx_sdk_service osx_intercept +osx: osx_app_framework osx_unity3d_bundle osx_sdk_service osx_intercept osx_static_lib # --------------------------------------- # ----------- App Frameworks ------------ @@ -248,11 +250,11 @@ osx_service_and_intercept: osx_intercept osx_sdk_service ifeq ($(SDK_LWIP),1) osx_static_lib: lwip $(OBJS) $(CXX) $(CXXFLAGS) $(STACK_FLAGS) $(DEFS) $(INCLUDES) $(ZTFLAGS) -DSDK_SERVICE -DSDK -DSDK_BUNDLED $(LWIP_DRIVER_FILES) $(SDK_INTERCEPT_C_FILES) $(SDK_SERVICE_CPP_FILES) src/service.cpp -c - libtool -static -o build/libzt.a lwip.o proxy.o tap.o one.o OneService.o service.o sockets.o rpc.o intercept.o OneService.o $(OBJS) + ar -rcs build/libzt.a lwip.o proxy.o tap.o one.o OneService.o service.o sockets.o rpc.o intercept.o $(OBJS) else osx_static_lib: pico $(OBJS) $(CXX) $(CXXFLAGS) $(STACK_FLAGS) $(DEFS) $(INCLUDES) $(ZTFLAGS) -DSDK_SERVICE -DSDK -DSDK_BUNDLED $(PICO_DRIVER_FILES) $(SDK_INTERCEPT_C_FILES) $(SDK_SERVICE_CPP_FILES) src/service.cpp -c - libtool -static -o build/libzt.a picotcp.o proxy.o tap.o one.o OneService.o service.o sockets.o rpc.o intercept.o OneService.o $(OBJS) + libtool -static -o build/libzt.a lwip.o proxy.o tap.o one.o OneService.o service.o sockets.o rpc.o intercept.o OneService.o $(OBJS) endif # Builds zts_* library tests @@ -261,10 +263,6 @@ osx_static_lib_tests: $(CXX) $(CXXFLAGS) $(LDFLAGS) $(INCLUDES) $(STACK_FLAGS) $(DEFS) -DSDK_SERVICE -DSDK -DSDK_BUNDLED -Isrc tests/shared_test/zts.tcpserver4.c -o $(TEST_OBJDIR)/$(OSTYPE).zts.tcpserver4.out -Lbuild -lzt -ldl $(CXX) $(CXXFLAGS) $(LDFLAGS) $(INCLUDES) $(STACK_FLAGS) $(DEFS) -DSDK_SERVICE -DSDK -DSDK_BUNDLED -Isrc tests/shared_test/zts.tcpclient4.c -o $(TEST_OBJDIR)/$(OSTYPE).zts.tcpclient4.out -Lbuild -lzt -ldl -osx_dynamic_lib: - -osx_dynamic_lib_tests: - # ------------------------------------------------------------------------------ # ---------------------------------- Android ----------------------------------- # ------------------------------------------------------------------------------ @@ -277,7 +275,6 @@ android: android_jni_lib # Build library for Android Unity integrations # Build JNI library for Android app integration android_jni_lib: - -./increment.sh cd $(INT)/android/android_jni_lib/proj; ./gradlew assembleDebug mkdir -p $(BUILD)/android_jni_lib cp docs/android.md $(BUILD)/android_jni_lib/README.md @@ -295,7 +292,7 @@ check: -./check.sh $(SDK_INTERCEPT) -./check.sh $(ONE_SERVICE) -./check.sh $(SDK_SERVICE) - -./check.sh $(SHARED_LIB) + -./check.sh $(STATIC_LIB) -./check.sh $(BUILD)/osx_unity3d_bundle/Debug/ZeroTierSDK_Unity3D_OSX.bundle -./check.sh $(BUILD)/osx_app_framework/Debug/ZeroTierSDK_OSX.framework -./check.sh $(BUILD)/ios_app_framework/Debug-iphoneos/ZeroTierSDK_iOS.framework diff --git a/src/debug.h b/src/debug.h index 0f4a37d..0627d01 100644 --- a/src/debug.h +++ b/src/debug.h @@ -95,6 +95,8 @@ extern "C" { #if defined(__ANDROID__) #define DEBUG_INFO(fmt, args...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, "ZT_INFO : %14s:%4d:%20s: " fmt "\n", __FILENAME__, __LINE__, __FUNCTION__, ##args)) #define DEBUG_BLANK(fmt, args...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, "ZT_INFO : %14s:%4d:" fmt "\n", __FILENAME__, __LINE__, __FUNCTION__, ##args)) + #define DEBUG_ATTN(fmt, args...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, "ZT_INFO : %14s:%4d:%25s: " fmt "\n", __FILENAME__, __LINE__, __FUNCTION__, ##args)) + #define DEBUG_STACK(fmt, args...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, "ZT_STACK: %14s:%4d:%25s: " fmt "\n", __FILENAME__, __LINE__, __FUNCTION__, ##args)) #else #define DEBUG_INFO(fmt, args...) fprintf(stderr, "ZT_INFO : %14s:%4d:%25s: " fmt "\n", __FILENAME__, __LINE__, __FUNCTION__, ##args) #define DEBUG_ATTN(fmt, args...) fprintf(stderr, CYN "ZT_INFO : %14s:%4d:%25s: " fmt "\n" RESET, __FILENAME__, __LINE__, __FUNCTION__, ##args) diff --git a/src/service.cpp b/src/service.cpp index fe085e5..765da34 100644 --- a/src/service.cpp +++ b/src/service.cpp @@ -163,7 +163,10 @@ void zts_stop_service() { bool zts_has_address(const char *nwid) { + DEBUG_ERROR(); char ipv4_addr[64], ipv6_addr[64]; + memset(ipv4_addr, 0, 64); + memset(ipv6_addr, 0, 64); zts_get_ipv4_address(nwid, ipv4_addr); zts_get_ipv6_address(nwid, ipv6_addr); if(!strcmp(ipv4_addr, "-1.-1.-1.-1/-1") && !strcmp(ipv4_addr, "-1.-1.-1.-1/-1")) { @@ -363,7 +366,7 @@ void zts_start_service(const char *path) const char *nwid_str = env->GetStringUTFChars(nwid, NULL); char address_string[32]; memset(address_string, 0, 32); - zts_get_addresses(nwid_str, address_string); + zts_get_ipv4_address(nwid_str, address_string); jclass clazz = (*env).FindClass("java/util/ArrayList"); jobject addresses = (*env).NewObject(clazz, (*env).GetMethodID(clazz, "", "()V")); jstring _str = (*env).NewStringUTF(address_string); @@ -375,7 +378,7 @@ void zts_start_service(const char *path) const char *nwid_str = env->GetStringUTFChars(nwid, NULL); char address_string[32]; memset(address_string, 0, 32); - zts_get_addresses(nwid_str, address_string); + zts_get_ipv6_address(nwid_str, address_string); jclass clazz = (*env).FindClass("java/util/ArrayList"); jobject addresses = (*env).NewObject(clazz, (*env).GetMethodID(clazz, "", "()V")); jstring _str = (*env).NewStringUTF(address_string); @@ -436,11 +439,8 @@ void zts_start_service(const char *path) void *zts_start_core_service(void *thread_id) { #if defined(SDK_BUNDLED) - homeDir = std::string((char*)thread_id); - #endif - - #if defined(__ANDROID__) - DEBUG_INFO("ZTSDK_BUILD_VERSION = %d", ZTSDK_BUILD_VERSION); + if(thread_id) + homeDir = std::string((char*)thread_id); #endif char current_dir[MAX_DIR_SZ]; @@ -510,7 +510,8 @@ void *zts_start_core_service(void *thread_id) { #if defined(__UNITY_3D__) DEBUG_INFO("starting service..."); #endif - + DEBUG_INFO("starting service..."); + // Initialize RPC // TODO: remove? if(rpcEnabled) { diff --git a/src/sockets.c b/src/sockets.c index 18339e0..2fffef2 100644 --- a/src/sockets.c +++ b/src/sockets.c @@ -130,7 +130,7 @@ int (*realclose)(CLOSE_SIG); DEBUG_ATTN("waiting for service to assign address to network stack"); // wait for zt service to assign the network stack an address sleep(1); - while(!zts_has_address(nwid)) { } + while(!zts_has_address(nwid)) { usleep(1000); } } #endif } diff --git a/src/stack_drivers/lwip/lwip.hpp b/src/stack_drivers/lwip/lwip.hpp index d6e72c7..f36aa6b 100644 --- a/src/stack_drivers/lwip/lwip.hpp +++ b/src/stack_drivers/lwip/lwip.hpp @@ -350,8 +350,10 @@ namespace ZeroTier { #define __DYNAMIC_STACK__ // Dynamically load liblwip.so _libref = dlopen(path, RTLD_NOW); - #else - #define __STATIC_STACK__ + #elif TARGET_OS_MAC && defined(SDK_BUNDLED) + #define __DYNAMIC_STACK__ // TODO: Implement static version + // Dynamically load liblwip.so + _libref = dlopen(path, RTLD_NOW); #endif #endif diff --git a/src/stack_drivers/picotcp/picotcp.hpp b/src/stack_drivers/picotcp/picotcp.hpp index f51aad0..1b62363 100644 --- a/src/stack_drivers/picotcp/picotcp.hpp +++ b/src/stack_drivers/picotcp/picotcp.hpp @@ -137,7 +137,6 @@ namespace ZeroTier { void (*_pico_stack_tick)(void); int (*_pico_string_to_ipv4)(PICO_STRING_TO_IPV4_SIG); int (*_pico_ipv4_to_string)(PICO_IPV4_TO_STRING_SIG); - struct pico_device* (*_pico_tap_create)(PICO_TAP_CREATE_SIG); int (*_pico_ipv4_link_add)(PICO_IPV4_LINK_ADD_SIG); int (*_pico_device_init)(PICO_DEVICE_INIT_SIG); int32_t (*_pico_stack_recv)(PICO_STACK_RECV_SIG); @@ -200,7 +199,6 @@ namespace ZeroTier { _pico_stack_init = (void(*)(void))&pico_stack_init; _pico_stack_tick = (void(*)(void))&pico_stack_tick; - _pico_tap_create = (struct pico_device*(*)(PICO_TAP_CREATE_SIG))&pico_tap_create; _pico_string_to_ipv4 = (int(*)(PICO_STRING_TO_IPV4_SIG))&pico_string_to_ipv4; _pico_ipv4_to_string = (int(*)(PICO_IPV4_TO_STRING_SIG))&pico_ipv4_to_string; _pico_ipv4_link_add = (int(*)(PICO_IPV4_LINK_ADD_SIG))&pico_ipv4_link_add; @@ -234,7 +232,6 @@ namespace ZeroTier { _pico_stack_init = (void(*)(void))dlsym(_libref, "pico_stack_init"); _pico_stack_tick = (void(*)(void))dlsym(_libref, "pico_stack_tick"); - _pico_tap_create = (struct pico_device*(*)(PICO_TAP_CREATE_SIG))dlsym(_libref, "pico_tap_create"); _pico_string_to_ipv4 = (int(*)(PICO_STRING_TO_IPV4_SIG))dlsym(_libref, "pico_string_to_ipv4"); _pico_ipv4_to_string = (int(*)(PICO_IPV4_TO_STRING_SIG))dlsym(_libref, "pico_ipv4_to_string"); _pico_ipv4_link_add = (int(*)(PICO_IPV4_LINK_ADD_SIG))dlsym(_libref, "pico_ipv4_link_add"); @@ -270,7 +267,6 @@ namespace ZeroTier { inline void __pico_stack_init(void) throw() { DEBUG_STACK(); Mutex::Lock _l(_lock); _pico_stack_init(); } inline void __pico_stack_tick(void) throw() { /*DEBUG_STACK();*/ Mutex::Lock _l(_lock); _pico_stack_tick(); } - inline struct pico_device * __pico_tap_create(PICO_TAP_CREATE_SIG) throw() { DEBUG_STACK(); Mutex::Lock _l(_lock); return _pico_tap_create(name); } inline int __pico_ipv4_to_string(PICO_IPV4_TO_STRING_SIG) throw() { DEBUG_STACK(); Mutex::Lock _l(_lock); return _pico_ipv4_to_string(ipbuf, ip); } inline int __pico_ipv4_link_add(PICO_IPV4_LINK_ADD_SIG) throw() { DEBUG_STACK(); /*Mutex::Lock _l(_lock);*/ return _pico_ipv4_link_add(dev, address, netmask); } inline int __pico_device_init(PICO_DEVICE_INIT_SIG) throw() { DEBUG_STACK(); Mutex::Lock _l(_lock); return _pico_device_init(dev, name, mac); } diff --git a/src/tap.hpp b/src/tap.hpp index 2393dc1..8c247f1 100644 --- a/src/tap.hpp +++ b/src/tap.hpp @@ -46,13 +46,11 @@ #include "defs.h" #include "rpc.h" - + #if defined(SDK_LWIP) #include "netif/etharp.h" #include "lwip.hpp" -#endif - -#if defined(SDK_PICOTCP) +#elif defined(SDK_PICOTCP) #include "picotcp.hpp" #include "pico_protocol.h" #endif diff --git a/zerotierone/osdep/Binder.hpp b/zerotierone/osdep/Binder.hpp index 72456d3..e8205fd 100644 --- a/zerotierone/osdep/Binder.hpp +++ b/zerotierone/osdep/Binder.hpp @@ -164,6 +164,7 @@ public: #else // not __WINDOWS__ + /* struct ifaddrs *ifatbl = (struct ifaddrs *)0; struct ifaddrs *ifa; if ((getifaddrs(&ifatbl) == 0)&&(ifatbl)) { @@ -188,6 +189,7 @@ public: } freeifaddrs(ifatbl); } + */ #endif diff --git a/zerotierone/osdep/OSUtils.cpp b/zerotierone/osdep/OSUtils.cpp index 3a04308..fbca7ce 100644 --- a/zerotierone/osdep/OSUtils.cpp +++ b/zerotierone/osdep/OSUtils.cpp @@ -177,6 +177,7 @@ std::vector OSUtils::resolve(const char *name) std::vector::iterator i; InetAddress tmp; struct addrinfo *ai = (struct addrinfo *)0,*p; + /* if (!getaddrinfo(name,(const char *)0,(const struct addrinfo *)0,&ai)) { try { p = ai; @@ -196,6 +197,7 @@ skip_add_inetaddr: freeaddrinfo(ai); } std::sort(r.begin(),r.end()); + */ return r; }