From eec54ae91157fa64a6beda95c1bf295adb12e8a4 Mon Sep 17 00:00:00 2001 From: Joseph Henry Date: Wed, 22 Jun 2016 16:01:03 -0700 Subject: [PATCH] updated android readme --- ...id_zt_sdk.md => android_unity3d_zt_sdk.md} | 0 docs/android_zt_sdk.md | 38 ++++++++---------- ...3d_ios_zt_sdk.md => ios_unity3d_zt_sdk.md} | 0 ...3d_osx_zt_sdk.md => osx_unity3d_zt_sdk.md} | 0 .../UserInterfaceState.xcuserstate | Bin 24070 -> 24066 bytes .../project.pbxproj | 16 +------- .../UserInterfaceState.xcuserstate | Bin 56405 -> 56023 bytes integrations/README.md | 4 +- make-linux.mk | 5 --- make-mac.mk | 18 ++++++--- 10 files changed, 34 insertions(+), 47 deletions(-) rename docs/{unity3d_android_zt_sdk.md => android_unity3d_zt_sdk.md} (100%) rename docs/{unity3d_ios_zt_sdk.md => ios_unity3d_zt_sdk.md} (100%) rename docs/{unity3d_osx_zt_sdk.md => osx_unity3d_zt_sdk.md} (100%) diff --git a/docs/unity3d_android_zt_sdk.md b/docs/android_unity3d_zt_sdk.md similarity index 100% rename from docs/unity3d_android_zt_sdk.md rename to docs/android_unity3d_zt_sdk.md diff --git a/docs/android_zt_sdk.md b/docs/android_zt_sdk.md index 67c24d79..a4c7b5d9 100644 --- a/docs/android_zt_sdk.md +++ b/docs/android_zt_sdk.md @@ -1,29 +1,29 @@ -Android + ZeroTier SDK +Android + ZeroTier SDK ==== Welcome! -Imagine a flat, encrypted, no-configuration LAN for all of the instances of your Android app. +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 and [Shim Techniques](https://www.zerotier.com/blog) for a discussion of shims available for your app/technology. 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. If you'd rather skip all of these steps and grab the code, look in the [sdk/android](https://github.com/zerotier/ZeroTierOne/tree/dev/netcon/Android) folder in the source tree. Otherwise, let's get started! -**Step 1: Build Shared Library `libZeroTierOneJNI.so`** +*NOTE: For Android JNI libraries to build you'll need to install [Android Studio](https://developer.android.com/studio/index.html) and the [Android NDK](https://developer.android.com/ndk/index.html), and you'll need to tell our project where you put it by putting the path in [this file](Android/proj/local.properties), if you don't have these things installed and configured we will detect that and just skip those builds automatically.* -Open `zerotiersdk/integrations/Android/proj` and build it. +**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`. -*Note: Building the project will take a while if you are building for all architectures, See note below on how to speed up this process.* +**Step 2: Build Shared Library** + - `make android_jni_lib` + - The resultant `build/android_jni_lib_*/libZeroTierOneJNI.so` will be what you want to import for your own project to provide the API to your app. Select your architecture and copy the shared library into `YourProject/src/main/jniLibs/YOUR_ARCH/` -The resultant `zerotiersdk/integrations/Android/java/libs/YOUR_ARCH/libZeroTierOneJNI.so` will be what you want to import for your own project to provide the shim interface to your app. Select your architecture and copy the shared library into `YourProject/src/main/jniLibs/YOUR_ARCH/` - -**Step 2: App Code Modifications** - -Create new package called `Netcon` in your project and add a new file called `NetconWrapper.java` containing: +**Step 3: App Code Modifications** + - Create new package called `ZeroTierSDK` in your project and add a new file called `ZeroTierSDK.java` containing: ``` -package Netcon; -public class NetconWrapper { +package ZeroTierSDK; +public class ZeroTierSDK_Wrapper { public native void startOneService(); static { System.loadLibrary("ZeroTierOneJNIā€); } // Loads JNI code } @@ -33,17 +33,15 @@ And now, start the service: ``` new Thread(new Runnable() { public void run() { - NetconWrapper wrapper = new NetconWrapper(); + ZeroTierSDK_Wrapper wrapper = new ZeroTierSDK_Wrapper(); wrapper.startOneService(); // Calls to JNI code } }).start(); ``` -**Step 3: Pick a shim for your app** - +**Step 4: Pick an API for your app** If functional interposition isn't available for the API or library you've chosen to use, ZeroTier offers a SOCKS5 proxy server which can allow connectivity to your virtual network as long as your client API supports the SOCKS5 protocol. This proxy service will run alongside the tap service and can be turned on by compiling with the `-DUSE_SOCKS_PROXY` flag. By default, the proxy service is available at `0.0.0.0:1337`. -**Step 4: Add necessary app permissions** - +**Step 5: Add necessary app permissions** In order for your application to write the auth keys to the internal storage you'll need to set a few permissions in your `AndroidManifest.xml` file: ``` @@ -51,13 +49,11 @@ In order for your application to write the auth keys to the internal storage you ``` -**Step 5: Join a network!** +**Step 6: Join a network!** Simply call `zt_join_network("XXXXXXXXXXXXXXXX")` *** **Additional notes** -As mentioned above, you can reduce the amount of time required to build the ZeroTier JNI library by only building for the architectures you want. You can specify the architectures in `zerotiersdk/integrations/Android/java/jni/Application.mk` - -If you change the method/class/package name for the Netcon glue code in `NetconWrapper.java` (Not recommended!), you must also change the name of the JNI implementation in the Netcon source to match the new java name. For example, if the glue code is contained in a package `Java.com.example.joseph.NetconProxyTest`, a JNI implementation name of `Java_com_example_joseph_netconproxytest_NetconWrapper_startOneService` would be required in the appropriate C/C++ source/header files. \ No newline at end of file +If you change the method/class/package name for the Netcon glue code in `NetconWrapper.java` (Not recommended!), you must also change the name of the JNI implementation in the Netcon source to match the new java name. For example, if the glue code is contained in a package `Java.com.example.joseph.NetconProxyTest`, a JNI implementation name of `Java_com_example_joseph_netconproxytest_NetconWrapper_startOneService` would be required in the appropriate C/C++ source/header files. diff --git a/docs/unity3d_ios_zt_sdk.md b/docs/ios_unity3d_zt_sdk.md similarity index 100% rename from docs/unity3d_ios_zt_sdk.md rename to docs/ios_unity3d_zt_sdk.md diff --git a/docs/unity3d_osx_zt_sdk.md b/docs/osx_unity3d_zt_sdk.md similarity index 100% rename from docs/unity3d_osx_zt_sdk.md rename to docs/osx_unity3d_zt_sdk.md diff --git a/integrations/Apple/Example_OSX_App/Example_OSX_App.xcodeproj/project.xcworkspace/xcuserdata/Joseph.xcuserdatad/UserInterfaceState.xcuserstate b/integrations/Apple/Example_OSX_App/Example_OSX_App.xcodeproj/project.xcworkspace/xcuserdata/Joseph.xcuserdatad/UserInterfaceState.xcuserstate index 9182bd0cde5fa17093e8cda28fff50e1ec13c704..093efafd38d98f24ae6dba758363cb5f7516d7cd 100644 GIT binary patch delta 3750 zcmZqM!`QTkaYGoJq*QgauCcL>f}x?IX|0YzwV}DCnT~>`iOJ?dHZ3Nm)`rb zi&R$|=qMO~R2Z3B>L^&4SZkRCgU&FwZh!u5r0Rcy6v^=yr7U2Id?=CLhf zTg|qGZ7bU$w(D#+*>1DlWxLPzknJ(sQ?}=9FWFwRGq5wUv#_(VbFg!<^RV-=3$P2Z zi?EBa>$5wt`?1%tPh>y9ewO_K`+N4k?Eg80ITSdQIaE0`IJ7u)I2<@UIs7;RID$Ar zI1)M1I5If0>N)Z`3OR~7N;#T2rg2Q?SirH8V;jeAjuRYbInHxjPQ)vT*WpDsyUansYjEI&r#ix^a4N266^-hH{2;Msh}T)^X0|+{k&6^B(7G&bOTJ zIX`lK=KRX}or{Hwjf;bei;IVgk4u0{h)a{pg3F65lWPW7{T{B9TxYn>ab4uP%ypIP zIoB7i?_58*{&4-{X5bd$mgiRCR^!&-*5%gcHsm(ucI9^Cj^)nc&gIVMF5)iXF5_Fn{lxo) zkBv{3PmRx*&x+51&y&xG&yO#FFO{!?ubpoe-!{G-e7pGe@a^NPKfw2e?=L?aKL1?Q2>cUds27wL)E9IX3=+%|tP`9ixL)wM;03{pf|mvF2;LREFZe?6 zrQmD9FM?kMzY8%4F$ysY2?z-bi3&*wNeRgasS4=`=?NJK83~yPISRQ6c?fw4`3nUK z1q+1=We61t)d@8VwFL}_V8X{UQ+AP{C+Ai8D+AZ2!FSUp(J!Lk#F)ic z#n{C-#l*xU#H7Sz#5BdU#dO8=#T>=_#G=Gf#L~nv#InS0iaiqhA@)~XSX@V3PuxJ< zNZdr+R@_0{N!&%;SG-)jMtqt0dhx5`wl0PMX zOR-3?NpVPVN%2VWNoh(2NX1FD)l2nD&5&9swM}Y=)Gnz#Qv0M1NS&0rAazOViqti! z8&XfDo=d%ydM))s>X+0XsejVk(!A3A(t^^;(gxB-(k9Yo((%$c(k0Rj(oNDW(rwcH z(o>~pNiUXOCcQ#>mGmL$^U^n@Z%N;gz9;=a`la-1>9^AFr9Vo4mi{9nA|o%ODN}DI zV=v<<<1FJU<1P~*6C@KN6DAWO6D3n2GgW4X%te`7GPh;!%Dj?!EAw9Flgt;HZ!-U7 zS!CH{Ib^wH#bsq=HD$GBO=N9ly=47m17(9{BV?mwV`SrGGh_>8>tq{c zn`PT%J7l|L=gF>?T_d|zcD?K#+5NHy>t&C~9+N#Gdq?)E>?_$fvhQR+$o`dMl4Fr$ zljD}-mE)Hal#`ZIku#Jtle3VslCzg{lyjDIl?#_kkjs^;lWUM`l53G`lk1S{lIxM{ zlbbKMP;Rl@GP#v+-tcX^8E7p@=5X~^8NC2bc3Dmf~7DJ3gqDK#t2tXEp5v{Grc(mJJ$N}HATDD77|q;y2- zrqUgydrJ3}9x6Rn`k?ex>4(y9Wd>ztWj19FWl?2uWl3cjvd{zv_v z2BQYE2CIgahMPvN#$=718aFi_X*|_#o+_q$T}^(|f2dpl`3Auivdd zLw~mZT>S<5i}jc4uhZYGzfFIq{%-vf`e*ge>tEErrhilaj{ZFZCIfy05d$#;2?JRJ zc>^T_6$48HCj(al4+AfQXoEO|M1vHAbb|teT7wpYc7ra1UV|wH(+y@B%r%&Au-sss z!DWM|hKz<>hP;OL0)|3{@`gHw`i4e^riK=V)`oV5-iCgLfri0`p@!jxk%rNRjfQg# zj~Ko(;xf`VvM`D^iZeM-gy>NT2XG}Gvm z(Pg7+M*oc2jk%0XjBSk_jMI$sjf;$D8!s_lZhYSOhVgCVzx5_;CY&Y)CYB~PCNU#N@fDh^efpf@!U3n`x)%anlQ?m(4`XWX%-J;>^;`vdnVL^35vD zs?8RgZ7|zxw#{s(*&effW{=H2nEf?pFlRPrGv_qtG3PgzF_$-2GFLU%FxNKMGdD1| zHMci+Ghi#78oUl1?-UU?ON>G?KN3mx}59&^0xc*pU+<0HqXjxQWPI(~8d?)b~`uj79wE+;W31E+AO1gCtb3a5If zCZ|@X4yP`ssZI-=Ry*x*+Uc~*X^+!Mr%O&(oo+bYcDm>E-07v$8>jb9pParp3plGd zdpRdN*E)AO_c~8-p6oo$d4_ZS7UzS`r<~6^UvR$ce9ig3^CRb{&M%x_JHK`Q;lkn~ z=i=%T;u7nU;*#!?<&x`??^5N`>N3G)uFE`^`7R4x*12qS+2XR@WtYnyms2ixTwc2T za{24Z;L7aE=E~{HeR4b*1Y; z*ITa7+_>F@+=Shf-1Obd+$`O!-R#_4-8|g9-Td4F++yA0-4fkW+-|u&cYEpf+U=ct zoO`x=fqSugnR~T+oqMBuvwNre1oxTli`>_{Z*kx5zRP{T`yuzE?#JCPxZibu#p834>`Q^**%jL`KE8r{aE9NWdtLCfetL>}j zYv^n2YwBz68{^yPyW01v?>*mVzVCfM`Tq7}@?-at_LKEf^V9Ux_S5w<^Yirc@$>f! z@(c9~_lxq2^^5mQ@=Nh6^egr&^{eoE=g0rs@2}r~e@q=6p6SCZ_%qn`d*Z zWfBpst~St7FaRqt1*tbQx7Zxb?at0Ly<+ncp=a!@=G-?brfu$*l4TSXLnt;hH8291 zXKcFpfOHunQ*Xdz3t1zk#u=M)WQF8GnjAiDZnnu0)-PtOVXJ3rWNT*YVVlmjfNcfa zTDEO$+u4q=-DJDXc9-ow+e5a;Y){#qv%O?{&GvS(LV$R^1iK--3wr>21N&t5L+t0- zAF+RA|Ifk5AlZ}&~Q&q1C$JTG~^@O!Sjpf56?edPF`+a zUS57)L0(~AQC@rA@Os{Q-p#yMcpvk=;r+<_nfEL2cRo%&1wKtaGd^2BXFeZ3f4)Gz zV7?5#YQ8SMxqLhMcJuA!+s}89?=atYeg=L{er|qVetv#IeqnwEer4hbC>Iw^Eo=&aBKp_fA6gnkSC75XpCBFrYtA30-L`+0q z#8xCkBwnOcWQNEZk^LeUM4pQL7nKr~5tS2F5LFVj7IhKz77Z7z5^WRh5bYA}5$zM5 zAi7j^x#&vK)uL-f*NZ+BeI@!)^t0$!(eI)^#n{9+#JI$G#3aR}#bm|g#dO5<#0hiT`$fcE+(!oZYXXnZYpjr?jY_g?kess9w1&NUN62< ze3SSM@w*bt5&{y!5~30k5>gT}5-t*f5+M>{5|I+o60s6V68REk5)~3v5;YRd60H*L z5}gv=65A!tOFWnOAn{q^tHgIn7D-`AQAu%0Nl9r*SxI?GMM(omBS{lUGs$`jNh?Vk zNjpggNngoG$r8y9$t9A9B+p4ckbEooP4b82FUdcW|D@QZIHkCyc%}HI1f_JOf~69r zI;AE_&6ZjswNq-h)LyCmQU|3DOP!IrEOk}ty3|dn+fpy2UP--?dMEW;>aWy)X+~*2 zX#r^=X%T5PX=7(~y=_KiV>GFE%X6aVxcIi&(NzyZ<=SnY=UMam=dad*^>C4i0 zr0+>TkbWfnMEb4td+CqTpQXP_f0tp9k&scA(Uq~1ah7qFahLIw@s>43*&f+G*+sJJWjDxfl-(?Q zK=!cgQP~r+r)1B_K9GGW`%d?heTa*T3pavXA8a{O|Fa>8<=a`JK-a;9=tayD{y za?WzDa_(}Ta?x@ra)okDaxHRgavgGA^>RIOeR31zCdn<9TPn9)Zk60xxeaog<+jP~ zl-n(LN$$PeA9-PUWBD}s3i-+M3*=YJua#dfzfpd({8sq`@`vP)%Ab%wEq_k_g8VN9 z6NOlXN`=h|2NaGf99KB0a8BWZ!exc43Xc??C_Gbmp(v}UrKqE*r)Z#>ThrgTE-uF?agM@o;Co+>?8`l9qx>5tNX zWfo<2WiDkNWl3deWm#nfKX%2So6E6-A4P~ojtky4RWQBYAJ-&!s;g8ttL{+Ut-4S3fa+P* zOR85@Z>Zi?eW3bS^{MJ-H8wRZHDfggHCHtcHE*>5wP3X{wFtFHwIsE2wFb3jwKla5 zwV7&*)#{h2tyEj1wq9LST~1wF-ALV3-9p`3-AUb5-9z15-B&$SJx0AzeX{y`^&RTF z)%U3%P(Q1FOZ~3;1NF!1&(vS4zfu3G{#*T@27?BZ2CD|U2B(IehL=X6#&nIn8h16G zX}r{Uqw!ATyC$P1i>8jIsiwQ8pJupbf@ZU3n`WnGPrYWp<|NIjnlm(KYtGYLsJTRQ zx#lX(wVE3=H*0Ry+^2a^^ONRp&3{^ITKZZ>S}|IwS{Yh>TGO>=X&u%&qjg^EyEcP1 zv$m?Xp0=TOgm$8Kigt^3ul5A(9oh%AkLWP#@aXXC*yyJtjR?J$5}EJu^LLJr_M!J$Jnjy?DJOy;Qvn zy==Way-K|ry?VVSy;i*ry)M07dQbI5^quvK_51bb=+D<*sJ}#ix&BK1P5RsQcj@od z->-j0|Dyh7{j2)7^zZ6F(0^pWW*}@JVIXB7W1wiDY@lYKQEy;t;AY@y;A7xt5O0uV zkZO=&kZn+6&}h(M&~4CXFwtO!!EA$h1`7=q8>}|iWN_W!r6H>!pP`_kh@qIFvY~;Y zv7wovrJ;?Xy`ht#zhRJJsA0Haq+zsStYN%itKmY!6Nc}M_>7E=Y>eWKl8jP~GK{i~ z@{9_NN{q^ls*LJujT(%ajoOSlje3mwjV2n+GMa02&gi<)En_BQZeu=U3u8xP7vn7B zV&gL7`Nk`ZR~uh8zGHmfgwce{gxAEx#MZ>YB*7%pB*$cm$y}2KCihKVn7lTXFjX{F zF>N&MGVL`zZF`$;v005-z1ecJE%j#G&32jXH9KH-$n3e< z7js5)7ISuUE^}UU0drw<1#@L{HFHgK9dmtiBXbjTM{{R$S91^Zt>%Z!kC-1bKWSlU z;b!4s;bq}#vDf01#Tkop78flYEPXBgEdwn>EH7I=uzY0s#PYdSnpLq?ja9u>lU1u# zht))@DOS_1W?Id$s-I`I)9QiMJ8Lm(d20=8eQO(QS8ESzZ)-p6K?_0mH{%HNnhTTTMM#x6QM$AUSM$tyaM%_l!M#o0a#@xoy#>*z$Cc!4j zCdDSrCc~!Cro^V)rqZUyrp~6_W`fO3n`JiZZ8q6#wb@~_+vZ5U&2gJkHfL}u>nv-aoh@7Uk7e_;REA<`kuA;TfdA=lxt!v}|-4u2f} zJ2E-4I`TORI0`$8IZ8T8JDNLsI~F>2IZk(+vYZOrqdm#`%aIXUOT;Y`r!20>6_CJXAx%&XFun3=SJr~=ZVf!oTod_a-QS7 z!}+N5Ip>ScSDddq-*SHJ{LJ~K^Bd>)&L5rsxNx{Axp=xnxFot{xMaKJxfHq-yVSXK zx=e9d=(5OVvCC4IO)gtqcDU?zso&>vz~!9F1DCfh|6CbeSzOs&xmFo4A{ro3Wdfo2{F@ zo0FTTn~$5nTaa6bTcTUCTdG@z+da3}Zg1V*yM1y`a?f`!aW8kTa<6x9a&N77Z+Gu? zpW;5(eVO}a_Z{xL-S@d4c0cBR(*3mi759hk&)i?Szj6QQ{>A;f`%e!h4}K3Z4@nOh z4|xwY4^0mp4?Pb9k7SQJkLex@JXU+G^VsOI#bdk2E{{DPCp|8BT=ux;ans|0$77FY z9xpv!dy05EdFFYRd)9eQ@SN+p#B;f4{VLD3o?AS(d+zew>$%_agy$*G3!Zm9pLjm^ zeC7Gp^NZ(q&tIN@J^y=gcyW8ldTDtXdYO2cds%rodbxPHdwF^Jcm;dKc%}H9^f}{m z)#tI#E1!=(|9rW9`FsU^MSR75rF><5wS0Ab^?i+eO?}OMEq$$h6MS2J*Zbb|edPNp z!}qiAH{bt$Y<}E+@_vebT7J5I`hJFfR(`&I0e-=LVSbT*(SC7$iGIm`X?_`grGDjp om3}pTpZxy&Gx{_8v-ubMxB7SaPhbE8CMGb&z^(WaO^nTq9gGtgCo)cAoXj|zaSr2L#{G;37!NWYVm!=vgz+fj zF~;MJCm2sMo?<-Bc!u#T<2lAljF%a&Gu~jl!}x&l3F8aKH;f+`zcBt_{KLe+#KOeE z#KR=WB*Y}cB+DenB+sP4q{yVoWXfd5WX@z!&t%DD#bnK7&*aSH&g8}9&E&%r#1zaF z!W7Ds%9O^G&XmEF$&|&E&6LAb#8k{w!PLOi$kfEt%+$iv!_><(muVi;e5M6V3z-%% zEoNHIw2EmR(_a4 z;>qH};?EMq63P<663r6FlE{+6lFpLFlFL%SQp{4uQpr-oQqR)F(#q1o(#_JxGLdBp z%XF4mEOS{Fuqbg;+&dC0M0d+4t>SzB1!S-V(!StqbgW}U`5lXVX3eAY#*OIcU2u4Y}wx{-AY>vq;%tb17x zupVYT#(I+V4C{H;ORQH}Z?N8Gy~p~H^$F{9)>o`=SwFCTX8p$cll2ele>NsIRyGbc zZZv}djHb*uWHg`5JHea>?wqUj} zwn(-Zws^KAwp6wZwrsXMwnDZNwsN*Awpz9Zwq~|AwobMlwtlurY*X20u+3(h$F`7d z3EOhERcve7Hn44G+s3w&Z4cXiwnJ=3*-o&XW;@4rk?jiGb+%hr`^V16&ce>l&c)8lF2F9#F2*j&F2gR*uFS47*__3_emnaP_C4%- z*$=WGVn4=yoc%QW8TJe87um0}Ut_<;ew+P1`vdkT>`&Q0vVUU#%>IS_EBiP0@9aM~ zSU6ZY*f`iZI5;>txHz~u#5p85Bsruwq&Z|bWI5zGv^cambU1W5^f>f63^)uqY&q;W z>^U4bd^mhL{5bqM0yqLWf;fWfIpR4II1)LMIPy61ISM#xIBGfSIO;jNIeIvHIr=ze zam?nJ!!eg*CC4g`)g0S7c5v+E*u`;-<2c6&jw>8jIj(VB=XlKVgySj4GmhsRFF0Ou zyyE!A@txxb$4`!59KSjKaB^^Ra&mEUbBc3Ha7uDYajJ2ub82vEa+-3Qahh}1J9D~l zx^lX425|;+hHxfuCUPcmCUfR<7H}4F7ID^b)^j#+HgfiI_Hp)ePT<_cxs7u>=WfnD zoCi1$avtS8#(9eKH0OEF3!GOtuX5hxyv2Es^FHTe&L^BNIA3zU<$TBaiSsk(cg`Q2 ze>negF>|qSac~K6337>XNpZ<@sd8!7bLn##aanL#a@le@bGdSPbNO?Haz%5+bER^n zapiCoaFubDbJcJ)aJ6uCarJRc;hM@dgKHkwBCZu&>$o;??cmzSb%^T(*BP$!Tvxen za^2^8%Jq`#J=a&RpIraB8M)cHxw!?o#kr-q6}i>9HMljoZMp5Z?YSMe9l4#jow@5> zxLvv3xZSxuxIMYOxYM|^xU;$QxeK^UxJ$V!xvRMAxa+x_xm&n9xI4Lfx%;>$aZl!+ z&OL*B4)r&oh~43eOClnLKlO=J71zS3lQzX7bJAo6R?eZ!X_rz9oFC_*V1n=R3f6kna%RVZI}L zNBNHN)t}+Jz;}`FI^SKsuYBM5zVrRy`^ooFBczQ26``2O=V@w4-D^Yifw^Goo{ z@XPZn@oVsF^6T}s+^V{&-@;mdp@O$uk@_X?o@F(&o@h9`A@Tc;p@u%}=@MrSp z@aOXv@t5*f@YnIT@b~cd^7rvieaq%9D9`RVR1zc}%Y4m8rkPz{SALP{2^MkfE?a zp+O14FJUNM(4csUA&4QEp`4*2&M(-vv?MVpC)Kg2D6w)eLpeh(Ll{K5ilI6NE*+d& zvY4TYp@tzW)Gs(VwIp6Zth(AjN5P<0N1@u#%)&%R!O+mesJ0fOx1M3L2wxzh)?^;u z^vP3s<;5m~+%c&^8|IFwV0TPr;#XtbxmlBcCKFHTB8HO;ry8sq92*ojpA&3j;wW0k z$k!0mptLzgWD}EVE`!E0#&pIE#!SX6#%#u%hTMj{hWv(thQfxTWsG@@`HTgOg^Wdv z#SO&`B@J~A^BT4`?AYueFU_bg9+8}%l4=}Kl%JKFT;iFRmhYO9S(0CLnSm1&NQ||N z^$Z#d8S5HK7cw?9luhnYkk(;rVJKb1*vi<}P~K48pa@gi$=Jgnw1}~bvAdz7p>h#p zFTwbQf%Q`ur=!TsV4T@d(@@*s5TNWZwSxf!V1~?NT*siXUVxu*KH~z$g^Y_B z7c(wlT*|nNaXI4(#+8h#7*{i{VO-l#-_X#|*wEC_+|bg{+R)a}-q6v|+0fO{-O$s} z3(~%xaRcK<#!ZZy8MiPBZe`rYxSeqa<4(q1jJp~4Fz%iFQc9jtW%6o8b1p+uLl;9M zLo+9X$#KF~lOHLXP2MalEo5j06E-j~b~Uqbah}{StRiG+jv+ijQFiiQVWr6uN+Odb zM3gyAU@9hSifD43XDC|8c%h-cL1}V~h*bR*#;Xh(3l=n}M1WF=g^^J$%;Ps1Z$V^W z0(Tkjp$a@?e1t0Sl<^s=z)Qwgr~+>p-=PT9Gk#?Jgd)QDmGK*@z)!|sr~-c(|Dgyl zF)}fs3a~Pwqe~eCOsy7 zCIc`uZdl*2sbMo1ZfQ`NyjDeHvY^z)dL|o&(uGX64I4n^05_8ZlOvN;q+hUJaY<2T zUV6jEcmX*^r_#)v6b1i+lFaso`?Nm4>Sg*BY)*?o&Klzl3Qiaxz=NP_&>y31;wWrZo^rn813b z4X6T}nYKU#!a#Y?pcWDVJ3z^3XTwe8#JY!RFVj9o*M>U{w;OIXWW@_)r)B1(PQIm7 zA%B?ZID^JwMlVKhreh7s4Ji$G7c-q;I>~gZ;abiE)W_vUS?n;27= zPcxrkKFfTL`8@Ll=8Mdim@hM5VZO?IjrltB4d$E7x0r7;-(kMXe2@7)^8@CG%#WBK zGe2Q|%KVJ^Ir9tVm&~u2Uo*d9e#`uh`91Ro=8w#um_IXrVgAbejrlwC59XiDznFhB z|JmH9ewoRwk@0aOwe=Y7o=xLDs5HKCLGy?&=rf8RFyW>*^O0471FsVdLZz zdg>6ht{}BKAhnZ)^~E5Dc{FUCY^bjV;dnP}oSdu=4JE&ZjgxDoWg%JvL0V-d3mAwC zy9fD)2Efb@fs0T6tIq*3CA?wdWL^VBh{h<80u7MH$pHo;5CyRf8z<)&s6#jjpm;Wb z`X(8qT5a+?1BuB`44{#b*06E%Ujqe*>P#?4VzR9v)Uuq0jgx&1Rdm5|kPp%>!swD( zkdt4To0?ZrQ{xgG66Eh60&{N>NQLAiLs9+!#}E&gXlcX7$%hP~v0Blvaq?Ffr@CR| zWDO%@eX#L$V9hAT2YY)4#C!S$hdBE9z)Wjw*f_b%NEzbbmWGX!w;Dmix4mKGAH zVdLbVFg<%4HcnPEgU0>=P);*b^#zCTVUVkY8GSPIvNQA2YifL4;{E*N13cm0IR;W7 zhEU+?=NS?o$w6gNE0chK-Ydn?Vba^9>s(%b80-Jb0;L<75YOB?#wg z!^X*Hwn2S+qhaIZkK3T>?RLY)$@MZ&uitCfIQf;i3`EbvhK-Z?ETF;lq+#P^D+^nQ z%yW<)3uu(TYS=h=qXjg^-ZpHU{1C?Z(6Di`pd~aMK7*WN2{r8-D1TT&o%6F{Zr38Se{jnSc`tD=WyQRuEfR zIT|)j{wD)5j+MJ%6jiliyoGiXv7KQ1N9A2_9DQhK-Yh zt<}K(W|eB#IJwapk{DQJK?Sb0Aw))@VdLbd)=*28K_#{gRGC`C#>w_JP}4L)X=Xdr z9-W4blLc%gC-1QlfEc0=mX)0R)&>%vtVUoJkZi(g+OTo5qpbqOlNO-BP?)^lT5R%L z8!m2WZeX=;*f@E*EhK5M+BIyPeA*V0T3H<%HcqmGL=vk@!^X)5c2KXogGxj@NNQ*G z0)>zrB>S@ZHf)@{%?=XFtN{%hC%>?RnjGA)ak7lP9>mpQ4I3v1*+YFB2`Wao;@jg#FRpf1R0*f_b^!3kn?cEiTWdtscshK-Zi z9UB&z_D6$uD(b@PmX1$rA? zLNGYg4N0Q2VdLa2PSEt$)39;!11D$->2KILncq1C;>$^(SawsLJi!^7N~XdE*d{-A zmV!8L2FMnh$q8;slP5T{O*U{5hv=T&uyL}#i#0^iJdh#>u%hiQkb;+WA;@AE4~Xg| z;AWKQI5M9d=x~98Ab**aHIQf7pRM%RtgIpm-Y-rdxIo8bpqIEM!t1;NZ zU2c%dk9Awa#>oMm5IcUmL7ll1R2D>vO!5!}JKxn^24cV-kOBH&1Nz(rAY%JLVisVr z)9#WGu|ps+i1!6OAXPT&QIMDsSY5P-Fht!6kQgKcK*6-o1DcgigFS8qQFIQZ$Y!#j zs{Z8s9nj2o5$tLkh##+jRf|ks;Kwm}gQpxs*L9FC!^wp{YLowa@43$`y`ZK)XxKQp-^&=H;4w&n6zq}Ag*``jyaes z*d|Z#VV_*#4K2*xph+I|h89wwmhyXVTZmPkK*mDc66OPS%U4ig=dCn(f)6xoexUdk zV$U5PL5K;zK_+N{9V_k&_4PlHm@Qb$-xtyhVq*k}*-S3NgNDLGJl9T29Ao+uh3+@Q+$(erAV9VKfK?;GUP7 ztmF^LA#B1R#g<^j3I56u1H?dL)?hJ^0XzMnu95_aJA=hP`0GN{%7DZipke}(=LfJ& z4i6B4$jO7`?2zOnz){4e1kM?tDB_-cF8~q)Y^n_#C-Ve4Ky+$=bOui54^)_39tbJ< z*|ZxrPM#kuJ^5T9q;O=@YuGrMF~|yHrXkc!g#`A=aY2xRip>O6G6w}h%rpm?={K1% z!fLWwFeHPqSv72&oDiWmSs;{qa$T?_#3);^MUeJ3n*&&d`DB$4Xy`hFjIo-`7-2HG zE`$@J!wr;BL%bpOc!CsoPG*eIo-7awDHzy%zz#8=To4LrXR!H$by!Y59V!IT6$H}d z0@cMmSuPBclGs8);viRpOyizh5C%zpY!RS3IvnEiGht9`q8m0&Zb+1$Y!Jymd0!Cc zWSwwG$Oo?@;25cnhBU+2n$Uc7EgDkJ zu(g5|JA)N#$3Vlr10?1K5Bs_pXnOAki9^(0h!KMLqz~bf$robSg?${ITw%2x+eDBC zP$ZgwDzI}4h76%x27 zcf|`#j);RM*STOrxNZch}9uk1dK;kx& z86#vScf~`?fR!LIQ2feFO5z1)>*w*1rYGAPaAKB+iQ6SW3RkxE;M8Y6`9KounG&IbTVW=MO^!)~#@G(9!bnIc?*>PoFNCuXoOtCYC5cVWPJ%|`L6Gx6fdzNo z?j&)DZ;pVZB0#>Gl*B#RAVqX?eKPB0xnyY0I}U16Cr3k!J_Y8uOn#mWEfCIvU7(U%1OQb_; zBDU9{hG@DS#JG1L1tuWl1l^roU}@zeNYrU^VwUve+Dt_e$B^JiKWCWa7m%bYT+%Pt z+08X5$RD0azk}T_I=LVNS{VNVX>f;WnEX8hQlYW^1&O=B#eFil!Tx0jjn~9y`hgwD z&J0q7ur1it$1NVzKZCl49W;a!pJ_kYJ&PZr8#Ig)mlX`r%>&ZyIXN-QcJfb{0?=rV zKz1BNfe=VRFjzrAHjjk6Ye+zNyt^xWq=Q`)q#yvMK*-lSIKGRa86#A0~r!xmjfB)2QzB2WiAgFy8^o+Wb_a={94bh%I*l7tB___ zV^?R_VAo{VV%KKZVb^8XW7lUlU^iqpVmD?tVK-$rV>f5FV7FwqVz*|uVYg+sW4C8_ zXk`4^$oRXF@oyvJ|3)UpMkeM)Ce}tK_C_YoMkek?Cf-IS{zfLjMke7#CecPF@kS=e zMkeV-CfPzi#(E~@MkdupCiO-p%|<5eMkd|$0@CbG?9S{i?5^x??C$Iy?4Imi z?B47??7r-N?EdTl?1Ah-?7{3I?4j&o?BVPY?2+tI?9uEojZFHDOy-SD_Ki&LjZFTH zOu>yz(Tz;;jZ8_6OlgfwS&dA2jZB4&Or?!X6^%?ajZ7_#Oh(;}O#O{alN*_)H!{s? zWSZB=w6KwBX(Q9hMy9n5Dwi3&8MqmI7RWEK>0Tc3^?3 zNxYLMl<;$JgD8|ih)eUZ?}iAH+=OJ=x@d8d@x%HEICij=ga9@FlYoOY}Hu-&-2=`5h zoL0Pm{$$5O-O1MFd>r>6Vmgxp%Y8T=LpXYq?-!U(-aT2u1U$RQ{*3)KgT@l}=j<=o zU$VbyWHM-EGHhfrYGg8A!v2Q+E&DsB*^NvljZCJEOlA$&C&$;+PF`FgssEGxA4uCT z_TTJ(*#9;%Su`?PHZoZ?GFdNS|Ifj|{*HsGk;$f!$+nTntdYrXa(qo)u${bhS8PnR zp`nSnj)IY~nPqKcwV{!j322@cI%UAY!y(9^v4n${gO7usL!gn#p^?e4k;$o%$$1Hf z5Qi}PI}XuCCYMGgSFpKmAaf^MRw)^9$aAQGG%9c?awu^qH!^uNGI=&Kc{MV5FX2$- zP-B0`q0z|X)5zot*60WJ2uHP2y%C2wNFP=UEjTRM-*H$sG6gg;1%mYjHK>55&1{;p z6F$XM8yc7z>L?gmn3;imVqs>fqhJY}P2_Ooa040a#No{0!r|J;6w=5P+Q<~v$P~VW z!=1x}{T+u_BU1!tBU2>UjaGd! zM+Qg_R$pXtWIeJfp}7Uz>4h9+Ak(lqy_}J^OGG#Y1<$(3%LL6=<%aP?937SDNGBO7Ty{S2PvLBX+=5Z{>>5?TJOCh0= z-^f(J3J#9RvUM{0YdAK7^k7Xtn>aSJzvI~2$W+wGR19`W$>fYWb-mpj2S9qThSNcg zLlAq)8kx!=*6gj5(Lc#?4x|NZAf4y9!2XWoQX^AkBU2UFn(E0M^{VuCljq?`3>dapS?fb_lLc+2sQ z<9#DjYa>%zBU5`LQ^yjHj~t&M&g*Ps>Vh~Al(kniNa+9NWCCf!=0r|rP8RleoNSFu zJ&jDgVC(uOe{9e+;N;=NnQu9TIEC5Yaf&uFO=x7A2-Y-dvR9*~0jD&l0>~z8Va}<@ zsl@({Q>BqB~7dNWub82zwsF<4rwrB2SmnJnmcTOLidVD$kAlA%pWLf~RW=4~&ekf-YPA$=#G3@U+;~JS3 zH8L#*TeD>HlO{F&6wXYL9;|_##hK0ijx)EBX;~xFaMy6GbOsm0q)=Zw*tghe0*$&c!)t(N{PWE@4-HlA^8kyFE^=z2@yjiP$BIiO- zYh*gm$aJWY=}05fu|}p7jZCK+na(saom(%!&$)O#aZVCIoLRah`)H*gH9~$82(T8#l*gh`|2Ib#0CuHz1sYlaIGKa@>V* z4o?=M2R~nhFf`WyIONdLDft$&jON2{w z^5ITxgKOaR5?tb3648Fao_Q&$6#0i8N!eSAgZLfWG2gXNwILra>-4$>9VNj zQs7cTI8wQh>1Klp#BpjM$Ei0m-NNEH&Rtx3jZ6@iZEa+_eHrd511?bk-$tfu(2|_X zn9GzwV5zI3_Aj5qdnI2;?JeKna7eCDOosCRaVQvrOia?ka z*~s)1W?Br$wAeLrgqf5JGAXZ-=@mAUO1Mg4 z&U)R*^ahle>$!xuDj2xAD!Hn-M8WH0;4$u!Sdu8f)X4Ojztx2hz2etC6djAuP-<7{r75zLl#T;pUD;rVk)D8*njj zb9I9p-P6eQ5u2kYaZQFf`cos*=gD<#W*|pH((E)YQ2~FX_?pQz8)3(sMy9VIJ3v;< z2U)S8k?9*2D>!c;65l~k;)5)+<66nJ8e!O)My4My!|KHdA*UD5u26I5$->ZF4&V;t4&n~x z4&e^v4&x4QWL9isR&HcgZDdw&WY%nC)^23hZDiJOWHxMMHg04#ZDclI!yU;T#U0HZ z!yU^V#~sg|z@5mQ#GTBY(#UMt$ZXfh?9j;U)X418$n4t4?AFNa*~skG$n4$7?9<5X zCy7!Yb7z8UGiD`3-&uwu4JtRALq>>8?kj6u}dmw5I5CanuJlqo@f<`bad8UeTPlJe=ppJvc zamkeBOm@8I5zp?WV^wIf*d0Tk5-xsPC|J_c6p3{u_qgMp!* zfq?;9W^kY4K8v9oZa7TQCGM*jis0^rDZ0gd7fsPU?)#0*?v2bIAd4rlfSsxA(0gHW z+;rahC*04`lrQJTu=ox4d%}voaDOMP=nwaQ6h-xmxR>)Vg2TlZ-BeQ=aa{x$n_YAOVWrrREFaxHIpGTNMV=<2ak06gwBXdwAb8sVb$YLH5 z9#I~#M&{5)=E6qi1W*gcU~=Y+OkW-uhSH@xvOID;@;nMWijB-+jm)u)%!!T6sg2B; z4X{<+JSsdIAY)Z|)OgeznZp~IBN~|_7xQTHXz^$_GDkHsM>jIZOqQRyvEGEo0-H)p z9xIRo;u@Lb!46P%06Uw3Ay6R{yp|T`0Y@HJZ2H}J+<812nUflslN*^+8dQ`WAW4)V z$VwqzfIlj=C_f}KwJ3P9|13TSKb|0LW(4zu@Psxpr!_LCH!^25s3_ZifH)$VK|z&? zK>^(6;ECd@-#m9#I+N!+n3H08QW!Lr@u>2|^Ca-7^Ca;kgM%QekvY4OIkJ&Cr;#~# z8ILBDF;6;A29q(9aU*k7!l znR^?V`x=@18<{6GGEZz|p47-ZxsiEFBlFaiJl7c%cy99C;@V5nCB1AU!H$F|3Qvo zUf943T4dbFe7=$SaU=7SM&>u5qCo)UD3{cv()9GyB9Kes1;jij-&i|IB`PPeGQYGW zq$o8N>KtBfUS0-`g}gkC%!?NC@-;Fqo*c5t(3Mw+7u1H~6>el+vXED_k$Gu@N{DY_ zW*$tNB(E%k&|+RGUTI#LM&@OW%*z{@S1jh0V=~}XXk=d5u(^@>?Br9MlH+(my*OU= zM&?!Uh19%SyhaQf%XzhVb$E4o^?3Dp4R{S3nO8S5uW4jn+sM4Gk$HV1^M*#|jmvqB zc};jtdChpucr6%aH8O8%WZvA!e6W%EG#H(k+`V~oJ+BL|H-peJoO@?@eL#C>c>NiR zcmo@mw}3X!G%{~(*xJZ^pur(t0N3UjaAxHVWyoI08`j9Y4QXjPZzOLN!%9ZiM&=!j z%-hWoJ0YIA^}+%uo;Mk~6M{Dhv=gF{dFNu@6edaDv_|G#4a*vtcTX-afJ znNKz_KoqRxT{ZdQ1~KMEysIal-yqAvyOwv|WR|$v$b7Al`FbPsjV0{wm<$+_7!*Kbew!yh-qljidxQ5DC=1?f zWWKeK$pBQ)#0v;I=jRpY=cKx2=9Husfh>g?exLUtY`+KZqekXC(4GqKQ-;z-yw7-_ zH!|OCWPSju9l#|o?We&Gc*f#BP|cz^Kz zY-E1e$o#0m0TBes4wVbQH7?98|9JmHrc~s?maS6eByjkAbGg7G@nc(^Q%VY z*OL$Kkrlkcr^u(or_8|3r^4XNr^cr~xo@41(w7E?M&`GT%-^r^Y4T|?aPw*N>G0_? z`0}an88CVC88UfI{ zb1`u9frf|p)Eb%JHpqd~I$r=^V7!3(Q9!tNH*ztD@P$r(wNZmP zj3I3DtBq=~%7rh2FAA18_@Wz`e?k)nUmPg>D7&o%mG_u$>s7$t9EH&9=ajOeo2VXyf z#xlN6zAnCQz8=0_zP?5l)u|K#^eWOMk|@NH$#Si!fJZyl2)-v+*oe4F?-^KEHl z5olx)Y*^OFBGkwt+{hx*$RgUvA_h{omJbPn)d^sd4JrZ1EngS!c>myt$qh@L;IVm} z?q-J_k`~$-!s1Fd@mYVWE)xJ z8d>BUSri&s6dPHT8d;PZSyUQXR2x~;R`I=JGT?i|WWe{1?>(r3Vo>1w+{mKdu(^>% z6GZ4Vvgm=UD&9sGg9eq!AD63dzPn6}kx_5*gJoiqk1mt2zQoVKz|G{v&luwu9F&-s zp6Z-mnpe`uq5;ks{LK6;@dASI@k4NJ0@}UH&&tm>xq79d-z9zy25x>%ey#}EF1yxH;YK-@loVwqm6oKYKsNU+<`?7_n!IF%Nj<*^12;bd zzbL;Lzc`aOlXsL~uupz+B53zugkP{vYF>Ith5%b5i!Q`mNq(s)KgdvcaB9gSerbj< zBtFD_viw|)Ec!^!Qf$~50F7RLWqwr#p@sY^jVy)>`PCYkSd2gk)R|w4UmFtbFok;j z#ta%u`1Sb>_zn4u8d*#lSxg&Q%o6B)}Sg!WwPQbk;%_i z%DcpQy10gA7H1~qqz0uXm&6N5g6g#7jMQ9crIVSL?wSYMIh_Kt%#Pmy5&fNBmEDnt(1biZ0tULP;O?-%TyTA7;SSd^TRS(aLKk$(yQ($L_N#FEqoMg|TBNd_ebZ3a^Y zD+YUxj~w4QSvYw(#X03Tl{r;8)j4%I^*9YVjXAwI3pwjJ`#C3aPUf7-Ih}JR=WNco zobx$1aBkw0oOvVbzIxIc5?0J z+RL?{>jc*+@L?2}xUO*hVtyjys;^X}x`4L(-kIPV4C`@GM1-}Ca(f13X+|9Sq40@eZ^0$u_>^#XnZy9G`NTokx0a8=;Cz)gWi z0#5{<3A_+^CGbX2T+mgpL~ya-2EomOTLpIr?h@Q1ctP-{;61?yf{z5B2!0g&Cip|} zm*9UPMj>V)Rv}>_H6bsdV4)bHM4>#PVxdx@a-kZbI-v%kCZT4b9-)~+n}oIqZ4=rd zv`c7@&_1C9LiLA)jtCtSIw5pQ=&{gKq31#`gJ5P zg%XP;mP+iDI3#gg;-tiBiL(;7B<@Q*lz1%hLgJOg8;N%keATXeq+d(Fk$xxrTl$amU+MocJTkm8 zd@=$uvNCcq@-m7tdNTSl1~T_8c7DC=LfOT# z8)P@hZjs$4yF+%D>>k;DvQOj~`tpo>!hESswrwHYANa{ zS}NKpIw(3Rx+{7rdMo-WMl0qiPEwq$xI%HQ;(Eo6irW--DDG0+qj*&DlHz^Ehl-CC zpDI3Ae5v?a@rU9s#XpMwlo*tllvtG5loXZxm9mstl@=(SRJx{gUFn9>Ev3gwPn4e3 zD}7e_qV!eiyE2P1t1_E1hq9=$n6kLCq_Tptrm~K*p0a_mqq4KItFpVYr}B2?1IlNW zuP9$rzM*_e`JwV-<)_Nem0zmxsc5OVsQ9V`s068ms3fZ7sT8Obsg$UcsZ^*`skEzf zs&uRLs`RT&RGF+YRb{KnMU@|_a;h$>nX2_gs->#ss+Fousx7L!Rgb9OQ-7fTNd1ZW zGxZnhuhieDzf=F9{z?6d`Zx6->c7iF(TLYb(n!_F(8$)v ztJf&hDA6d_sM4s_XwYcZXw&G_=+Wrcn4~dPV}{0Tjd>aiHI`^B*I1>oR%3(4W{qtc zJ2m!b?AJJ?aa7}k#%Yan8W%OLXk6F0rEyo|fyQHvXBsax-e|nn_@wbwz>6%%Zxtax<#hPWBm6|o0^_oqZt(qO0-I{%x6E&x3PS>2J zIahOm=3>odnkzNeXs*}Xq`6gdhvsh0eVPX~k7yp(Jf(S7^MdAO&1;%BHScKN*Lw3+1njba4XnxoHrTJHjL5o?7O^Z{DM~h!eNJ~^pLQ7gpPD@csMN3^vOG{VF zK+9OmOv_TsM$2ByNy}BsL(5ysPb*L>L@Qh?N-I_?K`U7+O)FC?M=M{eNUKz#NpxZAoniooy$yO#_1@`y z&==O1(U;SA)A!d8)GyVq({IpUufIcom;OWjSNd-Zgbbt&WDU#>91NTc5)HBpatyi+ zrWi~!*kZ8PV86jDgU<$E4J8eg3{?!>4Fe2=466-W4BHIr7aOiITxWRN@QUFz!|z56 zModPMMoLC1Mh-@vM&3rnMm0utM$3%W8*MatX!OeHjWLI@ps}#Av9XP@opGvho^gS3 zxA7F?X~tWO_Zsgverf#4_=|~@iL!~RiJwWhNu)`gNxMm>$p(|1Cc8~;nmjUjV#;jF zW6Ec$V`^$@ZW>WCm< znJqC}Yqs9(ve_N8d*%%0oaWr-isoA8I_9qCe&zw@mF7+6E#`B~mzpm(-)DZ@{G|B{ z^N;4AEqE=&EF>&UE$l2DEHW$#Es8CAET&pax7cBE(BiPgU(0$nOAbqYOAAXY%XrHS z%Ph-&%NdrlEcaO+w>)Y2%JQ@2S1W!i2`ecpJ1ci9Pped`JgWk$305<$W?SvBI%sv+ z>bcbit54Q^*5cNZ)>hWe)~?pM)@9Ze)+?V4jV2TEgNGSQ=4R) z9Gg6wNj9@>=GyGFIaY6T!se;XJDU%-indy|I<`T!(YCR+eYVqWXWH(!Jz;yw_POl` z+fR0)c5-$KcAj=Yb|H3kcI|eZcI)i6+wHV_X!pwQjXj^exV@ykiM_48y?vT}zI~zn zEc?awOYJY%-?YDN|J#AZfz83d!P3FnA=x3vA-gS@)rrqZz{%Cg&ndvE+^NB-$!W3E8mDzm*PQM< zJ#=Pq=5^+GHgdLhwsnqkPIu09?scB#Jj3~=^C#yoE@m$FE{-nEEXT9qO*PpJx-R#`l-8|j;+@`zDbi3{L#O;~8u)B=AoO_6S ztb4rs4EKfZi`}2Qe{lcgq2i(Iq3@C9QS4FbvBhJr$9|759)CUldpdb~d-{5|c=mes zd!F;W?s?No$V=Kw)+@v-)+^p?vez81d0v;j?s(nv=JgiymhkrQ4)hN8uAksN(|fk} zS?_D!H+*D$)O<92a(&8tDttEi?DpB~^Ty|^&v#!#Un^f5-(uey-#XvbzFT~^`F`{L z@5kup;OFV*?bqPf>DTRd!tbKrWq&SzVSiEoBL8atTK_}-r~S_ca0Unkhy(-$L`3(*M44k-yK3ppBcF62TeZ>U(PL})^2W@vWk_Rs^N zhr$HHB*Ub`lEZSs^1`-;?F%~)E*LHqE)!lHUK3syekJ^F`27g=2!jZth?ZlrModvmbxdu{;g~Zq=VHZU6=IcQGhz#4i(|LN?vFhf#}OwOCma_R7ax}x zw>)k`+@`qi@eJ`y@viZH@d5Eu zN%T$hPh6U~E^$NRza;h~&ZPLHjHIljElGQm_9wF^3nU9AMhln<#Ysk*89si~=XsRgO)Q+K59O5;frO%qQGPfJKkN?Vz>DXo4> z+Rt>Rbe8ns^qBOx^mXam(|4wSN&lPvKf^4;KEpAiEu%kUV#dvkM;T8t%`)vX9W%Q# zr({mcyqozf^F@|%mQ9vjR$Eqo*2JtkSx>W`XPaj`WIJW|WlztZnf)dEZ}$J3(44rO zgq+Pedvf;W^5u%>O6F$gmgJV@9?!j!d$m6ITJDY9FL{i4R(ZC04tdUbZh4-0K6(Cm zL3yEh5qZ&hae0Y(DS7F6S$Vm61$o7JWqFl(HF@=UO?j<(9eLe(NAiy6oyt3#cOma` z-nG1&d3W;e=RL}Mn)f2_b>6$Yk9lA6zUTeQ`^Hh)+Cp8S3J2MZVr_zDCHgbG9pVhgegatiVa3JW$C>?=4> zaH!yDAyXlLpi|@?NXUi%~I`B-BN?n!qU3ZhSH|e*3$i@XG+hNUMRg>CSImerdFm= zrd?K4R$taw)?C(BcE0RR*}bv{Wsl1>%1z77%Pq@o${Wgi%lpeGmQN`^R(`qsYWel@ zTNU+E73vk571|Yg6_pij75x>HDyCMnk=^oT>O+$yljbX;f)b zX-wrMRo|?QlnmDP-9$UR%2OXQ)5>XS<_I{SF^2Vf6d97OEvdvUevsCts&o zXI5ul=Tzrf=TYZf7g85q7gZNqmr$2fmt9v{S6|mtUpKXGM&0bXd36ixR@JSo+fcW; zZfo84x&w75>#o(^uX|MYwC+XS>$)#>-|K$W{jF!HXR7C}7p<4C*QqzHx2U(Sx2t!o z_p0};52z2W53LWcPpHqVFRQPwZ>n#t@2KytpHe@)epdb5`UUli>Q~oqsoz_Fs{V5Q zwfdX&ck1ug*T1NLUH`8BWBr%u&!Za!>)$C z4F?(yHymv^-tefAvr)X!zR{yGs4>1VqcOWNud%SPq_MWKp|QEKt+BJQyKze6!p7B& zI~or*9%($@c&hPiCuXoAsIvnvI&Rn_ZiOnxmWJ zniHE-n$w#Lnv0w3%bF{jYntnt+nXmg&uU)YyrFq>^S0)l&3l@UHlJud-F&Y3V)NzZ zJIybeKQ;ev;b`G*;cF3W5owWaQD{+aQESm`(QYwmv1{>Y32ljMNo+}JNpHz&DQ+oi zscflfsc&g)>1vtYvan@c%lVc|EmvD^wA^mF*YdFCNz3z=S1oVrTRyaWZu!>ov*k~# zY^y@6a;sXaW~)xCeydTdX{$x6b*o*gW2;N6d#hKgPitgrbZcyDLhIDlMXgI(m$j~J zz1RA>^=<3>)=zEfZ6 zyFH>ksy(JXzI{sj!uI;b?MvHNwBK!i)&8daUHiulwGQJB(+=|vtB(ARnvS}ThK}Zr z9UVtIj(42wIMd14$=4~+Dby+2>D3wD8QB@#8P_?vb3y0g&Sjk|JJ)os>pazYx$|1* z&Cc7MAG(;kc)J9;gt~;g#JVKA{JNsM^1GV4TDsc1CUni|TG+L=Yg>KS`L1hS@4H#M zg}Oz%CAy`%<+>HRHM@1X^}7wb-MT%yy}Nz7{kwy@$_)n zFX>+1y{dan_rdNX-N(9*cc1D$+kLD1ZuhJ1x7{DQKX-rY{?WtO!_vdv!`UO(qu8U| zqtc_^qt#>HW7T8ZqXpLL&I zpF^K#pHH8EUtnKaUuIu+Urt|sUr}FuUsGReUq@eeUvJ;EzL|Y<`sVd*?%US4qi<*5 zp1%EkXZp_fUFy5qccbrC-{Zb#eJ}f7_cQb}_p|o1^>g;~^h@?j_sjJw_G|U)^&9rv z^*i>v^t<+L~z_r)`U74>1@+ErVCD&o31=vZMx=kz3GP2O{SYo zx1a7aJ#c!+^zi91)8nTnO;4GgJH2Xp{q&~kt<$@v_fDTMebV&#)0a$NK7G~n_0u;^ zuirX-`}8BzPfkBG{rvPR)2~mzHT}-?r_0Y2J;NI8Qe4YW(dv@o}n;9b%w?a z?HL9$jAxk5u$bXG!)u1`jDQ)TGa_b0&xoCoH6wpU(Tvg=RWoX5G|Xt4(LH0vjJY!w z%vd~Q#f;T6*3H;3W9N)RGtSSrHsj`uJ2URjcsAqZj5jmh*U$JkQ)Q<8%!rwZGjnF< z&n%i*I+i+Ps*EQ?w8vw~+O%u1h? zH7j>k!L0IGRkLbmHOy+7)jg|s*5p|WW-Xt!YS!9W8)j{vwQJViSqEkvnss{Cxmgcp zy`A-C*7sSzX8oPbGMjxi*KFR|_58CXX3NjknA6F3ee&zp!Xw>B5SI?F+jW_AZ>TaMHr53#TufwQ$bD)eFxr5?Exv zC~;Bkq8W>}FFLU3@S$r5DRB zR$Q#ISbee9V%^31iwzgsE)G~6x43Wd!o?RBKVJN43HK7sC1y)Jm-sC4UlOz=bV>5Qebm(HtSx^U^@r7MG`D>mtI+V zZ5h)tsbxmXte4p>b6n=UEMQsuvZQ6H%QBW_FUwn2xU6JZ^Rl*Ooy&Tb^)H*WZ0fS< z%VsWHwrta~v&$YX`@39vx%zU)<$lYfm&Y!TU!J%;d3oyc^yMYX%a>O!uU=laykU9s z^48_^m)EaYzIyq( zS2(WlTH(7QU`5c1_!T)T@>UeAC|XgnqHIOQiq;h!E4o+ouIOJeamC~nQ&-Gev2ewb z70XtvU$Jq;r4_eV+*xsN#jln8E0tCnu5?+MurhgN+RDt8IV-nRPS>YJ;d zt$x4y)9SCQf2{t!hGh-=8qPJ`Yk1f2uc_BvqDtvR{o%$jp+uCKYX=Kh*TYo4t6xaQlMA8UTC`M;KFE$dqLwE}A;*Q%}6UaPxS zf33+{^R-rMZPvQ2^aYYWyEtu0+!v9@Y$^V*KJ-D~^SPFOp4?V`0y z)-GGSdhNQk8|&9@Ub}bgv9*`i-dKBU?VYs`*FIVMeC^A%zt^#>6J4jZ&ShQvx}(bX{t!rM_vu^Ub`Rfj?JGbt_y36aXt-HDI-MWwKzO4Jc?$^4%>)F>l+?zc)H=mhSwY3ZTPt1&xZdSnKrU+5-}q|d+l?PKe%i#j$zoIZrs_>y zo91jBnZ)&0?D+H_L36+pM@*WwZKb ztK{*=w`!=77z?o5MCoY>wQVy}4v_?dHbKlQ*y3yleB`%?CCg-h6EH ziOp9xU)y|r^Ucj4H`o8$!nlQH3;PzXEj(K!x5#Xf-=efdb&L8IlP#WGe75*+3EC36 zC1OkTmbfj6TT-^9Z>iZ*zol_Y%a*n+om+ag^lh22Wzv?ZTc&T>x8=!JfvuWbgSR$q zow;@A)=S%%xAAO~+$OV4b(`fjhixI-;ZV%fYxjklk{Pv{nDcj4oH*as* z-nzYg`;_f-w=dYfc>A*LE4OdjzIFSK?Yp<{+kRmCrR|@0Fzt}rp}j+Ihv5#B9p*bM zcX;oJ*b%uSYDdhDk{#1`EZMPr$F3cFcO2Mpct`!Q9Vd63*>Qfyr5#Uqyx8%2$GaUL zcYN9LeaEjIe|IwMWZEga({QKj&XAosI~#V+*|~A­X1UfFqV=lz`zc0Stqdgq&+ z?{-+cja=)Lk=n&E7S4*Xmtcb{*VxY}bihr*@s+b!petUDtQL b+U>JDZg=wTOvnN$CMF2YzYIdd$lcih5q^IJ delta 26122 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 W*FC=(z<`MfOfm4!fzU8=&tCw*bttC* diff --git a/integrations/README.md b/integrations/README.md index 9f2ba87a..820aa887 100644 --- a/integrations/README.md +++ b/integrations/README.md @@ -5,9 +5,9 @@ If you want everything built at once, type `make all` and go play outside for a *NOTE for Apple platforms: In order to build iOS/OSX Frameworks and Bundles you will need XCode command line tools `xcode-select --install`* -*NOTE for Android: for Android JNI libraries to build you'll need to install [Android Studio](https://developer.android.com/studio/index.html) and the [Android NDK](https://developer.android.com/ndk/index.html), and you'll need to tell our project where you put it by putting the path in [this file](Android/proj/local.properties), if you don't have these things installed and configured we will detect that and just skip those builds automatically. Additionally, you can 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`* +*NOTE: For Android JNI libraries to build you'll need to install [Android Studio](https://developer.android.com/studio/index.html) and the [Android NDK](https://developer.android.com/ndk/index.html), and you'll need to tell our project where you put it by putting the path in [this file](Android/proj/local.properties), if you don't have these things installed and configured we will detect that and just skip those builds automatically. Additionally, you can 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`* -Below are the specific instructions for each integration requiring *little to no modification to your code*. Remember, with a full build we'll put a copy of the appropriate integration instructions in the resultant binary's folder for you anyway. +Below are the specific instructions for each integration requiring *little to no modification to your code*. Remember, with a full build we'll put a copy of the appropriate integration instructions in the resultant binary's folder for you anyway. For more support on these integrations, or if you'd like help creating a new integration, stop by our [community section](https://www.zerotier.com/community/)! diff --git a/make-linux.mk b/make-linux.mk index be509a3e..606d4720 100644 --- a/make-linux.mk +++ b/make-linux.mk @@ -38,11 +38,6 @@ LDLIBS?= include objects.mk -ifeq ($(ZT_OFFICIAL_RELEASE),1) - DEFS+=-DZT_OFFICIAL_RELEASE - ZT_USE_MINIUPNPC=1 -endif - ifeq ($(ZT_DEBUG),1) DEFS+=-DZT_TRACE CFLAGS+=-Wall -g -pthread $(INCLUDES) $(DEFS) diff --git a/make-mac.mk b/make-mac.mk index e1a45e05..b3ffcf34 100644 --- a/make-mac.mk +++ b/make-mac.mk @@ -42,7 +42,7 @@ else STRIP=strip endif -# Debug output for SDK +# Debug output for SDK # Specific levels can be controlled in src/debug.h ifeq ($(SDK_DEBUG),1) DEFS+=-DSDK_DEBUG @@ -50,24 +50,31 @@ endif CXXFLAGS=$(CFLAGS) -fno-rtti -all: +all: osx_app_framework ios_app_framework osx_unity3d_bundle ios_unity3d_bundle android_jni_lib osx_shared_lib # TODO: CHECK if XCODE TOOLS are installed # Build frameworks for application development -osx_app_framework: +osx_app_framework: cd integrations/apple/ZeroTierSDK_Apple; xcodebuild -scheme ZeroTierSDK_OSX build SYMROOT="../../../build/osx_app_framework" -ios_app_framework: + cp docs/osx_zt_sdk.md build/osx_app_framework/README.md +ios_app_framework: cd integrations/apple/ZeroTierSDK_Apple; xcodebuild -scheme ZeroTierSDK_iOS build SYMROOT="../../../build/ios_app_framework" + cp docs/ios_zt_sdk.md build/ios_app_framework/README.md # Build bundles for Unity integrations osx_unity3d_bundle: cd integrations/apple/ZeroTierSDK_Apple; xcodebuild -scheme ZeroTierSDK_Unity3D_OSX build SYMROOT="../../../build/osx_unity3d_bundle" + cp docs/osx_unity3d_zt_sdk.md build/osx_unity3d_bundle/README.md ios_unity3d_bundle: cd integrations/apple/ZeroTierSDK_Apple; xcodebuild -scheme ZeroTierSDK_Unity3D_iOS build SYMROOT="../../../build/ios_unity3d_bundle" + cp docs/ios_unity3d_zt_sdk.md build/ios_unity3d_bundle/README.md # TODO: CHECK if ANDROID/GRADLE TOOLS are installed # Build library for Android Unity integrations # Build JNI library for Android app integration -android_jni_library: +android_jni_lib: cd integrations/android/proj; ./gradlew assembleDebug +# cd integrations/android/java/libs/; for f in *; do mv "$f" "android_jni_lib_$f"; done + mv integrations/android/java/libs/* build + cp docs/android_zt_sdk.md build/README.md osx_shared_lib: $(OBJS) rm -f *.o @@ -81,6 +88,7 @@ osx_shared_lib: $(OBJS) cp src/libztintercept.so build/osx_shared_lib/libztintercept.so ln -sf zerotier-sdk-service zerotier-cli ln -sf zerotier-sdk-service zerotier-idtool + cp docs/osx_zt_sdk.md build/osx_shared_lib/README.md clean: rm -rf zerotier-cli zerotier-idtool