From 4ae2ccfa376fc88062cf9168f9b54555dfcd1e8a Mon Sep 17 00:00:00 2001 From: jace-roell Date: Fri, 15 Nov 2024 10:08:15 -0500 Subject: [PATCH 1/4] first commit Signed-off-by: jace-roell --- .../src/io/__tests__/IO.unit.test.ts | 16 ++ packages/imperative/src/io/src/IO.ts | 33 ++- .../src/rest/src/client/AbstractRestClient.ts | 2 +- .../src/rest/src/client/CompressionUtils.ts | 2 +- .../methods/download/Download.system.test.ts | 37 ++++ .../testfiles/specialCharTestData.txt | 200 ++++++++++++++++++ packages/zosfiles/src/utils/ZosFilesUtils.ts | 2 +- 7 files changed, 283 insertions(+), 9 deletions(-) create mode 100644 packages/zosfiles/__tests__/__system__/methods/download/testfiles/specialCharTestData.txt diff --git a/packages/imperative/src/io/__tests__/IO.unit.test.ts b/packages/imperative/src/io/__tests__/IO.unit.test.ts index 880a40a1ea..e0aa1523b4 100644 --- a/packages/imperative/src/io/__tests__/IO.unit.test.ts +++ b/packages/imperative/src/io/__tests__/IO.unit.test.ts @@ -276,6 +276,22 @@ describe("IO tests", () => { expect(processed).toBe(original.replace(/\n/g, "\r\n").slice(1)); }); + it("processNewlines should replace LF line endings with CRLF on Windows when input is a Buffer", () => { + jest.spyOn(os, "platform").mockReturnValueOnce(IO.OS_WIN32); + const originalBuffer = Buffer.from("\nabc\ndef\n"); + const processedBuffer = IO.processNewlines(originalBuffer); + const expectedBuffer = Buffer.from("\r\nabc\r\ndef\r\n"); + expect(processedBuffer.equals(expectedBuffer)).toBe(true); + }); + + it("processNewlines should not replace LF line ending when last byte is CR and input is a Buffer", () => { + jest.spyOn(os, "platform").mockReturnValueOnce(IO.OS_WIN32); + const originalBuffer = Buffer.from("\nabc\ndef\n"); + const processedBuffer = IO.processNewlines(originalBuffer, "\r".charCodeAt(0)); + const expectedBuffer = Buffer.from("\nabc\r\ndef\r\n"); + expect(processedBuffer.equals(expectedBuffer)).toBe(true); + }); + it("should get an error for no input on mkdirp", () => { let error; try { diff --git a/packages/imperative/src/io/src/IO.ts b/packages/imperative/src/io/src/IO.ts index 327335ce00..63d41f9a48 100644 --- a/packages/imperative/src/io/src/IO.ts +++ b/packages/imperative/src/io/src/IO.ts @@ -264,17 +264,38 @@ export class IO { * @returns {string} - input with removed newlines * @memberof IO */ - public static processNewlines(original: string, lastByte?: number): string { + public static processNewlines(original: T, lastByte?: number): T { ImperativeExpect.toNotBeNullOrUndefined(original, "Required parameter 'original' must not be null or undefined"); + if (os.platform() !== IO.OS_WIN32) { return original; } - // otherwise, we're on windows - const processed = original.replace(/([^\r])\n/g, "$1\r\n"); - if ((lastByte == null || lastByte !== "\r".charCodeAt(0)) && original.startsWith("\n")) { - return "\r" + processed; + + let processed: T; + + if (typeof original === "string") { + processed = original.replace(/([^\r])\n/g, "$1\r\n") as T; + if ((lastByte == null || lastByte !== "\r".charCodeAt(0)) && original.startsWith("\n")) { + return ("\r" + processed) as T; + } + return processed; + } else { + // Create worst-case scenario sized buffer + const bufferList = Buffer.alloc(original.length * 2); + let bufferIndex = 0; + let prevByte = lastByte; + for (let i = 0; i < original.length; i++) { + const currentByte = original[i]; + if (prevByte !== 13 && currentByte === 10) { + bufferList[bufferIndex++] = 13; + } + bufferList[bufferIndex++] = currentByte; + prevByte = currentByte; + } + // Create a buffer slice of the actual used portion + processed = bufferList.slice(0, bufferIndex) as T; + return processed; } - return processed; } /** diff --git a/packages/imperative/src/rest/src/client/AbstractRestClient.ts b/packages/imperative/src/rest/src/client/AbstractRestClient.ts index fa1e663d15..c29dadcb3d 100644 --- a/packages/imperative/src/rest/src/client/AbstractRestClient.ts +++ b/packages/imperative/src/rest/src/client/AbstractRestClient.ts @@ -766,7 +766,7 @@ export abstract class AbstractRestClient { this.log.debug("Streaming data chunk of length " + respData.length + " to response stream"); if (this.mNormalizeResponseNewlines && this.mContentEncoding == null) { this.log.debug("Normalizing new lines in data chunk to operating system appropriate line endings"); - respData = Buffer.from(IO.processNewlines(respData.toString(), this.lastByteReceived)); + respData = IO.processNewlines(respData, this.lastByteReceived); } if (this.mTask != null) { // update the progress task if provided by the requester diff --git a/packages/imperative/src/rest/src/client/CompressionUtils.ts b/packages/imperative/src/rest/src/client/CompressionUtils.ts index 7e05de3c54..7234907c34 100644 --- a/packages/imperative/src/rest/src/client/CompressionUtils.ts +++ b/packages/imperative/src/rest/src/client/CompressionUtils.ts @@ -102,7 +102,7 @@ export class CompressionUtils { let lastByteReceived: number = 0; return new Transform({ transform(chunk, _, callback) { - this.push(Buffer.from(IO.processNewlines(chunk.toString(), lastByteReceived))); + this.push(IO.processNewlines(chunk, lastByteReceived)); lastByteReceived = chunk[chunk.byteLength - 1]; callback(); } diff --git a/packages/zosfiles/__tests__/__system__/methods/download/Download.system.test.ts b/packages/zosfiles/__tests__/__system__/methods/download/Download.system.test.ts index 7a5a9e51b7..abf081ae87 100644 --- a/packages/zosfiles/__tests__/__system__/methods/download/Download.system.test.ts +++ b/packages/zosfiles/__tests__/__system__/methods/download/Download.system.test.ts @@ -44,6 +44,9 @@ const rimraf = require("rimraf").sync; const delayTime = 2000; const testData = "abcdefghijklmnopqrstuvwxyz"; +// File must be larger than 8KB such that it breaks into multiple chunks +const specialCharTestData = fs.readFileSync(__dirname+"/testfiles/specialCharTestData.txt"); + let REAL_SESSION: Session; let testEnvironment: ITestEnvironment; let defaultSystem: ITestPropertiesSchema; @@ -574,6 +577,40 @@ describe("Download Data Set", () => { const regex = /\./gi; file = dsname.replace(regex, "/") + "/member.dat"; }); + it("should download a data set member full of special characters to test buffer chunk concatenation", async () => { + let error; + let response: IZosFilesResponse; + + // upload data to the newly created data set + await Upload.bufferToDataSet(REAL_SESSION, Buffer.from(specialCharTestData), dsname + "(member)"); + await delay(delayTime); + + try { + response = await Download.allMembers(REAL_SESSION, dsname); + Imperative.console.info("Response: " + inspect(response)); + } catch (err) { + error = err; + Imperative.console.info("Error: " + inspect(error)); + } + expect(error).toBeFalsy(); + expect(response).toBeTruthy(); + expect(response.success).toBeTruthy(); + expect(response.commandResponse).toContain( + ZosFilesMessages.datasetDownloadedSuccessfully.message.substring(0, "Data set downloaded successfully".length + 1)); + + // Convert the data set name to use as a path/file + const regex = /\./gi; + file = dsname.replace(regex, "/"); + file = file.toLowerCase(); + + // Compare the downloaded contents to those uploaded + const fileContents = stripNewLines(fs.readFileSync(`${file}/member.txt`).toString()); + const uniqueFileChars = Array.from(new Set(fileContents)).join(''); + const expectedUniqueChars = "àèéìòùÀÈÉÌÒÙ° "; // Expected unique characters + + // Ensure the file only contains the unique characters and nothing else + expect(uniqueFileChars).toEqual(expectedUniqueChars); + }); }); describe("Data sets matching - all data sets - PO", () => { diff --git a/packages/zosfiles/__tests__/__system__/methods/download/testfiles/specialCharTestData.txt b/packages/zosfiles/__tests__/__system__/methods/download/testfiles/specialCharTestData.txt new file mode 100644 index 0000000000..33d2f928b1 --- /dev/null +++ b/packages/zosfiles/__tests__/__system__/methods/download/testfiles/specialCharTestData.txt @@ -0,0 +1,200 @@ +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à +àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°àèéìòùÀÈÉÌÒÙ°à \ No newline at end of file diff --git a/packages/zosfiles/src/utils/ZosFilesUtils.ts b/packages/zosfiles/src/utils/ZosFilesUtils.ts index 9397084aba..ba7d7ab051 100644 --- a/packages/zosfiles/src/utils/ZosFilesUtils.ts +++ b/packages/zosfiles/src/utils/ZosFilesUtils.ts @@ -143,7 +143,7 @@ export class ZosFilesUtils { // TODO:gzip Always accept encoding after z/OSMF truncating gzipped binary data is fixed // See https://github.com/zowe/zowe-cli/issues/1170 if (!options.binary && !options.record) { - reqHeaders.push(ZosmfHeaders.ACCEPT_ENCODING); + //reqHeaders.push(ZosmfHeaders.ACCEPT_ENCODING); } if (options.responseTimeout != null) { From 86b9880e0678b8d271807018bcf7e109023369c2 Mon Sep 17 00:00:00 2001 From: jace-roell Date: Fri, 15 Nov 2024 10:24:50 -0500 Subject: [PATCH 2/4] linting, changelog, returned gzip line Signed-off-by: jace-roell --- packages/imperative/src/io/src/IO.ts | 3 +++ packages/zosfiles/CHANGELOG.md | 4 ++++ packages/zosfiles/src/utils/ZosFilesUtils.ts | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/imperative/src/io/src/IO.ts b/packages/imperative/src/io/src/IO.ts index 63d41f9a48..099322f02f 100644 --- a/packages/imperative/src/io/src/IO.ts +++ b/packages/imperative/src/io/src/IO.ts @@ -286,7 +286,10 @@ export class IO { let prevByte = lastByte; for (let i = 0; i < original.length; i++) { const currentByte = original[i]; + //Check if previous byte is not Carriage Return (13) and if current byte is Line Feed (10) + // eslint-disable-next-line @typescript-eslint/no-magic-numbers if (prevByte !== 13 && currentByte === 10) { + // eslint-disable-next-line @typescript-eslint/no-magic-numbers bufferList[bufferIndex++] = 13; } bufferList[bufferIndex++] = currentByte; diff --git a/packages/zosfiles/CHANGELOG.md b/packages/zosfiles/CHANGELOG.md index 1365f99c2e..a4d4e04aef 100644 --- a/packages/zosfiles/CHANGELOG.md +++ b/packages/zosfiles/CHANGELOG.md @@ -2,6 +2,10 @@ All notable changes to the Zowe z/OS files SDK package will be documented in this file. +## Recent Changes + +- BugFix: Resolved issue where special characters could be corrupted when downloading a large file. [#2362](https://github.com/zowe/zowe-cli/pull/2362) + ## `7.29.5` - BugFix: Added support for the `--encoding` flag to the `zowe upload dir-to-uss` to allow for encoding uploaded directories for command group consistency. [#2356](https://github.com/zowe/zowe-cli/pull/2356) diff --git a/packages/zosfiles/src/utils/ZosFilesUtils.ts b/packages/zosfiles/src/utils/ZosFilesUtils.ts index ba7d7ab051..9397084aba 100644 --- a/packages/zosfiles/src/utils/ZosFilesUtils.ts +++ b/packages/zosfiles/src/utils/ZosFilesUtils.ts @@ -143,7 +143,7 @@ export class ZosFilesUtils { // TODO:gzip Always accept encoding after z/OSMF truncating gzipped binary data is fixed // See https://github.com/zowe/zowe-cli/issues/1170 if (!options.binary && !options.record) { - //reqHeaders.push(ZosmfHeaders.ACCEPT_ENCODING); + reqHeaders.push(ZosmfHeaders.ACCEPT_ENCODING); } if (options.responseTimeout != null) { From f8799ec3cc126d08b010066b219028f3ec09f921 Mon Sep 17 00:00:00 2001 From: Jace Roell <111985297+jace-roell@users.noreply.github.com> Date: Mon, 18 Nov 2024 08:44:58 -0500 Subject: [PATCH 3/4] Update packages/imperative/src/io/src/IO.ts Co-authored-by: Timothy Johnson Signed-off-by: Jace Roell <111985297+jace-roell@users.noreply.github.com> --- packages/imperative/src/io/src/IO.ts | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/packages/imperative/src/io/src/IO.ts b/packages/imperative/src/io/src/IO.ts index 099322f02f..47a4aef89d 100644 --- a/packages/imperative/src/io/src/IO.ts +++ b/packages/imperative/src/io/src/IO.ts @@ -280,23 +280,20 @@ export class IO { } return processed; } else { - // Create worst-case scenario sized buffer - const bufferList = Buffer.alloc(original.length * 2); - let bufferIndex = 0; + const bufferList: number[] = []; let prevByte = lastByte; for (let i = 0; i < original.length; i++) { const currentByte = original[i]; //Check if previous byte is not Carriage Return (13) and if current byte is Line Feed (10) // eslint-disable-next-line @typescript-eslint/no-magic-numbers - if (prevByte !== 13 && currentByte === 10) { + if (currentByte === 10 && prevByte !== 13) { // eslint-disable-next-line @typescript-eslint/no-magic-numbers - bufferList[bufferIndex++] = 13; + bufferList.push(13); } - bufferList[bufferIndex++] = currentByte; + bufferList.push(currentByte); prevByte = currentByte; } - // Create a buffer slice of the actual used portion - processed = bufferList.slice(0, bufferIndex) as T; + processed = Buffer.from(bufferList); return processed; } } From fcb259a377a283c2e861bec1a1bedbf9506c3edc Mon Sep 17 00:00:00 2001 From: jace-roell Date: Mon, 18 Nov 2024 08:50:39 -0500 Subject: [PATCH 4/4] pass processed buffer 'as T' Signed-off-by: jace-roell --- packages/imperative/src/io/src/IO.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/imperative/src/io/src/IO.ts b/packages/imperative/src/io/src/IO.ts index 47a4aef89d..b6976292a3 100644 --- a/packages/imperative/src/io/src/IO.ts +++ b/packages/imperative/src/io/src/IO.ts @@ -293,7 +293,7 @@ export class IO { bufferList.push(currentByte); prevByte = currentByte; } - processed = Buffer.from(bufferList); + processed = Buffer.from(bufferList) as T; return processed; } }