From da041a01146c5fe4084595ac803f1dea2a72505a Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@QQ.com> Date: Tue, 13 Dec 2016 23:40:28 +0800 Subject: [PATCH 01/38] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 710f0784..f3900f9d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Aria ![图标](https://github.com/AriaLyy/DownloadUtil/blob/v_2.0/app/src/main/res/mipmap-hdpi/ic_launcher.png)
-Aria,致力于让下载傻瓜化
+下载不应该是让人感到痛苦的功能,Aria,致力于让下载傻瓜化。
+ Aria有以下特点: - 简单 - 可自定义是否使用广播 From 41e082ad29732203960e9028ef98c89c7f12318c Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Mon, 2 Jan 2017 17:17:15 +0800 Subject: [PATCH 02/38] =?UTF-8?q?=E5=90=88=E5=B9=B6=E5=88=86=E6=94=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.idea/misc.xml b/.idea/misc.xml index 7c1371c5..5d199810 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,5 +1,8 @@ + + + - + From 443fbdbd08676a30565f24e219e3b04c9120a574 Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Tue, 3 Jan 2017 22:06:07 +0800 Subject: [PATCH 04/38] =?UTF-8?q?=E5=90=88=E5=B9=B6=E5=88=86=E6=94=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 5d199810..fbb68289 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -37,7 +37,7 @@ - + From 6b926833bc76f6026686d0195bf75d0d8326196d Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Fri, 6 Jan 2017 12:31:02 +0800 Subject: [PATCH 05/38] =?UTF-8?q?=EF=BC=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index fbb68289..5d199810 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -37,7 +37,7 @@ - + From b7a0d07beacb3cf11fb31908254e9e922ee6c211 Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Fri, 6 Jan 2017 15:43:03 +0800 Subject: [PATCH 06/38] misc --- .idea/misc.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index fbb68289..5d199810 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -37,7 +37,7 @@ - + From 91f20fa674de6bc2a4f48a786b550dfb9ffee8e1 Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Sun, 8 Jan 2017 20:34:34 +0800 Subject: [PATCH 07/38] .. --- .idea/misc.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 5d199810..fbb68289 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -37,7 +37,7 @@ - + From e4f918bb27fdb9a1373b4eb005490d21f98f5406 Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@QQ.com> Date: Thu, 12 Jan 2017 11:10:26 +0800 Subject: [PATCH 08/38] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 022aec0a..3101becd 100644 --- a/README.md +++ b/README.md @@ -121,6 +121,7 @@ Aria支持https下载,如果你希望使用自己的ca证书,那么你需要 ### https证书配置 + 将你的证书导入`assets`目录 + 调用以下代码配置ca证书相关信息 + ```java /** * 设置CA证书信息 From 803a32dc0762d6d786d09565b68465608cd445bd Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Thu, 12 Jan 2017 11:25:49 +0800 Subject: [PATCH 09/38] readme --- README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.md b/README.md index 036d71b1..c9204f59 100644 --- a/README.md +++ b/README.md @@ -121,11 +121,7 @@ Aria支持https下载,如果你希望使用自己的ca证书,那么你需要 ### https证书配置 + 将你的证书导入`assets`目录 + 调用以下代码配置ca证书相关信息 -<<<<<<< HEAD - -======= ->>>>>>> v_2.0 ```java /** * 设置CA证书信息 From 8f452c6ea50b25c17cdcbb3c79807baa5469a192 Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Wed, 22 Feb 2017 03:48:40 +0800 Subject: [PATCH 10/38] =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E5=8C=BA=E5=8F=98=E5=A4=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../arialyy/aria/core/task/SingleThreadTask.java | 14 ++++++++------ .../simple/single_task/SingleTaskActivity.java | 3 ++- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Aria/src/main/java/com/arialyy/aria/core/task/SingleThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/task/SingleThreadTask.java index d305d98c..f98d724c 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/task/SingleThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/task/SingleThreadTask.java @@ -31,12 +31,14 @@ import java.util.Properties; * 下载线程 */ final class SingleThreadTask implements Runnable { - private static final String TAG = "SingleThreadTask"; + private static final String TAG = "SingleThreadTask"; + // TODO: 2017/2/22 不能使用1024 否则最大速度不能超过3m + private static final int BUF_SIZE = 8196; private DownloadUtil.ConfigEntity mConfigEntity; - private String mConfigFPath; - private long mChildCurrentLocation = 0; - private static final Object LOCK = new Object(); - private IDownloadListener mListener; + private String mConfigFPath; + private long mChildCurrentLocation = 0; + private static final Object LOCK = new Object(); + private IDownloadListener mListener; private DownloadStateConstance mConstance; SingleThreadTask(DownloadStateConstance constance, IDownloadListener listener, @@ -78,7 +80,7 @@ final class SingleThreadTask implements Runnable { RandomAccessFile file = new RandomAccessFile(mConfigEntity.TEMP_FILE, "rwd"); //设置每条线程写入文件的位置 file.seek(mConfigEntity.START_LOCATION); - byte[] buffer = new byte[1024]; + byte[] buffer = new byte[BUF_SIZE]; int len; //当前子线程的下载位置 mChildCurrentLocation = mConfigEntity.START_LOCATION; diff --git a/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java b/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java index 82d62924..7bc60d51 100644 --- a/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java +++ b/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java @@ -52,7 +52,8 @@ public class SingleTaskActivity extends BaseActivity { private static final String DOWNLOAD_URL = //"http://kotlinlang.org/docs/kotlin-docs.pdf"; - "https://atom-installer.github.com/v1.13.0/AtomSetup.exe?s=1484074138&ext=.exe"; + //"https://atom-installer.github.com/v1.13.0/AtomSetup.exe?s=1484074138&ext=.exe"; + "http://static.gaoshouyou.com/d/21/e8/61218d78d0e8b79df68dbc18dd484c97.apk"; @Bind(R.id.progressBar) HorizontalProgressBarWithNumber mPb; @Bind(R.id.start) Button mStart; @Bind(R.id.stop) Button mStop; From 9e590a609ebe389785a41e48d8d5e2e5ec3639ef Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Wed, 22 Feb 2017 20:09:22 +0800 Subject: [PATCH 11/38] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E9=80=9F=E5=BA=A6=E6=85=A2=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 2 +- .../aria/core/task/ConnectionHelp.java | 1 + .../arialyy/aria/core/task/DownloadUtil.java | 38 +- .../aria/core/task/SingleThreadTask.java | 40 ++- .../aria/util/BufferedRandomAccessFile.java | 328 ++++++++++++++++++ .../single_task/SingleTaskActivity.java | 63 ++++ 6 files changed, 449 insertions(+), 23 deletions(-) create mode 100644 Aria/src/main/java/com/arialyy/aria/util/BufferedRandomAccessFile.java diff --git a/.idea/misc.xml b/.idea/misc.xml index fbb68289..5d199810 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -37,7 +37,7 @@ - + diff --git a/Aria/src/main/java/com/arialyy/aria/core/task/ConnectionHelp.java b/Aria/src/main/java/com/arialyy/aria/core/task/ConnectionHelp.java index 8d264d5a..38ee2867 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/task/ConnectionHelp.java +++ b/Aria/src/main/java/com/arialyy/aria/core/task/ConnectionHelp.java @@ -69,6 +69,7 @@ class ConnectionHelp { "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*"); ////用于处理Disconnect 不起作用问题 //conn.setRequestProperty("Connection", "close"); + conn.setRequestProperty("Connection", "Keep-Alive"); return conn; } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/task/DownloadUtil.java b/Aria/src/main/java/com/arialyy/aria/core/task/DownloadUtil.java index 21c8af7c..6f14d883 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/task/DownloadUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/core/task/DownloadUtil.java @@ -20,6 +20,7 @@ import android.content.Context; import android.util.Log; import android.util.SparseArray; import com.arialyy.aria.core.DownloadEntity; +import com.arialyy.aria.util.BufferedRandomAccessFile; import com.arialyy.aria.util.CommonUtil; import java.io.File; import java.io.IOException; @@ -34,27 +35,27 @@ import java.util.concurrent.Executors; * Created by lyy on 2015/8/25. * 下载工具类 */ -final class DownloadUtil implements IDownloadUtil, Runnable { +public class DownloadUtil implements IDownloadUtil, Runnable { private static final String TAG = "DownloadUtil"; /** * 线程数 */ - private final int THREAD_NUM; + private final int THREAD_NUM; //下载监听 - private IDownloadListener mListener; - private int mConnectTimeOut = 5000 * 4; //连接超时时间 - private int mReadTimeOut = 5000 * 20; //流读取的超时时间 - private boolean isNewTask = true; + private IDownloadListener mListener; + private int mConnectTimeOut = 5000 * 4; //连接超时时间 + private int mReadTimeOut = 5000 * 20; //流读取的超时时间 + private boolean isNewTask = true; private boolean isSupportBreakpoint = true; - private Context mContext; - private DownloadEntity mDownloadEntity; + private Context mContext; + private DownloadEntity mDownloadEntity; private ExecutorService mFixedThreadPool; - private File mDownloadFile; //下载的文件 - private File mConfigFile;//下载信息配置文件 + private File mDownloadFile; //下载的文件 + private File mConfigFile;//下载信息配置文件 private SparseArray mTask = new SparseArray<>(); private DownloadStateConstance mConstance; - DownloadUtil(Context context, DownloadEntity entity, IDownloadListener downloadListener) { + public DownloadUtil(Context context, DownloadEntity entity, IDownloadListener downloadListener) { this(context, entity, downloadListener, 3); } @@ -259,7 +260,10 @@ final class DownloadUtil implements IDownloadUtil, Runnable { int fileLength = conn.getContentLength(); //必须建一个文件 CommonUtil.createFile(mDownloadFile.getPath()); - RandomAccessFile file = new RandomAccessFile(mDownloadFile.getPath(), "rwd"); + //RandomAccessFile file = new RandomAccessFile(mDownloadFile.getPath(), "rwd"); + ////设置文件长度 + //file.setLength(fileLength); + BufferedRandomAccessFile file = new BufferedRandomAccessFile(mDownloadFile.getPath(), "rwd", 8192); //设置文件长度 file.setLength(fileLength); mListener.onPostPre(fileLength); @@ -358,12 +362,12 @@ final class DownloadUtil implements IDownloadUtil, Runnable { */ final static class ConfigEntity { //文件大小 - long FILE_SIZE; + long FILE_SIZE; String DOWNLOAD_URL; - int THREAD_ID; - long START_LOCATION; - long END_LOCATION; - File TEMP_FILE; + int THREAD_ID; + long START_LOCATION; + long END_LOCATION; + File TEMP_FILE; boolean isSupportBreakpoint = true; String CONFIG_FILE_PATH; } diff --git a/Aria/src/main/java/com/arialyy/aria/core/task/SingleThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/task/SingleThreadTask.java index f98d724c..07e94bca 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/task/SingleThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/task/SingleThreadTask.java @@ -15,7 +15,11 @@ */ package com.arialyy.aria.core.task; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; import android.util.Log; +import com.arialyy.aria.util.BufferedRandomAccessFile; import com.arialyy.aria.util.CommonUtil; import java.io.File; import java.io.IOException; @@ -33,7 +37,7 @@ import java.util.Properties; final class SingleThreadTask implements Runnable { private static final String TAG = "SingleThreadTask"; // TODO: 2017/2/22 不能使用1024 否则最大速度不能超过3m - private static final int BUF_SIZE = 8196; + private static final int BUF_SIZE = 8192; private DownloadUtil.ConfigEntity mConfigEntity; private String mConfigFPath; private long mChildCurrentLocation = 0; @@ -77,9 +81,11 @@ final class SingleThreadTask implements Runnable { conn.setReadTimeout(mConstance.READ_TIME_OUT); //设置读取流的等待时间,必须设置该参数 is = conn.getInputStream(); //创建可设置位置的文件 - RandomAccessFile file = new RandomAccessFile(mConfigEntity.TEMP_FILE, "rwd"); - //设置每条线程写入文件的位置 + BufferedRandomAccessFile + file = new BufferedRandomAccessFile(mConfigEntity.TEMP_FILE, "rwd", 8192); + //设置文件长度 file.seek(mConfigEntity.START_LOCATION); + byte[] buffer = new byte[BUF_SIZE]; int len; //当前子线程的下载位置 @@ -175,12 +181,36 @@ final class SingleThreadTask implements Runnable { * 下载中 */ private void progress(long len) { - synchronized (LOCK) { + //synchronized (LOCK) { mChildCurrentLocation += len; mConstance.CURRENT_LOCATION += len; + //mListener.onProgress(mConstance.CURRENT_LOCATION); + //mHandler.post(t); + //handler.obtainMessage().sendToTarget(); + //} + mHandler.sendEmptyMessage(1); + } + Handler mHandler = new Handler(Looper.getMainLooper()){ + @Override public void handleMessage(Message msg) { + super.handleMessage(msg); mListener.onProgress(mConstance.CURRENT_LOCATION); } - } + }; + + Thread t = new Thread(new Runnable() { + @Override public void run() { + mListener.onProgress(mConstance.CURRENT_LOCATION); + } + }); + + //Handler handler = new Handler(){ + // @Override public void handleMessage(Message msg) { + // super.handleMessage(msg); + // mListener.onProgress(mConstance.CURRENT_LOCATION); + // } + //}; + + Thread thread = new Thread(); /** * 取消下载 diff --git a/Aria/src/main/java/com/arialyy/aria/util/BufferedRandomAccessFile.java b/Aria/src/main/java/com/arialyy/aria/util/BufferedRandomAccessFile.java new file mode 100644 index 00000000..167dbdf7 --- /dev/null +++ b/Aria/src/main/java/com/arialyy/aria/util/BufferedRandomAccessFile.java @@ -0,0 +1,328 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package com.arialyy.aria.util; + +import java.io.*; +import java.util.Arrays; + +//import org.apache.log4j.Logger; + +/** + * A BufferedRandomAccessFile is like a + * RandomAccessFile, but it uses a private buffer so that most + * operations do not require a disk access. + *

+ * + * Note: The operations on this class are unmonitored. Also, the correct + * functioning of the RandomAccessFile methods that are not + * overridden here relies on the implementation of those methods in the + * superclass. + * Author : Avinash Lakshman ( alakshman@facebook.com) & Prashant Malik ( pmalik@facebook.com ) + */ + +public final class BufferedRandomAccessFile extends RandomAccessFile { + //private static final Logger logger_ = Logger.getLogger(BufferedRandomAccessFile.class); + static final int LogBuffSz_ = 16; // 64K buffer + public static final int BuffSz_ = (1 << LogBuffSz_); + static final long BuffMask_ = ~(((long) BuffSz_) - 1L); + + /* + * This implementation is based on the buffer implementation in Modula-3's + * "Rd", "Wr", "RdClass", and "WrClass" interfaces. + */ + private boolean dirty_; // true iff unflushed bytes exist + private boolean closed_; // true iff the file is closed + private long curr_; // current position in file + private long lo_, hi_; // bounds on characters in "buff" + private byte[] buff_; // local buffer + private long maxHi_; // this.lo + this.buff.length + private boolean hitEOF_; // buffer contains last file block? + private long diskPos_; // disk position + + /* + * To describe the above fields, we introduce the following abstractions for + * the file "f": + * + * len(f) the length of the file curr(f) the current position in the file + * c(f) the abstract contents of the file disk(f) the contents of f's + * backing disk file closed(f) true iff the file is closed + * + * "curr(f)" is an index in the closed interval [0, len(f)]. "c(f)" is a + * character sequence of length "len(f)". "c(f)" and "disk(f)" may differ if + * "c(f)" contains unflushed writes not reflected in "disk(f)". The flush + * operation has the effect of making "disk(f)" identical to "c(f)". + * + * A file is said to be *valid* if the following conditions hold: + * + * V1. The "closed" and "curr" fields are correct: + * + * f.closed == closed(f) f.curr == curr(f) + * + * V2. The current position is either contained in the buffer, or just past + * the buffer: + * + * f.lo <= f.curr <= f.hi + * + * V3. Any (possibly) unflushed characters are stored in "f.buff": + * + * (forall i in [f.lo, f.curr): c(f)[i] == f.buff[i - f.lo]) + * + * V4. For all characters not covered by V3, c(f) and disk(f) agree: + * + * (forall i in [f.lo, len(f)): i not in [f.lo, f.curr) => c(f)[i] == + * disk(f)[i]) + * + * V5. "f.dirty" is true iff the buffer contains bytes that should be + * flushed to the file; by V3 and V4, only part of the buffer can be dirty. + * + * f.dirty == (exists i in [f.lo, f.curr): c(f)[i] != f.buff[i - f.lo]) + * + * V6. this.maxHi == this.lo + this.buff.length + * + * Note that "f.buff" can be "null" in a valid file, since the range of + * characters in V3 is empty when "f.lo == f.curr". + * + * A file is said to be *ready* if the buffer contains the current position, + * i.e., when: + * + * R1. !f.closed && f.buff != null && f.lo <= f.curr && f.curr < f.hi + * + * When a file is ready, reading or writing a single byte can be performed + * by reading or writing the in-memory buffer without performing a disk + * operation. + */ + + /** + * Open a new BufferedRandomAccessFile on file + * in mode mode, which should be "r" for reading only, or + * "rw" for reading and writing. + */ + public BufferedRandomAccessFile(File file, String mode) throws IOException { + super(file, mode); + this.init(0); + } + + public BufferedRandomAccessFile(File file, String mode, int size) throws IOException { + super(file, mode); + this.init(size); + } + + /** + * Open a new BufferedRandomAccessFile on the file named + * name in mode mode, which should be "r" for + * reading only, or "rw" for reading and writing. + */ + public BufferedRandomAccessFile(String name, String mode) throws IOException { + super(name, mode); + this.init(0); + } + + public BufferedRandomAccessFile(String name, String mode, int size) throws FileNotFoundException { + super(name, mode); + this.init(size); + } + + private void init(int size) { + this.dirty_ = this.closed_ = false; + this.lo_ = this.curr_ = this.hi_ = 0; + this.buff_ = (size > BuffSz_) ? new byte[size] : new byte[BuffSz_]; + this.maxHi_ = (long) BuffSz_; + this.hitEOF_ = false; + this.diskPos_ = 0L; + } + + public void close() throws IOException { + this.flush(); + this.closed_ = true; + super.close(); + } + + /** + * Flush any bytes in the file's buffer that have not yet been written to + * disk. If the file was created read-only, this method is a no-op. + */ + public void flush() throws IOException { + this.flushBuffer(); + } + + /* Flush any dirty bytes in the buffer to disk. */ + private void flushBuffer() throws IOException { + if (this.dirty_) { + if (this.diskPos_ != this.lo_) super.seek(this.lo_); + int len = (int) (this.curr_ - this.lo_); + super.write(this.buff_, 0, len); + this.diskPos_ = this.curr_; + this.dirty_ = false; + } + } + + /* + * Read at most "this.buff.length" bytes into "this.buff", returning the + * number of bytes read. If the return result is less than + * "this.buff.length", then EOF was read. + */ + private int fillBuffer() throws IOException { + int cnt = 0; + int rem = this.buff_.length; + while (rem > 0) { + int n = super.read(this.buff_, cnt, rem); + if (n < 0) break; + cnt += n; + rem -= n; + } + if ((cnt < 0) && (this.hitEOF_ = (cnt < this.buff_.length))) { + // make sure buffer that wasn't read is initialized with -1 + Arrays.fill(this.buff_, cnt, this.buff_.length, (byte) 0xff); + } + this.diskPos_ += cnt; + return cnt; + } + + /* + * This method positions this.curr at position pos. + * If pos does not fall in the current buffer, it flushes the + * current buffer and loads the correct one.

+ * + * On exit from this routine this.curr == this.hi iff pos + * is at or past the end-of-file, which can only happen if the file was + * opened in read-only mode. + */ + public void seek(long pos) throws IOException { + if (pos >= this.hi_ || pos < this.lo_) { + // seeking outside of current buffer -- flush and read + this.flushBuffer(); + this.lo_ = pos & BuffMask_; // start at BuffSz boundary + this.maxHi_ = this.lo_ + (long) this.buff_.length; + if (this.diskPos_ != this.lo_) { + super.seek(this.lo_); + this.diskPos_ = this.lo_; + } + int n = this.fillBuffer(); + this.hi_ = this.lo_ + (long) n; + } else { + // seeking inside current buffer -- no read required + if (pos < this.curr_) { + // if seeking backwards, we must flush to maintain V4 + this.flushBuffer(); + } + } + this.curr_ = pos; + } + + public long getFilePointer() { + return this.curr_; + } + + public long length() throws IOException { + return Math.max(this.curr_, super.length()); + } + + public int read() throws IOException { + if (this.curr_ >= this.hi_) { + // test for EOF + // if (this.hi < this.maxHi) return -1; + if (this.hitEOF_) return -1; + + // slow path -- read another buffer + this.seek(this.curr_); + if (this.curr_ == this.hi_) return -1; + } + byte res = this.buff_[(int) (this.curr_ - this.lo_)]; + this.curr_++; + return ((int) res) & 0xFF; // convert byte -> int + } + + public int read(byte[] b) throws IOException { + return this.read(b, 0, b.length); + } + + public int read(byte[] b, int off, int len) throws IOException { + if (this.curr_ >= this.hi_) { + // test for EOF + // if (this.hi < this.maxHi) return -1; + if (this.hitEOF_) return -1; + + // slow path -- read another buffer + this.seek(this.curr_); + if (this.curr_ == this.hi_) return -1; + } + len = Math.min(len, (int) (this.hi_ - this.curr_)); + int buffOff = (int) (this.curr_ - this.lo_); + System.arraycopy(this.buff_, buffOff, b, off, len); + this.curr_ += len; + return len; + } + + public void write(int b) throws IOException { + if (this.curr_ >= this.hi_) { + if (this.hitEOF_ && this.hi_ < this.maxHi_) { + // at EOF -- bump "hi" + this.hi_++; + } else { + // slow path -- write current buffer; read next one + this.seek(this.curr_); + if (this.curr_ == this.hi_) { + // appending to EOF -- bump "hi" + this.hi_++; + } + } + } + this.buff_[(int) (this.curr_ - this.lo_)] = (byte) b; + this.curr_++; + this.dirty_ = true; + } + + public void write(byte[] b) throws IOException { + this.write(b, 0, b.length); + } + + public void write(byte[] b, int off, int len) throws IOException { + while (len > 0) { + int n = this.writeAtMost(b, off, len); + off += n; + len -= n; + this.dirty_ = true; + } + } + + /* + * Write at most "len" bytes to "b" starting at position "off", and return + * the number of bytes written. + */ + private int writeAtMost(byte[] b, int off, int len) throws IOException { + if (this.curr_ >= this.hi_) { + if (this.hitEOF_ && this.hi_ < this.maxHi_) { + // at EOF -- bump "hi" + this.hi_ = this.maxHi_; + } else { + // slow path -- write current buffer; read next one + this.seek(this.curr_); + if (this.curr_ == this.hi_) { + // appending to EOF -- bump "hi" + this.hi_ = this.maxHi_; + } + } + } + len = Math.min(len, (int) (this.hi_ - this.curr_)); + int buffOff = (int) (this.curr_ - this.lo_); + System.arraycopy(b, off, this.buff_, buffOff, len); + this.curr_ += len; + return len; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java b/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java index 7bc60d51..4d0bdff2 100644 --- a/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java +++ b/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java @@ -33,6 +33,8 @@ import butterknife.Bind; import com.arialyy.aria.core.AMTarget; import com.arialyy.aria.core.Aria; import com.arialyy.aria.core.DownloadEntity; +import com.arialyy.aria.core.task.DownloadUtil; +import com.arialyy.aria.core.task.IDownloadListener; import com.arialyy.aria.core.task.Task; import com.arialyy.aria.util.CommonUtil; import com.arialyy.frame.util.show.L; @@ -198,6 +200,67 @@ public class SingleTaskActivity extends BaseActivity { .setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/test.apk") .setDownloadName("test.apk") .start(); + //DownloadEntity entity = new DownloadEntity(); + //entity.setDownloadUrl(DOWNLOAD_URL); + //entity.setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/test.apk"); + //entity.setFileName("test.apk"); + //DownloadUtil util = new DownloadUtil(this, entity, new IDownloadListener() { + // long fileSize = 1; + // @Override public void supportBreakpoint(boolean support) { + // + // } + // + // @Override public void onCancel() { + // + // } + // + // @Override public void onFail() { + // + // } + // + // @Override public void onPre() { + // + // } + // + // @Override public void onPostPre(long fileSize) { + // this.fileSize = fileSize; + // } + // + // @Override public void onProgress(long currentLocation) { + // long current = currentLocation; + // long len = fileSize; + // if (len == 0) { + // mPb.setProgress(0); + // } else { + // mPb.setProgress((int) ((current * 100) / len)); + // } + // } + // + // @Override public void onChildComplete(long finishLocation) { + // + // } + // + // @Override public void onStart(long startLocation) { + // + // } + // + // @Override public void onChildResume(long resumeLocation) { + // + // } + // + // @Override public void onResume(long resumeLocation) { + // + // } + // + // @Override public void onStop(long stopLocation) { + // + // } + // + // @Override public void onComplete() { + // + // } + //}); + //util.startDownload(); } private void stop() { From 2b21d98e77796be7479652a2fcb5d874a009af78 Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Wed, 22 Feb 2017 20:36:24 +0800 Subject: [PATCH 12/38] bug fix --- .idea/misc.xml | 2 +- .../aria/core/task/SingleThreadTask.java | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 5d199810..fbb68289 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -37,7 +37,7 @@ - + diff --git a/Aria/src/main/java/com/arialyy/aria/core/task/SingleThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/task/SingleThreadTask.java index 07e94bca..317b9da1 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/task/SingleThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/task/SingleThreadTask.java @@ -81,8 +81,8 @@ final class SingleThreadTask implements Runnable { conn.setReadTimeout(mConstance.READ_TIME_OUT); //设置读取流的等待时间,必须设置该参数 is = conn.getInputStream(); //创建可设置位置的文件 - BufferedRandomAccessFile - file = new BufferedRandomAccessFile(mConfigEntity.TEMP_FILE, "rwd", 8192); + BufferedRandomAccessFile file = + new BufferedRandomAccessFile(mConfigEntity.TEMP_FILE, "rwd", 8192); //设置文件长度 file.seek(mConfigEntity.START_LOCATION); @@ -181,16 +181,16 @@ final class SingleThreadTask implements Runnable { * 下载中 */ private void progress(long len) { - //synchronized (LOCK) { + synchronized (LOCK) { mChildCurrentLocation += len; mConstance.CURRENT_LOCATION += len; - //mListener.onProgress(mConstance.CURRENT_LOCATION); - //mHandler.post(t); - //handler.obtainMessage().sendToTarget(); - //} - mHandler.sendEmptyMessage(1); + mListener.onProgress(mConstance.CURRENT_LOCATION); + //mHandler.sendEmptyMessage(1); + //mHandler.post(t); + } } - Handler mHandler = new Handler(Looper.getMainLooper()){ + + Handler mHandler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { super.handleMessage(msg); mListener.onProgress(mConstance.CURRENT_LOCATION); From 0715ffeb9b7dae8b6cef829232708033a75b59df Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Wed, 22 Feb 2017 20:45:33 +0800 Subject: [PATCH 13/38] bug fix --- .../java/com/arialyy/aria/core/AriaManager.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java b/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java index b9dcb150..59a91aed 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java +++ b/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java @@ -49,12 +49,12 @@ import java.util.Set; * Aria管理器,任务操作在这里执行 */ @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) public class AriaManager { - private static final String TAG = "AriaManager"; - private static final Object LOCK = new Object(); - private static volatile AriaManager INSTANCE = null; - private Map mTargets = new HashMap<>(); + private static final String TAG = "AriaManager"; + private static final Object LOCK = new Object(); + private static volatile AriaManager INSTANCE = null; + private Map mTargets = new HashMap<>(); private DownloadManager mManager; - private LifeCallback mLifeCallback; + private LifeCallback mLifeCallback; private AriaManager(Context context) { regAppLifeCallback(context); @@ -218,7 +218,10 @@ import java.util.Set; } handlePopupWindowLift((PopupWindow) obj); } - } else { + } + if (obj instanceof Activity || obj instanceof Service) { + key = clsName; + } else if (obj instanceof Application) { key = clsName; } if (TextUtils.isEmpty(key)) { From fd944c2e3571eb3b0e9f9d184c27f3b0fc54be9c Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Thu, 23 Feb 2017 14:49:39 +0800 Subject: [PATCH 14/38] bug fix --- .../main/java/com/arialyy/aria/core/Aria.java | 27 +++++++++---------- .../com/arialyy/aria/core/AriaManager.java | 4 +++ .../java/com/arialyy/aria/util/CheckUtil.java | 4 +++ 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/Aria/src/main/java/com/arialyy/aria/core/Aria.java b/Aria/src/main/java/com/arialyy/aria/core/Aria.java index 4aab85f2..b3c5a6c9 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/Aria.java +++ b/Aria/src/main/java/com/arialyy/aria/core/Aria.java @@ -28,6 +28,7 @@ import android.os.Build; import android.widget.PopupWindow; import com.arialyy.aria.core.scheduler.OnSchedulerListener; import com.arialyy.aria.core.task.Task; +import com.arialyy.aria.util.CheckUtil; /** * Created by lyy on 2016/12/1. @@ -98,12 +99,12 @@ import com.arialyy.aria.core.task.Task; private Aria() { } + /** * 接受Activity、Service、Application */ public static AMReceiver whit(Context context) { - //if (context == null) throw new IllegalArgumentException("context 不能为 null"); - checkNull(context); + CheckUtil.checkNull(context); if (context instanceof Activity || context instanceof Service || context instanceof Application) { @@ -117,7 +118,7 @@ import com.arialyy.aria.core.task.Task; * 处理Fragment */ public static AMReceiver whit(Fragment fragment) { - checkNull(fragment); + CheckUtil.checkNull(fragment); return AriaManager.getInstance( Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? fragment.getContext() : fragment.getActivity()).get(fragment); @@ -127,7 +128,7 @@ import com.arialyy.aria.core.task.Task; * 处理Fragment */ public static AMReceiver whit(android.support.v4.app.Fragment fragment) { - checkNull(fragment); + CheckUtil.checkNull(fragment); return AriaManager.getInstance( Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? fragment.getContext() : fragment.getActivity()).get(fragment); @@ -137,7 +138,7 @@ import com.arialyy.aria.core.task.Task; * 处理Fragment、或者DialogFragment */ public static AMReceiver whit(DialogFragment dialog) { - checkNull(dialog); + CheckUtil.checkNull(dialog); return AriaManager.getInstance( Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? dialog.getContext() : dialog.getActivity()) .get(dialog); @@ -147,7 +148,7 @@ import com.arialyy.aria.core.task.Task; * 处理popupwindow */ public static AMReceiver whit(PopupWindow popupWindow) { - checkNull(popupWindow); + CheckUtil.checkNull(popupWindow); return AriaManager.getInstance(popupWindow.getContentView().getContext()).get(popupWindow); } @@ -155,7 +156,7 @@ import com.arialyy.aria.core.task.Task; * 处理Dialog */ public static AMReceiver whit(Dialog dialog) { - checkNull(dialog); + CheckUtil.checkNull(dialog); return AriaManager.getInstance(dialog.getContext()).get(dialog); } @@ -177,7 +178,7 @@ import com.arialyy.aria.core.task.Task; * 处理Dialog的通用任务 */ public static AriaManager get(Dialog dialog) { - checkNull(dialog); + CheckUtil.checkNull(dialog); return AriaManager.getInstance(dialog.getContext()); } @@ -185,7 +186,7 @@ import com.arialyy.aria.core.task.Task; * 处理Dialog的通用任务 */ public static AriaManager get(PopupWindow popupWindow) { - checkNull(popupWindow); + CheckUtil.checkNull(popupWindow); return AriaManager.getInstance(popupWindow.getContentView().getContext()); } @@ -193,7 +194,7 @@ import com.arialyy.aria.core.task.Task; * 处理Fragment的通用任务 */ public static AriaManager get(Fragment fragment) { - checkNull(fragment); + CheckUtil.checkNull(fragment); return AriaManager.getInstance( Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? fragment.getContext() : fragment.getActivity()); @@ -203,16 +204,12 @@ import com.arialyy.aria.core.task.Task; * 处理Fragment的通用任务 */ public static AriaManager get(android.support.v4.app.Fragment fragment) { - checkNull(fragment); + CheckUtil.checkNull(fragment); return AriaManager.getInstance( Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? fragment.getContext() : fragment.getActivity()); } - private static void checkNull(Object obj) { - if (obj == null) throw new IllegalArgumentException("不能传入空对象"); - } - public static class SimpleSchedulerListener implements OnSchedulerListener { @Override public void onTaskPre(Task task) { diff --git a/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java b/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java index b9dcb150..d100d1a3 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java +++ b/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java @@ -217,6 +217,10 @@ import java.util.Set; key = clsName; } handlePopupWindowLift((PopupWindow) obj); + } else if (obj instanceof Service) { + key = clsName; + } else if (obj instanceof Application) { + key = clsName; } } else { key = clsName; diff --git a/Aria/src/main/java/com/arialyy/aria/util/CheckUtil.java b/Aria/src/main/java/com/arialyy/aria/util/CheckUtil.java index 5326a0a6..fd07b7c1 100644 --- a/Aria/src/main/java/com/arialyy/aria/util/CheckUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/util/CheckUtil.java @@ -31,6 +31,10 @@ import java.util.regex.Pattern; public class CheckUtil { private static final String TAG = "CheckUtil"; + public static void checkNull(Object obj) { + if (obj == null) throw new IllegalArgumentException("不能传入空对象"); + } + /** * 检查sql的expression是否合法 */ From ad2e5a9ccefaeb33f0d601cf8fab5dad2d1bfe91 Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Thu, 23 Feb 2017 15:02:34 +0800 Subject: [PATCH 15/38] readme --- .idea/misc.xml | 2 +- .idea/modules.xml | 4 ++-- .idea/vcs.xml | 6 ------ .../com/arialyy/aria/util/BufferedRandomAccessFile.java | 2 +- README.md | 3 ++- 5 files changed, 6 insertions(+), 11 deletions(-) delete mode 100644 .idea/vcs.xml diff --git a/.idea/misc.xml b/.idea/misc.xml index fbb68289..5d199810 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -37,7 +37,7 @@ - + diff --git a/.idea/modules.xml b/.idea/modules.xml index b0a774eb..d68bc4ee 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,8 +2,8 @@ - - + + diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1ddf..00000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/Aria/src/main/java/com/arialyy/aria/util/BufferedRandomAccessFile.java b/Aria/src/main/java/com/arialyy/aria/util/BufferedRandomAccessFile.java index 167dbdf7..a0f36785 100644 --- a/Aria/src/main/java/com/arialyy/aria/util/BufferedRandomAccessFile.java +++ b/Aria/src/main/java/com/arialyy/aria/util/BufferedRandomAccessFile.java @@ -33,7 +33,7 @@ import java.util.Arrays; * functioning of the RandomAccessFile methods that are not * overridden here relies on the implementation of those methods in the * superclass. - * Author : Avinash Lakshman ( alakshman@facebook.com) & Prashant Malik ( pmalik@facebook.com ) + * Author : Avinash Lakshman ( alakshman@facebook.com) Prashant Malik ( pmalik@facebook.com ) */ public final class BufferedRandomAccessFile extends RandomAccessFile { diff --git a/README.md b/README.md index ddc19c92..fbff9751 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Aria,致力于让下载傻瓜化
## 下载 [![Download](https://api.bintray.com/packages/arialyy/maven/Aria/images/download.svg)](https://bintray.com/arialyy/maven/Aria/_latestVersion)
```java -compile 'com.arialyy.aria:Aria:2.4.0' +compile 'com.arialyy.aria:Aria:2.4.1' ``` ## 示例 @@ -134,6 +134,7 @@ Aria支持https下载,如果你希望使用自己的ca证书,那么你需要 *** ## 开发日志 + + v_2.4.1 修复下载慢的问题,修复application、service 不能使用的问题 + v_2.4.0 支持https链接下载 + v_2.3.8 修复数据错乱的bug、添加fragment支持 + v_2.3.6 添加dialog、popupWindow支持 From 53d449c72dd11e0f170723d1c4844188136d8888 Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Thu, 23 Feb 2017 19:22:57 +0800 Subject: [PATCH 16/38] .. --- .idea/misc.xml | 2 +- .../main/java/com/arialyy/aria/core/task/SingleThreadTask.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index fbb68289..5d199810 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -37,7 +37,7 @@
- + diff --git a/Aria/src/main/java/com/arialyy/aria/core/task/SingleThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/task/SingleThreadTask.java index 317b9da1..d09e1ed7 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/task/SingleThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/task/SingleThreadTask.java @@ -82,7 +82,7 @@ final class SingleThreadTask implements Runnable { is = conn.getInputStream(); //创建可设置位置的文件 BufferedRandomAccessFile file = - new BufferedRandomAccessFile(mConfigEntity.TEMP_FILE, "rwd", 8192); + new BufferedRandomAccessFile(mConfigEntity.TEMP_FILE, "rwd", BUF_SIZE); //设置文件长度 file.seek(mConfigEntity.START_LOCATION); From aeb4e5dd40c8dda345d725d262dfc21f8da12bda Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Thu, 23 Feb 2017 19:26:31 +0800 Subject: [PATCH 17/38] .. --- .idea/modules.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.idea/modules.xml b/.idea/modules.xml index d68bc4ee..5f6de159 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,9 @@ + + From 3b1d024b1155fa36220b11f02a2518ad756a41d4 Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Sat, 4 Mar 2017 14:11:08 +0800 Subject: [PATCH 18/38] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=87=8D=E8=AF=95?= =?UTF-8?q?=E6=97=A0=E6=95=88=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/scheduler/DownloadSchedulers.java | 31 ++++++++++--------- .../core/scheduler/IDownloadSchedulers.java | 5 +-- .../com/arialyy/aria/util/Configuration.java | 2 +- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/Aria/src/main/java/com/arialyy/aria/core/scheduler/DownloadSchedulers.java b/Aria/src/main/java/com/arialyy/aria/core/scheduler/DownloadSchedulers.java index 25e9385c..0e062e03 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/scheduler/DownloadSchedulers.java +++ b/Aria/src/main/java/com/arialyy/aria/core/scheduler/DownloadSchedulers.java @@ -38,44 +38,44 @@ public class DownloadSchedulers implements IDownloadSchedulers { /** * 任务预加载 */ - public static final int PRE = 0; + public static final int PRE = 0; /** * 任务开始 */ - public static final int START = 1; + public static final int START = 1; /** * 任务停止 */ - public static final int STOP = 2; + public static final int STOP = 2; /** * 任务失败 */ - public static final int FAIL = 3; + public static final int FAIL = 3; /** * 任务取消 */ - public static final int CANCEL = 4; + public static final int CANCEL = 4; /** * 任务完成 */ - public static final int COMPLETE = 5; + public static final int COMPLETE = 5; /** * 下载中 */ - public static final int RUNNING = 6; + public static final int RUNNING = 6; /** * 恢复下载 */ - public static final int RESUME = 7; - private static final String TAG = "DownloadSchedulers"; - private static final Object LOCK = new Object(); + public static final int RESUME = 7; + private static final String TAG = "DownloadSchedulers"; + private static final Object LOCK = new Object(); private static volatile DownloadSchedulers INSTANCE = null; /** * 下载器任务监听 */ Map mSchedulerListeners = new ConcurrentHashMap<>(); - DownloadManager mManager = DownloadManager.getInstance(); + DownloadManager mManager = DownloadManager.getInstance(); ITaskQueue mQueue; private DownloadSchedulers() { @@ -130,8 +130,7 @@ public class DownloadSchedulers implements IDownloadSchedulers { startNextTask(entity); break; case FAIL: - mQueue.removeTask(entity); - handleFailTask(entity); + handleFailTask(task); break; } return true; @@ -192,9 +191,9 @@ public class DownloadSchedulers implements IDownloadSchedulers { /** * 处理下载任务下载失败的情形 * - * @param entity 失败实体 + * @param task 下载任务 */ - @Override public void handleFailTask(final DownloadEntity entity) { + @Override public void handleFailTask(final Task task) { final Configuration config = Configuration.getInstance(); CountDownTimer timer = new CountDownTimer(config.getReTryInterval(), 1000) { @Override public void onTick(long millisUntilFinished) { @@ -202,6 +201,7 @@ public class DownloadSchedulers implements IDownloadSchedulers { } @Override public void onFinish() { + DownloadEntity entity = task.getDownloadEntity(); if (entity.getFailNum() <= config.getReTryNum()) { Task task = mQueue.getTask(entity); mQueue.reTryStart(task); @@ -211,6 +211,7 @@ public class DownloadSchedulers implements IDownloadSchedulers { e.printStackTrace(); } } else { + mQueue.removeTask(entity); startNextTask(entity); } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/scheduler/IDownloadSchedulers.java b/Aria/src/main/java/com/arialyy/aria/core/scheduler/IDownloadSchedulers.java index 5b38ceb5..3e75061f 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/scheduler/IDownloadSchedulers.java +++ b/Aria/src/main/java/com/arialyy/aria/core/scheduler/IDownloadSchedulers.java @@ -18,6 +18,7 @@ package com.arialyy.aria.core.scheduler; import android.os.Handler; import com.arialyy.aria.core.DownloadEntity; +import com.arialyy.aria.core.task.Task; /** * Created by “AriaLyy@outlook.com” on 2016/11/2. @@ -42,9 +43,9 @@ public interface IDownloadSchedulers extends Handler.Callback { /** * 处理下载任务下载失败的情形 * - * @param entity 下载实体 + * @param task 下载任务 */ - public void handleFailTask(DownloadEntity entity); + public void handleFailTask(Task task); /** * 启动下一个任务,条件:任务停止,取消下载,任务完成 diff --git a/Aria/src/main/java/com/arialyy/aria/util/Configuration.java b/Aria/src/main/java/com/arialyy/aria/util/Configuration.java index de3703d7..f3f4dd95 100644 --- a/Aria/src/main/java/com/arialyy/aria/util/Configuration.java +++ b/Aria/src/main/java/com/arialyy/aria/util/Configuration.java @@ -84,7 +84,7 @@ public class Configuration { private void init() { Map config = new WeakHashMap<>(); config.put(DOWNLOAD_NUM, 2 + ""); - config.put(RE_TRY_NUM, 10 + ""); + config.put(RE_TRY_NUM, 3 + ""); config.put(OPEN_BROADCAST, false + ""); config.put(RE_TRY_INTERVAL, 4000 + ""); config.put(DOWNLOAD_TIME_OUT, 10000 + ""); From 883ea817475913ed763a64e0c2b4fe3d51b3295b Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Sat, 4 Mar 2017 14:15:21 +0800 Subject: [PATCH 19/38] readme --- Aria/build.gradle | 4 ++-- Aria/src/main/java/com/arialyy/aria/util/Configuration.java | 2 +- README.md | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Aria/build.gradle b/Aria/build.gradle index 4aae21af..b6e5869b 100644 --- a/Aria/build.gradle +++ b/Aria/build.gradle @@ -7,8 +7,8 @@ android { defaultConfig { minSdkVersion 9 targetSdkVersion 23 - versionCode 85 - versionName "2.3.7" + versionCode 86 + versionName "2.4.2" } buildTypes { release { diff --git a/Aria/src/main/java/com/arialyy/aria/util/Configuration.java b/Aria/src/main/java/com/arialyy/aria/util/Configuration.java index f3f4dd95..de3703d7 100644 --- a/Aria/src/main/java/com/arialyy/aria/util/Configuration.java +++ b/Aria/src/main/java/com/arialyy/aria/util/Configuration.java @@ -84,7 +84,7 @@ public class Configuration { private void init() { Map config = new WeakHashMap<>(); config.put(DOWNLOAD_NUM, 2 + ""); - config.put(RE_TRY_NUM, 3 + ""); + config.put(RE_TRY_NUM, 10 + ""); config.put(OPEN_BROADCAST, false + ""); config.put(RE_TRY_INTERVAL, 4000 + ""); config.put(DOWNLOAD_TIME_OUT, 10000 + ""); diff --git a/README.md b/README.md index fbff9751..25ccf3af 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Aria,致力于让下载傻瓜化
## 下载 [![Download](https://api.bintray.com/packages/arialyy/maven/Aria/images/download.svg)](https://bintray.com/arialyy/maven/Aria/_latestVersion)
```java -compile 'com.arialyy.aria:Aria:2.4.1' +compile 'com.arialyy.aria:Aria:2.4.2' ``` ## 示例 @@ -134,6 +134,7 @@ Aria支持https下载,如果你希望使用自己的ca证书,那么你需要 *** ## 开发日志 + + v_2.4.2 修复失败重试无效的bug + v_2.4.1 修复下载慢的问题,修复application、service 不能使用的问题 + v_2.4.0 支持https链接下载 + v_2.3.8 修复数据错乱的bug、添加fragment支持 From 107dd23df88c53f1cedd167bfd8e58f9942150ad Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Sat, 4 Mar 2017 14:22:25 +0800 Subject: [PATCH 20/38] .. --- .idea/misc.xml | 2 +- .idea/modules.xml | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 5d199810..fbb68289 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -37,7 +37,7 @@
- + diff --git a/.idea/modules.xml b/.idea/modules.xml index 5f6de159..b0a774eb 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -3,9 +3,7 @@ - - From e92596183084c7bae851febc3bf273fca7aa1b17 Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Sat, 4 Mar 2017 14:26:33 +0800 Subject: [PATCH 21/38] .. --- .idea/misc.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index fbb68289..5d199810 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -37,7 +37,7 @@ - + From 649ccc0f71723de3593019fb2a454527cdc9f4be Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@QQ.com> Date: Sat, 4 Mar 2017 14:28:48 +0800 Subject: [PATCH 22/38] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fbf16549..b54fe3eb 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Aria ![图标](https://github.com/AriaLyy/DownloadUtil/blob/v_2.0/app/src/main/res/mipmap-hdpi/ic_launcher.png)
-下载不应该是让人感到痛苦的功能,Aria,致力于让下载傻瓜化。
+下载不应该是让人感到痛苦的功能,Aria,让下载更简单。
+ Aria有以下特点: - 简单 - 可在Dialog、popupWindow等组件中使用 From 5f44dffa40b9a23e08e3bd38b433942d0be3b20d Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@QQ.com> Date: Sat, 4 Mar 2017 14:29:44 +0800 Subject: [PATCH 23/38] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 25ccf3af..bc3b6642 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Aria ![图标](https://github.com/AriaLyy/DownloadUtil/blob/v_2.0/app/src/main/res/mipmap-hdpi/ic_launcher.png)
-Aria,致力于让下载傻瓜化
+Aria,让下载更简单。
+ Aria有以下特点: - 简单 - 可在Dialog、popupWindow等组件中使用 From 1b143efa07db26e9daa6e09abc07b3484d1d7695 Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Tue, 7 Mar 2017 14:27:14 +0800 Subject: [PATCH 24/38] =?UTF-8?q?=E4=BF=AE=E5=A4=8D404=E9=93=BE=E6=8E=A5?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E7=9A=84=E5=8D=A1=E9=A1=BF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/modules.xml | 2 +- .../arialyy/aria/core/task/DownloadUtil.java | 36 ++++++++++--------- README.md | 9 +++-- app/proguard-rules.pro | 17 --------- app/src/main/res/values/strings.xml | 2 +- 5 files changed, 26 insertions(+), 40 deletions(-) delete mode 100644 app/proguard-rules.pro diff --git a/.idea/modules.xml b/.idea/modules.xml index 5f6de159..9f4bd159 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,8 +2,8 @@ - + diff --git a/Aria/src/main/java/com/arialyy/aria/core/task/DownloadUtil.java b/Aria/src/main/java/com/arialyy/aria/core/task/DownloadUtil.java index 6f14d883..7bebb4f1 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/task/DownloadUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/core/task/DownloadUtil.java @@ -40,18 +40,18 @@ public class DownloadUtil implements IDownloadUtil, Runnable { /** * 线程数 */ - private final int THREAD_NUM; + private final int THREAD_NUM; //下载监听 - private IDownloadListener mListener; - private int mConnectTimeOut = 5000 * 4; //连接超时时间 - private int mReadTimeOut = 5000 * 20; //流读取的超时时间 - private boolean isNewTask = true; + private IDownloadListener mListener; + private int mConnectTimeOut = 5000 * 4; //连接超时时间 + private int mReadTimeOut = 5000 * 20; //流读取的超时时间 + private boolean isNewTask = true; private boolean isSupportBreakpoint = true; - private Context mContext; - private DownloadEntity mDownloadEntity; + private Context mContext; + private DownloadEntity mDownloadEntity; private ExecutorService mFixedThreadPool; - private File mDownloadFile; //下载的文件 - private File mConfigFile;//下载信息配置文件 + private File mDownloadFile; //下载的文件 + private File mConfigFile;//下载信息配置文件 private SparseArray mTask = new SparseArray<>(); private DownloadStateConstance mConstance; @@ -223,8 +223,11 @@ public class DownloadUtil implements IDownloadUtil, Runnable { mListener.supportBreakpoint(false); Log.w(TAG, "该下载链接不支持断点下载"); handleBreakpoint(conn); + } else if (code == HttpURLConnection.HTTP_NOT_FOUND) { + Log.w(TAG, "任务【" + mDownloadEntity.getDownloadUrl() + "】下载失败,错误码:404"); + //mListener.onCancel(); } else { - failDownload("任务【" + mDownloadEntity.getDownloadUrl() + "】下载失败,返回码:" + code); + failDownload("任务【" + mDownloadEntity.getDownloadUrl() + "】下载失败,错误码:" + code); } } catch (IOException e) { failDownload("下载失败【downloadUrl:" @@ -263,7 +266,8 @@ public class DownloadUtil implements IDownloadUtil, Runnable { //RandomAccessFile file = new RandomAccessFile(mDownloadFile.getPath(), "rwd"); ////设置文件长度 //file.setLength(fileLength); - BufferedRandomAccessFile file = new BufferedRandomAccessFile(mDownloadFile.getPath(), "rwd", 8192); + BufferedRandomAccessFile file = + new BufferedRandomAccessFile(mDownloadFile.getPath(), "rwd", 8192); //设置文件长度 file.setLength(fileLength); mListener.onPostPre(fileLength); @@ -362,12 +366,12 @@ public class DownloadUtil implements IDownloadUtil, Runnable { */ final static class ConfigEntity { //文件大小 - long FILE_SIZE; + long FILE_SIZE; String DOWNLOAD_URL; - int THREAD_ID; - long START_LOCATION; - long END_LOCATION; - File TEMP_FILE; + int THREAD_ID; + long START_LOCATION; + long END_LOCATION; + File TEMP_FILE; boolean isSupportBreakpoint = true; String CONFIG_FILE_PATH; } diff --git a/README.md b/README.md index bc3b6642..987517ea 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Aria,让下载更简单。
## 下载 [![Download](https://api.bintray.com/packages/arialyy/maven/Aria/images/download.svg)](https://bintray.com/arialyy/maven/Aria/_latestVersion)
```java -compile 'com.arialyy.aria:Aria:2.4.2' +compile 'com.arialyy.aria:Aria:2.4.3' ``` ## 示例 @@ -133,16 +133,15 @@ Aria支持https下载,如果你希望使用自己的ca证书,那么你需要 ``` *** + ## 开发日志 + + v_2.4.3 修复404链接卡顿的问题 + v_2.4.2 修复失败重试无效的bug + v_2.4.1 修复下载慢的问题,修复application、service 不能使用的问题 + v_2.4.0 支持https链接下载 + v_2.3.8 修复数据错乱的bug、添加fragment支持 + v_2.3.6 添加dialog、popupWindow支持 - + v_2.3.3 - - 添加断点支持 - - 修改下载逻辑,让使用更加简单 - - 修复一个内存泄露的bug + + v_2.3.3 添加断点支持、修改下载逻辑,让使用更加简单、修复一个内存泄露的bug + v_2.3.1 重命名为Aria,下载流程简化 + v_2.1.1 增加,选择最大下载任务数接口 diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro deleted file mode 100644 index 80105608..00000000 --- a/app/proguard-rules.pro +++ /dev/null @@ -1,17 +0,0 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in D:\sdk/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dfa38c80..510df605 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -25,7 +25,7 @@ - http://g37.gdl.netease.com/onmyoji_netease.apk + http://g37.gdl.netease.com/onmyoji_netease_1.apk http://static.gaoshouyou.com/d/eb/f2/dfeba30541f209ab8a50d847fc1661ce.apk http://rs.0.gaoshouyou.com/d/51/46/58514d126c46b8a3f27fc8c7db3b09ec.apk http://rs.0.gaoshouyou.com/d/23/69/07238f952669727878d7a0e180534c8b.apk From cba47ac701e80fdf8d892bc143c3bacbfc17b3b4 Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Tue, 7 Mar 2017 14:28:34 +0800 Subject: [PATCH 25/38] .. --- .idea/modules.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.idea/modules.xml b/.idea/modules.xml index b0a774eb..9f4bd159 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,8 +2,10 @@ + + From 5535a64d82673776f1a909ae582269a9aa73c77c Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Tue, 7 Mar 2017 15:12:13 +0800 Subject: [PATCH 26/38] readme --- .idea/misc.xml | 2 +- README.md | 8 ++++---- img/qq_qun.png | Bin 0 -> 16767 bytes 3 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 img/qq_qun.png diff --git a/.idea/misc.xml b/.idea/misc.xml index fbb68289..5d199810 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -37,7 +37,7 @@
- + diff --git a/README.md b/README.md index d231b186..6cfed1e7 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,6 @@ # Aria ![图标](https://github.com/AriaLyy/DownloadUtil/blob/v_2.0/app/src/main/res/mipmap-hdpi/ic_launcher.png)
-<<<<<<< HEAD 下载不应该是让人感到痛苦的功能,Aria,让下载更简单。
-======= -Aria,让下载更简单。
->>>>>>> v_2.0 + Aria有以下特点: - 简单 - 可在Dialog、popupWindow等组件中使用 @@ -149,6 +145,10 @@ Aria支持https下载,如果你希望使用自己的ca证书,那么你需要 + v_2.3.1 重命名为Aria,下载流程简化 + v_2.1.1 增加,选择最大下载任务数接口 +## Aria交流群 +有兴趣的朋友可以一起来交流^_^ +![多任务下载](https://github.com/AriaLyy/DownloadUtil/blob/master/img/qq_qun.png) + License ------- diff --git a/img/qq_qun.png b/img/qq_qun.png new file mode 100644 index 0000000000000000000000000000000000000000..3da329d8b710e64e198d0aebe9950a40699d5d39 GIT binary patch literal 16767 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%0A~ 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 literal 0 HcmV?d00001 From ebd88f079835c95c85cf744b449bcbb8fe341126 Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Tue, 7 Mar 2017 15:13:13 +0800 Subject: [PATCH 27/38] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6cfed1e7..88c6e039 100644 --- a/README.md +++ b/README.md @@ -146,7 +146,7 @@ Aria支持https下载,如果你希望使用自己的ca证书,那么你需要 + v_2.1.1 增加,选择最大下载任务数接口 ## Aria交流群 -有兴趣的朋友可以一起来交流^_^ +有兴趣的朋友可以一起来交流^_^
![多任务下载](https://github.com/AriaLyy/DownloadUtil/blob/master/img/qq_qun.png) License From 89dfe61d394b06129460a0a4a12f6b7cc42a4fa6 Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Mon, 13 Mar 2017 12:36:46 +0800 Subject: [PATCH 28/38] =?UTF-8?q?=E3=80=82=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 2 +- .idea/modules.xml | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 5d199810..fbb68289 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -37,7 +37,7 @@
- + diff --git a/.idea/modules.xml b/.idea/modules.xml index 5f6de159..b0a774eb 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -3,9 +3,7 @@ - - From cce0f18b970d1c465c25f8b06a1ee48872797081 Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Mon, 13 Mar 2017 12:59:29 +0800 Subject: [PATCH 29/38] .. --- .idea/misc.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index fbb68289..5d199810 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -37,7 +37,7 @@ - + From 2255b0fe0cc039ca078cb47e2cb749d31f6aa0ff Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Mon, 13 Mar 2017 15:05:32 +0800 Subject: [PATCH 30/38] .. --- .idea/misc.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 5d199810..fbb68289 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -37,7 +37,7 @@ - + From 4d6d87375ed3249e2c1902f20797059fae4fb766 Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Tue, 14 Mar 2017 19:41:37 +0800 Subject: [PATCH 31/38] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=8D=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=96=AD=E7=82=B9=E6=96=87=E4=BB=B6=E5=A4=A7=E5=B0=8F?= =?UTF-8?q?=E6=89=BE=E4=B8=8D=E5=88=B0=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 2 +- Aria/build.gradle | 2 +- .../main/java/com/arialyy/aria/core/task/DownloadUtil.java | 4 +++- app/build.gradle | 2 +- .../com/arialyy/simple/single_task/SingleTaskActivity.java | 3 ++- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 6 files changed, 10 insertions(+), 7 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index fbb68289..5d199810 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -37,7 +37,7 @@ - + diff --git a/Aria/build.gradle b/Aria/build.gradle index b6e5869b..2aa5183d 100644 --- a/Aria/build.gradle +++ b/Aria/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.library' android { compileSdkVersion 23 - buildToolsVersion "23.0.2" + buildToolsVersion '25.0.2' defaultConfig { minSdkVersion 9 diff --git a/Aria/src/main/java/com/arialyy/aria/core/task/DownloadUtil.java b/Aria/src/main/java/com/arialyy/aria/core/task/DownloadUtil.java index 6f14d883..95ff96a9 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/task/DownloadUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/core/task/DownloadUtil.java @@ -244,7 +244,8 @@ public class DownloadUtil implements IDownloadUtil, Runnable { //不支持断点只能单线程下载 if (!isSupportBreakpoint) { ConfigEntity entity = new ConfigEntity(); - entity.FILE_SIZE = conn.getContentLength(); + long len = conn.getContentLength();; + entity.FILE_SIZE = len; entity.DOWNLOAD_URL = mDownloadEntity.getDownloadUrl(); entity.TEMP_FILE = mDownloadFile; entity.THREAD_ID = 0; @@ -254,6 +255,7 @@ public class DownloadUtil implements IDownloadUtil, Runnable { entity.isSupportBreakpoint = isSupportBreakpoint; SingleThreadTask task = new SingleThreadTask(mConstance, mListener, entity); mFixedThreadPool.execute(task); + mListener.onPostPre(len); mListener.onStart(0); return; } diff --git a/app/build.gradle b/app/build.gradle index f8fe4165..b863586e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 23 - buildToolsVersion "23.0.2" + buildToolsVersion '25.0.2' defaultConfig { applicationId "com.arialyy.simple" diff --git a/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java b/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java index 4d0bdff2..b888a99a 100644 --- a/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java +++ b/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java @@ -55,7 +55,8 @@ public class SingleTaskActivity extends BaseActivity { private static final String DOWNLOAD_URL = //"http://kotlinlang.org/docs/kotlin-docs.pdf"; //"https://atom-installer.github.com/v1.13.0/AtomSetup.exe?s=1484074138&ext=.exe"; - "http://static.gaoshouyou.com/d/21/e8/61218d78d0e8b79df68dbc18dd484c97.apk"; + //"http://static.gaoshouyou.com/d/21/e8/61218d78d0e8b79df68dbc18dd484c97.apk"; + "http://ox.konsung.net:5555/ksdc-web/download/downloadFile/?fileName=ksdc_1.0.2.apk&rRange=0-"; @Bind(R.id.progressBar) HorizontalProgressBarWithNumber mPb; @Bind(R.id.start) Button mStart; @Bind(R.id.stop) Button mStop; diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ab4c9191..6a77bf60 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Oct 24 17:59:34 CST 2016 +#Tue Mar 14 19:13:43 CST 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip From 3e79720d431caebae92deba288b0f5384a3122ee Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Tue, 14 Mar 2017 20:09:22 +0800 Subject: [PATCH 32/38] bug fix --- README.md | 2 +- .../single_task/SingleTaskActivity.java | 61 ------------------- 2 files changed, 1 insertion(+), 62 deletions(-) diff --git a/README.md b/README.md index 25ccf3af..d6c50696 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Aria,致力于让下载傻瓜化
## 下载 [![Download](https://api.bintray.com/packages/arialyy/maven/Aria/images/download.svg)](https://bintray.com/arialyy/maven/Aria/_latestVersion)
```java -compile 'com.arialyy.aria:Aria:2.4.2' +compile 'com.arialyy.aria:Aria:2.4.4' ``` ## 示例 diff --git a/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java b/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java index b888a99a..9de01d3c 100644 --- a/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java +++ b/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java @@ -201,67 +201,6 @@ public class SingleTaskActivity extends BaseActivity { .setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/test.apk") .setDownloadName("test.apk") .start(); - //DownloadEntity entity = new DownloadEntity(); - //entity.setDownloadUrl(DOWNLOAD_URL); - //entity.setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/test.apk"); - //entity.setFileName("test.apk"); - //DownloadUtil util = new DownloadUtil(this, entity, new IDownloadListener() { - // long fileSize = 1; - // @Override public void supportBreakpoint(boolean support) { - // - // } - // - // @Override public void onCancel() { - // - // } - // - // @Override public void onFail() { - // - // } - // - // @Override public void onPre() { - // - // } - // - // @Override public void onPostPre(long fileSize) { - // this.fileSize = fileSize; - // } - // - // @Override public void onProgress(long currentLocation) { - // long current = currentLocation; - // long len = fileSize; - // if (len == 0) { - // mPb.setProgress(0); - // } else { - // mPb.setProgress((int) ((current * 100) / len)); - // } - // } - // - // @Override public void onChildComplete(long finishLocation) { - // - // } - // - // @Override public void onStart(long startLocation) { - // - // } - // - // @Override public void onChildResume(long resumeLocation) { - // - // } - // - // @Override public void onResume(long resumeLocation) { - // - // } - // - // @Override public void onStop(long stopLocation) { - // - // } - // - // @Override public void onComplete() { - // - // } - //}); - //util.startDownload(); } private void stop() { From 32963706dd641e6156f126411aab96913418609d Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Tue, 14 Mar 2017 20:17:10 +0800 Subject: [PATCH 33/38] bug fix --- .idea/misc.xml | 2 +- README.md | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index fbb68289..5d199810 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -37,7 +37,7 @@
- + diff --git a/README.md b/README.md index 2374d556..0659d448 100644 --- a/README.md +++ b/README.md @@ -145,9 +145,8 @@ Aria支持https下载,如果你希望使用自己的ca证书,那么你需要 + v_2.3.1 重命名为Aria,下载流程简化 + v_2.1.1 增加,选择最大下载任务数接口 -## Aria交流群 -有兴趣的朋友可以一起来交流^_^
-![多任务下载](https://github.com/AriaLyy/DownloadUtil/blob/master/img/qq_qun.png) +## 其他 +有任何问题,可以在[issues](https://github.com/AriaLyy/Aria/issues)给我留言反馈。 License ------- From ae7accaf2c1edd8f77bf728763790ffbaa3f60a8 Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Tue, 21 Mar 2017 11:10:53 +0800 Subject: [PATCH 34/38] readme\ --- .idea/modules.xml | 2 +- README.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.idea/modules.xml b/.idea/modules.xml index 5f6de159..9f4bd159 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,8 +2,8 @@ - + diff --git a/README.md b/README.md index 0659d448..6a69da0a 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ [![Download](https://api.bintray.com/packages/arialyy/maven/Aria/images/download.svg)](https://bintray.com/arialyy/maven/Aria/_latestVersion)
```java compile 'com.arialyy.aria:Aria:2.4.4' +``` ## 示例 ![多任务下载](https://github.com/AriaLyy/DownloadUtil/blob/v_2.0/img/download_img.gif) From c92ca1ac55c2488836713e9a365a85c99ed98462 Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Tue, 21 Mar 2017 11:23:49 +0800 Subject: [PATCH 35/38] readme --- README.md | 2 +- .../single_task/SingleTaskActivity.java | 4 ++-- img/performance.png | Bin 44689 -> 47851 bytes 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6a69da0a..8a69b8cf 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ compile 'com.arialyy.aria:Aria:2.4.4' ![多任务下载](https://github.com/AriaLyy/DownloadUtil/blob/v_2.0/img/download_img.gif) ![Dialog使用](https://github.com/AriaLyy/DownloadUtil/blob/v_2.0/img/dialog_use.gif "") -## 性能展示 +## 性能 ![性能展示](https://github.com/AriaLyy/DownloadUtil/blob/v_2.0/img/performance.png) *** diff --git a/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java b/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java index 9de01d3c..ba0fa003 100644 --- a/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java +++ b/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java @@ -55,8 +55,8 @@ public class SingleTaskActivity extends BaseActivity { private static final String DOWNLOAD_URL = //"http://kotlinlang.org/docs/kotlin-docs.pdf"; //"https://atom-installer.github.com/v1.13.0/AtomSetup.exe?s=1484074138&ext=.exe"; - //"http://static.gaoshouyou.com/d/21/e8/61218d78d0e8b79df68dbc18dd484c97.apk"; - "http://ox.konsung.net:5555/ksdc-web/download/downloadFile/?fileName=ksdc_1.0.2.apk&rRange=0-"; + "http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apk"; + //"http://ox.konsung.net:5555/ksdc-web/download/downloadFile/?fileName=ksdc_1.0.2.apk&rRange=0-"; @Bind(R.id.progressBar) HorizontalProgressBarWithNumber mPb; @Bind(R.id.start) Button mStart; @Bind(R.id.stop) Button mStop; diff --git a/img/performance.png b/img/performance.png index cc29de094428db1da393af047ac1af23892f3975..953b7a5e4e5d262f35ff11ec286326e92fd8fd7e 100644 GIT binary patch literal 47851 zcmdSB2T)U6`#y^0=&=AQDkuUf2+~9dy;}g0b`X(Hq=R&UP(!eRbO8lI@4ZOxiAo72 zbfg7{)BqtwIs{1mJD}$~-|wFLzjyAPxifc~w4Gj&g z@}q}OXlPD?XlRZ!{&@npk^&PuPD68@M)~2rrydDQ6&R;Ln@U2HvaF}$((n~j$x_p1(-orGNYG`D z8y{%&A`AbxaV}W5i8ICE#a(a5t#O`th}b&ekJ=i>ZC}EZ?=o(Ai(>{`egjC^?4Z2- ze2{jdQqxWrqwxycy=+PZ-%YH8-lB2N%-T1J2HvLd3eK#l{>GfsLN1ty4|Ph*x|JlmVWfV zd?8KcP7OyCQStC0nuMJ4>T2;k#gKM)sb7~y1v~i;PyhPx&*3ClSsF>OW7Wj*J7w(GnwcB z`}u0W1S#835S`Id;T3cABz)}djk;boM_>yiwfCZm#>cMpjxlK(URAi&JTjqkUW&Lk z%><=jlU^DeOx16#l`NT&$;6+yxB6-~?%(*+U3I*Mg>#<3^ z(}+$F?JU{od?4ty{Y4$WPkLnb^yB61GY!+sDy1WTe?grr;h3=^C{)A4NYW?Xo3Re5=J2O;8Ekm&=X z@VMUGbfxf?Pis}?Rh3N&F$(q7*57QBK{hrQ%)_oq+~f%`WQwn}3rs9VCN1aJ&Zl{( zY}~ThsiiH3corq8f(**t-JdRDE~(v`wfO+QJq~6F9qBI0DHqg$?Aq7#dqJd=ZhJ;lfnJI(!R($RZ50EyI@F#W3u9a;F5|;619uUgtF5(GbxP>T|$vG2ya%}?(W=Wopmn=#!SZVB*Q(^w54DyX1oILvqck0^A(?p z3&P#Upmwfv?M&yzuujSa1}oDZG85nRvqe7dwP2g*H}^PQeH;ncrmbhUMDk3#XaQlu z_Qh66v&!#xxKnLTyKw>y^^#EOAD{E`a&imRz_`BYyPzwfBfaaT zGNmu{_>hzAfb;lN(UybGp2923dwRx8#^@-y^?uGFZzneyU@j7KuR8nWi$+t{w;#1> z+nN!^AEeI(&iGq^iAAAe(~(TkPg#sv`d^gcz@<`w*%%`V{|LU&(5=9FyxSKfy7 zA-R1UOU%{3M8(6dS-;n8R76GDvIc1$<1EJ@r@zeE1=QT$T;6pnHm)jsz!(~?>a4t( z#S*$8MOVblOkfwop|U}DMw!$)87rbS zpqRzsEmF^LnaKcma^2$Vh?2F94MDf|Cf&_-Ex{MV)v=O$!yikTH|wv}O$=WcGV*jQ zFsedyxFjwLmvz!^EO>3_1$g@$rc3fJE-v^oP`tPE>EV`&j&wwZ_?_z2tVb`KvqX2a zG&j9AY@@T>ytK^B%%s;kz;1fPkKfS75n;adymL`_7)J>3K$7PA@x(gT8Z7vSi&wldQj8W->YBSQRbwCKC zEOlG1GSJmrb&&Ts(s%x2*rCs!w^h=Sy8@q6T}Mu}K(t0!jcYg-!FrHUoJLaUh|$(K zMIH~C032^`c)x$)e&>1-*AityEN@DSZ5KJ+O_ZpF5ujjk(fg$*(=Geg_S~9w$?NPZ zI2V1{ZMT(vq^#@|2vrlbC4IgFyEpBD>d7{>x!{$w!&j!EXbDle@RZa48RXja%5kj0 zJxkN3FV33o+o2wWz&R!vN6)8p#o@Iwvn%-uBX|pS;)#owE}>@52n2^p4L$5!rgdH@ zw^@l^v{^uyzZfxpXzBhM-CvSVYRQSe%bUg5Al4qXKJHq1U;|%j@~g692#+r4bK;0% zW)37$tBOi`YK)Tk=D?LRpr~96HVO%=hoAA% z>}sIq&v3Rxw7gkahZ$ZhbCkQNA?I{YSmd%h^tsr_OFB*E?Yz^oI!UE|db3dx4) zT&rT8cCTz%$(yk*fMc2Hy;yD48j(z~zqWAC)7_Qp?QSy&DP6cPv$A1D;Xx%$4ez1L zt;I{z>AP42fk2ae%`&N7xGZxcpcI^!Wp?IJXxzFLmV_%c>fpDr_Ss>CK=np6lpeb9 zQQfPuZf_iR4JlK2J8`fwo!e=FrD|MA0EfuR${Mb71lwVJUzk{0;kp9a2?EWn+Vss| zO&Cn~1YnWGxr0yBBwRWyxY!kEf%51^wvYl3;qOA_tjVuR>8}q#YvYG6(D;S@2|A3O zey=&uK*dNsPCv0(4JR`K>DYhjAt8ptd$%9`N*`%buAlmsS0nHK-+b_i4TAZv))Vxs z*OK?z_uXSZN{nwo{SGUGIm8t-PK36`wJ*Ubk z)Y&=W_7K9GCZT7g1D|UZwg@W(!S8gRq4~0to0B2@xSgb+-2BIg8|5}Pk+FGXb{ImL zp55>BdY4zTV!fodV=c@ov%^RWjQMmkcwY|ovhN3vIQY`C#+B1wwo9hd@)py!)8)3G z4tytso@C??iW?n;xFPl(v1&sWnLvdFLyEtgc|`JR`Z-zRyf$a;;1FhysX`gKk0q^1 z?$TciiC|Z3DjKgd8)%Ivfl*%3;V)gfl!-HF$ns7X!h|i2!G1b@yvV4eY@-Y@x_awY zv!-Ff_#KJLi(L36a+)cK{#XyH6h^uD>7&BOr{*!Mt`eKId)rT(m)t5@|I&?wvGL#G z4=ybYy3NhoL9VmV+jO(}7`+u7bmk5^`ct+=+moD4!bsBo)EUxhx;ClYoNF zzrI_>Fx?Uws>JHeXN;-k_orjIT7?yrL#&O%+wRi4Ci zmXIktb}wd-FgiNQq^~z((m*1SwgV_T-(72m-N)Q?r1zHurYDuyLNT~*jpVwWysg>c#TU_6j74o9eoDUTgJiG85S|~(PLyMYNS7>4#L_tdn)o*mGyX>0ybNOrH!)v(Rk0EuULBWwW zmQglec+$$#U>`Twm@+N)LtY=D`B5LaH#OLrtJ6|RVvn#9KiBD9g{xDhp-JdKzdqrl z{}!I;@pDo^kTMsa{<8IhaI4RJgp$G5t$qY&`Ykry^4kt|JJC!}Bsf?acFIn&KH3uS zS}%!(0iM8m^0kLsf7ZI2RV2=KBD#>`6mMJp$xz@FXloh67=FiiYN&|?aQfnz>UOz&)py}KL%2bzcja8&k-zR9_{(Wd zbpZOAf1rG>)`Ph1BL)QV(_OudC(U-_tkPCCVoC)zadi?sNgs}NdDgJ4J-K}8Sios< znl7_7e>=64Pmd^4!5>^n5c!zt%*>S%UWOz#jjuM$FF$V9eYs6X1IXsUwRYJa^MBer zlkeE>4&Zb&esmXcb%#!ghKA+*Zvg2ZP#4F4JoZ09sNaZIt}vDs_zrNS5YN^-&2zJP zKgY&53}2X+VE^BH<|O!tniv{!rw$#4q)f$(e$t2&7rcx{ijcIQJ~T2ik}mO4up2Aq zw%Q4l-5Tj`n!2SjRl{g(#~&}UmKQ7L?trg|lnhkmWH?FB5|pWNCs?GozAu1y`EWF= z8nGj^${#$}=X>e4jJ!L)uQZiflsN4B#|rM3R$C6Dh0D>}6A>k5E#+rGs4!OOlf>xf zF5j9NQ9xbRTX?tZ*6}|MzT{UHakuOY|Gl~5B-jmyIH|3S{l)-Vm17CRvj1`Qc|b{xjmbRP>UC94q52$zYEeU zHbTl4C5e<7C04?21Ky!5doSrwN?s4ZCq3GBuvcJ#$# z3NZ#%j^X|-W^Xzb&$6*Hi#e)WHH<~`Bk^Gv7vt<=%ifvwQy?klDaVTmOy-=M1A|Q; z+oJlyge_KQh8wc8`d7m^z@#B}LRh>*0<%;ZOJ#0uZlhOQ&+MyXCz@Wp;i7*9m@{yQ zN4-=lAM}EVOw1m<&k2y^Hh&ycE%wxSJU5p1}n&;dJoX#Z0Yas`L}YCVW6G z;mpiHSWvZU;p6RO35F|_Ih_J&XsUd!SK~<`=iblywBY{DhOl z<;8&2W4ekCwce?6cnc3kr75um6Qm%n`StAM@KY{()y{%A(#T4yS#bJhsF;2Sv37rx zn%xYSTBxYT-o3%Y)9zx7;){Ey@(U`LFE*$*w;8K(x+f`OCnU7mHrpY^PkdwrGO0wT z!KGm?KU40lOw#+NxPhM}9nV^GtdTfjQM|F3rM7_Yid87Pdr4bI$Ermw;Uf{!6A;-| z@!K~7;+XgMd{DW$SP*(l;F?!EigkF)vbZ9hOaFCy+1HVQ!7@!}#9>}dL&Np>{omfEY}~* z|0)Ue{~$rl{JZI3m8{Ib)lxU%tg*M9z15u68E?=bNA-MI*oq35{Z=$HmRza3+7vZj zl$=ki>^YT;+!0u53-`?!M;O{80B7Mr@y0Sxwku%jV6Nn^uXm~xkwHN@`T4Y#CcSn`xOj& z%yf*L73x2~w1CK@8^w+c6~RUFm4F%`($9%x;TXuMgSZ&ZXFO&zUe#H1gHt{B-2U#C zBY)jyT>f;RMThA)iB`~zWHD0NxpWt;8o~m~GK!Uetk2V7qGFv^ngPV#J;TKE$>0U+ zq;OTxVSOSWZs;-jquScqg3q{An3{jRIZ3~~8heT{JRG~bjhfn$-RxzOb1<~^EKLjv z+534??p(T3=nEanG#hz*yAiwF5bO3`+eS|%XQ-4_3}WYV)7!2z zC`6Y9<<%R(mrd_orEKv3?c+OnjVkwjuKy}uQk06~0HIaC(7sw*h%Soig&Wl@5FEo5 z!euXq^Z80sy~yCI!QA-8;27D6{;?LuoKka$|z zdRkOU!{bCwDI!;ju`l?M9(&uu9ECvi^4%x7d34PT|MFS!wqS7&C%chak%nhF2y!RP zX1u7dFf{ekCnMJWsh-rv!dI3+mVMQFuJqqi*88Iwou5WTeSYi{gSldg=OG4N+P_P} z+Cs0`fg;InB)-;Y!sWL0LS@ej$2t4IRUVIX=QBJP zE?p@u1Xmq{q6mbpPa%HNUhCFgN#+l6n=DeJgyMWmyew8oqLPny4;V zXNK!4l6yP-JF4VbW~(M$tJ@lwDTsetQEXN0+#l*}erQ+MXt~C&5;lt9M$MrD#D>I9pB=3!&AYILeB=?T%TvfO1FF`D7qY zWK`^Z4`rUNG;mPQF0r@W-DFwG)$oxLN!Z zhph5OjBE|xVEyW2HiXMBpN<_lccF6TA&%F?lIt=$nN20hLkP-57-)-{4*TQGRPu5| zl~JN?agAh>ZY5vh8PAsWj;T03P=Ak*j;9h(T=(DkT~A9s5wco8Oa<3`C@+6C?KbDz z`!(lpSO%A6CPFjCv9!0%v3rA6{WL$dhtEP^RC`Bzd*2r!O)xlF_IV}n zDZ9~nZcEi@P4$rshwA0BZ-0sLuhHkoIfmEM*T$E-9)&2EM|0*@44i;n2 zF^k#D+E9SJtpA6Qrm=C-iI~Js?&kPPf}m$#Q*{cA5-aR{-wsnwN zx9M&=_ep2-o7Ca_{l0Mm72dY<^wcS%K ztKY^`DKgg#jIEGzsC9N&8mr)acqXjuHx~dvme}E{oG0j*&Yh%VmEJ!nyMaOf(Is4# zNOfOK($;_ZY`;7gaG|}zx{Wq^Pl$rKeB;;tBL;q@F2Br zyKNrDsUGsjnq#Q%rAwMRI*b~8;PZfmU$@EKgj4?4cT(k~EfYuPEy z{Q<3=ErqINlCo5-yX&$v-^=yg=9DOxp^x*J3y#GmcI3iK2&(>uL7frf!NRl_FI&>^ z?;J_U2g-IPSv%dUilV~8O?lsKr~F6C>Wru#8;1RO9&%0aCWJ7-lCBsQvcF63s#~0s zb2~0R-fSbzEM3TZjXr0FUIFJK`+xC|w_xq-j(Y4!AhnVTIjp1<6sqv9xZ%qHq7!rg z?)(>~13NaoV3jP>Aa+;V`tp+TupQSrD@#tyKdK|jPdTKQqU;-& zPuLJ{zGWp7XSvhCyPCRV;oqiwFJ9hC|6I-Xu6h6VzuY?3B>)gx*FjMKL0q%~Hh^Gw_S)U+bl0SZr5t}7QLK%nRLQ@XVd1X6?;5*KVpkZUwWTwj z8lA!d*gVS{_uDoi@465X(3SbA=7y~U{0gXIYzV75u{HVI-{ z>VxThB2;5(!EO=oY&Dj4@97qrqxR&&iz@^RjYf>Q~ONP9!@^1>1;MS zT%N4_P+Ro8rgKNVr(k)h(B|?uGf-_(@!Nj6RgR(k9=X-@ygVLg*anc=rQPwCyNqY^ z{Dk+NXWMaaT*8-jEUmi?$*mR>s86yF;fi20N=3V=u=OGa%5G8idiaD}?bZW|xJdSH z4Nfwg?EHeX2)vv<=SmDn1|Q*n3s2~u5XJe&iksYDCt{HmOQW_$VO-Jt!Bk{7WFe+m zq|B1kv3z!6-Zz9zOw`zL=ZSQwhcl}IgsgWL=F8_f)ke*!1l?9=s?EN>-p=+We*Zmk zAc|ErmjO+qQF>0Q;gsCAqX!Qj6zDf_?$d5I4RA+IFH0>y>HzE2bs-bhUxh8B{v8k2-%1aMt{Gq* z#wTi_-onD78JOSW@%7ooBI1iW9;=j5dcO;VU6Y7J3{oXdm3#Ir@!juh0!?ZzxGW2j z64})i81i20Mh%{ACxW_G4cX}wgbEdT56n*TmGs3g&YbM*FawZgO&LODHRbC`v&MX8 z%=hndUK+s6_S11*(=Od^tiTCr6?k7}h8lg*z-lpziL!bwm3Y|WE14u+t;c*Zd)r;^l<|G>H-A_D z_WSIVQL5}=?HwJ{TXN(Q*ZrB*SsOSxLXKsex+bG1tn3$lO#_$=RoM+#KDWw4x*55!?)Wx>_pKH9=Z=h%D%d#suvs9BVHa9nqY)~N^PX1z`A(L49d^e0` zC9H0_-G#TCjhdD>=V-F01CBrOrYWi`(WYj%w+g^t7>T|(N0du9@*J}$+4A&(NgOPK zEGd;fi_#ml{^oX&xYzn{dDh>0xkv2*IoNOm?&44x|KS7@Jb|w#>YrJa0oPp`1*$?Yt4lu|b=(pjV z4kl~r{hbS<$N!HK z9v(Ha^LEeVKd6)c#E_-C(X}sIJU#6XN7^N;@csLD_yL9USMuQp2|;HVOgQhpc0I(j z{Xm)JWr=e8Jtx%{GKkxo6v@o#dGEHT#oZ0teR|FWBO)ok_3X8)nhEC13M03o_F_FclXScAeWE+r zIRrs*^d37*ApFYoJU3_;YJCYovJ#Yc0P*oQw`|e_5i3)y2I)?C4Xz6_jo4+IFISH- zv0RH_@BM76^Hepq$D-k(Gtzh5@kU~;lf2EkfSf49&q>nU@Swtu4Vd`t%(Op1SE~Sm z&)iUD%YZV&bYxppdcl$yI0|2sbcvQWw8VG1W%#p=i@6ZoxYo;iH_MPw;g&^&jotf* za9@!V4p70XCuxKEiTic8dF}-IPex7se4pD3+wzyKkv&wJRBoiJx}nFc+QKFxEiDIT z;aLne`|^dXsi_(5z$P<#Zr5x7v`oK6Ec`h9WRfQ*P~(1CZTc+4oxeNMebZ&z>EZ^F zjj>^?Au*{~!bPv1s6h-`Ofw5~upIB65`dLU8pujJkY|*p3LAs;@kPK|th|W{4r6nH z4){z@0GvO^O)+|yx6dNWc?vE$re!%TEvm?^l2?E~$QSjXgJWkouU<+rez9Wp+t(47 zn3j+#!>f$pEX)r|i`|JMQU1|x-r-Pf-T=c`|AZKAjSdI;K&xa}D(01?Mi!iZv`&g= zlMs{@xhmYM`f<59uw`kNzr9j$H}m}iZH8YJ0MOYfAo(*1t!2&2{m^};^KrbW!#oY( zAy`L8$2{~znweN?W#K?>o0UMXog+u}HSkAzd(6dV#80nmlmJ`X#X3S02c&8(RF>D& zU{*flBpaJYJ3BGK`W><&Rh)=g4o_|7j%At4x>@&TQL?OJgc>nc40O@)r`=%BK!Q<_ zepMY0F|6xb6Td-~g0r);;WMMe6Y$~!p!Rbo22Ud0+*PlD69-3-ZuWbtBb4`T-doL? zF{+_9TAZj++Tx_m3Ju{MF4(Avrhr2O% z2tN%M=G*H8Y*_3^M*U)77r+L!xEX(f=gsKi;vgHxE4_tcFYmlieb8a1g0Xr!$3vu* zf-I>HwY^7&)@`-iBJMZ}`p#_#z8v`Jnp->njY-DB%WkYppwOjlMp;wy*N?*+{IB`avkLAB-Rb@yeeG=Kr%i3R3GU4*sqYy667`$3+%khV=&8Ob>n@IamM*m%7-c<` z6!-vvmLKP+NBVXtMkCyNxn5>meXtF0SnFds7Z_<{)u9-MmN;5g#nF%Ms>u)?l!-tK zN)>1nYv)`o1%Dt#FPLL|^j-oqSRJhfI#%JkMneP)V~iT&CJ*UTb{n~t&6k^QdF&#? z^0u|%UD@4td4-`dj4-Z3DeImT;~K~v0VJN7mW%aUdZxLKt+q(2z*ml2M# zNyZX6y)YyzITiVs?Mf`Q-!FqDm-QoCnrzdzBS$oWewf9qMZ`mm(9lj)@p;W(WImwU z5H6-DT(tL{D=*&Z>&Q3z@#P5MO?h6tu+7j^>JxMq%zzO_XLmCnO<#%^=-how!WSxd@- ztV_pX^2po8x5FFrqZP9lU!xyJipZ>W;7kX#by@&SJr>cGi88VDdX=OqfHD0(s_VYB z;XLv_vt)Nh$(&UOuw8rR=amJvX<3y#{!n&%C5DL!JA zcDimvf90jg(s;e(3A&mawEU>?HTd*UM+P{@9Q%&Zcz8LszX5XRe^TGR)TE`R3I;`e zwMJEWt4xp1YJ#6!V>I;C;;1pzir>r4sTN-x;#0$~XSKAnc+ABh7fUC&-@&ufs;%Al zjGUo9Q)X=8)}X0UPmywVA0$Rea}G>Sz<+r9c~m-s+Qzo6#rq^H}}+vEoCkE*X1bVGth!KFuUT*)K94>V;P_6gyF*K|aGbV51%=SW&44)V# zBA1IXrJR*_c6<$edi|Ird_3%Y?QOkO!K2zxvjMf(OIpzr%oa+%Vu(LHa0+mH$*`I?t7$ST+e66nNVxu{dA{#@ zRY@K(?wM0u9B84hbX*%?c3I^O#eh9;C0cHl+Qc;VjMq(n=OXiqQVQ;ji!%mi3}3htA!XU7f#oU-x3Ndi-sg%v-mdo7X!`$6^JYr}z+UTke=J zmXg)k@4dqV1KETeW-0b(*qv;f*ego(zX@1f?7%*dyVhR-LA`u3CaI=c9C)3BYWoH5@Q-Q$N;uOCb7XzA{R_NT?TZxx4moA~a37-2J$ z(T8*R_tccS6=z>yKA8wPe2S*r%$)P^^uM>w{J((lGWvYPQhE%9U9IaW4a7j$-l$x5 zF_&5b)0sK!)qh~tq7I`U%jygJB}4)4>P)rEGHEqGx(?P3;JxCgP z*;62l2PT1;O2G$uER@00-{ACMA@&?73w(J99S1)VUek_|Of+L~ANTbx0GjzmlyCvq zEr(bcsc5;4r&ZW)oa`=qkU*tTs82E+5qA&iyn|UA|C1_)dH)&Qu5S@ND%P?xR1Cj3 zRfpa6tt*{u^v_H+`&HCK$MrlNS-jH()0LEf!~sBo(=kM@oi|-<5E_)KtwY#XxGEz4 zU}@y({{)8Yxe;gm;>8OcpsbAc4+{h`;GCSC`SSXzFtxqCS0_zJ2XYs@x;DzpG}P>U zHv3_*>T+k~yF;vBgsdF4Y5dB909Hi+9gBJ+>LIn&BMW&pVSwU{#F_i9@KTrp!mlZV z!EVhVx>Y6*Bnf;pGFqS7n%?^y?yK-)J#Psy(Xdxjg-dfMP64uREAiG)%bsm;vomn9 z><$AuRJB{!YhOGwgrWjXI@OGH4pc4W`A2|o^Uh&bCEs*%&tSUi-9gJ^r6)~El3$}- zI(F-6m`pFgI7qLNh?3<6!5u^;IQ5S8fZoK#Pp6q88xLS`C((mVUWWx#3Vp@fd>UN- z5ry+G@1M_?c(?F&F=8p2q*fQ zW!`~0`IY(KW$<&END)0U_vfz;UV;eqSNcy}RQOnR>TbXV^ND5%Ni1G09rURWAR--)+fWZXInbH@QMeREG)_$4Xkf1UmdC zW0W6nN+!RDQhPiecv_dKT{%)O+-sM{s-c&wp7r^mS>oVWZi$T&d#t07xZmCdOUUFV z(3wH(62oP@UzpCkpLE6naEBahI^LNeqJv`Sh;FXkUq>|8 z0eW36nGH;SJa*R`!UtQ-b*S2RN!~}>AYp!Glbz*t>%>EwufeBTEb!?nX}Y}O=IgXLJx`bux1fJeHlWp$VdhS2b%#gF3(N6abeLf;^!_)e(1ukP|ZprA-;AyDVMhuS{v{px?VO zi)K*2EAvK@>77Jh>%n#_zcPT@c%~DsdR3IOA1x{(qNKM_a_;4CLn8e$q)uhjTwZ^o z872t_SZqZDnBXMX~)RwI}=g8+a;9-@ad>rS@Lx1 z$^O+(0);{E)*RKcU&(mP|0P{MA2Db~C2?hR=K);+z%2+nEDc*bbY*n6+erb|ZN!Wn zSosru6c-;C@h!GX>l{_>14KtU$ z3nR19HvtfQCPw*D?C}sP?8lO1yZzb3h6$cv`+ZTwre}B@fa*6Nnkj~>vz?DcM=MYM zL<1(Qr!8^6Bhqfi>D58RTd(~ES_T$Fr{jTLchx&t%+vqm4iu52c%RKk>i}5iRYlH4 zJU%@wEe%7}%$uI&*z#Ph{*45@6)GuibbBeAa+lVE`z+N}=sl2vt3w8^*d6eY5^Uq* z;?m03hmWVs&d&A@563!irSkzagK2u%oj_`TNB^0G`J;M@3{g2dltt7|w{C4U9ivW|$M`0y-jeD&^n_0Bte$qxeAOG#KxCF!X^D5t z(rV>&fV*oMLKZRs8;?{UkJJ6lYWj{}6DSJdiV+|ViabM<^IYyiig+)56aTID(6%+v zC?{cRcSJ^WRkeF=PW9>+PJ8t*8yhL0R|ZT~xF|{!9@u_o^B}m?G$3qs_V5%^Ra840 z;CyS#D`qQ(`mC&zZl7Y8Dx3VSGu<(g$<9x;(2)|Z(MqUy?KP?8;qtPJbb!-$QolOh zO#XU62Bnez`dHEU^6UFHs2w!m0J@afYdtvUt{-A*;u=24g(Z@nt`56scgFn}9Xss@ z&uANk)GsBEgJ1fO9=NzKxd1EFNqw;kB#83QwLA!3r{Po$@B8BL7S1jsb`YdeQh+>A z9Cx<$&VKFrr(vsOhYsiUvpC`j8hJs!<>3SF;T$KR8eC?&=nOb=Jk4c!D0jKMN%dDSMH zZdOZP_8pkzI)F_@r4gCq@p*Z9+uZ=i@4zB_w~kSCfVNFhKc0h_I_ono16lmoW|L^1 z$OQ6wy4O{QO)Lvt5222!y_yw(K|-t@NR*K}hV9#Usg-H$*eUn>M~`2){+9jy>!9+R zx3{40P2JouFY=#xj|@V_36&T~Rb?G!9M)a&%r<{~)WN=j_2R{gHJ2_uojFl6qki+q ztFgAdWTJrQH*+Br2&56KJh$d6(e=}O4vv-XUh_`EuI-Y;Ade5hOPUW%MOVEu&CShQ z{fER_W_Drg)5)8(nsX)2W~j$rUi$g+mL~UJ zp%Y~~>U}32Rc5yX8RjZB)yJw}Na?k)wYiNV8Se}oh3DbFxd7EUkI0)-!KGXK(0g+D zrre;@QDMcfSwysj#vWODEg?FNM^6v_#K?%SRR+24(vKmw0(6c>QbE;`{auxpFH5gU zcnvt$p1&po(2WxxSIh8wzZ;1<&`AKzW}r1+{81_oE5TfpLqr| zs55!cfd|-)aq?N?>4F1R4@N4X0m8!Ng>0%C8ZiPB-r?v(5f#YN*vK4l;uYFSF5g(U z_Nn4oX3HclW03LVj&=iDso?n@5Cct5?u`FPe&R6i?aTaPya4B$#+vC zH!n}9qs)6F661gvsV~YecHDrMmaaw*0ox$Xg`?QHxw-i}UPDEnR8&-~_ES6`oj!5) z1M}rOA444x-xrCJd18k1PD4D~^Z^nGN+I&$ix;DGm+(^AnJlfYt9p(Mordt@4t_Cy$Ss2P{kx#Eqn*0x zYhE<;+&qyIWtNXE75xE%S!*1iLE_yLM;lOWR-YhpgJ`7rh!DefwjMcfQQ}=q@_G!? zups#?4U2l!-8WH^6JB!pJ+3#obDO~Xs(RRXM`}c)JVS3Q0lGh=~*L`j#JudR`l7Bqy`~UpQe!A{9il$ z;3S6)xIEE$RWFla;Dy*s30&kCZg3sWPA9??lgoH$a!}mDuRwkMY$|i3gv}|sGxWx~b(J$<4or{ii z(AIjhls}yIEBLw=z|ey~&**CdSJagiAB=i-oYr$nWID6Fz;GE!?BH+gI!dFDXPd;` z7vnxuPa4T052DeP(6FA|eD(~%r1R*r_i(LGCF={+*ynLwiH@fpXJu!{r(_hjxAP#0 zr^?4-PVm9@*1(VMeWh6=^0tJCHg?@f5bHiGb%w^e(9z6XhR@~ZQtvOPLt_m-3u1mP z^E7|!Lm|mf-bfgjZe>x=pNc<+eZA7XwDr}0xyz1yB@x(jmr`!dVnW!T4L zV*jJxTh3^vXuqn`$Y=LdmE6ed{*Q;GX*zuThFH6asW<4iMg`=8(W0=YZ#&G%1bv7cxTWXBD$_le=#m20ZG$cL(=)U2WbElc_%7 z;J99N4j>!4dh8qNYajwV|Gu1bczGw3wy1!sJCpU-h5#BG_rn_vMps!yfj-m!_)LT0 zqUOjO;D-*6rb|>2&=uFId__C_`c0EQ|B^pS)B$TwWTHwUV6fB6y!ztXrEduU#X5y0 zqe=1zjUOZ(x4rwqcIM1??Y@8$rPe3C3_~Y}kAC=ZFzxdDF=y7xvjA?01J9;#JAGch zc|m}pR^TGThMQ2RqD$fvy03reE*Iv1lBK2X>ukq?3v(?=7pfm0gL@f{n|!);XIB5{ z^;hSqQ@7qXLTFx-S77&}GyU+F=Ad40aPiu_)h8`ku#vqYtopmxovefiC*cpC_V$H* z1w}VgM%w1dd+OS^c16DOzsQLJ2q*lMLBF}77q%I;PtG#DQ*Wd*Uv&Ot+JH#+FFo$p zqyVgaPwIxPos%0BniE2E4!4wwM(AtbV#^jv*Xo6OTNxGlB%3Ts{xKe~_5G=e*BV0A zk#n?$IA_9t}K z(F&~|=&rn4MM!Qw=+iT7PEpz{^kmlVnr!mvN12~KpmU>{>W{%i3;lM?-9(Ob(sj|9 zkFpR|Q);tXmRvaK8Wgdnvp9K{yCNx`NNr2@l)y*U68F8gNzv>dqi-#jgvqpDpt*3M z^8te$vp>v4#g4yEZQj^;X<%fZowwdolOepl>8Sl_{bop{gNpqu7D>MU^9gUy+~7d$ z^a++2It5Z;9#5NN_1#hVtcoR-<1&&Qg?{ zW8T0Wis_y12VC0=a|21{Rw@=1<%1rmhAkWy%hI3R;>TB6D}T5C;i+Si@N#ox}8f$ac7>gBnnR#VbECst& zWX-xOnQgVyBWfS_`SgLG=vaBBxcNUPGz%FT7#pA-&%>Ipoj_vZ?uZvCN< zpo}nYrHozY7iQ@`d6kM;gM;k@wUXQ=zB+F<;=^t=D;eAwpOZ`;{YfJE6?VKV#NI7Q zHI^PE4<}z^TcEQja=SKeV!yR?{gqhZmxga%V6ZLBPDMRc^}<`a2OimO3EL;$9b2%m z-{LJqNpW*O>3_B6bhCQA{a94tT2z0-)8~YtoA@2V#Z}e%T2!q+T_JrjqrE$?V|Xd6 zV@5_PSgM*jasFb%k)G>PeSI_Oo646B&$S^s%eqElBCDhl6`s}j7{;Pr7bd%@x|X$D zN=4dydtG@GSm;_^T%1Y)3ZLL8d8=>;`;*k7%XRGi8DQD{lGbaB47hR!@pqnmwUK`r zdA5wzD|G8ziyfIgb?$f%{)-*n ze{Zl>A8tDS5l>r5_eY$g4A|a&=+t27Q%5{>R=MpZ;*A}BB4~yaFSZX=3k}ID28lu1 z4W$aOA}u7Ns6r(~Malrl2xt1UuADU0|7^6Vs&BaYp5J4v+_zCiv%+<@$7&Ivum^06 zF)@d||N)R1;RR@`uG}zphuzJs4PD^kNOLQJl;FrhKSgkr{83>}7)} zFasSaI!(S0RqKv7b!>u7O>jhp8A59lJ#F8zSiaCkI^yqA!Jsh@HQ5-eqL#1l^jd-W zxY}nH22LNCFHq_h^2WPpmZVtR4yaUUyve7j)OheBc6_s|uZIVTAHk9DZit(Z+9IZU zVhS~@*}RK(nVUn?6x1%F-aueDYrm_G5<^*a^7|0uM^pja-M2f}iFT5P1d&?0dE!qeqsNpT}qWWb#e*(pa=`9oISC5O>F4H|Mkn*|nNs|5n_)}W z0u^OUH^1t6I?Bq`{{|voOlD6GrLNzX^bxn=1&?_DjSf@3?;66-X)lB=)H+3ks_iRF zsLdca>~fF!k5SThM^fGB5bY~;<*10J*WBX9s=;_LntS)}H6RdMj zI*tRIXXjY2qm`Z}=MN*`*XGj@NcT>y_m>&`O!O{azMT0v_d=zSPNYo!2i>{eRM8Y} zZj<}>FSz48V}iG7D)8v|ff9SIH%@I64OKu0Gq$~_&ix-j%<}{s%j$mW8P(qpJ86&@ znTbb@%y(ASf9v!q*n;GI3mfhg9xC;U=vj1ATQ7SS@`<{Do6x#?`SU}tt?$R`ez8%9 zb6oML!yIi3p2hBa5?hV90^S~jthN51C77X>VGzlRknSIhJKNY8JYd~JrN5v5xiT0B_DYjc*a;F7hnyXc>EH*9+y>>8!B z|K!JhS#STH-_yYc?wA`x)Zgps<_R99jSL;`rPBj&{>S}#YEr`pq{t}T;by45w#pIN zyd1*vduByshdsGcL)2>1azM%XYC~ab0VLaAtx?gS#e>FZgrbIAdr_- zkV4-F6Mjb=pc^~3#?F5^+zdkA9F*HG9oMTlmg19Kp2Y(B+bY;Ln@mV8mZnHAt2h8f zs@N1p`8v%!GP5T40JIkwNa!KV!)fBr*XAwmS|YVCv_g z0_jJi*EdvurT#JjnM=}0G$)yzzfd2bQ<$+Ey^o)xe>MzsRS1SoFkQxCv9lWiq{|wJ zg`_Cr^h`DJ_;KdW=cN^i&kiwy0KlYkQ2Gk`qsEUD+rt0je~h}~l-{@ZAb}|-B?KNt zgz$rG#6|Rb_*wvv0cFUi0hVt@SK5aBStffhRHrJEWn^wy6A9ORUHaZ1@tyCcci#>4 zroT>X8AIMW{NLeYaeLpA3x)gdA!b-uKL0mE9e7RC=27w=3AR7q_kQ(H^aJ2L^0%lJrw7!S7CuuXo9&o1#cqjIi ze-jIcoh~fBQv2s&=)KS*t=iW)Gsa<@BD#a$+u{-uMyi&lr_1By$hfXmHG~tTAkT4P zRIFjt_R`*FN9*UqfdM^;sz$W6L;LyYvw6{R8jmg= zoc_zV9i{5oKEpHvb)b$XrZ>xdC0YmQ;h&eJ&*&m2CnvFgCG<<;+QFx_vsaAvUcS@Z z4&Rv)2&Dx~T@0=7c(;3V?`Re;K@9`%6r6G&`15c(d`pZ${#nYxu+amv14OeM-{ND} zBfT<~a}LN3DUUSf614{Tf>Z zDCLQYNx6j9RCfr3=FU=CbfR=^gEImR|LO?`@89U7+oYexKFw(+dh}P_!R(phSKQG4=i0+Qsr+@Z zk%*m1(pY!5hAe^Fui}y9l8FFst|IKt_NR&LueoS=Qq|WZ5fh_=GtoaADkm9{kvkmd z&51t_Yc(DZ+Z}o(p@cieAo&SEl6>1tL85MUqm<7n85t6GjWhw#^VfwE^$e~?t8Vg^ z#(3)jRiy>Z%@c3KDnz1_Blb1e!Z)ruLL-*p-*T% zIat?!t`k5B$HN0IE2tZ%YiNl5SP0yXqcsP&<5!;Ge*Q>1_d}ulR&>`9CQo6(%G@+r|x%&Y0{S!WWVWsXcZpJO= zlMgvU0c`sXBc~shn?pV+a>0#`v?ZtG&!ozqjEMsaqoSeOMK5}Fa<;lIw9zTWJOo(Y ze|39kw#R9c!aXF`lmzkK4%(0hrq>@6|E1JS^zT~-(}<9HzfaG<~2OZ|WFEa0UtmjUGCpZ4Q405bj4 z{uk?f`yW*9z>Z)1TfZ0hxRB%lIP`b>zdoJlgMEt!R$OGizkdlhj~L~D`Ql`5%+VhjnS4J%K){E7K zFfIld+GUHZ)5dOzfqs7PGS#Jbi7J;p+u3J}p?Wv;bq30d;}VFnr@bCP^Z3{*C!j77 zU_68%PT+qIXlgYU3&7-gTmCVVw0@**Ag1S+qXjg>Ed%Kq~kM6 zqfd$7VkSgjOBvaaRG4OhHNB)J)2B*-l^t10DMm?{YFIkKUEEqt9@xQ1FIuwHuBD`f zj<2u1AEK3YBxc*yBL+lMp0qoT?Uj!BNQ*XW+B8#=n=O}kc#t|KJ>+{m8An}`$9}k= zR{{dH+#0z(%vI%vcE1zsgEju?$>(_GN6-9Pf=V16o$lUsGks!gN3M!iy-01E{?2zU(zFp=0-BFKFXAn0a0NDtT z=_urm`egC6HuJqjX0W05L~zlB$!bfaQ=ZHFiLI3vCPNdx)qcAU>zI<}6Fp~x_0cl+ z;mzw)a?*u63hO_Yh7t!lHw?+cIqoeAIW_|H5jQ2tq)(u%j%w@7;Gd8&x83bqo&)D@ zm)l(x?zW4!Q)|wH!M6=qW>x}k?yX1>!lBX@wK@X^f389z5ls%@nX3a|)=P3w z$shQ{#ew|S1X3CxZ60=q)TgAXXVdz`9pTW|B*AiP=om=`K;Jb6qR$ zduq-zUZMn4`Q@0D>M4cwicPqz4xR zm1e6DeR}S}_*7zIbXgUc;OpmMD?%2T5KXeVQsv~1&7B-jpbkHFnlW5QO zv1O{og#kPK@VfHw`li_!BKt|4X_-`6tbW#B(VO*y)cBvRKKoN)KNDX9^ZCi_wyyVY zWxE<5SLNql(Kqplla-A=SyEBm=zJHh-Dn22l@K_0IOQ&5o@aBd)io%wrlq0yE3YpcHmuPMDfh*a_opm zkK=nA;XFxBZhPcLg$N;J<{9AVvSxncP*O5+R-2cDZ8k3~p(5g;DlX21S)<#^y^kGi zk%6n#)Pj#1e=^U2{y$v+N~`pJ?%wTjuNz(iN!5yW4b83>JD(viSNt|L@u?bKwS*F< z3%9o5fzwFC3#4=RuVW=Py{c(Od>1mS)(c-)2Xw8H&vnoAnD?0WX-$JSUwyq8>Y>Jm zqz9Q4KPE}|Ota#3iN*MtTy%Ka-&_DuGAVaI^SVtFNdAac8a`n9eTK6~Um+J*jMFJv z)kpftmcQo{v%Lzxs-R!1p^44&y8~-unQlnN%MD7dR%9543AB1Uzr7c{OHjGE^(W=; z;BHI|j()EccqdUYX;vMKe8Qs^C+GZ{+s7Od-Blt{n(sf~_yJ$x>!3`Xh%1n&aNy}R zQ=V9ETmIv7{kFB1Q*zyn+|ne8?O7;-rR< zXsVJ%`{1Ye&4m>1VopGQ|ItrN?#8YAdZl{{xj`a-&L!ZlBqmUrYTx3Y#w;QCG(`zs zMGv4NN(=gD1yZK&9{5u;n|-wH4w$L=otmL-V#6(>(xh0bUt3(m&$PJM!Qlt>g@rdu z?0(a-doo@+CXZEJu;^J;+82sTl{A5wUr~o!TW0-ZyEG}%XH|t3Qx@l7P#AJpoPNJ4 z$av}HvAKp28Z#a@W{+^bc%9Y6JhF1)m2O0eArd)^?l%0_U- zU6n=*l9Gr2b@>*q{*Qe_laf8DQhoC>>|bfjgW*K}Ly73+}vAWFujCN&EEh{S-3zW!dyyedkY;J$A0etkRqs*CND4F9lB3(K_)sm zJ9fT>U>$V_9|9DTxN{cG;s7-|_R#J|-#VXrMv-w=qJ=p!k)2J@Bi?+M%`kkWM64p_ zqCM?*&tuMP+$NW{*_PQ6geNSns8GSbJN42IosswSHV)_+E0uaNvryn2mC8Ca zig}pGE`Ig>!~}7DL@N0HwQELc431WTfvq$`#2GFaIte=q_R?_>5b(4 zsw$IA>ve_doyv|Z*T8{4qkUV9Y&5Tm`4AQhIwB1PeB?rl1win}I+2T2Kpc>KNCeQ| z*)94;0l?DmUmc&ka*y1jK1knG{!6j|=&15DHo@MY*^vi61PKLwpbF{O;XP`@eBb)# z&xfskb&L5dgtr4Rqwt3FKpaVp9{F_50#KNfb{c}M&lhF=+P1ZAbnIHhy3EAdXC%X~lXQ~CPUQ%KvQbeE=D&{O=^UPN%KEhhP7A$h zlGo2{ajVVTVH{4GsQvfo0go^l21ZV%$T(hOXHgVOHi>+fp@R6dyuUKN-s#W+2{dk? zDr5{uk8Y0uV7L!u;f4}oHJ!9pQdSa&B-H8K2BT73WaME ziqhHJ>9w2f9L&29{aer%F#DO8JCqL%x>24ONZsL=|CEz+f5-&eyWXVk8#yyilWA*H z4-CBW`~32*n`76}F+hK~bxk?w_e&e;sxOo!aq+7$@dX9W^w!U}=wE*DI&Bcvn0A|o za-0S-)x?0|69#xga^&^G#U)&AX}U@%amP9`c{22ScA%~IRt@)%d3dsdxXpQD#J{1Y zaxxo9W}|>hY-a1o#^ojpDbD3>!W%2_eKoNwiQy)-jJynSk)IW z%DGYwYSIRPx(lY|P5mbo+y_dP0yf1L2T@Hyo14aUL05*qG^Z8Rf%Mp%Ngi=eDDg3PAX)x__B%ev;cO{!Tb`-2f2!^r+*0L;|K_rM`@6?a zf9n9$m79@*|A|=6|G$rWLr0wXfh>-+!?-NBiL50+ z+?@H!CDk(}tm6patktR_D%M6>>Jk-YAPGS}^<@QCA_+E)&t zA)yMsqC8gVTV$0uS(+pcuF(}h{CE}9a%@%TU;Nnf3Rp9O@rqEqf4~)UeJ2&NDA8x35{-HkjmBh4>Y4Z89;3KR6=Y3 z{+MJ^G`B<`%6E3w!jAQKh)N6~H5cHxG}9%~WBkA@`TGw5CCwrY{0|HwCF;Kn;?U^m zRY1Y=u~p$A9H1xK^D*bE&+ZQ0#KJ-Z5J5}i60>056}TPsAAq<`PFPRcIjKa-TR*JK zx>RVe{C5P3F$MhzO5&g(8vVNButfu%!Yv^N>l+(Ro4}~Fg#LCYr5U97Wi&U!VXZJ% zA=AjD;JJo*!cJdP((E?{lI#GaxOk|-(@rU9=0nh&Y1Vs27WVEqC#kzoC=^q3QTf0_ z_@^netaR18_3@<02UeBYpg=r4JcrR1^PR)QWFEzu@JORbH)L6fG)jZKM4nx!bciDW ztCA$Upy>Y1Z>-v-Vwn&s^j*0|XD&Vz-rbB3P_*Wk-)sq4Hw89LQddHfokt?q*|Xih zraSsPhZtP_{XYdQ5)t_iTN!j9+K&I>nY40sb#(!z{t{>2em+xB1@lRi;HI<) zo1pr|q_^TX$Ws3s3)V>t-hNiD6`81p*enCa&(+;6a-x^-~=|4dwzC*OdTERWWj5($lcy&}bGvXkk?CI}C=R^O3v zIcdbVlPNxvFz5QQ%RPxHEdv>9`f$HB$t=_^RwC;dm(WNiAi%tq2r(_IL047HA^;z5 ztCu^lL238vo$y&?Us_tod`+>m+l($JL$Lj#2|h${{0~p`Ph<}hwfy!kWncz|A6W$I zmKZuT_)As>T?#rM|JK~)owXm1#N~cc=1q2ampb>qNZ3=OZ;KPj{C8Zo)qXvWOM=wGvSnxoBtNw!hxrBb+IqT-!;?Baaq`_pKB$?|<$6aVRBLTdLk$tP~b4jOlbl6^Y$06e< z5u4o$`Z`_pl@_TC)5|F`j?=uJ-Cu#%&gvv+90Qm zb-)4NMUx8o#{ua%XZqLn7PpOzFy$sCdRd0Ef=by~)-SNg4jD)t{A-MzQv|;A*p!u) z#v=&<$pUF5Kt`x)t@RM(@ncyvsdN2VE{W&VV)mHmh1^B%i9EZUoo4o*gCMnWSiSH?@I8 z1qG;d<+&9G`Oxy(omd^G{xYi&Qbl>1V%rx}KqqY{#4fwv!$_Un^N!7ZYfo3D;BqS9 z5L4J3;rjaeGB-6ISX;a2PA|2a7C8a|5Rl6@(6)mY=NHIBpGn$Q%}^F));lW%<9Bv~ zeD48zXnP9>*Seh-X7CQD0aOb>_vV5z9zh#@g)r+yGQO^YPu<5%eWTd8J1m^VsjKQ- zAFU?x{-m+q-MEf5Qe(j|@HC=mM?0rz|9?bv88E*tiHN-Ez`BA5Qq^sv_%$Q}&FG|_ zj<<=;#D?|t(u%F!35RHn!S$_hVV(SPv?y-<%UYJ~0FQ82clUch&@Fq-qUhQ+1Fv6X zyM}?afFn!Gb3jsC(mYbm26OCLiXlp9MIhyF__J}jQ8sCSHeJWG4~Em7QWV@10r7Dy zVo1OnGxG;2vs-1{rR8XFlz_^W1{9)>UVgx>K3HLbYOPs2Sko)l_9@i^DRd<$&kH=G znu?0GdN2W5sPAuYpTk!t9jv7le(b3v+CKJRznK{r*m)4er^Z9w+<@JAdchewt`h(6 zKKxMy0zAW_r+cKd&z;qV*!-k2-z7hd7#~U}S4ZLG4&o2D4dwUWtbxRRQ{Toom8^vh zC2aEF#0!3?PKzHH|AA@;xg_ubk*hxAQzARU>aWy0h;e~08OXf%k`6L}WH7>3U~5F! zXXneYz)+HU_0G>JVV|zf(?Bp4`}x^n@@@eXEq1U*X*$AGmx0V$=}{i5>jC9-bx-9? zpSp6}*$H}~cdFc@mi^Y78=#ICICB=BFU|H-pBLn97%Vo$*|%t=@FRPFN&WxYoHTUZk@Nd-Kd8;M)f4x2@gQ1p=Vt*Wy0@+s?Qg{F z{3_Py0c^~RpwO%1W6-61y~1|OI*&<^a?^|U)sKawHI++9k2m{UUBNNcqF<$=!F$}XV#+kCN6lDFObx2x#d~w zw!)L5<`7}fu&OLGu^i{r1Hw5OFY)}bi1Sby0V_laY@tCSS4G)lx&W(lrn;{-*kcuJ zV;B#m_-y2U^eq6|}pY8Ucp}9+b zZ3ayNb3_^`Da(r84)CGHTlQ9_p^4;=HK{oltz5Ea!*CARUL<>HXtml>0xrn{?Iy5t zCo+chvRJ{*hyXQVl>w?--9O1POl%){J4{?n={l~f-qkOvvqvXdUaKUkVOe^t(!Hp; z4wjaZX^e1XP8IY4cCDd2L;!txCCkIA@K;H3n zr11~VXW+;x2V42A7SX3Ep1m*$e)+mkJDsooUWM%gDaUAU$%~KGdrNQimj3NgXyy(r zPHefDcP}@$R~p^5!D@mp>QhL9QAP^A;uquN&4piB&GVrG0M|j!*yH`U_M<6=N6{M` zKo2m#f>oQ$)JybTK)gWhfETp?)!h8_Iwt47$wG&m)5OxwdlZ@N`kg}$rfEpixF?x|!jvx%OPyT|st=_=;{Ei4=d6aQR=V%E-68YMGS&aKv$SXh-Zdz{$je{Jt}3!9TRH^ZM8xPrNN zyprnKuHZe%bo#k`X3CstLn+PQBa?C5!7n@Nc|_{dCJH)YFh^Ms$pRY1XKV{1X~PIE zyK&1%U+Ggy&r*&eURn`cf&cA&yRq{w_)Dw?AxK2{PO?79^ z0yPZ+b5s4hye|s}k$&Tp(fylU*5&1#u2S%3x39Trb2O;3h5OIJK4Jjb} z1nC%KA};9@ikAb`P3bbfoJ_> z*ZNdHp8Y8=Wpe%_u>M>CKAhiic*xe~$GX|69$XKX+GKIK=JI0g58kh94f0D#{&PQd zc$ZumO&DS?B)@ve$S|!)|D2OqTr1r&@Zx)nwM49JwiB&$_;tl?=wv|KZo3MATk>RU!6e?AUer(ApFX}^B> zLd1}NmJV2 z7o(o3N#M^SKiu|{eYsL`czSDY!=ibRm`q$8ad>L4r=q^{YSwn|C*DEK1djfG{?Ly| z0E#&}^yKcqkwIegLO^eqdm|0gJssu6=G7E+XQ0%-!t8LW?(Ol1bXroyaUL6=rRo<= z)^atNs)ZuvY*= znq-i*4CH!`gtFh%eA(egs)C`Zp9WYbAalvyzN43r7#weKlgsUzAew1S`&qZAUrFA@ zFV^%LVg(tM*S^+FoX`q0AO{a8bTh3fEdXKZ%^a?B4DqfVcXMAe?zL!L{~?80L06^K z$)l&1ewBBiDqImROKY@DJAFGH1nRCMeD9>6t-PAN?fLG>zNuC!Pr`ipUZLoI#8j+bkW?FV4;`|=n&mbn6z-J?W7P#kpK79nAsoPfrD~P!w8VX zv=|E4pqB8QK-r-P3X}Y(0u)X?+Y^*Lt-KJt!xdgAl9xPI_&8rr=WBYVb!jI`1 zzdvrJSUG5Mjh>~ikQ{_ObVET0J19_;8Zv3*!7K|)+t=wz^S0g_+TtPYDl5%f_S6cW z9$yqXuhyZ12xdIZbuiY8K%lvK(s`+CUqhc5BWSm-%=P|U3b>}WHD`cyejRK^9y(Fe za@?I?KtA;twzhR@n_ddoxZ>rr&C1PRh80)!ie5liAG+RL__VjyRAnS{^8N;E1+SKZ zTi8gQP*KMN*&}t_H#c9k2&DDn3Cf*3P-Q4l!2tB?R*u|_#dq`gh{v!3pSxmvXoVo( zo<@olZ`N)74YDDa3+$23NO?kAP4UDwpY8iufL0rV@z#&2$YkjF!RIEe!APYGdU&B)J417W@X}Qep$#mDHDbn-c_$w^?MGQ zT@_W!f*e6-z6lK++e*~dW_YBvR-Jyby2v-`4t#apLLL)qk*k(fBLelyVf{4WcIos7 zaUD(0SFJ$R)J<76k)RMvRJPh@#=-BIA@b)XPCy24l;)ordGa;gSf1x;Q=eld z>R6w&6y$vH5Mgy~98A7nSL>m`y6Hw2BWi149op?Oiohbd#V7oR20tTnhQn@aU6*Nl z7ghCQr#^GV_rlPd>L`oynme0$Nk|y-f&8sB=%nTNP5zZT9FWU}=CZ`o*|Vuaw$v#nY@8-H)gc*pa$*Lail5V*1CrJ7LupfsIAjY zq7S5HcH|!0TR0W4sqE1mz1o;dhlD(x>ZU&NDfKpX$(v_`a;?n;VR$ZK?gmVXGQ1HxLNL8&)wq0Eq zZ`k8YnNn=TsSm1W`i2GJcGCpTPT9iO*oJP3`Zu&O#$IglXd`pe+-b~hmpR@}N?}-& z7f;HP8creNu{R|IK@o>OSptM8TP$gDv~y4@0$ktHpyQM;>sma|=XoXDYRBjcd1QcW zcBl~vZIlAcz691)Sb!(WjYr@r@$|F544i(WoPtP zN7snwAi=xFU)Q>Ug`5A$lv_^DnIv;|I0wViy4&hlY!^5&&~Zl)vomXhl+T) z`A+?aiYb1(&wj13N-{%uKt-y4Pz7suCl{!+Dc(7L=H#%i&Lu9+am3Z(cfps`1W}RC zsAnO{KsY_=SB)tl=LF~lVS}hE_G>lEBCN{VoS0!=L+IGj0O~#yr)<`ClRZ{|BQ}#U zXugM9fR7Bcmp}he?C8#o_Kt?@cqE%%QCOX;&J|bBLJ??7;f2CnNGx)mgH`v%X-NAO zlzDKMJ5dW|euwiaP5{-`{cOCx1F4jy!ih8(dP>k>oBVNi&2lm_i^nU+B|MXGi?x`` zAR7!6AjU*fllqMR<^s&vUwwz_p>^zyXeB6_EBNKi)UeCx7KNTK@I@@k z?;3v?pJ)p>vn9@P{NcQH?y|B0U)WUYWhm<{>pAxg%n8;z= zdddl#r%t>ldNC^QjUxH?D@U!w?tcM_-xd+^XCRuU)_w3g4{CwJYHZY_>_fLg7a=^k z5>>v5@tJ+&Pp+hIl+I;5JjBXcf5#V%3qrWqW7C5N-x_?^ugm-N!C&~LBQ~?f-|ELk zxW9JLUceS_(H%?w1_Y+uT+JEAdwcwiu?BC6k3}7o|HW#b;4ruAoz!3nJU&Zeg8v6+ z&SFC!?Fl9ucIh2kIJLWG5zRgvbK!i3{xwW+xUJqfBP%m($-D%s)ML?AS4Ms|Ioc(uv+qpd;r#vTd4{=d$IRTrn8N$mBBw~*0d7zwEj+HS z*H35*)S?qw!5j&j1l>5-*I?AstNb3^+>d;*uu$o3oE&I1Ph_J_!8o4Vv!9w}~>LA7M-0&%ad*)VjX7mzv z_8m4j7aTnVJ|%eKehx;W7F=kpAPB*I4JMEA{nCvSBL&}BIASd(L;ZHUZnx2tUY>6! z_3_P?KpZRAZY~%fP)30nL#;8_I#s1a+^QWzo!E8ADVYIg&MNf{`jsJjji&urDEkqP z4?smvC^EOgY}iQ=Tx576d0%yTQvSs;wYh%F4tlvS>NB_~V=j~*ZM7w5!DCCD)(Y(D zmJ!4`Y1g2o*ol%~Z3)D5ku)t)J^75TH&@@01h%3`!5Z~FR#wz01|@*mhEtXkI+gwH%*J8oD+-;5$cnq!C24uoCBq2w)+;QXuj$+g>vzvD)-0xb zOvCA(i+Ix3%0QNQ9Nc&Y`ueOTJ;W%heMklMt;PUO%Oi4BoLJEspoU$Gll5HC8Xy>z zGs1V=zj}jwe%{TC^C)uCTNHx)RBZX=Ive=0S?-H6OS75z)d%m2qwvKFlXh%z6_4SP z0q~F!UrInk3v~U7&{mymKR(rYEfbpr({Sn!otg`^qn#XgDt`sRQD;|V8txZeKjm6kcHa;U(4~sHj#j`bEPo z3QIet!CKvzKdfJvP((Vufo_GQ+>cI!&il+fZ{ICxds|`E5pW%DH1ay1y`(WxT){QQ zu*X*hNnuv0gP@0C;CNpXHzaxIg8L+TK9DurO_)g{)RhsdISZOB#LuS3+@BP4>}Yu0 z;dEnng(QgX%5NvZvY;Li z>~O7?#zy6`w6DS9CWbusd)WjFNbrF&fL%gQP*M`*@pdT$WQ2El{$LJ6?49awFC@Wo zKfO^h&)D)A^yfa6|0{kE+SPT_zMwq~90{9wSBgkTZH&=fRfB@ibUa5I;k_qi2RR$z zHBfw)u>rmDh9wXGq8z8@`C(fZ(=m1Sp=yuQZYiki~p4u>zQ1oBTLySm_L?*)*-J@wp5$RIztN8cTJEj4;1oi8on(C zli2l%(qZU(G!r5mHR6LtHD-1T3dwC8o+;~^S3yzrlJoVCRS4F1-K!6yjVtCG zjf%pI)jA;DBEZbNR!55}@wmjtlfE|)>zN8i-&;rSQg*u9qAGkFSEWu8r=GMd%42*N z!n#*)lFoeq3+mnm3W+tdB` zdtTUO2LzV)42q7wYa$^oDscvK>XE~Ht_R~k7Rg#fnKq>EHD(m#MDCHBAc1$4pXfbK zN20FP>_Zk3&AD8{T<^I+7B!0@e&%{N1{(v9KbR^ww5fYorS9aYpqGFp@Z9p}_h0@h zB=~`|PG~JH{VMG!_vrBwbD?Ocf8ZM@5pMZlgVBVZ- zoxEj-OR=wazwWXrt{y8-@GUL7)y!FEr7+cYd}3?6U9V_}w2QP4i$o6c9!7B-Ei(C* zM!f2JuR}f3?oq-1icFvhnAhql-#J-U2^+~GHyOUHq@BUn%4!NMO|jlQnBi$%&-!(~ zn(mR;o=8>vH+3Tjdq&7j_`<@kGKC~K3g+g$cL?j%eynI7Z+x~{%Hjz3@lJWncwr;j zi}%E0pr)rf3Icw235dnv3WVv3IV9;s?p7xR6ySJfs zkMtpy9T8v_nRVbp=%!-Y!Ijn>noTLN!l|doKMd&U%xt zkVQ0BQ7ar9G#ZRE}pM^g)**Tl7eMERI7l5jA%ZcyR6n>yZrDrV$gjWz{7ertH&}5 zIbI0ljceW>DB#h=@`1*ZaZ|K}3SFSa9|c}okOz@+V0w*xd(hukurZy6sq#?WoIpdy zbkP0}-Wk5J-5S;FmwuzHt~c&U;%Lv^l7CV!Soe8PnSFTb+!Hht!ZR6}o1rc%VXe`9 zgVk|74VQP)H`xe#4_(p(NuK+1hOC%+YOdx4h?xymp?96L{^>*K!#@Ltu!qsuR{N`< zm#jqr2^u`Nx80K4ldqw|FqNy+XBOu1To1lh8=g3yWPRiqstqU9L9%*r0(CvqGRgk9 z{M1ll7idwYal2SvVIO{I1eZ8vb_#)ADU`Ui!h35sYLL(Ti#K z`OPcL3bahe4|#|BA(p()daU(6S(HyO3_??9PJ{Yj`$D zd@lv+(ELDI+QZ#VxW}q;ysAHPB)~T&59lq(mWAN18jOs})bLi3wyc1gO zVOq4Ux47v&o@dNke1!K=w+HKrtYuLGUmK4NeaPJ@pKAoDOg;g%{MhO~YRAf)aOCJm zrJN3}Y{+3*(xRLtW9k%U9sVIOtM-<6aro0bpK&p4;h~pU^AuIfkYNXF9Uku?LTh25 zY4i;e^C5rF-Z74o_MX_g*N~$_$9=YCH&dUe55kCGQ`O=QVf1(0klQ z_e|?XX4Q;SvMcAptW)bydqyjZxr>7kLBF&`3KP#yJhLL`SepCfiG&eHFhw(BPHaU2 zfp4{)Q!a0L5Z?OBq#PRzD}{NM;aSxHT%w*hy`YYJSecnu+iT;Hps_>EMw6}$Jdc+` zEh+^Uv}b2Vu}$aSQX?p5-5#=BEDvikv>Gf71oilo^2_H_3Z1?^d`I$Y$fSL4a2ful zYPXphD#Hio8#irp)%=DkQ7P&w~}kf7cTN%D1< z1+-;C%q#Az3^=9vcK*IPcPM(MX+@}LHU6IPujjesW9A{l?pZAy^0$ti!383E!z*4lJ5bWX*F5@?0_}qZQ(t3sT^~{f zk%!ImDW5}I*e*D!)l~hmgq>5e9I<7yfXP&_TPtiuhMQ@-pVF_3RM++|z5c?2)O{Qo zgY6I~z5cN(=xG`KI;qi;+4Dwz3t63oOI>-QViWUZ^UK4I7OTZ0wsmO%pxPm`c?^8v z`-hLXf|}1g0hw%}HIGaL+dMuz>sy?QKAWGVF3=cIL9{%wq_k*Qha!Gi+zaR?*`%Or zE-&>sF&f-SGFA5T$-Y(FZ&x$>IO^Cb#T>$9R}BBgHeZ~EAn)n*^R+GT#%}<%3q@uQng?85qGYFl8g<`OaeRcSS|QsTS_mhAit>+ zI&MQ9suo%AnWsUn-7^9yScte)mEo;$>*Cc0q&$ixegl=cK~ci&;e*TDpOKaJbHbAp z`)NjV0>7LFa_H@}3RhpwLIvx+&4BA$X%x_@CClr+C(bISS>MAKBO|nCMGNNNd##ra zrMa<&jBa-&70RT)_Je-pGHSRzZ!dmQT6{C(MU#PWtXH{MV=$~`tG_xg&<-J{)UZnD zd<+(w)P_$sgm(OnQJ};wixecRq#3bzUe6;8b*aiWPEzM4yZlGoz3Tl|4WLef{U44u zvT7(jtSIIiyEkY7))>LRmm> z;Y+onUG&c7&{FZ=+rsV7&;wmIDSHbcBUMkbcXK-)D6(ocLk5KVs#`RGA`sq;HC5uA z^bi>(kH);-jAXZc^of?l3}si&`pCHzh+2iJq)A96a-}M@XH4)aaxG3#ducK$ z6{@N{OgT+MJ1@X!4ye0^PAK_dZxb{&xU_{3Kv|-~kt$WsJ zaSMiaS6Qg^J^Sl~A-2pgfUqplS=#&2qaQC1ae0$0nYfr7?HpG;G(UM{&+nEN&%vmOHH3cfuE69zNl9Xb z7Hn&WDrtOBw~B(DaNzcTA#^>YpDiV&lZjkN+QJEZ6TTpyBU2rII^Y>qq9VXh+{KwM z&-0X}>K3KMv(_r&;^djO3BT_Due+}diz?jrl`d)N4(XI`P*NHcL|_2vlpZ=2q+4p} zMg*ioN@RecySo`mV2BywjQj3=&pG>?5BKx^GHaf-p66Zvjx0)WTH5BSWy(c`cxSia% z6v>xPc$K!j%xb~&`R&g_N%~&uFTIj#e})ybP)K7JOtgLtF-v+}u5G*j9R4CudbS`i zs=;w-Vf|#ZfTIVC5=-GaSOF*EoF4Z3LYG}vUkrMIPT?-!-mO1Eo5 z+nvvS=DCftYo&E+!idQurEUd)Kr^-^zhP3LdmW3#DY2fG0M6lPo|06}Rc2vXsSP<~ z%qP_F0@oPg>Q4(+THptVkN8!~qV4lj4up66#XKn#(0Vyi#q=!zO-EMDCoOr(B>Mv? zy7~5@P*s@)t(xxa8?ii|g(Qzx!N5=c;%>~;;9rc4;kw{TOgIME_Z=M>_{zWXtH_W* zF3fJn|8?1~D8pFxC3Y==j~gzpO)Qav2_*;)o>@%6vg(XPVYg=^$L@ zZ~2cufMHYbr8LILU7s$xOSjXNiRNTU_VFFYFbK`}p$Ep?63U5lqMKs+tuFb)A%$)3 zZ`o6ISK6z6^Kh|BfvqYtK0Sop4_-45Bwk$tyH7yM?lq@3TH=DRy&}}x&?!PW-8o4) z#`IQD<^aJnYg%*Kj^>XVFj-ZrRKW54-Df1y|9D zPbn_Q{Hy^yohhM2}zGPJ2C2mX9P9w)&O0!?;I=b2nzZ*bNvJbKC z0gu+pn_yNQUF6s3msV61 zW4AmyM5&nzHQi07b}D#oFl@Ftlc|n_crqzps2(kB5VpMOGXV)=)RWREj;7%d`Lb`1 z_X;JK3QsJEuOX2Sb%!a7PHrB%(?Ci-hbQDioTkQfIcuQb7E%If9v5gBM91XC0_G`R zLv`veRVEcIkYN0}Xge4{fxzHnqwlNjOq&%N__1pWqZ+XkT~c%%;%mOSwWGs>fz6-1 zT{()Bu|LzF6M=8bCn0erm8lxd`pc}9J^WQ$g2NRWK+|4vwK5e?t93+pVc~=r#aHEo z?T9M$w3zEcOrcM1ZDw?vZ%Q#aTj>{l-rE_Cc=DhT~^o-?(YEVW8U!39NK6mohJGW*J=3#e;O(<8y~ zTnBCEgO=ixkTrx_tPu9a7D8-Ty4x;}!W#4&=lmSi9XU+^ zrsajURzlOLmE zox?_hxQ=cjKmq=j#^)W4wnKNO6I0lZeA2mj1%3^46Cx<{V=2 zhIQRwALYhRkY0mM`m1Nhwp~8^gV|@&pBCZ2H3bavRcs~B*zocRCuZx{x>VbMvL9fK zINKMwA&k(52^3jZh^1`A5vx&5?TKvL?R0nkY&p=ntp~m<(hqeKUntu^#JIMYAAZ~$s3@PsreURq9Kt8&bVJL423F+59*=6iqnxCvZ(;CI#=37c4rtvxB-Np|Qwu*|XBS7Prkhi0jJ6s;Tf*+gw_% z#wR`b?Nnk!TymVM&+)iogYTrLjDW)pRVR@twe73DJy*|k8j32nT~0|##m#E&n|2cv z>=W!&0mhx}Y%PDx1F`*PlLHwPIF@pwz&Rn&FwtxeY7X;&f{0Avk2&-nrTOt}>#YSh zKMpQeRmQlQbb=@0mL~n&-QxW%m+JSCQ`IdLJXP@p+TROC$LH2Rnbws_dqR})wMYY; zZzji;Z5xie47$Ew{?1=#m+sFYJ}ro(cZZIXb!MV6stkyekTsBkvkWBzFV&JI2#zuP z!w|)jaM=uVrE>?Nw__uej=>ubj*#tBTtC*;x*_h z_n@jK2qA!fSufz1+qs2cFa!{_u*sJtNSav$;=9{?kY>ym;ogUaB*Li-8SJoX4qB!S zKhC@U+LUS}?ZpR$;>VAYs9Y;`xSq0B|HSrK3Ck8>m*2|I!}1!sZlmyi2&YeQqOr)S zFB57clhymx`U-htxp25+DA-B zvP=X?LFBjtoB|rY zy>v@B4_myf51&(vC&KqHxHF98_W%!e>R1zaZ&PE2ry;`ogTHpSC2n87H4gPUsp~X; zQ+zYou>;Y;h@8$D6>sblP@yjz1qPW954%}?)75(FO^JF!(;+?!E^ihBh%p@QNEjCU z^jG0YbII9)QofDPJ)e%ZsO;1{5TQ`d`*oA8eRmwTvYK=`{<+iZ@a0UIg+h)wWB72} z()9g}Xev+Zo1=^|_ zb3Fk_nde;i$369g^wm#`dR~ZF_150*SPZe$DBN@=X(2X?E9P#{R5{7}?cN_ZOjM!; zS`8KC@&fuZz^f=gihdMF=4xwk*UR5+QGdeUn5kW}WUz}#UQ9%Uccdky`Qs&j6z~@O zsC~MY`nfoUg(3L(XoX1rOa2!cx&`{veRRs}3_QD#hJ-wqgjQTfn#g zK2`s9>^Rk#iJKF#Znqz)(%QwQbeVI(V=s8K8Pjq7_Z_$#INfF?v@c(jhXvO+-pGAC zLoD9+y{`Fn>ZDrWSvG(b(I{PxAaK zY^?KqQ@@EbTb`u0lgaMp>__Q6u2Y)iQuktknCKD==U{(4a{*<1R0E`Qb7KFoa*E!$ zK&lqGtBcxOO;Os3hU!(qM*_n}^>lSNC+D z_KTDjm^AQfC1se`BgV?W9we~`_4_unM zuy{PyG--v$s-WmSrJ!tCiMf73ja?)VsNK4}T&1QP*Ce zZr7-ax(9g?1b&MmRo(61&-LF%Qz3UN%mHgo8kn2({y;H`TsHr1uU__21=E8Um2x=0 z(rvVjT%@lG(?exE7f0cBFY{3^%B&MQnTrUj;uF+o-2RH(+Cp{x0NZ1_S*~}Op|8yt z$O0LV%jF3d#?hwVqQm9DzmVNWqkDOHfRtc;$WjH)5>{9}n5~7I$UhBd$9Sg~>848? zvj+$Z!kaREif^JLzgA+4w_eolhYYV6O)$%AhY$O>5qjG(zM8MMI1X`I0Uj3G(4ggH zegZKrKR4Yj#=@LCebbc&-z0p#OHXwt;#kkHMqA9|ACjeNF{?!j6`%cq8-uQ5vbAsn@%JkINpX8!lQk>MWU@~O zqC&MAp>J(KZk3_Lv&-lkvQx$8v26F4x8wuNsq%83*NKYu;qrx`mv0=Qer zC(J%Q_|c=0u&1anHr*es7(r?gj}QiU zr)9|b*08?In?;?i2dQGTW|2r!G4t=#&2mx~Z__II*D%-EEZ1C0A_M&|m(C*vFSf<@ zMw^r4skeGGk`ksZT8g-E5~V;+ll%UD$zi^LF)FoFh;Wa`JTyah%h+m`}-g(?zdY6Q}KYHKXr(4Pav>gOyZ%w&O@uRBza!luqsjt^LES z^V3ho7|1#kU0k(gP_8w^@-$C{S1;O~WCvfFL+&#*JDL;aMXheV1qf|d2B1c(O?hD% zsFlYmQo3>aIP3b%lJsIQdA}@RIlsn5HfW6!+ zS{Lh)GcEtPKxvrB(40cHmc*(@u8hOaq6k9#7N*<^@(_*{a<%!5vSn`&mZEoy8F)b` zs7;@8CM+S49g9}am5iZkS1qdbwdaQ|G?zCPxQuVdT}XHF#fbcbLG8uKc!YS=_n{DC zHZ6!aFz^n((^SAsGDD`!wj7CVuBb`k`JwQX9xQFyn}HE7IQa$T(#V9pnnD1(*xpK! zVNtpSC9+D(_H$j)@(dk1Tz-r~HP3nIASU&XKmc0@_Y__=(tt;iX%tK`l(ragCI;N5o!Wk5pFMl5Q zGW;BPeKxCX>=d$Dx+&OWGx;?+%HL)=x_f@|IEoMY;Fu?DBN}TjUQi~+YlmiR|H7>e zXSB|k*U3B7S5jyY+4@2}R4|GX_;@sPUyKIU;VA=+F|~n*>NI8j)xuh$1zpKb=6^r{ zTy7AWns%Q#X-1!&f%qGus-7>sO$uc{HT$hn+}M@5Tjxre<9hvC|r+xmcZRZ$Nk+*8m!GP)Bn=rAsv45oIhKi4Gq zsKi-Q{z$2Yx|sibOfH(5=OOhYnS8z^ou-C;(9#lanvx5dHaW(kj#6HN05Q zab~FDdKDF|kU2|M>m+rv`QNeZTtZ8Yjtlb>5aH=64q;TJb+y{PWWqKKmGmtL&Xp zPv0%Ri2(~M5}Z_?ex*SBp}Ee1IQ~iuiL&}u4fot-XnxDq7CwoNd1U57>pUWWLbMQt z-S)?t!HAm_b~o52lvcnpYAVUrVv7R%?StwQWDI;-w6-xG(AX5b-?b22tTSVc*f^=% zQ#Is9 zyr{R{fq`?b&Pe+34$FP|$YtGe4i9E2@k`ato(l0JQvOEInW$Yjila5OAa|DTlWL5gQcpQaJD zZki+qY;({oX4*^nz0Dcb@OiW{eqy;dgEnW}#r@Q|)h{@YyzE)Zi$AHndd6l}EAl}( z`g2o$3+m0$e!mVJpqGiAIuBjVv2V`(5Vbo7keTj3&*l_Nf~)G?oldGwt3laIIl(~5 z$Amfavjx9$m2&s|{a}yj58r@SNuE7wrzs`KCxKN`LFO5K2XSSvjYH@pGN5sVNT{qT%Xt22yHp_T$acMu9E)7w`rhFq79ll93cFTn z-K1Uxaue?!;2k54nDcqy%E)*$ll#HVAHBnX(xxVZ+`yntr-io0H2pvGKP=Dh5y8uq zd^aF}J&DJk9wp`Fs(`@zxZM{>s8j35P_(-Bl633aXtKk`$z+n&tEs%Nkqo}91~mCc zD#0*37$PM3gm)Ec^oB#GodVKITAlKo{|?YG+u=xYFjepMy2rVZmtR!QPs8eZ^=nOF zz}c68fEERtl}ja94stIYq`ITWUK^gCD?U*Koon^5<>Wt^y^}l?yH0qVIrJB9L=Z^9 zB-nNW-^=Ey&GF@wR2e2|w8E9&0`8NPD{jSa`!?ae&PfU9!x$qgCjd`=9-Xaq^LyO| zk9_ObohGoUV48>=f5IXBdKc%ntAIVJc5=_JE=sFd0|;_pI%ptRd*y`z3k?z8)(|I@lrVLeO7fwzgl70;VtwDm)V>4gu!H)82 zy}0*_gXWy0&M)r@p`PWP6np~1H~LZY}?a^a#LV`?Yx z4?*Q}lXa(UQd^ZRDpQnwJ`=}=U#?DOrU@EHTkORjfRwLbD)F~p_gtpmc+IEZreoE<(%GtylP!v>pKbta@GKCy@_BR5iT)$r6Sr*Py~VW6h}K$WaFw zu|0~KMoM>^(ZFs{(aJ?07*zAqs>jg2I+BI}X9 z=dvXLe>(eWMeYRNx->T3wS2)SuymCuWNSGx;ZZqv0slVdM<6_5Nfvl{4P0F)l&<-) zI5J@j%i6?*hp72yn%(UJo1eA~T^yo$jErYE{%F@Q&E;HkxdRtg*S9`oK}$-_)DjG~ z#%fkMXzFa6%;tSbeFoc%0OKB!C>JyOj|jVOwwijYmI<=O+Z@p+bZ>Gc@^;&$yL`Lx zRu}-1i4tN;oP_Ad+!}YDj@P+MnD!(59nrWY5Bs`fw@g~T)Lo*p83+vh2Tdxk>+p0J z%j%D80FSh}PTlmJ200xwnd<}iPL|ovs}1Vwpx=%im&qv{cDFEN?n3t$Rb5^8uva62 z>tbc-$7mw8Sj%qxN5gU-lh22}2SgqZL?Dh@7`vUnmd)S?$5|#@GI20oidxhC`!uuQ zn*+M>q~)V>$JPXa>u|rkjV6>VXPXlg#%r(sJ=Oc47PC$@t$;bhrO>b=Lkj^|y8y!8 zgTd-h^JK3-i0rDg11ozL?S5IINy!;&dM9fq@N$$E=0D=LAmMpq_w5`;KM-KhfjOb3 zrb>D&Idasu#g|+Od3~^Y|7pWPhIBx6Sl$Ed5;D^@C3Q^^T> zl8`;*e;n>}@M0PK)>J!{0vOa&3WoZc0Xjtte5onrmLoWfFG5}Prx!|NeHz10YOX@; zQ^()|)V6^aEJp!ES5h8nkrE=12;!ZNW+qTTh6nDfF=^GF1=9TYYDFG>N4{s(jyY~p zq$YaaWd`o@jeUzN`e6CsF;-zQJ0oDnV&tDmxL7F7kET8e8{pATCj%a3LTiHWH{*r` z5Ya6=p{y?=Zyowdvp$J980Bi3c3(Yku(L z9j93bRBH@7f?mdNVC{ZH!*@Tu3l|1=7F%Q09`RLfI-O?<92(lGq?+1Mn6r&Q&exzq zeqSA66K@;n={bR6309q}{>)383GdL#kyPtTWI}d*9KPNU0kBoCITKzy3f^QSBG;aj zttt{jz^~eOOpc-5SyHk|n=Q$zR;~^M!D9UXdI(R9S8A8dyj?{Mp{?b)4kE$dd&0(R z^W{sD?|V~%9fE4q)AFAtD zx@Hzf*KOX~AYsrQ>Fx1W!q9JZcHu6dpI4*PLfzY|K-vHe2KE;W9+2+qmZ>#V#pHlf zmFuD21Zl3l9FKUv??@0nS@=GSgx_Vkd&p+z=z8kY*V@heY(52I1<|DeO-FCF}Rd6G)e{?}i#ZCB>+s6k(XYS51D?uLH)y3dda6*m+sIzSJ% zA9E$##MtzDT$VazJY|}kR=60dOgKr|V+{%3+{++=SRqF6qdy1%l{ar8OEKgXYwX%T z->eKq2{#7^!4Kx0<^NR?{ga4+LHS7WOtpVIi!E`xp9r);mRkQ^YjxU@>O$(0Y-Oow zgSNIo%0ck%v6)B0n#yE*eZCYIB_%y$V{ZP=bBFc7vfq3*!OtithSED-)nmr?g~wQf zpVABKuxW!htV>G%B2A5T)XIyxEGpir;&eUa2Nb_T&U!>59;mG(#Z8}&>C5W%)yQ!$ z9C%F3YghQMPn@JCT)JIj?Xb|@E#{mj5d_^U+}6glcE#ZC^zx}8!q15lijPkW33gcM zZx0C}D$>bUSjUE+h~#bA?5|CvPnatzt5Q!^+QquA2JuGIDa?Y5{!XB@&GC&e5!jXH z^LGAZ82t1*CG#ndDceQ-8kzcHguQ<003LrQD^$!WQI|#eFJj}i9DP9Ic@oLr+p9)W zO_f57@hG??%4tP4Y)nor`}sK->^J5ZQWHEww~o#>dPg3$Z&fMk|8lZEhvdQY3`z)z zl=*oD)GY{@?^O=gku9_=TDgZ51SqoSAs77;ANP=dA5Db1Kg@cJ9N7Hc7X}mC{svrG zxTDtcHZO3rvr7c7nN>5-_mn5GY*$hVO+%5fMs0_c5DDQp&P1jM2#UVDKjK$+cFq~j zlrls@9QHj72oXLWChe|?xvcWwt58p${*w|FN$GQF|8&=9(>C$!Y8UtYaVFT~zpnY& z^)LMDQ{SHavo+(06#v;@xk}zNO8r#=Jp9~(u;!kw0r%`M*Q5!_~>VkW+%S^6< zKCn_+#5TU_!BsP6Oi%X6q6o?V#E*%SpdBQ;DPu@=EA}e~j|VAXqj=gRdyn~#ez4Jd z_pY2=SjWtaUr9;n@LC-lm*NGTlfv5*I`sO$Q1eh;PRV?c>#rs1w9IO4ZT$i{_|^CF z$6Br2Vj@nu3C{%uk4~4q>}3B6Quvqqi;drw-Il%|uB9VKD0C>_suI@xHL~y}x7~<; zT8}DLmvJCLK)-TiIQu_V%yYUS4DBqK^WUQ@HWO>g`2UQ>gRGwaGZMeRLALY%mPiscUfQz#f3>9P zSzb66L8&R>zb7JWdxi7{Zh1vN*dcFkWo2=3g9a`xE=f9Ydw_VM$t%WbxfXD*^>5j0 dU~u3O4W>?3{qc6D=`T8rnv#}c^-J@x{{Vf)AAtY> literal 44689 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

    kR%Lvlm@1$@78pcd(cm8!pssh9Ib>s)0Wv?5Xm} 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 P4^~QYs Date: Tue, 21 Mar 2017 11:25:13 +0800 Subject: [PATCH 36/38] img --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8a69b8cf..6bbb3031 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ compile 'com.arialyy.aria:Aria:2.4.4' ![Dialog使用](https://github.com/AriaLyy/DownloadUtil/blob/v_2.0/img/dialog_use.gif "") ## 性能 -![性能展示](https://github.com/AriaLyy/DownloadUtil/blob/v_2.0/img/performance.png) +![性能展示](https://github.com/AriaLyy/DownloadUtil/blob/master/img/performance.png) *** ## 使用 From 2557f14d704f34a94c813b176031080e3a2d8377 Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Tue, 21 Mar 2017 14:46:27 +0800 Subject: [PATCH 37/38] item --- .../res/layout/activity_aria_file_shange.xml | 14 ++++++ Aria/src/main/res/layout/item_file.xml | 47 +++++++++++++++++++ Aria/src/main/res/values/strings.xml | 2 +- 3 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 Aria/src/main/res/layout/activity_aria_file_shange.xml create mode 100644 Aria/src/main/res/layout/item_file.xml diff --git a/Aria/src/main/res/layout/activity_aria_file_shange.xml b/Aria/src/main/res/layout/activity_aria_file_shange.xml new file mode 100644 index 00000000..fd652062 --- /dev/null +++ b/Aria/src/main/res/layout/activity_aria_file_shange.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/Aria/src/main/res/layout/item_file.xml b/Aria/src/main/res/layout/item_file.xml new file mode 100644 index 00000000..e24b1632 --- /dev/null +++ b/Aria/src/main/res/layout/item_file.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/Aria/src/main/res/values/strings.xml b/Aria/src/main/res/values/strings.xml index fe69410b..010e9981 100644 --- a/Aria/src/main/res/values/strings.xml +++ b/Aria/src/main/res/values/strings.xml @@ -1,5 +1,5 @@ - DownloadUtil + Aria 下载实体不能为空 下载链接不能为空 From 904a6484fa446b3fa3c81d4557579a526a0ce8de Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@QQ.com> Date: Wed, 5 Apr 2017 20:12:54 +0800 Subject: [PATCH 38/38] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e5a2e22e..1b880391 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Aria ![图标](https://github.com/AriaLyy/DownloadUtil/blob/v_2.0/app/src/main/res/mipmap-hdpi/ic_launcher.png)
    Aria,让上传、下载更容易实现
    -+ Aria有以下特点: +Aria有以下特点: - 简单 - 可在Dialog、popupWindow等组件中使用 - 支持多线程、多任务下载