downloadChunk(appID, depotID, chunkSha1, contentServer, callback) {
		if (typeof contentServer === 'function') {
			callback = contentServer;
			contentServer = null;
		}

		chunkSha1 = chunkSha1.toLowerCase();

		return StdLib.Promises.callbackPromise(['chunk'], callback, async (resolve, reject) => {
			if (!contentServer) {
				let {servers} = await this.getContentServers(appID);
				contentServer = servers[Math.floor(Math.random() * servers.length)];
			}

			let urlBase = (contentServer.https_support == 'mandatory' ? 'https://' : 'http://') + contentServer.Host;
			let vhost = contentServer.vhost || contentServer.Host;
			let {key} = await this.getDepotDecryptionKey(appID, depotID);

			let token = '';
			if (contentServer.usetokenauth == 1) {
				token = (await this.getCDNAuthToken(appID, depotID, vhost)).token;
			}

			download(`${urlBase}/depot/${depotID}/chunk/${chunkSha1}${token}`, vhost, async (err, res) => {
				if (err) {
					return reject(err);
				}

				if (res.type != 'complete') {
					return;
				}

				try {
					let result = await CdnCompression.unzip(SteamCrypto.symmetricDecrypt(res.data, key));
					if (StdLib.Hashing.sha1(result) != chunkSha1) {
						return reject(new Error('Checksum mismatch'));
					}
					return resolve({chunk: result});
				} catch (ex) {
					return reject(ex);
				}
			});
		});
	}
Download a chunk from a content server.
@param {int} appID - The AppID to which this chunk belongs
@param {int} depotID - The depot ID to which this chunk belongs
@param {string} chunkSha1 - This chunk's SHA1 hash (aka its ID)
@param {object} [contentServer] - If not provided, one will be chosen randomly. Should be an object identical to those output by getContentServers
@param {function} [callback] - First argument is Error/null, second is a Buffer containing the chunk's data
@return Promise