From 545a312e5570cfa54bf9e4c9d7fe33cdf83a0cab Mon Sep 17 00:00:00 2001 From: Celeter Date: Tue, 15 Jun 2021 16:34:48 +0800 Subject: [PATCH 1/2] =?UTF-8?q?epub=E6=94=AF=E6=8C=81=E5=A4=96=E9=83=A8?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/epub/chapter.html | 17 + app/src/main/assets/epub/cover.html | 22 + app/src/main/assets/epub/fonts.css | 267 +++++++++ app/src/main/assets/epub/intro.html | 12 + app/src/main/assets/epub/logo.png | Bin 0 -> 94214 bytes app/src/main/assets/epub/main.css | 551 ++++++++++++++++++ .../app/ui/book/cache/CacheViewModel.kt | 226 +++++-- .../main/java/me/ag2s/epublib/Constants.java | 1 + .../me/ag2s/epublib/domain/LazyResource.java | 11 +- .../java/me/ag2s/epublib/domain/Resource.java | 12 + .../me/ag2s/epublib/domain/Resources.java | 4 +- .../epublib/epub/PackageDocumentBase.java | 3 +- .../epub/PackageDocumentMetadataWriter.java | 9 + .../me/ag2s/epublib/util/ResourceUtil.java | 71 +-- .../java/me/ag2s/epublib/util/StringUtil.java | 32 +- 15 files changed, 1115 insertions(+), 123 deletions(-) create mode 100644 app/src/main/assets/epub/chapter.html create mode 100644 app/src/main/assets/epub/cover.html create mode 100644 app/src/main/assets/epub/fonts.css create mode 100644 app/src/main/assets/epub/intro.html create mode 100644 app/src/main/assets/epub/logo.png create mode 100644 app/src/main/assets/epub/main.css diff --git a/app/src/main/assets/epub/chapter.html b/app/src/main/assets/epub/chapter.html new file mode 100644 index 000000000..57b8bce01 --- /dev/null +++ b/app/src/main/assets/epub/chapter.html @@ -0,0 +1,17 @@ + + + + + Chapter + + + + + +

{title}

+{content} + + \ No newline at end of file diff --git a/app/src/main/assets/epub/cover.html b/app/src/main/assets/epub/cover.html new file mode 100644 index 000000000..268cc3f85 --- /dev/null +++ b/app/src/main/assets/epub/cover.html @@ -0,0 +1,22 @@ + + + + + Cover + + + +
+

{name}

