From 7ade530466bcb9696125cbf4a95ec5e2ccaecc5f Mon Sep 17 00:00:00 2001 From: "lxbpxylps@126.com" Date: Sat, 23 Oct 2021 23:12:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 7 + NodeRoid.pro | 39 +++ android/.project | 28 ++ android/AndroidManifest.xml | 23 ++ android/build.gradle | 77 +++++ android/gradle.properties | 11 + android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + android/gradlew | 185 ++++++++++++ android/gradlew.bat | 89 ++++++ android/res/drawable-hdpi/icon.png | Bin 0 -> 2385 bytes android/res/drawable-ldpi/icon.png | Bin 0 -> 1064 bytes android/res/drawable-mdpi/icon.png | Bin 0 -> 1548 bytes android/res/drawable-xhdpi/icon.png | Bin 0 -> 3403 bytes android/res/drawable-xxhdpi/icon.png | Bin 0 -> 5559 bytes android/res/drawable-xxxhdpi/icon.png | Bin 0 -> 7789 bytes android/res/values/libs.xml | 20 ++ .../akashic/noderoid/NotificationClient.java | 93 ++++++ main.cpp | 18 ++ mainwindow.cpp | 119 ++++++++ mainwindow.h | 41 +++ mainwindow.ui | 275 ++++++++++++++++++ notificationclient.cpp | 90 ++++++ notificationclient.h | 76 +++++ syncdata.cpp | 132 +++++++++ syncdata.h | 36 +++ 26 files changed, 1364 insertions(+) create mode 100644 NodeRoid.pro create mode 100644 android/.project create mode 100644 android/AndroidManifest.xml create mode 100644 android/build.gradle create mode 100644 android/gradle.properties create mode 100644 android/gradle/wrapper/gradle-wrapper.jar create mode 100644 android/gradle/wrapper/gradle-wrapper.properties create mode 100644 android/gradlew create mode 100644 android/gradlew.bat create mode 100644 android/res/drawable-hdpi/icon.png create mode 100644 android/res/drawable-ldpi/icon.png create mode 100644 android/res/drawable-mdpi/icon.png create mode 100644 android/res/drawable-xhdpi/icon.png create mode 100644 android/res/drawable-xxhdpi/icon.png create mode 100644 android/res/drawable-xxxhdpi/icon.png create mode 100644 android/res/values/libs.xml create mode 100644 android/src/cc/akashic/noderoid/NotificationClient.java create mode 100644 main.cpp create mode 100644 mainwindow.cpp create mode 100644 mainwindow.h create mode 100644 mainwindow.ui create mode 100644 notificationclient.cpp create mode 100644 notificationclient.h create mode 100644 syncdata.cpp create mode 100644 syncdata.h diff --git a/.gitignore b/.gitignore index f147edf..c75f867 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,10 @@ compile_commands.json # QtCreator local machine specific files for imported projects *creator.user* + +# Gradle and Java +.gradle +.settings + +# VSCode +.vscode \ No newline at end of file diff --git a/NodeRoid.pro b/NodeRoid.pro new file mode 100644 index 0000000..0b62aad --- /dev/null +++ b/NodeRoid.pro @@ -0,0 +1,39 @@ +QT += core gui +QT += network + + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +CONFIG += c++11 + +# You can make your code fail to compile if it uses deprecated APIs. +# In order to do so, uncomment the following line. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +SOURCES += \ + main.cpp \ + mainwindow.cpp \ + notificationclient.cpp \ + syncdata.cpp + +HEADERS += \ + mainwindow.h \ + notificationclient.h \ + syncdata.h + +FORMS += \ + mainwindow.ui + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target + +DISTFILES += \ + android/AndroidManifest.xml \ + android/src/cc/akashic/noderoid/NotificationClient.java + +contains(ANDROID_TARGET_ARCH,arm64-v8a) { + ANDROID_PACKAGE_SOURCE_DIR = \ + $$PWD/android +} diff --git a/android/.project b/android/.project new file mode 100644 index 0000000..91e13ef --- /dev/null +++ b/android/.project @@ -0,0 +1,28 @@ + + + android + Project android created by Buildship. + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.buildship.core.gradleprojectnature + + + + 1634916704863 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + + diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml new file mode 100644 index 0000000..f4490c3 --- /dev/null +++ b/android/AndroidManifest.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 0000000..310b710 --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,77 @@ +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:4.1.3' + } +} + +repositories { + google() + jcenter() +} + +apply plugin: 'com.android.application' + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) +} + +android { + /******************************************************* + * The following variables: + * - androidBuildToolsVersion, + * - androidCompileSdkVersion + * - qt5AndroidDir - holds the path to qt android files + * needed to build any Qt application + * on Android. + * + * are defined in gradle.properties file. This file is + * updated by QtCreator and androiddeployqt tools. + * Changing them manually might break the compilation! + *******************************************************/ + + compileSdkVersion androidCompileSdkVersion.toInteger() + + buildToolsVersion androidBuildToolsVersion + + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = [qt5AndroidDir + '/src', 'src', 'java'] + aidl.srcDirs = [qt5AndroidDir + '/src', 'src', 'aidl'] + res.srcDirs = [qt5AndroidDir + '/res', 'res'] + resources.srcDirs = ['resources'] + renderscript.srcDirs = ['src'] + assets.srcDirs = ['assets'] + jniLibs.srcDirs = ['libs'] + } + } + + tasks.withType(JavaCompile) { + options.incremental = true + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + lintOptions { + abortOnError false + } + + // Do not compress Qt binary resources file + aaptOptions { + noCompress 'rcc' + } + + defaultConfig { + resConfig "en" + minSdkVersion qtMinSdkVersion + targetSdkVersion qtTargetSdkVersion + } +} diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 0000000..fded106 --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,11 @@ +# Project-wide Gradle settings. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m + +# Gradle caching allows reusing the build artifacts from a previous +# build with the same inputs. However, over time, the cache size will +# grow. Uncomment the following line to enable it. +#org.gradle.caching=true diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f GIT binary patch literal 59203 zcma&O1CT9Y(k9%tZQHhO+qUh#ZQHhO+qmuS+qP|E@9xZO?0h@l{(r>DQ>P;GjjD{w zH}lENr;dU&FbEU?00aa80D$0M0RRB{U*7-#kbjS|qAG&4l5%47zyJ#WrfA#1$1Ctx zf&Z_d{GW=lf^w2#qRJ|CvSJUi(^E3iv~=^Z(zH}F)3Z%V3`@+rNB7gTVU{Bb~90p|f+0(v;nz01EG7yDMX9@S~__vVgv%rS$+?IH+oZ03D5zYrv|^ zC1J)SruYHmCki$jLBlTaE5&dFG9-kq3!^i>^UQL`%gn6)jz54$WDmeYdsBE9;PqZ_ zoGd=P4+|(-u4U1dbAVQrFWoNgNd;0nrghPFbQrJctO>nwDdI`Q^i0XJDUYm|T|RWc zZ3^Qgo_Qk$%Fvjj-G}1NB#ZJqIkh;kX%V{THPqOyiq)d)0+(r9o(qKlSp*hmK#iIY zA^)Vr$-Hz<#SF=0@tL@;dCQsm`V9s1vYNq}K1B)!XSK?=I1)tX+bUV52$YQu*0%fnWEukW>mxkz+%3-S!oguE8u#MGzST8_Dy^#U?fA@S#K$S@9msUiX!gd_ow>08w5)nX{-KxqMOo7d?k2&?Vf z&diGDtZr(0cwPe9z9FAUSD9KC)7(n^lMWuayCfxzy8EZsns%OEblHFSzP=cL6}?J| z0U$H!4S_TVjj<`6dy^2j`V`)mC;cB%* z8{>_%E1^FH!*{>4a7*C1v>~1*@TMcLK{7nEQ!_igZC}ikJ$*<$yHy>7)oy79A~#xE zWavoJOIOC$5b6*q*F_qN1>2#MY)AXVyr$6x4b=$x^*aqF*L?vmj>Mgv+|ITnw_BoW zO?jwHvNy^prH{9$rrik1#fhyU^MpFqF2fYEt(;4`Q&XWOGDH8k6M=%@fics4ajI;st# zCU^r1CK&|jzUhRMv;+W~6N;u<;#DI6cCw-otsc@IsN3MoSD^O`eNflIoR~l4*&-%RBYk@gb^|-JXs&~KuSEmMxB}xSb z@K76cXD=Y|=I&SNC2E+>Zg?R6E%DGCH5J1nU!A|@eX9oS(WPaMm==k2s_ueCqdZw| z&hqHp)47`c{BgwgvY2{xz%OIkY1xDwkw!<0veB#yF4ZKJyabhyyVS`gZepcFIk%e2 zTcrmt2@-8`7i-@5Nz>oQWFuMC_KlroCl(PLSodswHqJ3fn<;gxg9=}~3x_L3P`9Sn zChIf}8vCHvTriz~T2~FamRi?rh?>3bX1j}%bLH+uFX+p&+^aXbOK7clZxdU~6Uxgy z8R=obwO4dL%pmVo*Ktf=lH6hnlz_5k3cG;m8lgaPp~?eD!Yn2kf)tU6PF{kLyn|oI@eQ`F z3IF7~Blqg8-uwUuWZScRKn%c2_}dXB6Dx_&xR*n9M9LXasJhtZdr$vBY!rP{c@=)& z#!?L$2UrkvClwQO>U*fSMs67oSj2mxiJ$t;E|>q%Kh_GzzWWO&3;ufU%2z%ucBU8H z3WIwr$n)cfCXR&>tyB7BcSInK>=ByZA%;cVEJhcg<#6N{aZC4>K41XF>ZgjG`z_u& zGY?;Ad?-sgiOnI`oppF1o1Gurqbi*;#x2>+SSV6|1^G@ooVy@fg?wyf@0Y!UZ4!}nGuLeC^l)6pwkh|oRY`s1Pm$>zZ3u-83T|9 zGaKJIV3_x+u1>cRibsaJpJqhcm%?0-L;2 zitBrdRxNmb0OO2J%Y&Ym(6*`_P3&&5Bw157{o7LFguvxC$4&zTy#U=W*l&(Q2MNO} zfaUwYm{XtILD$3864IA_nn34oVa_g^FRuHL5wdUd)+W-p-iWCKe8m_cMHk+=? zeKX)M?Dt(|{r5t7IenkAXo%&EXIb-i^w+0CX0D=xApC=|Xy(`xy+QG^UyFe z+#J6h_&T5i#sV)hj3D4WN%z;2+jJcZxcI3*CHXGmOF3^)JD5j&wfX)e?-|V0GPuA+ zQFot%aEqGNJJHn$!_}#PaAvQ^{3-Ye7b}rWwrUmX53(|~i0v{}G_sI9uDch_brX&6 zWl5Ndj-AYg(W9CGfQf<6!YmY>Ey)+uYd_JNXH=>|`OH-CDCmcH(0%iD_aLlNHKH z7bcW-^5+QV$jK?R*)wZ>r9t}loM@XN&M-Pw=F#xn(;u3!(3SXXY^@=aoj70;_=QE9 zGghsG3ekq#N||u{4We_25U=y#T*S{4I{++Ku)> zQ!DZW;pVcn>b;&g2;YE#+V`v*Bl&Y-i@X6D*OpNA{G@JAXho&aOk(_j^weW{#3X5Y z%$q_wpb07EYPdmyH(1^09i$ca{O<}7) zRWncXdSPgBE%BM#by!E>tdnc$8RwUJg1*x($6$}ae$e9Knj8gvVZe#bLi!<+&BkFj zg@nOpDneyc+hU9P-;jmOSMN|*H#>^Ez#?;%C3hg_65leSUm;iz)UkW)jX#p)e&S&M z1|a?wDzV5NVnlhRBCd_;F87wp>6c<&nkgvC+!@KGiIqWY4l}=&1w7|r6{oBN8xyzh zG$b#2=RJp_iq6)#t5%yLkKx(0@D=C3w+oiXtSuaQ%I1WIb-eiE$d~!)b@|4XLy!CZ z9p=t=%3ad@Ep+<9003D2KZ5VyP~_n$=;~r&YUg5UZ0KVD&tR1DHy9x)qWtKJp#Kq# zP*8p#W(8JJ_*h_3W}FlvRam?<4Z+-H77^$Lvi+#vmhL9J zJ<1SV45xi;SrO2f=-OB(7#iNA5)x1uNC-yNxUw|!00vcW2PufRm>e~toH;M0Q85MQLWd?3O{i8H+5VkR@l9Dg-ma ze2fZ%>G(u5(k9EHj2L6!;(KZ8%8|*-1V|B#EagbF(rc+5iL_5;Eu)L4Z-V;0HfK4d z*{utLse_rvHZeQ>V5H=f78M3Ntg1BPxFCVD{HbNA6?9*^YIq;B-DJd{Ca2L#)qWP? zvX^NhFmX?CTWw&Ns}lgs;r3i+Bq@y}Ul+U%pzOS0Fcv9~aB(0!>GT0)NO?p=25LjN z2bh>6RhgqD7bQj#k-KOm@JLgMa6>%-ok1WpOe)FS^XOU{c?d5shG(lIn3GiVBxmg`u%-j=)^v&pX1JecJics3&jvPI)mDut52? z3jEA)DM%}BYbxxKrizVYwq?(P&19EXlwD9^-6J+4!}9{ywR9Gk42jjAURAF&EO|~N z)?s>$Da@ikI4|^z0e{r`J8zIs>SpM~Vn^{3fArRu;?+43>lD+^XtUcY1HidJwnR6+ z!;oG2=B6Z_=M%*{z-RaHc(n|1RTKQdNjjV!Pn9lFt^4w|AeN06*j}ZyhqZ^!-=cyGP_ShV1rGxkx8t zB;8`h!S{LD%ot``700d0@Grql(DTt4Awgmi+Yr0@#jbe=2#UkK%rv=OLqF)9D7D1j z!~McAwMYkeaL$~kI~90)5vBhBzWYc3Cj1WI0RS`z000R8-@ET0dA~*r(gSiCJmQMN&4%1D zyVNf0?}sBH8zNbBLn>~(W{d3%@kL_eQ6jEcR{l>C|JK z(R-fA!z|TTRG40|zv}7E@PqCAXP3n`;%|SCQ|ZS%ym$I{`}t3KPL&^l5`3>yah4*6 zifO#{VNz3)?ZL$be;NEaAk9b#{tV?V7 zP|wf5YA*1;s<)9A4~l3BHzG&HH`1xNr#%){4xZ!jq%o=7nN*wMuXlFV{HaiQLJ`5G zBhDi#D(m`Q1pLh@Tq+L;OwuC52RdW7b8}~60WCOK5iYMUad9}7aWBuILb({5=z~YF zt?*Jr5NG+WadM{mDL>GyiByCuR)hd zA=HM?J6l1Xv0Dl+LW@w$OTcEoOda^nFCw*Sy^I@$sSuneMl{4ys)|RY#9&NxW4S)9 zq|%83IpslTLoz~&vTo!Ga@?rj_kw{|k{nv+w&Ku?fyk4Ki4I?);M|5Axm)t+BaE)D zm(`AQ#k^DWrjbuXoJf2{Aj^KT zFb1zMSqxq|vceV+Mf-)$oPflsO$@*A0n0Z!R{&(xh8s}=;t(lIy zv$S8x>m;vQNHuRzoaOo?eiWFe{0;$s`Bc+Osz~}Van${u;g(su`3lJ^TEfo~nERfP z)?aFzpDgnLYiERsKPu|0tq4l2wT)Atr6Qb%m-AUn6HnCue*yWICp7TjW$@sO zm5rm4aTcPQ(rfi7a`xP7cKCFrJD}*&_~xgLyr^-bmsL}y;A5P|al8J3WUoBSjqu%v zxC;mK!g(7r6RRJ852Z~feoC&sD3(6}^5-uLK8o)9{8L_%%rItZK9C){UxB|;G>JbP zsRRtS4-3B*5c+K2kvmgZK8472%l>3cntWUOVHxB|{Ay~aOg5RN;{PJgeVD*H%ac+y!h#wi%o2bF2Ca8IyMyH{>4#{E_8u^@+l-+n=V}Sq?$O z{091@v%Bd*3pk0^2UtiF9Z+(a@wy6 zUdw8J*ze$K#=$48IBi1U%;hmhO>lu!uU;+RS}p&6@rQila7WftH->*A4=5W|Fmtze z)7E}jh@cbmr9iup^i%*(uF%LG&!+Fyl@LFA-}Ca#bxRfDJAiR2dt6644TaYw1Ma79 zt8&DYj31j^5WPNf5P&{)J?WlCe@<3u^78wnd(Ja4^a>{^Tw}W>|Cjt^If|7l^l)^Q zbz|7~CF(k_9~n|h;ysZ+jHzkXf(*O*@5m zLzUmbHp=x!Q|!9NVXyipZ3)^GuIG$k;D)EK!a5=8MFLI_lpf`HPKl=-Ww%z8H_0$j ztJ||IfFG1lE9nmQ0+jPQy zCBdKkjArH@K7jVcMNz);Q(Q^R{d5G?-kk;Uu_IXSyWB)~KGIizZL(^&qF;|1PI7!E zTP`%l)gpX|OFn&)M%txpQ2F!hdA~hX1Cm5)IrdljqzRg!f{mN%G~H1&oqe`5eJCIF zHdD7O;AX-{XEV(a`gBFJ9ews#CVS2y!&>Cm_dm3C8*n3MA*e67(WC?uP@8TXuMroq z{#w$%z@CBIkRM7?}Xib+>hRjy?%G!fiw8! z8(gB+8J~KOU}yO7UGm&1g_MDJ$IXS!`+*b*QW2x)9>K~Y*E&bYMnjl6h!{17_8d!%&9D`a7r&LKZjC<&XOvTRaKJ1 zUY@hl5^R&kZl3lU3njk`3dPzxj$2foOL26r(9zsVF3n_F#v)s5vv3@dgs|lP#eylq62{<-vczqP!RpVBTgI>@O6&sU>W|do17+#OzQ7o5A$ICH z?GqwqnK^n2%LR;$^oZM;)+>$X3s2n}2jZ7CdWIW0lnGK-b#EG01)P@aU`pg}th&J-TrU`tIpb5t((0eu|!u zQz+3ZiOQ^?RxxK4;zs=l8q!-n7X{@jSwK(iqNFiRColuEOg}!7cyZi`iBX4g1pNBj zAPzL?P^Ljhn;1$r8?bc=#n|Ed7wB&oHcw()&*k#SS#h}jO?ZB246EGItsz*;^&tzp zu^YJ0=lwsi`eP_pU8}6JA7MS;9pfD;DsSsLo~ogzMNP70@@;Fm8f0^;>$Z>~}GWRw!W5J3tNX*^2+1f3hz{~rIzJo z6W%J(H!g-eI_J1>0juX$X4Cl6i+3wbc~k146UIX&G22}WE>0ga#WLsn9tY(&29zBvH1$`iWtTe zG2jYl@P!P)eb<5DsR72BdI7-zP&cZNI{7q3e@?N8IKc4DE#UVr->|-ryuJXk^u^>4 z$3wE~=q390;XuOQP~TNoDR?#|NSPJ%sTMInA6*rJ%go|=YjGe!B>z6u$IhgQSwoV* zjy3F2#I>uK{42{&IqP59)Y(1*Z>>#W8rCf4_eVsH)`v!P#^;BgzKDR`ARGEZzkNX+ zJUQu=*-ol=Xqqt5=`=pA@BIn@6a9G8C{c&`i^(i+BxQO9?YZ3iu%$$da&Kb?2kCCo zo7t$UpSFWqmydXf@l3bVJ=%K?SSw)|?srhJ-1ZdFu*5QhL$~-IQS!K1s@XzAtv6*Y zl8@(5BlWYLt1yAWy?rMD&bwze8bC3-GfNH=p zynNFCdxyX?K&G(ZZ)afguQ2|r;XoV^=^(;Cku#qYn4Lus`UeKt6rAlFo_rU`|Rq z&G?~iWMBio<78of-2X(ZYHx~=U0Vz4btyXkctMKdc9UM!vYr~B-(>)(Hc|D zMzkN4!PBg%tZoh+=Gba!0++d193gbMk2&krfDgcbx0jI92cq?FFESVg0D$>F+bil} zY~$)|>1HZsX=5sAZ2WgPB5P=8X#TI+NQ(M~GqyVB53c6IdX=k>Wu@A0Svf5#?uHaF zsYn|koIi3$(%GZ2+G+7Fv^lHTb#5b8sAHSTnL^qWZLM<(1|9|QFw9pnRU{svj}_Al zL)b9>fN{QiA($8peNEJyy`(a{&uh-T4_kdZFIVsKKVM(?05}76EEz?#W za^fiZOAd14IJ4zLX-n7Lq0qlQ^lW8Cvz4UKkV9~P}>sq0?xD3vg+$4vLm~C(+ zM{-3Z#qnZ09bJ>}j?6ry^h+@PfaD7*jZxBEY4)UG&daWb??6)TP+|3#Z&?GL?1i+280CFsE|vIXQbm| zM}Pk!U`U5NsNbyKzkrul-DzwB{X?n3E6?TUHr{M&+R*2%yOiXdW-_2Yd6?38M9Vy^ z*lE%gA{wwoSR~vN0=no}tP2Ul5Gk5M(Xq`$nw#ndFk`tcpd5A=Idue`XZ!FS>Q zG^0w#>P4pPG+*NC9gLP4x2m=cKP}YuS!l^?sHSFftZy{4CoQrb_ z^20(NnG`wAhMI=eq)SsIE~&Gp9Ne0nD4%Xiu|0Fj1UFk?6avDqjdXz{O1nKao*46y zT8~iA%Exu=G#{x=KD;_C&M+Zx4+n`sHT>^>=-1YM;H<72k>$py1?F3#T1*ef9mLZw z5naLQr?n7K;2l+{_uIw*_1nsTn~I|kkCgrn;|G~##hM;9l7Jy$yJfmk+&}W@JeKcF zx@@Woiz8qdi|D%aH3XTx5*wDlbs?dC1_nrFpm^QbG@wM=i2?Zg;$VK!c^Dp8<}BTI zyRhAq@#%2pGV49*Y5_mV4+OICP|%I(dQ7x=6Ob}>EjnB_-_18*xrY?b%-yEDT(wrO z9RY2QT0`_OpGfMObKHV;QLVnrK%mc?$WAdIT`kJQT^n%GuzE7|9@k3ci5fYOh(287 zuIbg!GB3xLg$YN=n)^pHGB0jH+_iIiC=nUcD;G6LuJsjn2VI1cyZx=a?ShCsF==QK z;q~*m&}L<-cb+mDDXzvvrRsybcgQ;Vg21P(uLv5I+eGc7o7tc6`;OA9{soHFOz zT~2?>Ts}gprIX$wRBb4yE>ot<8+*Bv`qbSDv*VtRi|cyWS>)Fjs>fkNOH-+PX&4(~ z&)T8Zam2L6puQl?;5zg9h<}k4#|yH9czHw;1jw-pwBM*O2hUR6yvHATrI%^mvs9q_ z&ccT0>f#eDG<^WG^q@oVqlJrhxH)dcq2cty@l3~|5#UDdExyXUmLQ}f4#;6fI{f^t zDCsgIJ~0`af%YR%Ma5VQq-p21k`vaBu6WE?66+5=XUd%Ay%D$irN>5LhluRWt7 zov-=f>QbMk*G##&DTQyou$s7UqjjW@k6=!I@!k+S{pP8R(2=e@io;N8E`EOB;OGoI zw6Q+{X1_I{OO0HPpBz!X!@`5YQ2)t{+!?M_iH25X(d~-Zx~cXnS9z>u?+If|iNJbx zyFU2d1!ITX64D|lE0Z{dLRqL1Ajj=CCMfC4lD3&mYR_R_VZ>_7_~|<^o*%_&jevU+ zQ4|qzci=0}Jydw|LXLCrOl1_P6Xf@c0$ieK2^7@A9UbF{@V_0p%lqW|L?5k>bVM8|p5v&2g;~r>B8uo<4N+`B zH{J)h;SYiIVx@#jI&p-v3dwL5QNV1oxPr8J%ooezTnLW>i*3Isb49%5i!&ac_dEXv zvXmVUck^QHmyrF8>CGXijC_R-y(Qr{3Zt~EmW)-nC!tiH`wlw5D*W7Pip;T?&j%kX z6DkZX4&}iw>hE(boLyjOoupf6JpvBG8}jIh!!VhnD0>}KSMMo{1#uU6kiFcA04~|7 zVO8eI&x1`g4CZ<2cYUI(n#wz2MtVFHx47yE5eL~8bot~>EHbevSt}LLMQX?odD{Ux zJMnam{d)W4da{l7&y-JrgiU~qY3$~}_F#G7|MxT)e;G{U`In&?`j<5D->}cb{}{T(4DF0BOk-=1195KB-E*o@c?`>y#4=dMtYtSY=&L{!TAjFVcq0y@AH`vH! z$41+u!Ld&}F^COPgL(EE{0X7LY&%D7-(?!kjFF7=qw<;`V{nwWBq<)1QiGJgUc^Vz ztMUlq1bZqKn17|6x6iAHbWc~l1HcmAxr%$Puv!znW)!JiukwIrqQ00|H$Z)OmGG@= zv%A8*4cq}(?qn4rN6o`$Y))(MyXr8R<2S^J+v(wmFmtac!%VOfN?&(8Nr!T@kV`N; z*Q33V3t`^rN&aBiHet)18wy{*wi1=W!B%B-Q6}SCrUl$~Hl{@!95ydml@FK8P=u4s z4e*7gV2s=YxEvskw2Ju!2%{8h01rx-3`NCPc(O zH&J0VH5etNB2KY6k4R@2Wvl^Ck$MoR3=)|SEclT2ccJ!RI9Nuter7u9@;sWf-%um;GfI!=eEIQ2l2p_YWUd{|6EG ze{yO6;lMc>;2tPrsNdi@&1K6(1;|$xe8vLgiouj%QD%gYk`4p{Ktv9|j+!OF-P?@p z;}SV|oIK)iwlBs+`ROXkhd&NK zzo__r!B>tOXpBJMDcv!Mq54P+n4(@dijL^EpO1wdg~q+!DT3lB<>9AANSe!T1XgC=J^)IP0XEZ()_vpu!!3HQyJhwh?r`Ae%Yr~b% zO*NY9t9#qWa@GCPYOF9aron7thfWT`eujS4`t2uG6)~JRTI;f(ZuoRQwjZjp5Pg34 z)rp$)Kr?R+KdJ;IO;pM{$6|2y=k_siqvp%)2||cHTe|b5Ht8&A{wazGNca zX$Ol?H)E_R@SDi~4{d-|8nGFhZPW;Cts1;08TwUvLLv&_2$O6Vt=M)X;g%HUr$&06 zISZb(6)Q3%?;3r~*3~USIg=HcJhFtHhIV(siOwV&QkQe#J%H9&E21!C*d@ln3E@J* zVqRO^<)V^ky-R|%{(9`l-(JXq9J)1r$`uQ8a}$vr9E^nNiI*thK8=&UZ0dsFN_eSl z(q~lnD?EymWLsNa3|1{CRPW60>DSkY9YQ;$4o3W7Ms&@&lv9eH!tk~N&dhqX&>K@} zi1g~GqglxkZ5pEFkllJ)Ta1I^c&Bt6#r(QLQ02yHTaJB~- zCcE=5tmi`UA>@P=1LBfBiqk)HB4t8D?02;9eXj~kVPwv?m{5&!&TFYhu>3=_ zsGmYZ^mo*-j69-42y&Jj0cBLLEulNRZ9vXE)8~mt9C#;tZs;=#M=1*hebkS;7(aGf zcs7zH(I8Eui9UU4L--))yy`&d&$In&VA2?DAEss4LAPCLd>-$i?lpXvn!gu^JJ$(DoUlc6wE98VLZ*z`QGQov5l4Fm_h?V-;mHLYDVOwKz7>e4+%AzeO>P6v}ndPW| zM>m#6Tnp7K?0mbK=>gV}=@k*0Mr_PVAgGMu$j+pWxzq4MAa&jpCDU&-5eH27Iz>m^ zax1?*HhG%pJ((tkR(V(O(L%7v7L%!_X->IjS3H5kuXQT2!ow(;%FDE>16&3r){!ex zhf==oJ!}YU89C9@mfDq!P3S4yx$aGB?rbtVH?sHpg?J5C->!_FHM%Hl3#D4eplxzQ zRA+<@LD%LKSkTk2NyWCg7u=$%F#;SIL44~S_OGR}JqX}X+=bc@swpiClB`Zbz|f!4 z7Ysah7OkR8liXfI`}IIwtEoL}(URrGe;IM8%{>b1SsqXh)~w}P>yiFRaE>}rEnNkT z!HXZUtxUp1NmFm)Dm@-{FI^aRQqpSkz}ZSyKR%Y}YHNzBk)ZIp} zMtS=aMvkgWKm9&oTcU0?S|L~CDqA+sHpOxwnswF-fEG)cXCzUR?ps@tZa$=O)=L+5 zf%m58cq8g_o}3?Bhh+c!w4(7AjxwQ3>WnVi<{{38g7yFboo>q|+7qs<$8CPXUFAN< zG&}BHbbyQ5n|qqSr?U~GY{@GJ{(Jny{bMaOG{|IkUj7tj^9pa9|FB_<+KHLxSxR;@ zHpS$4V)PP+tx}22fWx(Ku9y+}Ap;VZqD0AZW4gCDTPCG=zgJmF{|x;(rvdM|2|9a}cex6xrMkERnkE;}jvU-kmzd%_J50$M`lIPCKf+^*zL=@LW`1SaEc%=m zQ+lT06Gw+wVwvQ9fZ~#qd430v2HndFsBa9WjD0P}K(rZYdAt^5WQIvb%D^Q|pkVE^ zte$&#~zmULFACGfS#g=2OLOnIf2Of-k!(BIHjs77nr!5Q1*I9 z1%?=~#Oss!rV~?-6Gm~BWJiA4mJ5TY&iPm_$)H1_rTltuU1F3I(qTQ^U$S>%$l z)Wx1}R?ij0idp@8w-p!Oz{&*W;v*IA;JFHA9%nUvVDy7Q8woheC#|8QuDZb-L_5@R zOqHwrh|mVL9b=+$nJxM`3eE{O$sCt$UK^2@L$R(r^-_+z?lOo+me-VW=Zw z-Bn>$4ovfWd%SPY`ab-u9{INc*k2h+yH%toDHIyqQ zO68=u`N}RIIs7lsn1D){)~%>ByF<>i@qFb<-axvu(Z+6t7v<^z&gm9McRB~BIaDn$ z#xSGT!rzgad8o>~kyj#h1?7g96tOcCJniQ+*#=b7wPio>|6a1Z?_(TS{)KrPe}(8j z!#&A=k(&Pj^F;r)CI=Z{LVu>uj!_W1q4b`N1}E(i%;BWjbEcnD=mv$FL$l?zS6bW!{$7j1GR5ocn94P2u{ z70tAAcpqtQo<@cXw~@i-@6B23;317|l~S>CB?hR5qJ%J3EFgyBdJd^fHZu7AzHF(BQ!tyAz^L0`X z23S4Fe{2X$W0$zu9gm%rg~A>ijaE#GlYlrF9$ds^QtaszE#4M(OLVP2O-;XdT(XIC zatwzF*)1c+t~c{L=fMG8Z=k5lv>U0;C{caN1NItnuSMp)6G3mbahu>E#sj&oy94KC zpH}8oEw{G@N3pvHhp{^-YaZeH;K+T_1AUv;IKD<=mv^&Ueegrb!yf`4VlRl$M?wsl zZyFol(2|_QM`e_2lYSABpKR{{NlxlDSYQNkS;J66aT#MSiTx~;tUmvs-b*CrR4w=f z8+0;*th6kfZ3|5!Icx3RV11sp=?`0Jy3Fs0N4GZQMN=8HmT6%x9@{Dza)k}UwL6JT zHRDh;%!XwXr6yuuy`4;Xsn0zlR$k%r%9abS1;_v?`HX_hI|+EibVnlyE@3aL5vhQq zlIG?tN^w@0(v9M*&L+{_+RQZw=o|&BRPGB>e5=ys7H`nc8nx)|-g;s7mRc7hg{GJC zAe^vCIJhajmm7C6g! zL&!WAQ~5d_5)00?w_*|*H>3$loHrvFbitw#WvLB!JASO?#5Ig5$Ys10n>e4|3d;tS zELJ0|R4n3Az(Fl3-r^QiV_C;)lQ1_CW{5bKS15U|E9?ZgLec@%kXr84>5jV2a5v=w z?pB1GPdxD$IQL4)G||B_lI+A=08MUFFR4MxfGOu07vfIm+j=z9tp~5i_6jb`tR>qV z$#`=BQ*jpCjm$F0+F)L%xRlnS%#&gro6PiRfu^l!EVan|r3y}AHJQOORGx4~ z&<)3=K-tx518DZyp%|!EqpU!+X3Et7n2AaC5(AtrkW>_57i}$eqs$rupubg0a1+WO zGHZKLN2L0D;ab%{_S1Plm|hx8R?O14*w*f&2&bB050n!R2by zw!@XOQx$SqZ5I<(Qu$V6g>o#A!JVwErWv#(Pjx=KeS0@hxr4?13zj#oWwPS(7Ro|v z>Mp@Kmxo79q|}!5qtX2-O@U&&@6s~!I&)1WQIl?lTnh6UdKT_1R640S4~f=_xoN3- zI+O)$R@RjV$F=>Ti7BlnG1-cFKCC(t|Qjm{SalS~V-tX#+2ekRhwmN zZr`8{QF6y~Z!D|{=1*2D-JUa<(1Z=;!Ei!KiRNH?o{p5o3crFF=_pX9O-YyJchr$~ zRC`+G+8kx~fD2k*ZIiiIGR<8r&M@3H?%JVOfE>)})7ScOd&?OjgAGT@WVNSCZ8N(p zuQG~76GE3%(%h1*vUXg$vH{ua0b`sQ4f0*y=u~lgyb^!#CcPJa2mkSEHGLsnO^kb$ zru5_l#nu=Y{rSMWiYx?nO{8I!gH+?wEj~UM?IrG}E|bRIBUM>UlY<`T1EHpRr36vv zBi&dG8oxS|J$!zoaq{+JpJy+O^W(nt*|#g32bd&K^w-t>!Vu9N!k9eA8r!Xc{utY> zg9aZ(D2E0gL#W0MdjwES-7~Wa8iubPrd?8-$C4BP?*wok&O8+ykOx{P=Izx+G~hM8 z*9?BYz!T8~dzcZr#ux8kS7u7r@A#DogBH8km8Ry4slyie^n|GrTbO|cLhpqgMdsjX zJ_LdmM#I&4LqqsOUIXK8gW;V0B(7^$y#h3h>J0k^WJfAMeYek%Y-Dcb_+0zPJez!GM zAmJ1u;*rK=FNM0Nf}Y!!P9c4)HIkMnq^b;JFd!S3?_Qi2G#LIQ)TF|iHl~WKK6JmK zbv7rPE6VkYr_%_BT}CK8h=?%pk@3cz(UrZ{@h40%XgThP*-Oeo`T0eq9 zA8BnWZKzCy5e&&_GEsU4*;_k}(8l_&al5K-V*BFM=O~;MgRkYsOs%9eOY6s6AtE*<7GQAR2ulC3RAJrG_P1iQK5Z~&B z&f8X<>yJV6)oDGIlS$Y*D^Rj(cszTy5c81a5IwBr`BtnC6_e`ArI8CaTX_%rx7;cn zR-0?J_LFg*?(#n~G8cXut(1nVF0Oka$A$1FGcERU<^ggx;p@CZc?3UB41RY+wLS`LWFNSs~YP zuw1@DNN3lTd|jDL7gjBsd9}wIw}4xT2+8dBQzI00m<@?c2L%>}QLfK5%r!a-iII`p zX@`VEUH)uj^$;7jVUYdADQ2k*!1O3WdfgF?OMtUXNpQ1}QINamBTKDuv19^{$`8A1 zeq%q*O0mi@(%sZU>Xdb0Ru96CFqk9-L3pzLVsMQ`Xpa~N6CR{9Rm2)A|CI21L(%GW zh&)Y$BNHa=FD+=mBw3{qTgw)j0b!Eahs!rZnpu)z!!E$*eXE~##yaXz`KE5(nQM`s zD!$vW9XH)iMxu9R>r$VlLk9oIR%HxpUiW=BK@4U)|1WNQ=mz9a z^!KkO=>GaJ!GBXm{KJj^;kh-MkUlEQ%lza`-G&}C5y1>La1sR6hT=d*NeCnuK%_LV zOXt$}iP6(YJKc9j-Fxq~*ItVUqljQ8?oaysB-EYtFQp9oxZ|5m0^Hq(qV!S+hq#g( z?|i*H2MIr^Kxgz+3vIljQ*Feejy6S4v~jKEPTF~Qhq!(ms5>NGtRgO5vfPPc4Z^AM zTj!`5xEreIN)vaNxa|q6qWdg>+T`Ol0Uz)ckXBXEGvPNEL3R8hB3=C5`@=SYgAju1 z!)UBr{2~=~xa{b8>x2@C7weRAEuatC)3pkRhT#pMPTpSbA|tan%U7NGMvzmF?c!V8 z=pEWxbdXbTAGtWTyI?Fml%lEr-^AE}w#l(<7OIw;ctw}imYax&vR4UYNJZK6P7ZOd zP87XfhnUHxCUHhM@b*NbTi#(-8|wcv%3BGNs#zRCVV(W?1Qj6^PPQa<{yaBwZ`+<`w|;rqUY_C z&AeyKwwf*q#OW-F()lir=T^<^wjK65Lif$puuU5+tk$;e_EJ;Lu+pH>=-8=PDhkBg z8cWt%@$Sc#C6F$Vd+0507;{OOyT7Hs%nKS88q-W!$f~9*WGBpHGgNp}=C*7!RiZ5s zn1L_DbKF@B8kwhDiLKRB@lsXVVLK|ph=w%_`#owlf@s@V(pa`GY$8h%;-#h@TsO|Y8V=n@*!Rog7<7Cid%apR|x zOjhHCyfbIt%+*PCveTEcuiDi%Wx;O;+K=W?OFUV%)%~6;gl?<0%)?snDDqIvkHF{ zyI02)+lI9ov42^hL>ZRrh*HhjF9B$A@=H94iaBESBF=eC_KT$8A@uB^6$~o?3Wm5t1OIaqF^~><2?4e3c&)@wKn9bD? zoeCs;H>b8DL^F&>Xw-xjZEUFFTv>JD^O#1E#)CMBaG4DX9bD(Wtc8Rzq}9soQ8`jf zeSnHOL}<+WVSKp4kkq&?SbETjq6yr@4%SAqOG=9E(3YeLG9dtV+8vmzq+6PFPk{L; z(&d++iu=^F%b+ea$i2UeTC{R*0Isk;vFK!no<;L+(`y`3&H-~VTdKROkdyowo1iqR zbVW(3`+(PQ2>TKY>N!jGmGo7oeoB8O|P_!Ic@ zZ^;3dnuXo;WJ?S+)%P>{Hcg!Jz#2SI(s&dY4QAy_vRlmOh)QHvs_7c&zkJCmJGVvV zX;Mtb>QE+xp`KyciG$Cn*0?AK%-a|=o!+7x&&yzHQOS>8=B*R=niSnta^Pxp1`=md z#;$pS$4WCT?mbiCYU?FcHGZ#)kHVJTTBt^%XE(Q};aaO=Zik0UgLcc0I(tUpt(>|& zcxB_|fxCF7>&~5eJ=Dpn&5Aj{A^cV^^}(7w#p;HG&Q)EaN~~EqrE1qKrMAc&WXIE;>@<&)5;gD2?={Xf@Mvn@OJKw=8Mgn z!JUFMwD+s==JpjhroT&d{$kQAy%+d`a*XxDEVxy3`NHzmITrE`o!;5ClXNPb4t*8P zzAivdr{j_v!=9!^?T3y?gzmqDWX6mkzhIzJ-3S{T5bcCFMr&RPDryMcdwbBuZbsgN zGrp@^i?rcfN7v0NKGzDPGE#4yszxu=I_`MI%Z|10nFjU-UjQXXA?k8Pk|OE<(?ae) zE%vG#eZAlj*E7_3dx#Zz4kMLj>H^;}33UAankJiDy5ZvEhrjr`!9eMD8COp}U*hP+ zF}KIYx@pkccIgyxFm#LNw~G&`;o&5)2`5aogs`1~7cMZQ7zj!%L4E`2yzlQN6REX20&O<9 zKV6fyr)TScJPPzNTC2gL+0x#=u>(({{D7j)c-%tvqls3#Y?Z1m zV5WUE)zdJ{$p>yX;^P!UcXP?UD~YM;IRa#Rs5~l+*$&nO(;Ers`G=0D!twR(0GF@c zHl9E5DQI}Oz74n zfKP>&$q0($T4y$6w(p=ERAFh+>n%iaeRA%!T%<^+pg?M)@ucY<&59$x9M#n+V&>}=nO9wCV{O~lg&v#+jcUj(tQ z`0u1YH)-`U$15a{pBkGyPL0THv1P|4e@pf@3IBZS4dVJPo#H>pWq%Lr0YS-SeWash z8R7=jb28KPMI|_lo#GEO|5B?N_e``H*23{~a!AmUJ+fb4HX-%QI@lSEUxKlGV7z7Q zSKw@-TR>@1RL%w{x}dW#k1NgW+q4yt2Xf1J62Bx*O^WG8OJ|FqI4&@d3_o8Id@*)4 zYrk=>@!wv~mh7YWv*bZhxqSmFh2Xq)o=m;%n$I?GSz49l1$xRpPu_^N(vZ>*>Z<04 z2+rP70oM=NDysd!@fQdM2OcyT?3T^Eb@lIC-UG=Bw{BjQ&P`KCv$AcJ;?`vdZ4){d z&gkoUK{$!$$K`3*O-jyM1~p-7T*qb)Ys>Myt^;#1&a%O@x8A+E>! zY8=eD`ZG)LVagDLBeHg>=atOG?Kr%h4B%E6m@J^C+U|y)XX@f z8oyJDW|9g=<#f<{JRr{y#~euMnv)`7j=%cHWLc}ngjq~7k**6%4u>Px&W%4D94(r* z+akunK}O0DC2A%Xo9jyF;DobX?!1I(7%}@7F>i%&nk*LMO)bMGg2N+1iqtg+r(70q zF5{Msgsm5GS7DT`kBsjMvOrkx&|EU!{{~gL4d2MWrAT=KBQ-^zQCUq{5PD1orxlIL zq;CvlWx#f1NWvh`hg011I%?T_s!e38l*lWVt|~z-PO4~~1g)SrJ|>*tXh=QfXT)%( z+ex+inPvD&O4Ur;JGz>$sUOnWdpSLcm1X%aQDw4{dB!cnj`^muI$CJ2%p&-kULVCE z>$eMR36kN$wCPR+OFDM3-U(VOrp9k3)lI&YVFqd;Kpz~K)@Fa&FRw}L(SoD z9B4a+hQzZT-BnVltst&=kq6Y(f^S4hIGNKYBgMxGJ^;2yrO}P3;r)(-I-CZ)26Y6? z&rzHI_1GCvGkgy-t1E;r^3Le30|%$ebDRu2+gdLG)r=A~Qz`}~&L@aGJ{}vVs_GE* zVUjFnzHiXfKQbpv&bR&}l2bzIjAooB)=-XNcYmrGmBh(&iu@o!^hn0^#}m2yZZUK8 zufVm7Gq0y`Mj;9b>`c?&PZkU0j4>IL=UL&-Lp3j&47B5pAW4JceG{!XCA)kT<%2nqCxj<)uy6XR_uws~>_MEKPOpAQ!H zkn>FKh)<9DwwS*|Y(q?$^N!6(51O0 z^JM~Ax{AI1Oj$fs-S5d4T7Z_i1?{%0SsIuQ&r8#(JA=2iLcTN+?>wOL532%&dMYkT z*T5xepC+V6zxhS@vNbMoi|i)=rpli@R9~P!39tWbSSb904ekv7D#quKbgFEMTb48P zuq(VJ+&L8aWU(_FCD$3^uD!YM%O^K(dvy~Wm2hUuh6bD|#(I39Xt>N1Y{ZqXL`Fg6 zKQ?T2htHN!(Bx;tV2bfTtIj7e)liN-29s1kew>v(D^@)#v;}C4-G=7x#;-dM4yRWm zyY`cS21ulzMK{PoaQ6xChEZ}o_#}X-o}<&0)$1#3we?+QeLt;aVCjeA)hn!}UaKt< zat1fHEx13y-rXNMvpUUmCVzocPmN~-Y4(YJvQ#db)4|%B!rBsgAe+*yor~}FrNH08 z3V!97S}D7d$zbSD{$z;@IYMxM6aHdypIuS*pr_U6;#Y!_?0i|&yU*@16l z*dcMqDQgfNBf}?quiu4e>H)yTVfsp#f+Du0@=Kc41QockXkCkvu>FBd6Q+@FL!(Yx z2`YuX#eMEiLEDhp+9uFqME_E^faV&~9qjBHJkIp~%$x^bN=N)K@kvSVEMdDuzA0sn z88CBG?`RX1@#hQNd`o^V{37)!w|nA)QfiYBE^m=yQKv-fQF+UCMcuEe1d4BH7$?>b zJl-r9@0^Ie=)guO1vOd=i$_4sz>y3x^R7n4ED!5oXL3@5**h(xr%Hv)_gILarO46q+MaDOF%ChaymKoI6JU5Pg;7#2n9-18|S1;AK+ zgsn6;k6-%!QD>D?cFy}8F;r@z8H9xN1jsOBw2vQONVqBVEbkiNUqgw~*!^##ht>w0 zUOykwH=$LwX2j&nLy=@{hr)2O&-wm-NyjW7n~Zs9UlH;P7iP3 zI}S(r0YFVYacnKH(+{*)Tbw)@;6>%=&Th=+Z6NHo_tR|JCI8TJiXv2N7ei7M^Q+RM z?9o`meH$5Yi;@9XaNR#jIK^&{N|DYNNbtdb)XW1Lv2k{E>;?F`#Pq|&_;gm~&~Zc9 zf+6ZE%{x4|{YdtE?a^gKyzr}dA>OxQv+pq|@IXL%WS0CiX!V zm$fCePA%lU{%pTKD7|5NJHeXg=I0jL@$tOF@K*MI$)f?om)D63K*M|r`gb9edD1~Y zc|w7N)Y%do7=0{RC|AziW7#am$)9jciRJ?IWl9PE{G3U+$%FcyKs_0Cgq`=K3@ttV z9g;M!3z~f_?P%y3-ph%vBMeS@p7P&Ea8M@97+%XEj*(1E6vHj==d zjsoviB>j^$_^OI_DEPvFkVo(BGRo%cJeD){6Uckei=~1}>sp299|IRjhXe)%?uP0I zF5+>?0#Ye}T^Y$u_rc4=lPcq4K^D(TZG-w30-YiEM=dcK+4#o*>lJ8&JLi+3UcpZk z!^?95S^C0ja^jwP`|{<+3cBVog$(mRdQmadS+Vh~z zS@|P}=|z3P6uS+&@QsMp0no9Od&27O&14zHXGAOEy zh~OKpymK5C%;LLb467@KgIiVwYbYd6wFxI{0-~MOGfTq$nBTB!{SrWmL9Hs}C&l&l#m?s*{tA?BHS4mVKHAVMqm63H<|c5n0~k)-kbg zXidai&9ZUy0~WFYYKT;oe~rytRk?)r8bptITsWj(@HLI;@=v5|XUnSls7$uaxFRL+ zRVMGuL3w}NbV1`^=Pw*0?>bm8+xfeY(1PikW*PB>>Tq(FR`91N0c2&>lL2sZo5=VD zQY{>7dh_TX98L2)n{2OV=T10~*YzX27i2Q7W86M4$?gZIXZaBq#sA*{PH8){|GUi;oM>e?ua7eF4WFuFYZSG| zze?srg|5Ti8Og{O zeFxuw9!U+zhyk?@w zjsA6(oKD=Ka;A>Ca)oPORxK+kxH#O@zhC!!XS4@=swnuMk>t+JmLmFiE^1aX3f<)D@`%K0FGK^gg1a1j>zi z2KhV>sjU7AX3F$SEqrXSC}fRx64GDoc%!u2Yag68Lw@w9v;xOONf@o)Lc|Uh3<21ctTYu-mFZuHk*+R{GjXHIGq3p)tFtQp%TYqD=j1&y)>@zxoxUJ!G@ zgI0XKmP6MNzw>nRxK$-Gbzs}dyfFzt>#5;f6oR27ql!%+{tr+(`(>%51|k`ML} zY4eE)Lxq|JMas(;JibNQds1bUB&r}ydMQXBY4x(^&fY_&LlQC)3hylc$~8&~|06-D z#T+%66rYbHX%^KuqJED_wuGB+=h`nWA!>1n0)3wZrBG3%`b^Ozv6__dNa@%V14|!D zQ?o$z5u0^8`giv%qE!BzZ!3j;BlDlJDk)h@9{nSQeEk!z9RGW) z${RSF3phEM*ce*>Xdp}585vj$|40=&S{S-GTiE?Op*vY&Lvr9}BO$XWy80IF+6@%n z5*2ueT_g@ofP#u5pxb7n*fv^Xtt7&?SRc{*2Ka-*!BuOpf}neHGCiHy$@Ka1^Dint z;DkmIL$-e)rj4o2WQV%Gy;Xg(_Bh#qeOsTM2f@KEe~4kJ8kNLQ+;(!j^bgJMcNhvklP5Z6I+9Fq@c&D~8Fb-4rmDT!MB5QC{Dsb;BharP*O;SF4& zc$wj-7Oep7#$WZN!1nznc@Vb<_Dn%ga-O#J(l=OGB`dy=Sy&$(5-n3zzu%d7E#^8`T@}V+5B;PP8J14#4cCPw-SQTdGa2gWL0*zKM z#DfSXs_iWOMt)0*+Y>Lkd=LlyoHjublNLefhKBv@JoC>P7N1_#> zv=mLWe96%EY;!ZGSQDbZWb#;tzqAGgx~uk+-$+2_8U`!ypbwXl z^2E-FkM1?lY@yt8=J3%QK+xaZ6ok=-y%=KXCD^0r!5vUneW>95PzCkOPO*t}p$;-> ze5j-BLT_;)cZQzR2CEsm@rU7GZfFtdp*a|g4wDr%8?2QkIGasRfDWT-Dvy*U{?IHT z*}wGnzdlSptl#ZF^sf)KT|BJs&kLG91^A6ls{CzFprZ6-Y!V0Xysh%9p%iMd7HLsS zN+^Un$tDV)T@i!v?3o0Fsx2qI(AX_$dDkBzQ@fRM%n zRXk6hb9Py#JXUs+7)w@eo;g%QQ95Yq!K_d=z{0dGS+pToEI6=Bo8+{k$7&Z zo4>PH(`ce8E-Ps&uv`NQ;U$%t;w~|@E3WVOCi~R4oj5wP?%<*1C%}Jq%a^q~T7u>K zML5AKfQDv6>PuT`{SrKHRAF+^&edg6+5R_#H?Lz3iGoWo#PCEd0DS;)2U({{X#zU^ zw_xv{4x7|t!S)>44J;KfA|DC?;uQ($l+5Vp7oeqf7{GBF9356nx|&B~gs+@N^gSdd zvb*>&W)|u#F{Z_b`f#GVtQ`pYv3#||N{xj1NgB<#=Odt6{eB%#9RLt5v zIi|0u70`#ai}9fJjKv7dE!9ZrOIX!3{$z_K5FBd-Kp-&e4(J$LD-)NMTp^_pB`RT; zftVVlK2g@+1Ahv2$D){@Y#cL#dUj9*&%#6 zd2m9{1NYp>)6=oAvqdCn5#cx{AJ%S8skUgMglu2*IAtd+z1>B&`MuEAS(D(<6X#Lj z?f4CFx$)M&$=7*>9v1ER4b6!SIz-m0e{o0BfkySREchp?WdVPpQCh!q$t>?rL!&Jg zd#heM;&~A}VEm8Dvy&P|J*eAV&w!&Nx6HFV&B8jJFVTmgLaswn!cx$&%JbTsloz!3 zMEz1d`k==`Ueub_JAy_&`!ogbwx27^ZXgFNAbx=g_I~5nO^r)}&myw~+yY*cJl4$I znNJ32M&K=0(2Dj_>@39`3=FX!v3nZHno_@q^!y}%(yw0PqOo=);6Y@&ylVe>nMOZ~ zd>j#QQSBn3oaWd;qy$&5(5H$Ayi)0haAYO6TH>FR?rhqHmNOO+(})NB zLI@B@v0)eq!ug`>G<@htRlp3n!EpU|n+G+AvXFrWSUsLMBfL*ZB`CRsIVHNTR&b?K zxBgsN0BjfB>UVcJ|x%=-zb%OV7lmZc& zxiupadZVF7)6QuhoY;;FK2b*qL0J-Rn-8!X4ZY$-ZSUXV5DFd7`T41c(#lAeLMoeT z4%g655v@7AqT!i@)Edt5JMbN(=Q-6{=L4iG8RA%}w;&pKmtWvI4?G9pVRp|RTw`g0 zD5c12B&A2&P6Ng~8WM2eIW=wxd?r7A*N+&!Be7PX3s|7~z=APxm=A?5 zt>xB4WG|*Td@VX{Rs)PV0|yK`oI3^xn(4c_j&vgxk_Y3o(-`_5o`V zRTghg6%l@(qodXN;dB#+OKJEEvhfcnc#BeO2|E(5df-!fKDZ!%9!^BJ_4)9P+9Dq5 zK1=(v?KmIp34r?z{NEWnLB3Px{XYwy-akun4F7xTRr2^zeYW{gcK9)>aJDdU5;w5@ zak=<+-PLH-|04pelTb%ULpuuuJC7DgyT@D|p{!V!0v3KpDnRjANN12q6SUR3mb9<- z>2r~IApQGhstZ!3*?5V z8#)hJ0TdZg0M-BK#nGFP>$i=qk82DO z7h;Ft!D5E15OgW)&%lej*?^1~2=*Z5$2VX>V{x8SC+{i10BbtUk9@I#Vi&hX)q
Q!LwySI{Bnv%Sm)yh{^sSVJ8&h_D-BJ_YZe5eCaAWU9b$O2c z$T|{vWVRtOL!xC0DTc(Qbe`ItNtt5hr<)VijD0{U;T#bUEp381_y`%ZIav?kuYG{iyYdEBPW=*xNSc;Rlt6~F4M`5G+VtOjc z*0qGzCb@gME5udTjJA-9O<&TWd~}ysBd(eVT1-H82-doyH9RST)|+Pb{o*;$j9Tjs zhU!IlsPsj8=(x3bAKJTopW3^6AKROHR^7wZ185wJGVhA~hEc|LP;k7NEz-@4p5o}F z`AD6naG3(n=NF9HTH81=F+Q|JOz$7wm9I<+#BSmB@o_cLt2GkW9|?7mM;r!JZp89l zbo!Hp8=n!XH1{GwaDU+k)pGp`C|cXkCU5%vcH)+v@0eK>%7gWxmuMu9YLlChA|_D@ zi#5zovN_!a-0?~pUV-Rj*1P)KwdU-LguR>YM&*Nen+ln8Q$?WFCJg%DY%K}2!!1FE zDv-A%Cbwo^p(lzac&_TZ-l#9kq`mhLcY3h9ZTUVCM(Ad&=EriQY5{jJv<5K&g|*Lk zgV%ILnf1%8V2B0E&;Sp4sYbYOvvMebLwYwzkRQ#F8GpTQq#uv=J`uaSJ34OWITeSGo6+-8Xw znCk*n{kdDEi)Hi&u^)~cs@iyCkFWB2SWZU|Uc%^43ZIZQ-vWNExCCtDWjqHs;;tWf$v{}0{p0Rvxkq``)*>+Akq%|Na zA`@~-Vfe|+(AIlqru+7Ceh4nsVmO9p9jc8}HX^W&ViBDXT+uXbT#R#idPn&L>+#b6 zflC-4C5-X;kUnR~L>PSLh*gvL68}RBsu#2l`s_9KjUWRhiqF`j)`y`2`YU(>3bdBj z?>iyjEhe-~$^I5!nn%B6Wh+I`FvLNvauve~eX<+Ipl&04 zT}};W&1a3%W?dJ2=N#0t?e+aK+%t}5q%jSLvp3jZ%?&F}nOOWr>+{GFIa%wO_2`et z=JzoRR~}iKuuR+azPI8;Gf9)z3kyA4EIOSl!sRR$DlW}0>&?GbgPojmjmnln;cTqCt=ADbE zZ8GAnoM+S1(5$i8^O4t`ue;vO4i}z0wz-QEIVe5_u03;}-!G1NyY8;h^}y;tzY}i5 zqQr#Ur3Fy8sSa$Q0ys+f`!`+>9WbvU_I`Sj;$4{S>O3?#inLHCrtLy~!s#WXV=oVP zeE93*Nc`PBi4q@%Ao$x4lw9vLHM!6mn3-b_cebF|n-2vt-zYVF_&sDE--J-P;2WHo z+@n2areE0o$LjvjlV2X7ZU@j+`{*8zq`JR3gKF#EW|#+{nMyo-a>nFFTg&vhyT=b} zDa8+v0(Dgx0yRL@ZXOYIlVSZ0|MFizy0VPW8;AfA5|pe!#j zX}Py^8fl5SyS4g1WSKKtnyP+_PoOwMMwu`(i@Z)diJp~U54*-miOchy7Z35eL>^M z4p<-aIxH4VUZgS783@H%M7P9hX>t{|RU7$n4T(brCG#h9e9p! z+o`i;EGGq3&pF;~5V~eBD}lC)>if$w%Vf}AFxGqO88|ApfHf&Bvu+xdG)@vuF}Yvk z)o;~k-%+0K0g+L`Wala!$=ZV|z$e%>f0%XoLib%)!R^RoS+{!#X?h-6uu zF&&KxORdZU&EwQFITIRLo(7TA3W}y6X{?Y%y2j0It!ekU#<)$qghZtpcS>L3uh`Uj z7GY;6f$9qKynP#oS3$$a{p^{D+0oJQ71`1?OAn_m8)UGZmj3l*ZI)`V-a>MKGGFG< z&^jg#Ok%(hhm>hSrZ5;Qga4u(?^i>GiW_j9%_7M>j(^|Om$#{k+^*ULnEgzW_1gCICtAD^WpC`A z{9&DXkG#01Xo)U$OC(L5Y$DQ|Q4C6CjUKk1UkPj$nXH##J{c8e#K|&{mA*;b$r0E4 zUNo0jthwA(c&N1l=PEe8Rw_8cEl|-eya9z&H3#n`B$t#+aJ03RFMzrV@gowbe8v(c zIFM60^0&lCFO10NU4w@|61xiZ4CVXeaKjd;d?sv52XM*lS8XiVjgWpRB;&U_C0g+`6B5V&w|O6B*_q zsATxL!M}+$He)1eOWECce#eS@2n^xhlB4<_Nn?yCVEQWDs(r`|@2GqLe<#(|&P0U? z$7V5IgpWf09uIf_RazRwC?qEqRaHyL?iiS05UiGesJy%^>-C{{ypTBI&B0-iUYhk> zIk<5xpsuV@g|z(AZD+C-;A!fTG=df1=<%nxy(a(IS+U{ME4ZbDEBtcD_3V=icT6*_ z)>|J?>&6%nvHhZERBtjK+s4xnut*@>GAmA5m*OTp$!^CHTr}vM4n(X1Q*;{e-Rd2BCF-u@1ZGm z!S8hJ6L=Gl4T_SDa7Xx|-{4mxveJg=ctf`BJ*fy!yF6Dz&?w(Q_6B}WQVtNI!BVBC zKfX<>7vd6C96}XAQmF-Jd?1Q4eTfRB3q7hCh0f!(JkdWT5<{iAE#dKy*Jxq&3a1@~ z8C||Dn2mFNyrUV|<-)C^_y7@8c2Fz+2jrae9deBDu;U}tJ{^xAdxCD248(k;dCJ%o z`y3sADe>U%suxwwv~8A1+R$VB=Q?%U?4joI$um;aH+eCrBqpn- z%79D_7rb;R-;-9RTrwi9dPlg8&@tfWhhZ(Vx&1PQ+6(huX`;M9x~LrW~~#3{j0Bh2kDU$}@!fFQej4VGkJv?M4rU^x!RU zEwhu$!CA_iDjFjrJa`aocySDX16?~;+wgav;}Zut6Mg%C4>}8FL?8)Kgwc(Qlj{@#2Pt0?G`$h7P#M+qoXtlV@d}%c&OzO+QYKK`kyXaK{U(O^2DyIXCZlNQjt0^8~8JzNGrIxhj}}M z&~QZlbx%t;MJ(Vux;2tgNKGlAqphLq%pd}JG9uoVHUo?|hN{pLQ6Em%r*+7t^<);X zm~6=qChlNAVXNN*Sow->*4;}T;l;D1I-5T{Bif@4_}=>l`tK;qqDdt5zvisCKhMAH z#r}`)7VW?LZqfdmXQ%zo5bJ00{Xb9^YKrk0Nf|oIW*K@(=`o2Vndz}ZDyk{!u}PVx zzd--+_WC*U{~DH3{?GI64IB+@On&@9X>EUAo&L+G{L^dozaI4C3G#2wr~hseW@K&g zKWs{uHu-9Je!3;4pE>eBltKUXb^*hG8I&413)$J&{D4N%7PcloU6bn%jPxJyQL?g* z9g+YFFEDiE`8rW^laCNzQmi7CTnPfwyg3VDHRAl>h=In6jeaVOP@!-CP60j3+#vpL zEYmh_oP0{-gTe7Or`L6x)6w?77QVi~jD8lWN@3RHcm80iV%M1A!+Y6iHM)05iC64tb$X2lV_%Txk@0l^hZqi^%Z?#- zE;LE0uFx)R08_S-#(wC=dS&}vj6P4>5ZWjhthP=*Hht&TdLtKDR;rXEX4*z0h74FA zMCINqrh3Vq;s%3MC1YL`{WjIAPkVL#3rj^9Pj9Ss7>7duy!9H0vYF%>1jh)EPqvlr6h%R%CxDsk| z!BACz7E%j?bm=pH6Eaw{+suniuY7C9Ut~1cWfOX9KW9=H><&kQlinPV3h9R>3nJvK z4L9(DRM=x;R&d#a@oFY7mB|m8h4692U5eYfcw|QKwqRsshN(q^v$4$)HgPpAJDJ`I zkqjq(8Cd!K!+wCd=d@w%~e$=gdUgD&wj$LQ1r>-E=O@c ze+Z$x{>6(JA-fNVr)X;*)40Eym1TtUZI1Pwwx1hUi+G1Jlk~vCYeXMNYtr)1?qwyg zsX_e*$h?380O00ou?0R@7-Fc59o$UvyVs4cUbujHUA>sH!}L54>`e` zHUx#Q+Hn&Og#YVOuo*niy*GU3rH;%f``nk#NN5-xrZ34NeH$l`4@t);4(+0|Z#I>Y z)~Kzs#exIAaf--65L0UHT_SvV8O2WYeD>Mq^Y6L!Xu8%vnpofG@w!}R7M28?i1*T&zp3X4^OMCY6(Dg<-! zXmcGQrRgHXGYre7GfTJ)rhl|rs%abKT_Nt24_Q``XH{88NVPW+`x4ZdrMuO0iZ0g` z%p}y};~T5gbb9SeL8BSc`SO#ixC$@QhXxZ=B}L`tP}&k?1oSPS=4%{UOHe0<_XWln zwbl5cn(j-qK`)vGHY5B5C|QZd5)W7c@{bNVXqJ!!n$^ufc?N9C-BF2QK1(kv++h!>$QbAjq)_b$$PcJdV+F7hz0Hu@ zqj+}m0qn{t^tD3DfBb~0B36|Q`bs*xs|$i^G4uNUEBl4g;op-;Wl~iThgga?+dL7s zUP(8lMO?g{GcYpDS{NM!UA8Hco?#}eNEioRBHy4`mq!Pd-9@-97|k$hpEX>xoX+dY zDr$wfm^P&}Wu{!%?)U_(%Mn79$(ywvu*kJ9r4u|MyYLI_67U7%6Gd_vb##Nerf@>& z8W11z$$~xEZt$dPG}+*IZky+os5Ju2eRi;1=rUEeIn>t-AzC_IGM-IXWK3^6QNU+2pe=MBn4I*R@A%-iLDCOHTE-O^wo$sL_h{dcPl=^muAQb`_BRm};=cy{qSkui;`WSsj9%c^+bIDQ z0`_?KX0<-=o!t{u(Ln)v>%VGL z0pC=GB7*AQ?N7N{ut*a%MH-tdtNmNC+Yf$|KS)BW(gQJ*z$d{+{j?(e&hgTy^2|AR9vx1Xre2fagGv0YXWqtNkg*v%40v?BJBt|f9wX5 z{QTlCM}b-0{mV?IG>TW_BdviUKhtosrBqdfq&Frdz>cF~yK{P@(w{Vr7z2qKFwLhc zQuogKO@~YwyS9%+d-zD7mJG~@?EFJLSn!a&mhE5$_4xBl&6QHMzL?CdzEnC~C3$X@ zvY!{_GR06ep5;<#cKCSJ%srxX=+pn?ywDwtJ2{TV;0DKBO2t++B(tIO4)Wh`rD13P z4fE$#%zkd=UzOB74gi=-*CuID&Z3zI^-`4U^S?dHxK8fP*;fE|a(KYMgMUo`THIS1f!*6dOI2 zFjC3O=-AL`6=9pp;`CYPTdVX z8(*?V&%QoipuH0>WKlL8A*zTKckD!paN@~hh zmXzm~qZhMGVdQGd=AG8&20HW0RGV8X{$9LldFZYm zE?}`Q3i?xJRz43S?VFMmqRyvWaS#(~Lempg9nTM$EFDP(Gzx#$r)W&lpFKqcAoJh-AxEw$-bjW>`_+gEi z2w`99#UbFZGiQjS8kj~@PGqpsPX`T{YOj`CaEqTFag;$jY z8_{Wzz>HXx&G*Dx<5skhpETxIdhKH?DtY@b9l8$l?UkM#J-Snmts7bd7xayKTFJ(u zyAT&@6cAYcs{PBfpqZa%sxhJ5nSZBPji?Zlf&}#L?t)vC4X5VLp%~fz2Sx<*oN<7` z?ge=k<=X7r<~F7Tvp9#HB{!mA!QWBOf%EiSJ6KIF8QZNjg&x~-%e*tflL(ji_S^sO ztmib1rp09uon}RcsFi#k)oLs@$?vs(i>5k3YN%$T(5Or(TZ5JW9mA6mIMD08=749$ z!d+l*iu{Il7^Yu}H;lgw=En1sJpCKPSqTCHy4(f&NPelr31^*l%KHq^QE>z>Ks_bH zjbD?({~8Din7IvZeJ>8Ey=e;I?thpzD=zE5UHeO|neioJwG;IyLk?xOz(yO&0DTU~ z^#)xcs|s>Flgmp;SmYJ4g(|HMu3v7#;c*Aa8iF#UZo7CvDq4>8#qLJ|YdZ!AsH%^_7N1IQjCro

K7UpUK$>l@ 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 E2O(~oYXATM literal 0 HcmV?d00001 diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..442d913 --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/android/gradlew b/android/gradlew new file mode 100644 index 0000000..4f906e0 --- /dev/null +++ b/android/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/android/gradlew.bat b/android/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/android/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/android/res/drawable-hdpi/icon.png b/android/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..22385a62b10d1ba123f712774f28ef226c1a5aa3 GIT binary patch literal 2385 zcmaKu=Ofz*0ET}=&7g=z&Ds=4N=1ngo1)fHt4N(uqctkEca7F6v0_$Rt4LL%Rzq8L z6|0mQHBy{A61%qK+&^$1-uLYbz5@c0qOk065J|4Qf$-b zeg+2Cp|&Ra03d+5>*0YI0+=kgz~J@>X(Qx@6+2I^4LjKM3atHIJOkXr%i}Pd)9{*# z>m;Y5=SqL|C80${MrYO+y1*M#&7z?{8BwyxDc&pL5oSoXoJJ5z779t2(u1mQK~k7* zfTnfy2>P15T5RcM&zwuaUaP?LHY;&u#K!}7_@So8;Wo9OGfWfX` zFQVfa{9!7UW?ui#-AW)=OrFNPFJ|YEhK6 zougn6aam@$ij9eptvUIko*wj~xC2j}q=dC$r$7Gi_WGn7KFr?*??Ba1E8=n)xhDC^j!fb?*yZ^%P-c#6L|x-_JCVLqwi&&8y78s` zp!{ZUurN)miZ;*p$SDUk$t>?3`2UdXRiW_H1K>O`;buj7+E#aFRWE}?t{mc8)7$%7 zH&Xk-AQxJP=5+=7jrH5t?!fw}YtlB&CZD>FSbbvmj~Ln!jvtIvTR6%?4=KylskdI# z_;~XXV)xpTH;0!kThw&8LdLSUHD33T92A^?f3?^?PB+(l=3QJGy}UTtojRC!)?IQE zNcBbz`ljU{F{b=n(`EUnLb6qT$witBygUL{x@-Xch~snLH1ORkGfU-^?00}K)OSn- zOiN$;gjMDgEsrF=F{T7;!ewUy_A`H{<2@e`f~J`)`eQ)}Q#*3S^dGkq9|x;+2o%t$ z;>j75lhrTVjtiJ~kImbt!fHBo3EiF1xi$9ekYkaD3tNLRE^x)$gpHpEUjS=*nYPP`uiDbnSf~DiEJ5Eh$d2kQ3GbrvX_Ml!K%Cd3BwAiM>QnK-XP!((qvETb0Rl zQqhNpxRq-&6M+RUH3*2FV|)i&CSBmCnZiADqE2w+Y`K(s?zmhT3~VQl<=ELZSMaZJ z@Op6CHRqCV4gjun(n`w(9v_EdyOV_bk0Dqz>C~GS=oGa`VO#?5>0Jt5YQQ+Cl1T46H=~^D9gcc>1n8 z%}CVp0AeiMR8UCrYN;al&CeS*8V3{k08;L%Vpcj*E<5VR4UXAa`@C?0LV>Ky!`|M? zcL=r~B*BbIP>fQbn*#4-jI!?cCI`CgN+fqm1IsH$f|nI~}k1 zP8QURD5cs@GL&8R1N>?c<++7+_60fUj9wJiecmTVnwB;7E}@Mbu~EK%TIURevF<=8 z=H4a9Mb)s!eDFCc+0jNw%>@oowLwjYNfK{oI3D~G=gwW2Il)5@*%Wo!oAqSah=d5J z?~wx$P#DYCiGsrVU;FPxqwNrKa=6yk)~e>%FJcR*ujRBTX(u7l)SUr9TQy(d~c{DxT|ETWUE}~=famHq&xRsGV<4F9B|7u zTTpRE-rjI|BZPd~*V9u;PVpXz9jYB~H2c9Xx_li`u_6~j9&5_aw+P!erWBuyMfZv7 ztl^i;O_U4K$A>9vlk0w+3_WRUX?_3Gv0pf{7dfJhs+O6~=72W9huF{{93#Efo#D_`p zkFNfL^yt-A*uyKSRO;7zV(tb^NDAd>Kb&yBy{$f{ZG(MN7U7O2vO)VEk%>GLP42tu z-|Yw|Nkl}Jhw+CF3G|yO*(+X;p`H!W=~_D6Pu%zwg@VV~S&L6};!5(Wlk)O<5=Nlx zDG1S9S04Nfc_qQB|I${zI^go#wzH&)vogu8v9-(s7KUnuGvBkFy8YkqndWx5Mlw6_ zV&KW(vtJ#(3CJ+s{!D1f(a>Gm>6XdbXG-*L%YNqb8?zq`QE_%FcQxF z<@ujQ-}ON}$%~msEq$ p!$3n=uDjfeB0Ms~N$CGT2OW5&#w}tHW#_j6Ff+0;Y|{5g{1*&}fIt8M literal 0 HcmV?d00001 diff --git a/android/res/drawable-ldpi/icon.png b/android/res/drawable-ldpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..629813c7685d35863d44c6150d1d7d4f3c1fcde0 GIT binary patch literal 1064 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 P76!mT$5p| literal 0 HcmV?d00001 diff --git a/android/res/drawable-xxhdpi/icon.png b/android/res/drawable-xxhdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5f7de0cfc03f968fb117e8bb4e9b3ebab8f445a0 GIT binary patch literal 5559 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 EKiF)2>i_@% literal 0 HcmV?d00001 diff --git a/android/res/drawable-xxxhdpi/icon.png b/android/res/drawable-xxxhdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1b608ed3ea750bc4c622b43bbd28d033844264e6 GIT binary patch literal 7789 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

pbjX*x^lbD@?v zsa)`l+-KXN;sz>G_Jj*RP?f+_x~D^*uc5a>7hTW!Ll^*#n9crZ`uy@e*7pqG&<`XS zHG4^C?TKabik?>P*$JG=yZ!}BH@eTHT9<$jXAA=7L( zm?v)hoDXLh)K6a?5zON5I(KI1P9_3Kzm>*biMQZfX*?%av#M(TYsBmRkShG(7WjK6 zcBU-!Ts^6|u5CQ1efAC`7TvPEysChx`;SJx!wLRd)-AuM#X&m}z)6~xqwD5pldh0l zx#rA~I#T@Tv%IcdreT!hCg(95fJ4n=i&~F@%*9*pD5CJu<9O9-E)7eK8Yf)VEe=k7 zbG(Mq)_+DMasVE;Bsa~s558;-vHbLP5ubx27jN@X_kE14Fc5#; z_3PDqCPNh^5^`RXT4u`M-z``3NAEmibO>t$Tn!cTxZH6s@|+CyOSOKkvy!{lKIF#? z!0WSOo@rsOe%d{F=UzwNr%;u02Rj%X#d;6?cpA0`?JI!yTHB3_a)R(&QtAtyCH=AB z0GjNNqO%G14^$SrpUP5s8fE-zPw#Ia+IK>HJ`uPCnUWhWjM`)Sr#n7hPtEkIb@~Zi z$0^Q6>+qz*bI3mY-j{EuXdQ=D^g!c0v5j7rofA>j8n;k`W4v1R!nBZWQ26qI6owg4 z*5>k>0=p6|;KP<9Lm6;->O4Nx->&`mxiZz&B`U(O{_xC&XYpxg76bsCSx*nAxr^iY z{Jz)6%?5@y8pjeBeoQ)*BWBabZrK@O1qHKJRhbhL6O1)Z&n2xx-|2WxC40uYxNt2M97(F6CTmf74T${cRJFpYCBljCb^Qht-^CPQ6(qvYp*vrPoKI6KQ z>dmZHZ?0;QPwQenAAM!tAnvEa{L23%-+0L(d_fM`WQ>>Jo=$HyU=5p8HMS}3=!qKXN{5V5NSm^%@bmogw#O41f%4OCd`^ju$JC zzgMr@ueI#UL==GM?56Err|J~jePZD;s8%dKrpvN7w&$V{ha{H_j5D?h!*(b33m*D-STcD~u0OEji0DkOAHA1rw{!YrFxM zN@$>@>dh->?<&JEOrOV_^ZOgMXsX4XGYno&2-nGNwy%s8BB0~cUle1QL*W9>(^+t0 zjNLIyD!hpKVJ7jncoEW) z*x0#wG!eqg%x|5d$LH4841e!Mv{6ye%F#dwoZF13!UxRTotI+@nG*WUk-RmNJhih~ zv`dkNQPSR=vo0*f3O`@9FvgGqh+qq`t?p0#o=YJN*6Tmb-gR~iu%bmjj)gluuB0pP zQl)*l(FpIjJ{p5AehPswgY&}s|lf_GywBsYR>`;{hC9rq?!RG~Lk}jK5 z&o9C_y*9}S)A$~4;{^4U^RW-74o5O~GS~cOJlc^_b+V7Gf-198ucP1cdEa6o_mYK0tPSf;&G{xzC{HaaAXP31^wHy5!8mfuS}tA z(^S>T8en|(-nxyULqSq4hfH={yFCT0%W3%(J{}h0U?O+;V@1Vi;#y>$*-8rH~5R?e*jOOUc$LI@}kD_Ljpg+TZV|tk$<6hieTV*oy_-+t_^>V^T ztfC6*UV*yVp>nMaoIGZ-FtrY~QQ5rIPv2Y**S^|fE-$$fhnFXLm9gHJsLh4^-#y;2 z1sffdF`qa}tNXB`Q`mWAu3cpwqPK zZXW`&S@*?FJt4kiSqj}l(ym+VPBLxdCcg{zpg^Wgzm8xJK@wdFrW?99s{R)zQii#H z)8Pk)Z}~(`8+`Y=^Qs50 z-N|k=vB^eyl3@v7$M#E@k0MQAL|nI(v>I**@<1eSLk1@~AzQU}@dL4I!`RqKwRiW> zI9>$5XiyMt#2zDKX(;0FVmfSM%$V@j+^n0S)RjLC;f_}`c|xE_#PP==jCU`D%SFNvYFivNdP=c_RuiG!D952YU{wCn2We zp<}oHk|iQe6(0zCt?$ZeYg?W8^TFU-Q;u+FzPmi}v>8MyiJ Re63Ug1sPT88cDO@{{gvxh-?4= literal 0 HcmV?d00001 diff --git a/android/res/values/libs.xml b/android/res/values/libs.xml new file mode 100644 index 0000000..beb15ca --- /dev/null +++ b/android/res/values/libs.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/android/src/cc/akashic/noderoid/NotificationClient.java b/android/src/cc/akashic/noderoid/NotificationClient.java new file mode 100644 index 0000000..9b0305b --- /dev/null +++ b/android/src/cc/akashic/noderoid/NotificationClient.java @@ -0,0 +1,93 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +package cc.akashic.noderoid; + +import android.app.Notification; +import android.app.NotificationManager; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.graphics.BitmapFactory; +import android.app.NotificationChannel; + +public class NotificationClient +{ + public static void notify(Context context, String message) { + try { + NotificationManager m_notificationManager = (NotificationManager) + context.getSystemService(Context.NOTIFICATION_SERVICE); + + Notification.Builder m_builder; + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { + int importance = NotificationManager.IMPORTANCE_DEFAULT; + NotificationChannel notificationChannel; + notificationChannel = new NotificationChannel("NodeRoid", "NodeRoid Notifier", importance); + m_notificationManager.createNotificationChannel(notificationChannel); + m_builder = new Notification.Builder(context, notificationChannel.getId()); + } else { + m_builder = new Notification.Builder(context); + } + + Bitmap icon = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon); + m_builder.setSmallIcon(R.drawable.icon) + .setLargeIcon(icon) + .setContentTitle("NodeRoid") + .setContentText(message) + .setDefaults(Notification.DEFAULT_SOUND) + .setColor(Color.GREEN) + .setAutoCancel(true); + + m_notificationManager.notify(0, m_builder.build()); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..c0d6d89 --- /dev/null +++ b/main.cpp @@ -0,0 +1,18 @@ +/** + * @file main.cpp + * @author Myth + * @version 1.0 + * @date 2021.10.23 + */ + +#include "mainwindow.h" + +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + w.show(); + return a.exec(); +} diff --git a/mainwindow.cpp b/mainwindow.cpp new file mode 100644 index 0000000..616ba35 --- /dev/null +++ b/mainwindow.cpp @@ -0,0 +1,119 @@ +/** + * @file mainwindows.cpp + * @author Myth + * @version 1.0 + * @date 2021.10.23 + */ + +#include "ui_mainwindow.h" + +#include "notificationclient.h" +#include "syncdata.h" + +#include "mainwindow.h" + +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent), ui(new Ui::MainWindow) +{ + ui->setupUi(this); + + syncdata = new SyncData(this); + connect(syncdata, SIGNAL(timeUpdated(QString)), + this, SLOT(dispUpdateTime(QString))); + connect(syncdata, SIGNAL(nodeDataUpdated(int, float, float, float)), + this, SLOT(dispNodeData(int, float, float, float))); + connect(syncdata, SIGNAL(nodeDataUpdated(int, float, float, float)), + this, SLOT(sendNodeWarn(int, float, float, float))); + + temp_max = 27.0; + connect(this->ui->doubleSpinBox, SIGNAL(valueChanged(double)), + this, SLOT(updateTempMax(double))); +} + +/** + * @brief 槽函数:更新高温报警温度 + */ +void MainWindow::updateTempMax(double temp_value) +{ + temp_max = temp_value; +} + +/** + * @brief 槽函数:显示节点数据 + */ +void MainWindow::dispNodeData(int seq, float humi, float temp, float light) +{ + QString line_str; + + line_str = "节点" + + QString::number(seq) + + " 湿度:" + + QString::number((double)humi) + + "% 温度:" + + QString::number((double)temp) + + "°C\n 光照度:" + + QString::number((double)light) + + "lx"; + + switch (seq) + { + case 2: + ui->label_node2->setText(line_str); + break; + case 3: + ui->label_node3->setText(line_str); + break; + case 4: + ui->label_node4->setText(line_str); + break; + case 5: + ui->label_node5->setText(line_str); + } +} + +/** + * @brief 槽函数:显示更新时间 + */ +void MainWindow::dispUpdateTime(QString time) +{ + QString line_str; + + line_str = "更新时间:" + time; + ui->label_time->setText(line_str); +} + +/** + * @brief 槽函数:发送系统通知 + */ +void MainWindow::sendNodeWarn(int seq, float humi, float temp, float light) +{ + static bool is_first_run = true; + static QString last_warn_str; + if (is_first_run) + { + NotificationClient().setNotification("成功获取数据!"); + is_first_run = false; + } + + if (temp > temp_max) + { + QString warn_str = "节点" + + QString::number(seq) + + "温度过高:" + + QString::number((double)temp) + + "°C"; + + if (QString::compare(warn_str, last_warn_str) != 0) + { + NotificationClient().setNotification(warn_str); + last_warn_str.clear(); + last_warn_str.append(warn_str); + } + } +} + +MainWindow::~MainWindow() +{ + delete ui; + delete syncdata; +} diff --git a/mainwindow.h b/mainwindow.h new file mode 100644 index 0000000..7e18f6d --- /dev/null +++ b/mainwindow.h @@ -0,0 +1,41 @@ +/** + * @file mainwindows.h + * @author Myth + * @version 1.0 + * @date 2021.10.23 + */ + +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include + +#include "syncdata.h" + +QT_BEGIN_NAMESPACE +namespace Ui +{ + class MainWindow; +} +QT_END_NAMESPACE + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + MainWindow(QWidget *parent = nullptr); + ~MainWindow(); + +private: + Ui::MainWindow *ui; + SyncData *syncdata; + double temp_max; + +private slots: + void updateTempMax(double temp_value); + void dispNodeData(int seq, float humi, float temp, float light); + void dispUpdateTime(QString time); + void sendNodeWarn(int seq, float humi, float temp, float light); +}; +#endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui new file mode 100644 index 0000000..7c804ff --- /dev/null +++ b/mainwindow.ui @@ -0,0 +1,275 @@ + + + MainWindow + + + + 0 + 0 + 1080 + 1920 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + Arial + 9 + + + + MainWindow + + + true + + + + + + 10 + 0 + 351 + 41 + + + + + Arial + 30 + 75 + true + + + + NodeRoid v1.0 + + + + + + 0 + 40 + 1081 + 16 + + + + false + + + false + + + Qt::Horizontal + + + + + + 10 + 60 + 1071 + 101 + + + + + Arial + 25 + 75 + true + + + + 等待中 + + + + + + 10 + 160 + 1071 + 101 + + + + + Arial + 25 + 75 + true + + + + 等待中 + + + + + + 10 + 260 + 1071 + 101 + + + + + Arial + 25 + 75 + true + + + + 等待中 + + + + + + 10 + 360 + 1071 + 101 + + + + + Arial + 25 + 75 + true + + + + 等待中 + + + + + + 10 + 460 + 1071 + 41 + + + + + Arial + 25 + 75 + true + + + + 等待中 + + + + + + 90 + 550 + 231 + 71 + + + + + Arial + 25 + + + + -100.000000000000000 + + + 100.000000000000000 + + + 27.000000000000000 + + + + + + + 0 + 0 + 1080 + 23 + + + + + + + + diff --git a/notificationclient.cpp b/notificationclient.cpp new file mode 100644 index 0000000..b5c32b8 --- /dev/null +++ b/notificationclient.cpp @@ -0,0 +1,90 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "notificationclient.h" + +#include +#include + +NotificationClient::NotificationClient(QObject *parent) + : QObject(parent) +{ + connect(this, &NotificationClient::notificationChanged, + this, &NotificationClient::updateAndroidNotification); +} + +void NotificationClient::setNotification(const QString ¬ification) +{ + if (m_notification == notification) + return; + + //! [notification changed signal] + m_notification = notification; + emit notificationChanged(); + //! [notification changed signal] +} + +QString NotificationClient::notification() const +{ + return m_notification; +} + +//! [Send notification message to Java] +void NotificationClient::updateAndroidNotification() +{ + QJniObject javaNotification = QJniObject::fromString(m_notification); + QJniObject::callStaticMethod( + "cc/akashic/noderoid/NotificationClient", + "notify", + "(Landroid/content/Context;Ljava/lang/String;)V", + QNativeInterface::QAndroidApplication::context(), + javaNotification.object()); +} +//! [Send notification message to Java] diff --git a/notificationclient.h b/notificationclient.h new file mode 100644 index 0000000..f821dbf --- /dev/null +++ b/notificationclient.h @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef NOTIFICATIONCLIENT_H +#define NOTIFICATIONCLIENT_H + +#include + +//! [Qt Notification Class] +class NotificationClient : public QObject +{ + Q_OBJECT +public: + explicit NotificationClient(QObject *parent = 0); + + void setNotification(const QString ¬ification); + QString notification() const; + +signals: + void notificationChanged(); + +private slots: + void updateAndroidNotification(); + +private: + QString m_notification; +}; +//! [Qt Notification Class] +#endif // NOTIFICATIONCLIENT_H diff --git a/syncdata.cpp b/syncdata.cpp new file mode 100644 index 0000000..1b1b4d2 --- /dev/null +++ b/syncdata.cpp @@ -0,0 +1,132 @@ +/** + * @file syncdata.cpp + * @author Myth + * @version 1.0 + * @date 2021.10.23 + */ + +#include +#include +#include +#include +#include + +#include "syncdata.h" + +//数据源链接,数据由其他程序生成 +#define DATA_URL "http://node.akashic.cc/data.json" + +//每 100ms 更新一次数据 +#define UPDATE_INTERVAL 100 + +SyncData::SyncData(QObject *parent) : QObject(parent) +{ + data_manager = new QNetworkAccessManager(this); + //每次请求返回结果后调用槽函数 dataReplyFinished + connect(data_manager, SIGNAL(finished(QNetworkReply *)), + this, SLOT(dataReplyFinished(QNetworkReply *))); + + timer = new QTimer(this); + //定时器触发后调用槽函数 updateNodeData + connect(timer, SIGNAL(timeout()), + this, SLOT(updateNodeData())); + timer->start(UPDATE_INTERVAL); +} + +/** + * @brief 槽函数:请求新的数据 + */ +void SyncData::updateNodeData(void) +{ + data_manager->get(QNetworkRequest(QUrl(DATA_URL))); +} + +/** + * @brief 槽函数:处理收到的数据 + */ +void SyncData::dataReplyFinished(QNetworkReply *reply) +{ + QNetworkReply::NetworkError networkerror = reply->error(); + + if (networkerror == QNetworkReply::NoError) + { + // JSON 解析 + QByteArray databuff = reply->readAll(); + QString result = QString::fromStdString(databuff.toStdString()).toUtf8(); + QJsonDocument document; + QJsonParseError parseerror; + document = QJsonDocument::fromJson(result.toUtf8(), &parseerror); + + QString time; + double humi; + double temp; + double light; + + if (!document.isNull() && parseerror.error == QJsonParseError::NoError) + { + if (document.isObject()) + { + QJsonObject Object = document.object(); + if (!Object.isEmpty()) + { + if (Object.contains("time")) + { + QJsonValue time_val = Object.value("time"); + if (time_val.isString()) + { + time = time_val.toString(); + emit timeUpdated(time); //信号:时间更新 + } + } + + //遍历 2 ~ 5 节点数据 + for (int seq = 2; seq <= 5; seq++) + { + if (Object.contains("node" + QString::number(seq))) + { + QJsonValue dataObj = Object.value("node" + QString::number(seq)); + if (dataObj.isObject()) + { + QJsonObject ObjectData = dataObj.toObject(); + if (ObjectData.contains("humi")) + { + QJsonValue humi_val = ObjectData.value("humi"); + if (humi_val.isDouble()) + { + humi = humi_val.toDouble(); + } + } + + if (ObjectData.contains("temp")) + { + QJsonValue temp_val = ObjectData.value("temp"); + if (temp_val.isDouble()) + { + temp = temp_val.toDouble(); + } + } + + if (ObjectData.contains("light")) + { + QJsonValue light_val = ObjectData.value("light"); + if (light_val.isDouble()) + { + light = light_val.toDouble(); + } + } + + emit nodeDataUpdated(seq, humi, temp, light); //信号:数据更新 + } + } + } + } + } + } + } +} + +SyncData::~SyncData() +{ + delete data_manager; + delete timer; +} diff --git a/syncdata.h b/syncdata.h new file mode 100644 index 0000000..e7efdf0 --- /dev/null +++ b/syncdata.h @@ -0,0 +1,36 @@ +/** + * @file syncdata.h + * @author Myth + * @version 1.0 + * @date 2021.10.23 + */ + +#ifndef SYNCDATA_H +#define SYNCDATA_H + +#include +#include +#include + +class SyncData : public QObject +{ + Q_OBJECT + +public: + SyncData(QObject *parent = nullptr); + ~SyncData(); + +private: + QNetworkAccessManager *data_manager; + QTimer *timer; + +signals: + void timeUpdated(QString time); + void nodeDataUpdated(int seq, float humi, float temp, float light); + +private slots: + void updateNodeData(void); + void dataReplyFinished(QNetworkReply *reply); +}; + +#endif // SYNCDATA_H