From dcead62a5c7b64a6ebe27bd3b4b057f150fb59f4 Mon Sep 17 00:00:00 2001 From: Iurii Makhno Date: Wed, 13 Apr 2022 18:00:03 +0000 Subject: [PATCH 1/4] Tests for 'aapt2 dump badging' command. Bug: b/228949376 Test: Dump_test.cpp Change-Id: If07e77b9281bdfd456df7c84f4a912bdf0851490 --- tools/aapt2/Android.bp | 1 + tools/aapt2/cmd/Dump.h | 8 ++ tools/aapt2/cmd/Dump_test.cpp | 100 ++++++++++++++++++ tools/aapt2/dump/DumpManifest.cpp | 10 +- .../integration-tests/DumpTest/components.apk | Bin 0 -> 84534 bytes .../DumpTest/components_expected.txt | 56 ++++++++++ .../components_permissions_expected.txt | 5 + .../integration-tests/DumpTest/minimal.apk | Bin 0 -> 214221 bytes .../DumpTest/minimal_expected.txt | 92 ++++++++++++++++ 9 files changed, 267 insertions(+), 5 deletions(-) create mode 100644 tools/aapt2/cmd/Dump_test.cpp create mode 100644 tools/aapt2/integration-tests/DumpTest/components.apk create mode 100644 tools/aapt2/integration-tests/DumpTest/components_expected.txt create mode 100644 tools/aapt2/integration-tests/DumpTest/components_permissions_expected.txt create mode 100644 tools/aapt2/integration-tests/DumpTest/minimal.apk create mode 100644 tools/aapt2/integration-tests/DumpTest/minimal_expected.txt diff --git a/tools/aapt2/Android.bp b/tools/aapt2/Android.bp index 0849600b0606c..3dc550e855eca 100644 --- a/tools/aapt2/Android.bp +++ b/tools/aapt2/Android.bp @@ -191,6 +191,7 @@ cc_test_host { "integration-tests/CompileTest/**/*", "integration-tests/CommandTests/**/*", "integration-tests/ConvertTest/**/*", + "integration-tests/DumpTest/**/*", ], } diff --git a/tools/aapt2/cmd/Dump.h b/tools/aapt2/cmd/Dump.h index ec320ecd2a324..c7a35672dc903 100644 --- a/tools/aapt2/cmd/Dump.h +++ b/tools/aapt2/cmd/Dump.h @@ -131,6 +131,14 @@ class DumpBadgingCommand : public DumpApkCommand { &options_.include_meta_data); } + void SetIncludeMetaData(bool value) { + options_.include_meta_data = value; + } + + void SetOnlyPermissions(bool value) { + options_.only_permissions = value; + } + int Dump(LoadedApk* apk) override { return DumpManifest(apk, options_, GetPrinter(), GetDiagnostics()); } diff --git a/tools/aapt2/cmd/Dump_test.cpp b/tools/aapt2/cmd/Dump_test.cpp new file mode 100644 index 0000000000000..d018882fad9cf --- /dev/null +++ b/tools/aapt2/cmd/Dump_test.cpp @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * 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 + * + * http://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. + */ + +#include "Dump.h" + +#include "LoadedApk.h" +#include "io/StringStream.h" +#include "test/Test.h" +#include "text/Printer.h" + +using ::aapt::io::StringOutputStream; +using ::aapt::text::Printer; +using testing::Eq; +using testing::Ne; + +namespace aapt { + +using DumpTest = CommandTestFixture; + +class NoopDiagnostics : public IDiagnostics { + public: + void Log(Level level, DiagMessageActual& actualMsg) override { + } +}; +static NoopDiagnostics noop_diag; + +void DumpBadgingToString(LoadedApk* loaded_apk, std::string* output, bool include_meta_data = false, + bool only_permissions = false) { + StringOutputStream output_stream(output); + Printer printer(&output_stream); + + DumpBadgingCommand command(&printer, &noop_diag); + command.SetIncludeMetaData(include_meta_data); + command.SetOnlyPermissions(only_permissions); + ASSERT_EQ(command.Dump(loaded_apk), 0); + output_stream.Flush(); +} + +TEST_F(DumpTest, DumpBadging) { + auto apk_path = file::BuildPath( + {android::base::GetExecutableDirectory(), "integration-tests", "DumpTest", "minimal.apk"}); + auto loaded_apk = LoadedApk::LoadApkFromPath(apk_path, &noop_diag); + + std::string output; + DumpBadgingToString(loaded_apk.get(), &output); + + std::string expected; + auto expected_path = file::BuildPath({android::base::GetExecutableDirectory(), + "integration-tests", "DumpTest", "minimal_expected.txt"}); + ::android::base::ReadFileToString(expected_path, &expected); + ASSERT_EQ(output, expected); +} + +TEST_F(DumpTest, DumpBadgingAllComponents) { + auto apk_path = file::BuildPath( + {android::base::GetExecutableDirectory(), "integration-tests", "DumpTest", "components.apk"}); + auto loaded_apk = LoadedApk::LoadApkFromPath(apk_path, &noop_diag); + + std::string output; + DumpBadgingToString(loaded_apk.get(), &output, /* include_meta_data= */ true); + + std::string expected; + auto expected_path = + file::BuildPath({android::base::GetExecutableDirectory(), "integration-tests", "DumpTest", + "components_expected.txt"}); + ::android::base::ReadFileToString(expected_path, &expected); + ASSERT_EQ(output, expected); +} + +TEST_F(DumpTest, DumpBadgingPermissionsOnly) { + auto apk_path = file::BuildPath( + {android::base::GetExecutableDirectory(), "integration-tests", "DumpTest", "components.apk"}); + auto loaded_apk = LoadedApk::LoadApkFromPath(apk_path, &noop_diag); + + std::string output; + DumpBadgingToString(loaded_apk.get(), &output, /* include_meta_data= */ false, + /* only_permissions= */ true); + + std::string expected; + auto expected_path = + file::BuildPath({android::base::GetExecutableDirectory(), "integration-tests", "DumpTest", + "components_permissions_expected.txt"}); + ::android::base::ReadFileToString(expected_path, &expected); + ASSERT_EQ(output, expected); +} + +} // namespace aapt \ No newline at end of file diff --git a/tools/aapt2/dump/DumpManifest.cpp b/tools/aapt2/dump/DumpManifest.cpp index 9828b97982ed7..2c833e715cb79 100644 --- a/tools/aapt2/dump/DumpManifest.cpp +++ b/tools/aapt2/dump/DumpManifest.cpp @@ -1565,16 +1565,16 @@ class MetaData : public ManifestExtractor::Element { void Print(text::Printer* printer) override { if (extractor()->options_.include_meta_data && !name.empty()) { - printer->Print(StringPrintf("meta-data: name='%s' ", name.data())); + printer->Print(StringPrintf("meta-data: name='%s'", name.data())); if (!value.empty()) { - printer->Print(StringPrintf("value='%s' ", value.data())); + printer->Print(StringPrintf(" value='%s'", value.data())); } else if (value_int) { - printer->Print(StringPrintf("value='%d' ", *value_int)); + printer->Print(StringPrintf(" value='%d'", *value_int)); } else { if (!resource.empty()) { - printer->Print(StringPrintf("resource='%s' ", resource.data())); + printer->Print(StringPrintf(" resource='%s'", resource.data())); } else if (resource_int) { - printer->Print(StringPrintf("resource='%d' ", *resource_int)); + printer->Print(StringPrintf(" resource='%d'", *resource_int)); } } printer->Print("\n"); diff --git a/tools/aapt2/integration-tests/DumpTest/components.apk b/tools/aapt2/integration-tests/DumpTest/components.apk new file mode 100644 index 0000000000000000000000000000000000000000..deb55ea6fda36bc1c288827c4a73e040f4321c82 GIT binary patch literal 84534 zcmaI+18`7 znlKu`3{Qjbl`IWo$~jY=boP|HtG1W9L}W1nF=f&i5MAEt+JDWN)n3#G@rpnsjs-cBW1DRv8*=n;(<|TiY@U2m#r|?lZ3R{7y#z#@f zkK`xEQ9O~S59Khk8t+3ZCohA>LtOko`Kc=2Qzu0iF_4cUA|ssqkK~sw03B2e8J8?c z_vJeKTrx33Op|%(*!k*Z+IONg=TF>3KNFWx*YD`Q3drleeWvaGJb$a* zsUO<4WkF2yL)p`gP2rA;s5l-|5CDmu4}Fm#vRHt5agTiY`va9@S*!ttNJ~Au3!=FP zX@{c)%n!o7cRP<;ED5}%7vhEh2(AOx+^gRcdyBFIQv)sldcH%*^n-#2N&v9j%YVa# zkp@K=blnrXg9t=;2f6yK#Hx(;5a8zk9`!qM$1-4^2wo9OA&XHY_-B~24TLQbtWf}F zIlfDP!VE;4Fp|{B>%}2E=$k42n~)$Ebi&RL4`^@``SH?d{a5>bq|wI?B>m)btq{~C z>o>VqpDNmaoJV@A{z9+niy8j%k4GDn&S+6%%?p&3`fC9V-i5Z6YZN>rXFHASHy<@M z!d_w;g8Vc#8b>b{N=vp<3sdKqgX#F_t`BR>6CN513)aoD>%_Jt4Z3q~vg@R_`E7bA zO;_eLG3S#xwzhfxjE@{;5FDq1vivlzUlg0$d#h;+zL^hc3;RD~ZRg$!x3+`?=^kSs zU&9u7aZeOwI?I3iX`O8%JYW`Xkv^VKd~__JBDheviu-f~Ew>P%XyXojxF$dO`M>ih zl{4!dx1gw;-P17ZZ!$z;xp68r*X!wJqM)hIe0*O*{57=RCgC5{_=Z#EYrao|Fckec zy;u2#ee8$TcsaN^&G@e8NC*$>-)-?Y#&g3bAR)CxL$^;uvLP{`tHE!X7W#%pJ&%^A zP%@8pux)tIA0vmWNg@{p~jM4-f4kLZB-pgCz(l?v5KcqQy{?gZIw|g)LDUf+9ej^&~&X# zwee|G^0J2JG^UeWCZ_Uoos$;9dfc+}8uh#rX1Z?q^^6;T&OAbWia?9*>pexenmgrc z<0Vg9(8U>&fla$f`YE0lM!|J)rdmV!=8*e_ZD?|u<|Sv_y`O|9X8k0?TGXXc)2e!< zRrT(rSGcs*dc$S0(T$cHpRX|Esg?pKW&`#z$3zGkwevx4KYMjn!P7m`%pzTXT$Bjh zM7Ayi(@%tX!zS5(rgyZzGw7Vh%y@qGrBEN|@6d{yF(zu!nY7*&JKgTBqE?e1KTe>q z){lmpq$DQ>Nz-*19JnmkO#JOgHvM5E_s1G-FaHYO6hqT&l=>+9U|`&9$}mVeYb8#P zDFHPWpHOa%l4cVqg=M}qvO6bqjM7a&k2*GTbGv(cdvLzDgypgS(*VLg)X`tZ%1a| zdBAh~4bQHw)vg|92U5r~!ga)r7jU9a_6A$4wDn4`+KBcVZL4UKJ4M&fBAe5)MKJa ze`tQbUAivaUaZ!;AFl`vznV>HdSBaDK3jwCNy<-DWfCMXnZo>hxJxBqu0fNDNUDp9^Ecs?TY)l|J5PpaoAYI^R z|Yp9KzR@0?@+Zc7$CZm zHo|sKZa~|gFg-{C2#!h$956pP9|V`hA0OaAJT5g^7dRju5Qj<|%x@>P=UE7pWD|01 ziP&!ET1XQA0feLS4@M8BkT?G<#Ljcic0hH2KiDpU7+4QE5m*Pp2KW^~9|Qr3RB(rj z2@nO~4B+k2-Oo+D@*-tr(bY2-e$8xWp7KC%+L+SWAp`To8WFY+{MF=mq(gaVe$xpZ zZ8pOKwgi4Ntm50aa_FpE zp}q0_(7#MqoDunxw4@)RWh=>Ed86AQ&UzlH&L)T{qr4X~5`OAN(>W_R=XxEQS<=Un zG1AmmXx(Lrf@5P-mMbSzqf3seotkgj9d)f5jO7;*R=14{_oD$9f#-Ws9JgUPeT^mW z(909c5qnki=H$1tZlMhwo2_7c%>k?=W|f`9_!EV;d}Q9_c3Q zA7yWgxLCYn`BCyx1ds0To3hrZ@U{CuoZfw>%_YnTr zQx`{aGOXULBadR1Arf;@eK#uSM$Mv^kY>?yc z>yA~6I?0+L1OxcTfL$^VlpXxwA~$`pM$A8pSV3E=f`xa z9L#flW&WboH9!mzQVdNJ!xHQ;WU1=bKOM{ z)hkpqidBx=WCl!A#R3UpcF3MxDXY9RtD&!wpo*-cyiM2Z_<&>2xD{g2(FQ8#Etk@qK&Hz&ABQO2^yxfa(E z@1@5bT9ki0IimjhtfV!H(Th(seTZQ>%ST5u#MC7gMC@1pxl|?+KBjlH*XL-ro?5^}l&oA&Ctk!uhGt^a)AR-6=de>Oj?7tu+t577wvc;nUJ zguXCwp`DREc#b!V3X*Qbm)efp`@?y#7p1wX@#)E&I}^P5ve?-NeSal?B1OoCIXvk^ z8qQkcsP*L?M}vkrSACEs-FDdHL(SSgB^T^7d(@?rY@V(9nR?QfcWXn@Pk#6T76nVYR(#c`T3fZ-P$7ZD$LrFB= z!smdF{bJgko1o#=I+-V7Qp#~bv$`xJKk0mpS4mvb1&?&jGOca38}$6$gIc;|#FL`; zb$mBw_t?*g4VT!74?YaY7W<=CcU8#eNKVL7=D39W%#6jzy ze~&wbk>V1t=gq{riE-)58TB`?o8-O3^Pnl}-`vO9tb{%aFcliC;(i&|vx)*id#iIU z(;GBoD}3bEF( zZZq`ng);ZPq3S?tyT3UGTQ8fu(Xscui5N^|FEad^6H$u_)D-OpAbxw#cM8-Dyp)e! z=CHKKOh)OtUjIs)`rj+CcTsEq?QS;Sp1Nzf{CsV63^ub?v;MW!NA`ku>bJkt(^-l| zd7vu?)eR?2T2DNTTeD+(cRlpa6G^3|%G=%%R#H?=xVv0#qVp>>znP4FggM&&-c}^L zsF?fTnKJ1(|2oO>0gPWc$8gE)dt%qGa?akj!VbdDiSsh}Tzd@eHJ|h?=Rx*mOZH3O z#xgO4*ODu*#C;3ft~VHs*p)wYC`xk06xeIfYrDIf(?ipNc(So zA=DYf!rz)ZYCG~fJU65}wmZ5zj6M3lYwwgS@X`Q&P#xOHuts(E0xQe)oc{+7*@-l zlajilwo#3EiJN34v|Y0oY#LGQlZLGYwk*S&&JjMHW(N-L*vn=wQt2}m z4qwg|uZfmN*WbNx=^r^XZDOr%eMxNz=WP;+r<=sqO5v>$9hyTg(XE zZn81E?s0Ngr;gYEt*Rh))!c-z3w+;P#tNtw2Wqi(Nx=81M631gbOU!be27FX~@D_m+ZUWnOvJ({B%)7kBx0g)=&Drksp57wB_t@%ry~?RH z@e)Y+M0?XJexnI#LBz!IXJoz5*k?KcJ4*pMhHbl}e?I;L$4MQXvOemTUDVf5NWo*) zLGM0e>tQr2O}#ABgv~2CH7iXRz|xkZb0>|+%LwDBE~<}@{1pz~CFE~BN49`ixV`5dvs}G?rh))NZfF4b}Wa{7_uc@55i}nFY&+yux6qiZc zDnG0HZqBENONRta(qpXgZk|$^O}E(k3nx5Ve~VH+^2fo1pwOuyXz(YDZa%O z#2TdtM2vOZUKYf(x@x`WGRzXDf<8#H2z7Z6ZtKy17K(Pq1AOHBmJ4sAxgOdNW~LWL z3HSFgKE@Ef9B&CRGim%KY^IZD*wBUMX=xXBB1D6dM1ve7A;-Rw#KGqM<=%(cx~SoD zaS~ZGd^eaWrlGgfQC>|!Pf`)`^hEP6)_?=$VgkQX1TiU=2NLLg(F2 z0(c|`^u@+ci$#x-@Qg2g|3DH#&gAL8KU?GAp{)N!!STTp3epB)<6`)XvF6@%vbd=g z4ML*Fq58_zU}O4t4*wE}zD9-1^-_Gao)j?hR4f8|1y@VXKZLEsXs|s_7bU-c$#;0I z7wIJ{PcMJg1Js(@2mDW2 zrbaWmiU}V8_)lN~AOI&*XGUff1_wKHK)8~EBmyiB>~~I%AT1^K^LsS-PoN>c_j_sX z-<2G^XK68ERgbkxT__FJVGN1rp_o^jX)I&n*|5$T2pg)1p}ds@4eAI8;ldzUOfcA--FJbfbST}=R1&sEX#L_;^( z85<|Vo>bI(jx>dd?VTsv+ZbO~xMn?;DSdxqqt92Az+v!d7`-}=DZgJ)rZsc~LBo68 zH##0uXZg#n!JW;FAYz@1H>-ohn-j1iW|MSlZSxgOWI;QMpiH#Tq3ouA3^Ydt(&7mx z;Fbp8PMAIDAe^gcA2tqfJSxxdLCznlPi_+i&dneju#=BjeO0Tbi92<2+YcC{#%|5x zCP{|1EtEUjecX1JobI~twn-nHI>Zxp1cq5OFk%h2Wpg3}JC}$%IF^KeeSFpqtZ(tI ztQQhV2}zB3MY>1_)_2n0u-@li8@ly!l!_GN8EEoBehoXTqLxNrX+TxLEuH34f?J!n zHuG?A`AP+e+KeL#FjKFLJV=mHt-nQ+?Jg=~g8U0Y4c1HS%#rr{VUS&8ry*I@HFs3< zd_*qYp%?G({h?z|IM-9MvTrMkWKdAn8Yk}M3!|h9Ujepcsx}H@C&o9}W|Upjc-VRJ zcyi`wFM0SnMG-xQnu#;FqgDhJoOmDTfvTks>d@0>kbQ!eNY5ef>E$WlJix%zRMr~{ z$?IAEcmMU+tQx_KiBz|zsK(M{JAbh7#bM~Lb!!y(#*Eg-qVJc2M0@`pz`z6|`j1QPTx{o0@Z0K)`6+BX zQo&xxA|-0q;XY;(izTvb*2_*uJKYtfm4ntgSoo4lT z0@xDM&v8Tf{pC*;4~?DPdx?fqF)w5g`xZK)JI1v!K9G(uY>xk5D7BNQ&dWic2)%>5 ze^cbQqut4N!BD+h2yF!rM;FQe(9{_D*j~MHK}mtGN7!{b47Eg@6;=P7OTyjh6a2Yfdt$~x!6~Q zAji9@oDZ_@nR!m)GU$#BMv#BJ`?mv7s9k2J9B8p!COX=k_(|o2n59c42DU!Lyt~EX z9)$r{&Wt>S78E@A3Tq-05Pk~n*#5kw0x#aPZ?~8jbIkO zNo7~n7)8WP)UvvXXW@W<<0T7dMXg7^$UG&+*_5VFI}&Z_IeHfZv=w^kNT8~30?U%6 z-r7PG2aCT)bSoi#v}Y|tbV^_Q%bCC0FwR1O9KZ>2lVq#$Za$9I^e^czt)bOIv6Bc~ znQ3-*H-Xx;cq2A##{x(#`A_iSm_o#Q|00p}UO%ghVS}I)2$7E2Q95ZDgS2!EB}C!# z+sgR+wETOJtfAgwtfMCOFYo<(L75?0OV1BI*OeN2aNK&6dV`SVksz`B2R(V);Tq55 z%P;WxrIwDMpmf9P=W(fd^KNtvp3&!f^z)1Dst-n!t`&A4x|5l!^KrqcxB9av1HCm0 zu0zu{7i-UEArZ9P9cLKDu`R$dEr$@Ez;xI`K>Szw*@~wiN=}C-;`8=9NXp=siUz@C zkmoGH*70y%RJw}K7UrSJa+W0- zmx)_*_Ka|XwqBF|TiZIDrC)a)#cqgr`(I%7pPQ4(T(-ftDhMIgM-d=qWq)6v?$~|c zzd;C|mss)G3-38A|SEUP;5tY-5*M2!0x*J3+tDOsB~^(Vh0dY!(P6vd0bijvS}> zI6d6+yag_y2-$z>2QHH1{=$l5x5)Jr5iB{;U2PalL9s8&5_mg0Zs4DE{xIo`<0o@O zexV{e&v21$y~W;!aj$$xGWvpn+xmjPOAZ-JPd%gq$VhJZ_n4W@-Sq@R6S@h6H|ptV z&I0?Cn5J|YyPn)bc>hKv^;+*WCKH5>GKq$EuT4qXEyk*@Q!oy`S=wZ@I^yPTRl|ea z07uN5PfWu2ovpSga7c+xr=g{Rp1J{nT|g^x}DZr91r?Y?xHS;yydXx z38mAe$|5<|0Z+lUctqcDd|whz2VYo&Uq3(v1tN-mYx*MV<9pC|Q0Tp7LkmsJsGpwa zAg*$_Lpx1W63e0+$kh!mf3M0B&wUH20IUfEvhb!a-Tzc$u>xSiVTm%iw3YAXi9=U=1)AUTC^8p&d z(|e&J|JT`zb?v8>RQy13@ohLvRCNX9nMYCgnS2kV8|v=51E>)Xy%nO7R5TD{Al$rU$&LrlzTBXbQ{?B$SxUE_5WR;E_o=|8*B+`!G_0<{uw+;yt<+Cs(_A zc;cq17}p`?j1fXBLSd=kOEBl5uBr=&HndIH>r;P7S$5$nBcB2t3x`en9LJmIQ6@4a zvf&rC6-OSrBYLAc-W6@-;w(Qg!aP%?KirhT&;Y+(`*{?`w=39C2M$BxRQffJGi?{! z-SfP|$oPpF-d4xmtx{oDL0-l%0Q2yepDhx)J)trJP!;>FCF+O85>})D9*%K-|H4kfNRQO#*$WmYOe}=Z<3+Cr-%`V+cd687A{au z6Vw3lXe<&mB%0pWjgX^+uxP~lr@y1{)BMjBpL;IwZ626seF0?+fou+^nz%16zoIAA`m(SC%i<(A3;WubN}1LX(RcaIGmcLSL263(2N|4y}l+i4kGp zjO`$zNExi4cw}4+SoyNm)VcvR398I5{R)g=mCofvFMh>+`(t{1!DZOzLX7jW)D)%7 z{Xk?Eh?C>zM@-bZWolEDp$Q5?BbKYffGtMafdf)IfeH0CfF)Ah-~keEJzf-v&hAno ziQaIiNiJli7^P0uzeGR*>gLsR9S*-nF(5Y$*NxIqNLY7MY2w_xtE0c%v3h*FXIeA< z=1~)giN6^`r0Nq^kyLq6DTC~&>Rl!j79)@+P{M?ZAl9!EnGP2qaUVLE< z5kUL8r6?V{x(FpC)&hS;z+suZEXW1u5aNVki}7sPEY_>2w|O?p$Ykh3QCRR^4!z#A z6_YqHANo4;q7$DQQlyE&^^gsr%2k60US}t=D~Mz1I`pcFL5(%$$rriQWJw@BOm?v3egMDbl@6takVl;gp~zpP;fZWw6{d8}tf8@?3`wX$~8q zPP)F1Il5#P(xKr{@{+9X;mch3m#R;!y15@EFgNd$v^AYi{LG?mdFZA{7-I1KF26mD ze#OO9F?Dt#OI)xIBec^OF^tp@ax4Q^y{6>cib{*&SkeT!fmBt(X1wP)^yqz`eX>bD zm8I;efDbJ583k8jk{gY<)-HmD<;e!2m_-P)Nt4Pj_VZ%_+ZN5O6v;--1iZ|8g^r$2 zMX`ZS_?cKY(97{;P>X?z-s~9`Nzi68Zt~SPX-4ND<&oM2+=xZ&5DqwPjJ_(NKWj!(vK{4j5gIa?YEHXF-_(KixtJ=B zpfbQ4s1TZ|0d8lU;+8=hb(7nU*Lq2@-9!m5 z*qtCvFI9;7BgmhnB+YXJ%q5oYPp_bM&kiYk=(`b&XpENH-U>>@-);tClD42(OGzv* zBWielOL^vtB-i8(#9~aUDTY7cm^y}DEtqA)uvi35b+8gTHNTNDHG``Ik&(-LnC4(G z1|VmJB7bLN;V732@3TZ&cn=*7a|No=AQNph!oHxvPzCa`OJ;o#dX83Atd|O>h1&h? zYk8~Fw;HnIg5`;gs{JY(t9P>c0aF0I!ex1YBrpMcGw!5!fW+UGguD|)%6RuDR~uvq zbJKtao8D(cGAhO;G{h0tGhPuQj2yJkwj50;&}RahxIsDCrrL>35DbYyK$z>Y&x!VH zuubZ6!QGEnQPGKNkqKK;yhTU?lvtOp#}M+nJP)y1K8Sxc4~(m;83Oq3 zPEBx+!DZ)~gME-r@Jcj98Vrr>@w1)}AHu;%@i4G09i)etgJF=5N+W3e!a}gC| z#6&&>mqKnAG&{?{M6rfGH1K19WFu_-6w!EZ(~yp&H>i(F8Q_M!-G5+0h?Pnf;5Z73 zmAf}eluR^P-ggqw3_Z=vKc2I{neG>~ zVBcyC()@=o&9X6iE?9Hmr@Z>Iob}+Ry!*45Ae|Y30hdKTG~6sveNeB)iTaSb4jo1b zyCQYe!%G1g*!Admdm@HgheBSPp3LXeN5ggjFOKjI;x@v3Mx=DIYmj=DPzHv36dF=| z`5~j32FiD48cB5!7)5r!2g4c+G_nZbk4}jV(z_5q?LI)qS=<7}hd63l+7RfFmz#nP zT?28~#eX%s8S!5E^O)rcIE{|KOLd$O5Z^Vg&!8^xIx@r^BHV6b1|LEH;mpWh4feQr zyqkzQ2)35-`WkSaa+-`O?94^mRgm}{t5Z+Py&KbY0UL?JG0x7brZeebuHj`0g++qLJXh|OuWKM;j5M4$+>E`UxXECPVJn?15FC$B6r`v?tmqIijQnO`j2m}qjaz7ry!i$~Rfalej{VZB&T zI)%0Tnq%jj7`uEpx=tBzsoNiku`>#e7*<7XJv(5L&KYhh_!5}1cjk2{})D$GF{ zV5|TjI1L$99#|&n*s%@pxnsiI$OkHN#X&7Bq-8S^y3M*sc5=P8_G*@78u_j2S`3Sj>1aOO4M z=j*|Ph%%`wQQLpLhiiEC7Ar@S0%*x0SJqn>;;ISrE&tBkd{3UUHtQV~Y_0&Vi zb~5Wc34{=Pbef|5IVA6;3N8Xot`||xosAk`ZfAaH`a2j9F%M_F9}XxZ{zCOI&LJ1d>XvD`L36tpO(0$-d zj8in0cUct$#S&9z4`;Kn(<-XjV8wp+I<{oK_I<;TRx`=DbzzW{%@qjaIXT7l9esOCK>A(VgKylKnK z6us!%8!^&s$V6`V*BetU!Hov-O=?xE@eghfKS!ZkTHB4}LMdIjyH}X@v7GYfWQxjV zIK80cIzQ$l_7Sb{*Xm@g!Tu0vJI$UH6ABEeb5RU;i%`chOx^v3BfvSf#R^^xzz(;P zC*c#?@1p_Lp6QVK5mN&;2^}a4-$0_SA{Tud$n6Mn0oul|E3yz{_8X3-HU=$iaUtA2 zzZJjy;gYQ+OI9V?uhaD&4r9*AOS;jO zshu-K4X^0I$LyL13967s`Mc+(s))mGUq<*ANAQU!UNTg~(B+cNRJ({U??tUjYs$N3 z^Z69{Ka5=Gxm=&2jO>zJlvMk-kNb7s^|JVfmdJ8LyFx*^$Oq6)2k)6kqLzkG;R75j z^i!p9D#?h`T0bU6;;<`&nOMjCc1(wlUxHI145UT`xg@>G#YxQNt$d_O#TZO&MMMH! z!dB$)^GkgeM)#8D&|)k1lTX~mY__wiVB7|+z)}JEST^Jq=~m3%8R9?meXZf?0))a- zq2ygim;KQ-8IIN#Mz$#7|G7!=fLHGY5HQ$^?>0A>RCkzs$zm(emXXyQ#L@k=)N0}8 zkm<=7F8!SS)rX>2qgk$(eTx}-qkaPU{Po#Rs^NGfO*@fja{js?hGuB@Dv_bLlewOb za*R-q3hF_=WLpt}bf zS7KOY4OBGG}b z3(e8_ERG!~b76;?%b9L?u_y12;I_J#&ipDZ<&Z>P5Y)D^5O`Rq^T{s1`Y9=Dn}f?k z%Lv{8t?4rdr?Rgc@c11fS`tjfDfFc88dcKtVrxfx2rR15AT*pKVNolt1}Y(TBD@|9j+QYg|DCDs24?$WQ-c(Sysa`)`~ z5bM1j-HhvGWLf+xBNE67^$Y!rhy+x1K^0)9AT%c-F^X7MOabi6I(THce_15mxGmE| z|F!HM=0FaIsUne(CgS^*Uol+)f2m3M<=iA+xx&G5lFK$ARLHHM)KVY#zTGYUr%CH0 z(9DKh`9k+0=_J+@!=@t7IT$on`b_j~C7y`3FFPX))F#f_jV+N%Y-K;X%0r!wSfFdj z)O(}RQQfw3^a;aOduKE1L-5x}i(>gyr9++VCqp3JVFnp`G6#KI<8^OL=x=;BFNG6A zKJV*}k$`RKg5N09d>HAUK$cEQ;Rvj`oQyD1kmgWXXZCIx63{{$k4zsjf!SIS+F4~O z@Iq`kHr^I`(n`m&#eyRlpTM^>eGW~h}DFr)B@MpxV2YD*lQ@}!HaP!PYu zjE&3SDTTP3p;bH;Xy@V3y*grJMqUs&gmS?eIRWS1fAL;9=eHY!4YSyRk7mGtEJSK2 zA0iQ0U|~W6a(bCDIz=+oIk3UckOL1i+^qxwo!|LFJmZdM=k&GImCjz(+dl9m`>GsC zUsGgB%6vYV%S1Oam@k%R_hR5|I3;|&yfrjW!8Ak~RO7rIF)&nq@3c_ZbtBe=-t)uG z41i5Oq@Gi7#jqM$feQzSptQi06anG7rIAo9e`VmTy*U;Vod)@_FkaxAxOEI0`QrYB zl5ZM*w%rnKY=$+q)9O4QdD5Lk;7ZcoeV?hKd`y{PD?>$rY(AfNb@@_Dyl`<#BgDEd zw|yNLCqODLeu*g7MG98)d^3>lB}j{JhM0g2?5$ubq`3<+T#FX!fB}_D=rHgblc;r1M}jvQCf_sG&WB5zllW6 zCm%wj7dV~iY_)Q>Q-v2Yf|hWbRmr@2xvS*>1DgnxxUT(Ny`jvc%1-3KZZj-*mK5ho z!WQG*W{q<64D0!l6tAG3=V{|}KM;t7-_*rW=E=msySf&jFP#<%O2%*WlJ9k{D@4lc z%+{$F|AV->&LrSF?hkfbcLeRF2)d?|^`J2=9euQnT?dK07y1KU(s}m1`|?2z>H%w8 zS=M&Uf9UZ8_V?Gm`Q+ESA6kmxIHIBLE8t1T%EOMQmgT9F-TRW_i%mrZml&s> zQdMnzA7S#uyTH>xQi^cNa<*~7S+VniukRK1k9=zf!hjv zgu)rKnK*G=D5mq-keh2RV&2i9Y9MP4clh){rr34bHOD|94}6GSG0TaJCRF<@;AgA^xN_=9b=fClnwpt{_$=Vi5Shjn)6dchB)^o>}=OPzquE*H{JoPh*u; z;XgKG_KK`EsxlVj4y*heg=L~%RAXvG1cMl=stj7Y~vL=UjcJD(zNmMqW{tYm->sZz(lh*8J<=ZXx!6cOW_e}X1%Zr)#} zZlAK)V|_;8>w8>6S#p_v`i^3xxO*6La@MyeXNUnosW$(wxGdvehAQhnvr;p)$)A&D z83k5lR?3s*86{dujY>auYbySYuF4rYd0{YWbzgnE;G6``=@7D*b({R_x)>-u0u1;>k;9w!5T>N`##GMD>a^@+YtCe5JhM$9#IU7 z-w3e08;|kja52P9&AXJH;_4~4_l)KD{veoHSf2$E0*wV{HMwF?X={sM|K%rF^|Dks z%5Pq~G+TE}uvTAbs`$0`CPDDd1yrnph|7ym%<+9_UD_Uh)7eFMy0Pz&+|W++zR2fy zo7M6jcjZbSP2oR0etoxmsxgPLrrVSor>L_r(r9B(!J20gOCb&=FRq1Wp?9nsz)lg4 zHchg`CLgEjXZcqv$3(9^T9<5?KBIvmH_lOKW2}LKGmbW2mrb{hokAT=KG|?VHm(p# zURkRlCmToy6FNAjfyhMfYjSF=foMS|nV#}PQv`loIr@-n9)&_S&5*mSHp^IxXLN3~ zCTm`Ufr(z%!alXM{t&@DBz(9J5XmT7>Z^^=EBT9@PNm#N1 z-l=;ZM^l;2biU8@bdgs%_kxjiZ)tby+GbaoYRbw2Nl1sHFG~Ln1#<#`f29G=Y71Ok zKsD(-eaY z#oi4ksaIQF{-NgTK`!d9{i;X^XrEDEf4cjZcdTWDf}zx4RLO%R4y+j*Ud}eQNCk{X1M-EHcRb;=l6RH|6*k2w0+|0F2sU;p}>lYlR+Z4n!&A9q1BMaC2 zb4`3bXuZ=&VFrG1w_Gyz)_&dE6vq+YWQaSs9_32~opz@jvvgztVjbids+_S7DBvXk z3AMbkl(4)a`uPu6;23MuZJa{z7^}GL5NFHnjg4p#)#i&IP=9R;Rj_{G+Pn!qmaPX? z9kM)Ny}#YlJ@_TR1Q~CEE3F+p&nIUQMP`v4GA=$QUdCAKyuiwPHW%5~UD6K+fg;2Zh9l|IP=e2N{)pIysQu_7^7;YyKB@=V) zfmt{V+s=$cJqp{!#`ccD>l0+zJe{Uk?a`v-`JiZ0aIR5S*`EhR&GSQIaw3lX0e6h? zurbIwE0Z+f4(YiG;@i7wyV%=MDFT(6n2eUvPrZCSvDo?(^pHLv_c371Z|b8uCW@E! ziCxYcC%i$AvF#(`phHLyg6zHolS3yC4jtl~?@LNFt3h48-R?*ifkS#&Kvgd4$I)?V zCkuI1v_f=rfO{~FP1I$tvo!MjMIHlV|2t`^)F5txz@iReo-bh_aNnouED|(qdIuPg ziJNHR*!(m&ERi9tT^`wlJ-4AVNT(2wy_gEA)HQ*C3ONgGX~kd<)!%pmYvkeF(X4A-`&s{Dzae7yuqniWz_492Pd_~Cpkdd>b1WjrX6neS4rIV1)Z3ff` zob_qJEos;Lgn=_Ekc1wbO&2}U(1tN{d`xaps>!;x60UNb4L8AwlB0ww0$LCnGvWl> z*aulh{<*^jHH6#RPaA?Gx|w-dM?1N?Fb!$l6cnOS3}SJH%TU=Yvy+74J>$<+Iz%n= zi)*HxsWV*o96C?LyJPq`EGbQ{CJN3?dlU~Ie~ic&AE={ZyK}qen^-8YYmeW`8Il<4 zBE+2%3B9hQK~d8p)xUA#+AY(uT*2G5#nRvF(;GpyX`|46Sf zHel#?z3KEo=)llZ5q?bxF}_UjJQ-c^V0@H0odOcsNxybIJs}}|w*PjqIGzuq8}|Pq z%Uu!#A3xkhUiqR+5g2#Ew;7(I+}%;6*i!h3b4~PZ1z}bN8}o2r=L47H{iZ0hde8YHq-AD*-TRZ2MTtr zxuSO<`>}h^r(jyR+$@=N&>T*46DdKJe=*ujo9uk-XOhspGh%+^g*HuU#fh#?&diXR z4*j5>&4jj0wNcvHCuXiK^*fRO6kxWIG0FG7x_LI>CtY zP6ANdZ38`|7)N2e2-CN_jflorz16}sqiD;DC1K(~pQ7DOXPZV%5X;9mlf!kE<<-yk zbW%}>Ag*!S>S$?&_Af{zU$ltr$m=7_l5}|!T=@&C%7gQn$b}+SIe(QRwK*bAcdxVT z<7&-P#j06hys5Ic95(4DIH{5g!ESKs7<6>OvQ4jF^mEfcH{>8?Ju>i~{_t>$gv&|> zsKs>Mf;8F%irU3~I3N5_a;8A6oJN+8+)V~hdu*?8{8{qMWOcDE?byJw_kCcjX4{3^ zJLDhHsQfdiO-qPJBKYRV0f-)7fu<#Rhvp?j%uC{b%k_vi#y^-ZZ5agv?uUHbWZn@N8YqBl8|aM8BwK#l>HEx!29W zyGD0KVAnRG(;k%tv{k^=Kj459yD)a$1c#K^x4#w7bsY*ageyyuR`p2o3g2XD_;g7C zpHB}$9OnfFmnOW4AEs#0jQ}Y&sPLLv#xHidx4+^zE;AEOvvu|6xZdM`=csFtTH44pN z+x<>tWau5vqT|_d-x3Vfd~Q3!Mug~CN)FsRnCmyTK67Y)YVOn zq;Z$$yZ071lAQ}2;#*YtxqyE9x#uE!al9PZkuf8?ONtyu{Jwdl)YmEe5HifIu}4oP zx;Yo&K_1t0(dMs$tHkBuQg91fQEpRv)75S*G$@l0H>IJK?s?%mN5BU{5$5(swXf6Q z3n6|H1gEarTN2hVu9QSfFx6TiAOE`Eb2|AbX=R;iHB0b(tXsJkQDbd6%^3Lk3=0Jf zHyz8bh@$zop0R4iyMYEy2uwv?bgbQ9Z0VR0W!x~A#wR=w5KLqVp{Y;qte2>ronjap z73=G=e*q7iS1RhnZ|zu;88Qd&nXg#R55SqWuA&3{E#KSi{azi>45MWmYOu_aHk%dk zL!B8_WTxd-)IX}Y-=H1!4`F_2Wyya*^h04N8NRqC9-n#b|QThd^4krzaIg% zUP|T&OICjoNz<;k74vE+?d|M}ud1rob{Wkw$lSAHDW7Vu3gW#c>=i{xD{yc`0@MB6Zr&CQ9=E@q6Q9`59SYdquiv>pL9Iz^X;urE`a^L`{6O`oqww9FWg(-0g~Zp zkIM%H%CSkK!zdW4r!EuNkT$9P1=+(ucmAXQ07&GAn~aA@kSmkH{Zh^K=%2;}K{@L> z0QoV5g9UZzha(NTG3pU6ZcpDS!oaGL>p)kS8g zSZ*F(FvQtVL&GfNO3@g`Pq2&yc0I-yEAy(v0kE63zY&Y*?mM%l+Kdn#L{^4sRD4D| ziMoXIor#+$2bch@itYd-N4cGG?-ZSLfhtPj_E!Oqg5GFwL@dWAz7r@Nb?qK8ti^IR z$p&f}ouyjc(CdWe-!u=@D@Z?_Qlb)%T@qrue4~Hwtv!jUpWUQORPj&B$O`)X2;1S$ zpn~!p2XOqLl+zLvWUz&+TYt`i$Ge_@u1i-)u}3t0+<^*6pM^ID+~>!TNZ-}CC*(J+ z-DANmK>$H)>@h=UBW~zLqh_?6iy#$<(1kd=T=g3`gWnA=U3<5nc@=1uiP!6(X`9!3 zYhORyTbOU<395y16B6P9T}M4C@L*}tP%##iE44;6?k@M?RE-qxa`=khIH^VcM(8E)sVY$*Vh z)9e*_|M)jL5#JfpuGoF4Z*KYo-UJ0Chx0_{JV>(M%CIwq-U=5@`^5N%Bw)%qSmo#c zmAP2zYy*qmq9Y)o-OKe&y8kb_-Z{9kpz9YtC$??dGvS=rlT2*enOGB@*yhB>#I|kQ zwlfnaU!Lc^x4wVgTXl9-@7nuxuf|^JwbrkncDHweym7Z`s^Gw}z>6=7mJG~iT=_OU zDT$*_FT@Lc8vpDpz2+`RQOE>aAOo-1r(UtMe0x6IV(+eD`-294bu2dh3Cz6XLe+{q zUx8CG%T<`%wnVFCzs3 zR_Xf7erDyhw#Nzam22ZF0R-$_%5cvrhbji!%Tf_{)k0XD6L-nO#r|x*NO#47NyC7g zciBtKdQ;}#93v!)e4RP!!f2*{-t8lFzkY^qcmL3;aouxr+TjfMguQlr@DZ8(={FTpbMvrxK-Loh>9n}EMj^;4HN{2JM{inCT< zQ5BkyF<*uW$zC@|r;MPHZKMvxk6X-X?pMD>%ynw!yo5k!jD=QR``2bRP5DhqGfwmT zl)nFxbXgkYPtJGEgCP6UV;DDwZjC7nV02g-oYthtx~DSbb_)gfB}$T1AI?$R!l8d> zhm+rev;9@U;rDvoL)G>W+Jo1%MaK4iYCGa4g1vdnreJ_3eR?-qMCU%VLg2>Bzq`np zpali?rE)z6AzhH98>R3)qlcN{ksg8*FWz0w8Uvhs)s}f*4yDYFuU)n}o)F$07Ie(u z2s9i2EG$VE=3=AqgK@51hIbrV61`9}idY@n+LGIxzxM}*gswdc6zV90&zJT`x^ceUmqRL>95noOXXb~m zdJnzv#T7&U6j_PM)WVjn>Rq+-(|`WH1;Bk=P1m{iG%XnfJ25dMe0@ki3Xt3b^V+m~ zrNY!;;|Lv@^c)h>3ST9<2)H}TYxkY_Vn7Xu8F^&>=)942)d+mk@SvcChs{C?8x|M2ogS#Y`BPV zYED>iUX5yx4OSzzI!ueA+#<1|#786^wWKAoR)|I`DiM&wqPAs>qgGY+a_pmg_0vaR zuj%i$@Q%Jwq2X_J7PF23^0+c7vX0b0`o|opxLxQp{qDkDVv=m_Ck%78{Kokpf%;5q z9<1NTZ27(uN<=g5w| zmqZda>T7UN9-ub>okI|$DCdJu|29F1M{<@1t6)SX8%YVcxfbIPU*QPVkr8YVm>`D9 zZ1SCPsE_`v5C^?X3I+{ECW>&0R=2_gC2gs=0NFkeToI_c)D zx#gy^6lwFBK}GE22Rypo-ojARY}bRa&koAB%Z(kUo~@*!@urV}83&Si-4n@Wc5wS$ zx8e2mshfjG7}}1`o?9qBsRmeby&<1T3Qs5k;-u)=>hG}ASWi#1o+k_GiXYw!N*j>4?-jzNRWudN0G8sPO%j0=l z@mdfyfCbv4HI*F14Uz|N0u(c~0BK@HN4f?yK=p@lifNGXz{z>9$ShwIoxHH@Q3Wrw zc7Sv!q{h%sKOlK@9FxRDKnM20X^*qaE(^E+$|k5I7(*emA>-@4~IXFzx?ft2iIM;Jd5DwYQ%=52goDXi5s#)#0u+VFSJ zcc7)JYN?35gHrW7xPLF_FjGDHRqvx{Z0Pp67W;H^8Y2mS3VkdOGp(=YzjNZ$?+>U4 z1M1TtrN9R}J2SgL3U>9ay2XJ$Ocf3g78ykJ4!iv>;^XKbm|jM>R ztb#k8&=5|y{1KiI#7>WU2&{!G5L^%htBV6o=fembmSzLN$@qZJse&a_LYpgfE)XMf zBgQOPGwy!zRisa^{f2I4jU%*P?7)}Uo*=YxJFakZ7!b9@#V+jNCL!+~p@;kI5ELws z17t#tN0NwwI*o7i7phkjNKqXM;4`OeSi_iVoW2c(q=F(rQ1}WwrU25#0jS79SUF-L z>z(i@)5Z_uAE$2C`4LW=DixOextEODgk@{R)LF=Ln~(JyRrzyXV{bBUlAG7TK;eG| z_e&y0;s(wZ=t$p;5E138Lat&~{cg~$fY#j(l`4xZDYF1hP zBltIY=79I&6b$Bk4&H#;17|haqjLiQL+D96e;nj1)+sU~C4_-gH6{|0E7%WLA)1Yi zNe`~2>8E#C#AUQe6B&hNhlKEIe#vu|)L zH#PMHC?*7(P!3@aMt0j-7yJzbHHbS2)dJrkl5rQE5N`6HdHb`KEwXR|ZMU&H<3_^) zePf)5+}B}(0Is-n149$C;*uXK5qZ3tLpFzEwM=?=R|@E50gkfk@Y+>bfZ_t(Y90r| zh4=z}9%?&WOUv7;3>HT%S4&u02;|ZCQM>A=LHcWHUZh5KH^mj*7iRe--j(8WoRQ0` zjclTymqENk9kpL+Qd4(zxKHOx{HD*#>^(xlzgO@Pr#F#JWy0v%^U!2sW4tdcQ-)G= zz&92z4n1B|Sb5-N-WcOZL5w+3Ox@yTi=BxwO_Ub09VZgk2%Q;P#hRBUn+wGyhhS=D z;2UmYrRCx#$7jyU?ZU@3Rhnp}R#=*zZ|2{UKQr-4c&s?=#C zt^7+9m0-w)V&V&;<+!oCJ9z^r7>dTyD9is0#7A3hFzCUG=ak$pR9Jo&Is^)ub*5;4 z@Rn<4J%(mZW;moz{ez0+mZxTJ(C=9K-~Yg{M_=C+GPCho>V~nSszOA03mBG4UI~sn zrO8isCmnJ9)mlp6b!UM?i~o%Fcqwvs(!`CzL_{H6w~srPIUe0D_!ZEldmKp4b6hC~ zfCtl(3LU{^(Bep8vEepJ(Lo%)8ueToKGE+HIB>RVQKP>lrEVLSAeYe`bpWv~pc-i_U!IOS~Dwuo=p#_=IHU1(%~CkB2Ef zYb+86BIrRHqm$up&m027HKu@6Xe1cP&tg+h6oT?>L8FxSoHk! z{j>LC+o7N{cmB7ljK7LWobD`>2n(ePMbg$(s&C*Yl()08?+qfRPrCSm>l&hv>Z0-9 z@IfIE&W_};3b9V)V5-j>F{a6wT%??BYX6-P)MIF(UYnnfTh_;7iuMJ8utBte zir~p3AQkrKT$Jw&v7w^mAj&}XDZ`QZU55f%zXMvu01UmiWT5$Hs&5CoJPl3w=YCF_ zn~Su*Oo7_34OR`*Q@YYZ#KO8Owo5i1K08D|yLYMnp({*@0ugqAwHQ#S(4nax4p2EQ ziauCmx&IN2_Gn~UYfNaL3>O4Z9|fovK+W;Lrs6fVPUu>jurq@A-FGF`yP2GHS(2Rc zmp(CW;bgj;x)Q%WHHTe<_SZ_=?!S@IPhA_GB7@2D%)?op83R~AUATrJzd$dvBMzX- z$udU+!r{WfidSJFq4G1r0b2(F4BL&Ll0Uk|y-H(>zix}04dD`_q|%Gdj9|Q!&v@6NJfdQppGLH3C*Dm_r3YA<&#eh(iT~f~T2N7>EIf%5M=4 zagQk5a!v~o5+cbOR`K*08PU&c?6j0RQK(Zcp9|Is`r?~u?P6P5>@oQ)pmrA_N>x?$ zR&*JO6iwB3s^OD{N=Cn~)}ulUZ61>=7Uw}g1A18Uvk;vyAYm; zo`|&Qke^$v*hl9{!BODe*3}FNf;6*|WEsPb3E786(?{@6(9*(ZfTo)d0qlQoq6|#V zJw=O>1RJ@71JyAogqrEK;K=B=KWDzRlekFF5I|kq9AYwd3Onwk{bQz~pt4LnAo|{i zl^1HVu!UpY*;*-I^Nqy!#k_y=yi(uUy9CrS%&cLQI`KfaN++6N!lt3|@>cZ~&O z@mn@25Do?6s|FDn{im`p#1;oToSii}gZt3R!tycyQVs1~|K>wEiJo3YV?ds6Jz%;5pq-}WV=dAE_4PRQ^K0Z3&_or?l=@uC9Kxrz#a z1F-@W!7NvSJvE<$6u|La2dG9*B=jpxu6Z*d-(eJ?(}CED=qPwX@h;q1cc7*A7ehm- z{D8LbuYc>`zF?KTM8S#O!qDlXh$$8>aKm)?ik#Id=BBF%&__HMNo2s@Qggv;q;c&3*9ET8eZP8ta zBqX^>QIAX~p2=qCkP(4Gt`T3{tm{0QN!|M|p@)ty*tos;$AxFKGu{m33P{IIIbv>) zu%cFlj53keJpzr)F)F{WB5$Uk%+|pl4Z$jCQbA33S;pZ>U15l8=EW1nw)y0Lu(o>V|<>|s+=+Ld~c$@xK>6jB*d(|`8WM_$f7Q$&bboZ zFOV6CT(nWxS8cQ&L$zb23&0<<+?qess0Q&2f5d0_v2xOxw`hX|C$Kmh#Mtg?V8ArY{Ut z=h3I9TZO~Pcb^P(pjpSj~e zt7VRh&TS?d(Tzs4j)oofQ$F^QCN%+NqQ3b{>YX)w63a}W#V3p|*K9(Mb6>I}g8uiZ z!=A2ULg9D8+2qY)Ic!rIyQYz13r{?ZBP3UKx1Lycb1k?c+%qA!Iq}|?#$Dn&W|V(2 z_Pc>S9O#1}yojikMxLmiK69Okd6L*B4F4Jp%R`&O9*7KD~KH2@)^d)w8s*P2tfcUYJiCDj%3VF7-NoxkO#A6$c&1_I#?zr9Yi# z6!ic%XJXG(!vm?X)*jQha6yu|!0?+qTK`Y)LkSg;EEDP`Cp%S-xRLwwAv1>0EKdz! z9yBBo%f8rKQ#q3u?SaSzyMWDXk^J?GvMI5}2;Y2^bG2I&ILvpK>e~E98bMJL5P0g_ zN6Zw@jSdEttYK(L4+HCifhM%d)Z|(u=t9st(sTqQ>siw>dU9o7+IV6FLIClL0VU$dKhe*=%_{!2+ZZaJ1KB3cU9El(3%?t~Ak&G_a&%)wwr5{N*OD$F zq=8Wg%=|Amg{GSkrx+7`XdHf-f0!6KX?7omAyU>_>x*)T7)6m+L|Z8A(V0jiRwZ1z zkn_1*Fl&6z__UKvYE{qHXLYnRAp#N8>t>r~a?~uS$)Q6{^xO-GprwMpiy%z9z$m~c z1<>>Gx%uxp?ujyQf%vYU9zZpQK_U{h>4hb#xN^ls5vO+qQSQkEj(YR*JcK@ z!6o0BBhCcuP^DX7*46{;AhhgkQGJVO#8yEHUP=Dcg*^W=%S0$-OS@wV2^qCB&)c0i zVQ#&rjg}UX#wDwHKT);j#-nUANAd2Ytit}(HNdS8Tg#B02ETm4!*$W)HL}glPqwoM zUx#Y`Qc?q2tB?TjYhEU=@pL}*33sr4E*dbtFdhxqyA~Nj)q>ON34ypBw(t~ad(z@G zn2r(w^R%0~vs{B}q|H^-ASme`u4U7|pa6O+Px{_Lu=R)Q&m882eM0VrgxeYiH9~;a zdosC0lbRl2=KP$dPE0A$WLpb0OFR^Se+__Vf)O2~gb3ZZmlTlwl+*!TLqaWQ1aql0 z&s(WVDXNkUw9&-GqCc6eYicU~-2N8qXCyeQ16KuDQCbC~7YJn9gj6VP2|kd@K8XKb zwQZ88ob?(-Cc8w@Fh7=|(U{eB(V;5AJgO4u;p@?*d`hRR+rWe1ixpvkt zj@ACEtvT%;tn?9A!D2uV^RkaRY(jn#D=m$c$MNa4^4S@I~(V@TJQWufNK!G6w42o*Z6tFhbVv`LdqyS57BFu|`kt~=F~1HtpM zmD*hPiQ19{#f$Gl;e=lVG~V;J=^0r547i4A<5Wv@q@%vNMy6dg?|I9;z5@54>V+u3 zcsV`djRT`Ecg5(>6#BDefy$r;Ro@Rwr60OH>g;ZR!*H+b6Q z`QTAnTA>KWxo)()qqRk1Z09Z?G2MX2^S1k#AWzG zT~xdJY@(W^8VDBVuG*bTJRd5QF`tR*yvjsrQ01??jjdKvg7&ds6Tj+5{n*g_^v*;C zV&y=Q{-Pm=mO>&Sz9hSn?_b@Ie>g&m5WNy#BELx*JPDe%zB+HxU5b&nur@pwel{Yj z<#CZBmDb1SVP3(Te~LFI&Rr}a__E-lNj|^yRe&PVf&Y6p$?9>~giDpOE* z24wj}LaULjK@->)3J_;fsYG{iscdeg0cL5l+xgZTub`RDc+Zt2x6H%XM1pT6 zy$4Rp3USwZ94^0O$WY56N(^nd(-c1XRhF@XrA+kR-;EaIc(uMzD%9tu&KSqwo+IL( z{bP*jkBQxy#;f}hy+%sNHRQ85Ov`*O>oUH^Osxe1Xa0~T9uN;_(sm-h6z9q|myrt# zo`$PZMcL|)2Hu+QfBv+q_QKCvtT$Z5k{pWS{By~!op2v(pU(AV`a$TkdQxZ^_)SB1 z9pSFZ&QIF+rEh;8keb$sU$nUa@#!?jDf@Kt8onmE7~ot%7qMrt(exsl1$y?aBMPv+ zLP-yxF1Md|+4`hqP08n`$(gOq7yZ+pZ|(;}QTv-x%=>a<8(I1q;^ z^~YwVQ(#QC)67#ilU~-uzn>`qjxMkB$30)n3D4N{_pu)5sL9olE|=RZr0Cp8@p z6LK>=23fft!@He}H_#uJ*;(QplsWCy%-B!JfV@Znx+}}&!+a9;*viYy-Zwqdp;`ch5H>v zzpo`%?!4n-r9rFCn%mg7jQnM-A!%AgFSXMsK`j%yxM4Z%yDpC4jRB`&Wg$MIg*F>r z|APNpCBCOECcDCEo%N!jZ$8XR`T{~TE%nzVB07f>_iB}uz$KFe{Rqvdy#9|)8qb(N zcyznfbbe1FISg>>3lKSBWhF~k?UT3Jcfd5JU#MpV)tp{}YQoparj?td6s&R-}AZ@7nph zQd#g@W4@ZUuu7vrFM*mcR8520+woB+Hn|W4IeC~3MYEdqH{BvFYgH8}adtQ;I6R#) z5w7XQ!Uc5Z28L_L!z>w+_Ub0S(T7ad5s!z=yKK)7r_GiJc7yJKcOX(EI8&bQv~hXI zT))qDFy0duR4Ir*oP~xp2IJ!P!(NW7zeD)%?Y`E)8QmkX%SJTyXVu2gBnG3;>I!dZ zEq;Gj(#_}XKwKN`J!mFcZ_2SAKPa(piCx^0hqg7^kK$ncWwzvkvbj; zBLC1(baR)GjVD5q7uh^#GM4mNpWC&=UWpUdRhkOSWyXX&m>=-IY-|+hpqXiD;~I=Y zxpnv>$X8W2pD3p)DC1z-jGJ74Q&;%(1%Hb+y}IKzgIEQ3XGry3Kznt7ZG$|-Gh0Eq`!-oK_cH+p*G{=IEYDsb1dlZ;Gr%Zf zHhkIaZ)byL`iDK*x>fal2y4?sXEQX#88=(p;otH5XJl~g_3RPb!!B+2yP4_cz!cf( zZn5tDClQ%{Eg)@cx@KUXpK}Zmnf`n{xI!3iUm^M@fCL8bW6Zg2f)(ZnBrLw0dqtge zkB&e8Kr@>JR-%{&dq9e%F1gI)qg1&p<|Ee+EabA@KMB8?UGo*M_QK3m^_y9PG-nT_ z(xvYBBrIgj`B>ljiWJQGpCillhptbRx}O56(jqFR_^$L)Kw&?YrS7x_mts+3_yG4| zoemftxce0>*fW(K0<_KTw2Ia%ftk_H?y|rfJFXgCIT|%g3wh_k)gZo~xchgO^9ALG zrta%NGMMl}HI#&}dDI(9VNrCCqscvnhYc=sr%S*%wbyeE%~r_rCw4s{q5 zr%P+cHLK&cj|F4y^E;fC(JF+?9?FQbV{NUGlG(@U0~njtC`De`xo*$DPU>{k{G#Z# zy`IYfPBdtSuhQvYj+DeN7+BR^nwq~(7^k;75F&gZXC-2=O<{nG9-z}}0(IKfc1WcD z!C4u7SNs@(8SWQC_NSA%9+?C@(>8>R*{@ISd9eoqZHfHK7R)AkW3Yc&kGf+-3*VLK zh7+OFiukM`ZU3f1K1ajS`LwFZgfHvlEU&-@PDu}>zw((XduGp?19H_%hT5v4m^093x7lt$?#q^^C#Pulj8 zSln;4zDfNTLa3emD#w@yRWNbj8tx4ZhR3_xb8Ws}GhN=&fLu!V1qK`bN+P{_ONkbL z-s$jGBd^@dsh91{0mM+ux)6X`kzZf>YG6`Hi{R0dhFuQYB zv%G2f(qYN@=(lY>PItRO%}Cikh?9>icg>AvOB7DxZO%X*OcJ773^%W+15)iZxLTs^ zHf;U>lpXEJ-EH^;ba;QD99J$0V?OPlE;M!8`L;gbfIl=<_dYWMh!;q}Z;iZm|7gMU zWggSx^~*fE6)!l0wh?*R6BW$f{zL56lb0|sc&IDk+XNhY$GO+Lm*J&imcT zsKHN5X0P+wfX+cAEtYSPtBPg8^d1<`E3+{G`*GId5r$GD9A63%j&8@gTwkO{cUYIBB-{g$D%(B1DEnRK;zicFK z6&-E~c^xvs@n_B$V}vXgr0HcmPa>}ST$YB`X{Ke39(y9ElU*%_g=97Jk5tMKz|GJZ zPOc!|gG!z7kxLaU;17G&C4R=nsQvSh$3oyR>pA&`OR5Rru+*l)evnS*8=o1cT#E;8?Yxuhe5* zH7P@cAb6_%rA$8|c>2*)asjkaa2ca}-3KZdwukPt2|oDDw{DjP@{-^9`y0NOUzTPb zW~TH6_L^Q#ax1c3rlSg9Z#ddN{bXPE1e+uWAcG;JtYqy*F=7JwXkO;bF`84eGH~_j*HqmE zNIyPoC}RBu0xt?|FN8g0QOS<4?Q2mToOyyV8~<|gri|DOf342nO^%J!($20(uJY`& zK!tcm(Ak1+M{aTZ6;^q0m7ZIuZDXX>*Xwo*y{z2<0IlngPU%q%kqs>c!KXUdaE(^r3?FnFN>DxrP-n+vI zkQ8RRMjc!ROHO)X#R2Ax2(O1dgiG;WN6wvkD3735so-WRAddb7;-pxyFCVe+2v@%a zT=u(4fL7K@*Oe(T0z`EurLOjF5a4qfiizUY zFrOvK-%t>6F3sE0z5Y4jPzsr=-_1yAh_pR?mqmP_jGWdvrYZ#`BSeRMxFioG801a* zenm{jF7C}xT={3P2x{AcP{V{2=xQst#2LF2sJi593S=633XsVP6A(8w2~kOg3T2N+ zzD6jwz)4hQWkshxgS5_hxziZUQi~@Km=1=KtS;j^6)Nv>N95<=}UGs+XoYVPE z`VnkU(IZuwa{ex`+#_Hd?7r(~N)5`~U)=wU+C59UH|1J!2Y1&a982r}z-U&BEw(L; ztcRoDRzgQ*N#n5@{kdY7tYl-vDEuQaoo(`slf{JJ0|@SorQrlK05 zymET&(48PA-guoFS*m;f#rwaEJ%yB=S6r{b=e%vVPnGU06}RGHng7=J-|V=1lMzR9Ty)HFs{1in!c`TfCp{s?e%jmw_0 zksTDSLghjLcRh97s*_nV zsrsoK5AqS7_D$HD`JnU-@Qv8&x!UDLU_epC+RaT?#Fbocf8S3b9Ao^wsXtrbHhPmsmc7#DG3Il` z#Zcuoc*l=6S(Z4W|oORdb?U&~ zjA$zB)j|d*V4~K&nYT?S_Jd>~nF;g|j(g;ItrdRh*U@BusMi$TK>g*LY z;=YUaJ0WEF=Y4EGE9eq*2cF0FdzlQ9;0MR_(EDsBzSC+5ZX(})&|+P$evr0}y|RC1PSU@n|Y40tj_KQS6{okjx& zLH7uVvaoM|NiZMc+HM*Vo&hl&n4#bwv{HFG(^4%1TKEsJjJOC@4T$<+dWC5;a2^^5V zAA3|kes2H3WeX{Cf=*dlp}TDMyUCDC)6vlOQvJg0%qM&`L@IaT4}jN~FgWsvbnI%| z>Zs}p*#waJy{x8IlptlO2p#++v*$JiI!3m$4TbAvB<)&_lamzf7s~AJeWoyoSlqtr zdez@Q@rN9%E0%>R(AQ$SwrTjr2&|4|_=3FB*4;==lh3ioxSgbmXD5l@4U)8mHD{s0 z-Hi?&u8ECF=ieLD%Pqr?NME^d-XM{Q{#pwB2tV>@!3tm^x+xZ1g{hp1_NN2CLW6As zZN(=j8!xCXq*rm)G%}FCZf|35?N`dYvCwCoNzr=m#t9}2_O47~L+4}wOx|O{NE|Mn z;nxV(bQJYNCDCJ^iylBj@p95h)IL86^|6G=p~zfPpG2ev8gb17@*4lHexotiF#}%!FCvPhVIgUsGx&}MO#wM)N#UI@`}(2_u;g51`lq$#%)%;s^SbM%08 z8OZUVDni<3SDYUdz#k-YFPAt44qMWp+2yYy$#eit1R<^^IOv;6su_Y!*KMuA z&();9p!iAs3_RJAjnMPRe)JkbMF3?dws;Q2QxvAIb^OVFs!mbSC^02MPAF7&D47g} zzgWs1OwXNF1O;994nhyolU>X4wGw`<#ZMpdZ|Yb==m=m^7HSH%jy;?uavNbMAJT{r zoq`bS)Sqta$e}BDIc)zr>A<_VV5;x^_vGv$I?5BhxX$sRLXl_(C{C-Om5qGQ(Rf^@ zCqdl7eRODrSBTg&vHEqy)UCf>>}P61cI>jFl!7V7oyR9V!i^^{pQjAK$@wS(2ABY9 zP|HnRsBT?N-v449jCyQpA7#iN0urf{X zK<~{iBKrL7CoO&7PI7=a&n8hBdqQ{r`I*TtLwq#U*u&M^s5JBhTkvFNMA`=8dv!3# zShB0X>RS8_Zg}dd@%&{#7VkTyk6!)uL!)S}u20AevZvEnGOPm(weUagMy;uGi)fWe;pJ_ZE zw{&}+u+S4W?SQJ7vlUECd}njbm_q>%Za4H(3t`p z*}me?|3ZF^9d{=J1>{DO?D^e_^xCF;l-Ar!83vFL@qO^TvCO9_ks2S0jc0;&?rA04 z;K5n&{<|K+p>zcFQ2Efe?!6Un7wGTg7vpm$b?%c;3<#j* z>lrwQ!gS83*pz%})vrZ$iTrWZ65!Cj2N{r1rXx%ejP#5+dt;O>_g&}#sqSzd<6EN$HtIzKdM2wt)? zX-}3u^l#lhE$Z0><2O3Z9c<`p7eufw`y`jNJ+LqKsVtV!ah?82j@4s0jKhW71DO(G zn=u<$a56vr)QahhRGX#9kYN=4nrX-DLRIh~6TeQg#FhsT16CI);OwC;f7seP23v;V z0FQ?8vVQ9(@$fl39o$7gph0(U$s7C{LPqMtS)bNr&nq%%Xx=|~RCtM6e!B$fuZ~k7 z2w{QS;rOc_LclL zlS_q*rnrOS5D8*K+^O*2?kw>X0eJwdG!eHMtXl6?v$GN!>ORs~Ic3vf(Q}q#0loh| z_P2-qk&BX2jv~DT`*r#A;znXqNxHal5W4ArNI0O7HCWEEbgoT~HL` ztt;~E3C->;1`LIulS+b*L~v;b3AX%g4MXNshmw7Y;GlU}SEJJ&5XJ)2fmu^UGzXW6 zgg<)M{|>WP&W9gX{G;K+{}dRVA4>C*pRWK+p@g>PJ*J3}D9_(*Jq?t&39wfU6x9-l zw(K;99-29dV*byFlwL=|$MD{r^4}XY!rBDUtqv2u)RPpy@aWw(~XDeFROR}j(G+kB1Aja zt+t5{K+?MT5D292Wc#~=bM57-<75utq6n-5+(7?)Yp(W1=0n7iR0$<~i^4?Ue#T7# zl*4@dF<^B}0+FVWkLQGUMNbk9qfm{xJ0p&hh=(V{=tmQeL4W0`tJU%-!)SL^8K%_mGHw5kj}=g_It={~t~o zde?%U@yIAQOB34lMX+0V7WcH-_gwqj_}u#3Np&iK^=@#=W2v#b;L~NztTos$tQJz} z@Nor0`;tkJ)`$Sd5dzYH|6|0Y9gm9mWV7!jr|N0KPlQfNkC}nMbAVnGLXp##qq+= zHo&%EMy`7O)P5+|Bip4Z`a;(koqTZd`E!GJZM9d-CtMW3^GrljG+kUSD_y+x7K;L@ ztmfqckt$(xqMrQ`R}a|;--z6(D2)cDlB8P%t`h(53@DN*TSGN)@)>mo3FhaXct3dU=$!Xhzoq}pF1Xu@EhUwS_CZyl_HI>N?4Zi4LSNU(`Zw~|RR6U`2-EppqK`jhrA2Oi>)+5;as;8wC5 z({As0SYs6$9OPo>?ap*}jw`KwPhqPx3q`iV>DmXsnw^0y+pOs)5jY=5(i8O_oO_29 z3VGXvHfiTjB(fbkg&MKjRTJ!OiQD~8UEPF8-|JFPX(=gEC&w#e2Ss@CO6&1s2AlT} z&X-VKi^s|PqB9ZGyEjfwT#Ju%xKqgM3j-o}nKHmNGTW5k8};6Y0bydQNpriopG|&= z__S-)0LFgFb%ar6Ymdu^V-o+Ba^{1Ya z8x0iC_WFg~RamJi4VVnfu#kw7(uGVQ`RU&h$BCd*-g}I+dWo2IUc96r4p?rav$tHn z`@-bo>fb0VjSDb`!H3f7ntLEz)3yIHOqQH=-sZ!NyH=g=8;v$Y`a>$@GG!N%{fcy$ zC&*JjM0BZubqWHH?;@@~5zY*`+{-6A80X5z{rkwv7d_Ff z4QP1^r14F$;tsMpRo~mDnX3fTNkVa-WLm>8Y=E*ZA1vm6q?=|drMl)Mg8BQl;~n^A zOdihm-J;hAKxFEmno0@Ff_9LC9)@VnLvTeY(j!(o1%alk=|$EXO6`y6jxUvE`wiPj z@1gDV$pfE#w{DVbi{63IsM7>y!``2Twj8p>B9_by&HNon@L<)%Ap9zSmJUEPGWF&n zIw%nB?xugJ7kf{KC5z?xxFz#QdnX!~pocykH{cQ}#vxkn;ebv9TBq9^&Of<7pVJ=M z+WV44-U-eN>WXIplv6ET?DjevKg`%deF<1j@Z#p%yjt=rWfZb_(N}g2+%ZEFP@I-< zl@f&VPDq(s3eltF;`6ffC{mJrMo1$wQb~{gF zs!VR$`YwZhc%}CU#?UphjCT^Sih23MY6>08?A&KDnmp`c0(Fo8pV0Sc4NZ;AD)5GU z^~F@Y?QkF{zKymSurs}R6DS{I18EUV=h&oxpJ%g6DEuT%Psmd9xgT5s(f!evsYso4 zt=}tpYa`lq{Yvc$(|jb?vcl~EkHmX`CC8)v+c5>d8`1Q`*WAZG809w?X_6VxK*jWK z%)m-MMGd$e*?3}#=Dn!I2Wf&#c0}wmLfO$V2X6dIpn@j|esf$AP|xs`_h_dkgeEh2 zRK|n?yK)S!vA<90W3yCroA;Z$(Av%@vpA}J8eQvR(b16_$s2|XfpNndy^lbhC*F&9 zZk#Dv2!P|QjmuYAhe{|?U&53zxp#u=tVgb)&B5g8B!evcKq6x7CJ4T(>U)vPTB3J} zhQ}`6hU`()){BlHY#}vEG{9wWF9W*eN5|`FC~M4rFiSFq+AK6aS1+0Mc?G9|s{vQ1 zat`RA`uiDhJf*YDcD8*q=cO~ZP#ln&2W}Kl6MS49ncA^E^gJb$m0ip6g=`XJV7kWjfHQYp3v&aMZ#H97|gesTzmT@H>!p? z`#bc++dC_r(i}VdG<=p%XyuedvDU;(R9yfratUx2-wlVHZBBT!5=s<9n;1h0TNntm zst>|Ti$lBU7<&v_?!I=QkGw-0;NjuE&(FZ>m?Hj1h;%EeaL66<6p_N@`e}xFZUy#DF6Gwy1%kMXQ0=JZ zUhbxR!=PBnI0QNhITNZc0?!fuuTXWdhvyB~$;9X&80Vf!4JP7hBvBOBluX4GddhW> zDKGxqm?6O*a$;L><8nw19PBNIHMlDqLlYv{cpf1Up6YlW2vQof@xJqxlmn9?Urw ze^9qYB-mtSaNsKl>>uzj8mOKC&1k{aYHxeEqGh&w+>{}jER3`OX2??>l~b=iOHu@b z+k9qCYHA8K*>E}7!eY($-GgNWjz4<}Bu~~`3184rXf2=~Vs_I}7#kBum9-2xG z3~ILOA^tYSIKeP9p(krl>J*jE2^@4ntkz2-`K5B&A^Ve>{7MPyZ@N8GEgG8!Ay&;dW{b-ICO!vDl&Ig-s#$Dq^YVBbdL^w zRbEXSt*t3Q7nAfZ#Y$AgXyClfm zm%!#Zgod!6{s>c*;O6vGE3hQdu;h0%JZ-B;LCL2Jyi4mo5dXs#lK*EWr)YC-eTMp6 zmt`a^*c4BB0(U^ED&Ph4$IArN*yYE@>8gD4`9IR}Z#dQUpLy)3leukn<8**whrd{M z&t_JuL4nDW2EUs6!FK&@lVgD&InujR`$IJIYeO{v zVTDj5k}rhiuQSnmC0i(FE&~w%V4fJOL9cAda~irSK54SEKO3~J({V%dX&ADxGX#m) zS(KP4e)JXbxoPB-3TrR=6SDhT)!b|G-K8y5nV*t$`Q~qwiLGjJC^GbUTZw())j~zB z#!Zd0cY{W$VWFZ%^3}p-joK~`>HhjgtUGdnYaOShcYs&r+rjeN0_|T)vZ8oBhhk5wxkQMDv({pG4JqiziwuOpjpi9 zf_5(ov40F_1GW44AGr#qSpnnywfc8(n05=SLmO`BJ6!K2!_fw~GDuf|tj0W;6E?dV zDcQQb^^JghUDPaj4IW5A2}uZ({iD7 zc_3PHKt*Hz6V{3PRDhO?0x4VtLh&zsB*Hj!Ff1p zA#(%7ozX5$!6br_F8FL84eF|3%u>&i#M2P& z;Yg)04AIv^y@J)$YizDOl)p0ece~w(qC$V8$!JtvvS%^Dr0BW66vHxKf+d2(wp7P0{$pGoeqsCn}`m zbapcpKf*1(CtgUW{O_!Hpya>)`MmHU2@Q^;LkCt?;3J6x>ALIJYGg2{`bDUWOX;}X zJNQQn62(xlXy-dbOg9R>a}xFs1|~f7>*&NFXn9q6ZP;LD|vVa#9K_*l4De) zoUyiVHDCtL)r0xKnZz4MXv+P*3tT1bioZGjo_(kmHGtPbTU5BukY<3Ff(WO8tRA^yM{a>a; zj+Px}iOrAIhU1%iVFze1C-LD+X_RL1;fHSdkL35}C+j1IBy&g0ZV!5IQ%vZ0WXWEi z;XJklq;DrNX2ssdnl%XGV%H&6`9GTPz+Gp`9s5sj7LER#LZpp4%0AN5(*tZ;<4HFL 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�X>P5stxr>p%e~c zX%L0G$P8jEb`y*7Fbf*G62_JXEe2a!%Y!*S~!qH2nz+9IndB|tT7vS^xUrx-Z>fg z?y~@D9TMuXz3X-{KvV&$Anq<8;lgNuKjMb$5&Z#nlGEWRcTN=Pr4xYo5u{3n$N#j~cpP)xI4a z|Az7$^l?h|R(>{+HAq_Y<;MVsQ2>R$Ak{>48!Vk0_eE~WvwViM#kkYL1F>Y$}?IctbBYDbu2NmM44Zy{U zzQq0i`E}uc6Ai+j(3PA7Isc!rS{soBxIm}^;6LfVv07rR|3|D=Jg}zt|B6R*BC+2N z0N~U8Z>(01m80pZOM0Kv&LW+sFc>yG^E*7&F9WiKn`0huoQcot*cqNKXn?DfBco=yrpoFbx^s+bd(#n!#Y>I7@9Y)I?+hj16@cMHYk{dA}{nP6m~wAalQR#gN>Z^=4oJed{45qP8)S>2d%Z?S;40|2E4Ammav zH1B=RT72&t==~s3{9YsGROa(iIsq(Fve2;99VZDRZ$Dw-%DW=v~M{8rZ6A zsFt_&sp0VSzd$P8QAYgLeVLjXTkH^0@SJR?9cuRx=40Tq8=DkIP*>D4{Oif2Vq@qtbShn~U?4b3vYi@inwn4-x~q^b(CbJTEEWml0EXO5RG|=# zRjEwBv}lnhA&^OKK{^eB{G%vHBjcA#+%WntSf71<3fB1H)_}y)4WDBrR#1w@D`Uh^ z+lM?6WGi1HHG`Hf4Hn~s(Z<%{MUBPkwnz`35bN`{$?)18TQ)Fpe7a%}HDR%W{X;aA zp1D@|d{S=8YSbZ#SmmaEOC`%%MA!=hF2HFxzXaLiIBre6N*!xwvROXRq@Jke`ta|f zdMIX!mF0(}nq@J6WoJV~Nk?yVw#={j%KCT#e3pPj{%JI6@>9|4!E=arp&`Vup(omG^d*6cs_Ii5t@VCE^WTGVmZ zgOJY)Hgsd+=AX6U6i!i)clYcBg*Z0VDRsxal}@_3u(&CNN&XtEAmL?Oi_Ot-iYYU* zcAqG)VUXpGVggd)fR6#x12|HuN%|5MtCz^Wt=j~Ws% zINYCn%Kc0l7%_+rCR?a6f<9tolWZY_bT5dhzu!@^N_M7WY#2U>%C_>vz@qa{qPRp3 zB$s}BOtb^fz1K66Xu|82gA52zJ#fg)plh<(-d9*d&Yq zCTx?Ah-m^KH&u)DJpH|r6#)_t9I42SrFUu^Zo+YbgA2B~ryO37<`g{H3dU{y?;byKh%=je<&a$@O9m4WZUZsk$8K&8nM#06rH!P z(%$_ni6a3{JBZ$%Th=ZklK?$5C~f$QkLSyWV9U`NQUhuq_!iMzKlYJbx}iAZDCzLy zHj6w9mg<{GSFSbj`=NE-ZYBPiF(sCQwnv_u_B76A8XT=_DI(%B+h?7j=qzzq ziPUZxjy953Sl#=~jnmmMm*XH@tPk#OH;al;MA6Y>#@n6@QExs!Gys#T;sdbKuF@Gd z458ZRx12S>lio|C-?SraM^LXRvOD_E@xjL{?UFxDHZyY%zot-sX%q*8?pR?~RkFb++Vht~;(qNgTE?sR=``K-|J{nFpisch;~DCZ}}k zzq^5gb8vrt@)_{YbX}VXr1Zt;EGAj*^1=!36TIBlTHokF#Y;TQtld0FeUYg~^9c&x z|9}(rd4pN0x+*1V8T(-!ch?5@avSTFAzc+Mk`9yldVKj}VtiMB0hpxDn!~t0%D4|Ybk&3}x9W#`F-Ls3KtuDkd4~9M-x~qX&mr}iCN&^< zV}G%TyL|0DR*kGvB|NB|2Jv;ch9a`}hi74CsUIOPsn&EWVW12ME;hk#52cR%Yr?12 zotK!0=&S8vo){cdRr4~VmEcu6VoD%16AiF>h z-jWiBY~+^@w!&PCh}{I+vssyIww0TExb((b+v(=gQfzDLQTj++WS-mSDiGc+IIrIn z%m4{N)&vYxW*4`Te92d*LwLj1{0W$08`E;Yq_+(lJ%(K*tWa-nlLzS0@Lkfd5}|&Y9@$+y#*(X&r-wX=(pA$;F+QpLj6r1# z6l7EX$xByd1Dc;&MIsHbKjDE?=+b&l7xy)KWHYTxI@8i4N>TOhb>E4NVl-grpmGYI z!@7xTad8Ay!s_7QpHNIAJbl06$eeoe_%c4nP?*b!!Z2Bby%WjfI+?rsoT_Wu{X=^8 z<$MNWFRyt0+Pij_aOzsKtK0ESO^ABkBX;KvLO@`}px0Gm&Aa0f=4)+4u()-NaAg8|SqC`l84@j6^$d13 zbZ!B`!5;$|Nqq0ma2wh;f}S@aX6}IF9*WrS*FFi{i0es$LkDdxk#aQueW?-reWwvG zQZvrHOn%uO2t^%bFeb&kwUy5AqenbC49lKrFSS{Eg(tmGV((gSq7VwO9#N9@1pt3; zUyA6n6uZWc6rDd-QV&_(Jw3JGVy%s}gfi$JbnBU037bFSP8>$MRJIb3uQdH9C1Mqi z9U{E3$77B@y?=lA$oF9K9W5j02{?YYu6$2`A+e^?Fb$FQn|NLCI{GR$Bckp_+;!2o zb8cVG23d~bE&vzTui__YNA!l|3BkT^903)9aip@H;zZh8G)cn!+y#>j?Qh;G$=9Q< zZ$iJ{*GwLLt{HK$o5M-(MA0o#6Ad5w*K|Y&U1@&7#F|I+)Y5=+pH&(GZf7|2X~|^S z3O+%n3yW7A0Vf2(AV;q^1;4P5Q^5L}>{`AB(wu{C|N$4(1 zQ7!2_#f$0GGRKq8j8N6EMAGu{PQ`kE1+>K@!gmaNocnn?N+P_&tJZp&L|V5@q8fB&Q!d4*Hay4?qzab-U1K|`H; zOb(f;Oh)D^txQ4BDow8-tKPn$EpC>}ZuFX?npGw#psfdYNO_|*;O`L6dt05uO%wfNGx8YaIuc`W3Lu0?3I z9(D{XyftFr*y^)pG6v#2PAFZShadtrc7I^!s@|I^iW+dR$7Fva)qDV0cThuB;f#-P zHv3${tU;0Xuix8a;%r4IB*2oIHv0LHlN)NlC8~>5Zx%ozQciZ>Mwo?SMcFm7X4JwD zLPMVDJ2B}Zw4_~|Fq?`ZGByM?U7#v90&(p|gYkdmdw8Fq=H(1n#X=G*pU#!tQVIAtEI zY!c44O(8;1>*c2=uH9#?FPZu+r|zy_g2hAF>z~oriG20Le|vg%Uv6$!UtbqtAyWbw z1zvf1QH}B6gB(;;)w_1FmxVKXF9oFV=t0aV6n#rlE6?^0G$DAXDlXI3Ze6z9-TJj- zn&1?Bv?nz{SzZ&>b}0i zZUGtrKSwKyNjkLTlD{V6zV2CYfVQk#yJAkv`RLIY933}6wwVNK_ z!YIqsKuW1|&(jIq{Puz^rH+({MX3@}FVpC0TcJpEDN2h+%W6z8nWn9IC=BKxi>{^t z!)AGa&+-_(`pt$(UV}TOoz81p68j=iO|m#?UdLGDdQh_TZlI^|?j~W_I7W?HEVlt}&6Bqp)eFbjvr2FKpq_vWF6c{+q~JT1FyfeDDQrYeN_ThOuS(a7oB z*a^0tV;U|jZHChXTcbz2;+9+eD~m_6I=YcMgZnwu&fnA}+5rt(#ymAL!=jE6#kz-Z zyXAS2w%>4?-k1(e(yMBT+f(kMar7AvhLv6>a~jYUj~I`nD&9@^qhPAJZP>$)@!unP zAe!fL%hcKENUyUq#qh7=JM$`RYO!JrC~a*!&8g$1^bld0jPA4SvP!%QNuZwxuyGu# zWNLkzY#kyfZ8&+XG_PseMr@vLpg)ob3AdcqVjCqFlIkQD+ilBigNTv3&-d6fPc=hT zcCR7UhZb(k3I{goWHG@+_Qby~h%=(B_DN%^4sL ziDWA%qw$V)k~RlKLBHKz@d5=nHD!yZM8P0nO4w4-F$fC;Upd!mK48`V`w2$rj`L9;SWreh3wHTf`@iHrdlFetA9U+u&#WZBa?i5v@(B&X!F zNp0UhN0Lb}ZjGS22>}*e#(yY}m(>wtfBS>FHURM~F-4S$VbtoM_C1 zrK(T%5YSuGi&KDy#I+g(TBV3Efwhme+$3;Rh)dyNhL#7+k`wNB*VF#o z#?O7uc&d^cnSc_R*Zv8o2i$CoReNFP->;p&SLdv{B`_QcVi_PsB|_Ua;pjtVk2{2H zM&C)uMAz$o9A%IF@ijH^*rZiiWpwyKv@6?gBqyUT-j}s+>G0Ogyfyo+nI^YN_M{dZ zQ9tdiSrY4HXG^^G536uNdu*ME+BOAw^hYc)a%$a9Td%+JEHZK-R!^z@Mb%WE{c8k| zi`Q9GL@%VsLa=twDMzN~k%Z0nCQ9Nw!FT5BjkiHvr!w!9%`t_Q$O2fNN#A?SDdBbo ze>NDd6tk3oVp$C8kXo7x%fRUy-=P1SkTgDZtDCvn?_#))++T(AdM=%1s*eOG!jNH5 z5e8qFulGdy{@TQ*bP(0v<{cEIClAa*@s9c4gjzjaB69BJAeN5dm%lOD(qa?lM7`Zt zMgqcnD`)>X3V;8rd@owqFatXif@^q&+{)lgP_vh)3bH0s3D$zt%8h^Glq(KdP*W@& zop-?74<*^)1nqJEN`{2Swa7J)|Pkxo?jvl{Q?2Ln{3 zJdfU+Z|5B$X|pqT{Q`T36SwDJ;FmbK>VTLw#&0Hq)2+6uZfJ9sm;^<;+&Q-0O7}V? zq2lD&@Y~asQP>zdS^6HgBQJkKd5oAJ@)%IWK6h7{NWpcVn>U{cPF8#T1fh_YeyhT& zQYOy!NUJVUDImOl#6A%aanyG$SlBI2PCx6u&hxy%pqct~o+4P1hMf*}Jn8T|e+^pd z>N}QxJ&yJ1_OXYpr04t8JY5G-+c@l2%68A1#n2IH82s~VY(+pKHUF%U)pg&CF>ta- zO%1irW_Ews(zGBPb~$+3ub`n~$G5&h}B`wdz!IprO|DXA*hMf$QgCY#-nuF zJ}vq#5OmDI^0dOHx>`@m#4AUIV-i1lFLCqF3?l8kw=DJD4! z|5>T?b1cclr7QKljoNwL;{Bdbl*1Bqy~JYkl0mDOL^dB?XO}8LmQaDno-d+YAOkI> zrhP_6fawnxNMAQrYIV9qkU1QZpH-E&>J|^n@BN+cpin}sr8WA~j4zO}YFn?h_`=;` z8Q=KtWRpf(T3g#$D~J5*$tbwQ6{wXNoA8*j&erc<2pC+#*&~S5+1Z@D_pgmU-+ygi zCv87XM)Cz*N+cf6UYQZae%0)_Qrf|eZ=@6?@-|tTjfUQHeQ%-(rtq>q*Q<@orN21~ zmn4f*cdkM++a5wgr^6LGuoPOl4yv3gArygGh8x#u0Yz>9s-Rwbg1(i0x6BC(8Z#E- z*mmj~21P>l^zN#3qb(5sMvuj$QfHy)qL+`xE!~6Wje&u^BXqX{j7 zDC3SN%9veMr?~2AD7!S!Ux@atw4x0^bjN4M*liT(JmBNT;3|P-Bf3Ajf;D53c5#%H z0HRbUM;9ksZB1UD<=(T}>3Ce5j=G`$sW&ehtU7`5!C10)tHtAqSqvzIKs-D$H@$><|RFZ(@(DDbkRzn!;D&Cec z#L0+D;`CN<{ML#fG=Eo2pq@BU3aA$Te_c>zzXUDWK>B&$9#{X*)<|Z%V{do_0N_6f z7I@o#JV*Q#`;Rs9fAAY21-wD(zig3eS51<@hnD`gEi%h4nqXCH%x{kS!FA_lq$}&M z0$xW$QaHPdV`j5e&5z>1#L@&QJmSE9D0DSggLP_9m;h$*CpzkLEOIeA0sm!yiW+JK zwCa>tB~5Wjfn8-~?f%LS1>>6wpNtMRCq$y_p01aFxgA~GuMAcEi#9>ssJ`TGiUaa~JeP5kKI^$TZxU+o{^4n5L6&HT1T&-G^b#KFjX^=J9l0KmwmR%K-4{vZRdS2XABdDsM4e16PKJ}^J?rDxXuZic~%%3Nkj?UvkIC^H(w~T&;tJ?e;gqopvl4+Q~W?lwk zzrg))v_7-zt`U5gl3}=tCqILtx)WOU_jK{LAlO*!)UTkH{YYsAB7E?}Fay6YKD&5%e%|iWI;56{5tMC`Znj^on0M&mJUleZ za^&OYrS?|}6wqSeLCdYO@vIdI1UAA!2_+qJ`@-_qL)W^2oRHkVqPNNCu@on1iPaW} zxnj@pF`nbbYl2jzsJF#*qcX!!R**NAb4FDCTO(`91`unxRuWBgnerOJ-Q72+sL{8) zq;`lAO)8&Vl;pdhG=chF_mTEkB`FepWfDl)G-FWjs)=#9UvQdZ(Sx+IYr(lB?O$OTT=xNr`Ri#g$8R}R~U#!1;K7o=W9YI<~^9^XXT^Cuz^qo2P+nR5Mfwh6a=!p64uIa*8C4{Z9|_wN@sa!RioH1Jyq z&w#X*uP_U9A_?SJb;SFGN#Rme9EK50lQVga)O$`U9l?Fo_cA{I2Vw)APeg}eEY10t z9AV^@dtf{B>^8^pb{>Be*j}{;?nao;R^4TchIusmrYm{-rf1{n@w+pjEzeUBI((4! zX@4Ux&e3n!1=&7AImO)$I1+ttd*}R+ts@dnfVC<|Ro5w&f;tON{Z%JR0DbK4`7CUY z}q$Bf_1#Wo)Iit_oE#BSg_tg2QkvN;3Np zHkjq^dY!b1a@|vS2;a4%x8R$b^G*&ml*M?l)=b^3POY3(dMEF!G^nyoyDVHWd3GKh zwYHu<`FV8)_4h>4;0e27F7LRlRA3Nm=PRwDQ-%CXjKDORq;<=tD#-iJ-TXPNowxHS zb0!TjZF`Qb32ARC1*t+KJ6~}X>EUkj%H$+1k)|K8+gQrO z7@ga#<<)IW&Io2Vq@uhZyrP81jVVl?;2VX0mt!Wc`Oe%9-y=STU}tr&#u8^9?-Qs) zD^`cw9Ld-D_8f|}pXv6?@-kSq?i&eKiI0i)yanzHYsr+!Nlc4#BRDu_5(jIRf$L5O z2m2B>xVBc{uWD7fcMM;KZm1+vu3U%|weh-TfzxSCGr>coIKGJ~i?1Y;cf_9$vT1c? zAFzJE=5Fq1+Vl?^K3~wz<}=m=S{#F!zAtyA%0Rwp(Nxt*mO9(SM>uXfX_b{p8sxdP zxy81O_=BJXS^dJv9>Q83&Pn;0-KdbJx47@zehP;eI6lFqy5+D2JS)rX#@GylrK-xk5Y|OWEd=k~iLbux zkJa}j=!8sGWh8X+>P9FBAM&5~zJe)gWy4UY9^vigT0@YUWo#7E!DbDT7Vdy2{6lCq z{giRYU{36|aq!X}RQZTjMWtAZ1{}Sl&NQFuI0uf2TSzK|#=ckz3cF)yk@Y-nTl6jP z>iEQ>YLb?<&@6cRia0!a7%d0CMCNA2idBcS=-`5ju-n?1&|BY~))$TFlBKiwx zHF~pTKKf)kskH3U2ub>~H1v>EhJ{8L`HeNlCKnBLsoIF8i)Kd3-qJ>g(0YABRy)oJ z?xI?1(ExV>3+yzOHr!!ua4{B7BuP{y?$t12z>!z-%iJ!9%*8K@Z2Vt|O$wCz&$7jY6U67pxI9P#!zr>>W5&})s_qJo@gigJ1H?3!c9fKX`{Mw>^M)mZk>~wk?E!UdBzfvLZ2RX| z=beZ%avGW7R(Vfp-}u3IX~9N4_#k#Byk8N*nTn^0F9PLkqN$6kaxG8nJ2yMF;{b|$ zajffsZB*e3X{#(oh675=dh0b-`#{jU@sa2QP*=|UF7RQRD_{B15-0f9xVXe1Xo9T7 z_!_isM)dd81#a8KNt^{4M*L+;qGyG# zbnyt?t4qvj^@WoDjLDK4*AbpDS;~^4S1FD?mF}IiHPh%MhVk^)@jq#RFIx-@h>(ij z^z4D{=0Mw#(7*UY?__P#nYLN^uhaW(wtass>h^u{l|`6;uGJR@dd|9664t_D>_#78 z!pRsVM$gVM`C=Jfjhz(dJD#x;(1lYQexXr)zm~X@v`Z$NrrB#-m$PCB?&~&cDpl2@ zTID@#QBVmK*;v-NmvynWGo7hKpB;zyXKPT5HCpm05U}0+nHbk(Z9v<(P+a08-=~$qK_;bMSq#WEHci!yfi3yfxH|1l#bru*J>innS@Zh zFh9hkzLdRFXJTCHOA2HFEs0)AQU-prCV0x27JgpGYY>s(_fuLx+l!y`_u`sE&J}uH zlN~DIGvS&J&&zoSj}jQ@ZqHXnDMV-g`QR2DaC7mh(rb1cOoj3~3>Qo>s6M=^wRrg8 z|MUs7v~%VjPkpkD(lFR^4mvo}9#VK4cPsO~?A>tPu-`Dc`Uc@U1M90sq#FL8WF}|; z2{Z|4es8Rw4$vDPI@td$Gie(!y4%^NB*@DS2_c7CWW|+gbF2gghIlT+#&8Wpsfh8r zqwqEFQm}6z0Yiyijzm3%xz7ic<#xXjeemakKgn;FSQQ7N5t=`nnOm?{C5WrVge%9; zOEk+YA{#7C)7L|C4j}#ogW5&T_IGlGu z&&l5^n>JjmYep_>3Cnswxsb`DSB#efclHFUCJb_kDzqU1NuuPvbi!j~}sX zfm}v#+qZcC?eOq_k)UJhG3Fddp<*Bz{#$G{Rr?PKT;f?2z*vyQ`wqZ)3#FkUfT0wM zV`NFKd8`o)J!&p#FW3KWhdbkknmFd8cYsBYNK}))t}JODysflxlM7(?J4Pu2KzqvD zM(Y?OcngWIBdGRc;ulX%xfm}SG{N83{|pGM>)Bm8z3)$BE>+Y{8Kdc*kObRL?Vh7P zcpMqiHZygRuE(D==&IAaL6sC%*cJgJKIr4DQeU;v{w-I)g5G=TZLlkZzmYSRcR&( zPsC@%Ylr_H5x{>iZ)V8`t9!D;#AKyKU=suFFVu;^wE3VQY1{)ML38pHdj3M}= zVlqkpA^!KcEU_90p^CT>il`i{3d{f{Mguq)B)#y2M5}8|@q%s7_E9#U^PJp^oZAjv z6-A7kUnR}V=GVVXf$wjv-fy>AegrbSwQ&i~#)KGKQ(#t&%VX(={r!*rbv#P2qyG@( zT3y}b%yXtiP0z8G4fwmGV*}I3+ZNMh8`5|$^6qw8@9ANb1!oB55iLQcLf_RH>R5W% z=q1OVpOgGHW3mPe&bXuW*bjm#db8|$Nd*Oy*Ly9{O!^!_gR zG)XCcj_D}xT*CHdktis(K&m{YgzLoAVUa~or9O7y1HsrbR9@9uehTo#l~?9MP3b6p zpg;AjcF@MB?OfYY#4{0VhVE+qmHQrKA=vglBKe%BxQK>22a=lP1DlW|fkylz9QqTt zz2Fb8oG$sFJJD{3MAjLK)QsU(x}< zpdR?W{J0#H#N}%Idh98bwK=ML8c-~OOm&GcDFY#VND;w`hGKXgqg>UOOdh}z8p?69I0A_J8rmbFK;)fj2VDK4-Tge zGz`Z#?Vr35T$5Aq%F1(@EaK6WUV_#}&PCa|jB4*Q;?iH^Hvqki`VYfE%Fo{Y*vmFu znT3z@=dR2~N=-+)pchk<>L;HEM&DE;AT%S)pulIJt3X7DLMnPmay8t6Pnxzg^zB$Z*RSA#(|dZEtkpP~5dx@#4ju;_eQ`wYa-haJS-K z+>3h)6qn)-EneKE@Xb})-FNpn=k9x+^Zj*i9)2Vv$;e2?9Lb!?%FOKF^E_1zRfs31 zVnf$YzeksQtm_16&EfypHf^mrLE}#@=L^zNI8Qpef-NR>Lif^^nMO<7H1 zvXrYrc@?-cct%!|$MkPFS^7&~Y6KA1<3R_5JL=o+Pq}>TM*^XVz5MU??5rdSYWRrz7CWCb@&ZRGe|%t#=iFAeVYZXH$ySo>Se$||y0Z>5fW>E<@)WtcAVNhvup^0+)7@}Vn?&wk7lIpZdzFb1Iqvz)^ z=Mw70(P{9MQ2#BoVYS*-N%m4ItQoZX(PsC>SM=W!4g z#-rjAej>3nmF+&>FFKd*+v$ZRGmI75c%C)9eG-Tl=RQBYeKJPcEW2l)79yc1QlHi#`Cj_?`#U+NIn&B*P}oHmw>5_*L4c-7d94 zLQAno=A4;EZqKh0E&8~p6G77s4heGFy5u>UWQl5w9#11)T2qyJTkq=ES=yyhyYlng zl8rjL-=F#Hw|`b zXtLuYRk^s1R}1NFF+=hpyF&$Ej2AQ-5|TEfVvBj=`I2mgXI2WP<;AjgOx`ro2;!=8 zk6}j$GaG zenZCMvDQ`jrXMg=Wqe^xkqR@s@X?9-($=BsiB4nVbMs}_A1V|yxp%0t%x=r)%Wugl z(Wca2L`P+KQTB`OhH9)6vVrQWGitR<5Bs1?o%8SxyYaOete z+NUzhfhjJSwT*chY<06y%9fgr(T;33wP**ka(=*@);HzAUNHCiPJ21tQN8n^vU2>> zn*s9G(5HsY@nl{n6#XBjH58kk&ZBxKR@D0)z}-o|LqqhvI1_HGCcZT#F%B-iGewrr zpu{%BeP-e+n?+PYXpa%Nd~`#4m=C83)hWRU;k~W$hO8LQLU5r0+Budq@w+i!UoA)lKrjys@TWn=99g;`KV8zL2fLgCvl5&%WFF-mAtT5@> zrL8E>P4Y|6X=NLXoPu<6o;$7Agp}Gr_rsggvKYTK18ju^O)<)QBZ5LZUO$vTH@vu& zWb}}9VMB>mAZ!bVS*B@haeTVg8@fj}4j6bsHPyBAogt`UA@lpJl3-Ls29Grv7M(;= zE1ypojIn8se#lsX~*PRy%@7|o6bDWso`#E%0S7fMx7z6@^_gb1u0yVC|+gyhw z)?V~m1Sd)^E3ZJbN|B{uq0q^$1K}^DC{;8wJ@y*j zKH->OV1Y!qDPT|JRUYnh9G}uPNPc?`qc(hrm=>2WDvkGq$TlO?N7;9w|CyOb%TDGV zuaLMH$^9)x_E_53iK>fJ*5_l@l(MG2m=#%T=|(fi4VMURe$CaUezNB$13e*2B1ZEX zh~W|*J7Y#`A~zhjmbB_q-Rb@Hxliz42xOk^BK`R4z5RLa9Jc*wbQAH%(Eth)-IgM9 zBdxxUBTXpLasVZvvK?9(g`R0~wer=TRL8=QH|IhV57JI(U-7-cGt8vwWl! znyqH>3=HDU5TR#B^CpA1OdryY4K3w5Osc>aro72`Z34|!+{V(g3{O#58}w}BgVfgI zvDBkB$+d-HX$owpHqx!p%Yvy>rc{3@A`Vb*+wI8-Pw;TCKL!h7;48;EvFGCm^-*1W z!|tf^OrHWO;#m!Xt?sVAEPI|=KgD(9?&F%RIQX&lUTuA|;_6JL=H9p#LX?o1FrPYW zqUkhHGAiCt{}7XIfw(AG{!mAMhmxlhWtu7tisaTiXN| zuV0sF%oB35WJTjz4$nnY@t4~Utw|&Zx7P_FCADh(7RIzT&}Cw^qy*tpPkjkRx1oa7T(;`9W2DiAmk<#B8fv`fyiZF=Ry z;~hUYYxT&L^M>moL#t}qDD$`3Uw?1EJFPHBxx4=KXIX9Vc?2i~#0_EVnab_6^w-F5gtm2vYffA@kZT|@a3SFlZz1u>{Xb|d9Cf5U%S>h(bSsE& z{6gJ&#Vm=DzFSP&Hs};Hi;)|{=wu#7^z}&G{B3$oX1+q*)Vt_X^_zmCrTF5SR_+}h zWClyKC}|D2b=flQRJ&OBZ|?*}p;HWcE+9_&4_VH+cLyT(J6{^~zkgk!<%E?^fNn)I z@rmr3vrkYM%^cnA{6@RIFjwOK5}C*Mhrrl;*P(unx*p`R%?aVzox5S0uh6XK|*Pkd#e0S=&5dRt#bGkGB@XCMP)z(EIUmO5cUuENLg;>nUREsi|kQ@Ki>?CFEmaqIW$C71W& zlpLuf5?>wcSThC-$C7(y4_(r_Yg_q8%;HW|VM6_iC2~6{d-V%w(=$+XEn&*Hc$AEE z>hR%5tYj>KU4&fa(NZ)-C40dg&XCMqPruJZM1QPrs}+%%LwCck*UKBYE8YvVjkJq| z3t-Y6I1zh=r6H=$izaO3^pcRlCc`YOJS25s(X@-t3B^h8Jg*M|5g!kd4$Ux-gRvw` z7H1dRR^wG-S@qmN?Igv*^K%kzq%jA zfi9J>{8$iLWhV8!{TtI~<~8>erB-4;fmAthb7y3#9njZx_xBRduhs^YT3v~2gVW>a$2QLGqq5AL7GDkh=sISr+A|Lk_ z$`|X*`OJREG!2X4xXM2h+>t9pT8vP)|5B(6lI@4~$06?;d5&?DQt?XV=|?f=!Ae>C z_SY*cLDitK_~NqXH#-%Y9z60c%-PqPivi6;10PTG77yOl&{%48y?IBV22IUab^}4B zYMsa?z91C%#FF$82T_5lEzGuY+3R5y?mjomj#y*obkh%B7;;B*)y|&95Sm8pJ(PhL z;dDX1Jtn1lPrbAFLl-fd{Ib4~!@;5PV3pLeF9fa5syk4e}79iAk zG)0=+Y;vB*Mn@<5`XFv?kG-wLpCWL&vHfz~wzg2{Xs8h0nmpZP`&zV)asfuLeBqXW z4*N+6lXyPFP%S4Trp_oPG({b0OSveV{CmyuqmbvZx}R&wx1O}9u*;&WO7pbwsR_k$ zbq92fu=n6XiOVd{^b&_BP3~uyXrnJs1boq6eUH2qz&BCWSF34oq#1MpH9(6ysHt@S zBsm@?z**r~7BcoUtAUdi`Bgry>#!&NJ{8Ll<%eYj-52d}0?h5MdrL~val zU^(+!0>!j_?=dRR^BcYx-%4J$ldP|j@el8ZG@^ibN5AC(^XZfkyRxIqZElx>qfFvG zgw)_jC56EUXS=fnC?iv5hQ=*ao_Ds4>5lAu1_~EB%Zfxu90H#i?kN2=b?hbc^uNy+ z;$w$I5bN-o@_qJDJ{Md`@hFY#{qLvsa%7`Sxuj@fA>n%(q zZ_du(+(+Voe$nfe5&LtvM}&orDC>IJCLpJ8bX`r9ovBUkxlnzjRb^@WExnOo@s>xnUV6xL1B zpG-^JG{8?EuvhNB`=AoV{od`Ro+jZ~lk>C1bE&s@OKH8wvWGer#nbs-<-cjAJ-E|{h=?q0wZjRIrcausHvP|uyAGNViP57eO9n(}1&!6ZJS(rs`1exkf z`U*W`flY5#L7c50FnBIzQ4d*N2p{AW@uAeWN!}bHMo|ZO_$I*Y)XIFxVCd>a6n?%= zRCSR|MvSL~7faN@+m*;lgj;5H$s{rreSJ63!VYS{K?2Q;=N`rP#talC&Xbj9K^0P> zcCVb*qgU)MH}7~Qr`vyM^DSWCecU;4W}4#BeBYQR1j|bGqp_E*I3`lsH37YyP$ss> z79^S&=h2Kc%sKV3bce~nYLep>I$R&}rj~u{qBpK6IeGn$1Z#>6~ zZFT0d*E{cbo$=ASvz3wV`UKu;_hi47k$q7~hcJ+()i^uJ`?{vsEs#FDG$C+Dci|-A z-CLHml?dwwYAfGTdy4Vk&XjVA>Gdy`jPEaqd|O{TSt(w$91@uvjf*hqG80(woC;#f zi1g!5eTUrbXCQy{rutJ8YZ|2~$IOp@9y^^6k9~VG3Y+z$iIZ}7m8nT(n8uS%seYK& z?>fb}oT(?PU3%mnORfu`La`@dA*0s#%r~goN9Ya~@+nSe;m!vxK7$#jMvx%KYWP^* zr| z{wBi=g%>9%^tm1Cl7WEqqv!@)!fID#zg&!a6gW$QC*8|*uw}Z_ zXetSdltN0A_*uBkIKXd7opZN#E9d;Pk0H06S_E*z&|tRIZ7J z7*V*w8D!Wq;T7czOgmz>Mys&VCOV>me7Fs=ur`J%3n$C7r*V&9?)N0A_UyNHF3;rm zo*@?=dg2d$Mhc+C4_HxeA~{>`OO+ZazlQw2c8iJ`hND8f(D9wJ?32sVWBk(C4?pfk z^hemTo}SF?#PsWU9OFc9cMpj%ZTv4%n0CKwbXMMO0Ia>?5!O?r7DYOND+etS<#tTw5}V@ z+U}v39vQ_%eZsc^v1r$I4ao*?0*vy{(aR%3;|JzsH*+46pGHD7^4IApUhpD9P{Ii_ z**u~DJpafO-$;l@D~-}Y<*|v_S6>HtA=rw6w73nFb5_Bf>J(7lGfM>pN_P3uK$d$K zv;hbSDq}xK$W$8CQJz|&9&tvqobwY5Mcx)wdZmG6O(HkAxUYl;3uEid`!kOe1?ATU zV};I=6J!V177QE%Q7zJRVF(;b-dXfiKny|4V@wAM$37jDUq+hi+ZBH5@wne}RDPB; zQ8k_ocT{E*WZD!05o6LEAY8>H^YV1$sta!3yb%*B!Y+}f-IFQ~bX_-exesd>yA`|b3Wz0G9?LY!XEk03ZqnLPj5m4aHze#6 z%q=Uu@g!cOAt7_w-OTH_(5EMlUT~SPBPoU>G7&)v3UofE%AEUzDDl+tF&>58tJ!zi z@RE+7vQWTy#nNF zab-h}aAZnRWw}?OR1~fQRgCZk72qM}FXaqUSKh9n)`i?L?_o(RgJczOI=bRV47ILZ zlVdR8pD70=&*Z}d>3PBr4hnTr*b{d-&|c!0nZNBSC5m4d0iC^_^)RG|Bd=nDha1tq z2>h{KX5a_APQO==uoqSru&zMJS~>JXjh;b2(altg1Y7?pFO>7+zFnB(VH$#r3#c-c zU4tD5yU|ET+pp^55La=SFAQ*Y=X%QWpsGD`;54akJ~%v;Vy0q|bqL~~%?yw)mO-rd zL<=v{89DZUZB8yE*bBAzXpw&8N1JUnwS|!$RMNY__Z%1#;XAN zloDAkET_{NZlOka8dS>Vns-Jcg?1ZbUnU^fsG05wS|oWx#e9~kiC-4F&6NabDZwSJ zFqB`RAXT~HUkr#amw7!c;j&}qZH&Q1(TebhrJl*V9H=Fd65^0{dfV8T8H7R^z`9bo zPxN)TtABfgPg5|A{DP~R=_Vycv=h<3`5m}!{k<{&(;GO~15 z$R@y!CHXj!tI2ShM5}8Ao6jqA6d~aDz`km%vAQ496*@Ow}V~3r>S@}8zGC_@fuS8gS zNtY3cLfzO14eA9r9HkO+9GQ@$&JA>d>-hLOt$MFMXD8vq9q?-Uh^UVx4Z34XC$l%_s8pE6lJ3m z{wT}cS&18{>&>7G*qQJe;pxI0Yn|IAFQMKSeWHabP9n@BM{7gTefd-cH(e8@q%VMe z6YkVvc!y6E>?lRL&du{WgWT~03mmRStL0G)!#1B{>5Z`;V$&umzgiQb2-eN{IKfSv zO5hT{9fxV(3yf^)c*pYEOqD83dMBvMI3dXRDue}bF zOP$GzJq6mfoI<&#^GUCk#4l7-t=TN$OH{}=~nQ;MzIY!oYJPOy=P$6`$(!k0*bJ)CTskk#Gf17k@`TplZjYdLq z@5(Pe)GUZvI6MyrmhbQfLoxKk5(UfU2$?nJW1LC#xY9G;3Gy0FP29BBZ!c@U$qvUi zwG&YAsTZMW8dCc~o(UJF&IP>1o|!nBnTi*GT|;W8xW<%2t60W{8)Mc~BKh=-nn}z$ zQ(6Wg9R-aA3!7MfmIayUhumQe!SH14S-%u2IgQcS1jE+l{U5_M2JGJRh|)ZCKHT+B z6pJe&znh=8RYZ(zWfFa5L7P@d%R+FJCg=++P`8VN?Jbo`GLlMkS6(EaCefo$hS5X* zzBiGRI2|=-O2WBd8aq<*@#dWa&a={_YDYgxY)a|7jIetQ&j8q_RzV}2Ge!o%9RJzP z#rkjoXQG2V%sSFR_xt|Bcho{| z$IcHdZ0z1_3#Hrywx!g|#C>}ijBDB6!!)Xd?CJ%(t@@zP5t`%0Ifut_-Ml6wY%^waT82I+~`n>Ch6)k*w^%<6EWT9w6=P#wwmvU8GjDN%RVu2Dh7j$ z415wGAqm@JF7B1U7Zw$c#qkqM*oAwjIG0hKI2`V`|JBbO538Wc#2YUmfX&2UJOV-d z+(GN|?B^=zf3bg-87PSP=l)p@$Sa^!gwNnLP>ZF#6uEFy371~KP1QxOWeK7j*uH5Fo9xFEFi|N$m1AlgS?8~o6xUE>Lu^|M`yYwqI zi_RzMpteR$yMR-w2=vMsMtPhASmL+|>=AdV!$a06pRRRYET3&^=yY?mJf`hfeWjp# z`8H!cm+2deABY0No<@)8CfF1kb<6jC2A?-^d7;ZKBS=FV|O= zQ(FWo;$l6LT~h_wOdY)Tfbc9AA(ohM#YMXLa=arC$>&&#$Zw(V6g42SdaF<;PyKZE zgsPe)QjCmlX>coeGyc2*?R@d+ufJBxvO9on|-lhKh`(xCEa@m#~ZzO{(u} zjgnm_FWV+;*R|j@f3Xr(N;&bm)|>B4%Qq7wen%ffUTo6aYRHXXgfLB^r8C zv#da>m=Xz^8(0X(M{lYO+UfCh#;(oDGoH&ZGWgHn>z1AeKO<$->-$6}{)}{=opk9P zL{*MKPd*G9<`Z5AQA=!e5iv<=oWMO6yvuuzC9DqBD_5J}ISb*D12NVePK0$eXQ4!5t6RFk%P!UOTqG9~{z?WOVvEr9yHHdJG$Z@E66d9%i?6 zB>KLnQF=ElZ^pia%hijMN2+2{Rb|z7yuhn@{3e*@qM{`#Gu*dx-Rj^Ce~?)5h7S5m z`CZJW(OvvyLV=Iw9KM+fr7f9G>2gbxvnE;mO)0U#xs{;~^fO_`8Tjp81KrsBawCUV z1IqQ?T;4)cB@PW*H7*|E@<1hy;HcHVk;U2 zFg^%`q^fpZ*|VaF2%E-8(f5^Ezyz=L75%tUJh`a2r9!Rn2^L-09bf8j@o?W0`L5Gh zf01DumZM8YRh3s+j7^H*%8IrrB%Bp)$e2Jw8NE7py3(3n!&mJ~Jl*j$h3q-u2V3nm zqlqyk$xlb0i%wdY8#`*^G(dP#!@`4`DhSOHa9Rq_i20rT25uYruTt;5!zKW1fdvga~$cKhSaQ$sm~;^yZ{ z>5UJGX3O%s-LMZA?4GEjuYNy%hxu}kA-!`frpWJ2{gq3(K1oa&kE#p7YhAAK&d5?Y zadp=6e!?AyFQ0wVz2u=Mro9SUY_^dE8%~jKvMI{*lH&+IO)}(Ra1xdWn%C>w3T}7H z-3ZzMlX5xXxpGXgXv>S75X~1v>$3NsL&(WLv0}X8u8s|en|H&w|2j#1HO_PwVz0Ps z{6uRtB_dckl>i;KO@cO{Dj|5PHlrYq(Qvv)^0A%64%c2{qqWzEyVOQPUl<4@{FN-B zq-x{&hC4159(1C)rZC*@khNy~fp!PnubKK};fQH;!&vA95FM5_5KQF-v|R7c777`1 z6<801#{<&vR19}#EUu> z30W2Jq)eqF%Lrkq+UKMl`wZ5mQhrN=Y~Pj(d`Z!F+rYdR?{QB<91H zN>;I99rfmu2%;!W5e>++gFdzT3^Ll&*4Ay-kk2iYjuL|GoVW=ew_A zNHU9o*2|l|nWh;<25$#B{ixgPas(Vq+$z>QEnmV|;v2p}*ht3FtA*sW@)gIYE{98G zx8ZSGM^5KB*^X?d+z+aYpUST^!{5YTUx&}mcRGzmPVvZ95gI-&~>=st;^ zj6AAzxLZ8)`TRP_$3p>W4VyfHc4=^qFmU!Xt5r}-mJoxIxAjx!WUMB%D2$3Qc8(mx z+<3~XQG!g3{8_n7Eqrc=l zY%cmmJnXjmMLbv-2n9vl($UG8RNT?f+{V<_8H9x;X=-h4M{4#n+U$2UDd|JBlc}+t ztqJMxct%oTM{^!hN)`$y5Hz&Bsk<`>9$wMW)Ya0?#R-Ips`8NiU!}vttC%`FTiTjC zf#Be5ENv}q46T8SOA65eOq2Woog0JfKsF#okSWL=WC(=pLDoQ+5o82hHCvF$Ps$m{ zV+Vv7fpkkC))Mdy0s8+7jufylu&ey#gTr8Z2Y?Cy_z` z6am2e)TA|_C&!tXXt$Kd)b0QJKG;(t0I?EE_n`0xO*0gwY=0>A@641gQ}Z2)cn!0iF|yLtcv z02Tpk0k{W%1C+-IfE|Dk08IceFhH&hWoG_Eu>X?)zCaBap|h!> z_0LSdg5X#f7&i+`XH$UB%+N^R#?aB+(iTKOKw)XDZ*AyeYiwcasBdQHXlm|g=VEK3 zug?s^!TD#J5m1ANw7(MmFo6&e|G@!5NB;+<|Fc-2R~Q;QTiV&`JN@no@bHHA_WHJl zHl{%L``PjIe|IpTVn(LcK(qz8SL*+JA_yD%A^M?L{)-9dinb43(f)T=#K!(B&#!_J z5e@B4T%1fDT`i4G0o_AFqJiiEA5b|64#5ADgMd^8tpFK*=LOr15P<)!LjwvR1;7kI z2!J900{~#V0z1G5oBKVO2FnK1w{Mz%(vZLCeUQ;l8tNBa1LFKiL;s??=b(PlFu&+G zZy|ot;64T}?;dbqT>yL7K;SaLa=;GUW(&ao9j6I|g#i3-9k?xEeFHuW1fT%0Y;YsN z^#|jh4qOL&AmVqL0T31f@V{~3_JaArKDaIj0094|Xs|qgfd230-TmYRvi!LxgNgs( zz_Ng*g5~@M6mb9l83t|#Kjnk(y`-}e7HYjj8;PhWU6#6gvmk$M;Iq@_7mk)*ci~i+9fyZPp z|1Td3{H*bNto~`E01b9vJy-z#@3{Y)V>MVNxNTr#SCoN(d>APoCUkPCj2mn~JQo0N z0KZ*b05~KkrYg)JB`?loY-ht{XlvqVXKBJ@*)iS!Z}A1;A$32d^zU0pyJ5Hz+nbaDdbPbQ}Be>3tcy_5sn z5_nt#>-e{;3n&Gmtu2k1+_^ZI0RLwNoPeW2{=I$wf{WbYyGUluUz0$b1JnW%9$Snwg>>+ zKmWKSz>L6iw1-*MAHD~{8J_i{GeE{msX*igC*abPO>5ozKJYf$w3)_&1+OWtLi#5C{auzw@owKJY!v0RQGw^N(N) zqy*--0REk?tKt{m&&lH7eEm@&3d2 zP|v>?XZ~>FVLk9Y%&Pz9`}<9wKYT>k4}1?(^FMqK_5AmjC;o5&qZ!@<-^0?u-+cf6 zbK^hx;DF@|us$CaBmVIHr}nXM{^I+&6!nMizgn>Qr#yD9pM3vVzEPBc0T02zd=Upk N3XBjSG4QDQe*k+U@=X8$ literal 0 HcmV?d00001 diff --git a/tools/aapt2/integration-tests/DumpTest/components_expected.txt b/tools/aapt2/integration-tests/DumpTest/components_expected.txt new file mode 100644 index 0000000000000..79b6706e4a9f4 --- /dev/null +++ b/tools/aapt2/integration-tests/DumpTest/components_expected.txt @@ -0,0 +1,56 @@ +package: name='com.example.bundletool.minimal' versionCode='1' versionName='1.0' platformBuildVersionName='12' platformBuildVersionCode='31' compileSdkVersion='31' compileSdkVersionCodename='12' +sdkVersion:'21' +targetSdkVersion:'31' +uses-configuration: reqTouchScreen='3' reqKeyboardType='2' reqHardKeyboard='-1' reqNavigation='3' reqFiveWayNav='-1' +supports-gl-texture:'GL_OES_compressed_paletted_texture' +uses-permission: name='android.permission.BIND_ACCESSIBILITY_SERVICE' maxSdkVersion='24' +uses-permission-sdk-23: name='android.permission.RECEIVE_SMS' +uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' +compatible-screens:'500/240','400/160' +application-label:'minimal' +application-icon-160:'res/uF.xml' +application-icon-240:'res/uF.xml' +application-icon-320:'res/uF.xml' +application-icon-480:'res/uF.xml' +application-icon-640:'res/uF.xml' +application-icon-65534:'res/uF.xml' +application: label='minimal' icon='res/uF.xml' +uses-library:'mylib1' +uses-library-not-required:'my_optional_lib' +uses-native-library:'native1' +uses-native-library-not-required:'optional' +launchable-activity: name='com.example.bundletool.minimal.MainActivity' label='minimal' icon='' +meta-data: name='android.nfc.cardemulation.host_apdu_service' resource='res/dU.xml' +uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' +uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' +feature-group: label='' + uses-feature: name='android.hardware.bluetooth' + uses-feature: name='android.hardware.camera' + uses-feature: name='android.hardware.faketouch' + uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' + uses-feature-sdk-23: name='android.hardware.telephony' + uses-implied-feature-sdk-23: name='android.hardware.telephony' reason='requested a telephony permission' +provides-component:'app-widget' +provides-component:'device-admin' +provides-component:'ime' +provides-component:'wallpaper' +provides-component:'accessibility' +provides-component:'print-service' +provides-component:'search' +provides-component:'document-provider' +provides-component:'notification-listener' +provides-component:'dream' +provides-component:'camera' +provides-component:'camera-secure' +main +other-receivers +other-services +supports-screens: 'normal' 'large' 'xlarge' +supports-any-density: 'true' +requires-smallest-width:'240' +compatible-width-limit:'360' +largest-width-limit:'480' +locales: '--_--' +densities: '160' '240' '320' '480' '640' '65534' +native-code: 'x86_64' +alt-native-code: 'x86' diff --git a/tools/aapt2/integration-tests/DumpTest/components_permissions_expected.txt b/tools/aapt2/integration-tests/DumpTest/components_permissions_expected.txt new file mode 100644 index 0000000000000..f79de5cba11d7 --- /dev/null +++ b/tools/aapt2/integration-tests/DumpTest/components_permissions_expected.txt @@ -0,0 +1,5 @@ +package: com.example.bundletool.minimal +permission: minimal.FIRST_PERMISSION +uses-permission: name='android.permission.BIND_ACCESSIBILITY_SERVICE' maxSdkVersion='24' +uses-permission-sdk-23: name='android.permission.RECEIVE_SMS' +uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' diff --git a/tools/aapt2/integration-tests/DumpTest/minimal.apk b/tools/aapt2/integration-tests/DumpTest/minimal.apk new file mode 100644 index 0000000000000000000000000000000000000000..a8415faca3902e2c834d60037c832a09b7400487 GIT binary patch literal 214221 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