+
{author} / 著
+ + \ No newline at end of file diff --git a/app/src/main/assets/epub/fonts.css b/app/src/main/assets/epub/fonts.css new file mode 100644 index 000000000..3457a6511 --- /dev/null +++ b/app/src/main/assets/epub/fonts.css @@ -0,0 +1,267 @@ +@charset "utf-8"; +/*---常用---*/ + +@font-face { + font-family: "zw"; + src: + local("宋体"),local("明体"),local("明朝"), + local("Songti"),local("Songti SC"),local("Songti TC"), /*iOS6+iBooks3*/ + local("Song S"),local("Song T"),local("STBShusong"),local("TBMincho"),local("HYMyeongJo"), /*Kindle Paperwihite*/ + local("DK-SONGTI"), + url(../Fonts/zw.ttf), + url(res:///opt/sony/ebook/FONT/zw.ttf), + url(res:///Data/FONT/zw.ttf), + url(res:///opt/sony/ebook/FONT/tt0011m_.ttf), + url(res:///ebook/fonts/../../mnt/sdcard/fonts/zw.ttf), + url(res:///ebook/fonts/../../mnt/extsd/fonts/zw.ttf), + url(res:///ebook/fonts/zw.ttf), + url(res:///ebook/fonts/DroidSansFallback.ttf), + url(res:///fonts/ttf/zw.ttf), + url(res:///../../media/mmcblk0p1/fonts/zw.ttf), + url(file:///mnt/us/DK_System/system/fonts/zw.ttf), /*Duokan Old Path*/ + url(file:///mnt/us/DK_System/xKindle/res/userfonts/zw.ttf), /*Duokan 2012 Path*/ + url(res:///abook/fonts/zw.ttf), + url(res:///system/fonts/zw.ttf), + url(res:///system/media/sdcard/fonts/zw.ttf), + url(res:///media/fonts/zw.ttf), + url(res:///sdcard/fonts/zw.ttf), + url(res:///system/fonts/DroidSansFallback.ttf), + url(res:///mnt/MOVIFAT/font/zw.ttf), + url(res:///media/flash/fonts/zw.ttf), + url(res:///media/sd/fonts/zw.ttf), + url(res:///opt/onyx/arm/lib/fonts/AdobeHeitiStd-Regular.otf), + url(res:///../../fonts/zw.ttf), + url(res:///../fonts/zw.ttf), + url(../../../../../zw.ttf), /*EpubReaderI*/ + url(res:///mnt/sdcard/fonts/zw.ttf), /*Nook for Android: fonts in TF Card*/ + url(res:///fonts/zw.ttf), /*ADE1,8, 2.0 Program Path*/ + url(res:///../../../../Windows/fonts/zw.ttf); + /*ADE1,8, 2.0 Windows Path*/; +} + +@font-face { + font-family: "fs"; + src: + local("amasis30"),local("仿宋"),local("仿宋_GB2312"), + local("Yuanti"),local("Yuanti SC"),local("Yuanti TC"), /*iOS6+iBooks3*/ + local("DK-FANGSONG"), + url(../Fonts/fs.ttf), + url(res:///opt/sony/ebook/FONT/fs.ttf), + url(res:///Data/FONT/fs.ttf), + url(res:///opt/sony/ebook/FONT/tt0011m_.ttf), + url(res:///ebook/fonts/../../mnt/sdcard/fonts/fs.ttf), + url(res:///ebook/fonts/../../mnt/extsd/fonts/fs.ttf), + url(res:///ebook/fonts/fs.ttf), + url(res:///ebook/fonts/DroidSansFallback.ttf), + url(res:///fonts/ttf/fs.ttf), + url(res:///../../media/mmcblk0p1/fonts/fs.ttf), + url(file:///mnt/us/DK_System/system/fonts/fs.ttf), /*Duokan Old Path*/ + url(file:///mnt/us/DK_System/xKindle/res/userfonts/fs.ttf), /*Duokan 2012 Path*/ + url(res:///abook/fonts/fs.ttf), + url(res:///system/fonts/fs.ttf), + url(res:///system/media/sdcard/fonts/fs.ttf), + url(res:///media/fonts/fs.ttf), + url(res:///sdcard/fonts/fs.ttf), + url(res:///system/fonts/DroidSansFallback.ttf), + url(res:///mnt/MOVIFAT/font/fs.ttf), + url(res:///media/flash/fonts/fs.ttf), + url(res:///media/sd/fonts/fs.ttf), + url(res:///opt/onyx/arm/lib/fonts/AdobeHeitiStd-Regular.otf), + url(res:///../../fonts/fs.ttf), + url(res:///../fonts/fs.ttf), + url(../../../../../fs.ttf), /*EpubReaderI*/ + url(res:///mnt/sdcard/fonts/fs.ttf), /*Nook for Android: fonts in TF Card*/ + url(res:///fonts/fs.ttf), /*ADE1,8, 2.0 Program Path*/ + url(res:///../../../../Windows/fonts/fs.ttf); + /*ADE1,8, 2.0 Windows Path*/; +} + +@font-face { + font-family: "kt"; + src: + local("Caecilia"),local("楷体"),local("楷体_GB2312"), + local("Kaiti"),local("Kaiti SC"),local("Kaiti TC"), /*iOS6+iBooks3*/ + local("MKai PRC"),local("MKaiGB18030C-Medium"),local("MKaiGB18030C-Bold"), /*Kindle Paperwihite*/ + local("DK-KAITI"), + url(../Fonts/kt.ttf), + url(res:///opt/sony/ebook/FONT/kt.ttf), + url(res:///Data/FONT/kt.ttf), + url(res:///opt/sony/ebook/FONT/tt0011m_.ttf), + url(res:///ebook/fonts/../../mnt/sdcard/fonts/kt.ttf), + url(res:///ebook/fonts/../../mnt/extsd/fonts/kt.ttf), + url(res:///ebook/fonts/kt.ttf), + url(res:///ebook/fonts/DroidSansFallback.ttf), + url(res:///fonts/ttf/kt.ttf), + url(res:///../../media/mmcblk0p1/fonts/kt.ttf), + url(file:///mnt/us/DK_System/system/fonts/kt.ttf), /*Duokan Old Path*/ + url(file:///mnt/us/DK_System/xKindle/res/userfonts/kt.ttf), /*Duokan 2012 Path*/ + url(res:///abook/fonts/kt.ttf), + url(res:///system/fonts/kt.ttf), + url(res:///system/media/sdcard/fonts/kt.ttf), + url(res:///media/fonts/kt.ttf), + url(res:///sdcard/fonts/kt.ttf), + url(res:///system/fonts/DroidSansFallback.ttf), + url(res:///mnt/MOVIFAT/font/kt.ttf), + url(res:///media/flash/fonts/kt.ttf), + url(res:///media/sd/fonts/kt.ttf), + url(res:///opt/onyx/arm/lib/fonts/AdobeHeitiStd-Regular.otf), + url(res:///../../fonts/kt.ttf), + url(res:///../fonts/kt.ttf), + url(../../../../../kt.ttf), /*EpubReaderI*/ + url(res:///mnt/sdcard/fonts/kt.ttf), /*Nook for Android: fonts in TF Card*/ + url(res:///fonts/kt.ttf), /*ADE1,8, 2.0 Program Path*/ + url(res:///../../../../Windows/fonts/kt.ttf); + /*ADE1,8, 2.0 Windows Path*/; +} + +@font-face { + font-family: "ht"; + src: + local("黑体"),local("微软雅黑"), + local("Heiti"),local("Heiti SC"),local("Heiti TC"), /*iOS6+iBooks3*/ + local("MYing Hei S"),local("MYing Hei T"),local("TBGothic"), /*Kindle Paperwihite*/ + local("DK-HEITI"), + url(../Fonts/ht.ttf), + url(res:///opt/sony/ebook/FONT/ht.ttf), + url(res:///Data/FONT/ht.ttf), + url(res:///opt/sony/ebook/FONT/tt0011m_.ttf), + url(res:///ebook/fonts/../../mnt/sdcard/fonts/ht.ttf), + url(res:///ebook/fonts/../../mnt/extsd/fonts/ht.ttf), + url(res:///ebook/fonts/ht.ttf), + url(res:///ebook/fonts/DroidSansFallback.ttf), + url(res:///fonts/ttf/ht.ttf), + url(res:///../../media/mmcblk0p1/fonts/ht.ttf), + url(file:///mnt/us/DK_System/system/fonts/ht.ttf), /*Duokan Old Path*/ + url(file:///mnt/us/DK_System/xKindle/res/userfonts/ht.ttf), /*Duokan 2012 Path*/ + url(res:///abook/fonts/ht.ttf), + url(res:///system/fonts/ht.ttf), + url(res:///system/media/sdcard/fonts/ht.ttf), + url(res:///media/fonts/ht.ttf), + url(res:///sdcard/fonts/ht.ttf), + url(res:///system/fonts/DroidSansFallback.ttf), + url(res:///mnt/MOVIFAT/font/ht.ttf), + url(res:///media/flash/fonts/ht.ttf), + url(res:///media/sd/fonts/ht.ttf), + url(res:///opt/onyx/arm/lib/fonts/AdobeHeitiStd-Regular.otf), + url(res:///../../fonts/ht.ttf), + url(res:///../fonts/ht.ttf), + url(../../../../../ht.ttf), /*EpubReaderI*/ + url(res:///mnt/sdcard/fonts/ht.ttf), /*Nook for Android: fonts in TF Card*/ + url(res:///fonts/ht.ttf), /*ADE1,8, 2.0 Program Path*/ + url(res:///../../../../Windows/fonts/ht.ttf); + /*ADE1,8, 2.0 Windows Path*/; +} +@font-face { + font-family:"h1"; + src: + local("方正兰亭特黑长_GBK"),local("方正兰亭特黑长简体"),local("方正兰亭特黑长繁体"), + local("LantingTeheichang"), + local("Yuanti"),local("Yuanti SC"),local("Yuanti TC"), + local("DK-HEITI"), + url(../Fonts/h1.ttf), + url(res:///opt/sony/ebook/FONT/h1.ttf), + url(res:///Data/FONT/h1.ttf), + url(res:///opt/sony/ebook/FONT/tt0011m_.ttf), + url(res:///ebook/fonts/../../mnt/sdcard/fonts/h1.ttf), + url(res:///ebook/fonts/../../mnt/extsd/fonts/h1.ttf), + url(res:///ebook/fonts/h1.ttf), + url(res:///ebook/fonts/DroidSansFallback.ttf), + url(res:///fonts/ttf/h1.ttf), + url(res:///../../media/mmcblk0p1/fonts/h1.ttf), + url(file:///mnt/us/DK_System/system/fonts/h1.ttf), /*Duokan Old Path*/ + url(file:///mnt/us/DK_System/xKindle/res/userfonts/h1.ttf), /*Duokan 2012 Path*/ + url(res:///abook/fonts/h1.ttf), + url(res:///system/fonts/h1.ttf), + url(res:///system/media/sdcard/fonts/h1.ttf), + url(res:///media/fonts/h1.ttf), + url(res:///sdcard/fonts/h1.ttf), + url(res:///system/fonts/DroidSansFallback.ttf), + url(res:///mnt/MOVIFAT/font/h1.ttf), + url(res:///media/flash/fonts/h1.ttf), + url(res:///media/sd/fonts/h1.ttf), + url(res:///opt/onyx/arm/lib/fonts/AdobeHeitiStd-Regular.otf), + url(res:///../../fonts/h1.ttf), + url(res:///../fonts/h1.ttf), + url(../../../../../h1.ttf), /*EpubReaderI*/ + url(res:///mnt/sdcard/fonts/h1.ttf), /*Nook for Android: fonts in TF Card*/ + url(res:///fonts/h1.ttf), /*ADE1,8, 2.0 Program Path*/ + url(res:///../../../../Windows/fonts/h1.ttf); /*ADE1,8, 2.0 Windows Path*/ +} +@font-face { + font-family:"h2"; + src: + local("方正大标宋_GBK"),local("方正大标宋简体"),local("方正大标宋繁体"), + local("Dabiaosong"), + local("Heiti"),local("Heiti SC"),local("Heiti TC"), + local("DK-XIAOBIAOSONG"), + url(../Fonts/h2.ttf), + url(res:///opt/sony/ebook/FONT/h2.ttf), + url(res:///Data/FONT/h2.ttf), + url(res:///opt/sony/ebook/FONT/tt0011m_.ttf), + url(res:///ebook/fonts/../../mnt/sdcard/fonts/h2.ttf), + url(res:///ebook/fonts/../../mnt/extsd/fonts/h2.ttf), + url(res:///ebook/fonts/h2.ttf), + url(res:///ebook/fonts/DroidSansFallback.ttf), + url(res:///fonts/ttf/h2.ttf), + url(res:///../../media/mmcblk0p1/fonts/h2.ttf), + url(file:///mnt/us/DK_System/system/fonts/h2.ttf), /*Duokan Old Path*/ + url(file:///mnt/us/DK_System/xKindle/res/userfonts/h2.ttf), /*Duokan 2012 Path*/ + url(res:///abook/fonts/h2.ttf), + url(res:///system/fonts/h2.ttf), + url(res:///system/media/sdcard/fonts/h2.ttf), + url(res:///media/fonts/h2.ttf), + url(res:///sdcard/fonts/h2.ttf), + url(res:///system/fonts/DroidSansFallback.ttf), + url(res:///mnt/MOVIFAT/font/h2.ttf), + url(res:///media/flash/fonts/h2.ttf), + url(res:///media/sd/fonts/h2.ttf), + url(res:///opt/onyx/arm/lib/fonts/AdobeHeitiStd-Regular.otf), + url(res:///../../fonts/h2.ttf), + url(res:///../fonts/h2.ttf), + url(../../../../../h2.ttf), /*EpubReaderI*/ + url(res:///mnt/sdcard/fonts/h2.ttf), /*Nook for Android: fonts in TF Card*/ + url(res:///fonts/h2.ttf), /*ADE1,8, 2.0 Program Path*/ + url(res:///../../../../Windows/fonts/h2.ttf); /*ADE1,8, 2.0 Windows Path*/ +} + +@font-face { + font-family:"h3"; + src: + local("方正华隶_GBK"),local("方正行黑简体"),local("方正行黑繁体"), + local("Yuanti"),local("Yuanti SC"),local("Yuanti TC"), + local("DK-FANGSONG"), + url(../Fonts/h3.ttf), + url(res:///opt/sony/ebook/FONT/h3.ttf), + url(res:///Data/FONT/h3.ttf), + url(res:///opt/sony/ebook/FONT/tt0011m_.ttf), + url(res:///ebook/fonts/../../mnt/sdcard/fonts/h3.ttf), + url(res:///ebook/fonts/../../mnt/extsd/fonts/h3.ttf), + url(res:///ebook/fonts/h3.ttf), + url(res:///ebook/fonts/DroidSansFallback.ttf), + url(res:///fonts/ttf/h3.ttf), + url(res:///../../media/mmcblk0p1/fonts/h3.ttf), + url(file:///mnt/us/DK_System/system/fonts/h3.ttf), /*Duokan Old Path*/ + url(file:///mnt/us/DK_System/xKindle/res/userfonts/h3.ttf), /*Duokan 2012 Path*/ + url(res:///abook/fonts/h3.ttf), + url(res:///system/fonts/h3.ttf), + url(res:///system/media/sdcard/fonts/h3.ttf), + url(res:///media/fonts/h3.ttf), + url(res:///sdcard/fonts/h3.ttf), + url(res:///system/fonts/DroidSansFallback.ttf), + url(res:///mnt/MOVIFAT/font/h3.ttf), + url(res:///media/flash/fonts/h3.ttf), + url(res:///media/sd/fonts/h3.ttf), + url(res:///opt/onyx/arm/lib/fonts/AdobeHeitiStd-Regular.otf), + url(res:///../../fonts/h3.ttf), + url(res:///../fonts/h3.ttf), + url(../../../../../h3.ttf), /*EpubReaderI*/ + url(res:///mnt/sdcard/fonts/h3.ttf), /*Nook for Android: fonts in TF Card*/ + url(res:///fonts/h3.ttf), /*ADE1,8, 2.0 Program Path*/ + url(res:///../../../../Windows/fonts/h3.ttf); /*ADE1,8, 2.0 Windows Path*/ +} + +@font-face { + font-family:"luohua"; + src:local("汉仪落花体"), + url("../Fonts/hylh.ttf"); +} \ No newline at end of file diff --git a/app/src/main/assets/epub/intro.html b/app/src/main/assets/epub/intro.html new file mode 100644 index 000000000..85eb28a63 --- /dev/null +++ b/app/src/main/assets/epub/intro.html @@ -0,0 +1,12 @@ + + + + + Intro + + + + +

内容简介

{intro} + diff --git a/app/src/main/assets/epub/logo.png b/app/src/main/assets/epub/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..104d1777c7381bfee781e0218c13063c464d34aa GIT binary patch literal 94214 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 `M2&xJi#@?`AvI@f*Ga6 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�XWgc zE&nV*w_Qg9mle3O2BGNSOoqQQig0CEp74o3o&in>_syy9?&uqPda^KOwAHqIOuOf{ z>x58d`Z-JdaY`aIlL$e!-Bq>K^XB(lGv09y!^gXt3y#ZN2{}b54hMwH1ZRS{gu`+y zl1nF@)QMx~dQa^3YgAd z6NX^KkLuRyK=4nnMcz(`<5O4v_|!mWy1uN5Ow*CJzP^pCN~@s@o6-^eOhSl&5M(bQ zTiVa@#nJm8c%pm9@hTGVaep)@JRZq#z>R|86bgnFr*>gH%%p)TulMQPJs)^xTZE+W zw=?|^|8o>V(#zM(l1@&WpeljQip}VWPk}EQfVa-)6NLOpbJe{16Q}z--e|0oJ&1&Y zK6dKq`@BtWy6DiKkw3Lw2nG~exB|d=4=`~zfP0IVh*zxmUqF;ZXr?(oiBC1tV*qLw z^owTy#>Xy`G9%?KsT`8C`H)}pjfg<7*Q%`_YP@Y;aw8!w{_ggfzVp8rlK^k7_LJP8 z0ipqlr9fgFSx8`B1!{R26+%dV%9c|utITEwTs~~2&|0|&n|JP;A6|jF^+NRjNy&af z&^AC?El&9sisPPU1nmCg_)5xT%Q(Ll}tI0pc~?@M=Jrf=|n0UZ!jm-DW0{Swn)C^m?qg3}zBB7=EU zZUCP3Kyu?tY|G>-Ax0-s;zaHga`8M&q~-W07N5XJzH-ZYA-4TNArgYD2WSCMr-Tqc zB9rMsQJ6IX#pmn#%~r>H23+ltc1LP$U8Pd_(}@bHEs0LWER8 z?3%I_ySD6kqIq6;9&TQ9YvIv7n?2r+`+lSQ_xuZlxcC3dJ{E#3Ln2Vv{Fx_xmbEhI zIMOZY!s*Z6w*G@X-J70m^`1j@qz!d}M$DQtup^#BBs>pX2t*VWwq5XTduW0)BN67+2lKlwxRwGEF*nH*?tEeo;6&GLb z8wpIlYl%qwxJ8JejfA)_tbTeXPBu0k`sOyOTeTIj3X)EkaHivPfArLspMAp|4`#)d zB9R(G&{K|EXO&?veGD58KLQXR0x1=qfWJ^%SF1NRM8Vv#TjM)Ee3R;L-f^OO-Irui z(;Hytnmm(xuDflZvnuRz4>v5wWiCD*c@CdH^chZqS{FO_>z{2nd3WFX_Iqsd8u{h( z0wobDG2?6m#BCGV(DgSh#rN)N2cr`9B@KM)d%Ixd3J?-u0m}`IE9@mj$QD8|j-OcL zn;%Iyk+QgTw!fk3vKA2uN7z_ltU8nExnv@;{IM0Bt17?;gism}-uGNhS-2(?iotaO zJ2m27(&}f61C>}_)dE*o;4WahCMe6|s-|`voKB)FvJ{D_3G@$?eQ!MYmQ6=C{lkwJ zG}qP4YN}_ZGjaLit{-3SLI_=viR?-u7LE#u5aD4G(PT-0TF8lUq|&1hR>x;)lKb6uEeTf-oJwQ~S;%03FTTdjh`S=(H#> z)XqLsQyKAw2oE>6HnLSKmJvl^$Pc+R`;~V-nA!Zu+c+WK0>Jd0pL)a}WHr%Xl=SuV zk^{STL1c&6vNDDhHM0R?g1Z!!WkGNYf=j6KtEduy%WbsGX%pqKp}&n!Khqld_}0cF zBkS&ZlJ`LPPP+=2@R$1cFMav+iyj-Vhsht;}^q47h=8wRTC>(DrS z@Y4k$Jhkt8`@`YS9jH9^oBll;cmE1od$!WYPdrV|96Su=+(hywHSmMWHTtf(%)Uw) znEJ}}=|ukc^l4OhqtM~MwGkEt?s-j#P-#0>V#d*hU}IxhEgTHP?_r<}a3K&1`{AB9 zOOz~Ljz6JotwM+p*I#+SxBuU!nSVMEi$z4*G|0~Vhh2-1Oj$*lG0``wav(?^|J=Q< zu35i(Y7^!9<)04x^=F>EWB=5z7S}Vlwhc*<0d8SrybrprgE2oqEZEsBTB8A68zk7D z>?L#S7a}z|=^q9VKm6#Dnx0>8UHDfExDHkS-dBukrQp$2v^LI$5-Xp7&!IDa zFT@5$$i2KK5ZEr;{!!OqP?##tnm&z?S4IusUy70lm6&nL0A63?B~*66Sn-%%QZ)b^ z4k2(Ug;lWq&3{6}wn;)XK}f(|dDEUUsi|++GLp|eu}$+gYk0%WH;K2bzfD|z^W}n_ z`-cZ==2gUGZpB0>JYFEg%}h?k3}J&19iYIWqlZwSS5P}#63@dN;bBiIJ$YDbEvDaEmsI(m`G2@g2!qF(BG6f+5vcf??Aq0Wx za;TKTvI=r+Rzp6r`4}3U#-?W;Mp?81OBc2v z5-o=$GYluEF*WKUS(D`1tV6xQFnob9p4-2NbdA@1_{gVz@tr;5!wdjE`~6>iYx}N= zZ*$<1C9@i1VEr0D4z$aNmJAASD#al7l}+4Pb3{nPh0h?5E-Z*mEF zll$clJaW=8uE@1?cwwx+Oc`GBr;~P!htY!SGLyo^E2~%!)jb z1zpfrRySoYawQjW?h=P{X=G#w6S=G#@OX%8y3X@YZqw#St+T&;=u5}uy{?{2XKsb8 zhcMcgLc*MaVyCcT$rX_Ol^7X6j_$%B4j)aUvh7M-QR&6g&+ihJjZ8Eix^(b4GpEUo zo7MxQ43q!qUYUwSx?oNbhj0jkJiSnSLKHHzg4& zaY0a7rXbysDmu!70N?-zYRkNsPP^!hyNz{#1|a(%A385UWO{nO=iuGH(Nz+TD9qQQ z3gVYMumwlLoI-cJ7XxE8nWSKJp!1Br?cr^r(bvxA-#mvenln#1(pra@S&NX6QCC-i zCd?AY_V(~eBgg7O1m#8!2cCNn{!8A5x;a;i?8pc?n%jyys_I3MQX&%})zwv0?i<>T z=GIxpoLNf+N%XnB z!`C)m^tBJF1Hb)nb$LZYb)-zIsjMWPN&m#)R6=w6tkC{lhd44ma_!Bl#kOa<_|bDn zPJ1u=Qu3FZJ~406U}a5xt!S)ofZyXK14Baygd<|r(j{cw%H>cQRb@rT)BB$^o;`d* z0ZtadPUSuO{b)h!GZkaw_dbnlL(5Bw!X=n>G$z+ zQxc&P7X+JIEC0nWIiHyv$ssm30@t!YC`C36)cP=#f7kMr9WU+)Bm^lN8>=4M{flq5 ztXM!)zn^z^o@I%C*6D=Xw&bHrPXzZr_>sW;*xajcyjC(CyH!yO&2nYLk+Ag}onlZs zdQ=sYaVx)f=V5QCx4SaDY|Xb%xMhdh@~!W!T;^YuFXRQc+Mf;H_tXt0K=RN2Wu{jPO?vxZRVOC2u$)e!B?6Os&FV`z9 zE)75Vy7xT%i3dM^UsYo**|c@P@Q^y`?MMY~L@@Q?E7t5ke02BYEoDm=pXuDO?&we# z&J1*6Dm{fGCk!~mLd(Kdbe`x%#dLG^-~ZsgqwTF_N_)#Cfl$DQL?$bG&h{V>@IzHq zXLN8vireDkrq%D=`BAY=daVVdU!WvHC1xH%#C9S0-~IKHtB1a_a@fAfQ{pVj@Jt`~xq2|=^d=kD}JE6EanKt7x7!t0h+Eo@Rh{%q#>2oeK%Y_W#W zJvM-rvTB?jpM+xx^bZW7W9MnS`$KPb!U3H++`-bhv+0S3YO-tNv9G-4E1#O(+$Q-_ zQw9)s+#6P1+Ei!L`OD-(d%sPWn=8KhfuGrlt~=Y8FXUsn2|8tu!f^|T1nQB_^+9F~hV-!^%7V3ivhFk#(=R zSkMc+rjnvcT;QA!G{5oqNF9;*)Zez(C4OH|rS(FvjexlPUvDtLPRTbdScuu7D%ANs z@JTXUsvtMnkDu({jAO}puH-iLqdeQZX5~dVb*#%8da}<6T^%5E);8(^HH@xe3UA*;pKXw9hTW5<%Rk^Y6sonve$j#xF13_>kPy5)<-}upYZsD07DJA7mB^gJ~ zbU43xy+GF=x@5iBz}gOd;A>ybPJYmuos;W= z3$dW01p$eIf*0+P90#f_W9|IKID0a~>Kh}?ZL?QkDxJjPgNH_z|KwoX)X!g^O-Q4N z5Dn0BxS?%PR)sLfZd@15dt6*RcO^8)m=*Fs4#K{dJMMqGsh zY7Wpcu7SD!xzGwgMr6Px1ws&;|73(leN)NRsc2I;$~46T0ZIfo8yXyk<7gO2 zOhQoBGo0{B-4dBEeLqlq{>wRzl{N~F+MR-I-{4Nq}LGEECUj~^E=T!1<~BrIYfB^cl_ zNOEdyRW-nHe(SVB2=vnMi!B zsro9dVChgKFG5-aB-H~#2z;St%$|1{+FBQ3Dlvt_i7|9%b0}nzfMH{LIw3|!#^}kO zb7V4^R!Ah&b$EE#NrP%x+re-qgU*3rw`cDdHa)e6Kht@H96H-Y2FAwi)4kou#8X%& z&eAUaqzV8zJSQ(}#iUP`Ma1vHEjPao>uxlC1AC-hux*@_R2m(FvxW0bSO~OT%~l>dK%=>Al&x;m5k+ zH8+&wtU1D(M7$?Hj2SUQ<-7YdIUVVijk%Il`UR8Jyp1dz+jRAsuJxc$l4{BHdB5Vt zdJ5NF>;b%26M@hfj`VHCK+NV2E`B->)MTVgzvGixnTdl0rLSLk~cwk-up-_h{}3KO+T;u<5~uq zsObVV2B~NcrmgZOs`&OMfLcB_c$AER`yJ%sZ3$uPHFwL+l2!7Nm95mo8+842uwZFoWwt60<0;-Qm3rWRrbvk5~D>&o8Zi*j^?F$yS!nvu=|H(%8oLOLs^L^)U+Ct2lzbpV*Zax%1c!~bTlL-OAp?0}LaO}78pgmjWO+z&qx!`i5W1JxWQ zkUy#Zo%5`#mB!2K8$l|au*7=sLF3P7rtY5qKU}(1sDTJUwzvCIP{{rmn$Zk4Z$CEc z^$8BU!J4?beP36(mlNFf=P=q^G36YRo11i7xgS`8ETG1LSa(nScUgr?m82>EnnOK^ zQVkSpvP;b8GVjw zwglliUku#Na8fhSV)l;26*56$zUWZR73+^NGgm_P(R8Dh_2rdejK?JB*0h5mW%7bi zq!`T?-2TrE3x`Q^g|tPg(V4_2j!n(*XN1>iovJKpM|qRDyAClU1=5I+DS*;Yk)-(p zq;h0q1n<7_*eCwylEWV^Tipv_<;@N zW+Lr`zW{f(=AWQRJy^W)A=zhVN2JQiSg8b{2F!_OEa5E}hfYLDHe#%L|INoG+2s<4a(%@jEz44WRL(6~ZyAjl33SsIH ztwqRd&as)1aB(A)EF%Tlnwon>I|Fs7W(KsdvMHoV@`m~rfHisip_LlY-@gD0=xkY= zWkpGoZ~dYCFZYiZ=lT-Rjaj_@a`@1;+w0i8kL!M(YFM_!RzTYw zryla?dXu%05fu`OyuO2%K?iZ@!E7(Xsy2fu)X*TK=7U)+{lYzkXDXUliOs*h6{q_1 z;33LX-V8Xnro{Ywhyyi3aebq!R5%%U81w38zEM>x3;!WYyXf6~!gHH+Jkj8`Dc`z9 zGG7NZA0Yx4T^5ZG@;iuz&ir2_snP#VTruikPLcCMi-A=EqgsM=>J` z=_Bx7gtN80)Dxx)yf7Iw9nactVUMSYEL)G$vqmX**LYH|e^7#qwIQCI5geg@EY3gv z;CY&Yt9V_7-nzNWIsqesTgsfIvfgsLhRc3k@C&JGdEQkmp-ZrhV}(`)7}?qaTeJx# zqG-4M16mPF_92nM*kygst{E{e8YZrnCclz_=IB*SbA6cqQ=?o1g+;rM6vt3moYE=Kb9Rx6oc9$Ft=e1RLIJaTUC z<7qny=D&DroX&b3IMVHEN!q+7j2Z+G8>Rzi55xL6T#lYRZRR;tYOaHwA#hX!@3gj! zV0&j^$%-kr6^%JbkO=SmS|KVe!O(!waO%dyxa=wpu!o{Pk@bz8rd<(*N#8*Pf@{)6 zvT$4myViJf9*r6f41OpS(fg9N*{H5^Hh>%)+FNcos8-r5y`EQFjP*amaGyfhKAA|j zZOzvzV_-<&^JSUmJ2Vx~@C&5NxNhTr>Bjs#Y#HUD_d4p-aN@!-3mT4xtTQk1o)ozF z9G4ex-L4aGe;)vY0HI7631z8%BINnz_aZIHpj+>7NfyI#t~o%ZeliB{B>*7H6m&P? zi%?4feH{>m@rNUYO;PB^K%2wkN{P<}>=W;-eq#K&WotvB`OXG#X?MlqunAO4CXgdm z1o}1Pgex_c>1g+mVLJM5v|E3C*>iF0BEs#wXZ*xLZ=n|VqN#*${rOkEIUxawRMy*96b|d6IYwp_jWO#P>-r~@JkH_eKW z=m1PI>>ZCVZYP$rpU_&QqxC$B9$2~%+v6EuvQQWM?;T37A6_2k@$41gu=!KJ| z6eV9yo%KjnXXz&azc632ooQj$ZBJ79)<5f&uPefbr4Ubk`9R*52Ro{ow9H->$Ccl| zehY9l^H`e6@h64V9mQN0T)CY+NDdfc;a+^LciaAH|5pQsO&z7+q_8D1+W&$}gj*eV z$>;eTf&LI>6NejR@53+Y{Wk8bE@cq_nDQ!dN&V8;YvmzWLkwIDBW(aDd~edb{5lPv zDyjLN8Qla1zqTP;=!F;X1$Xcj(^b6=I+Uku-sc8~-_r{(V%rRgfNXNjiSXqoHX4!B zYp@%VUdRM{>QFYVV@9il^MynsCo$6LHfZ3j*G+}W$$cIV*>v75es6Pn-TGk>&d1vH zkIm_J-QZlHBjo4BdGSYBLInTwWYZkv-P*|gcC3r8!w;5=9_M9R22Iy}|ZQ{Kvl92XtVGe4F% zRPK2thPjQ3hMt6X*v#tHc9Z%BJvhR{fdh~ThYlmm#Btol3EIArjXEr}V9FRKR zGWCc?Q^9p_vu^lnEC<>(v~t$}WzSJeIC&)T_jXJ}DTVEe)g2v=tsbJ%o&lYtF{-qj zGh1A2o6!DM2FZ2|%klihnEP${H-fU!Y9QCI`=|T1%+tb^=XP6<#`SE5mBsfaSvt8v z)cY+Cn}$=Z^wtl>z2F8~jA~k3_0{6y$zkxAkJl);A2H(3`*QMlp9dill;WmeulxKY zSbfn(9W9|xtv_tqUp{O?rQs-HQoqs=gunQuX}{qxvbBEplS}I-wp%ObmZ75o)EI#< z#s%-rX6xwv6x9`lg6;bn7VyCJG0^UmOe~t~cfSQ|OJ}ost4e!wE*-ZO^3t1PmfWh3 z_okK*?>koarh7969oL(%qQgZG7k;+okGd^hUluQkX$4hsS9$~l-+iUI&6|X%2mZ!C z8?7>YJKNo!w^puMzW-)&=+4H$4HL?crdT z2eKHQ6>bJ`jEZ*hw+Wr2=qHn-_q(+!_px-^;rDY(uE)C&s{c|VBC+5%I5Jt2AH%Dw zr7EVBidXi7=dD{$#}ZORcXz>YIF8C|Z!m-&Qy3^5`Wv9;_`SVR-rM5{Grz5_t zEY+Ty%;TACm_HsKsLIWq9|!I}%n&m_S6WA9wi@1KLOyfLPFL4uW6px4sTp;4{rBX6 z_cd=eN)wR>o6&W2GjtGc`w#Jd#?WeaVJ<-KJx=j_D zZ1@ye7nfv}1*B+jdE;eMslmpGF^^Q@i^qsHtye#EA3C$Q+Wuq;@js>gllw^cpRk!fD?2PKBm&>WW($vXX3=R>G>vy9>VR>xop>XC1Q73 z-&m!AQDJ4ZEwbY1yu}cMh;Hl_P&L~s3ECor?ycf+qz_8Zk9+YtJSk=k`s^6oVoe(- zRcLoUjV#I~B#W5C#fZdPhwbGj6j|&(Od7)uj} zwO`IKkc?jOkrST1G3wlCf3>O+0+fmlzsWYWD!jnpWU7!<{{mnonNxWrPw#0!I<@xiYuy3tBo8nbrawP-SGdI3(~K`dH$3-@*s) zI^X!X^y}xG%uMYaKBgK+TtgJk8`mQx=2shTt*iXBPd*-e0=P}ImVR<2vX_(7a|SkR zwH|m#Y^u>}3jERG$NVM?Wu*xgYK8snoq{DsBcWF66<5`xkYiC1=fn~<;iSup15p2_ zfX@=_zc<*{s7hD&H=dXsn4jxFo)jfKoY3;0+1x9sNQaa{=*7SxqcO6o#pNrG@n1v4 zIkiMCPm7Y6%mNS7e*7nqwaMIctMrjZ-Wd_MoQct-=VF#?<2uZlwTX-U^wfig=sezW z_Xc-KUf}rtxmEDp*R<=gL+bWfOMZQ62!NX^(E(qhU9%``VT)jli{8_qVe;Tj5u8_# z4p(6NWnmeVXD*zJ;wKtbKm(9L@0GC#&27O-x32DJL(J=B_SdWglX(-#6Q@Y&JJ#bCbGsP0X~KCoAKk?4_=3v9gN zdR?}PM`rwNv0U^#J}Z{)n*XAc4*0$kqM>cn)AU{kVag3|-0zX-^%i`cp+!{0wkcqd zJ!tf|&IBlw!fNf1kU!VY5cVk_0*iT7@GaHK*kEBO+gfiTw)jF#YQxTwS+{E+x&Eec zBa)irw00us6a38(w1xDy9S#&ucD#>tGO#rSnaVhoAZeBUZqHFlge|TCT9rrjY+b-gZrJlMyMsAlXir=$kzWb=V{`;ONdE^l8es631O>fWWHB#^_^diTnM=~y_4s&z0?Q1v&deo`Xl9IXSyixFc# zbwudqQNYJsYuZbZ9|)~_IJ#aPBFUA0`c11~9Z74|2n77cFrbAZhUjs4s#Z?GuLrjs zTWpGxs*h0CVEDA86Awi=hX!BqSvx!L%9k@w5e?2M{{r!!1ljDeqUL2q3WM!WNC>4Y z*8j!z{Ei-~LLVs327ffQb5oZdi&r6JCSmVBeVD7k*xuE;8_%MAv)Q!exOPy`$RFI{ z@iX^J!~OKl=Pl^)DpsQs4fXZvzqVJ^ufXM;_iFW*=W?TK?OMYs0QnvI7 z0*LKU)6$o1d=ak!n?Jq>l0TGR@=8M)4a%*!6`fc1C;WeRR&}gnU$--ZuBklThTHSP zsi}TL#X&4Z09DK^#t+*0YA|&l1XdVi9GZmo80TyZ>E~dhu7JjIbU)m>g{iMDr}Dld`6f+2V7VIu zE_>epWO$BpoLyw$QYo{vP4-O_Xr@AT{=6LhF97#``uxiCN(6s{;j;qh54e%s4~F)3 ztZpxAUBr`@Ru@a@Q{U@bO4u6MV)Yq!cM#E8bIyCJB0ZB13;&Y)4_#*q0QzV2im#-P zyOr_PKxt-St<3$f*dy!oBy)H?4vpt^zIu;Z{Q7D^IIj%JYJV)<=tYL|Lzu; z988ykX}I2aMq=k{0JU!mkroQRc7hg3$UhyWCGN>}Su&7tw1fe;-FDjq_BZDqMId+| zMxZ9d{y28bdR;F?mb?uQLcAI0g5508D=M%XLmoArJJL;UcjvtGD&zO0oh1JuQA>CX zD0rajZ~Q}v0fWF+H!f_ai{QQ-?;T3(--M_}Z#yV-p8e;OJ0JK|q87NE4->Z8N2v zBf-Jag_ib)Gfo-hEM8SrqTl!H+x%|WAat4sSM4$6b!G4Cpsp>SzBPiSXUCAKY?53k zMVE`ptxlh!tA`}X|Fz!=>2SEU($zDKh0*8W5%bfVhd7#pj*pZ2RdhqU%8YmG<}kH$ zNuA`ILGgXQf0>6E9tV4Y{81V^lCJ|_MH5=>Zu5Wt(v?Tfn48yHpdY=;Ze7tvefMCf zZbE?mxUhSg!{7K?p5OugMEIZ^&*v{@*W> zvm_H;(UJa&)g_Sq^|^su166J$XVDw(DHgrAvVZ+H=R_T+F!BTrpBMmAi;;5x!uOEp zLj&%LLBuZzBKYzmFx58+s)X(f-|a*!>IZzX_uYa6Bt|EEaSqspu+H8zTj^sl;ds%)5yNvdExxk8X21`)j-2&$w;p82xSYMra=)uELH3e&iwMepYEEUMU1DR5Ajz-Y}-p97n zj3H5BuJJzCn-DWN#wpd%_5fU2l&H=z4C4Y2owpV`oBfqi&Bpw{xWxrM> z{rOEmz9J8#UF&Q}rJ{+~1fMj{%4+>cmg~BD?MvxAIZEn!Ss&s$B3N>knYjE)|NdVl z`W-+z>cC|5-f~cGUnuLdI2qdb6LeOai6YT{GLkdcz)@L=$wLR@5+6XS6{uSsNDKur z#$)%@-1Y-AgctYd0!WE$E;W2&a}INeL|hLVSP^ZkBenvWEjCC#5X361dxzc1c0V*C z(vp~-P6J+4AyrX2RbH(ggm(vs1Q_MIt&XMC2JZL?o8-cQbs3RZW?i<>`>6O4WtO9R zof%labh$Y2t4V}DNMjayfZp6#dCn|mx5wx<9RAAS;R&zCTfdW$p4f8XQ&&|s3^&n= zrWEF_8aB)N?gHO;1p$qJbXyVM!w~z=jLeHUQBH1T;Knf6BT(kF&WkjkHEAo4ncX>h z(gZnHf=Da_PQCkixqn&EtP4(Gxp#z*W05u{NRY&Jm!fV+9uyh0v8!YUrzPX4OqPA~ zRJaWNKs@6iq(Oxsu|PSGd`Y{*Kq&D7fdFwKA!220L;&4xj-W3c@~}PT91103?zJrf zXbLhq#P*u}N&p+VS7P2N`A$fex~R`=k5oDNpIQt7yyBZDL~Wc9elo zpyJ)U3nGCtBpQ!z&mMmJpN}^INYB$J-Ol}&;;MAhL^N2)-#v%;EM9N_h5LQVVf!=4 z^t)PRgXvJJ%MnyDJ#-2Uz)5waK1rK~R1UqiztP&ZN3bNYHk9x#%`%9-+_|TrLUwXk z4ws8V0!}=CH|l^TtoyKIBXnr*cWF$nn;HuZjYvruJc*JfsAjSOF4XfetN0x?nFGvz z25&Q+pej@m;Cr&F95%FHkP0$^oD;YWG5r@dmGQTzP)mhK9IL`e03P`;EyUinFAanc zVj>SaUX!n#5gH=EaUdc`mmrBVPv{T*L*b*Rx54U3i&TWShnfCKp8;|0w}4qVF#oRD zaLW4(e>NkS?U*ki;7{u$5@tijb3k@jw$`a?gFbT{h=1-J%Lm|p9Uu&_&jf};JX;Q; zrZlhdY^J2i(l>Op>QUBm<7DTJoUrn?!gr|$oWuDsW4BHcq4osmQgbCr78Ko`m?I-( zu;R9x6TrZlZ`^3&xmAk~Eh8HIBu6$ZD@f06u3l ztf?8uhF^DPp@>csGIjJl@vL79tEnnT4M~b32*3mSqI?VSfrac~C~PCn2C-r>E5L|E zj{a70G^Q5QHpPk~JGKCzXE95vftu3><(?DG_WKXAvWi-Oai=5$SY95MqW-+b)7EW~ z=c%tJ01a=aA-%zx2y(b`tm+|e$77y2;5H!g%Sm#h%LsZ|1{jI9rNaz zo4S_HClmfcorF$PC1#BQelA}6H5EB$d#O|G&4;`b3{0u4dbkJfkHh0wjxt*I&=t&L z$Biym_63!WHRi_Rd75-~7+=(09rXEaf}vf4oXEsUJTZ8?Y=uog+t~c6I9k%{MC|cJ zEV9*DAJ`W~e2Z};N|HDFY!@es!mACUv+zg%ZKDyU-;YECCy4?Y2LR*~CHiY1mh=;m zfdT|U!2ytdV3|x1#)JR^Ac!_B=Q^Z|Hs^Y9h=VHvTxGQ)5hNLzAQcX8C)Qyu=(@B4 zFHh)X>7FgCfMI8=zeF zgBM~SR1ld2FC3G8<89&U!`)&v`A@Sceihx5;;wzagWJ86-0pm;gMx}5{Me|mGtSmfs{EGLfsnmU(mw)cYNDdOa6RPwS$oz=_|>>b->;y&6ww*SiLs0H zw+w}Z|8qJ2>ilX&5%(UM_1G`fCt96|9Ql={IohECBoKW`r}y(9wJIvg_=t^t>AGEW z`|T++xM+0RliR|w92w?>)3q8m*#vH)4{md?`*9w@(nlemR!3V^0udzjd&1?ry801# z>0>|lCjVi0v~hPdfqq7x86?|NG*S>S2QGq@`P0z$H<~2|hk=0yTx&?k3?F-VP#unf z8nUk}=ub{<*!|`(;mN=;E5=lRW=s^5Z-wMq{crD(Q2nLNfk6yt*%k&7^@sE$+X2dg z6%PDO689oP36MrVjwMF+ZAK(p68ekMoY6;D5JxP9B^z8MR@1E<=E)yjGtOB{2bv2N zb{O+&^+#uiX{fQwB=74Qmk<4k_ecNag)dLOp=ju{()<0|=fPTb<-be;Bz%uaKcK(1 z5a`)O`Kt&aE?4anPu(x|;f+4Z%!Ru(!oM|dK9I_%VQ*Wx%^$NO!sES7+3)R~Db2a9 zMXL=zaQTjcom3SS=9HK+(?-R>bc0;qVcjJta!@FGCq`qv7s}o;SC5rNlS80j!fYt_ z1-u7zhgwcwmJsxKJI=<3Dmz}8M}>}$RZzl7a@)*6YCbig~uC$ao zaGZ!tDeSv-8@~4WaLI-=Uw{5OMToqQuh;HjXfx${-kNSBhk& z{^1W@xj?VB4o*v>q8Sxlc6o=V$@d<&{x_&XA9kY+TXspZ|J0MuqyXtl1_GtPIc*Gc z>XtiW0+Yc56h>>ZM1eGdk0;Xq9L>uy>)+P&!qT7j85f~*GARFt}HvnK8^evLuvJvJ9?^MP$m1JTQ z)4jGJ^g!b3E?TDn_q9+ZwmOZ@@&!sOEdsZpmJQ-$wA8%Z;Q%~GprN7C53}QFK8(KiaFD!(dZN*Q7Rn3niUw2akWM)4dcQOf^@p&2vMU1@A zv=?JJ=*Dd<`#%HlOX!|@FdvL;?NJB>L|Cc%2o-va!NdynQS@6dIPw0jgGeYU0Ej{M zh`zOf(IBDmL}@5qP)LZzm|2T@NvWreA-@-34WTiX36h`*1NK{j+N<>e;20nxOCUdB z=>ZU+Sh?4&^m+7tTXqI(6euJS@VT*k#EBz9K%S79bs~x|7!f29W&aW~Z!GayAp`e} zksS}DK($XtQvEJG!~4`9U+4Y!QGUoOMB$lJ*?SmuE6+F!zb7o3h zrZLXQX&LOx(EP8Ty)`WO*k<)_bv&In|7O+Br@npc6L{C4LjY1fYxD7~ny!cNO_DE8 zzbF@Icv7LlfzLZ^T@n~gQ1;sq@u(`PtU^nx?8|=(#2=PLZO zTNI3;enP?zK~UmBx#%mvRc`A?3KueahC>U9g{a>O7sC>9!Z!~~qhV_X3t^+>^%mk$ zH09X)0TqFbbik!Sv?(GO%vKCx*)adVZjsmlSQu``DhSr@aAki9H(neX;|K_0PHKEO zu{z&VaP_WTzhvOzf%`N>3SZ+XD8&E57$XcTmP9GC0}SlH<cx?0)Z8<2F8qG zb5oIqBfBzoMOTry)edV&n_nNaX6}`p@zi0{5nS0NP#_Fsc&qp=WBY`>k1VI9c)r%| zExf1b$Ww7M#jQ3Kou^JyzRidGo%kFfq@b=M#2moLW=-Z~qimh89Xg|_WblNps#_co z{vYu>epNQBhf78gvnzDLtwY3U{+j;~BxOy2VNh|QW{PSAg1HLa%Ni(Y@?vhO(Sxn_ zWOCqKEHR~4Q1nbdI5$P?N0R-8h#Ml|@2q>#8k(-DAf2lWt7!n@0!p%NkC?JX)g5H1 zl>@K9icMnxpuu5P4c7M+fO@8j4($_i1)X!oQ4SQD4Jc9VC5ra*J16=XAqDXpA|)ufmjaA0)dA9UzsSmF zZz%g|$|n!6dJW`8Pd)J~!R0gQIrU83`N}n~+pFLgOn$xxyvYp6VU!PH@jMh_1Z+Np+~0qCRxQ z+F{ZQSXr5Fkh+`}cH!hO`%9sq0#Z`c{Zij-s_AA3r16K<$)dhY!&6#k}d_r`4EN%K6OGhkklggLrn5LSB zv7;|n4=LZzp+q%d2E&IzWtj}h#w&7vCLT7iQV#Lcqp7QLV|ddR@JP=Ce2(2KpL$}u z+UlHxQAaR#BR)p{n8<}la#G@VFE~p)o+qrCRiL67(c_~Ij8@k8^YhN9MHKFUhX!i9xS1^3>?u> zPojB0>$PEQsQ6UYS~s}hlU_SKU)y13a8k5*vYs8VM(e(6I;?2OzD7YT{WM6xsKHTu zY)M4fDsv!-cRl+;Pt_<@D4i@8aNLiE$yEgsIR=S;0S+6jh=iCJG$E2mL`RY+6o}4r z>L+ZBMwNpKgW=Kx5kePkIHHZ)KVsAyZnPXtS|T=Gz+s?5R?XoJ1SK|T@IfZo#G=^N zXBB|m9})}7`+Pi#)4E!flSBmhq%^#rni9C%eoV-BNp=J4cY=V=67w5W+`^wnMxmN3ZyMh159F^OL+o{4a=kU1jJr%Co|BKl3^~mSNh_rB{o6H8PmG`88 zWuZExVZCYd>kx4C89nxOiFu*E(YVH(@L4x?@k?QD6|k`$EM{U#7UoU|cd>fz!0`t~A|V!VjDa6>iXGFEG`+RO zL+qtev8gcz#{;p;l^oEomEi&b4T1so?nu+W6Eg^d3NQz8-kQSJ9)g8~|Fl+sxprj} ztp^eQ1){4NEJ|i8CLz4QM9)-U5P%&0R{@BDV?`57PLBp+FywcM@)thV3h~mE$^57O zyc}^+V(y|=fDmo8w+C3md<-lXL^evW5X>v=M)f$TB4rTA2Xp;r)S4e2$n6$7DKSLb z)kw(G#mUr<2T6jw6NqA{=$wyQX+frKMHN}oUHwL=e+rb*1fvOkQ<)9)t$#idcmy6A z&CJ{+be4&Rg@-gS@ zj+y5-dF^hK*b3^4mXV*YF&&rS0>18t0*(4dW89t~b%B6sh~yyeyY)5Eso}FZWnqLN z$9e|qLBCA=-+J?*ot5893i#3BqtnWWYBk}C5wm*=m*@sMb!=z=|d5YvJXiO34nv+2TQW<^)T2Lrd6V1^b1KkTIKs#|!TuQGHJt zlPGhp4>~e~3PVsq^6FyuR0k_8M`&n>(CvqmwN`5qU~@$A%9BbdRinY_7WGv@C=?9= z9(oxTa6sxtlCRtqKNQme5WzhodQ#>kv^qwMiILdW$jwJrZ;Hy}H;qz*@p?2i1c zopl7#APZ;`1f)W^s)YVVI1hcOJG$b3yFPg^!PIM~cCjB~a~B;EoZknAXC(aFT;$Tz z{yMai^57?hpa$+H!w|=S^0P!iUFAb>23GoUgqzp(*x{9pp_R^49oA2UFl-OmZUOIO z3BOl0RJd-#l~&);i%WzU9O3sXyNTxOR&=;SwoW4Eb=iRB`a-L+fr{o6D+~$|lV*+> zxfQfLTPYlk{Fu{^ym4Z$7FA%=Px!D?uybIQRB5~1MemF#D!zagRYJF?{;pI-OAe= zt#@sQsI}`Jaj3!})UhRcf95fwi_ssT1{4oT?Vj%#@8@2zX9ME;|L=HUzO~djE^s~N zr=GGukG3lV)?07E9fXkr>$az!o%Oo>D#mV z`Ra+uc|oek`72f%plN@{i@!-z!ALJ395NXt}$(^JCqG`c@c=kW>NEcaQ8F!MX%I1km6c`i3jCeUxMfhHRD`{w-Y{LsUYI=~=FtiVGb z8D-W%lnPeBrSCCtNa zbar?iq`8UiA}Bg8X!^Ek6>QxBaMe4%Qf}h`XmLKqSdru-eOoy1LkUO(QmU68la^)f zK+eDZVdh|H74S5XXs2OdI?=*~u+2$+269HD8H1rb2%z9>zd(?w;rkpJQ{_psn7iR% zg+cKfjr~}l7g$wdz2dT^HXpM+yiR8djaMsyvQGB3f4HNcM#iW0zE0neybr$@NUg3W z=T~+j{HqZ^=ivhBqUg&NJi4iiRSp1nJ&HuQ{IKR{pS!zV_@-ig0yy4{k9H{q?ms4I zZMx_WVPz zK3`3cn77A)#4Cv1=HLb2WkduLqR->HP0YJBjdjl1KG*tla75fF7LXk@1a1e+$Ov`V ztoGaMMk8fGe;1V0BISY6jx-US4s(ohs6Xn?6m@XLEA@?6y!548%EX?m`8@W{jPus8}tVwsr7C4 zg&TYH_ULjs{K;eX^Ud4G=R6*W@;(5d+jje`ds`mbOl>*3$$Z+=64)Xy2vp*VFvq1T z94=5UP{K%4povX`H3kmEp-IE^J@FBvHS3C^1?C7Ad%#josl{n*Muqvw2=KtDbmb|e!mMYuV8dtE+E@+mX zvEnd!%WR8-@)J9kP;UUs3aFE2<>I80>XXmzx{tBQX@^cHANC`3&X*gqdn&ybpPuYo z9g}&yZ3WC-l8?)MxLj4{isW6=J-MZYkB6E?NB^8PeZJ$`k9Y zk{juN(2r$jAoAa)E%8XR{knQhnOZ`k|8u3m!CY>2_1E?5aVsi_bC>qu3a!`YIisJw zF!Epa=i_pJA|7Y;7w1&xEf`qoUjjYDi!|@YD;^;qz0{xqoQFbKk+WcphRSrcx#9)e z)YM-+NMONBj*thF(K!p(=PO}u4xUz^zDg2Vm07&e)_%;_?;s4JDnJ?qr6BK$0R!AQ zU-t$vC$}t4wSArlVYf_I9CBO)~>ZG!Ykq?V?3k?_H(#Pf8&XiUXgS;cU%p*eqr$7>SF z;7rs55{Up>D(`)CkO`8+GxtBGe^Cx-#3$2JWt(m*xp>j&Mg+soIEt;ZA`4UAvh_-$ z3<5=&tQjcCmCzpOugN=6=;-O0`I#oj(<^hj^7~!>2*|EZpIn^o@#uZ9r+hAatFkmS zSYGjLT-=<{z~o9ONw*!!ceOgXUBfec9>}4xJC@)&cl1AhUJ8gF;7fzQ)i2f6^0G#PxhJC@VF3^kFz44 z2zVkqs&EMAs<(;0{N!~=7(?T}#pAL~TsT_-LLw{DDbOUVtvb%k(q5PrMjoE(l2+4> z5rc!9aC1vbqGjO%#eibD;YQT{jUmKf_lXsj1LulAEXRZM=a%reRLu5@3|^sIRkgyG zEf+$Kbymz()m;<;XbMkv=M9KBAQ9(Fsl zk)D`VpI7IzsE;ShWwb}lL(tkKpsP|cTHTt5#3vQ@(Z@33*{ay_?7X~C4$2GQd7 z*LvB*=s66Zn$PBi!k*0sK%R~(&3NL7M{5)!8~Eb8?oW^C8wTQ7>lI_aKG#U(2=7V` z&7(6x1#Sn$SCf~#s(wSF<JP@ z@zXJ4+Z;8S)k2$}&dmlBeA;d=1$^UKvUoP7UyEh}GC5|8*>x>5R;_uPzj~?ct3M(g zI#2alJ`o}3YJfjJ_O0_3Ifg$3F@NVOnPQAn1a<=LG^vpR26-xv?|m*h8Cjh78Od53 zi}QI=iuC2^+#b}2qZ&AdOxn2wstSQg7oVnVe{}_*OSd zx=18vm{!-<_isW=+@!Q==qlE)vzsA2EM?Ntx1FMvH+^0^HjNawkp+H2FTFo>eVKk- ziV(Vt0C=on`WB0w(8rVAGuM7yd0&KJ1YJ7|)gzo&|AU(Cx~sW(=z6)3-=r1Yn|Um< zQkN!tPEY^Z85X@0JIZRRVeG0$+4MNlHTzvHa4iyPwFvOkJ9S=!NxzFQos#sN8gD%E z>`u#cd{>K2C^Q`O=+PXq()qEvmFd%I_ZCovq=sWDHx`>_yUS={abY@UFS|6?I_4sg zV)I<@`pLy(NNfS(r{s1q7^Kc2@bMCZCefHN9igf2Pz)XEcm70cy9Wgh5{FrjDcc=JZcii5rRP@n<^{@rDmK@f=ccr zoVycZEsVV*ft(vTeIFWW9Y3{_=m146F^vd*xzZLhaza7wjy>+=V08*;i-|FC$NBL2 ztO{r%cMy~h{SJr|6~FQeY0ZVJpN_8%s%zd4TuCUb@|pYmEu(K;d=p+445Ps@-g{Z3 zb33OI^lKUX-j1tVZbP~r`X!h=>e}@Vso`BpgwysbCYlZ+=#d*|pBL#{)ye=ug*Bma zVfH|{`8FHRm<&rDQw?V=nYBv$^yn>Z=SY7}imA}}lA)_2&}L1vg;Snx zPh)9%tsk_7Y+6OrDdWv79>wjKX;YTfxS_1XI6U1SrBjA{=TF|pRa!lqoIi zaavx<^|Pc0o>Sa1jrJF|Qu~?kdq!B=H%E?vY;-9AA0k2PW(#hjxB8vQ4oBCW7+(S#yA{DsmItD} z@f4MruIHnx)!|`Y(HeGxR)=_{5wmXUf+*+HK#P3Gfe18#nt^Sb((5^9^k;mh!<1g` zc%*Fx>MTvIGlYZM{Wn$M@v+04TmO^5zU)ut%4xx}k| zolE8~EczRR$y6X7qF5w?##nP*C^0^QBc8?#!#iCV7RlDmNR|xhZbf1U#{qyb48t(j zpb3a%)1ESOZ}o?T#Dy9)hSEl4xIFlr32<~JwK{g&eDC3Lai0I$73q7Tggnb;{Led$ zw1pla`Lv6ho_GHw26Yx~e#x=ib2)wqA#OIok#Y<-9_d~#oK9VKO3H0vN!JqoYchcs6=KUZ)j)GK_^QlA3OE4p{ zR+-3umz3YN{5;##r9nVoweK;1b0FZpat8l9Xd4m0^!3|BJPYuZm-tz=6Md)jcI8&u zHT%r9RX=%7bNKIHrikOdJ!>foA%j9#+Hx-mKIVv}rczB9HC-TcELEtynt$Y4JXI*n z!3eJ^Glk%6s8+Kd5_4~)QGxDJ|E>@PWqG}&o045zIm7Ef(ppy+ZT|Vdlh@a)z(@Cq zm4JX{Jn*%Po6XAO?dZz;=$_9*ugP?;d;A`I>NR3#1-y%egUe;*ycXreGdeNf?)|t# zdaP)a_h`k&qEd$?`DLiSeIiPVKn{1ql-Gw> z*)(6?%fE(yH>9|;_=la(Pd*o!lfX8#XIkO;uOX!p>98>x3x_*(fzSL)wsf4rNmJHu z1q*8?jbPwi%rDdZ8aH-Bp5N(09hl2dtLc^v@1mP`5@J<ND%&CZD0A;))#Eu zmKG>hiWR3oad$5eJP_R7-Q6h;1p<`dE`d_4xI;^E4X(l6-Q~^izR&#=?)h@Qo@eh_ zGi$HC&I|*fsHR^MxrICG-?uE2$y5LRz);hzTE^y`xOI9;0Ilk@j9ab!l@v$MOOcXpOy@+fBRnKLU z40KS|vtsa?On;sr(G|?8if&*so#w=VOyKQyspn^dAv1eEPd*Hs;GMO4CiQm4w~7FS7ULg8?+Zka%jHbV*p+8@?WAo zD`(S%f8!ua%WWMY*N&h`(2MH(g zrmS!^IRfRy=U3swP~517+T^D>I`WG0gTnUh9w3x+HsIi&i?u$H)zHvU;f+xWIcI0t z*US4xdF}Hs>!UXxyr-}ie?bKN;h&tm;FmOjx28wXCqDAPJFXRdE!!;)%+Jv7tIv+F z%qmo&IWye^Tt7wR7kVwjrdha?)vR@^kFuF0Li5NF?LN90ze_yky#rE7#!|@a(&yKu z*|tUyH2jv7)m0;OiAtV`UZ8v%5_`N_k7Ro!Sl=LDwpCMCgAq8aJo`B``)SiYra_~y zl3=%5=ySiSUhH1~C1)*XpR*&+h8pJgdGf2mY#}KVnE$NT^D3M|c%)+AN)-nn8mA^v z)3;yGs`88LDl_-VmKhC6H-E{RwD}}eU6r#&5i$h zN)Y)mgIxk@ySE~6bO-SQQ!DpV4 zn>GhMN9Dugh|`Fqq)}1c(*}lQ-5b7@r~9+^m@zVaI8=icydJO)+KB)tEWKlTDS4#| zv`4N*Ki~3vAc7b61-@Q^0~dZvb6)E-mxtO|*CEA=_12k3F`3n*NO3^T(nHE8RNm4Z zpuZ26{Kgqom((*2c=Jd|#Uk0mnqedpqrc8y1b4)J`_V)hg-Su5+OC)(jltEIKz{pA zV<|GI_bHUQ$xZtR1IZNA7id=J0^#SRPbaI>BY&Dfy{N~gp$3ztt1xu7+)m#FWT#4*FJAyL2 ztS={$I~=Z(Pvm-U)DNWu&c2kQxVtV7mDAVT!aJg8C-j?jbyO@J#&vVO+<)`zM-&lA zS_6%V1sfbx>+DrCr0C74XwEbg@@(i|BXcxFy|>vI;4MxlQV*jRpMB&0w&nXcBp!Je z74jw+kY|!-){Wd!69o{5U!^$?bIoKF={O|B`RysiCydMw|J)enE8b)G9j8WOQr!5- zdDIZ$i1KKC@>(^{*6$KdF=~W#W~Rw6dWI{H2G3Ol+USW_1)b;2*3p$|nQPs|ftFm{ ztnPAO4r|J>YiGX+pIXz%D}lgc4Abq$6vy6+mmLGMy*^@N#i!Vh zSnCb5sDwI##2=J2`AMpj1ZZU8!NHXi)&L{}Y+Gy`s&!NrG?+S?xqrYHHUW)i_z zZR`3p-3;T>j;`+qCS}YPc2OSTfmsCwma$y>qm)$HKXjKurql4@F75@(m?`i z*By5)!)C5}GV3LXbe{D0YSzx*{zYoG?Wu?DcILs* zR23v~Kc-*~HRKPPf4Ir+u5?taS(Wnl8^WE+hotmRM$d2xzvF|T-v$ir?hk8M&+Een zNdG!o%1YWQ)p?ow@QnApU1TMC>ZByUm@42W$tZJT*kdXjm=9nDgJH}7d1`iUeTnfe zf<7nO%%~ethGAp7)x%8sB@UB5%mn1P&S$p3j&91H2KO zS4lNe@a$F&uq$V}c(uY8d(enqkfb#yDRves`qGu!5ptYTuN=mm$4WC!|q1owfu7~Zh+Y@>@*{mjfW<*1IXa zWCP(8^bw+s@1m7X6%72WgCW7F5=+4-Nt!r~Nh)7rFSLo7-R6)l^)V5{rknMuNlJnz zVX#k{8rKrGAn3Sg*4*$)RxtZbM2?9|^?R+6eKUZ1qB>2 zrLPFiuaUJtcuUb*u}0UD8qlihD^v>12cZsh@JSPKAjnfJS^N8(Ll3tseo^G2k74C z=e|Zz1uquODt1So(?TlO7T&6pL(SsR=VoHAD}r#-?;hE-Eg0#B+W8Bp1F4f3*Z2&U z_85AfK~f-O=6eU-%5J-E*^g?nQW)EydwGVzQj8AuVPr}!mUt8~EMP#m7Kf4shgrYPUbaW*ky>P$=)d0S|#?=dwsQ&0&p- zBUDi8W^G7t4alhaTjc?BJxw2pJafGsYQCC6$zC-l2K2(bVroEW#2lf5l@6x)PRcY; zcfsgRGu_i@rQlRnI-6uDLo+aza3#qhw{*j_V%@SydtQ#@=!%ko%xr7Up-2DF^irZ4 zUp;(22mhDlvZ`mdyd!$($`{GB@^2!|2&{0sx2rC^?)NwpxsKSC!3|n6V%|Xu@Nsc& z>#9DJ5}YK+ls+%2Aug2n=p`t_!1DNQ6TnAR`04X?q{_m~y5YKbKKK}rkrdu*qRhXgNLV=_09VeW$%#Z&J?U&*WCUGQ$1MgUkbBSu}dOH>_x^LHxP zRf{WMjQhvo@n#f{yXG%gWAo^j!^}K_qQUtcRm)yS^-hcVHfkj)OD~-=dN}`sYlAFd z{S2cZd)wBwjZ>jWK|vX+A?(%(^uC>jSmi)}uy0k&9-%nXBvN zAa8w&+zOZLdqre)tZEpdY6bN5R-@aDHanA9&isj^4uP4CJ5aBqqQ~vsqYci?O-xHH z*QH@*D)?{+QX-Y&k#+SZQ{u1T>b#KF)bP=6I@h^*>pvu=zwtk$i#RPsuU40=I5j0n2c2YLP3yIC&MwuqEUR*g>cZ**zdb-{a}GTN16Tvl=%P!d4QN#K8D9O24ruPph?S# zWizGulgDmOdf2#`@GX)=kk4(1{4?|&?z^8pCBFP1>=LXC+P@dvNntRxDGk*H5aD=7 z{RwFMxm12sTeKhr(H}iGy^6%DYOlD~dc*gt=YpksO;`0e5o?<{l7WOph%!#}w`l3) z2og^9QLaVXj{|9O67af(uQFvkgF2Ca-NF1A>7~5U1yQOTpk5A`MJ$^VYqgifL>T&4 z6!6g&?2x0b^39IDNbbm!1YRsRF0TBP9gBT_Vb?bx6hP<=A>$(7JtoQ)+|i*(I|Qw; zm`I5>f8~8aH0zY6Ow`~>Ntd7EaD{t99}gvzi;T2+xJso=%icV?SB-EL6CC5U2`0`thOCnKv{bRgIV zF`FR%QJX4EFmtPYTRrA;AVbfXv{!8dCKDKTHw#uy&2l??r|&v5@4je5OP4AjSRcmv z)}%H1gl|iXnWS%%yS;|&=Raj3b%xg1AuZf>^3|Bf!_X*-_z@lEOxuj?!Dj~V^2?V zllL{@!U&^6o7*TNxGa4ddh-W#wtt~B+DW=Bk1vvF#*xO1b#89lBm)~?IpjUzQV7Ti zv;2q10!Y)NtY5v$Kd|Tl^9O?U@aiE;f?s>`jgFhJXC%@kw{KRRt2!7}$J?vbHrEuw zfA15?M}?hm^X;jVSNk_fw_J&BNa_>_4;h{9ZBt|k?aB8G#=(h+MaCrvXgNE(C*Em> zYJ`$ud~%B=6A`ztObqT&lspTvr{rZZTmFejQfceIRva4(V@|f>W)Q`Nvrq!qYaWPL4=vBy=4kZS!9$464cZ; zi@Oi3#KkL!>HGb-Louta_i$sPI6hgqJ(?(5x~~3a z8`tcH9z$5H3uN;z3K+YOLwc~Fuu!3W#?+>=OXncMnbQUwKk~!#t(6mTuO0V%z%Aj1 zT4Ai{?dLJ!8;tsGrInk(fYPa(8s$#8$;Zj3LmVYc#9r$#&@_l!9;F7}(*6D6Z2|1f zUU|NGXgV#xtd=dYtFRu-5OAgvnhT0ps`1GF{9`?b;?Ts{Ah>^47Rr1t-J+dlkT?G; zVed$qEsc9Ap?RK$RoIKAR3B}mMq69g`~@kJoWOu}8QqGy0f^XW8baCpLm%K>ZhoWj#XrP|Kh-Vk! z0R5d3uo_~QzZl9QG}=5IDcjv0cG-!)c0Cylpr4J@42?0o{L$&uv2$a%O}`bW6lIGe z7M-i^y4af(r@G(<*(bg`uMDysdzUKXC=}4w=;iho->SDmohi`LrzPO2YmjUP*K!F23t!`-}4 z`RQDw$~XFMfP^jj4U57}h2SqKm%ZK4jfMNTf9@aL)eP*%Cnx`2ZgNKK<>}CB4sLco zbMQJ5cEQ9_kz0dKsoRSCd_D<>o>6mQTzag{BDM7pJZ0-he;Au|l*($g!0hYWA`PbVo}xV(9#yh30l?Y-2Yb-wD|Wg7?i2#zW;pRlYZA$DRE+xdE?mS2!pK3_eruyAKqbr;9@-M=-Vhv>8-9Wa$QjcQhBTs5!7n)r(Tb`ebz}ed3ymXo=LjmaY!Ei zJNnY35h#)9*TRLI$n1D4$x?5(4wwpVT=);-{l|j+^oYX~>{M??~}o-lC6Agx)^^&6uXi-JyL@Z%k2 zHe6tvmLT~AMb*6h?E0kRc-qx}pHqeWD;2RkLFaP~+aX>-KufOP`X2TB{7LIpRY6$m zb&{9AL|B8M^NBd}?6o-QFIW`uxRb#(C8nn*Do5ihg9WYQwg&Y>pq!VBhJ&LDAyM{c zH1@Z*iQtn5?_hZur^GE_oMt=l#aMJY99gZeM5on8OTvxoS?e9C0$ zSz|tg&qb0Eu(i~@+hP>t&=hq3H6Yadn zr5=-|SPbCjscDG(e2U*ffV}g`>ATj=5-)xCxutToDtsx(yjA5;bem-aY6T|$1DsDQ zj&>wOr9m9*+_}%gxpDjYhzR%lra)Lrt?`IVt+4p{lEy6w-Cn>C>1vCZt8kKVo>`>b zqPS%Hn|30W?tTm3WBx0H&ZE(tw1~KZEuzlbC6Xi)?e%Jeyk}E`A3JeW+qn&@8>>(p z5zHV@V%l-htAzR17M|lTJ~MN_KYDpJ!EfsHwseE@1 zmW%UPKSK$&8}sIaiOJg*L*^%+mT;6r5fO$w%LLt8vp@DdMaoc}*-doGaTzBl?zQ@@ zDvj56{n+^${M9H5KTP=qAJ7nPjb<^ZO#K5;XqJ~+-5%Kw;d(0`2IIjn7$1lCTy_gL z$A(UD7b_{$`oh^0@t8GIY2k-+1bD64MFfUgxOgY*8wC7s36bm~$6w?3FtZIuEtRp}+aKaRU!frGL(n{2%uNB( zwxiCf$@=llSpm2BQ_-{t}QQKz-_d98wB^7Mc5(qT(#?19B%jewjJOZ<|oo=9V+)$jfdKu+{4H^_` zJ^lxVOndJ|f*Tktya8Dsm%LWtcc$XGWZA`DKQsBk(f)FM8Ln!WkQ453XNqUHMRD2F zWXjN379o_Gs;)ZF{g}4QoMWM>oJX}{hxTXd@a}vBt7C?meq7{LsUCeCx6yQ1hAmwD zLm3&qgR6!4G-|luzhRgRRBM0U>fGrXCj&@+Xs@!C5=qG(Lw&r~JXFRrHp4^M8ovtk!UnqGn zBBoZ2^Q!nLh!E{;mHPSx_16`pgnSR_{J&GPIB#frr`7p1S7h<%q`&A! zi--M?xLoi-3#3IYG4L#-mCBm@n@mn0@O{5ztyyLU`h_NIDmCOs(^kHDn4_L{am1`E zgV)x;<^*1hkLwmU9eCK-ra?bLkG+T1?W^w)TR?Dj(hifVV?~ScrLf=C(YW$WqvxOV ze>X4oDEU0?;!Me!i9b}u=CZ?-*Ig3AV7RNk&^lIny~d^U#GGSFg#7R=PH(2Rjz2!9 zMma;VS#%cFwOI&n>Uqdg3>v2XYe=lpu8Mxmhum6I{u43Nw4fxVOS#yjN_97@Lf>D1D5cbjK@ji|l@7#g(Rh&Xcp0e@3_C`PZlRs?w?TYni%me5h&$ zi6cI$gp`Y(*j4_~8$@(7AW-*b1UTQ*Djn23&wkWAFZK3^Jx3@8bre8BO@@guSqDnd z1d8f;x&50o`(VyPi8iwmcv0b5oLU;~vYnbyYe~sw7ZbzZEZkCAn19+vkYZ_SRnzoU zeVf>pM%TW`$Zsaq=Yi>kU958YdN|iE*)4g0UAy#TTI+Fxvo}8*a2wy|OBYcEhLXY|HM^{1<_ zj;e7Te)>N`@G;J_OGp@Oqa1DiIP*hihh}uFB{T$8q6OLS=dc!bOR%MYEDPj%0StG8 z`TuOJ#*bxoe+#e&znsl@0ihfEf{!D+*`3d<3?w$xc$}zj(6&tRS}B1cFdj+!k5WI5 zxqv1wdPdipAVRN5U^u0DPi1M0+Lmh>r>NP$?8_qs6D2K02QhM1mY5b}>T~0w;aXbw z9J(;|T#d`lH*C4J`|b^@_xXL}h|31CQpb~-%t{Jk!=4XLi&72hf2Q1ZnLOO(v87(8 zyE1B~4+q<=ZYIbwsDy9>D}XP{R?oIR1t628t8Wi>TAgeWI>`jJl-0`u6EYG4xJRB} z3fU#&@$zFinAP^X=DglMk-tI$E_jhQDa^WF=q?Rz@_LYBqWC&B;}gd}4ljy%i$mPNXG0_a*JSL_||)ghpn9eSzOcW#DDA% z9F9#@zL(wUnmzu&fMzu;_W&VGwU?t8TAcVqghx&WYi>I8#M{p4#JO&LhDk5Sr#Gw8 zZV>ZHEa%tDq^Ag^l5ZzW-~(Oixdb#~o$dJ1K(Q`IZ7wSv_2s(7E|p!;UkmlbkuoD3 zv*#pIh1BXnD{f#xwUI(vvvzNNvnCBpO~Q2S-{f*?m-+Yf4_3aCQ{qI%RnDWBC7_b{ zei`f5>0gjmQiO)$tpY3p)O$Wk_J}oRItngR zygib(-vvk)5DgF-aP3j-B2T7iM=*+gf)r8=w@Jc1Z#_)E+~nP^R<#Y_tmmwn;Px9j zYS-3Cw`SMSN>yl9vTD>nFJn#HH;l9EGSx@pF39J4bibAmo4LJzvRZ7}7y~J8Rt)jI zc%Y)cI6&nYSk!-&2b|XC){Gp_Ws{I$1#Nv=DL{8Iwff&L|l3AxW-)Y5RJk z({iV$Mnl*Dr7`Q(TF_He*7&IHwAIC0?WkX)&)I1w(vdlRins88Yp4w5f-tIs$vTyx zTo;LX`35aMjVa?6tM4T9ozOAR1W+hJ_%`DcZ)9;fuZ22qS=ar0<{&}@6??ZGwB76A zNRajeaEpknQ&(wAtNVOv-+v~5Zn9B1+wMKI-s0w9?4jxT+-e2Mm zlPWk=8*W~XA6v*8+VGj$Hp`tLN&%y4xmvAltgQ$;(H0xOzE8}=!o_%|;r;hvHqjm2 zm{nR0JY1!)B1oT^6oZQZo(Lrxf%O?(#~Ec64j%f`{F6!v8N<=o=ypiPCPnGT6gD%E*k z{Tg4}=?U1#x3^?C^29y`heuF^Icv%FH)jiD$9)&I;AT#VIx|#3DtG>hs(NQt?@8Az zZrW@)@9Smnjb=Du5Ub<~D8e|JP8J6cpI8Q|S(y9_^}js%N+K^JaHSr7om`u1up_fJFfCg2*0Uz zsW3VPZjy8|j8yI!2Of4U?RN!?MlPSxl4a>Yf3>J4lYKyEm59Pqwf`Qrtecfl{DJCS z_OjM-fX_y5=Y^glB*Xde8opIww><8>V|TplasD*rm$X3?O{dIB>c>n^qbU}Hu4(3C zIYT?zT{bqyxnlTrd7v3uwcB~xHir5;t|9f4B4Vye@XX;+v(7td(w_W+5@*2swU{RS zc#5=gTcU>xXr!mo%MO+;T?AJs?oets)E>&~Mn&;R{U`v<1rSoI3O#F^zTfTt<~`CIv{}Zos?ELAPG=hR9E}+qYxFAwT+Xb!;m9Fc;YXQb z7M@%?)+P@y=(rDeVu07*#AzCxx$&WXEQE-mhO1Jc?_EZA1hzBZjIkVdyo5Y%Sp@b6B;R|2rmQd+Hx}zoYcBwioCdo$G?Y zk!DzeP_nI2`BZ3y9c#;ps3Me!rr~dm|L^OiCsAS5W#?@!?yGY2PV$u?=Q0Zcl_GP} zWd0nLUx|xzdIlX&Y|Bq9s0dez|DHqMMSWrCDu{2?Zf3h&zq2KEC2*}Z_&OWrTemE) z81?fm7BlGSPo(J0_*JIXjVC?LF-}1Wb2D9z0)p5uzt8s!X}tLO(jZZKD}{2hUqPOW zv!A6g(d2t^vu@OSb(0+&ry)f%6~^y^`?jQOGyim=5@opzf_iep`rC2wjxG?+Gik7P zvmW2>;HSxOLkoJS&P4qrrXIM1A5;svV~h>i|At+kjSv-b%ztG3RSHXDvMS3y3;*Oz z4Hv4v30PyRd*{GaU_jX9`VXbp(EkqQc_=VT%_D5;1KeX2WaL+0eqmZ<(T~~OSsQfm ztCJpWJkb0pSH^F}A&<^407uDEPH8uq5>N84?9EO0&aqEY+9m7wVY%M%xaE$K|6QM# zus=SA7^;Q;ai!Jq{i$f6&rtKHqH#EMDV_Snu5Ihxi!+Mk%fWydc&oxSME;nQpehGliS(?TVH4O6H_qu^9#Q^!tRE0^wxS- zEX$r$;R}vvas@Cw6_~!*;Pf>{bzr$%k}6U53r_U^ Unit) { val useReplace = AppConfig.exportUseReplace val contentProcessor = ContentProcessor(book.name, book.origin) - append("${book.name}\n${context.getString(R.string.author_show, book.author)}") + append( + "${book.name}\n${ + context.getString( + R.string.author_show, + book.getRealAuthor() + ) + }\n${ + context.getString( + R.string.intro_show, + "\n" + HtmlFormatter.format(book.getDisplayIntro()) + ) + }" + ) appDb.bookChapterDao.getChapterList(book.bookUrl).forEach { chapter -> BookHelp.getContent(book, chapter).let { content -> val content1 = contentProcessor - .getContent(book, chapter.title, content ?: "null", false, useReplace) + .getContent( + book, + chapter.title.replace("\\r?\\n".toRegex(), " "), + content ?: "null", + false, + useReplace + ) .joinToString("\n") append.invoke("\n\n$content1") } @@ -138,9 +157,9 @@ class CacheViewModel(application: Application) : BaseViewModel(application) { appDb.bookChapterDao.getChapterList(book.bookUrl).forEach { chapter -> BookHelp.getContent(book, chapter)?.let { content -> content.split("\n").forEachIndexed { index, text -> - val matches = AppPattern.imgPattern.toRegex().findAll(input = text) - matches.forEach { matchResult -> - matchResult.groupValues[1].let { + val matcher = AppPattern.imgPattern.matcher(text) + while (matcher.find()) { + matcher.group(1)?.let { val src = NetworkUtils.getAbsoluteURL(chapter.url, it) srcList.add(Triple(chapter.title, index, src)) } @@ -181,12 +200,11 @@ class CacheViewModel(application: Application) : BaseViewModel(application) { setEpubMetadata(book, epubBook) //set cover setCover(book, epubBook) - //set css - setCSS(epubBook) - //设置正文 - setEpubContent(book, epubBook) + val contentModel = setAssets(doc, book, epubBook) + //设置正文 + setEpubContent(contentModel, book, epubBook) DocumentUtils.createFileIfNotExist(doc, filename)?.let { bookDoc -> context.contentResolver.openOutputStream(bookDoc.uri, "wa")?.use { bookOs -> EpubWriter().write(epubBook, bookOs) @@ -205,28 +223,144 @@ class CacheViewModel(application: Application) : BaseViewModel(application) { //set cover setCover(book, epubBook) //set css - setCSS(epubBook) - + val contentModel = setAssets(book, epubBook) val bookPath = FileUtils.getPath(file, filename) val bookFile = FileUtils.createFileWithReplace(bookPath) //设置正文 - setEpubContent(book, epubBook) + setEpubContent(contentModel, book, epubBook) EpubWriter().write(epubBook, FileOutputStream(bookFile)) } - private fun setCSS(epubBook: EpubBook) { - //set css + private fun setAssets(doc: DocumentFile, book: Book, epubBook: EpubBook): String { + if(!AppConfig.isGooglePlay) return setAssets(book, epubBook) + + var contentModel = "" + DocumentUtils.getDirDocument(doc, "Asset").let { customPath -> + if (customPath == null) {//使用内置模板 + contentModel = setAssets(book, epubBook) + } else {//外部模板 + customPath.listFiles().forEach { folder -> + if (folder.isDirectory && folder.name == "Text") { + folder.listFiles().sortedWith { o1, o2 -> + val name1 = o1.name ?: "" + val name2 = o2.name ?: "" + name1.cnCompare(name2) + }.forEach { file -> + if (file.isFile) { + when { + //正文模板 + file.name.equals( + "chapter.html", + true + ) || file.name.equals("chapter.xhtml", true) -> { + contentModel = file.readText(context) ?: "" + } + //封面等其他模板 + true == file.name?.endsWith("html", true) -> { + epubBook.addSection( + FileUtils.getNameExcludeExtension( + file.name ?: "Cover.html" + ), + ResourceUtil.createPublicResource( + book.name, + book.getRealAuthor(), + book.getDisplayIntro(), + book.kind, + book.wordCount, + file.readText(context) ?: "", + "${folder.name}/${file.name}" + ) + ) + } + else -> { + //其他格式文件当做资源文件 + folder.listFiles().forEach { + if (it.isFile) + epubBook.resources.add( + Resource( + it.readBytes(context), + "${folder.name}/${it.name}" + ) + ) + } + } + } + } + } + } else if (folder.isDirectory) { + //资源文件 + folder.listFiles().forEach { + if (it.isFile) + epubBook.resources.add( + Resource( + it.readBytes(context), + "${folder.name}/${it.name}" + ) + ) + } + } else {//Asset下面的资源文件 + epubBook.resources.add( + Resource( + folder.readBytes(context), + "${folder.name}" + ) + ) + } + } + } + } + + return contentModel + } + + private fun setAssets(book: Book, epubBook: EpubBook): String { + epubBook.resources.add( + Resource( + appCtx.assets.open("epub/fonts.css").readBytes(), + "Styles/fonts.css" + ) + ) + epubBook.resources.add( + Resource( + appCtx.assets.open("epub/main.css").readBytes(), + "Styles/main.css" + ) + ) epubBook.resources.add( Resource( - "body,div{background:white;outline:none;width:100%;}h2{color:#005a9c;text-align:left;}p{text-indent:2em;text-align:justify;}img{display:inline-block;width:100%;height:auto;max-width: 100%;max-height:100%;}".encodeToByteArray(), - "css/style.css" + appCtx.assets.open("epub/logo.png").readBytes(), + "Images/logo.png" + ) + ) + epubBook.addSection( + context.getString(R.string.img_cover), + ResourceUtil.createPublicResource( + book.name, + book.getRealAuthor(), + book.getDisplayIntro(), + book.kind, + book.wordCount, + String(appCtx.assets.open("epub/cover.html").readBytes()), + "Text/cover.html" + ) + ) + epubBook.addSection( + context.getString(R.string.book_intro), + ResourceUtil.createPublicResource( + book.name, + book.getRealAuthor(), + book.getDisplayIntro(), + book.kind, + book.wordCount, + String(appCtx.assets.open("epub/intro.html").readBytes()), + "Text/intro.html" ) ) + return String(appCtx.assets.open("epub/chapter.html").readBytes()) } private fun setCover(book: Book, epubBook: EpubBook) { - Glide.with(context) .asBitmap() .load(book.getDisplayCover()) @@ -237,21 +371,19 @@ class CacheViewModel(application: Application) : BaseViewModel(application) { val byteArray: ByteArray = stream.toByteArray() resource.recycle() stream.close() - epubBook.coverImage = Resource(byteArray, "cover.jpg") + epubBook.coverImage = Resource(byteArray, "Images/cover.jpg") } override fun onLoadCleared(placeholder: Drawable?) { - } - }) } - - private fun setEpubContent(book: Book, epubBook: EpubBook) { + private fun setEpubContent(contentModel: String, book: Book, epubBook: EpubBook) { + //正文 val useReplace = AppConfig.exportUseReplace val contentProcessor = ContentProcessor(book.name, book.origin) - appDb.bookChapterDao.getChapterList(book.bookUrl).forEach { chapter -> + appDb.bookChapterDao.getChapterList(book.bookUrl).forEachIndexed { index, chapter -> BookHelp.getContent(book, chapter).let { content -> var content1 = fixPic(epubBook, book, content ?: "null", chapter) content1 = contentProcessor @@ -259,23 +391,17 @@ class CacheViewModel(application: Application) : BaseViewModel(application) { .joinToString("\n") epubBook.addSection( chapter.title, - ResourceUtil.createHTMLResource(chapter.title, content1) + ResourceUtil.createChapterResource( + chapter.title.replace("\uD83D\uDD12", ""), + content1, + contentModel, + "Text/chapter_${index}.html" + ) ) } } } - private fun setPic(src: String, book: Book, epubBook: EpubBook) { - - val href = "${MD5Utils.md5Encode16(src)}${BookHelp.getImageSuffix(src)}" - val vFile = BookHelp.getImage(book, src) - val fp = FileResourceProvider(vFile.parent) - if (vFile.exists()) { - val img = LazyResource(fp, href) - epubBook.resources.add(img) - } - } - private fun fixPic( epubBook: EpubBook, book: Book, @@ -285,19 +411,21 @@ class CacheViewModel(application: Application) : BaseViewModel(application) { val data = StringBuilder("") content.split("\n").forEach { text -> var text1 = text - val matches = AppPattern.imgPattern.toRegex().findAll(input = text) - matches.forEach { matchResult -> - matchResult.groupValues[1].let { + val matcher = AppPattern.imgPattern.matcher(text) + while (matcher.find()) { + matcher.group(1)?.let { val src = NetworkUtils.getAbsoluteURL(chapter.url, it) - setPic(src, book, epubBook) - text1 = text1.replace( - src, - "${MD5Utils.md5Encode16(src)}${BookHelp.getImageSuffix(src)}" - ) - + val originalHref = "${MD5Utils.md5Encode16(src)}${BookHelp.getImageSuffix(src)}" + val href = "Images/${MD5Utils.md5Encode16(src)}.${BookHelp.getImageSuffix(src)}" + val vFile = BookHelp.getImage(book, src) + val fp = FileResourceProvider(vFile.parent) + if (vFile.exists()) { + val img = LazyResource(fp, href, originalHref) + epubBook.resources.add(img) + } + text1 = text1.replace(src, "../${href}") } } - data.append(text1).append("\n") } return data.toString() @@ -309,13 +437,11 @@ class CacheViewModel(application: Application) : BaseViewModel(application) { metadata.authors.add(Author(book.getRealAuthor()))//书籍的作者 metadata.language = "zh"//数据的语言 metadata.dates.add(Date())//数据的创建日期 - metadata.publishers.add("Legado APP")//数据的创建者 + metadata.publishers.add("Legado")//数据的创建者 metadata.descriptions.add(book.getDisplayIntro())//书籍的简介 //metadata.subjects.add("")//书籍的主题,在静读天下里面有使用这个分类书籍 epubBook.metadata = metadata } //////end of EPUB - - } \ No newline at end of file diff --git a/epublib/src/main/java/me/ag2s/epublib/Constants.java b/epublib/src/main/java/me/ag2s/epublib/Constants.java index e26c56815..d9f873e41 100644 --- a/epublib/src/main/java/me/ag2s/epublib/Constants.java +++ b/epublib/src/main/java/me/ag2s/epublib/Constants.java @@ -7,6 +7,7 @@ public interface Constants { String DOCTYPE_XHTML = ""; String NAMESPACE_XHTML = "http://www.w3.org/1999/xhtml"; String EPUB_GENERATOR_NAME = "Ag2S EpubLib"; + String EPUB_DUOKAN_NAME = "DK-SONGTI"; char FRAGMENT_SEPARATOR_CHAR = '#'; String DEFAULT_TOC_ID = "toc"; } diff --git a/epublib/src/main/java/me/ag2s/epublib/domain/LazyResource.java b/epublib/src/main/java/me/ag2s/epublib/domain/LazyResource.java index 1c833401c..a0faf070e 100644 --- a/epublib/src/main/java/me/ag2s/epublib/domain/LazyResource.java +++ b/epublib/src/main/java/me/ag2s/epublib/domain/LazyResource.java @@ -28,6 +28,9 @@ public class LazyResource extends Resource { public LazyResource(LazyResourceProvider resourceProvider, String href) { this(resourceProvider, -1, href); } + public LazyResource(LazyResourceProvider resourceProvider, String href, String originalHref) { + this(resourceProvider, -1, href, originalHref); + } /** * Creates a Lazy resource, by not actually loading the data for this entry. @@ -39,11 +42,17 @@ public class LazyResource extends Resource { * @param href The resource's href within the epub. */ public LazyResource( - LazyResourceProvider resourceProvider, long size, String href) { + LazyResourceProvider resourceProvider, long size, String href) { super(null, null, href, MediaTypes.determineMediaType(href)); this.resourceProvider = resourceProvider; this.cachedSize = size; } + public LazyResource( + LazyResourceProvider resourceProvider, long size, String href, String originalHref) { + super(null, null, href, originalHref, MediaTypes.determineMediaType(href)); + this.resourceProvider = resourceProvider; + this.cachedSize = size; + } /** * Gets the contents of the Resource as an InputStream. diff --git a/epublib/src/main/java/me/ag2s/epublib/domain/Resource.java b/epublib/src/main/java/me/ag2s/epublib/domain/Resource.java index 4820a7aff..2349c9e91 100644 --- a/epublib/src/main/java/me/ag2s/epublib/domain/Resource.java +++ b/epublib/src/main/java/me/ag2s/epublib/domain/Resource.java @@ -120,6 +120,9 @@ public class Resource implements Serializable { public Resource(String id, byte[] data, String href, MediaType mediaType) { this(id, data, href, mediaType, Constants.CHARACTER_ENCODING); } + public Resource(String id, byte[] data, String href, String originalHref, MediaType mediaType) { + this(id, data, href, originalHref, mediaType, Constants.CHARACTER_ENCODING); + } /** @@ -141,6 +144,15 @@ public class Resource implements Serializable { this.inputEncoding = inputEncoding; this.data = data; } + public Resource(String id, byte[] data, String href, String originalHref, MediaType mediaType, + String inputEncoding) { + this.id = id; + this.href = href; + this.originalHref = originalHref; + this.mediaType = mediaType; + this.inputEncoding = inputEncoding; + this.data = data; + } /** * Gets the contents of the Resource as an InputStream. diff --git a/epublib/src/main/java/me/ag2s/epublib/domain/Resources.java b/epublib/src/main/java/me/ag2s/epublib/domain/Resources.java index 7566f4f3a..27d512700 100644 --- a/epublib/src/main/java/me/ag2s/epublib/domain/Resources.java +++ b/epublib/src/main/java/me/ag2s/epublib/domain/Resources.java @@ -193,9 +193,9 @@ public class Resources implements Serializable { private String createHref(MediaType mediaType, int counter) { if (MediaTypes.isBitmapImage(mediaType)) { - return "image_" + counter + mediaType.getDefaultExtension(); + return IMAGE_PREFIX + counter + mediaType.getDefaultExtension(); } else { - return "item_" + counter + mediaType.getDefaultExtension(); + return ITEM_PREFIX + counter + mediaType.getDefaultExtension(); } } diff --git a/epublib/src/main/java/me/ag2s/epublib/epub/PackageDocumentBase.java b/epublib/src/main/java/me/ag2s/epublib/epub/PackageDocumentBase.java index c7ce55b78..a172ce32d 100644 --- a/epublib/src/main/java/me/ag2s/epublib/epub/PackageDocumentBase.java +++ b/epublib/src/main/java/me/ag2s/epublib/epub/PackageDocumentBase.java @@ -9,7 +9,7 @@ package me.ag2s.epublib.epub; */ public class PackageDocumentBase { - public static final String BOOK_ID_ID = "BookId"; + public static final String BOOK_ID_ID = "duokan-book-id"; public static final String NAMESPACE_OPF = "http://www.idpf.org/2007/opf"; public static final String NAMESPACE_DUBLIN_CORE = "http://purl.org/dc/elements/1.1/"; public static final String PREFIX_DUBLIN_CORE = "dc"; @@ -92,5 +92,6 @@ public class PackageDocumentBase { String reference_cover = "cover"; String no = "no"; String generator = "generator"; + String duokan = "duokan-body-font"; } } \ No newline at end of file diff --git a/epublib/src/main/java/me/ag2s/epublib/epub/PackageDocumentMetadataWriter.java b/epublib/src/main/java/me/ag2s/epublib/epub/PackageDocumentMetadataWriter.java index f4811a6c7..fc758bc03 100644 --- a/epublib/src/main/java/me/ag2s/epublib/epub/PackageDocumentMetadataWriter.java +++ b/epublib/src/main/java/me/ag2s/epublib/epub/PackageDocumentMetadataWriter.java @@ -120,6 +120,15 @@ public class PackageDocumentMetadataWriter extends PackageDocumentBase { Constants.EPUB_GENERATOR_NAME); serializer.endTag(NAMESPACE_OPF, OPFTags.meta); + // write duokan + serializer.startTag(NAMESPACE_OPF, OPFTags.meta); + serializer.attribute(EpubWriter.EMPTY_NAMESPACE_PREFIX, OPFAttributes.name, + OPFValues.duokan); + serializer + .attribute(EpubWriter.EMPTY_NAMESPACE_PREFIX, OPFAttributes.content, + Constants.EPUB_DUOKAN_NAME); + serializer.endTag(NAMESPACE_OPF, OPFTags.meta); + serializer.endTag(NAMESPACE_OPF, OPFTags.metadata); } diff --git a/epublib/src/main/java/me/ag2s/epublib/util/ResourceUtil.java b/epublib/src/main/java/me/ag2s/epublib/util/ResourceUtil.java index 9b8f7896e..f270bdbb3 100644 --- a/epublib/src/main/java/me/ag2s/epublib/util/ResourceUtil.java +++ b/epublib/src/main/java/me/ag2s/epublib/util/ResourceUtil.java @@ -30,60 +30,31 @@ public class ResourceUtil { /** * 快速创建HTML类型的Resource * - * @param title 章节的标题 - * @param string 章节的正文 + * @param title 章节的标题 + * @param txt 章节的正文 + * @param model html模板 * @return 返回Resource */ - public static Resource createHTMLResource(String title, String string) { - String html = createHtml(title, string); - MediaType mediaTypeProperty = MediaTypes.XHTML; - byte[] data = html.getBytes(); - return new Resource(data, mediaTypeProperty); - } - - /** - * 快速创建HTML类型的Resource - * - * @param title 章节的标题 - * @param string 章节的正文 - * @param href Resource的href - * @return 返回Resource - */ - - @SuppressWarnings("unused") - public static Resource createHTMLResource(String title, String string, String href) { - String html = createHtml(title, string); - MediaType mediaTypeProperty = MediaTypes.XHTML; - byte[] data = html.getBytes(); - return new Resource(null, data, href, mediaTypeProperty); - } - - @SuppressWarnings("unused") - private static String createHtml(String title, String txt) { - StringBuilder body = new StringBuilder(); - for (String s : txt.split("\\r?\\n")) { - //移除多余的开头结尾的空白字符,节省epub的体积 - s = StringUtil.FixTrim(s); - if (s.length() != 0) { - if (s.contains("").append(s).append(""); - } else { - body.append("

").append(s).append("

"); - } - - } - + public static Resource createChapterResource(String title, String txt, String model, String href) { + if (title.contains("\n")) { + title = "" + title.replaceFirst("\\s*\\n\\s*", "
"); + } else { + title = title.replaceFirst("\\s+", "
"); + if (title.contains("")) + title = "" + title; } + String html = model.replaceAll("\\{title\\}", title) + .replaceAll("\\{content\\}", StringUtil.formatHtml(txt)); + return new Resource(html.getBytes(), href); + } - return "" + - "" + - "" + title + "" + - "" + - "" + - "

" + title + "

" + - body + - ""; + public static Resource createPublicResource(String name, String author, String intro, String kind, String wordCount, String model, String href) { + String html = model.replaceAll("\\{name\\}", name) + .replaceAll("\\{author\\}", author) + .replaceAll("\\{kind\\}", kind) + .replaceAll("\\{wordCount\\}", wordCount) + .replaceAll("\\{intro\\}", StringUtil.formatHtml(intro)); + return new Resource(html.getBytes(), href); } /** diff --git a/epublib/src/main/java/me/ag2s/epublib/util/StringUtil.java b/epublib/src/main/java/me/ag2s/epublib/util/StringUtil.java index 929278b98..f3c0a6058 100644 --- a/epublib/src/main/java/me/ag2s/epublib/util/StringUtil.java +++ b/epublib/src/main/java/me/ag2s/epublib/util/StringUtil.java @@ -273,25 +273,19 @@ public class StringUtil { } return text.substring(cPos + 1); } - // 移除字符串首尾空字符的高效方法(利用ASCII值判断,包括全角空格) - public static String FixTrim(String s) { - if (s == null || s.isEmpty()) { - return ""; - } - int start = 0; - int len = s.length(); - int end = len - 1; - while (start < end && (s.charAt(start) <= 0x20 || s.charAt(start) == ' ')) { - ++start; - } - while (start < end && (s.charAt(end) <= 0x20 || s.charAt(end) == ' ')) { - --end; - } - if (end < len) { - ++end; - } - return (start > 0 || end < len) ? s.substring(start, end) : s; + public static String formatHtml(String text) { + StringBuilder body = new StringBuilder(); + for (String s : text.split("\\r?\\n")) { + s = s.replaceAll("^\\s+|\\s+$", ""); + if (s.length() > 0) { + if (s.toLowerCase().contains("]+)/?>", "
")); + } else { + body.append("

").append(s).append("

"); + } + } + } + return body.toString(); } - } From 9d69345023cf883b658931ca76a5d783c810cfd7 Mon Sep 17 00:00:00 2001 From: Celeter Date: Tue, 15 Jun 2021 16:35:53 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/help/ruleHelp.md | 69 ++++++++++++++++--- app/src/main/assets/updateLog.md | 12 ++++ .../java/io/legado/app/constant/AppConst.kt | 16 +++-- .../java/io/legado/app/constant/AppPattern.kt | 2 +- .../main/java/io/legado/app/help/BookHelp.kt | 2 +- .../java/io/legado/app/help/JsExtensions.kt | 22 +++--- .../main/java/io/legado/app/model/Debug.kt | 2 +- .../app/model/webBook/BookChapterList.kt | 8 +-- .../java/io/legado/app/utils/HtmlFormatter.kt | 2 +- build.gradle | 14 ++-- 10 files changed, 106 insertions(+), 43 deletions(-) diff --git a/app/src/main/assets/help/ruleHelp.md b/app/src/main/assets/help/ruleHelp.md index 4d50dde6c..01eb44eba 100644 --- a/app/src/main/assets/help/ruleHelp.md +++ b/app/src/main/assets/help/ruleHelp.md @@ -11,6 +11,12 @@ : regex规则,不可省略,只可以用在书籍列表和目录列表 ``` +* 获取登录后的cookie +``` +java.getCookie("http://baidu.com", null) => userid=1234;pwd=adbcd +java.getCookie("http://baidu.com", "userid") => 1234 +``` + * 请求头,支持http代理,socks4 socks5代理设置 ``` socks5代理 @@ -39,6 +45,49 @@ cache 变量-缓存操作类,方法见 io.legado.app.help.CacheManager chapter 变量-当前目录类,方法见 io.legado.app.data.entities.BookChapter title 变量-当前标题,String src 内容,源码 +``` + +* url添加js参数,解析url时执行,可在访问url时处理url,例 +``` +https://www.baidu.com,{"js":"java.headerMap.put('xxx', 'yyy')"} +https://www.baidu.com,{"js":"java.url=java.url+'yyyy'"} +``` + +* 增加js方法,用于重定向拦截 + * `java.get(urlStr: String, headers: Map)` + * `java.post(urlStr: String, body: String, headers: Map)` +* 对于搜索重定向的源,可以使用此方法获得重定向后的url +``` +(()=>{ + if(page==1){ + let url='https://www.yooread.net/e/search/index.php,'+JSON.stringify({ + "method":"POST", + "body":"show=title&tempid=1&keyboard="+key + }); + return java.put('surl',String(java.connect(url).raw().request().url())); + } else { + return java.get('surl')+'&page='+(page-1) + } +})() +或者 +(()=>{ + let base='https://www.yooread.net/e/search/'; + if(page==1){ + let url=base+'index.php'; + let body='show=title&tempid=1&keyboard='+key; + return base+java.put('surl',java.post(url,body,{}).header("Location")); + } else { + return base+java.get('surl')+'&page='+(page-1); + } +})() +``` + +* 正文图片链接支持修改headers +``` +let options = { +"headers": {"User-Agent": "xxxx","Referrer":baseUrl,"Cookie":"aaa=vbbb;"} +}; +'' ``` ## 部分js对象属性说明 @@ -95,14 +144,16 @@ variable // 自定义书籍变量信息(用于书源规则检索书籍信息) ### 字体解析使用 > 使用方法,在正文替换规则中使用,原理根据f1字体的字形数据到f2中查找字形对应的编码 ``` -@js: -var b64=String(src).match(/ttf;base64,([^\)]+)/); -if (b64) { - var f1 = java.queryBase64TTF(b64[1]) - var f2 = java.queryTTF("/storage/emulated/0/Fonts/Source Han Sans CN Regular.ttf") - java.replaceFont(result, f1, f2) -}else{ - result -} + +(function(){ + var b64=String(src).match(/ttf;base64,([^\)]+)/); + if(b64){ + var f1 = java.queryBase64TTF(b64[1]); + var f2 = java.queryTTF("https://alanskycn.gitee.io/teachme/assets/font/Source Han Sans CN Regular.ttf"); + return java.replaceFont(result, f1, f2); + } + return result; +})() + ``` diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 0daafa351..20e915987 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -18,6 +18,18 @@ * 添加书架文件夹分组样式,未完成 * viewPager2 3层嵌套有问题,书架换回viewPager +**2021/05/29** +* 谷歌版可使用外部epub模板 +* Asset文件夹下二级以内目录全文件读取,Asset->文件夹->文件 +* epub元数据修改,使修改字体只对正文生效 +* 修复epub模板文件的排序问题 +* epub可自定义模板,模板路径为书籍导出目录的Asset文件夹,[模板范例](https://wwa.lanzoux.com/ibjBspkn05i) +``` +Asset中里面必须有Text文件夹,Text文件夹里必须有chapter.html,否则导出正文会为空 +chapter.html的关键字有{title}、{content} +其他html文件的关键字有{name}、{author}、{intro}、{kind}、{wordCount} +``` + **2021/05/26** * 书签绑定书名与作者 * 修复详情页目录问题 diff --git a/app/src/main/java/io/legado/app/constant/AppConst.kt b/app/src/main/java/io/legado/app/constant/AppConst.kt index a7db60a2d..e76b28df3 100644 --- a/app/src/main/java/io/legado/app/constant/AppConst.kt +++ b/app/src/main/java/io/legado/app/constant/AppConst.kt @@ -38,9 +38,9 @@ object AppConst { val keyboardToolChars: List by lazy { arrayListOf( - "❓", "@css:", "", "{{}}", "&&", "%%", "||", "//", "$.", "@", - "\\", ":", "class", "id", "href", "textNodes", "ownText", "all", "html", - "[", "]", "<", ">", "##", "!", ".", "+", "-", "*", "=",",{\"webView\":true}" + "❓", "@css:", "", "{{}}", "##", "&&", "%%", "||", "//", "$.", + "@", ":", "class", "text", "href", "textNodes", "ownText", "all", "html", + "[", "]", "<", ">", "#", "!", ".", "+", "-", "*", "=", "{'webView': true}" ) } @@ -57,10 +57,12 @@ object AppConst { val urlOption: String by lazy { """ ,{ - "charset": "", - "method": "POST", - "body": "", - "headers": {"User-Agent": ""} + 'charset': '', + 'method': 'POST', + 'body': '', + 'headers': { + 'User-Agent': '' + } } """.trimIndent() } diff --git a/app/src/main/java/io/legado/app/constant/AppPattern.kt b/app/src/main/java/io/legado/app/constant/AppPattern.kt index cea60d9c5..342f2a207 100644 --- a/app/src/main/java/io/legado/app/constant/AppPattern.kt +++ b/app/src/main/java/io/legado/app/constant/AppPattern.kt @@ -9,7 +9,7 @@ object AppPattern { val EXP_PATTERN: Pattern = Pattern.compile("\\{\\{([\\w\\W]*?)\\}\\}") //图片有data-开头的数据属性时优先用数据属性作为src,没有数据属性时才匹配src val imgPattern: Pattern = - Pattern.compile("", Pattern.CASE_INSENSITIVE) + Pattern.compile("]*src\\s*=\\s*['\"]([^'\"]+)['\"][^>]*>", Pattern.CASE_INSENSITIVE) val nameRegex = Regex("\\s+作\\s*者.*|\\s+\\S+\\s+著") val authorRegex = Regex("^.*?作\\s*者[::\\s]*|\\s+著") diff --git a/app/src/main/java/io/legado/app/help/BookHelp.kt b/app/src/main/java/io/legado/app/help/BookHelp.kt index 99adf90b1..6379d4cc3 100644 --- a/app/src/main/java/io/legado/app/help/BookHelp.kt +++ b/app/src/main/java/io/legado/app/help/BookHelp.kt @@ -38,7 +38,7 @@ object BookHelp { } /** - * 清楚已删除书的缓存 + * 清除已删除书的缓存 */ fun clearRemovedCache() { Coroutine.async { diff --git a/app/src/main/java/io/legado/app/help/JsExtensions.kt b/app/src/main/java/io/legado/app/help/JsExtensions.kt index 43fcd60a9..a3698c76c 100644 --- a/app/src/main/java/io/legado/app/help/JsExtensions.kt +++ b/app/src/main/java/io/legado/app/help/JsExtensions.kt @@ -311,9 +311,9 @@ interface JsExtensions { * @param font2 正确的字体 */ fun replaceFont( - text: String, - font1: QueryTTF?, - font2: QueryTTF? + text: String, + font1: QueryTTF?, + font2: QueryTTF? ): String { if (font1 == null || font2 == null) return text val contentArray = text.toCharArray() @@ -346,7 +346,7 @@ interface JsExtensions { str: String, key: String, transformation: String, - iv: String = "" + iv: String ): ByteArray? { return EncoderUtils.decryptAES( @@ -369,7 +369,7 @@ interface JsExtensions { str: String, key: String, transformation: String, - iv: String = "" + iv: String ): String? { return aesDecodeToByteArray(str, key, transformation, iv)?.let { String(it) } } @@ -386,7 +386,7 @@ interface JsExtensions { str: String, key: String, transformation: String, - iv: String = "" + iv: String ): ByteArray? { return EncoderUtils.decryptBase64AES( data = str.encodeToByteArray(), @@ -408,7 +408,7 @@ interface JsExtensions { str: String, key: String, transformation: String, - iv: String = "" + iv: String ): String? { return aesBase64DecodeToByteArray(str, key, transformation, iv)?.let { String(it) } } @@ -422,7 +422,7 @@ interface JsExtensions { */ fun aesEncodeToByteArray( data: String, key: String, transformation: String, - iv: String = "" + iv: String ): ByteArray? { return EncoderUtils.encryptAES( data.encodeToByteArray(), @@ -441,7 +441,7 @@ interface JsExtensions { */ fun aesEncodeToString( data: String, key: String, transformation: String, - iv: String = "" + iv: String ): String? { return aesEncodeToByteArray(data, key, transformation, iv)?.let { String(it) } } @@ -455,7 +455,7 @@ interface JsExtensions { */ fun aesEncodeToBase64ByteArray( data: String, key: String, transformation: String, - iv: String = "" + iv: String ): ByteArray? { return EncoderUtils.encryptAES2Base64( data.encodeToByteArray(), @@ -474,7 +474,7 @@ interface JsExtensions { */ fun aesEncodeToBase64String( data: String, key: String, transformation: String, - iv: String = "" + iv: String ): String? { return aesEncodeToBase64ByteArray(data, key, transformation, iv)?.let { String(it) } } diff --git a/app/src/main/java/io/legado/app/model/Debug.kt b/app/src/main/java/io/legado/app/model/Debug.kt index d8e606b0f..dc6259cc4 100644 --- a/app/src/main/java/io/legado/app/model/Debug.kt +++ b/app/src/main/java/io/legado/app/model/Debug.kt @@ -187,7 +187,7 @@ object Debug { private fun infoDebug(scope: CoroutineScope, webBook: WebBook, book: Book) { if (book.tocUrl.isNotBlank()) { - log(debugSource, "目录url不为空,详情页已解析") + log(debugSource, "≡已获取目录链接,跳过详情页") log(debugSource, showTime = false) tocDebug(scope, webBook, book) return diff --git a/app/src/main/java/io/legado/app/model/webBook/BookChapterList.kt b/app/src/main/java/io/legado/app/model/webBook/BookChapterList.kt index 06ae294b4..24bf4981e 100644 --- a/app/src/main/java/io/legado/app/model/webBook/BookChapterList.kt +++ b/app/src/main/java/io/legado/app/model/webBook/BookChapterList.kt @@ -190,12 +190,12 @@ object BookChapterList { chapterList.add(bookChapter) } } - Debug.log(bookSource.bookSourceUrl, "└解析目录列表完成", log) - Debug.log(bookSource.bookSourceUrl, "┌首章名称", log) + Debug.log(bookSource.bookSourceUrl, "└目录列表解析完成", log) + Debug.log(bookSource.bookSourceUrl, "┌获取首章名称", log) Debug.log(bookSource.bookSourceUrl, "└${chapterList[0].title}", log) - Debug.log(bookSource.bookSourceUrl, "┌首章链接", log) + Debug.log(bookSource.bookSourceUrl, "┌获取首章链接", log) Debug.log(bookSource.bookSourceUrl, "└${chapterList[0].url}", log) - Debug.log(bookSource.bookSourceUrl, "┌首章信息", log) + Debug.log(bookSource.bookSourceUrl, "┌获取首章信息", log) Debug.log(bookSource.bookSourceUrl, "└${chapterList[0].tag}", log) } return ChapterData(chapterList, nextUrlList) diff --git a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt index 21d45d62c..7d11df2b4 100644 --- a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt +++ b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt @@ -13,7 +13,7 @@ object HtmlFormatter { html ?: return "" return html.replace(wrapHtmlRegex, "\n") .replace(otherRegex, "") - .replace("^[\\n\\s]+".toRegex(), "  ") + .replace("^[\\n\\s]*".toRegex(), "  ") .replace("[\\n\\s]+$".toRegex(), "") .replace("\\s*\\n+\\s*".toRegex(), "\n  ") } diff --git a/build.gradle b/build.gradle index 894cbf12f..ae689e1a9 100644 --- a/build.gradle +++ b/build.gradle @@ -4,24 +4,22 @@ buildscript { ext.kotlin_version = '1.5.10' repositories { google() - maven { url 'https://maven.aliyun.com/repository/public/'} - maven { url "https://s3.amazonaws.com/fabric-artifacts/public" } - maven { url "https://maven.aliyun.com/repository/gradle-plugin" } - maven { url "https://plugins.gradle.org/m2/" } + maven { url 'https://maven.aliyun.com/repository/public' } + maven { url 'https://maven.aliyun.com/repository/gradle-plugin' } + maven { url 'https://plugins.gradle.org/m2/' } } dependencies { classpath 'com.android.tools.build:gradle:4.2.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath "de.timfreiheit.resourceplaceholders:placeholders:0.3" + classpath 'de.timfreiheit.resourceplaceholders:placeholders:0.3' } } allprojects { repositories { google() - maven { url 'https://maven.aliyun.com/repository/public/' } - maven { url "https://jitpack.io" } - maven { url "https://maven.google.com/" } + maven { url 'https://maven.aliyun.com/repository/public' } + maven { url 'https://jitpack.io' } } }