u2^3~ 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

vFt?V?B=7a-4%DI1k6$ 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 Date: Tue, 12 Apr 2022 15:04:12 +0000 Subject: [PATCH 2/4] Split ManifestExtractor to Extract and Print methods. Bug: b/228950123 Test: Dump_test.cpp Change-Id: I040224f4997d2904e899211898e59e9fc4d58f82 --- tools/aapt2/dump/DumpManifest.cpp | 499 +++++++++++++++++------------- 1 file changed, 278 insertions(+), 221 deletions(-) diff --git a/tools/aapt2/dump/DumpManifest.cpp b/tools/aapt2/dump/DumpManifest.cpp index 2c833e715cb79..64a9441d1ac2f 100644 --- a/tools/aapt2/dump/DumpManifest.cpp +++ b/tools/aapt2/dump/DumpManifest.cpp @@ -17,17 +17,19 @@ #include "DumpManifest.h" #include +#include +#include +#include #include "LoadedApk.h" #include "SdkConstants.h" #include "ValueVisitor.h" +#include "androidfw/ConfigDescription.h" #include "io/File.h" #include "io/FileStream.h" #include "process/IResourceTableConsumer.h" #include "xml/XmlDom.h" -#include "androidfw/ConfigDescription.h" - using ::android::base::StringPrintf; using ::android::ConfigDescription; @@ -113,6 +115,9 @@ static xml::Attribute* FindAttribute(xml::Element *el, const std::string &packag } class CommonFeatureGroup; +class Architectures; +class SupportsScreen; +class FeatureGroup; class ManifestExtractor { public: @@ -338,7 +343,8 @@ class ManifestExtractor { return config; } - bool Dump(text::Printer* printer, IDiagnostics* diag); + bool Extract(IDiagnostics* diag); + bool Dump(text::Printer* printer); /** Recursively visit the xml element tree and return a processed badging element tree. */ std::unique_ptr Visit(xml::Element* element); @@ -354,7 +360,7 @@ class ManifestExtractor { * Retrieves the default feature group that features are added into when * are not in a element. **/ - CommonFeatureGroup* GetCommonFeatureGroup() { + CommonFeatureGroup* common_feature_group() { return commonFeatureGroup_.get(); } @@ -387,11 +393,22 @@ class ManifestExtractor { DumpManifestOptions& options_; private: + std::unique_ptr doc_; std::unique_ptr commonFeatureGroup_ = util::make_unique(); std::map locales_; std::map densities_; std::vector parent_stack_; int32_t target_sdk_ = 0; + + std::unique_ptr root_element_; + std::vector> implied_permissions_; + std::set components_; + std::vector feature_groups_; + bool other_activities_ = false; + bool other_receivers_ = false; + bool other_services_ = false; + std::unique_ptr architectures_ = util::make_unique(); + const SupportsScreen* supports_screen_; }; template T* ElementCast(ManifestExtractor::Element* element); @@ -427,6 +444,7 @@ static ManifestExtractor::Element* FindElement(ManifestExtractor::Element* root, class Manifest : public ManifestExtractor::Element { public: Manifest() = default; + bool only_package_name; std::string package; int32_t versionCode; std::string versionName; @@ -463,6 +481,14 @@ class Manifest : public ManifestExtractor::Element { } void Print(text::Printer* printer) override { + if (only_package_name) { + printer->Println(StringPrintf("package: %s", package.data())); + } else { + PrintFull(printer); + } + } + + void PrintFull(text::Printer* printer) { printer->Print(StringPrintf("package: name='%s' ", package.data())); printer->Print(StringPrintf("versionCode='%s' ", (versionCode > 0) ? std::to_string(versionCode).data() : "")); @@ -733,7 +759,7 @@ class SupportsScreen : public ManifestExtractor::Element { } } - void PrintScreens(text::Printer* printer, int32_t target_sdk) { + void PrintScreens(text::Printer* printer, int32_t target_sdk) const { int32_t small_screen_temp = small_screen; int32_t normal_screen_temp = normal_screen; int32_t large_screen_temp = large_screen; @@ -1050,7 +1076,7 @@ class UsesFeature : public ManifestExtractor::Element { // common feature group FeatureGroup* feature_group = ElementCast(extractor()->parent_stack()[0]); if (!feature_group) { - feature_group = extractor()->GetCommonFeatureGroup(); + feature_group = extractor()->common_feature_group(); } else { // All features in side of elements are required. required = true; @@ -1068,12 +1094,14 @@ class UsesFeature : public ManifestExtractor::Element { class UsesPermission : public ManifestExtractor::Element { public: UsesPermission() = default; + bool implied; std::string name; std::vector requiredFeatures; std::vector requiredNotFeatures; int32_t required = true; int32_t maxSdkVersion = -1; int32_t usesPermissionFlags = 0; + std::string impliedReason; void Extract(xml::Element* element) override { name = GetAttributeStringDefault(FindAttribute(element, NAME_ATTR), ""); @@ -1094,7 +1122,7 @@ class UsesPermission : public ManifestExtractor::Element { FindAttribute(element, USES_PERMISSION_FLAGS_ATTR), 0); if (!name.empty()) { - CommonFeatureGroup* common = extractor()->GetCommonFeatureGroup(); + CommonFeatureGroup* common = extractor()->common_feature_group(); common->addImpliedFeaturesForPermission(extractor()->target_sdk(), name, false); } } @@ -1126,17 +1154,16 @@ class UsesPermission : public ManifestExtractor::Element { printer->Print("\n"); } } - } - - void PrintImplied(text::Printer* printer, const std::string& reason) { - printer->Print(StringPrintf("uses-implied-permission: name='%s'", name.data())); - if (maxSdkVersion >= 0) { - printer->Print(StringPrintf(" maxSdkVersion='%d'", maxSdkVersion)); + if (implied) { + printer->Print(StringPrintf("uses-implied-permission: name='%s'", name.data())); + if (maxSdkVersion >= 0) { + printer->Print(StringPrintf(" maxSdkVersion='%d'", maxSdkVersion)); + } + if ((usesPermissionFlags & kNeverForLocation) != 0) { + printer->Print(StringPrintf(" usesPermissionFlags='neverForLocation'")); + } + printer->Print(StringPrintf(" reason='%s'\n", impliedReason.data())); } - if ((usesPermissionFlags & kNeverForLocation) != 0) { - printer->Print(StringPrintf(" usesPermissionFlags='neverForLocation'")); - } - printer->Print(StringPrintf(" reason='%s'\n", reason.data())); } }; @@ -1184,7 +1211,7 @@ class UsesPermissionSdk23 : public ManifestExtractor::Element { maxSdkVersion = GetAttributeInteger(FindAttribute(element, MAX_SDK_VERSION_ATTR)); if (name) { - CommonFeatureGroup* common = extractor()->GetCommonFeatureGroup(); + CommonFeatureGroup* common = extractor()->common_feature_group(); common->addImpliedFeaturesForPermission(extractor()->target_sdk(), *name, true); } } @@ -1256,7 +1283,7 @@ class Activity : public ManifestExtractor::Element { auto orientation = GetAttributeInteger(FindAttribute(element, SCREEN_ORIENTATION_ATTR)); if (orientation) { - CommonFeatureGroup* common = extractor()->GetCommonFeatureGroup(); + CommonFeatureGroup* common = extractor()->common_feature_group(); int orien = *orientation; if (orien == 0 || orien == 6 || orien == 8) { // Requests landscape, sensorLandscape, or reverseLandscape. @@ -1962,6 +1989,29 @@ class Property : public ManifestExtractor::Element { } }; +class Architectures { + public: + std::set architectures; + std::set alt_architectures; + + void Print(text::Printer* printer) { + if (!architectures.empty()) { + printer->Print("native-code:"); + for (auto& arch : architectures) { + printer->Print(StringPrintf(" '%s'", arch.data())); + } + printer->Print("\n"); + } + if (!alt_architectures.empty()) { + printer->Print("alt-native-code:"); + for (auto& arch : alt_architectures) { + printer->Print(StringPrintf(" '%s'", arch.data())); + } + printer->Print("\n"); + } + } +}; + /** Recursively prints the extracted badging element. */ static void Print(ManifestExtractor::Element* el, text::Printer* printer) { el->Print(printer); @@ -1970,15 +2020,15 @@ static void Print(ManifestExtractor::Element* el, text::Printer* printer) { } } -bool ManifestExtractor::Dump(text::Printer* printer, IDiagnostics* diag) { +bool ManifestExtractor::Extract(IDiagnostics* diag) { // Load the manifest - std::unique_ptr doc = apk_->LoadXml("AndroidManifest.xml", diag); - if (doc == nullptr) { + doc_ = apk_->LoadXml("AndroidManifest.xml", diag); + if (doc_ == nullptr) { diag->Error(DiagMessage() << "failed to find AndroidManifest.xml"); return false; } - xml::Element* element = doc->root.get(); + xml::Element* element = doc_->root.get(); if (element->name != "manifest") { diag->Error(DiagMessage() << "manifest does not start with tag"); return false; @@ -1987,10 +2037,11 @@ bool ManifestExtractor::Dump(text::Printer* printer, IDiagnostics* diag) { // Print only the , , and elements if // printing only permission elements is requested if (options_.only_permissions) { - std::unique_ptr manifest_element = - ManifestExtractor::Element::Inflate(this, element); + root_element_ = ManifestExtractor::Element::Inflate(this, element); + + if (auto manifest = ElementCast(root_element_.get())) { + manifest->only_package_name = true; - if (auto manifest = ElementCast(manifest_element.get())) { for (xml::Element* child : element->GetChildElements()) { if (child->name == "uses-permission" || child->name == "uses-permission-sdk-23" || child->name == "permission") { @@ -1999,15 +2050,8 @@ bool ManifestExtractor::Dump(text::Printer* printer, IDiagnostics* diag) { manifest->AddChild(permission_element); } } - - printer->Print(StringPrintf("package: %s\n", manifest->package.data())); - ForEachChild(manifest, [&printer](ManifestExtractor::Element* el) -> void { - el->Print(printer); - }); - return true; } - return false; } @@ -2041,27 +2085,24 @@ bool ManifestExtractor::Dump(text::Printer* printer, IDiagnostics* diag) { } // Extract badging information - auto root = Visit(element); + root_element_ = Visit(element); // Filter out all "uses-sdk" tags besides the very last tag. The android runtime only uses the // attribute values from the last defined tag. std::vector filtered_uses_sdk_tags; - for (const auto& child : root->children()) { + for (const auto& child : root_element_->children()) { if (auto uses_sdk = ElementCast(child.get())) { filtered_uses_sdk_tags.emplace_back(uses_sdk); } } if (filtered_uses_sdk_tags.size() >= 2U) { filtered_uses_sdk_tags.pop_back(); - root->Filter([&](const ManifestExtractor::Element* e) { + root_element_->Filter([&](const ManifestExtractor::Element* e) { return std::find(filtered_uses_sdk_tags.begin(), filtered_uses_sdk_tags.end(), e) != filtered_uses_sdk_tags.end(); }); } - // Print the elements in order seen - Print(root.get(), printer); - /** Recursively checks the extracted elements for the specified permission. **/ auto FindPermission = [&](ManifestExtractor::Element* root, const std::string& name) -> ManifestExtractor::Element* { @@ -2073,30 +2114,30 @@ bool ManifestExtractor::Dump(text::Printer* printer, IDiagnostics* diag) { }); }; - auto PrintPermission = [&printer](const std::string& name, const std::string& reason, - int32_t max_sdk_version) -> void { + auto AddImpliedPermission = [&](const std::string& name, const std::string& reason, + int32_t max_sdk_version) -> void { auto permission = util::make_unique(); permission->name = name; permission->maxSdkVersion = max_sdk_version; - permission->Print(printer); - permission->PrintImplied(printer, reason); + permission->implied = true; + permission->impliedReason = reason; + implied_permissions_.push_back(std::move(permission)); }; // Implied permissions // Pre-1.6 implicitly granted permission compatibility logic - CommonFeatureGroup* common_feature_group = GetCommonFeatureGroup(); bool insert_write_external = false; auto write_external_permission = ElementCast( - FindPermission(root.get(), "android.permission.WRITE_EXTERNAL_STORAGE")); + FindPermission(root_element_.get(), "android.permission.WRITE_EXTERNAL_STORAGE")); if (target_sdk() < SDK_DONUT) { if (!write_external_permission) { - PrintPermission("android.permission.WRITE_EXTERNAL_STORAGE", "targetSdkVersion < 4", -1); + AddImpliedPermission("android.permission.WRITE_EXTERNAL_STORAGE", "targetSdkVersion < 4", -1); insert_write_external = true; } - if (!FindPermission(root.get(), "android.permission.READ_PHONE_STATE")) { - PrintPermission("android.permission.READ_PHONE_STATE", "targetSdkVersion < 4", -1); + if (!FindPermission(root_element_.get(), "android.permission.READ_PHONE_STATE")) { + AddImpliedPermission("android.permission.READ_PHONE_STATE", "targetSdkVersion < 4", -1); } } @@ -2104,62 +2145,60 @@ bool ManifestExtractor::Dump(text::Printer* printer, IDiagnostics* diag) { // force them to always take READ_EXTERNAL_STORAGE as well. We always // do this (regardless of target API version) because we can't have // an app with write permission but not read permission. - auto read_external = FindPermission(root.get(), "android.permission.READ_EXTERNAL_STORAGE"); + auto read_external = + FindPermission(root_element_.get(), "android.permission.READ_EXTERNAL_STORAGE"); if (!read_external && (insert_write_external || write_external_permission)) { - PrintPermission("android.permission.READ_EXTERNAL_STORAGE", - "requested WRITE_EXTERNAL_STORAGE", - (write_external_permission) ? write_external_permission->maxSdkVersion : -1); + AddImpliedPermission( + "android.permission.READ_EXTERNAL_STORAGE", "requested WRITE_EXTERNAL_STORAGE", + (write_external_permission) ? write_external_permission->maxSdkVersion : -1); } // Pre-JellyBean call log permission compatibility. if (target_sdk() < SDK_JELLY_BEAN) { - if (!FindPermission(root.get(), "android.permission.READ_CALL_LOG") - && FindPermission(root.get(), "android.permission.READ_CONTACTS")) { - PrintPermission("android.permission.READ_CALL_LOG", - "targetSdkVersion < 16 and requested READ_CONTACTS", -1); + if (!FindPermission(root_element_.get(), "android.permission.READ_CALL_LOG") && + FindPermission(root_element_.get(), "android.permission.READ_CONTACTS")) { + AddImpliedPermission("android.permission.READ_CALL_LOG", + "targetSdkVersion < 16 and requested READ_CONTACTS", -1); } - if (!FindPermission(root.get(), "android.permission.WRITE_CALL_LOG") - && FindPermission(root.get(), "android.permission.WRITE_CONTACTS")) { - PrintPermission("android.permission.WRITE_CALL_LOG", - "targetSdkVersion < 16 and requested WRITE_CONTACTS", -1); + if (!FindPermission(root_element_.get(), "android.permission.WRITE_CALL_LOG") && + FindPermission(root_element_.get(), "android.permission.WRITE_CONTACTS")) { + AddImpliedPermission("android.permission.WRITE_CALL_LOG", + "targetSdkVersion < 16 and requested WRITE_CONTACTS", -1); } } // If the app hasn't declared the touchscreen as a feature requirement (either // directly or implied, required or not), then the faketouch feature is implied. - if (!common_feature_group->HasFeature("android.hardware.touchscreen")) { - common_feature_group->addImpliedFeature("android.hardware.faketouch", - "default feature for all apps", false); + if (!common_feature_group()->HasFeature("android.hardware.touchscreen")) { + common_feature_group()->addImpliedFeature("android.hardware.faketouch", + "default feature for all apps", false); } // Only print the common feature group if no feature group is defined std::vector feature_groups; - ForEachChild(root.get(), [&feature_groups](ManifestExtractor::Element* el) -> void { + ForEachChild(root_element_.get(), [&feature_groups](ManifestExtractor::Element* el) -> void { if (auto feature_group = ElementCast(el)) { feature_groups.push_back(feature_group); } }); if (feature_groups.empty()) { - common_feature_group->PrintGroup(printer); + feature_groups_.push_back(common_feature_group()); } else { // Merge the common feature group into the feature group for (auto& feature_group : feature_groups) { - feature_group->open_gles_version = std::max(feature_group->open_gles_version, - common_feature_group->open_gles_version); - feature_group->Merge(common_feature_group); - feature_group->PrintGroup(printer); + feature_group->Merge(common_feature_group()); + feature_groups_.push_back(feature_group); } }; // Collect the component types of the application - std::set components; - ForEachChild(root.get(), [&components](ManifestExtractor::Element* el) -> void { + ForEachChild(root_element_.get(), [&](ManifestExtractor::Element* el) -> void { if (ElementCast(el)) { auto action = ElementCast(el); if (!action->component.empty()) { - components.insert(action->component); + components_.insert(action->component); return; } } @@ -2167,15 +2206,14 @@ bool ManifestExtractor::Dump(text::Printer* printer, IDiagnostics* diag) { if (ElementCast(el)) { auto category = ElementCast(el); if (!category->component.empty()) { - components.insert(category->component); + components_.insert(category->component); return; } } }); // Check for the payment component - auto apk = apk_; - ForEachChild(root.get(), [&apk, &components, &diag](ManifestExtractor::Element* el) -> void { + ForEachChild(root_element_.get(), [this, &diag](ManifestExtractor::Element* el) -> void { if (auto service = ElementCast(el)) { auto host_apdu_action = ElementCast(FindElement(service, [&](ManifestExtractor::Element* el) -> bool { @@ -2193,44 +2231,162 @@ bool ManifestExtractor::Dump(text::Printer* printer, IDiagnostics* diag) { return false; })); - ForEachChild(service, [&apk, &components, &diag, &host_apdu_action, - &offhost_apdu_action](ManifestExtractor::Element* el) -> void { - if (auto meta_data = ElementCast(el)) { - if ((meta_data->name == "android.nfc.cardemulation.host_apdu_service" && host_apdu_action) - || (meta_data->name == "android.nfc.cardemulation.off_host_apdu_service" - && offhost_apdu_action)) { + ForEachChild(service, + [this, &diag, &host_apdu_action, + &offhost_apdu_action](ManifestExtractor::Element* el) -> void { + if (auto meta_data = ElementCast(el)) { + if ((meta_data->name == "android.nfc.cardemulation.host_apdu_service" && + host_apdu_action) || + (meta_data->name == "android.nfc.cardemulation.off_host_apdu_service" && + offhost_apdu_action)) { + // Attempt to load the resource file + if (!meta_data->resource.empty()) { + return; + } + auto resource = this->apk_->LoadXml(meta_data->resource, diag); + if (!resource) { + return; + } - // Attempt to load the resource file - if (!meta_data->resource.empty()) { - return; - } - auto resource = apk->LoadXml(meta_data->resource, diag); - if (!resource) { - return; - } - - // Look for the payment category on an element - auto& root = resource.get()->root; - if ((host_apdu_action && root->name == "host-apdu-service") - || (offhost_apdu_action && root->name == "offhost-apdu-service")) { - - for (auto& child : root->GetChildElements()) { - if (child->name == "aid-group") { - auto category = FindAttribute(child, CATEGORY_ATTR); - if (category && category->value == "payment") { - components.insert("payment"); - return; - } - } - } - } - } - } - }); + // Look for the payment category on an element + auto& root = resource.get()->root; + if ((host_apdu_action && root->name == "host-apdu-service") || + (offhost_apdu_action && root->name == "offhost-apdu-service")) { + for (auto& child : root->GetChildElements()) { + if (child->name == "aid-group") { + auto category = FindAttribute(child, CATEGORY_ATTR); + if (category && category->value == "payment") { + this->components_.insert("payment"); + return; + } + } + } + } + } + } + }); } }); + // Print presence of activities, receivers, and services with no special components + FindElement(root_element_.get(), [&](ManifestExtractor::Element* el) -> bool { + if (auto activity = ElementCast(el)) { + if (!activity->has_component_) { + other_activities_ = true; + return true; + } + } + return false; + }); + + FindElement(root_element_.get(), [&](ManifestExtractor::Element* el) -> bool { + if (auto receiver = ElementCast(el)) { + if (!receiver->has_component) { + other_receivers_ = true; + return true; + } + } + return false; + }); + + FindElement(root_element_.get(), [&](ManifestExtractor::Element* el) -> bool { + if (auto service = ElementCast(el)) { + if (!service->has_component) { + other_services_ = true; + return true; + } + } + return false; + }); + + // Gather the supported screens + const static SupportsScreen default_screens{}; + SupportsScreen* screen = ElementCast( + FindElement(root_element_.get(), [&](ManifestExtractor::Element* el) -> bool { + return ElementCast(el) != nullptr; + })); + supports_screen_ = screen ? screen : &default_screens; + + // Gather the supported architectures_ of the app + std::set architectures_from_apk; + auto it = apk_->GetFileCollection()->Iterator(); + while (it->HasNext()) { + auto file_path = it->Next()->GetSource().path; + size_t pos = file_path.find("lib/"); + if (pos != std::string::npos) { + file_path = file_path.substr(pos + 4); + pos = file_path.find('/'); + if (pos != std::string::npos) { + file_path = file_path.substr(0, pos); + } + + architectures_from_apk.insert(file_path); + } + } + + // Determine if the application has multiArch supports + auto has_multi_arch = + FindElement(root_element_.get(), [&](ManifestExtractor::Element* el) -> bool { + if (auto application = ElementCast(el)) { + return application->has_multi_arch; + } + return false; + }); + + bool output_alt_native_code = false; + // A multiArch package is one that contains 64-bit and + // 32-bit versions of native code and expects 3rd-party + // apps to load these native code libraries. Since most + // 64-bit systems also support 32-bit apps, the apps + // loading this multiArch package's code may be either + if (has_multi_arch) { + // If this is a multiArch package, report the 64-bit + // version only. Then as a separate entry, report the + // rest. + // + // If we report the 32-bit architecture, this APK will + // be installed on a 32-bit device, causing a large waste + // of bandwidth and disk space. This assumes that + // the developer of the multiArch package has also + // made a version that is 32-bit only. + const std::string kIntel64 = "x86_64"; + const std::string kArm64 = "arm64-v8a"; + + auto arch = architectures_from_apk.find(kIntel64); + if (arch == architectures_from_apk.end()) { + arch = architectures_from_apk.find(kArm64); + } + + if (arch != architectures_from_apk.end()) { + architectures_->architectures.insert(*arch); + architectures_from_apk.erase(arch); + output_alt_native_code = true; + } + } + for (auto& arch : architectures_from_apk) { + if (output_alt_native_code) { + architectures_->alt_architectures.insert(arch); + } else { + architectures_->architectures.insert(arch); + } + } + return true; +} + +bool ManifestExtractor::Dump(text::Printer* printer) { + Print(root_element_.get(), printer); + if (options_.only_permissions) { + return true; + } + + for (auto& implied_permission : implied_permissions_) { + implied_permission->Print(printer); + } + for (auto& feature_group : feature_groups_) { + feature_group->PrintGroup(printer); + } // Print the components types if they are present + auto& components = components_; auto PrintComponent = [&components, &printer](const std::string& component) -> void { if (components.find(component) != components.end()) { printer->Print(StringPrintf("provides-component:'%s'\n", component.data())); @@ -2257,50 +2413,16 @@ bool ManifestExtractor::Dump(text::Printer* printer, IDiagnostics* diag) { printer->Print("main\n"); } - // Print presence of activities, recivers, and services with no special components - FindElement(root.get(), [&printer](ManifestExtractor::Element* el) -> bool { - if (auto activity = ElementCast(el)) { - if (!activity->has_component_) { - printer->Print("other-activities\n"); - return true; - } - } - return false; - }); - - FindElement(root.get(), [&printer](ManifestExtractor::Element* el) -> bool { - if (auto receiver = ElementCast(el)) { - if (!receiver->has_component) { - printer->Print("other-receivers\n"); - return true; - } - } - return false; - }); - - FindElement(root.get(), [&printer](ManifestExtractor::Element* el) -> bool { - if (auto service = ElementCast(el)) { - if (!service->has_component) { - printer->Print("other-services\n"); - return true; - } - } - return false; - }); - - // Print the supported screens - SupportsScreen* screen = ElementCast(FindElement(root.get(), - [&](ManifestExtractor::Element* el) -> bool { - return ElementCast(el) != nullptr; - })); - - if (screen) { - screen->PrintScreens(printer, target_sdk_); - } else { - // Print the default supported screens - SupportsScreen default_screens; - default_screens.PrintScreens(printer, target_sdk_); + if (other_activities_) { + printer->Print("other-activities\n"); } + if (other_receivers_) { + printer->Print("other-receivers\n"); + } + if (other_services_) { + printer->Print("other-services\n"); + } + supports_screen_->PrintScreens(printer, target_sdk_); // Print all the unique locales of the apk printer->Print("locales:"); @@ -2320,75 +2442,7 @@ bool ManifestExtractor::Dump(text::Printer* printer, IDiagnostics* diag) { } printer->Print("\n"); - // Print the supported architectures of the app - std::set architectures; - auto it = apk_->GetFileCollection()->Iterator(); - while (it->HasNext()) { - auto file_path = it->Next()->GetSource().path; - - - size_t pos = file_path.find("lib/"); - if (pos != std::string::npos) { - file_path = file_path.substr(pos + 4); - pos = file_path.find('/'); - if (pos != std::string::npos) { - file_path = file_path.substr(0, pos); - } - - architectures.insert(file_path); - } - } - - // Determine if the application has multiArch supports - auto has_multi_arch = FindElement(root.get(), [&](ManifestExtractor::Element* el) -> bool { - if (auto application = ElementCast(el)) { - return application->has_multi_arch; - } - return false; - }); - - bool output_alt_native_code = false; - // A multiArch package is one that contains 64-bit and - // 32-bit versions of native code and expects 3rd-party - // apps to load these native code libraries. Since most - // 64-bit systems also support 32-bit apps, the apps - // loading this multiArch package's code may be either - if (has_multi_arch) { - // If this is a multiArch package, report the 64-bit - // version only. Then as a separate entry, report the - // rest. - // - // If we report the 32-bit architecture, this APK will - // be installed on a 32-bit device, causing a large waste - // of bandwidth and disk space. This assumes that - // the developer of the multiArch package has also - // made a version that is 32-bit only. - const std::string kIntel64 = "x86_64"; - const std::string kArm64 = "arm64-v8a"; - - auto arch = architectures.find(kIntel64); - if (arch == architectures.end()) { - arch = architectures.find(kArm64); - } - - if (arch != architectures.end()) { - printer->Print(StringPrintf("native-code: '%s'\n", arch->data())); - architectures.erase(arch); - output_alt_native_code = true; - } - } - - if (architectures.size() > 0) { - if (output_alt_native_code) { - printer->Print("alt-"); - } - printer->Print("native-code:"); - for (auto& arch : architectures) { - printer->Print(StringPrintf(" '%s'", arch.data())); - } - printer->Print("\n"); - } - + architectures_->Print(printer); return true; } @@ -2531,7 +2585,10 @@ std::unique_ptr ManifestExtractor::Visit(xml::Elemen int DumpManifest(LoadedApk* apk, DumpManifestOptions& options, text::Printer* printer, IDiagnostics* diag) { ManifestExtractor extractor(apk, options); - return extractor.Dump(printer, diag) ? 0 : 1; + if (!extractor.Extract(diag)) { + return 0; + } + return extractor.Dump(printer) ? 0 : 1; } } // namespace aapt From 85875a83501d3bdc551cbddcecc26bab4617b06a Mon Sep 17 00:00:00 2001 From: Iurii Makhno Date: Tue, 26 Apr 2022 15:30:01 +0000 Subject: [PATCH 3/4] Extend DumpManifest unit to export badging data into proto. Bug: b/228950123 Test: Dump_test.cpp Change-Id: I3c228767b435d0e31f1eec1f34daeec1065628d0 --- tools/aapt2/Android.bp | 1 + tools/aapt2/ApkInfo.proto | 338 ++++++++++++++++ tools/aapt2/dump/DumpManifest.cpp | 642 ++++++++++++++++++++++++------ tools/aapt2/dump/DumpManifest.h | 4 + 4 files changed, 874 insertions(+), 111 deletions(-) create mode 100644 tools/aapt2/ApkInfo.proto diff --git a/tools/aapt2/Android.bp b/tools/aapt2/Android.bp index 3dc550e855eca..51694c0556ddd 100644 --- a/tools/aapt2/Android.bp +++ b/tools/aapt2/Android.bp @@ -159,6 +159,7 @@ cc_library_host_static { "xml/XmlDom.cpp", "xml/XmlPullParser.cpp", "xml/XmlUtil.cpp", + "ApkInfo.proto", "Configuration.proto", "Resources.proto", "ResourcesInternal.proto", diff --git a/tools/aapt2/ApkInfo.proto b/tools/aapt2/ApkInfo.proto new file mode 100644 index 0000000000000..80bdccbc4dd23 --- /dev/null +++ b/tools/aapt2/ApkInfo.proto @@ -0,0 +1,338 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * 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 + * + * http://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. + */ + +syntax = "proto3"; + +import "frameworks/base/tools/aapt2/Resources.proto"; + +package aapt.pb; + +option java_package = "com.android.aapt"; + +// Top level message representing data extracted from the APK for 'apkinfo' +// command. +message ApkInfo { + message XmlFile { + string path = 1; + XmlNode root = 2; + } + + Badging badging = 1; + ResourceTable resource_table = 2; + repeated XmlFile xml_files = 3; +} + +// Data extracted from the manifest of the APK. +message Badging { + PackageInfo package = 1; + Application application = 2; + UsesSdk uses_sdk = 3; + UsesConfiguration uses_configuration = 4; + SupportsScreen supports_screen = 5; + SupportsInput supports_input = 6; + LaunchableActivity launchable_activity = 7; + LeanbackLaunchableActivity leanback_launchable_activity = 8; + StaticLibrary static_library = 9; + SdkLibrary sdk_library = 10; + Overlay overlay = 11; + PackageVerifier package_verifier = 12; + CompatibleScreens compatible_screens = 13; + Architectures architectures = 14; + SupportsGlTexture supports_gl_texture = 15; + Components components = 16; + + repeated string locales = 17; + repeated int32 densities = 18; + + repeated FeatureGroup feature_groups = 53; + repeated UsesPermission uses_permissions = 54; + repeated Permission permissions = 55; + repeated UsesLibrary uses_libraries = 56; + repeated UsesStaticLibrary uses_static_libraries = 57; + repeated UsesSdkLibrary uses_sdk_libraries = 58; + repeated UsesNativeLibrary uses_native_libraries = 59; + repeated UsesPackage uses_packages = 51; + + repeated Metadata metadata = 62; + repeated Property properties = 63; +} + +// Information extracted about package from and +// tags. +message PackageInfo { + enum InstallLocation { + DEFAULT_INSTALL_LOCATION = 0; + AUTO = 1; + INTERNAL_ONLY = 2; + PREFER_EXTERNAL = 3; + } + + string package = 1; + int32 version_code = 2; + string version_name = 3; + + string split = 4; + + string platform_version_name = 5; + string platform_version_code = 6; + + int32 compile_sdk_version = 7; + string compile_sdk_version_codename = 8; + + InstallLocation install_location = 9; + + string original_package = 10; +} + +// Information extracted from element. +message Application { + string label = 1; + string icon = 2; + string banner = 3; + + bool test_only = 4; + bool game = 5; + bool debuggable = 6; + + map locale_labels = 8; + map density_icons = 9; +} + +// Components defined in the APK. +message Components { + bool main = 1; + bool other_activities = 2; + bool other_receivers = 3; + bool other_services = 4; + + repeated string provided_components = 5; +} + +// Application's min and target SDKs. +message UsesSdk { + oneof min_sdk { + int32 min_sdk_version = 2; + string min_sdk_version_name = 3; + } + int32 max_sdk_version = 4; + oneof target_sdk { + int32 target_sdk_version = 5; + string target_sdk_version_name = 6; + } +} + +message UsesConfiguration { + int32 req_touch_screen = 1; + int32 req_keyboard_type = 2; + int32 req_hard_keyboard = 3; + int32 req_navigation = 4; + int32 req_five_way_nav = 5; +} + +// Screens supported by this application. +message SupportsScreen { + enum ScreenType { + UNSPECIFIED_SCREEN_TYPE = 0; + SMALL = 1; + NORMAL = 2; + LARGE = 3; + XLARGE = 4; + } + repeated ScreenType screens = 1; + bool supports_any_densities = 2; + int32 requires_smallest_width_dp = 3; + int32 compatible_width_limit_dp = 4; + int32 largest_width_limit_dp = 5; +} + +// Inputs supported by this application. +message SupportsInput { + repeated string inputs = 1; +} + +// Information about used features which is extracted from +// elements or implied from permissions. +message Feature { + message ImpliedData { + bool from_sdk_23_permission = 1; + repeated string reasons = 2; + } + + string name = 1; + bool required = 2; + int32 version = 3; + + ImpliedData implied_data = 4; +} + +message FeatureGroup { + string label = 1; + int32 open_gles_version = 2; + repeated Feature features = 3; +} + +// Information about permission requested by the application. +message UsesPermission { + message PermissionFlags { + bool never_for_location = 1; + } + + string name = 1; + int32 max_sdk_version = 2; + bool required = 3; + bool implied = 4; + bool sdk23_and_above = 5; + + repeated string required_features = 6; + repeated string required_not_features = 7; + + PermissionFlags permission_flags = 8; +} + +// Permission defined by the application. +message Permission { + string name = 1; +} + +// Data extracted about launchable activity. Launchable activity is an entry +// point on phone and tablet devices. +message LaunchableActivity { + string name = 1; + string icon = 2; + string label = 3; +} + +// Data extracted about leanback launchable activity. Leanback launchable +// activity is an entry point on TV devices. +message LeanbackLaunchableActivity { + string name = 1; + string icon = 2; + string label = 3; + string banner = 4; +} + +// Library used by the application. +message UsesLibrary { + string name = 1; + bool required = 2; +} + +// Static library this APK declares. +message StaticLibrary { + string name = 1; + int32 version = 2; + int32 version_major = 3; +} + +// Static library used by the application. +message UsesStaticLibrary { + string name = 1; + int32 version = 2; + int32 version_major = 3; + repeated string certificates = 4; +} + +// SDK library this APK declares. +message SdkLibrary { + string name = 1; + int32 version_major = 2; +} + +// SDK library used by the application. +message UsesSdkLibrary { + string name = 1; + int32 version_major = 2; + repeated string certificates = 3; +} + +// Native library used by the application. +message UsesNativeLibrary { + string name = 1; + bool required = 2; +} + +// Information extracted from elements defined across +// AndroidManifest.xml. +message Metadata { + string name = 1; + oneof value { + string value_string = 2; + int32 value_int = 3; + } + oneof resource { + string resource_string = 4; + int32 resource_int = 5; + } +} + +// Information about overlay that is declared in the APK. +message Overlay { + string target_package = 1; + int32 priority = 2; + bool static = 3; + string required_property_name = 4; + string required_property_value = 5; +} + +// Data extracted from element. +message PackageVerifier { + string name = 1; + string public_key = 2; +} + +// External packages used by the application +message UsesPackage { + string name = 1; + string package_type = 2; + int32 version = 3; + int32 version_major = 4; + repeated string certificates = 5; +} + +// Open GL textures format supported by the current application. +message SupportsGlTexture { + repeated string name = 1; +} + +// Screens compatible with the application. +message CompatibleScreens { + message Screen { + int32 size = 1; + int32 density = 2; + } + + repeated Screen screens = 1; +} + +// Architectures supported by the application. +message Architectures { + repeated string architectures = 1; + repeated string alt_architectures = 2; +} + +// Information extracted from elements defined across +// AndroidManifest.xml. +message Property { + string name = 1; + oneof value { + string value_string = 2; + int32 value_int = 3; + } + oneof resource { + string resource_string = 4; + int32 resource_int = 5; + } +} \ No newline at end of file diff --git a/tools/aapt2/dump/DumpManifest.cpp b/tools/aapt2/dump/DumpManifest.cpp index 64a9441d1ac2f..e36112d6126c2 100644 --- a/tools/aapt2/dump/DumpManifest.cpp +++ b/tools/aapt2/dump/DumpManifest.cpp @@ -17,8 +17,10 @@ #include "DumpManifest.h" #include +#include #include #include +#include #include #include "LoadedApk.h" @@ -114,10 +116,101 @@ static xml::Attribute* FindAttribute(xml::Element *el, const std::string &packag return el->FindAttribute(package, name); } +class Architectures { + public: + std::set architectures; + std::set alt_architectures; + + void Print(text::Printer* printer) { + if (!architectures.empty()) { + printer->Print("native-code:"); + for (auto& arch : architectures) { + printer->Print(StringPrintf(" '%s'", arch.data())); + } + printer->Print("\n"); + } + if (!alt_architectures.empty()) { + printer->Print("alt-native-code:"); + for (auto& arch : alt_architectures) { + printer->Print(StringPrintf(" '%s'", arch.data())); + } + printer->Print("\n"); + } + } + + void ToProto(pb::Badging* out_badging) { + auto out_architectures = out_badging->mutable_architectures(); + for (auto& arch : architectures) { + out_architectures->add_architectures(arch); + } + for (auto& arch : alt_architectures) { + out_architectures->add_alt_architectures(arch); + } + } +}; + +const static std::array printable_components{"app-widget", + "device-admin", + "ime", + "wallpaper", + "accessibility", + "print-service", + "payment", + "search", + "document-provider", + "launcher", + "notification-listener", + "dream", + "camera", + "camera-secure"}; + +class Components { + public: + std::set> discovered_components; + bool other_activities = false; + bool other_receivers = false; + bool other_services = false; + + void Print(text::Printer* printer) { + for (auto& component : printable_components) { + if (discovered_components.find(component) != discovered_components.end()) { + printer->Print(StringPrintf("provides-component:'%s'\n", component.data())); + } + } + // Print presence of main activity + if (discovered_components.find("main") != discovered_components.end()) { + printer->Print("main\n"); + } + + if (other_activities) { + printer->Print("other-activities\n"); + } + if (other_receivers) { + printer->Print("other-receivers\n"); + } + if (other_services) { + printer->Print("other-services\n"); + } + } + + void ToProto(pb::Badging* out_badging) { + auto out_components = out_badging->mutable_components(); + for (auto& component : printable_components) { + auto discovered = discovered_components.find(component); + if (discovered != discovered_components.end()) { + out_components->add_provided_components(*discovered); + } + } + out_components->set_main(discovered_components.find("main") != discovered_components.end()); + out_components->set_other_activities(other_activities); + out_components->set_other_receivers(other_receivers); + out_components->set_other_services(other_services); + } +}; + class CommonFeatureGroup; -class Architectures; -class SupportsScreen; class FeatureGroup; +class SupportsScreen; class ManifestExtractor { public: @@ -133,7 +226,12 @@ class ManifestExtractor { static std::unique_ptr Inflate(ManifestExtractor* extractor, xml::Element* el); /** Writes out the extracted contents of the element. */ - virtual void Print(text::Printer* printer) { } + virtual void Print(text::Printer* printer) { + } + + /** Saves extracted information into Badging proto. */ + virtual void ToProto(pb::Badging* out_badging) { + } /** Adds an element to the list of children of the element. */ void AddChild(std::unique_ptr& child) { children_.push_back(std::move(child)); } @@ -345,6 +443,7 @@ class ManifestExtractor { bool Extract(IDiagnostics* diag); bool Dump(text::Printer* printer); + bool DumpProto(pb::Badging* out_badging); /** Recursively visit the xml element tree and return a processed badging element tree. */ std::unique_ptr Visit(xml::Element* element); @@ -402,12 +501,9 @@ class ManifestExtractor { std::unique_ptr root_element_; std::vector> implied_permissions_; - std::set components_; std::vector feature_groups_; - bool other_activities_ = false; - bool other_receivers_ = false; - bool other_services_ = false; - std::unique_ptr architectures_ = util::make_unique(); + Components components_; + Architectures architectures_; const SupportsScreen* supports_screen_; }; @@ -480,6 +576,45 @@ class Manifest : public ManifestExtractor::Element { installLocation = GetAttributeInteger(FindAttribute(manifest, INSTALL_LOCATION_ATTR)); } + void ToProto(pb::Badging* out_badging) override { + auto out_package = out_badging->mutable_package(); + out_package->set_package(package); + out_package->set_version_code(versionCode); + out_package->set_version_name(versionName); + if (compilesdkVersion) { + out_package->set_compile_sdk_version(*compilesdkVersion); + } + if (compilesdkVersionCodename) { + out_package->set_compile_sdk_version_codename(*compilesdkVersionCodename); + } + if (platformVersionName) { + out_package->set_platform_version_name(*platformVersionName); + } else if (platformVersionNameInt) { + out_package->set_platform_version_name(std::to_string(*platformVersionNameInt)); + } + if (platformVersionCode) { + out_package->set_platform_version_code(*platformVersionCode); + } else if (platformVersionCodeInt) { + out_package->set_platform_version_code(std::to_string(*platformVersionCodeInt)); + } + + if (installLocation) { + switch (*installLocation) { + case 0: + out_package->set_install_location(pb::PackageInfo_InstallLocation_AUTO); + break; + case 1: + out_package->set_install_location(pb::PackageInfo_InstallLocation_INTERNAL_ONLY); + break; + case 2: + out_package->set_install_location(pb::PackageInfo_InstallLocation_PREFER_EXTERNAL); + break; + default: + break; + } + } + } + void Print(text::Printer* printer) override { if (only_package_name) { printer->Println(StringPrintf("package: %s", package.data())); @@ -624,6 +759,27 @@ class Application : public ManifestExtractor::Element { printer->Print("application-debuggable\n"); } } + + void ToProto(pb::Badging* out_badging) override { + auto application = out_badging->mutable_application(); + application->set_label(android::ResTable::normalizeForOutput(label.data())); + application->set_icon(icon); + application->set_banner(banner); + application->set_test_only(test_only != 0); + application->set_game(is_game != 0); + application->set_debuggable(debuggable != 0); + + auto out_locale_labels = application->mutable_locale_labels(); + for (auto& p : locale_labels) { + if (!p.first.empty()) { + (*out_locale_labels)[p.first] = p.second; + } + } + auto out_density_icons = application->mutable_density_icons(); + for (auto& p : density_icons) { + (*out_density_icons)[p.first] = p.second; + } + } }; /** Represents elements. **/ @@ -673,6 +829,23 @@ class UsesSdkBadging : public ManifestExtractor::Element { printer->Print(StringPrintf("targetSdkVersion:'%s'\n", target_sdk_name->data())); } } + + void ToProto(pb::Badging* out_badging) override { + auto out_sdks = out_badging->mutable_uses_sdk(); + if (min_sdk) { + out_sdks->set_min_sdk_version(*min_sdk); + } else if (min_sdk_name) { + out_sdks->set_min_sdk_version_name(*min_sdk_name); + } + if (max_sdk) { + out_sdks->set_max_sdk_version(*max_sdk); + } + if (target_sdk) { + out_sdks->set_target_sdk_version(*target_sdk); + } else if (target_sdk_name) { + out_sdks->set_target_sdk_version_name(*target_sdk_name); + } + } }; /** Represents elements. **/ @@ -717,6 +890,15 @@ class UsesConfiguarion : public ManifestExtractor::Element { } printer->Print("\n"); } + + void ToProto(pb::Badging* out_badging) override { + auto out_configuration = out_badging->mutable_uses_configuration(); + out_configuration->set_req_touch_screen(req_touch_screen); + out_configuration->set_req_keyboard_type(req_keyboard_type); + out_configuration->set_req_hard_keyboard(req_hard_keyboard); + out_configuration->set_req_navigation(req_navigation); + out_configuration->set_req_five_way_nav(req_five_way_nav); + } }; /** Represents elements. **/ @@ -760,53 +942,23 @@ class SupportsScreen : public ManifestExtractor::Element { } void PrintScreens(text::Printer* printer, int32_t target_sdk) const { - int32_t small_screen_temp = small_screen; - int32_t normal_screen_temp = normal_screen; - int32_t large_screen_temp = large_screen; - int32_t xlarge_screen_temp = xlarge_screen; - int32_t any_density_temp = any_density; - - // Determine default values for any unspecified screen sizes, - // based on the target SDK of the package. As of 4 (donut) - // the screen size support was introduced, so all default to - // enabled. - if (small_screen_temp > 0) { - small_screen_temp = target_sdk >= SDK_DONUT ? -1 : 0; - } - if (normal_screen_temp > 0) { - normal_screen_temp = -1; - } - if (large_screen_temp > 0) { - large_screen_temp = target_sdk >= SDK_DONUT ? -1 : 0; - } - if (xlarge_screen_temp > 0) { - // Introduced in Gingerbread. - xlarge_screen_temp = target_sdk >= SDK_GINGERBREAD ? -1 : 0; - } - if (any_density_temp > 0) { - any_density_temp = (target_sdk >= SDK_DONUT || requires_smallest_width_dp > 0 || - compatible_width_limit_dp > 0) - ? -1 - : 0; - } - // Print the formatted screen info printer->Print("supports-screens:"); - if (small_screen_temp != 0) { + if (IsSmallScreenSupported(target_sdk)) { printer->Print(" 'small'"); } - if (normal_screen_temp != 0) { + if (normal_screen != 0) { printer->Print(" 'normal'"); } - if (large_screen_temp != 0) { + if (IsLargeScreenSupported(target_sdk)) { printer->Print(" 'large'"); } - if (xlarge_screen_temp != 0) { + if (IsXLargeScreenSupported(target_sdk)) { printer->Print(" 'xlarge'"); } printer->Print("\n"); printer->Print(StringPrintf("supports-any-density: '%s'\n", - (any_density_temp ) ? "true" : "false")); + (IsAnyDensitySupported(target_sdk)) ? "true" : "false")); if (requires_smallest_width_dp > 0) { printer->Print(StringPrintf("requires-smallest-width:'%d'\n", requires_smallest_width_dp)); } @@ -817,6 +969,60 @@ class SupportsScreen : public ManifestExtractor::Element { printer->Print(StringPrintf("largest-width-limit:'%d'\n", largest_width_limit_dp)); } } + + void ToProtoScreens(pb::Badging* out_badging, int32_t target_sdk) const { + auto supports_screen = out_badging->mutable_supports_screen(); + if (IsSmallScreenSupported(target_sdk)) { + supports_screen->add_screens(pb::SupportsScreen_ScreenType_SMALL); + } + if (normal_screen != 0) { + supports_screen->add_screens(pb::SupportsScreen_ScreenType_NORMAL); + } + if (IsLargeScreenSupported(target_sdk)) { + supports_screen->add_screens(pb::SupportsScreen_ScreenType_LARGE); + } + if (IsXLargeScreenSupported(target_sdk)) { + supports_screen->add_screens(pb::SupportsScreen_ScreenType_XLARGE); + } + supports_screen->set_supports_any_densities(IsAnyDensitySupported(target_sdk)); + supports_screen->set_requires_smallest_width_dp(requires_smallest_width_dp); + supports_screen->set_compatible_width_limit_dp(compatible_width_limit_dp); + supports_screen->set_largest_width_limit_dp(largest_width_limit_dp); + } + + private: + // Determine default values for any unspecified screen sizes, + // based on the target SDK of the package. As of 4 (donut) + // the screen size support was introduced, so all default to + // enabled. + bool IsSmallScreenSupported(int32_t target_sdk) const { + if (small_screen > 0) { + return target_sdk >= SDK_DONUT; + } + return small_screen != 0; + } + + bool IsLargeScreenSupported(int32_t target_sdk) const { + if (large_screen > 0) { + return target_sdk >= SDK_DONUT; + } + return large_screen != 0; + } + + bool IsXLargeScreenSupported(int32_t target_sdk) const { + if (xlarge_screen > 0) { + return target_sdk >= SDK_GINGERBREAD; + } + return xlarge_screen != 0; + } + + bool IsAnyDensitySupported(int32_t target_sdk) const { + if (any_density > 0) { + return target_sdk >= SDK_DONUT || requires_smallest_width_dp > 0 || + compatible_width_limit_dp > 0; + } + return any_density != 0; + } }; /** Represents elements. **/ @@ -847,6 +1053,18 @@ class FeatureGroup : public ManifestExtractor::Element { } } + virtual void GroupToProto(pb::Badging* out_badging) { + auto feature_group = out_badging->add_feature_groups(); + feature_group->set_label(label); + feature_group->set_open_gles_version(open_gles_version); + for (auto& feature : features_) { + auto out_feature = feature_group->add_features(); + out_feature->set_name(feature.first); + out_feature->set_required(feature.second.required); + out_feature->set_version(feature.second.version); + } + } + /** Adds a feature to the feature group. */ void AddFeature(const std::string& name, bool required = true, int32_t version = -1) { features_.insert(std::make_pair(name, Feature{ required, version })); @@ -936,6 +1154,23 @@ class CommonFeatureGroup : public FeatureGroup { } } + virtual void GroupToProto(pb::Badging* out_badging) override { + FeatureGroup::GroupToProto(out_badging); + auto feature_group = + out_badging->mutable_feature_groups(out_badging->feature_groups_size() - 1); + for (auto& feature : implied_features_) { + if (features_.find(feature.first) == features_.end()) { + auto out_feature = feature_group->add_features(); + out_feature->set_name(feature.first); + auto implied_data = out_feature->mutable_implied_data(); + implied_data->set_from_sdk_23_permission(feature.second.implied_from_sdk_k23); + for (auto& reason : feature.second.reasons) { + implied_data->add_reasons(reason); + } + } + } + } + /** Returns true if the feature group has the given feature. */ bool HasFeature(const std::string& name) override { return FeatureGroup::HasFeature(name) @@ -1165,6 +1400,27 @@ class UsesPermission : public ManifestExtractor::Element { printer->Print(StringPrintf(" reason='%s'\n", impliedReason.data())); } } + + void ToProto(pb::Badging* out_badging) override { + if (!name.empty()) { + auto permission = out_badging->add_uses_permissions(); + permission->set_name(name); + if (maxSdkVersion > 0) { + permission->set_max_sdk_version(maxSdkVersion); + } + if ((usesPermissionFlags & kNeverForLocation) != 0) { + permission->mutable_permission_flags()->set_never_for_location(true); + } + for (auto& requiredFeature : requiredFeatures) { + permission->add_required_features(requiredFeature); + } + for (auto& requiredNotFeature : requiredNotFeatures) { + permission->add_required_not_features(requiredNotFeature); + } + permission->set_required(required != 0); + permission->set_implied(implied); + } + } }; /** Represents elements. **/ @@ -1225,6 +1481,17 @@ class UsesPermissionSdk23 : public ManifestExtractor::Element { printer->Print("\n"); } } + + void ToProto(pb::Badging* out_badging) override { + if (name) { + auto permission = out_badging->add_uses_permissions(); + permission->set_sdk23_and_above(true); + permission->set_name(*name); + if (maxSdkVersion) { + permission->set_max_sdk_version(*maxSdkVersion); + } + } + } }; /** Represents elements. These elements are only printing when dumping permissions. **/ @@ -1242,6 +1509,12 @@ class Permission : public ManifestExtractor::Element { printer->Print(StringPrintf("permission: %s\n", name.data())); } } + + void ToProto(pb::Badging* out_badging) override { + if (!name.empty()) { + out_badging->add_permissions()->set_name(name); + } + } }; /** Represents elements. **/ @@ -1322,6 +1595,22 @@ class Activity : public ManifestExtractor::Element { icon.data(), banner.data())); } } + + void ToProto(pb::Badging* out_badging) override { + if (has_main_action && has_launcher_category) { + auto activity = out_badging->mutable_launchable_activity(); + activity->set_name(name); + activity->set_label(android::ResTable::normalizeForOutput(label.data())); + activity->set_icon(icon); + } + if (has_leanback_launcher_category) { + auto activity = out_badging->mutable_leanback_launchable_activity(); + activity->set_name(name); + activity->set_label(android::ResTable::normalizeForOutput(label.data())); + activity->set_icon(icon); + activity->set_banner(banner); + } + } }; /** Represents elements. */ @@ -1422,6 +1711,14 @@ class UsesLibrary : public ManifestExtractor::Element { (required == 0) ? "-not-required" : "", name.data())); } } + + void ToProto(pb::Badging* out_badging) override { + if (!name.empty()) { + auto uses_library = out_badging->add_uses_libraries(); + uses_library->set_name(name); + uses_library->set_required(required != 0); + } + } }; /** Represents elements. **/ @@ -1446,6 +1743,13 @@ class StaticLibrary : public ManifestExtractor::Element { "static-library: name='%s' version='%d' versionMajor='%d'\n", name.data(), version, versionMajor)); } + + void ToProto(pb::Badging* out_badging) override { + auto static_library = out_badging->mutable_static_library(); + static_library->set_name(name); + static_library->set_version(version); + static_library->set_version_major(versionMajor); + } }; /** Represents elements. **/ @@ -1486,6 +1790,16 @@ class UsesStaticLibrary : public ManifestExtractor::Element { } printer->Print("\n"); } + + void ToProto(pb::Badging* out_badging) override { + auto uses_static_library = out_badging->add_uses_static_libraries(); + uses_static_library->set_name(name); + uses_static_library->set_version(version); + uses_static_library->set_version_major(versionMajor); + for (auto& cert : certDigests) { + uses_static_library->add_certificates(cert); + } + } }; /** Represents elements. **/ @@ -1507,6 +1821,12 @@ class SdkLibrary : public ManifestExtractor::Element { printer->Print( StringPrintf("sdk-library: name='%s' versionMajor='%d'\n", name.data(), versionMajor)); } + + void ToProto(pb::Badging* out_badging) override { + auto sdk_library = out_badging->mutable_sdk_library(); + sdk_library->set_name(name); + sdk_library->set_version_major(versionMajor); + } }; /** Represents elements. **/ @@ -1544,6 +1864,15 @@ class UsesSdkLibrary : public ManifestExtractor::Element { } printer->Print("\n"); } + + void ToProto(pb::Badging* out_badging) override { + auto uses_sdk_library = out_badging->add_uses_sdk_libraries(); + uses_sdk_library->set_name(name); + uses_sdk_library->set_version_major(versionMajor); + for (auto& cert : certDigests) { + uses_sdk_library->add_certificates(cert); + } + } }; /** Represents elements. **/ @@ -1567,6 +1896,14 @@ class UsesNativeLibrary : public ManifestExtractor::Element { (required == 0) ? "-not-required" : "", name.data())); } } + + void ToProto(pb::Badging* out_badging) override { + if (!name.empty()) { + auto uses_native_library = out_badging->add_uses_native_libraries(); + uses_native_library->set_name(name); + uses_native_library->set_required(required != 0); + } + } }; /** @@ -1607,6 +1944,24 @@ class MetaData : public ManifestExtractor::Element { printer->Print("\n"); } } + + void ToProto(pb::Badging* out_badging) override { + if (!name.empty()) { + auto metadata = out_badging->add_metadata(); + metadata->set_name(name); + if (!value.empty()) { + metadata->set_value_string(value); + } else if (value_int) { + metadata->set_value_int(*value_int); + } else { + if (!resource.empty()) { + metadata->set_resource_string(resource); + } else if (resource_int) { + metadata->set_resource_int(*resource_int); + } + } + } + } }; /** @@ -1736,6 +2091,13 @@ class SupportsInput : public ManifestExtractor::Element { printer->Print("\n"); } } + + void ToProto(pb::Badging* out_badging) override { + auto supports_input = out_badging->mutable_supports_input(); + for (auto& input : inputs) { + supports_input->add_inputs(input); + } + } }; /** Represents elements. **/ @@ -1769,6 +2131,12 @@ class OriginalPackage : public ManifestExtractor::Element { printer->Print(StringPrintf("original-package:'%s'\n", name->data())); } } + + void ToProto(pb::Badging* out_badging) override { + if (name) { + out_badging->mutable_package()->set_original_package(*name); + } + } }; @@ -1807,6 +2175,21 @@ class Overlay : public ManifestExtractor::Element { } printer->Print("\n"); } + + void ToProto(pb::Badging* out_badging) override { + auto overlay = out_badging->mutable_overlay(); + if (target_package) { + overlay->set_target_package(*target_package); + } + overlay->set_priority(priority); + overlay->set_static_(is_static); + if (required_property_name) { + overlay->set_required_property_name(*required_property_name); + } + if (required_property_value) { + overlay->set_required_property_value(*required_property_value); + } + } }; /** * Represents elements. **/ @@ -1827,6 +2210,14 @@ class PackageVerifier : public ManifestExtractor::Element { name->data(), public_key->data())); } } + + void ToProto(pb::Badging* out_badging) override { + auto package_verifier = out_badging->mutable_package_verifier(); + if (name && public_key) { + package_verifier->set_name(*name); + package_verifier->set_public_key(*public_key); + } + } }; /** Represents elements. **/ @@ -1875,6 +2266,21 @@ class UsesPackage : public ManifestExtractor::Element { } } } + + void ToProto(pb::Badging* out_badging) override { + if (name) { + auto uses_package = out_badging->add_uses_packages(); + uses_package->set_name(*name); + if (packageType) { + uses_package->set_package_type(*packageType); + uses_package->set_version(version); + uses_package->set_version_major(versionMajor); + for (auto& cert : certDigests) { + uses_package->add_certificates(cert); + } + } + } + } }; /** Represents elements. **/ @@ -1907,6 +2313,14 @@ class Screen : public ManifestExtractor::Element { size = GetAttributeInteger(FindAttribute(element, SCREEN_SIZE_ATTR)); density = GetAttributeInteger(FindAttribute(element, SCREEN_DENSITY_ATTR)); } + + void ToProto(pb::Badging* out_badging) override { + if (size && density) { + auto screen = out_badging->mutable_compatible_screens()->add_screens(); + screen->set_density(*density); + screen->set_size(*size); + } + } }; /** @@ -1952,6 +2366,12 @@ class SupportsGlTexture : public ManifestExtractor::Element { printer->Print(StringPrintf("supports-gl-texture:'%s'\n", name->data())); } } + + void ToProto(pb::Badging* out_badging) override { + if (name) { + out_badging->mutable_supports_gl_texture()->add_name(*name); + } + } }; /** Represents elements. **/ @@ -1987,27 +2407,22 @@ class Property : public ManifestExtractor::Element { } printer->Print("\n"); } -}; -class Architectures { - public: - std::set architectures; - std::set alt_architectures; - - void Print(text::Printer* printer) { - if (!architectures.empty()) { - printer->Print("native-code:"); - for (auto& arch : architectures) { - printer->Print(StringPrintf(" '%s'", arch.data())); + void ToProto(pb::Badging* out_badging) override { + if (!name.empty()) { + auto property = out_badging->add_properties(); + property->set_name(name); + if (!value.empty()) { + property->set_value_string(value); + } else if (value_int) { + property->set_value_int(*value_int); + } else { + if (!resource.empty()) { + property->set_resource_string(resource); + } else if (resource_int) { + property->set_resource_int(*resource_int); + } } - printer->Print("\n"); - } - if (!alt_architectures.empty()) { - printer->Print("alt-native-code:"); - for (auto& arch : alt_architectures) { - printer->Print(StringPrintf(" '%s'", arch.data())); - } - printer->Print("\n"); } } }; @@ -2020,6 +2435,14 @@ static void Print(ManifestExtractor::Element* el, text::Printer* printer) { } } +/** Recursively serializes extracted badging elements to proto. */ +static void ToProto(ManifestExtractor::Element* el, pb::Badging* out_badging) { + el->ToProto(out_badging); + for (auto& child : el->children()) { + ToProto(child.get(), out_badging); + } +} + bool ManifestExtractor::Extract(IDiagnostics* diag) { // Load the manifest doc_ = apk_->LoadXml("AndroidManifest.xml", diag); @@ -2198,7 +2621,7 @@ bool ManifestExtractor::Extract(IDiagnostics* diag) { if (ElementCast(el)) { auto action = ElementCast(el); if (!action->component.empty()) { - components_.insert(action->component); + components_.discovered_components.insert(action->component); return; } } @@ -2206,7 +2629,7 @@ bool ManifestExtractor::Extract(IDiagnostics* diag) { if (ElementCast(el)) { auto category = ElementCast(el); if (!category->component.empty()) { - components_.insert(category->component); + components_.discovered_components.insert(category->component); return; } } @@ -2256,7 +2679,7 @@ bool ManifestExtractor::Extract(IDiagnostics* diag) { if (child->name == "aid-group") { auto category = FindAttribute(child, CATEGORY_ATTR); if (category && category->value == "payment") { - this->components_.insert("payment"); + this->components_.discovered_components.insert("payment"); return; } } @@ -2272,7 +2695,7 @@ bool ManifestExtractor::Extract(IDiagnostics* diag) { FindElement(root_element_.get(), [&](ManifestExtractor::Element* el) -> bool { if (auto activity = ElementCast(el)) { if (!activity->has_component_) { - other_activities_ = true; + components_.other_activities = true; return true; } } @@ -2282,7 +2705,7 @@ bool ManifestExtractor::Extract(IDiagnostics* diag) { FindElement(root_element_.get(), [&](ManifestExtractor::Element* el) -> bool { if (auto receiver = ElementCast(el)) { if (!receiver->has_component) { - other_receivers_ = true; + components_.other_receivers = true; return true; } } @@ -2292,7 +2715,7 @@ bool ManifestExtractor::Extract(IDiagnostics* diag) { FindElement(root_element_.get(), [&](ManifestExtractor::Element* el) -> bool { if (auto service = ElementCast(el)) { if (!service->has_component) { - other_services_ = true; + components_.other_services = true; return true; } } @@ -2358,16 +2781,16 @@ bool ManifestExtractor::Extract(IDiagnostics* diag) { } if (arch != architectures_from_apk.end()) { - architectures_->architectures.insert(*arch); + architectures_.architectures.insert(*arch); architectures_from_apk.erase(arch); output_alt_native_code = true; } } for (auto& arch : architectures_from_apk) { if (output_alt_native_code) { - architectures_->alt_architectures.insert(arch); + architectures_.alt_architectures.insert(arch); } else { - architectures_->architectures.insert(arch); + architectures_.architectures.insert(arch); } } return true; @@ -2385,43 +2808,7 @@ bool ManifestExtractor::Dump(text::Printer* printer) { for (auto& feature_group : feature_groups_) { feature_group->PrintGroup(printer); } - // Print the components types if they are present - auto& components = components_; - auto PrintComponent = [&components, &printer](const std::string& component) -> void { - if (components.find(component) != components.end()) { - printer->Print(StringPrintf("provides-component:'%s'\n", component.data())); - } - }; - - PrintComponent("app-widget"); - PrintComponent("device-admin"); - PrintComponent("ime"); - PrintComponent("wallpaper"); - PrintComponent("accessibility"); - PrintComponent("print-service"); - PrintComponent("payment"); - PrintComponent("search"); - PrintComponent("document-provider"); - PrintComponent("launcher"); - PrintComponent("notification-listener"); - PrintComponent("dream"); - PrintComponent("camera"); - PrintComponent("camera-secure"); - - // Print presence of main activity - if (components.find("main") != components.end()) { - printer->Print("main\n"); - } - - if (other_activities_) { - printer->Print("other-activities\n"); - } - if (other_receivers_) { - printer->Print("other-receivers\n"); - } - if (other_services_) { - printer->Print("other-services\n"); - } + components_.Print(printer); supports_screen_->PrintScreens(printer, target_sdk_); // Print all the unique locales of the apk @@ -2442,7 +2829,31 @@ bool ManifestExtractor::Dump(text::Printer* printer) { } printer->Print("\n"); - architectures_->Print(printer); + architectures_.Print(printer); + return true; +} + +bool ManifestExtractor::DumpProto(pb::Badging* out_badging) { + ToProto(root_element_.get(), out_badging); + for (auto& implied_permission : implied_permissions_) { + implied_permission->ToProto(out_badging); + } + for (auto& feature_group : feature_groups_) { + feature_group->GroupToProto(out_badging); + } + components_.ToProto(out_badging); + supports_screen_->ToProtoScreens(out_badging, target_sdk_); + + for (auto& config : locales_) { + if (!config.first.empty()) { + out_badging->add_locales(config.first); + } + } + for (auto& config : densities_) { + out_badging->add_densities(config.first); + } + + architectures_.ToProto(out_badging); return true; } @@ -2581,14 +2992,23 @@ std::unique_ptr ManifestExtractor::Visit(xml::Elemen return element; } - int DumpManifest(LoadedApk* apk, DumpManifestOptions& options, text::Printer* printer, IDiagnostics* diag) { ManifestExtractor extractor(apk, options); if (!extractor.Extract(diag)) { - return 0; + return 1; } return extractor.Dump(printer) ? 0 : 1; } +int DumpBadgingProto(LoadedApk* apk, pb::Badging* out_badging, IDiagnostics* diag) { + DumpManifestOptions options{/* include_meta_data= */ true, + /* only_permissions= */ false}; + ManifestExtractor extractor(apk, options); + if (!extractor.Extract(diag)) { + return 1; + } + return extractor.DumpProto(out_badging) ? 0 : 1; +} + } // namespace aapt diff --git a/tools/aapt2/dump/DumpManifest.h b/tools/aapt2/dump/DumpManifest.h index daf22ed57a84d..72d1b464f1f5d 100644 --- a/tools/aapt2/dump/DumpManifest.h +++ b/tools/aapt2/dump/DumpManifest.h @@ -17,6 +17,7 @@ #ifndef AAPT2_DUMP_MANIFEST_H #define AAPT2_DUMP_MANIFEST_H +#include "ApkInfo.pb.h" #include "Diagnostics.h" #include "LoadedApk.h" #include "text/Printer.h" @@ -34,6 +35,9 @@ struct DumpManifestOptions { int DumpManifest(LoadedApk* apk, DumpManifestOptions& options, text::Printer* printer, IDiagnostics* diag); +/** Extracts badging data from the manifest of the APK and stores it in Badging proto. */ +int DumpBadgingProto(LoadedApk* apk, pb::Badging* out_badging, IDiagnostics* diag); + } // namespace aapt #endif // AAPT2_DUMP_MANIFEST_H \ No newline at end of file From f248074fb47428c11af0754b9a73eaa206c215cb Mon Sep 17 00:00:00 2001 From: Iurii Makhno Date: Tue, 26 Apr 2022 14:51:24 +0000 Subject: [PATCH 4/4] Implementation of 'aapt2 apkinfo' command. Bug: b/228950123 Test: Dump_test.cpp, ApkInfo_test.cpp Change-Id: Ibc63d826df5b7e83a1e61560a2d2fcad471c128d --- tools/aapt2/Android.bp | 1 + tools/aapt2/Main.cpp | 5 +- tools/aapt2/cmd/ApkInfo.cpp | 94 + tools/aapt2/cmd/ApkInfo.h | 49 + tools/aapt2/cmd/ApkInfo_test.cpp | 83 + .../DumpTest/components_expected_proto.txt | 165 ++ .../DumpTest/components_full_proto.txt | 2310 +++++++++++++++++ 7 files changed, 2705 insertions(+), 2 deletions(-) create mode 100644 tools/aapt2/cmd/ApkInfo.cpp create mode 100644 tools/aapt2/cmd/ApkInfo.h create mode 100644 tools/aapt2/cmd/ApkInfo_test.cpp create mode 100644 tools/aapt2/integration-tests/DumpTest/components_expected_proto.txt create mode 100644 tools/aapt2/integration-tests/DumpTest/components_full_proto.txt diff --git a/tools/aapt2/Android.bp b/tools/aapt2/Android.bp index 51694c0556ddd..cee3e5ca5da7b 100644 --- a/tools/aapt2/Android.bp +++ b/tools/aapt2/Android.bp @@ -24,6 +24,7 @@ package { } toolSources = [ + "cmd/ApkInfo.cpp", "cmd/Command.cpp", "cmd/Compile.cpp", "cmd/Convert.cpp", diff --git a/tools/aapt2/Main.cpp b/tools/aapt2/Main.cpp index b249c6c128e13..e47bd67c4b8d8 100644 --- a/tools/aapt2/Main.cpp +++ b/tools/aapt2/Main.cpp @@ -24,11 +24,11 @@ #include #include +#include "Diagnostics.h" #include "android-base/stringprintf.h" #include "android-base/utf8.h" #include "androidfw/StringPiece.h" - -#include "Diagnostics.h" +#include "cmd/ApkInfo.h" #include "cmd/Command.h" #include "cmd/Compile.h" #include "cmd/Convert.h" @@ -72,6 +72,7 @@ class MainCommand : public Command { AddOptionalSubcommand(util::make_unique()); AddOptionalSubcommand(util::make_unique()); AddOptionalSubcommand(util::make_unique()); + AddOptionalSubcommand(util::make_unique(diagnostics)); } int Action(const std::vector& args) override { diff --git a/tools/aapt2/cmd/ApkInfo.cpp b/tools/aapt2/cmd/ApkInfo.cpp new file mode 100644 index 0000000000000..7c9df4c64d958 --- /dev/null +++ b/tools/aapt2/cmd/ApkInfo.cpp @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * 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 + * + * http://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. + */ + +#include "ApkInfo.h" + +#include + +#include +#include + +#include "Diagnostics.h" +#include "LoadedApk.h" +#include "android-base/file.h" // for O_BINARY +#include "android-base/utf8.h" +#include "androidfw/StringPiece.h" +#include "dump/DumpManifest.h" +#include "format/proto/ProtoSerialize.h" + +using ::android::StringPiece; + +namespace aapt { + +int ExportApkInfo(LoadedApk* apk, bool include_resource_table, + const std::unordered_set& xml_resources, pb::ApkInfo* out_apk_info, + IDiagnostics* diag) { + auto result = DumpBadgingProto(apk, out_apk_info->mutable_badging(), diag); + if (result != 0) { + return result; + } + + if (include_resource_table) { + SerializeTableToPb(*apk->GetResourceTable(), out_apk_info->mutable_resource_table(), diag); + } + + for (auto& xml_resource : xml_resources) { + auto xml = apk->LoadXml(xml_resource, diag); + if (xml) { + auto out_xml = out_apk_info->add_xml_files(); + out_xml->set_path(xml_resource); + SerializeXmlResourceToPb(*xml, out_xml->mutable_root(), + {/* remove_empty_text_nodes= */ true}); + } + } + + return 0; +} + +int ApkInfoCommand::Action(const std::vector& args) { + if (args.size() != 1) { + std::cerr << "must supply a single APK\n"; + Usage(&std::cerr); + return 1; + } + const StringPiece& path = args[0]; + std::unique_ptr apk = LoadedApk::LoadApkFromPath(path, diag_); + if (!apk) { + return 1; + } + + pb::ApkInfo out_apk_info; + int result = + ExportApkInfo(apk.get(), include_resource_table_, xml_resources_, &out_apk_info, diag_); + if (result != 0) { + diag_->Error(DiagMessage() << "Failed to serialize ApkInfo into proto."); + return result; + } + + int mode = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY; + int outfd = ::android::base::utf8::open(output_path_.c_str(), mode, 0666); + if (outfd == -1) { + diag_->Error(DiagMessage() << "Failed to open output file."); + return 1; + } + + bool is_serialized = out_apk_info.SerializeToFileDescriptor(outfd); + close(outfd); + + return is_serialized ? 0 : 1; +} + +} // namespace aapt \ No newline at end of file diff --git a/tools/aapt2/cmd/ApkInfo.h b/tools/aapt2/cmd/ApkInfo.h new file mode 100644 index 0000000000000..d682678ffe8a5 --- /dev/null +++ b/tools/aapt2/cmd/ApkInfo.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * 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 + * + * http://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. + */ + +#ifndef AAPT2_APKINFO_H +#define AAPT2_APKINFO_H + +#include "Command.h" +#include "Diagnostics.h" + +namespace aapt { + +class ApkInfoCommand : public Command { + public: + explicit ApkInfoCommand(IDiagnostics* diag) : Command("apkinfo"), diag_(diag) { + SetDescription("Dump information about an APK in binary proto format."); + AddRequiredFlag("-o", "Output path", &output_path_, Command::kPath); + AddOptionalSwitch("--include-resource-table", "Include the resource table data into output.", + &include_resource_table_); + AddOptionalFlagList("--include-xml", + "Include an XML file content into output. Multiple XML files might be " + "requested during single invocation.", + &xml_resources_); + } + + int Action(const std::vector& args) override; + + private: + IDiagnostics* diag_; + std::string output_path_; + bool include_resource_table_ = false; + std::unordered_set xml_resources_; +}; + +} // namespace aapt + +#endif // AAPT2_APKINFO_H diff --git a/tools/aapt2/cmd/ApkInfo_test.cpp b/tools/aapt2/cmd/ApkInfo_test.cpp new file mode 100644 index 0000000000000..70539c08d67b2 --- /dev/null +++ b/tools/aapt2/cmd/ApkInfo_test.cpp @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * 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 + * + * http://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. + */ + +#include "ApkInfo.h" + +#include "ApkInfo.pb.h" +#include "LoadedApk.h" +#include "android-base/unique_fd.h" +#include "io/StringStream.h" +#include "test/Test.h" + +using testing::Eq; +using testing::Ne; + +namespace aapt { + +using ApkInfoTest = CommandTestFixture; + +void AssertProducedAndExpectedInfo(const std::string& produced_path, + const std::string& expected_path) { + android::base::unique_fd fd(open(produced_path.c_str(), O_RDONLY)); + ASSERT_NE(fd.get(), -1); + + pb::ApkInfo produced_apk_info; + produced_apk_info.ParseFromFileDescriptor(fd.get()); + + std::string expected; + ::android::base::ReadFileToString(expected_path, &expected); + + EXPECT_EQ(produced_apk_info.DebugString(), expected); +} + +class NoopDiagnostics : public IDiagnostics { + public: + void Log(Level level, DiagMessageActual& actualMsg) override { + } +}; +static NoopDiagnostics noop_diag; + +TEST_F(ApkInfoTest, ApkInfoWithBadging) { + auto apk_path = file::BuildPath( + {android::base::GetExecutableDirectory(), "integration-tests", "DumpTest", "components.apk"}); + auto out_info_path = GetTestPath("apk_info.pb"); + + ApkInfoCommand command(&noop_diag); + command.Execute({"-o", out_info_path, apk_path}, &std::cerr); + + auto expected_path = + file::BuildPath({android::base::GetExecutableDirectory(), "integration-tests", "DumpTest", + "components_expected_proto.txt"}); + AssertProducedAndExpectedInfo(out_info_path, expected_path); +} + +TEST_F(ApkInfoTest, FullApkInfo) { + auto apk_path = file::BuildPath( + {android::base::GetExecutableDirectory(), "integration-tests", "DumpTest", "components.apk"}); + auto out_info_path = GetTestPath("apk_info.pb"); + + ApkInfoCommand command(&noop_diag); + command.Execute({"-o", out_info_path, "--include-resource-table", "--include-xml", + "AndroidManifest.xml", "--include-xml", "res/oy.xml", apk_path}, + &std::cerr); + + auto expected_path = + file::BuildPath({android::base::GetExecutableDirectory(), "integration-tests", "DumpTest", + "components_full_proto.txt"}); + AssertProducedAndExpectedInfo(out_info_path, expected_path); +} + +} // namespace aapt \ No newline at end of file diff --git a/tools/aapt2/integration-tests/DumpTest/components_expected_proto.txt b/tools/aapt2/integration-tests/DumpTest/components_expected_proto.txt new file mode 100644 index 0000000000000..775641054c066 --- /dev/null +++ b/tools/aapt2/integration-tests/DumpTest/components_expected_proto.txt @@ -0,0 +1,165 @@ +badging { + package { + package: "com.example.bundletool.minimal" + version_code: 1 + version_name: "1.0" + platform_version_name: "12" + platform_version_code: "31" + compile_sdk_version: 31 + compile_sdk_version_codename: "12" + } + application { + label: "minimal" + icon: "res/uF.xml" + density_icons { + key: 160 + value: "res/uF.xml" + } + density_icons { + key: 240 + value: "res/uF.xml" + } + density_icons { + key: 320 + value: "res/uF.xml" + } + density_icons { + key: 480 + value: "res/uF.xml" + } + density_icons { + key: 640 + value: "res/uF.xml" + } + density_icons { + key: 65534 + value: "res/uF.xml" + } + } + uses_sdk { + min_sdk_version: 21 + target_sdk_version: 31 + } + uses_configuration { + req_touch_screen: 3 + req_keyboard_type: 2 + req_hard_keyboard: -1 + req_navigation: 3 + req_five_way_nav: -1 + } + supports_screen { + screens: NORMAL + screens: LARGE + screens: XLARGE + supports_any_densities: true + requires_smallest_width_dp: 240 + compatible_width_limit_dp: 360 + largest_width_limit_dp: 480 + } + launchable_activity { + name: "com.example.bundletool.minimal.MainActivity" + label: "minimal" + } + compatible_screens { + screens { + size: 500 + density: 240 + } + screens { + size: 400 + density: 160 + } + } + architectures { + architectures: "x86_64" + alt_architectures: "x86" + } + supports_gl_texture { + name: "GL_OES_compressed_paletted_texture" + } + components { + main: true + other_receivers: true + other_services: true + provided_components: "app-widget" + provided_components: "device-admin" + provided_components: "ime" + provided_components: "wallpaper" + provided_components: "accessibility" + provided_components: "print-service" + provided_components: "search" + provided_components: "document-provider" + provided_components: "notification-listener" + provided_components: "dream" + provided_components: "camera" + provided_components: "camera-secure" + } + densities: 160 + densities: 240 + densities: 320 + densities: 480 + densities: 640 + densities: 65534 + feature_groups { + features { + name: "android.hardware.bluetooth" + required: true + } + features { + name: "android.hardware.camera" + required: true + } + features { + name: "android.hardware.faketouch" + implied_data { + reasons: "default feature for all apps" + } + } + features { + name: "android.hardware.telephony" + implied_data { + from_sdk_23_permission: true + reasons: "requested a telephony permission" + } + } + } + uses_permissions { + name: "android.permission.BIND_ACCESSIBILITY_SERVICE" + max_sdk_version: 24 + required: true + } + uses_permissions { + name: "android.permission.RECEIVE_SMS" + sdk23_and_above: true + } + uses_permissions { + name: "android.permission.WRITE_EXTERNAL_STORAGE" + required: true + } + uses_permissions { + name: "android.permission.READ_EXTERNAL_STORAGE" + required: true + implied: true + } + permissions { + name: "minimal.FIRST_PERMISSION" + } + uses_libraries { + name: "mylib1" + required: true + } + uses_libraries { + name: "my_optional_lib" + } + uses_native_libraries { + name: "native1" + required: true + } + uses_native_libraries { + name: "optional" + } + metadata { + name: "android.nfc.cardemulation.host_apdu_service" + resource_string: "res/dU.xml" + } +} diff --git a/tools/aapt2/integration-tests/DumpTest/components_full_proto.txt b/tools/aapt2/integration-tests/DumpTest/components_full_proto.txt new file mode 100644 index 0000000000000..bd7673616ddc8 --- /dev/null +++ b/tools/aapt2/integration-tests/DumpTest/components_full_proto.txt @@ -0,0 +1,2310 @@ +badging { + package { + package: "com.example.bundletool.minimal" + version_code: 1 + version_name: "1.0" + platform_version_name: "12" + platform_version_code: "31" + compile_sdk_version: 31 + compile_sdk_version_codename: "12" + } + application { + label: "minimal" + icon: "res/uF.xml" + density_icons { + key: 160 + value: "res/uF.xml" + } + density_icons { + key: 240 + value: "res/uF.xml" + } + density_icons { + key: 320 + value: "res/uF.xml" + } + density_icons { + key: 480 + value: "res/uF.xml" + } + density_icons { + key: 640 + value: "res/uF.xml" + } + density_icons { + key: 65534 + value: "res/uF.xml" + } + } + uses_sdk { + min_sdk_version: 21 + target_sdk_version: 31 + } + uses_configuration { + req_touch_screen: 3 + req_keyboard_type: 2 + req_hard_keyboard: -1 + req_navigation: 3 + req_five_way_nav: -1 + } + supports_screen { + screens: NORMAL + screens: LARGE + screens: XLARGE + supports_any_densities: true + requires_smallest_width_dp: 240 + compatible_width_limit_dp: 360 + largest_width_limit_dp: 480 + } + launchable_activity { + name: "com.example.bundletool.minimal.MainActivity" + label: "minimal" + } + compatible_screens { + screens { + size: 500 + density: 240 + } + screens { + size: 400 + density: 160 + } + } + architectures { + architectures: "x86_64" + alt_architectures: "x86" + } + supports_gl_texture { + name: "GL_OES_compressed_paletted_texture" + } + components { + main: true + other_receivers: true + other_services: true + provided_components: "app-widget" + provided_components: "device-admin" + provided_components: "ime" + provided_components: "wallpaper" + provided_components: "accessibility" + provided_components: "print-service" + provided_components: "search" + provided_components: "document-provider" + provided_components: "notification-listener" + provided_components: "dream" + provided_components: "camera" + provided_components: "camera-secure" + } + densities: 160 + densities: 240 + densities: 320 + densities: 480 + densities: 640 + densities: 65534 + feature_groups { + features { + name: "android.hardware.bluetooth" + required: true + } + features { + name: "android.hardware.camera" + required: true + } + features { + name: "android.hardware.faketouch" + implied_data { + reasons: "default feature for all apps" + } + } + features { + name: "android.hardware.telephony" + implied_data { + from_sdk_23_permission: true + reasons: "requested a telephony permission" + } + } + } + uses_permissions { + name: "android.permission.BIND_ACCESSIBILITY_SERVICE" + max_sdk_version: 24 + required: true + } + uses_permissions { + name: "android.permission.RECEIVE_SMS" + sdk23_and_above: true + } + uses_permissions { + name: "android.permission.WRITE_EXTERNAL_STORAGE" + required: true + } + uses_permissions { + name: "android.permission.READ_EXTERNAL_STORAGE" + required: true + implied: true + } + permissions { + name: "minimal.FIRST_PERMISSION" + } + uses_libraries { + name: "mylib1" + required: true + } + uses_libraries { + name: "my_optional_lib" + } + uses_native_libraries { + name: "native1" + required: true + } + uses_native_libraries { + name: "optional" + } + metadata { + name: "android.nfc.cardemulation.host_apdu_service" + resource_string: "res/dU.xml" + } +} +resource_table { + source_pool { + data: "\001\000\034\000$\000\000\000\001\000\000\000\000\000\000\000\000\001\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + } + package { + package_id { + id: 127 + } + package_name: "com.example.bundletool.minimal" + type { + type_id { + id: 1 + } + name: "color" + entry { + entry_id { + } + name: "black" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + prim { + color_argb8_value: 4278190080 + } + } + } + } + } + entry { + entry_id { + id: 1 + } + name: "purple_200" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + prim { + color_argb8_value: 4290479868 + } + } + } + } + } + entry { + entry_id { + id: 2 + } + name: "purple_500" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + prim { + color_argb8_value: 4284612846 + } + } + } + } + } + entry { + entry_id { + id: 3 + } + name: "purple_700" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + prim { + color_argb8_value: 4281794739 + } + } + } + } + } + entry { + entry_id { + id: 4 + } + name: "teal_200" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + prim { + color_argb8_value: 4278442693 + } + } + } + } + } + entry { + entry_id { + id: 5 + } + name: "teal_700" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + prim { + color_argb8_value: 4278290310 + } + } + } + } + } + entry { + entry_id { + id: 6 + } + name: "white" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + prim { + color_argb8_value: 4294967295 + } + } + } + } + } + } + type { + type_id { + id: 2 + } + name: "dimen" + entry { + entry_id { + } + name: "fab_margin" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + prim { + dimension_value: 4097 + } + } + } + } + } + } + type { + type_id { + id: 3 + } + name: "drawable" + entry { + entry_id { + } + name: "$ic_launcher_foreground__0" + visibility { + source { + } + } + config_value { + config { + density: 65534 + sdk_version: 24 + } + value { + source { + } + item { + file { + path: "res/Za.xml" + type: BINARY_XML + } + } + } + } + } + entry { + entry_id { + id: 1 + } + name: "ic_launcher_background" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + file { + path: "res/3N.xml" + type: BINARY_XML + } + } + } + } + } + entry { + entry_id { + id: 2 + } + name: "ic_launcher_foreground" + visibility { + source { + } + } + config_value { + config { + density: 65534 + sdk_version: 24 + } + value { + source { + } + item { + file { + path: "res/qm.xml" + type: BINARY_XML + } + } + } + } + } + } + type { + type_id { + id: 4 + } + name: "mipmap" + entry { + entry_id { + } + name: "ic_launcher" + visibility { + source { + } + } + config_value { + config { + density: 160 + } + value { + source { + } + item { + file { + path: "res/u3.png" + type: PNG + } + } + } + } + config_value { + config { + density: 240 + } + value { + source { + } + item { + file { + path: "res/SD.png" + type: PNG + } + } + } + } + config_value { + config { + density: 320 + } + value { + source { + } + item { + file { + path: "res/jy.png" + type: PNG + } + } + } + } + config_value { + config { + density: 480 + } + value { + source { + } + item { + file { + path: "res/D2.png" + type: PNG + } + } + } + } + config_value { + config { + density: 640 + } + value { + source { + } + item { + file { + path: "res/CG.png" + type: PNG + } + } + } + } + config_value { + config { + density: 65534 + sdk_version: 26 + } + value { + source { + } + item { + file { + path: "res/uF.xml" + type: BINARY_XML + } + } + } + } + } + entry { + entry_id { + id: 1 + } + name: "ic_launcher_round" + visibility { + source { + } + } + config_value { + config { + density: 160 + } + value { + source { + } + item { + file { + path: "res/7c.png" + type: PNG + } + } + } + } + config_value { + config { + density: 240 + } + value { + source { + } + item { + file { + path: "res/tf.png" + type: PNG + } + } + } + } + config_value { + config { + density: 320 + } + value { + source { + } + item { + file { + path: "res/1S.png" + type: PNG + } + } + } + } + config_value { + config { + density: 480 + } + value { + source { + } + item { + file { + path: "res/5Q.png" + type: PNG + } + } + } + } + config_value { + config { + density: 640 + } + value { + source { + } + item { + file { + path: "res/C9.png" + type: PNG + } + } + } + } + config_value { + config { + density: 65534 + sdk_version: 26 + } + value { + source { + } + item { + file { + path: "res/oy.xml" + type: BINARY_XML + } + } + } + } + } + } + type { + type_id { + id: 5 + } + name: "string" + entry { + entry_id { + } + name: "action_settings" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + str { + value: "Settings" + } + } + } + } + } + entry { + entry_id { + id: 1 + } + name: "app_name" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + str { + value: "minimal" + } + } + } + } + } + entry { + entry_id { + id: 2 + } + name: "first_fragment_label" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + str { + value: "First Fragment" + } + } + } + } + } + entry { + entry_id { + id: 3 + } + name: "hello_first_fragment" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + str { + value: "Hello first fragment" + } + } + } + } + } + entry { + entry_id { + id: 4 + } + name: "hello_second_fragment" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + str { + value: "Hello second fragment. Arg: %1$s" + } + } + } + } + } + entry { + entry_id { + id: 5 + } + name: "next" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + str { + value: "Next" + } + } + } + } + } + entry { + entry_id { + id: 6 + } + name: "previous" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + str { + value: "Previous" + } + } + } + } + } + entry { + entry_id { + id: 7 + } + name: "second_fragment_label" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + str { + value: "Second Fragment" + } + } + } + } + } + } + type { + type_id { + id: 6 + } + name: "xml" + entry { + entry_id { + } + name: "apduservice" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + file { + path: "res/dU.xml" + type: BINARY_XML + } + } + } + } + } + } + } + tool_fingerprint { + tool: "Android Asset Packaging Tool (aapt)" + version: "2.19-SOONG BUILD NUMBER PLACEHOLDER" + } +} +xml_files { + path: "res/oy.xml" + root { + element { + namespace_declaration { + prefix: "android" + uri: "http://schemas.android.com/apk/res/android" + source { + line_number: 2 + } + } + name: "adaptive-icon" + child { + element { + name: "background" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "drawable" + source { + } + resource_id: 16843161 + compiled_item { + ref { + id: 2130903041 + } + } + } + } + source { + line_number: 3 + } + } + child { + element { + name: "foreground" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "drawable" + source { + } + resource_id: 16843161 + compiled_item { + ref { + id: 2130903042 + } + } + } + } + source { + line_number: 4 + } + } + } + source { + line_number: 2 + } + } +} +xml_files { + path: "AndroidManifest.xml" + root { + element { + namespace_declaration { + prefix: "android" + uri: "http://schemas.android.com/apk/res/android" + source { + line_number: 2 + } + } + name: "manifest" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "versionCode" + source { + } + resource_id: 16843291 + compiled_item { + prim { + int_decimal_value: 1 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "versionName" + value: "1.0" + resource_id: 16843292 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "compileSdkVersion" + source { + } + resource_id: 16844146 + compiled_item { + prim { + int_decimal_value: 31 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "compileSdkVersionCodename" + value: "12" + resource_id: 16844147 + } + attribute { + name: "package" + value: "com.example.bundletool.minimal" + } + attribute { + name: "platformBuildVersionCode" + source { + } + compiled_item { + prim { + int_decimal_value: 31 + } + } + } + attribute { + name: "platformBuildVersionName" + source { + } + compiled_item { + prim { + int_decimal_value: 12 + } + } + } + child { + element { + name: "uses-sdk" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "minSdkVersion" + source { + } + resource_id: 16843276 + compiled_item { + prim { + int_decimal_value: 21 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "targetSdkVersion" + source { + } + resource_id: 16843376 + compiled_item { + prim { + int_decimal_value: 31 + } + } + } + } + source { + line_number: 7 + } + } + child { + element { + name: "supports-screens" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "anyDensity" + source { + } + resource_id: 16843372 + compiled_item { + prim { + boolean_value: true + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "smallScreens" + source { + } + resource_id: 16843396 + compiled_item { + prim { + boolean_value: false + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "normalScreens" + source { + } + resource_id: 16843397 + compiled_item { + prim { + boolean_value: true + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "largeScreens" + source { + } + resource_id: 16843398 + compiled_item { + prim { + boolean_value: true + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "requiresSmallestWidthDp" + source { + } + resource_id: 16843620 + compiled_item { + prim { + int_decimal_value: 240 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "compatibleWidthLimitDp" + source { + } + resource_id: 16843621 + compiled_item { + prim { + int_decimal_value: 360 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "largestWidthLimitDp" + source { + } + resource_id: 16843622 + compiled_item { + prim { + int_decimal_value: 480 + } + } + } + } + source { + line_number: 11 + } + } + child { + element { + name: "uses-configuration" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "reqTouchScreen" + source { + } + resource_id: 16843303 + compiled_item { + prim { + int_decimal_value: 3 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "reqKeyboardType" + source { + } + resource_id: 16843304 + compiled_item { + prim { + int_decimal_value: 2 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "reqHardKeyboard" + source { + } + resource_id: 16843305 + compiled_item { + prim { + boolean_value: true + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "reqNavigation" + source { + } + resource_id: 16843306 + compiled_item { + prim { + int_decimal_value: 3 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "reqFiveWayNav" + source { + } + resource_id: 16843314 + compiled_item { + prim { + boolean_value: true + } + } + } + } + source { + line_number: 20 + } + } + child { + element { + name: "supports-gl-texture" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "GL_OES_compressed_paletted_texture" + resource_id: 16842755 + } + } + source { + line_number: 27 + } + } + child { + element { + name: "permission" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "minimal.FIRST_PERMISSION" + resource_id: 16842755 + } + } + source { + line_number: 29 + } + } + child { + element { + name: "uses-feature" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.hardware.camera" + resource_id: 16842755 + } + } + source { + line_number: 31 + } + } + child { + element { + name: "uses-feature" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.hardware.bluetooth" + resource_id: 16842755 + } + } + source { + line_number: 32 + } + } + child { + element { + name: "uses-permission" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.permission.BIND_ACCESSIBILITY_SERVICE" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "maxSdkVersion" + source { + } + resource_id: 16843377 + compiled_item { + prim { + int_decimal_value: 24 + } + } + } + } + source { + line_number: 34 + } + } + child { + element { + name: "uses-permission-sdk-23" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.permission.RECEIVE_SMS" + resource_id: 16842755 + } + } + source { + line_number: 38 + } + } + child { + element { + name: "uses-permission" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.permission.WRITE_EXTERNAL_STORAGE" + resource_id: 16842755 + } + } + source { + line_number: 40 + } + } + child { + element { + name: "compatible-screens" + child { + element { + name: "screen" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "screenSize" + source { + } + resource_id: 16843466 + compiled_item { + prim { + int_decimal_value: 500 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "screenDensity" + source { + } + resource_id: 16843467 + compiled_item { + prim { + int_decimal_value: 240 + } + } + } + } + source { + line_number: 43 + } + } + child { + element { + name: "screen" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "screenSize" + source { + } + resource_id: 16843466 + compiled_item { + prim { + int_decimal_value: 400 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "screenDensity" + source { + } + resource_id: 16843467 + compiled_item { + prim { + int_decimal_value: 160 + } + } + } + } + source { + line_number: 46 + } + } + } + source { + line_number: 42 + } + } + child { + element { + name: "application" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "label" + source { + } + resource_id: 16842753 + compiled_item { + ref { + id: 2131034113 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "icon" + source { + } + resource_id: 16842754 + compiled_item { + ref { + id: 2130968576 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "allowBackup" + source { + } + resource_id: 16843392 + compiled_item { + prim { + boolean_value: true + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "supportsRtl" + source { + } + resource_id: 16843695 + compiled_item { + prim { + boolean_value: true + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "multiArch" + source { + } + resource_id: 16843918 + compiled_item { + prim { + boolean_value: true + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "roundIcon" + source { + } + resource_id: 16844076 + compiled_item { + ref { + id: 2130968577 + } + } + } + child { + element { + name: "uses-library" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "mylib1" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "required" + source { + } + resource_id: 16843406 + compiled_item { + prim { + boolean_value: true + } + } + } + } + source { + line_number: 58 + } + } + child { + element { + name: "uses-library" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "my_optional_lib" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "required" + source { + } + resource_id: 16843406 + compiled_item { + prim { + boolean_value: false + } + } + } + } + source { + line_number: 61 + } + } + child { + element { + name: "uses-native-library" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "native1" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "required" + source { + } + resource_id: 16843406 + compiled_item { + prim { + boolean_value: true + } + } + } + } + source { + line_number: 65 + } + } + child { + element { + name: "uses-native-library" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "optional" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "required" + source { + } + resource_id: 16843406 + compiled_item { + prim { + boolean_value: false + } + } + } + } + source { + line_number: 68 + } + } + child { + element { + name: "activity" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "label" + source { + } + resource_id: 16842753 + compiled_item { + ref { + id: 2131034113 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "com.example.bundletool.minimal.MainActivity" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "exported" + source { + } + resource_id: 16842768 + compiled_item { + prim { + boolean_value: false + } + } + } + child { + element { + name: "intent-filter" + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.intent.action.MAIN" + resource_id: 16842755 + } + } + source { + line_number: 77 + } + } + child { + element { + name: "category" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.intent.category.LAUNCHER" + resource_id: 16842755 + } + } + source { + line_number: 79 + } + } + } + source { + line_number: 76 + } + } + } + source { + line_number: 72 + } + } + child { + element { + name: "activity" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "label" + source { + } + resource_id: 16842753 + compiled_item { + ref { + id: 2131034113 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "com.example.bundletool.minimal.AnotherActivity" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "exported" + source { + } + resource_id: 16842768 + compiled_item { + prim { + boolean_value: false + } + } + } + child { + element { + name: "intent-filter" + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.intent.action.VIDEO_CAMERA" + resource_id: 16842755 + } + } + source { + line_number: 87 + } + } + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.intent.action.STILL_IMAGE_CAMERA_SECURE" + resource_id: 16842755 + } + } + source { + line_number: 88 + } + } + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.intent.action.SEARCH" + resource_id: 16842755 + } + } + source { + line_number: 89 + } + } + } + source { + line_number: 86 + } + } + } + source { + line_number: 82 + } + } + child { + element { + name: "receiver" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "com.example.bundletool.minimal.OneReceiver" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "exported" + source { + } + resource_id: 16842768 + compiled_item { + prim { + boolean_value: false + } + } + } + child { + element { + name: "intent-filter" + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.appwidget.action.APPWIDGET_UPDATE" + resource_id: 16842755 + } + } + source { + line_number: 97 + } + } + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.app.action.DEVICE_ADMIN_ENABLED" + resource_id: 16842755 + } + } + source { + line_number: 98 + } + } + } + source { + line_number: 96 + } + } + } + source { + line_number: 93 + } + } + child { + element { + name: "receiver" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "com.example.bundletool.minimal.TwoReceiver" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "permission" + value: "android.permission.BIND_DEVICE_ADMIN" + resource_id: 16842758 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "exported" + source { + } + resource_id: 16842768 + compiled_item { + prim { + boolean_value: false + } + } + } + child { + element { + name: "intent-filter" + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.app.action.DEVICE_ADMIN_ENABLED" + resource_id: 16842755 + } + } + source { + line_number: 106 + } + } + } + source { + line_number: 105 + } + } + } + source { + line_number: 101 + } + } + child { + element { + name: "receiver" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "com.example.bundletool.minimal.ThreeReceiver" + resource_id: 16842755 + } + } + source { + line_number: 109 + } + } + child { + element { + name: "service" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "com.example.bundletool.minimal.OneService" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "exported" + source { + } + resource_id: 16842768 + compiled_item { + prim { + boolean_value: false + } + } + } + child { + element { + name: "intent-filter" + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.view.InputMethod" + resource_id: 16842755 + } + } + source { + line_number: 115 + } + } + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.service.wallpaper.WallpaperService" + resource_id: 16842755 + } + } + source { + line_number: 116 + } + } + } + source { + line_number: 114 + } + } + } + source { + line_number: 111 + } + } + child { + element { + name: "service" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "com.example.bundletool.minimal.Services$TwoService" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "permission" + value: "android.permission.BIND_ACCESSIBILITY_SERVICE" + resource_id: 16842758 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "exported" + source { + } + resource_id: 16842768 + compiled_item { + prim { + boolean_value: false + } + } + } + child { + element { + name: "intent-filter" + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.accessibilityservice.AccessibilityService" + resource_id: 16842755 + } + } + source { + line_number: 124 + } + } + } + source { + line_number: 123 + } + } + } + source { + line_number: 119 + } + } + child { + element { + name: "service" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "com.example.bundletool.minimal.Services$ThreeService" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "permission" + value: "android.permission.BIND_PRINT_SERVICE" + resource_id: 16842758 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "exported" + source { + } + resource_id: 16842768 + compiled_item { + prim { + boolean_value: false + } + } + } + child { + element { + name: "intent-filter" + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.printservice.PrintService" + resource_id: 16842755 + } + } + source { + line_number: 132 + } + } + } + source { + line_number: 131 + } + } + } + source { + line_number: 127 + } + } + child { + element { + name: "service" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "com.example.bundletool.minimal.Services$FourService" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "permission" + value: "android.permission.BIND_NFC_SERVICE" + resource_id: 16842758 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "exported" + source { + } + resource_id: 16842768 + compiled_item { + prim { + boolean_value: false + } + } + } + child { + element { + name: "intent-filter" + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.nfc.cardemulation.action.HOST_APDU_SERVICE" + resource_id: 16842755 + } + } + source { + line_number: 140 + } + } + } + source { + line_number: 139 + } + } + child { + element { + name: "meta-data" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.nfc.cardemulation.host_apdu_service" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "resource" + source { + } + resource_id: 16842789 + compiled_item { + ref { + id: 2131099648 + } + } + } + } + source { + line_number: 143 + } + } + } + source { + line_number: 135 + } + } + child { + element { + name: "service" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "com.example.bundletool.minimal.Services$FiveService" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "permission" + value: "android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" + resource_id: 16842758 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "exported" + source { + } + resource_id: 16842768 + compiled_item { + prim { + boolean_value: false + } + } + } + child { + element { + name: "intent-filter" + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.service.notification.NotificationListenerService" + resource_id: 16842755 + } + } + source { + line_number: 152 + } + } + } + source { + line_number: 151 + } + } + } + source { + line_number: 147 + } + } + child { + element { + name: "service" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "com.example.bundletool.minimal.Services$SixService" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "permission" + value: "android.permission.BIND_DREAM_SERVICE" + resource_id: 16842758 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "exported" + source { + } + resource_id: 16842768 + compiled_item { + prim { + boolean_value: false + } + } + } + child { + element { + name: "intent-filter" + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.service.dreams.DreamService" + resource_id: 16842755 + } + } + source { + line_number: 160 + } + } + } + source { + line_number: 159 + } + } + } + source { + line_number: 155 + } + } + child { + element { + name: "service" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "com.example.bundletool.minimal.Services$SevenService" + resource_id: 16842755 + } + } + source { + line_number: 163 + } + } + child { + element { + name: "provider" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "com.example.bundletool.minimal.OneProvider" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "permission" + value: "android.permission.MANAGE_DOCUMENTS" + resource_id: 16842758 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "exported" + source { + } + resource_id: 16842768 + compiled_item { + prim { + boolean_value: true + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "authorities" + value: "A" + resource_id: 16842776 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "grantUriPermissions" + source { + } + resource_id: 16842779 + compiled_item { + prim { + boolean_value: true + } + } + } + child { + element { + name: "intent-filter" + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.content.action.DOCUMENTS_PROVIDER" + resource_id: 16842755 + } + } + source { + line_number: 172 + } + } + } + source { + line_number: 171 + } + } + } + source { + line_number: 165 + } + } + } + source { + line_number: 51 + } + } + } + source { + line_number: 2 + } + } +}