From dfed5a73839d78e727fc15b3314d52cdbb4c00c6 Mon Sep 17 00:00:00 2001 From: Karthik Kumar Viswanathan Date: Sat, 7 Sep 2019 05:29:15 -0700 Subject: [PATCH 1/3] - Add VarUnsignedInteger. - Add append method to BitBuffer. - Eliminate some conversions. - Fix access specifiers and add accessors. - Stream mostly. --- .../java/org/dcp/entities/bit/BitBuffer.java | 25 +++- .../org/dcp/entities/primitives/Boolean.java | 7 +- .../org/dcp/entities/primitives/Decimal.java | 4 +- .../org/dcp/entities/primitives/Integer.java | 29 +++-- .../entities/primitives/UnsignedInteger.java | 71 ++++++++--- .../primitives/VarUnsignedInteger.java | 115 ++++++++++++++++++ .../org/dcp/entities/{ => symbol}/Symbol.java | 2 +- src/main/java/org/dcp/io/BitInputStream.java | 32 +++-- src/main/java/org/dcp/io/BitOutputStream.java | 4 +- .../dcp/io/impl/ChannelBitInputStream.java | 12 +- .../dcp/io/impl/ChannelBitOutputStream.java | 14 +-- src/main/java/org/dcp/util/EntropyUtil.java | 2 +- .../org/dcp/test/entities/BitBufferTest.java | 8 ++ .../java/org/dcp/test/entities/BitTest.java | 20 +++ .../test/entities/primitives/IntegerTest.java | 6 +- .../primitives/UnsignedIntegerTest.java | 14 +-- .../primitives/VarUnsignedIntegerTest.java | 100 +++++++++++++++ .../io/impl/ChannelBitOutputStreamTest.java | 13 +- .../test/io/impl/MockBitOutputStreamTest.java | 6 + 19 files changed, 405 insertions(+), 79 deletions(-) create mode 100644 src/main/java/org/dcp/entities/primitives/VarUnsignedInteger.java rename src/main/java/org/dcp/entities/{ => symbol}/Symbol.java (95%) create mode 100644 src/test/java/org/dcp/test/entities/primitives/VarUnsignedIntegerTest.java diff --git a/src/main/java/org/dcp/entities/bit/BitBuffer.java b/src/main/java/org/dcp/entities/bit/BitBuffer.java index ab29362..84a5ae9 100644 --- a/src/main/java/org/dcp/entities/bit/BitBuffer.java +++ b/src/main/java/org/dcp/entities/bit/BitBuffer.java @@ -27,11 +27,11 @@ public BitBuffer(final int sizeInBits) { public BitBuffer(final Iterator bits, final int sizeInBits) { this(sizeInBits); - int indexScanning = 0; + int bitIter = 0; while(bits.hasNext()) { - if(indexScanning >= sizeInBits) + if(bitIter >= sizeInBits) break; - setBit(indexScanning++, bits.next()); + setBit(bitIter++, bits.next()); } } @@ -93,8 +93,7 @@ public BitBuffer subBuffer(final int startIndex, final int endIndexExclusive) { if(endIndexExclusive > sizeInBits) throw new IndexOutOfBoundsException(String.format("End Index out of bounds. EndIndex: %d\n", endIndexExclusive)); final int bitSize = endIndexExclusive - startIndex; - final Iterator iteratorSlice = iterator(startIndex, endIndexExclusive); - return new BitBuffer(iteratorSlice, bitSize); + return new BitBuffer(iterator(startIndex, endIndexExclusive), bitSize); } public BitBuffer subBuffer(final int startIndex) { @@ -129,6 +128,22 @@ public Iterator iterator() { return iterator(0); } + public BitBuffer append(final Iterable appendBits, final int appendSizeInBits) { + final int newSizeInBits = sizeInBits + appendSizeInBits; + final BitBuffer bitBufferNew = new BitBuffer(this, newSizeInBits); + int bitIter = sizeInBits; + for(final Bit bit: appendBits) { + if(bitIter >= newSizeInBits) + break; + bitBufferNew.setBit(bitIter++, bit); + } + return bitBufferNew; + } + + public BitBuffer append(final BitBuffer bitBuffer) { + return append(bitBuffer, bitBuffer.sizeInBits); + } + public String toString() { return StreamSupport.stream(this.spliterator(), false).map(bit -> bit.toString()).collect(Collectors.joining("")); } diff --git a/src/main/java/org/dcp/entities/primitives/Boolean.java b/src/main/java/org/dcp/entities/primitives/Boolean.java index a2f2531..6f41e06 100644 --- a/src/main/java/org/dcp/entities/primitives/Boolean.java +++ b/src/main/java/org/dcp/entities/primitives/Boolean.java @@ -12,7 +12,7 @@ public class Boolean implements BitStreamSerializable { - final boolean value; + private final boolean value; public Boolean(final boolean value) { this.value = value; @@ -35,4 +35,9 @@ public Boolean readFrom(final BitInputStream bitInputStream) { public void writeTo(final BitOutputStream bitOutputStream) { bitOutputStream.writeBit(Bit.valueOf(value)); } + + @Override + public String toString() { + return String.valueOf(value); + } } diff --git a/src/main/java/org/dcp/entities/primitives/Decimal.java b/src/main/java/org/dcp/entities/primitives/Decimal.java index 295670a..3a7f83b 100644 --- a/src/main/java/org/dcp/entities/primitives/Decimal.java +++ b/src/main/java/org/dcp/entities/primitives/Decimal.java @@ -12,7 +12,7 @@ public class Decimal implements BitStreamSerializable { - public enum DecimalFormat { + public static enum DecimalFormat { //Half IEEE_754_HALF_16(1, 5, 10), @@ -95,7 +95,7 @@ public boolean equals(final Object other) { @Override public String toString() { - return String.format("Sign:%s Exponent: %d Mantissa: %d Format: %s", isNegative ? "-" : "+", exponentValue, mantissaValue, format); + return String.format("Sign: %s Exponent: %d Mantissa: %d Format: %s", isNegative ? "-" : "+", exponentValue, mantissaValue, format); } } diff --git a/src/main/java/org/dcp/entities/primitives/Integer.java b/src/main/java/org/dcp/entities/primitives/Integer.java index 88a7ab4..652350a 100644 --- a/src/main/java/org/dcp/entities/primitives/Integer.java +++ b/src/main/java/org/dcp/entities/primitives/Integer.java @@ -12,8 +12,9 @@ public class Integer implements BitStreamSerializable { - final UnsignedInteger unsignedInteger; - final boolean isNegative; + private final UnsignedInteger unsignedInteger; + private final int sizeInBits; + private final boolean isNegative; public Integer(final long integralValue, final int sizeInBits) { isNegative = (integralValue < 0); @@ -21,7 +22,8 @@ public Integer(final long integralValue, final int sizeInBits) { final int sizeInBitsUnsigned = sizeInBits - 1; final long neededSizeInBits = EntropyUtil.findSizeOfBitsToHold(unsignedIntValue); if(neededSizeInBits > sizeInBitsUnsigned) - throw new IllegalArgumentException(String.format("Needed Bits cannot be > than SizeUnsigned. NeededSize: %d SizeUnsigned: %d", neededSizeInBits, sizeInBitsUnsigned)); + throw new IllegalArgumentException(String.format("Size too small to Hold Value. NeededSize: %d SizeUnsigned: %d", neededSizeInBits, sizeInBitsUnsigned)); + this.sizeInBits = sizeInBits; this.unsignedInteger = new UnsignedInteger(unsignedIntValue, sizeInBitsUnsigned); } @@ -30,20 +32,31 @@ public Integer(final int sizeInBits) { } public long value() { - return isNegative? -unsignedInteger.integralValue : unsignedInteger.integralValue; + final long unsignedValue = unsignedInteger.value(); + return isNegative? -unsignedValue : unsignedValue; + } + + public int getSizeInBits() { + return sizeInBits; } @Override - public Integer readFrom(BitInputStream bitInputStream) { + public Integer readFrom(final BitInputStream bitInputStream) { boolean isNegative = bitInputStream.readBit().value(); final UnsignedInteger readInteger = unsignedInteger.readFrom(bitInputStream); - final long integralValue = isNegative? (-readInteger.integralValue): readInteger.integralValue; - return new Integer(integralValue, unsignedInteger.sizeInBits + 1); + final long unsignedValue = readInteger.value(); + final long integralValue = isNegative? -unsignedValue : unsignedValue; + return new Integer(integralValue, readInteger.getSizeInBits() + 1); } @Override - public void writeTo(BitOutputStream bitOutputStream) { + public void writeTo(final BitOutputStream bitOutputStream) { new Boolean(isNegative).writeTo(bitOutputStream); unsignedInteger.writeTo(bitOutputStream); } + + @Override + public String toString() { + return String.valueOf(value()); + } } diff --git a/src/main/java/org/dcp/entities/primitives/UnsignedInteger.java b/src/main/java/org/dcp/entities/primitives/UnsignedInteger.java index 2fe80f3..66f18c1 100644 --- a/src/main/java/org/dcp/entities/primitives/UnsignedInteger.java +++ b/src/main/java/org/dcp/entities/primitives/UnsignedInteger.java @@ -5,17 +5,19 @@ */ package org.dcp.entities.primitives; +import org.dcp.entities.Constants; import org.dcp.entities.bit.Bit; -import org.dcp.entities.bit.BitBuffer; import org.dcp.entities.bit.BitStreamSerializable; import org.dcp.io.BitInputStream; import org.dcp.io.BitOutputStream; import org.dcp.util.EntropyUtil; -public class UnsignedInteger implements BitStreamSerializable { +import java.util.Iterator; - final int sizeInBits; - final long integralValue; +public class UnsignedInteger implements BitStreamSerializable, Iterable { + + private final int sizeInBits; + private final long integralValue; public UnsignedInteger(final long integralValue, final int sizeInBits) { if(integralValue < 0) { @@ -23,7 +25,7 @@ public UnsignedInteger(final long integralValue, final int sizeInBits) { } final long maximumValue = EntropyUtil.findMaximumValueRepresentible(sizeInBits); if(integralValue > maximumValue) - throw new IllegalArgumentException(String.format("Given value cannot be greater than Maximum: %d Value: %d", maximumValue, integralValue)); + throw new IllegalArgumentException(String.format("Value cannot be greater than Maximum: %d. Value: %d", maximumValue, integralValue)); this.integralValue = integralValue; this.sizeInBits = sizeInBits; } @@ -32,29 +34,60 @@ public UnsignedInteger(final int sizeInBits) { this(0, sizeInBits); } + public UnsignedInteger(final Iterable bits, final int sizeInBits) { + final int maxSizeInBits = Constants.BITS_IN_A_INTEGER - 1; + if(sizeInBits > maxSizeInBits) + throw new IllegalArgumentException(String.format("Given Size cannot be greater than Maximum: %d. Size: %d", maxSizeInBits, sizeInBits)); + long integralValue = 0; + long mask = 1L << sizeInBits; + for(final Bit bit: bits) { + mask >>>= 1; + integralValue |= bit.value()? mask : 0; + } + this.integralValue = integralValue; + this.sizeInBits = sizeInBits; + } + public long value() { return integralValue; } + public int getSizeInBits() { + return sizeInBits; + } + @Override - public UnsignedInteger readFrom(BitInputStream bitInputStream) + public Iterator iterator() { + return new Iterator() { + long mask = 1L << sizeInBits; + + @Override + public boolean hasNext() { + return mask != 1; + } + + @Override + public Bit next() { + mask >>>= 1; + return Bit.valueOf( (integralValue & mask) != 0 ); + } + }; + } + + @Override + public UnsignedInteger readFrom(final BitInputStream bitInputStream) { - final Iterable bitsRead = bitInputStream.readBits(this.sizeInBits); - final long readInteger = java.lang.Long.parseUnsignedLong(new BitBuffer(bitsRead, this.sizeInBits).toString(), 2); - return new UnsignedInteger(readInteger, sizeInBits); + return new UnsignedInteger(bitInputStream.readBits(this.sizeInBits), sizeInBits); } @Override - public void writeTo(BitOutputStream bitOutputStream) { - final String binaryString = java.lang.Long.toBinaryString(this.integralValue); - final StringBuilder stringBuilder = new StringBuilder(sizeInBits); - int remainingLength = sizeInBits - binaryString.length(); - while(remainingLength > 0) { - remainingLength--; - stringBuilder.append('0'); - } - stringBuilder.append(binaryString); - bitOutputStream.writeBits(new BitBuffer(stringBuilder.toString())); + public void writeTo(final BitOutputStream bitOutputStream) { + bitOutputStream.writeBits(this); + } + + @Override + public String toString() { + return String.valueOf(value()); } } \ No newline at end of file diff --git a/src/main/java/org/dcp/entities/primitives/VarUnsignedInteger.java b/src/main/java/org/dcp/entities/primitives/VarUnsignedInteger.java new file mode 100644 index 0000000..60f9af4 --- /dev/null +++ b/src/main/java/org/dcp/entities/primitives/VarUnsignedInteger.java @@ -0,0 +1,115 @@ +/** + * Copyright 2019 DataCompressionPrimitives. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + */ +package org.dcp.entities.primitives; + +import org.dcp.entities.bit.Bit; +import org.dcp.entities.bit.BitBuffer; +import org.dcp.entities.bit.BitStreamSerializable; +import org.dcp.io.BitInputStream; +import org.dcp.io.BitOutputStream; + +import java.util.stream.IntStream; + +import static org.dcp.entities.Constants.*; + +public class VarUnsignedInteger implements BitStreamSerializable { + + final UnsignedInteger value; + final int sizeInBits; + final int chunkSizeInBits; + final int chunkValueBits; + + public VarUnsignedInteger(final UnsignedInteger value, final int chunkSizeInBits) { + final int absoluteMinSizeInBits = 2; + if(chunkSizeInBits < absoluteMinSizeInBits) { + throw new IllegalArgumentException(String.format("Given ChunkSize is Lesser than Absolute Minimum: %d. ChunkSize: %d", absoluteMinSizeInBits, chunkSizeInBits)); + } + /* + * This minSizeInBits check is: Are you Sane? and not for correctness. + * + * Why? For very short integers, consider using a fixed size UnsignedInteger. + * Otherwise, if you require Byte-Aligned access, you are wasting space. + */ + final int optimumSizeInBits = BITS_IN_A_BYTE; + if(chunkSizeInBits < optimumSizeInBits) { + throw new IllegalArgumentException(String.format("Given ChunkSize is Lesser than Optimum: %d. Consider Fixed Length. ChunkSize: %d", optimumSizeInBits, chunkSizeInBits)); + } + this.sizeInBits = value.getSizeInBits(); + if(chunkSizeInBits == sizeInBits) { + throw new IllegalArgumentException(String.format("Given ChunkSize is Equal to ValueSize: %d. Consider Fixed Length.", sizeInBits)); + } + if(chunkSizeInBits > sizeInBits) { + throw new IllegalArgumentException(String.format("Given ChunkSize is Greater Size: %d. ChunkSize: %d", sizeInBits, chunkSizeInBits)); + } + this.chunkSizeInBits = chunkSizeInBits; + this.chunkValueBits = chunkSizeInBits - 1; + this.value = value; + } + + public long value() { + return value.value(); + } + + @Override + public VarUnsignedInteger readFrom(final BitInputStream bitInputStream) { + final int numberOfChunks = (sizeInBits / chunkValueBits); + final int leftOverBits = (sizeInBits % chunkValueBits); + final int paddedBits = (leftOverBits == 0)? 0 : (chunkValueBits - leftOverBits); + final int totalNumberOfChunks = numberOfChunks + ((paddedBits > 0)? 1:0); + final int totalNumberOfBits = totalNumberOfChunks * chunkValueBits; + final BitBuffer totalBits = new BitBuffer(totalNumberOfBits); + + int readBits = 0; + int chunkIter = totalNumberOfChunks; + while(chunkIter-- > 0) { + final Bit sentinelBit = bitInputStream.readBit(); + if(chunkIter == 0 && sentinelBit.value()) + throw new IllegalArgumentException(String.format("Did not get End Sentinel in TotalChunks: %d. Size: %d", totalNumberOfChunks, sizeInBits)); + for(final Bit readBit : bitInputStream.readBits(chunkValueBits)) { + totalBits.setBit(readBits++, readBit); + } + if(!sentinelBit.value()) + break; + } + + final BitBuffer readIntegerBits; + if(sizeInBits == readBits) { + readIntegerBits = totalBits.subBuffer(0, readBits); + } else if(readBits < sizeInBits) { + final int bitsToPadLeft = sizeInBits - readBits; + readIntegerBits = new BitBuffer(bitsToPadLeft).append(totalBits, readBits); + } else { + final int bitsToUnpad = readBits - sizeInBits; + readIntegerBits = totalBits.subBuffer(bitsToUnpad, readBits); + } + + final UnsignedInteger unsignedInteger = new UnsignedInteger(readIntegerBits, sizeInBits); + return new VarUnsignedInteger(unsignedInteger, chunkSizeInBits); + } + + @Override + public void writeTo(final BitOutputStream bitOutputStream) { + final int numberOfChunks = (sizeInBits / chunkValueBits); + final int leftOverBits = (sizeInBits % chunkValueBits); + final int paddedBits = (leftOverBits == 0)? 0 : (chunkValueBits - leftOverBits); + final int totalNumberOfChunks = numberOfChunks + ((paddedBits > 0)? 1:0); + final BitBuffer totalBits = (paddedBits > 0)? new BitBuffer(paddedBits).append(value, sizeInBits) : new BitBuffer(value, sizeInBits); + + IntStream.range(0, totalNumberOfChunks).forEach( currentChunk -> { + final int nextChunk = currentChunk + 1; + final int startIndex = currentChunk * chunkValueBits; + final int endIndex = nextChunk * chunkValueBits; + bitOutputStream.writeBit(Bit.valueOf( nextChunk < totalNumberOfChunks ) ); + bitOutputStream.writeBits(() -> totalBits.iterator(startIndex, endIndex)); + }); + } + + @Override + public String toString() { + return String.valueOf(value()); + } + +} \ No newline at end of file diff --git a/src/main/java/org/dcp/entities/Symbol.java b/src/main/java/org/dcp/entities/symbol/Symbol.java similarity index 95% rename from src/main/java/org/dcp/entities/Symbol.java rename to src/main/java/org/dcp/entities/symbol/Symbol.java index 2ac7361..2ce208b 100644 --- a/src/main/java/org/dcp/entities/Symbol.java +++ b/src/main/java/org/dcp/entities/symbol/Symbol.java @@ -3,7 +3,7 @@ * * Licensed under the Apache License, Version 2.0 (the "License"); */ -package org.dcp.entities; +package org.dcp.entities.symbol; import org.dcp.entities.bit.BitStreamSerializable; diff --git a/src/main/java/org/dcp/io/BitInputStream.java b/src/main/java/org/dcp/io/BitInputStream.java index 5acc9db..633afbd 100644 --- a/src/main/java/org/dcp/io/BitInputStream.java +++ b/src/main/java/org/dcp/io/BitInputStream.java @@ -7,24 +7,32 @@ import org.dcp.entities.bit.Bit; -import java.util.ArrayList; -import java.util.List; +import java.util.Iterator; public interface BitInputStream { public Bit readBit(); - public default Iterable readBits(int toRead) { - final List readBits = new ArrayList(toRead); - for(int readIter = 0; readIter < toRead; ++readIter) { - readBits.add(readBit()); - } - return readBits; + public default Iterable readBits(final int toRead) { + return () -> { + return new Iterator() { + int readIter = 0; + + @Override + public boolean hasNext() { + return (readIter < toRead); + } + + @Override + public Bit next() { + ++readIter; + return readBit(); + } + }; + }; } - public default void skipBits(int toRead) { - for(int readIter = 0; readIter < toRead; ++readIter) { - readBit(); - } + public default void skipBits(final int toRead) { + readBits(toRead).forEach(bit -> {}); } } diff --git a/src/main/java/org/dcp/io/BitOutputStream.java b/src/main/java/org/dcp/io/BitOutputStream.java index a118813..3aa8142 100644 --- a/src/main/java/org/dcp/io/BitOutputStream.java +++ b/src/main/java/org/dcp/io/BitOutputStream.java @@ -13,9 +13,7 @@ public interface BitOutputStream extends Closeable { public void writeBit(final Bit bit); public default void writeBits(final Iterable bits) { - for(final Bit bit: bits) { - writeBit(bit); - } + bits.forEach(bit -> writeBit(bit)); } @Override diff --git a/src/main/java/org/dcp/io/impl/ChannelBitInputStream.java b/src/main/java/org/dcp/io/impl/ChannelBitInputStream.java index 14e36ef..e161069 100644 --- a/src/main/java/org/dcp/io/impl/ChannelBitInputStream.java +++ b/src/main/java/org/dcp/io/impl/ChannelBitInputStream.java @@ -33,11 +33,11 @@ protected byte readByte() { final int count; try { count = byteChannel.read(buffer); - } catch (IOException e) { - throw new IllegalStateException(e); + } catch (IOException ioException) { + throw new IllegalStateException(ioException); } if (count < 1) { - throw new IllegalStateException(); + throw new IllegalStateException("Unable to read from ReadableByteChannel."); } } final byte readByte = buffer.get(0); @@ -51,10 +51,10 @@ public Bit readBit() { current = readByte(); } final Bit readBit = Bit.valueOf((current & mask) != 0); - if (mask == LAST_BIT) { - mask = FIRST_BIT; - } else { + if (mask != LAST_BIT) { mask >>>= 1; + } else { + mask = FIRST_BIT; } return readBit; } diff --git a/src/main/java/org/dcp/io/impl/ChannelBitOutputStream.java b/src/main/java/org/dcp/io/impl/ChannelBitOutputStream.java index a33898d..1bd4a97 100644 --- a/src/main/java/org/dcp/io/impl/ChannelBitOutputStream.java +++ b/src/main/java/org/dcp/io/impl/ChannelBitOutputStream.java @@ -32,8 +32,8 @@ protected void writeByte(byte byteWrite) { buffer.put(0, byteWrite); try { byteChannel.write(buffer); - } catch (IOException e) { - throw new IllegalStateException(e); + } catch (IOException ioException) { + throw new IllegalStateException(ioException); } buffer.rewind(); } @@ -43,12 +43,12 @@ public void writeBit(Bit bit) { if (bit.value()) { current |= mask; } - if (mask == LAST_BIT) { + if (mask != LAST_BIT) { + mask >>>= 1; + } else { writeByte(current); mask = FIRST_BIT; current = 0; - } else { - mask >>>= 1; } } @@ -56,8 +56,8 @@ public void writeBit(Bit bit) { public void flushBits() { if(mask != LAST_BIT) { writeByte(current); + mask = FIRST_BIT; + current = 0; } - mask = FIRST_BIT; - current = 0; } } diff --git a/src/main/java/org/dcp/util/EntropyUtil.java b/src/main/java/org/dcp/util/EntropyUtil.java index 1d88677..ed1a2de 100644 --- a/src/main/java/org/dcp/util/EntropyUtil.java +++ b/src/main/java/org/dcp/util/EntropyUtil.java @@ -50,4 +50,4 @@ public static BigInteger findMaximumValueRepresentibleBig(final int sizeInBits) return BigInteger.ONE.shiftLeft(sizeInBits).subtract(BigInteger.ONE); } -} +} \ No newline at end of file diff --git a/src/test/java/org/dcp/test/entities/BitBufferTest.java b/src/test/java/org/dcp/test/entities/BitBufferTest.java index da7fcce..1dd2097 100644 --- a/src/test/java/org/dcp/test/entities/BitBufferTest.java +++ b/src/test/java/org/dcp/test/entities/BitBufferTest.java @@ -78,6 +78,14 @@ public void testSliceFunctionality() { assertEquals(bitBufferSliceSmall.toString(), "01010101"); } + @Test + public void testAppendFunctionality() { + final int sizeInBits = 4; + final BitBuffer bitBuffer = new BitBuffer(sizeInBits); + assertEquals(bitBuffer.toString(), "0000"); + assertEquals(bitBuffer.append(new BitBuffer("11")).toString(), "000011"); + } + @Test public void testReadStringFunctionality() { final String integerToString = Long.toBinaryString(32); diff --git a/src/test/java/org/dcp/test/entities/BitTest.java b/src/test/java/org/dcp/test/entities/BitTest.java index c145696..a3fff39 100644 --- a/src/test/java/org/dcp/test/entities/BitTest.java +++ b/src/test/java/org/dcp/test/entities/BitTest.java @@ -23,5 +23,25 @@ public void testBasicFunctionality() { assertEquals(bitSecond.value(), true); assertEquals(bitSecond.intValue(), 1); assertEquals(bitSecond.toString(), "1"); + + final Bit bitThird = Bit.valueOf(0); + assertEquals(bitThird.value(), false); + assertEquals(bitThird.intValue(), 0); + assertEquals(bitThird.toString(), "0"); + + final Bit bitFourth = Bit.valueOf(1); + assertEquals(bitFourth.value(), true); + assertEquals(bitFourth.intValue(), 1); + assertEquals(bitFourth.toString(), "1"); + + final Bit bitFifth = Bit.valueOf("0"); + assertEquals(bitFifth.value(), false); + assertEquals(bitFifth.intValue(), 0); + assertEquals(bitFifth.toString(), "0"); + + final Bit bitSixth = Bit.valueOf("1"); + assertEquals(bitSixth.value(), true); + assertEquals(bitSixth.intValue(), 1); + assertEquals(bitSixth.toString(), "1"); } } \ No newline at end of file diff --git a/src/test/java/org/dcp/test/entities/primitives/IntegerTest.java b/src/test/java/org/dcp/test/entities/primitives/IntegerTest.java index 516da26..c4c9b3c 100644 --- a/src/test/java/org/dcp/test/entities/primitives/IntegerTest.java +++ b/src/test/java/org/dcp/test/entities/primitives/IntegerTest.java @@ -17,15 +17,13 @@ public class IntegerTest { - final int sizeInBits = 4; - @Test public void testBasicFunctionality() { - final Integer integerDefault = new Integer(sizeInBits); + final Integer integerDefault = new Integer(4); assertEquals(integerDefault.value(), 0); try { - final Integer integerUnParsable = new Integer(19, sizeInBits); + final Integer integerUnParsable = new Integer(19, 4); assertTrue(false); } catch(IllegalArgumentException ie) { //Good! diff --git a/src/test/java/org/dcp/test/entities/primitives/UnsignedIntegerTest.java b/src/test/java/org/dcp/test/entities/primitives/UnsignedIntegerTest.java index 0956ffd..1f3d08e 100644 --- a/src/test/java/org/dcp/test/entities/primitives/UnsignedIntegerTest.java +++ b/src/test/java/org/dcp/test/entities/primitives/UnsignedIntegerTest.java @@ -16,22 +16,20 @@ public class UnsignedIntegerTest { - final int sizeInBits = 4; - @Test public void testBasicFunctionality() { - final UnsignedInteger unsignedIntegerDefault = new UnsignedInteger(sizeInBits); + final UnsignedInteger unsignedIntegerDefault = new UnsignedInteger(4); assertEquals(unsignedIntegerDefault.value(), 0); try { - final UnsignedInteger unsignedIntegerUnParsable = new UnsignedInteger(19, sizeInBits); + final UnsignedInteger unsignedIntegerUnParsable = new UnsignedInteger(19, 4); assertTrue(false); } catch(IllegalArgumentException ie) { //Good! } try { - final UnsignedInteger unsignedIntegernegative = new UnsignedInteger(-5, sizeInBits); + final UnsignedInteger unsignedIntegernegative = new UnsignedInteger(-5, 4); assertTrue(false); } catch(IllegalArgumentException ie) { //Good! @@ -53,10 +51,12 @@ public void testReadFunctionality() { @Test public void testWriteFunctionality() { final BitOutputStream bitOutputStreamFirst = new MockBitOutputStream(); + new UnsignedInteger(1, 1).writeTo(bitOutputStreamFirst); + assertEquals(bitOutputStreamFirst.toString(), "1"); new UnsignedInteger(13, 4).writeTo(bitOutputStreamFirst); - assertEquals(bitOutputStreamFirst.toString(), "1101"); + assertEquals(bitOutputStreamFirst.toString(), "11101"); new UnsignedInteger(11, 4).writeTo(bitOutputStreamFirst); - assertEquals(bitOutputStreamFirst.toString(), "11011011"); + assertEquals(bitOutputStreamFirst.toString(), "111011011"); final BitOutputStream bitOutputStreamSecond = new MockBitOutputStream(); new UnsignedInteger(0, 19).writeTo(bitOutputStreamSecond); diff --git a/src/test/java/org/dcp/test/entities/primitives/VarUnsignedIntegerTest.java b/src/test/java/org/dcp/test/entities/primitives/VarUnsignedIntegerTest.java new file mode 100644 index 0000000..1900a54 --- /dev/null +++ b/src/test/java/org/dcp/test/entities/primitives/VarUnsignedIntegerTest.java @@ -0,0 +1,100 @@ +/** + * Copyright 2019 DataCompressionPrimitives. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + */ +package org.dcp.test.entities.primitives; + +import org.dcp.entities.primitives.UnsignedInteger; +import org.dcp.entities.primitives.VarUnsignedInteger; +import org.dcp.io.BitInputStream; +import org.dcp.io.BitOutputStream; +import org.dcp.io.impl.MockBitInputStream; +import org.dcp.io.impl.MockBitOutputStream; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class VarUnsignedIntegerTest { + + @Test + public void testBasicFunctionality() { + try { + final VarUnsignedInteger varUnsignedIntegerTooSmall = new VarUnsignedInteger( new UnsignedInteger(231, 12), 1); + assertTrue(false); + } catch(IllegalArgumentException ie) { + //Good! + } + + try { + final VarUnsignedInteger varUnsignedIntegerTooUnoptimal = new VarUnsignedInteger( new UnsignedInteger(231, 12), 2); + assertTrue(false); + } catch(IllegalArgumentException ie) { + //Good! + } + + try { + final VarUnsignedInteger varUnsignedIntegerBorderLine = new VarUnsignedInteger( new UnsignedInteger(231, 12), 7); + assertTrue(false); + } catch(IllegalArgumentException ie) { + //Good! + } + + try { + final VarUnsignedInteger varUnsignedIntegerBorderLine = new VarUnsignedInteger( new UnsignedInteger(231, 12), 7); + assertTrue(false); + } catch(IllegalArgumentException ie) { + //Good! + } + + final VarUnsignedInteger varUnsignedIntegerDefault = new VarUnsignedInteger( new UnsignedInteger(231, 12), 8); + assertEquals(varUnsignedIntegerDefault.value(), 231); + + try { + final VarUnsignedInteger varUnsignedIntegerTooBig = new VarUnsignedInteger( new UnsignedInteger(231, 12), 12); + assertTrue(false); + } catch(IllegalArgumentException ie) { + //Good! + } + + try { + final VarUnsignedInteger varUnsignedIntegerTooBigAgain = new VarUnsignedInteger( new UnsignedInteger(231, 12), 13); + assertTrue(false); + } catch(IllegalArgumentException ie) { + //Good! + } + + } + + @Test + public void testReadFunctionality() { + final BitInputStream bitInputStreamFirst = new MockBitInputStream("1000000000000111"); + final VarUnsignedInteger varUnsignedIntegerFirst = new VarUnsignedInteger(new UnsignedInteger(0, 12), 8).readFrom(bitInputStreamFirst); + assertEquals(varUnsignedIntegerFirst.value(), 7); + + final BitInputStream bitInputStreamSecond = new MockBitInputStream("00000111"); + final VarUnsignedInteger varUnsignedIntegerSecond = new VarUnsignedInteger(new UnsignedInteger(0, 12), 8).readFrom(bitInputStreamSecond); + assertEquals(varUnsignedIntegerSecond.value(), 7); + + final BitInputStream bitInputStreamThird = new MockBitInputStream("00000111"); + final VarUnsignedInteger varUnsignedIntegerThird = new VarUnsignedInteger(new UnsignedInteger(0, 18), 8).readFrom(bitInputStreamThird); + assertEquals(varUnsignedIntegerThird.value(), 7); + + final BitInputStream bitInputStreamFourth = new MockBitInputStream("1000000000000111"); + final VarUnsignedInteger varUnsignedIntegerFourth = new VarUnsignedInteger(new UnsignedInteger(0, 14), 8).readFrom(bitInputStreamFourth); + assertEquals(varUnsignedIntegerFourth.value(), 7); + } + + @Test + public void testWriteFunctionality() { + final BitOutputStream bitOutputStreamFirst = new MockBitOutputStream(); + new VarUnsignedInteger(new UnsignedInteger(7, 12), 8).writeTo(bitOutputStreamFirst); + assertEquals(bitOutputStreamFirst.toString(), "1000000000000111"); + + final BitOutputStream bitOutputStreamSecond = new MockBitOutputStream(); + new VarUnsignedInteger(new UnsignedInteger(91, 13), 8).writeTo(bitOutputStreamSecond); + assertEquals(bitOutputStreamSecond.toString(), "1000000001011011"); + } + +} diff --git a/src/test/java/org/dcp/test/io/impl/ChannelBitOutputStreamTest.java b/src/test/java/org/dcp/test/io/impl/ChannelBitOutputStreamTest.java index fd0065b..203af23 100644 --- a/src/test/java/org/dcp/test/io/impl/ChannelBitOutputStreamTest.java +++ b/src/test/java/org/dcp/test/io/impl/ChannelBitOutputStreamTest.java @@ -34,10 +34,17 @@ public void testWriteBitsFunctionality() { final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); final WritableByteChannel channel = Channels.newChannel(outputStream); final BitOutputStream bitOutputStream = new ChannelBitOutputStream(channel); - final BitBuffer bitBuffer = new BitBuffer("001001"); + final BitBuffer bitBuffer = new BitBuffer("00100100"); bitOutputStream.writeBits(bitBuffer); - bitOutputStream.flushBits(); assertEquals(outputStream.toByteArray()[0], (byte) 0b00100100); } -} + @Test + public void testCloseFunctionality() { + final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + final WritableByteChannel channel = Channels.newChannel(outputStream); + try(final BitOutputStream bitOutputStream = new ChannelBitOutputStream(channel)) { + } + } + +} \ No newline at end of file diff --git a/src/test/java/org/dcp/test/io/impl/MockBitOutputStreamTest.java b/src/test/java/org/dcp/test/io/impl/MockBitOutputStreamTest.java index 6b952f9..239d21a 100644 --- a/src/test/java/org/dcp/test/io/impl/MockBitOutputStreamTest.java +++ b/src/test/java/org/dcp/test/io/impl/MockBitOutputStreamTest.java @@ -38,6 +38,12 @@ public void testFlushFunctionality(){ bitOutputStream.writeBits(bitBuffer); bitOutputStream.flushBits(); assertEquals(bitOutputStream.toString(), bitBuffer.toString() + "00"); + + final BitOutputStream bitOutputStreamSecond = new MockBitOutputStream(); + final BitBuffer bitBufferSecond = new BitBuffer("00100100"); + bitOutputStreamSecond.writeBits(bitBufferSecond); + bitOutputStreamSecond.flushBits(); + assertEquals(bitOutputStreamSecond.toString(), bitBufferSecond.toString()); } } From 4030dff9a37efed4102d5a35cfeea76463c682f4 Mon Sep 17 00:00:00 2001 From: Karthik Kumar Viswanathan Date: Sun, 9 Feb 2020 17:25:30 -0800 Subject: [PATCH 2/3] Update to Gradle 6.5 --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 58910 bytes gradle/wrapper/gradle-wrapper.properties | 6 +++ gradlew | 53 ++++++++++++++--------- gradlew.bat | 22 +++++++++- 5 files changed, 61 insertions(+), 22 deletions(-) create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties diff --git a/build.gradle b/build.gradle index 2e59aa7..bae6781 100644 --- a/build.gradle +++ b/build.gradle @@ -19,5 +19,5 @@ repositories { } dependencies { - testCompile group: 'junit', name: 'junit', version: '4.12' + testImplementation group: 'junit', name: 'junit', version: '4.12' } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..62d4c053550b91381bbd28b1afc82d634bf73a8a GIT binary patch literal 58910 zcma&ObC74zk}X`WF59+k+qTVL*+!RbS9RI8Z5v&-ZFK4Nn|tqzcjwK__x+Iv5xL`> zj94dg?X`0sMHx^qXds{;KY)OMg#H>35XgTVfq6#vc9ww|9) z@UMfwUqk)B9p!}NrNqTlRO#i!ALOPcWo78-=iy}NsAr~T8T0X0%G{DhX~u-yEwc29WQ4D zuv2j{a&j?qB4wgCu`zOXj!~YpTNFg)TWoV>DhYlR^Gp^rkOEluvxkGLB?!{fD!T@( z%3cy>OkhbIKz*R%uoKqrg1%A?)uTZD&~ssOCUBlvZhx7XHQ4b7@`&sPdT475?*zWy z>xq*iK=5G&N6!HiZaD{NSNhWL;+>Quw_#ZqZbyglna!Fqn3N!$L`=;TFPrhodD-Q` z1l*=DP2gKJP@)cwI@-M}?M$$$%u~=vkeC%>cwR$~?y6cXx-M{=wdT4|3X(@)a|KkZ z`w$6CNS@5gWS7s7P86L<=vg$Mxv$?)vMj3`o*7W4U~*Nden}wz=y+QtuMmZ{(Ir1D zGp)ZsNiy{mS}Au5;(fYf93rs^xvi(H;|H8ECYdC`CiC&G`zw?@)#DjMc7j~daL_A$ z7e3nF2$TKlTi=mOftyFBt8*Xju-OY@2k@f3YBM)-v8+5_o}M?7pxlNn)C0Mcd@87?+AA4{Ti2ptnYYKGp`^FhcJLlT%RwP4k$ad!ho}-^vW;s{6hnjD0*c39k zrm@PkI8_p}mnT&5I@=O1^m?g}PN^8O8rB`;t`6H+?Su0IR?;8txBqwK1Au8O3BZAX zNdJB{bpQWR@J|e=Z>XSXV1DB{uhr3pGf_tb)(cAkp)fS7*Qv))&Vkbb+cvG!j}ukd zxt*C8&RN}5ck{jkw0=Q7ldUp0FQ&Pb_$M7a@^nf`8F%$ftu^jEz36d#^M8Ia{VaTy z5(h$I)*l3i!VpPMW+XGgzL~fcN?{~1QWu9!Gu0jOWWE zNW%&&by0DbXL&^)r-A*7R@;T$P}@3eOj#gqJ!uvTqBL5bupU91UK#d|IdxBUZAeh1 z>rAI#*Y4jv>uhOh7`S@mnsl0g@1C;k$Z%!d*n8#_$)l}-1&z2kr@M+xWoKR z!KySy-7h&Bf}02%JeXmQGjO3ntu={K$jy$rFwfSV8!zqAL_*&e2|CJ06`4&0+ceI026REfNT>JzAdwmIlKLEr2? zaZ#d*XFUN*gpzOxq)cysr&#6zNdDDPH% zd8_>3B}uA7;bP4fKVdd~Og@}dW#74ceETOE- zlZgQqQfEc?-5ly(Z5`L_CCM!&Uxk5#wgo=OLs-kFHFG*cTZ)$VE?c_gQUW&*!2@W2 z7Lq&_Kf88OCo?BHCtwe*&fu&8PQ(R5&lnYo8%+U73U)Ec2&|A)Y~m7(^bh299REPe zn#gyaJ4%o4>diN3z%P5&_aFUmlKytY$t21WGwx;3?UC}vlxi-vdEQgsKQ;=#sJ#ll zZeytjOad$kyON4XxC}frS|Ybh`Yq!<(IrlOXP3*q86ImyV*mJyBn$m~?#xp;EplcM z+6sez%+K}Xj3$YN6{}VL;BZ7Fi|iJj-ywlR+AP8lq~mnt5p_%VmN{Sq$L^z!otu_u znVCl@FgcVXo510e@5(wnko%Pv+^r^)GRh;>#Z(|#cLnu_Y$#_xG&nvuT+~gzJsoSi zBvX`|IS~xaold!`P!h(v|=>!5gk)Q+!0R1Ge7!WpRP{*Ajz$oGG$_?Ajvz6F0X?809o`L8prsJ*+LjlGfSziO;+ zv>fyRBVx#oC0jGK8$%$>Z;0+dfn8x;kHFQ?Rpi7(Rc{Uq{63Kgs{IwLV>pDK7yX-2 zls;?`h!I9YQVVbAj7Ok1%Y+F?CJa-Jl>1x#UVL(lpzBBH4(6v0^4 z3Tf`INjml5`F_kZc5M#^J|f%7Hgxg3#o}Zwx%4l9yYG!WaYUA>+dqpRE3nw#YXIX%= ziH3iYO~jr0nP5xp*VIa#-aa;H&%>{mfAPPlh5Fc!N7^{!z$;p-p38aW{gGx z)dFS62;V;%%fKp&i@+5x=Cn7Q>H`NofJGXmNeh{sOL+Nk>bQJJBw3K*H_$}%*xJM=Kh;s#$@RBR z|75|g85da@#qT=pD777m$wI!Q8SC4Yw3(PVU53bzzGq$IdGQoFb-c_(iA_~qD|eAy z@J+2!tc{|!8fF;%6rY9`Q!Kr>MFwEH%TY0y>Q(D}xGVJM{J{aGN0drG&|1xO!Ttdw z-1^gQ&y~KS5SeslMmoA$Wv$ly={f}f9<{Gm!8ycp*D9m*5Ef{ymIq!MU01*)#J1_! zM_i4{LYButqlQ>Q#o{~W!E_#(S=hR}kIrea_67Z5{W>8PD>g$f;dTvlD=X@T$8D0;BWkle@{VTd&D5^)U>(>g(jFt4lRV6A2(Te->ooI{nk-bZ(gwgh zaH4GT^wXPBq^Gcu%xW#S#p_&x)pNla5%S5;*OG_T^PhIIw1gXP&u5c;{^S(AC*+$> z)GuVq(FT@zq9;i{*9lEsNJZ)??BbSc5vF+Kdh-kL@`(`l5tB4P!9Okin2!-T?}(w% zEpbEU67|lU#@>DppToestmu8Ce=gz=e#V+o)v)#e=N`{$MI5P0O)_fHt1@aIC_QCv=FO`Qf=Ga%^_NhqGI)xtN*^1n{ z&vgl|TrKZ3Vam@wE0p{c3xCCAl+RqFEse@r*a<3}wmJl-hoJoN<|O2zcvMRl<#BtZ z#}-bPCv&OTw`GMp&n4tutf|er`@#d~7X+);##YFSJ)BitGALu}-N*DJdCzs(cQ?I- z6u(WAKH^NUCcOtpt5QTsQRJ$}jN28ZsYx+4CrJUQ%egH zo#tMoywhR*oeIkS%}%WUAIbM`D)R6Ya&@sZvvUEM7`fR0Ga03*=qaEGq4G7-+30Ck zRkje{6A{`ebq?2BTFFYnMM$xcQbz0nEGe!s%}O)m={`075R0N9KTZ>vbv2^eml>@}722%!r#6Wto}?vNst? zs`IasBtcROZG9+%rYaZe^=5y3chDzBf>;|5sP0!sP(t^= z^~go8msT@|rp8LJ8km?4l?Hb%o10h7(ixqV65~5Y>n_zG3AMqM3UxUNj6K-FUgMT7 z*Dy2Y8Ws+%`Z*~m9P zCWQ8L^kA2$rf-S@qHow$J86t)hoU#XZ2YK~9GXVR|*`f6`0&8j|ss_Ai-x=_;Df^*&=bW$1nc{Gplm zF}VF`w)`5A;W@KM`@<9Bw_7~?_@b{Z`n_A6c1AG#h#>Z$K>gX6reEZ*bZRjCup|0# zQ{XAb`n^}2cIwLTN%5Ix`PB*H^(|5S{j?BwItu+MS`1)VW=TnUtt6{3J!WR`4b`LW z?AD#ZmoyYpL=903q3LSM=&5eNP^dwTDRD~iP=}FXgZ@2WqfdyPYl$9do?wX{RU*$S zgQ{OqXK-Yuf4+}x6P#A*la&^G2c2TC;aNNZEYuB(f25|5eYi|rd$;i0qk7^3Ri8of ziP~PVT_|4$n!~F-B1_Et<0OJZ*e+MN;5FFH`iec(lHR+O%O%_RQhvbk-NBQ+$)w{D+dlA0jxI;z|P zEKW`!X)${xzi}Ww5G&@g0akBb_F`ziv$u^hs0W&FXuz=Ap>SUMw9=M?X$`lgPRq11 zqq+n44qL;pgGO+*DEc+Euv*j(#%;>p)yqdl`dT+Og zZH?FXXt`<0XL2@PWYp|7DWzFqxLK)yDXae&3P*#+f+E{I&h=$UPj;ey9b`H?qe*Oj zV|-qgI~v%&oh7rzICXfZmg$8$B|zkjliQ=e4jFgYCLR%yi!9gc7>N z&5G#KG&Hr+UEfB;M(M>$Eh}P$)<_IqC_WKOhO4(cY@Gn4XF(#aENkp&D{sMQgrhDT zXClOHrr9|POHqlmm+*L6CK=OENXbZ+kb}t>oRHE2xVW<;VKR@ykYq04LM9L-b;eo& zl!QQo!Sw{_$-qosixZJWhciN>Gbe8|vEVV2l)`#5vKyrXc6E`zmH(76nGRdL)pqLb@j<&&b!qJRLf>d`rdz}^ZSm7E;+XUJ ziy;xY&>LM?MA^v0Fu8{7hvh_ynOls6CI;kQkS2g^OZr70A}PU;i^~b_hUYN1*j-DD zn$lHQG9(lh&sDii)ip*{;Sb_-Anluh`=l~qhqbI+;=ZzpFrRp&T+UICO!OoqX@Xr_ z32iJ`xSpx=lDDB_IG}k+GTYG@K8{rhTS)aoN8D~Xfe?ul&;jv^E;w$nhu-ICs&Q)% zZ=~kPNZP0-A$pB8)!`TEqE`tY3Mx^`%O`?EDiWsZpoP`e-iQ#E>fIyUx8XN0L z@S-NQwc;0HjSZKWDL}Au_Zkbh!juuB&mGL0=nO5)tUd_4scpPy&O7SNS^aRxUy0^< zX}j*jPrLP4Pa0|PL+nrbd4G;YCxCK-=G7TG?dby~``AIHwxqFu^OJhyIUJkO0O<>_ zcpvg5Fk$Wpj}YE3;GxRK67P_Z@1V#+pu>pRj0!mFf(m_WR3w3*oQy$s39~U7Cb}p(N&8SEwt+)@%o-kW9Ck=^?tvC2$b9% ze9(Jn+H`;uAJE|;$Flha?!*lJ0@lKfZM>B|c)3lIAHb;5OEOT(2453m!LgH2AX=jK zQ93An1-#l@I@mwB#pLc;M7=u6V5IgLl>E%gvE|}Hvd4-bE1>gs(P^C}gTv*&t>W#+ zASLRX$y^DD3Jrht zwyt`yuA1j(TcP*0p*Xkv>gh+YTLrcN_HuaRMso~0AJg`^nL#52dGBzY+_7i)Ud#X) zVwg;6$WV20U2uyKt8<)jN#^1>PLg`I`@Mmut*Zy!c!zshSA!e^tWVoKJD%jN&ml#{ z@}B$j=U5J_#rc%T7(DGKF+WwIblEZ;Vq;CsG~OKxhWYGJx#g7fxb-_ya*D0=_Ys#f zhXktl=Vnw#Z_neW>Xe#EXT(4sT^3p6srKby4Ma5LLfh6XrHGFGgM;5Z}jv-T!f~=jT&n>Rk z4U0RT-#2fsYCQhwtW&wNp6T(im4dq>363H^ivz#>Sj;TEKY<)dOQU=g=XsLZhnR>e zd}@p1B;hMsL~QH2Wq>9Zb; zK`0`09fzuYg9MLJe~cdMS6oxoAD{kW3sFAqDxvFM#{GpP^NU@9$d5;w^WgLYknCTN z0)N425mjsJTI@#2kG-kB!({*+S(WZ-{SckG5^OiyP%(6DpRsx60$H8M$V65a_>oME z^T~>oG7r!ew>Y)&^MOBrgc-3PezgTZ2xIhXv%ExMFgSf5dQbD=Kj*!J4k^Xx!Z>AW ziZfvqJvtm|EXYsD%A|;>m1Md}j5f2>kt*gngL=enh<>#5iud0dS1P%u2o+>VQ{U%(nQ_WTySY(s#~~> zrTsvp{lTSup_7*Xq@qgjY@1#bisPCRMMHnOL48qi*jQ0xg~TSW%KMG9zN1(tjXix()2$N}}K$AJ@GUth+AyIhH6Aeh7qDgt#t*`iF5#A&g4+ zWr0$h9Zx6&Uo2!Ztcok($F>4NA<`dS&Js%L+67FT@WmI)z#fF~S75TUut%V($oUHw z$IJsL0X$KfGPZYjB9jaj-LaoDD$OMY4QxuQ&vOGo?-*9@O!Nj>QBSA6n$Lx|^ zky)4+sy{#6)FRqRt6nM9j2Lzba!U;aL%ZcG&ki1=3gFx6(&A3J-oo|S2_`*w9zT)W z4MBOVCp}?4nY)1))SOX#6Zu0fQQ7V{RJq{H)S#;sElY)S)lXTVyUXTepu4N)n85Xo zIpWPT&rgnw$D2Fsut#Xf-hO&6uA0n~a;a3!=_!Tq^TdGE&<*c?1b|PovU}3tfiIUu z){4W|@PY}zJOXkGviCw^x27%K_Fm9GuKVpd{P2>NJlnk^I|h2XW0IO~LTMj>2<;S* zZh2uRNSdJM$U$@=`zz}%;ucRx{aKVxxF7?0hdKh6&GxO6f`l2kFncS3xu0Ly{ew0& zeEP*#lk-8-B$LD(5yj>YFJ{yf5zb41PlW7S{D9zC4Aa4nVdkDNH{UsFJp)q-`9OYt zbOKkigbmm5hF?tttn;S4g^142AF^`kiLUC?e7=*JH%Qe>uW=dB24NQa`;lm5yL>Dyh@HbHy-f%6Vz^ zh&MgwYsh(z#_fhhqY$3*f>Ha}*^cU-r4uTHaT?)~LUj5``FcS46oyoI5F3ZRizVD% zPFY(_S&5GN8$Nl2=+YO6j4d|M6O7CmUyS&}m4LSn6}J`$M0ZzT&Ome)ZbJDFvM&}A zZdhDn(*viM-JHf84$!I(8eakl#zRjJH4qfw8=60 z11Ely^FyXjVvtv48-Fae7p=adlt9_F^j5#ZDf7)n!#j?{W?@j$Pi=k`>Ii>XxrJ?$ z^bhh|X6qC8d{NS4rX5P!%jXy=>(P+r9?W(2)|(=a^s^l~x*^$Enw$~u%WRuRHHFan{X|S;FD(Mr z@r@h^@Bs#C3G;~IJMrERd+D!o?HmFX&#i|~q(7QR3f8QDip?ms6|GV_$86aDb|5pc?_-jo6vmWqYi{P#?{m_AesA4xX zi&ki&lh0yvf*Yw~@jt|r-=zpj!bw<6zI3Aa^Wq{|*WEC}I=O!Re!l~&8|Vu<$yZ1p zs-SlwJD8K!$(WWyhZ+sOqa8cciwvyh%zd`r$u;;fsHn!hub0VU)bUv^QH?x30#;tH zTc_VbZj|prj7)d%ORU;Vs{#ERb>K8>GOLSImnF7JhR|g$7FQTU{(a7RHQ*ii-{U3X z^7+vM0R$8b3k1aSU&kxvVPfOz3~)0O2iTYinV9_5{pF18j4b{o`=@AZIOAwwedB2@ ztXI1F04mg{<>a-gdFoRjq$6#FaevDn$^06L)k%wYq03&ysdXE+LL1#w$rRS1Y;BoS zH1x}{ms>LHWmdtP(ydD!aRdAa(d@csEo z0EF9L>%tppp`CZ2)jVb8AuoYyu;d^wfje6^n6`A?6$&%$p>HcE_De-Zh)%3o5)LDa zskQ}%o7?bg$xUj|n8gN9YB)z!N&-K&!_hVQ?#SFj+MpQA4@4oq!UQ$Vm3B`W_Pq3J z=ngFP4h_y=`Iar<`EESF9){%YZVyJqLPGq07TP7&fSDmnYs2NZQKiR%>){imTBJth zPHr@p>8b+N@~%43rSeNuOz;rgEm?14hNtI|KC6Xz1d?|2J`QS#`OW7gTF_;TPPxu@ z)9J9>3Lx*bc>Ielg|F3cou$O0+<b34_*ZJhpS&$8DP>s%47a)4ZLw`|>s=P_J4u z?I_%AvR_z8of@UYWJV?~c4Yb|A!9n!LEUE6{sn@9+D=0w_-`szJ_T++x3MN$v-)0d zy`?1QG}C^KiNlnJBRZBLr4G~15V3$QqC%1G5b#CEB0VTr#z?Ug%Jyv@a`QqAYUV~^ zw)d|%0g&kl{j#FMdf$cn(~L@8s~6eQ)6{`ik(RI(o9s0g30Li{4YoxcVoYd+LpeLz zai?~r)UcbYr@lv*Z>E%BsvTNd`Sc?}*}>mzJ|cr0Y(6rA7H_6&t>F{{mJ^xovc2a@ zFGGDUcGgI-z6H#o@Gj29C=Uy{wv zQHY2`HZu8+sBQK*_~I-_>fOTKEAQ8_Q~YE$c?cSCxI;vs-JGO`RS464Ft06rpjn+a zqRS0Y3oN(9HCP@{J4mOWqIyD8PirA!pgU^Ne{LHBG;S*bZpx3|JyQDGO&(;Im8!ed zNdpE&?3U?E@O~>`@B;oY>#?gXEDl3pE@J30R1;?QNNxZ?YePc)3=NS>!STCrXu*lM z69WkLB_RBwb1^-zEm*tkcHz3H;?v z;q+x0Jg$|?5;e1-kbJnuT+^$bWnYc~1qnyVTKh*cvM+8yJT-HBs1X@cD;L$su65;i z2c1MxyL~NuZ9+)hF=^-#;dS#lFy^Idcb>AEDXu1!G4Kd8YPy~0lZz$2gbv?su}Zn} zGtIbeYz3X8OA9{sT(aleold_?UEV{hWRl(@)NH6GFH@$<8hUt=dNte%e#Jc>7u9xi zuqv!CRE@!fmZZ}3&@$D>p0z=*dfQ_=IE4bG0hLmT@OP>x$e`qaqf_=#baJ8XPtOpWi%$ep1Y)o2(sR=v)M zt(z*pGS$Z#j_xq_lnCr+x9fwiT?h{NEn#iK(o)G&Xw-#DK?=Ms6T;%&EE${Gq_%99 z6(;P~jPKq9llc+cmI(MKQ6*7PcL)BmoI}MYFO)b3-{j>9FhNdXLR<^mnMP`I7z0v` zj3wxcXAqi4Z0kpeSf>?V_+D}NULgU$DBvZ^=0G8Bypd7P2>;u`yW9`%4~&tzNJpgp zqB+iLIM~IkB;ts!)exn643mAJ8-WlgFE%Rpq!UMYtB?$5QAMm)%PT0$$2{>Yu7&U@ zh}gD^Qdgu){y3ANdB5{75P;lRxSJPSpQPMJOiwmpMdT|?=q;&$aTt|dl~kvS z+*i;6cEQJ1V`R4Fd>-Uzsc=DPQ7A7#VPCIf!R!KK%LM&G%MoZ0{-8&99H!|UW$Ejv zhDLX3ESS6CgWTm#1ZeS2HJb`=UM^gsQ84dQpX(ESWSkjn>O zVxg%`@mh(X9&&wN$lDIc*@>rf?C0AD_mge3f2KkT6kGySOhXqZjtA?5z`vKl_{(5g z&%Y~9p?_DL{+q@siT~*3Q*$nWXQfNN;%s_eHP_A;O`N`SaoB z6xYR;z_;HQ2xAa9xKgx~2f2xEKiEDpGPH1d@||v#f#_Ty6_gY>^oZ#xac?pc-F`@ z*}8sPV@xiz?efDMcmmezYVw~qw=vT;G1xh+xRVBkmN66!u(mRG3G6P#v|;w@anEh7 zCf94arw%YB*=&3=RTqX?z4mID$W*^+&d6qI*LA-yGme;F9+wTsNXNaX~zl2+qIK&D-aeN4lr0+yP;W>|Dh?ms_ogT{DT+ ztXFy*R7j4IX;w@@R9Oct5k2M%&j=c_rWvoul+` z<18FH5D@i$P38W9VU2(EnEvlJ(SHCqTNBa)brkIjGP|jCnK&Qi%97tikU}Y#3L?s! z2ujL%YiHO-#!|g5066V01hgT#>fzls7P>+%D~ogOT&!Whb4iF=CnCto82Yb#b`YoVsj zS2q^W0Rj!RrM@=_GuPQy5*_X@Zmu`TKSbqEOP@;Ga&Rrr>#H@L41@ZX)LAkbo{G8+ z;!5EH6vv-ip0`tLB)xUuOX(*YEDSWf?PIxXe`+_B8=KH#HFCfthu}QJylPMTNmoV; zC63g%?57(&osaH^sxCyI-+gwVB|Xs2TOf=mgUAq?V~N_5!4A=b{AXbDae+yABuuu3B_XSa4~c z1s-OW>!cIkjwJf4ZhvT|*IKaRTU)WAK=G|H#B5#NB9<{*kt?7`+G*-^<)7$Iup@Um z7u*ABkG3F*Foj)W9-I&@BrN8(#$7Hdi`BU#SR1Uz4rh&=Ey!b76Qo?RqBJ!U+rh(1 znw@xw5$)4D8OWtB_^pJO*d~2Mb-f~>I!U#*=Eh*xa6$LX?4Evp4%;ENQR!mF4`f7F zpG!NX=qnCwE8@NAbQV`*?!v0;NJ(| zBip8}VgFVsXFqslXUV>_Z>1gmD(7p#=WACXaB|Y`=Kxa=p@_ALsL&yAJ`*QW^`2@% zW7~Yp(Q@ihmkf{vMF?kqkY%SwG^t&CtfRWZ{syK@W$#DzegcQ1>~r7foTw3^V1)f2Tq_5f$igmfch;8 zT-<)?RKcCdQh6x^mMEOS;4IpQ@F2q-4IC4%*dU@jfHR4UdG>Usw4;7ESpORL|2^#jd+@zxz{(|RV*1WKrw-)ln*8LnxVkKDfGDHA%7`HaiuvhMu%*mY9*Ya{Ti#{DW?i0 zXXsp+Bb(_~wv(3t70QU3a$*<$1&zm1t++x#wDLCRI4K)kU?Vm9n2c0m@TyUV&&l9%}fulj!Z9)&@yIcQ3gX}l0b1LbIh4S z5C*IDrYxR%qm4LVzSk{0;*npO_SocYWbkAjA6(^IAwUnoAzw_Uo}xYFo?Y<-4Zqec z&k7HtVlFGyt_pA&kX%P8PaRD8y!Wsnv}NMLNLy-CHZf(ObmzV|t-iC#@Z9*d-zUsx zxcYWw{H)nYXVdnJu5o-U+fn~W z-$h1ax>h{NlWLA7;;6TcQHA>UJB$KNk74T1xNWh9)kwK~wX0m|Jo_Z;g;>^E4-k4R zRj#pQb-Hg&dAh}*=2;JY*aiNZzT=IU&v|lQY%Q|=^V5pvTR7^t9+@+ST&sr!J1Y9a z514dYZn5rg6@4Cy6P`-?!3Y& z?B*5zw!mTiD2)>f@3XYrW^9V-@%YFkE_;PCyCJ7*?_3cR%tHng9%ZpIU}LJM=a+0s z(SDDLvcVa~b9O!cVL8)Q{d^R^(bbG=Ia$)dVN_tGMee3PMssZ7Z;c^Vg_1CjZYTnq z)wnF8?=-MmqVOMX!iE?YDvHCN?%TQtKJMFHp$~kX4}jZ;EDqP$?jqJZjoa2PM@$uZ zF4}iab1b5ep)L;jdegC3{K4VnCH#OV;pRcSa(&Nm50ze-yZ8*cGv;@+N+A?ncc^2z9~|(xFhwOHmPW@ zR5&)E^YKQj@`g=;zJ_+CLamsPuvppUr$G1#9urUj+p-mPW_QSSHkPMS!52t>Hqy|g z_@Yu3z%|wE=uYq8G>4`Q!4zivS}+}{m5Zjr7kMRGn_p&hNf|pc&f9iQ`^%78rl#~8 z;os@rpMA{ZioY~(Rm!Wf#Wx##A0PthOI341QiJ=G*#}pDAkDm+{0kz&*NB?rC0-)glB{0_Tq*^o zVS1>3REsv*Qb;qg!G^9;VoK)P*?f<*H&4Su1=}bP^Y<2PwFpoqw#up4IgX3L z`w~8jsFCI3k~Y9g(Y9Km`y$0FS5vHb)kb)Jb6q-9MbO{Hbb zxg?IWQ1ZIGgE}wKm{axO6CCh~4DyoFU+i1xn#oyfe+<{>=^B5tm!!*1M?AW8c=6g+%2Ft97_Hq&ZmOGvqGQ!Bn<_Vw`0DRuDoB6q8ME<;oL4kocr8E$NGoLI zXWmI7Af-DR|KJw!vKp2SI4W*x%A%5BgDu%8%Iato+pWo5`vH@!XqC!yK}KLzvfS(q z{!y(S-PKbk!qHsgVyxKsQWk_8HUSSmslUA9nWOjkKn0%cwn%yxnkfxn?Y2rysXKS=t-TeI%DN$sQ{lcD!(s>(4y#CSxZ4R} zFDI^HPC_l?uh_)-^ppeYRkPTPu~V^0Mt}#jrTL1Q(M;qVt4zb(L|J~sxx7Lva9`mh zz!#A9tA*6?q)xThc7(gB2Ryam$YG4qlh00c}r&$y6u zIN#Qxn{7RKJ+_r|1G1KEv!&uKfXpOVZ8tK{M775ws%nDyoZ?bi3NufNbZs)zqXiqc zqOsK@^OnlFMAT&mO3`@3nZP$3lLF;ds|;Z{W(Q-STa2>;)tjhR17OD|G>Q#zJHb*> zMO<{WIgB%_4MG0SQi2;%f0J8l_FH)Lfaa>*GLobD#AeMttYh4Yfg22@q4|Itq};NB z8;o*+@APqy@fPgrc&PTbGEwdEK=(x5K!If@R$NiO^7{#j9{~w=RBG)ZkbOw@$7Nhl zyp{*&QoVBd5lo{iwl2gfyip@}IirZK;ia(&ozNl!-EEYc=QpYH_= zJkv7gA{!n4up6$CrzDJIBAdC7D5D<_VLH*;OYN>_Dx3AT`K4Wyx8Tm{I+xplKP6k7 z2sb!i7)~%R#J0$|hK?~=u~rnH7HCUpsQJujDDE*GD`qrWWog+C+E~GGy|Hp_t4--} zrxtrgnPh}r=9o}P6jpAQuDN}I*GI`8&%Lp-C0IOJt#op)}XSr!ova@w{jG2V=?GXl3zEJJFXg)U3N>BQP z*Lb@%Mx|Tu;|u>$-K(q^-HG!EQ3o93%w(A7@ngGU)HRWoO&&^}U$5x+T&#zri>6ct zXOB#EF-;z3j311K`jrYyv6pOPF=*`SOz!ack=DuEi({UnAkL5H)@R?YbRKAeP|06U z?-Ns0ZxD0h9D8)P66Sq$w-yF+1hEVTaul%&=kKDrQtF<$RnQPZ)ezm1`aHIjAY=!S z`%vboP`?7mItgEo4w50C*}Ycqp9_3ZEr^F1;cEhkb`BNhbc6PvnXu@wi=AoezF4~K zkxx%ps<8zb=wJ+9I8o#do)&{(=yAlNdduaDn!=xGSiuo~fLw~Edw$6;l-qaq#Z7?# zGrdU(Cf-V@$x>O%yRc6!C1Vf`b19ly;=mEu8u9|zitcG^O`lbNh}k=$%a)UHhDwTEKis2yc4rBGR>l*(B$AC7ung&ssaZGkY-h(fpwcPyJSx*9EIJMRKbMP9}$nVrh6$g-Q^5Cw)BeWqb-qi#37ZXKL!GR;ql)~ z@PP*-oP?T|ThqlGKR84zi^CN z4TZ1A)7vL>ivoL2EU_~xl-P{p+sE}9CRwGJDKy{>0KP+gj`H9C+4fUMPnIB1_D`A- z$1`G}g0lQmqMN{Y&8R*$xYUB*V}dQPxGVZQ+rH!DVohIoTbh%#z#Tru%Px@C<=|og zGDDwGq7yz`%^?r~6t&>x*^We^tZ4!E4dhwsht#Pb1kCY{q#Kv;z%Dp#Dq;$vH$-(9 z8S5tutZ}&JM2Iw&Y-7KY4h5BBvS=Ove0#+H2qPdR)WyI zYcj)vB=MA{7T|3Ij_PN@FM@w(C9ANBq&|NoW30ccr~i#)EcH)T^3St~rJ0HKKd4wr z@_+132;Bj+>UC@h)Ap*8B4r5A1lZ!Dh%H7&&hBnlFj@eayk=VD*i5AQc z$uN8YG#PL;cuQa)Hyt-}R?&NAE1QT>svJDKt*)AQOZAJ@ zyxJoBebiobHeFlcLwu_iI&NEZuipnOR;Tn;PbT1Mt-#5v5b*8ULo7m)L-eti=UcGf zRZXidmxeFgY!y80-*PH-*=(-W+fK%KyUKpg$X@tuv``tXj^*4qq@UkW$ZrAo%+hay zU@a?z&2_@y)o@D!_g>NVxFBO!EyB&6Z!nd4=KyDP^hl!*(k{dEF6@NkXztO7gIh zQ&PC+p-8WBv;N(rpfKdF^@Z~|E6pa)M1NBUrCZvLRW$%N%xIbv^uv?=C!=dDVq3%* zgvbEBnG*JB*@vXx8>)7XL*!{1Jh=#2UrByF7U?Rj_}VYw88BwqefT_cCTv8aTrRVjnn z1HNCF=44?*&gs2`vCGJVHX@kO z240eo#z+FhI0=yy6NHQwZs}a+J~4U-6X`@ zZ7j+tb##m`x%J66$a9qXDHG&^kp|GkFFMmjD(Y-k_ClY~N$H|n@NkSDz=gg?*2ga5 z)+f)MEY>2Lp15;~o`t`qj;S>BaE;%dv@Ux11yq}I(k|o&`5UZFUHn}1kE^gIK@qV& z!S2IhyU;->VfA4Qb}m7YnkIa9%z{l~iPWo2YPk-`hy2-Eg=6E$21plQA5W2qMZDFU z-a-@Dndf%#on6chT`dOKnU9}BJo|kJwgGC<^nfo34zOKH96LbWY7@Wc%EoFF=}`VU zksP@wd%@W;-p!e^&-)N7#oR331Q)@9cx=mOoU?_Kih2!Le*8fhsZ8Qvo6t2vt+UOZ zw|mCB*t2%z21YqL>whu!j?s~}-L`OS+jdg1(XnmYw$rg~r(?5Y+qTg`$F}q3J?GtL z@BN&8#`u2RqkdG4yGGTus@7U_%{6C{XAhFE!2SelH?KtMtX@B1GBhEIDL-Bj#~{4! zd}p7!#XE9Lt;sy@p5#Wj*jf8zGv6tTotCR2X$EVOOup;GnRPRVU5A6N@Lh8?eA7k? zn~hz&gY;B0ybSpF?qwQ|sv_yO=8}zeg2$0n3A8KpE@q26)?707pPw?H76lCpjp=5r z6jjp|auXJDnW}uLb6d7rsxekbET9(=zdTqC8(F5@NNqII2+~yB;X5iJNQSiv`#ozm zf&p!;>8xAlwoxUC3DQ#!31ylK%VrcwS<$WeCY4V63V!|221oj+5#r}fGFQ}|uwC0) zNl8(CF}PD`&Sj+p{d!B&&JtC+VuH z#>US`)YQrhb6lIAYb08H22y(?)&L8MIQsA{26X`R5Km{YU)s!x(&gIsjDvq63@X`{ z=7{SiH*_ZsPME#t2m|bS76Uz*z{cpp1m|s}HIX}Ntx#v7Eo!1%G9__4dGSGl`p+xi zZ!VK#Qe;Re=9bqXuW+0DSP{uZ5-QXrNn-7qW19K0qU}OhVru7}3vqsG?#D67 zb}crN;QwsH*vymw(maZr_o|w&@sQki(X+D)gc5Bt&@iXisFG;eH@5d43~Wxq|HO(@ zV-rip4n#PEkHCWCa5d?@cQp^B;I-PzOfag|t-cuvTapQ@MWLmh*41NH`<+A+JGyKX zyYL6Ba7qqa5j@3lOk~`OMO7f0!@FaOeZxkbG@vXP(t3#U*fq8=GAPqUAS>vW2uxMk{a(<0=IxB;# zMW;M+owrHaZBp`3{e@7gJCHP!I(EeyGFF;pdFPdeP+KphrulPSVidmg#!@W`GpD&d z9p6R`dpjaR2E1Eg)Ws{BVCBU9-aCgN57N~uLvQZH`@T+2eOBD%73rr&sV~m#2~IZx zY_8f8O;XLu2~E3JDXnGhFvsyb^>*!D>5EtlKPe%kOLv6*@=Jpci`8h0z?+fbBUg_7 zu6DjqO=$SjAv{|Om5)nz41ZkS4E_|fk%NDY509VV5yNeo%O|sb>7C#wj8mL9cEOFh z>nDz%?vb!h*!0dHdnxDA>97~EoT~!N40>+)G2CeYdOvJr5^VnkGz)et&T9hrD(VAgCAJjQ7V$O?csICB*HFd^k@$M5*v$PZJD-OVL?Ze(U=XGqZPVG8JQ z<~ukO%&%nNXYaaRibq#B1KfW4+XMliC*Tng2G(T1VvP;2K~;b$EAqthc${gjn_P!b zs62UT(->A>!ot}cJXMZHuy)^qfqW~xO-In2);e>Ta{LD6VG2u&UT&a@>r-;4<)cJ9 zjpQThb4^CY)Ev0KR7TBuT#-v}W?Xzj{c7$S5_zJA57Qf=$4^npEjl9clH0=jWO8sX z3Fuu0@S!WY>0XX7arjH`?)I<%2|8HfL!~#c+&!ZVmhbh`wbzy0Ux|Jpy9A{_7GGB0 zadZ48dW0oUwUAHl%|E-Q{gA{z6TXsvU#Hj09<7i)d}wa+Iya)S$CVwG{4LqtB>w%S zKZx(QbV7J9pYt`W4+0~f{hoo5ZG<0O&&5L57oF%hc0xGJ@Zrg_D&lNO=-I^0y#3mxCSZFxN2-tN_mU@7<@PnWG?L5OSqkm8TR!`| zRcTeWH~0z1JY^%!N<(TtxSP5^G9*Vw1wub`tC-F`=U)&sJVfvmh#Pi`*44kSdG};1 zJbHOmy4Ot|%_?@$N?RA9fF?|CywR8Sf(SCN_luM8>(u0NSEbKUy7C(Sk&OuWffj)f za`+mo+kM_8OLuCUiA*CNE|?jra$M=$F3t+h-)?pXz&r^F!ck;r##`)i)t?AWq-9A9 zSY{m~TC1w>HdEaiR*%j)L);H{IULw)uxDO>#+WcBUe^HU)~L|9#0D<*Ld459xTyew zbh5vCg$a>`RCVk)#~ByCv@Ce!nm<#EW|9j><#jQ8JfTmK#~jJ&o0Fs9jz0Ux{svdM4__<1 zrb>H(qBO;v(pXPf5_?XDq!*3KW^4>(XTo=6O2MJdM^N4IIcYn1sZZpnmMAEdt}4SU zPO54j2d|(xJtQ9EX-YrlXU1}6*h{zjn`in-N!Ls}IJsG@X&lfycsoCemt_Ym(PXhv zc*QTnkNIV=Ia%tg%pwJtT^+`v8ng>;2~ps~wdqZSNI7+}-3r+#r6p`8*G;~bVFzg= z!S3&y)#iNSUF6z;%o)%h!ORhE?CUs%g(k2a-d576uOP2@QwG-6LT*G!I$JQLpd`cz z-2=Brr_+z96a0*aIhY2%0(Sz=|D`_v_7h%Yqbw2)8@1DwH4s*A82krEk{ zoa`LbCdS)R?egRWNeHV8KJG0Ypy!#}kslun?67}^+J&02!D??lN~t@;h?GS8#WX`)6yC**~5YNhN_Hj}YG<%2ao^bpD8RpgV|V|GQwlL27B zEuah|)%m1s8C6>FLY0DFe9Ob66fo&b8%iUN=y_Qj;t3WGlNqP9^d#75ftCPA*R4E8 z)SWKBKkEzTr4JqRMEs`)0;x8C35yRAV++n(Cm5++?WB@ya=l8pFL`N0ag`lWhrYo3 zJJ$< zQ*_YAqIGR*;`VzAEx1Pd4b3_oWtdcs7LU2#1#Ls>Ynvd8k^M{Ef?8`RxA3!Th-?ui{_WJvhzY4FiPxA?E4+NFmaC-Uh*a zeLKkkECqy>Qx&1xxEhh8SzMML=8VP}?b*sgT9ypBLF)Zh#w&JzP>ymrM?nnvt!@$2 zh>N$Q>mbPAC2kNd&ab;FkBJ}39s*TYY0=@e?N7GX>wqaM>P=Y12lciUmve_jMF0lY zBfI3U2{33vWo(DiSOc}!5##TDr|dgX1Uojq9!vW3$m#zM_83EGsP6&O`@v-PDdO3P z>#!BEbqpOXd5s?QNnN!p+92SHy{sdpePXHL{d@c6UilT<#~I!tH$S(~o}c#(j<2%! zQvm}MvAj-95Ekx3D4+|e%!?lO(F+DFw9bxb-}rsWQl)b44###eUg4N?N-P(sFH2hF z`{zu?LmAxn2=2wCE8?;%ZDi#Y;Fzp+RnY8fWlzVz_*PDO6?Je&aEmuS>=uCXgdP6r zoc_JB^TA~rU5*geh{G*gl%_HnISMS~^@{@KVC;(aL^ZA-De+1zwUSXgT>OY)W?d6~ z72znET0m`53q%AVUcGraYxIcAB?OZA8AT!uK8jU+=t;WneL~|IeQ>$*dWa#x%rB(+ z5?xEkZ&b{HsZ4Ju9TQ|)c_SIp`7r2qMJgaglfSBHhl)QO1aNtkGr0LUn{@mvAt=}nd7#>7ru}&I)FNsa*x?Oe3-4G`HcaR zJ}c%iKlwh`x)yX1vBB;-Nr=7>$~(u=AuPX2#&Eh~IeFw%afU+U)td0KC!pHd zyn+X$L|(H3uNit-bpn7%G%{&LsAaEfEsD?yM<;U2}WtD4KuVKuX=ec9X zIe*ibp1?$gPL7<0uj*vmj2lWKe`U(f9E{KVbr&q*RsO;O>K{i-7W)8KG5~~uS++56 zm@XGrX@x+lGEjDQJp~XCkEyJG5Y57omJhGN{^2z5lj-()PVR&wWnDk2M?n_TYR(gM zw4kQ|+i}3z6YZq8gVUN}KiYre^sL{ynS}o{z$s&I z{(rWaLXxcQ=MB(Cz7W$??Tn*$1y(7XX)tv;I-{7F$fPB%6YC7>-Dk#=Y8o1=&|>t5 zV_VVts>Eb@)&4%m}!K*WfLoLl|3FW)V~E1Z!yu`Sn+bAP5sRDyu7NEbLt?khAyz-ZyL-}MYb&nQ zU16f@q7E1rh!)d%f^tTHE3cVoa%Xs%rKFc|temN1sa)aSlT*)*4k?Z>b3NP(IRXfq zlB^#G6BDA1%t9^Nw1BD>lBV(0XW5c?l%vyB3)q*;Z5V~SU;HkN;1kA3Nx!$!9wti= zB8>n`gt;VlBt%5xmDxjfl0>`K$fTU-C6_Z;!A_liu0@Os5reMLNk;jrlVF^FbLETI zW+Z_5m|ozNBn7AaQ<&7zk}(jmEdCsPgmo%^GXo>YYt82n&7I-uQ%A;k{nS~VYGDTn zlr3}HbWQG6xu8+bFu^9%%^PYCbkLf=*J|hr>Sw+#l(Y#ZGKDufa#f-f0k-{-XOb4i zwVG1Oa0L2+&(u$S7TvedS<1m45*>a~5tuOZ;3x%!f``{=2QQlJk|b4>NpD4&L+xI+ z+}S(m3}|8|Vv(KYAGyZK5x*sgwOOJklN0jsq|BomM>OuRDVFf_?cMq%B*iQ*&|vS9 zVH7Kh)SjrCBv+FYAE=$0V&NIW=xP>d-s7@wM*sdfjVx6-Y@=~>rz%2L*rKp|*WXIz z*vR^4tV&7MQpS9%{9b*>E9d_ls|toL7J|;srnW{l-}1gP_Qr-bBHt=}PL@WlE|&KH zCUmDLZb%J$ZzNii-5VeygOM?K8e$EcK=z-hIk63o4y63^_*RdaitO^THC{boKstphXZ2Z+&3ToeLQUG(0Frs?b zCxB+65h7R$+LsbmL51Kc)pz_`YpGEzFEclzb=?FJ=>rJwgcp0QH-UuKRS1*yCHsO) z-8t?Zw|6t($Eh&4K+u$I7HqVJBOOFCRcmMMH};RX_b?;rnk`rz@vxT_&|6V@q0~Uk z9ax|!pA@Lwn8h7syrEtDluZ6G!;@=GL> zse#PRQrdDs=qa_v@{Wv(3YjYD0|qocDC;-F~&{oaTP?@pi$n z1L6SlmFU2~%)M^$@C(^cD!y)-2SeHo3t?u3JiN7UBa7E2 z;<+_A$V084@>&u)*C<4h7jw9joHuSpVsy8GZVT;(>lZ(RAr!;)bwM~o__Gm~exd`K zKEgh2)w?ReH&syI`~;Uo4`x4$&X+dYKI{e`dS~bQuS|p zA`P_{QLV3r$*~lb=9vR^H0AxK9_+dmHX}Y} zIV*#65%jRWem5Z($ji{!6ug$En4O*=^CiG=K zp4S?+xE|6!cn$A%XutqNEgUqYY3fw&N(Z6=@W6*bxdp~i_yz5VcgSj=lf-6X1Nz75 z^DabwZ4*70$$8NsEy@U^W67tcy7^lNbu;|kOLcJ40A%J#pZe0d#n zC{)}+p+?8*ftUlxJE*!%$`h~|KZSaCb=jpK3byAcuHk7wk@?YxkT1!|r({P*KY^`u z!hw#`5$JJZGt@nkBK_nwWA31_Q9UGvv9r-{NU<&7HHMQsq=sn@O?e~fwl20tnSBG* zO%4?Ew6`aX=I5lqmy&OkmtU}bH-+zvJ_CFy z_nw#!8Rap5Wcex#5}Ldtqhr_Z$}@jPuYljTosS1+WG+TxZ>dGeT)?ZP3#3>sf#KOG z0)s%{cEHBkS)019}-1A2kd*it>y65-C zh7J9zogM74?PU)0c0YavY7g~%j%yiWEGDb+;Ew5g5Gq@MpVFFBNOpu0x)>Yn>G6uo zKE%z1EhkG_N5$a8f6SRm(25iH#FMeaJ1^TBcBy<04ID47(1(D)q}g=_6#^V@yI?Y&@HUf z`;ojGDdsvRCoTmasXndENqfWkOw=#cV-9*QClpI03)FWcx(m5(P1DW+2-{Hr-`5M{v##Zu-i-9Cvt;V|n)1pR^y ztp3IXzHjYWqabuPqnCY9^^;adc!a%Z35VN~TzwAxq{NU&Kp35m?fw_^D{wzB}4FVXX5Zk@#={6jRh%wx|!eu@Xp;%x+{2;}!&J4X*_SvtkqE#KDIPPn@ z5BE$3uRlb>N<2A$g_cuRQM1T#5ra9u2x9pQuqF1l2#N{Q!jVJ<>HlLeVW|fN|#vqSnRr<0 zTVs=)7d`=EsJXkZLJgv~9JB&ay16xDG6v(J2eZy;U%a@EbAB-=C?PpA9@}?_Yfb&) zBpsih5m1U9Px<+2$TBJ@7s9HW>W){i&XKLZ_{1Wzh-o!l5_S+f$j^RNYo85}uVhN# zq}_mN-d=n{>fZD2Lx$Twd2)}X2ceasu91}n&BS+4U9=Y{aZCgV5# z?z_Hq-knIbgIpnkGzJz-NW*=p?3l(}y3(aPCW=A({g9CpjJfYuZ%#Tz81Y)al?!S~ z9AS5#&nzm*NF?2tCR#|D-EjBWifFR=da6hW^PHTl&km-WI9*F4o>5J{LBSieVk`KO z2(^9R(zC$@g|i3}`mK-qFZ33PD34jd_qOAFj29687wCUy>;(Hwo%Me&c=~)V$ua)V zsaM(aThQ3{TiM~;gTckp)LFvN?%TlO-;$y+YX4i`SU0hbm<})t0zZ!t1=wY&j#N>q zONEHIB^RW6D5N*cq6^+?T}$3m|L{Fe+L!rxJ=KRjlJS~|z-&CC{#CU8`}2|lo~)<| zk?Wi1;Cr;`?02-C_3^gD{|Ryhw!8i?yx5i0v5?p)9wZxSkwn z3C;pz25KR&7{|rc4H)V~y8%+6lX&KN&=^$Wqu+}}n{Y~K4XpI-#O?L=(2qncYNePX zTsB6_3`7q&e0K67=Kg7G=j#?r!j0S^w7;0?CJbB3_C4_8X*Q%F1%cmB{g%XE&|IA7 z(#?AeG{l)s_orNJp!$Q~qGrj*YnuKlV`nVdg4vkTNS~w$4d^Oc3(dxi(W5jq0e>x} z(GN1?u2%Sy;GA|B%Sk)ukr#v*UJU%(BE9X54!&KL9A^&rR%v zIdYt0&D59ggM}CKWyxGS@ z>T#})2Bk8sZMGJYFJtc>D#k0+Rrrs)2DG;(u(DB_v-sVg=GFMlSCx<&RL;BH}d6AG3VqP!JpC0Gv6f8d|+7YRC@g|=N=C2 zo>^0CE0*RW?W))S(N)}NKA)aSwsR{1*rs$(cZIs?nF9)G*bSr%%SZo^YQ|TSz={jX z4Z+(~v_>RH0(|IZ-_D_h@~p_i%k^XEi+CJVC~B zsPir zA0Jm2yIdo4`&I`hd%$Bv=Rq#-#bh{Mxb_{PN%trcf(#J3S1UKDfC1QjH2E;>wUf5= ze8tY9QSYx0J;$JUR-0ar6fuiQTCQP#P|WEq;Ez|*@d?JHu-(?*tTpGHC+=Q%H>&I> z*jC7%nJIy+HeoURWN%3X47UUusY2h7nckRxh8-)J61Zvn@j-uPA@99|y48pO)0XcW zX^d&kW^p7xsvdX?2QZ8cEUbMZ7`&n{%Bo*xgFr4&fd#tHOEboQos~xm8q&W;fqrj} z%KYnnE%R`=`+?lu-O+J9r@+$%YnqYq!SVs>xp;%Q8p^$wA~oynhnvIFp^)Z2CvcyC zIN-_3EUHW}1^VQ0;Oj>q?mkPx$Wj-i7QoXgQ!HyRh6Gj8p~gH22k&nmEqUR^)9qni{%uNeV{&0-H60C zibHZtbV=8=aX!xFvkO}T@lJ_4&ki$d+0ns3FXb+iP-VAVN`B7f-hO)jyh#4#_$XG%Txk6M<+q6D~ zi*UcgRBOoP$7P6RmaPZ2%MG}CMfs=>*~(b97V4+2qdwvwA@>U3QQAA$hiN9zi%Mq{ z*#fH57zUmi)GEefh7@`Uy7?@@=BL7cXbd{O9)*lJh*v!@ z-6}p9u0AreiGauxn7JBEa-2w&d=!*TLJ49`U@D7%2ppIh)ynMaAE2Q4dl@47cNu{9 z&3vT#pG$#%hrXzXsj=&Ss*0;W`Jo^mcy4*L8b^sSi;H{*`zW9xX2HAtQ*sO|x$c6UbRA(7*9=;D~(%wfo(Z6#s$S zuFk`dr%DfVX5KC|Af8@AIr8@OAVj=6iX!~8D_P>p7>s!Hj+X0_t}Y*T4L5V->A@Zx zcm1wN;TNq=h`5W&>z5cNA99U1lY6+!!u$ib|41VMcJk8`+kP{PEOUvc@2@fW(bh5pp6>C3T55@XlpsAd#vn~__3H;Dz2w=t9v&{v*)1m4)vX;4 zX4YAjM66?Z7kD@XX{e`f1t_ZvYyi*puSNhVPq%jeyBteaOHo7vOr8!qqp7wV;)%jtD5>}-a?xavZ;i|2P3~7c)vP2O#Fb`Y&Kce zQNr7%fr4#S)OOV-1piOf7NgQvR{lcvZ*SNbLMq(olrdDC6su;ubp5un!&oT=jVTC3uTw7|r;@&y*s)a<{J zkzG(PApmMCpMmuh6GkM_`AsBE@t~)EDcq1AJ~N@7bqyW_i!mtHGnVgBA`Dxi^P93i z5R;}AQ60wy=Q2GUnSwz+W6C^}qn`S-lY7=J(3#BlOK%pCl=|RVWhC|IDj1E#+|M{TV0vE;vMZLy7KpD1$Yk zi0!9%qy8>CyrcRK`juQ)I};r)5|_<<9x)32b3DT1M`>v^ld!yabX6@ihf`3ZVTgME zfy(l-ocFuZ(L&OM4=1N#Mrrm_<>1DZpoWTO70U8+x4r3BpqH6z@(4~sqv!A9_L}@7 z7o~;|?~s-b?ud&Wx6==9{4uTcS|0-p@dKi0y#tPm2`A!^o3fZ8Uidxq|uz2vxf;wr zM^%#9)h^R&T;}cxVI(XX7kKPEVb);AQO?cFT-ub=%lZPwxefymBk+!H!W(o(>I{jW z$h;xuNUr#^0ivvSB-YEbUqe$GLSGrU$B3q28&oA55l)ChKOrwiTyI~e*uN;^V@g-Dm4d|MK!ol8hoaSB%iOQ#i_@`EYK_9ZEjFZ8Ho7P^er z^2U6ZNQ{*hcEm?R-lK)pD_r(e=Jfe?5VkJ$2~Oq^7YjE^5(6a6Il--j@6dBHx2Ulq z!%hz{d-S~i9Eo~WvQYDt7O7*G9CP#nrKE#DtIEbe_uxptcCSmYZMqT2F}7Kw0AWWC zPjwo0IYZ6klc(h9uL|NY$;{SGm4R8Bt^^q{e#foMxfCSY^-c&IVPl|A_ru!ebwR#7 z3<4+nZL(mEsU}O9e`^XB4^*m)73hd04HH%6ok^!;4|JAENnEr~%s6W~8KWD)3MD*+ zRc46yo<}8|!|yW-+KulE86aB_T4pDgL$XyiRW(OOcnP4|2;v!m2fB7Hw-IkY#wYfF zP4w;k-RInWr4fbz=X$J;z2E8pvAuy9kLJUSl8_USi;rW`kZGF?*Ur%%(t$^{Rg!=v zg;h3@!Q$eTa7S0#APEDHLvK%RCn^o0u!xC1Y0Jg!Baht*a4mmKHy~88md{YmN#x) zBOAp_i-z2h#V~*oO-9k(BizR^l#Vm%uSa^~3337d;f=AhVp?heJ)nlZGm`}D(U^2w z#vC}o1g1h?RAV^90N|Jd@M00PoNUPyA?@HeX0P7`TKSA=*4s@R;Ulo4Ih{W^CD{c8 ze(ipN{CAXP(KHJ7UvpOc@9SUAS^wKo3h-}BDZu}-qjdNlVtp^Z{|CxKOEo?tB}-4; zEXyDzGbXttJ3V$lLo-D?HYwZm7vvwdRo}P#KVF>F|M&eJ44n*ZO~0)#0e0Vy&j00I z{%IrnUvKp70P?>~J^$^0Wo%>le>re2ZSvRfes@dC-*e=DD1-j%<$^~4^4>Id5w^Fr z{RWL>EbUCcyC%1980kOYqZAcgdz5cS8c^7%vvrc@CSPIx;X=RuodO2dxk17|am?HJ@d~Mp_l8H?T;5l0&WGFoTKM{eP!L-a0O8?w zgBPhY78tqf^+xv4#OK2I#0L-cSbEUWH2z+sDur85*!hjEhFfD!i0Eyr-RRLFEm5(n z-RV6Zf_qMxN5S6#8fr9vDL01PxzHr7wgOn%0Htmvk9*gP^Um=n^+7GLs#GmU&a#U^4jr)BkIubQO7oUG!4CneO2Ixa`e~+Jp9m{l6apL8SOqA^ zvrfEUPwnHQ8;yBt!&(hAwASmL?Axitiqvx%KZRRP?tj2521wyxN3ZD9buj4e;2y6U zw=TKh$4%tt(eh|y#*{flUJ5t4VyP*@3af`hyY^YU3LCE3Z|22iRK7M7E;1SZVHbXF zKVw!L?2bS|kl7rN4(*4h2qxyLjWG0vR@`M~QFPsf^KParmCX;Gh4OX6Uy9#4e_%oK zv1DRnfvd$pu(kUoV(MmAc09ckDiuqS$a%!AQ1Z>@DM#}-yAP$l`oV`BDYpkqpk(I|+qk!yoo$TwWr6dRzLy(c zi+qbVlYGz0XUq@;Fm3r~_p%by)S&SVWS+wS0rC9bk^3K^_@6N5|2rtF)wI>WJ=;Fz zn8$h<|Dr%kN|nciMwJAv;_%3XG9sDnO@i&pKVNEfziH_gxKy{l zo`2m4rnUT(qenuq9B0<#Iy(RPxP8R)=5~9wBku=%&EBoZ82x1GlV<>R=hIqf0PK!V zw?{z9e^B`bGyg2nH!^x}06oE%J_JLk)^QyHLipoCs2MWIqc>vaxsJj(=gg1ZSa=u{ zt}od#V;e7sA4S(V9^<^TZ#InyVBFT(V#$fvI7Q+pgsr_2X`N~8)IOZtX}e(Bn(;eF zsNj#qOF_bHl$nw5!ULY{lNx@93Fj}%R@lewUuJ*X*1$K`DNAFpE z7_lPE+!}uZ6c?+6NY1!QREg#iFy=Z!OEW}CXBd~wW|r_9%zkUPR0A3m+@Nk%4p>)F zXVut7$aOZ6`w}%+WV$te6-IX7g2yms@aLygaTlIv3=Jl#Nr}nN zp|vH-3L03#%-1-!mY`1z?+K1E>8K09G~JcxfS)%DZbteGQnQhaCGE2Y<{ut#(k-DL zh&5PLpi9x3$HM82dS!M?(Z zEsqW?dx-K_GMQu5K54pYJD=5+Rn&@bGjB?3$xgYl-|`FElp}?zP&RAd<522c$Rv6} zcM%rYClU%JB#GuS>FNb{P2q*oHy}UcQ-pZ2UlT~zXt5*k-ZalE(`p7<`0n7i(r2k{ zb84&^LA7+aW1Gx5!wK!xTbw0slM?6-i32CaOcLC2B>ZRI16d{&-$QBEu1fKF0dVU>GTP05x2>Tmdy`75Qx! z^IG;HB9V1-D5&&)zjJ&~G}VU1-x7EUlT3QgNT<&eIDUPYey$M|RD6%mVkoDe|;2`8Z+_{0&scCq>Mh3hj|E*|W3;y@{$qhu77D)QJ` znD9C1AHCKSAHQqdWBiP`-cAjq7`V%~JFES1=i-s5h6xVT<50kiAH_dn0KQB4t*=ua zz}F@mcKjhB;^7ka@WbSJFZRPeYI&JFkpJ-!B z!ju#!6IzJ;D@$Qhvz9IGY5!%TD&(db3<*sCpZ?U#1^9RWQ zs*O-)j!E85SMKtoZzE^8{w%E0R0b2lwwSJ%@E}Lou)iLmPQyO=eirG8h#o&E4~eew z;h><=|4m0$`ANTOixHQOGpksXlF0yy17E&JksB4_(vKR5s$Ve+i;gco2}^RRJI+~R zWJ82WGigLIUwP!uSELh3AAs9HmY-kz=_EL-w|9}noKE#(a;QBpEx9 z4BT-zY=6dJT>72Hkz=9J1E=}*MC;zzzUWb@x(Ho8cU_aRZ?fxse5_Ru2YOvcr?kg&pt@v;{ai7G--k$LQtoYj+Wjk+nnZty;XzANsrhoH#7=xVqfPIW(p zX5{YF+5=k4_LBnhLUZxX*O?29olfPS?u*ybhM_y z*XHUqM6OLB#lyTB`v<BZ&YRs$N)S@5Kn_b3;gjz6>fh@^j%y2-ya({>Hd@kv{CZZ2e)tva7gxLLp z`HoGW);eRtov~Ro5tetU2y72~ zQh>D`@dt@s^csdfN-*U&o*)i3c4oBufCa0e|BwT2y%Y~=U7A^ny}tx zHwA>Wm|!SCko~UN?hporyQHRUWl3djIc722EKbTIXQ6>>iC!x+cq^sUxVSj~u)dsY zW8QgfZlE*2Os%=K;_vy3wx{0u!2%A)qEG-$R^`($%AOfnA^LpkB_}Dd7AymC)zSQr z>C&N8V57)aeX8ap!|7vWaK6=-3~ko9meugAlBKYGOjc#36+KJwQKRNa_`W@7;a>ot zdRiJkz?+QgC$b}-Owzuaw3zBVLEugOp6UeMHAKo2$m4w zpw?i%Lft^UtuLI}wd4(-9Z^*lVoa}11~+0|Hs6zAgJ01`dEA&^>Ai=mr0nC%eBd_B zzgv2G_~1c1wr*q@QqVW*Wi1zn=}KCtSwLjwT>ndXE_Xa22HHL_xCDhkM( zhbw+j4uZM|r&3h=Z#YrxGo}GX`)AZyv@7#7+nd-D?BZV>thtc|3jt30j$9{aIw9)v zDY)*fsSLPQTNa&>UL^RWH(vpNXT7HBv@9=*=(Q?3#H*crA2>KYx7Ab?-(HU~a275)MBp~`P)hhzSsbj|d`aBe(L*(;zif{iFJu**ZR zkL-tPyh!#*r-JVQJq>5b0?cCy!uSKef+R=$s3iA7*k*_l&*e!$F zYwGI;=S^0)b`mP8&Ry@{R(dPfykD&?H)na^ihVS7KXkxb36TbGm%X1!QSmbV9^#>A z-%X>wljnTMU0#d;tpw?O1W@{X-k*>aOImeG z#N^x?ehaaQd}ReQykp>i;92q@%$a!y1PNyPYDIvMm& zyYVwn;+0({W@3h(r&i#FuCDE)AC(y&Vu>4?1@j0|CWnhHUx4|zL7cdaA32RSk?wl% zMK^n42@i5AU>f70(huWfOwaucbaToxj%+)7hnG^CjH|O`A}+GHZyQ-X57(WuiyRXV zPf>0N3GJ<2Myg!sE4XJY?Z7@K3ZgHy8f7CS5ton0Eq)Cp`iLROAglnsiEXpnI+S8; zZn>g2VqLxi^p8#F#Laf3<00AcT}Qh&kQnd^28u!9l1m^`lfh9+5$VNv=?(~Gl2wAl zx(w$Z2!_oESg_3Kk0hUsBJ<;OTPyL(?z6xj6LG5|Ic4II*P+_=ac7KRJZ`(k2R$L# zv|oWM@116K7r3^EL*j2ktjEEOY9c!IhnyqD&oy7+645^+@z5Y|;0+dyR2X6^%7GD* zXrbPqTO}O={ z4cGaI#DdpP;5u?lcNb($V`l>H7k7otl_jQFu1hh>=(?CTPN#IPO%O_rlVX}_Nq;L< z@YNiY>-W~&E@=EC5%o_z<^3YEw)i_c|NXxHF{=7U7Ev&C`c^0Z4-LGKXu*Hkk&Av= zG&RAv{cR7o4${k~f{F~J48Ks&o(D@j-PQ2`LL@I~b=ifx3q!p6`d>~Y!<-^mMk3)e zhi1;(YLU5KH}zzZNhl^`0HT(r`5FfmDEzxa zk&J7WQ|!v~TyDWdXQ)!AN_Y%xM*!jv^`s)A`|F%;eGg27KYsrCE2H}7*r)zvum6B{ z$k5Har9pv!dcG%f|3hE(#hFH+12RZPycVi?2y`-9I7JHryMn3 z9Y8?==_(vOAJ7PnT<0&85`_jMD0#ipta~Q3M!q5H1D@Nj-YXI$W%OQplM(GWZ5Lpq z-He6ul|3<;ZQsqs!{Y7x`FV@pOQc4|N;)qgtRe(Uf?|YqZv^$k8On7DJ5>f2%M=TV zw~x}9o=mh$JVF{v4H5Su1pq66+mhTG6?F>Do}x{V(TgFwuLfvNP^ijkrp5#s4UT!~ zEU7pr8aA)2z1zb|X9IpmJykQcqI#(rS|A4&=TtWu@g^;JCN`2kL}%+K!KlgC z>P)v+uCeI{1KZpewf>C=?N7%1e10Y3pQCZST1GT5fVyB1`q)JqCLXM zSN0qlreH1=%Zg-5`(dlfSHI&2?^SQdbEE&W4#%Eve2-EnX>NfboD<2l((>>34lE%) zS6PWibEvuBG7)KQo_`?KHSPk+2P;`}#xEs}0!;yPaTrR#j(2H|#-CbVnTt_?9aG`o z(4IPU*n>`cw2V~HM#O`Z^bv|cK|K};buJ|#{reT8R)f+P2<3$0YGh!lqx3&a_wi2Q zN^U|U$w4NP!Z>5|O)>$GjS5wqL3T8jTn%Vfg3_KnyUM{M`?bm)9oqZP&1w1)o=@+(5eUF@=P~ zk2B5AKxQ96n-6lyjh&xD!gHCzD$}OOdKQQk7LXS-fk2uy#h{ktqDo{o&>O!6%B|)` zg?|JgcH{P*5SoE3(}QyGc=@hqlB5w;bnmF#pL4iH`TSuft$dE5j^qP2S)?)@pjRQZ zBfo6g>c!|bN-Y|(Wah2o61Vd|OtXS?1`Fu&mFZ^yzUd4lgu7V|MRdGj3e#V`=mnk- zZ@LHn?@dDi=I^}R?}mZwduik!hC%=Hcl56u{Wrk1|1SxlgnzG&e7Vzh*wNM(6Y!~m z`cm8Ygc1$@z9u9=m5vs1(XXvH;q16fxyX4&e5dP-{!Kd555FD6G^sOXHyaCLka|8j zKKW^E>}>URx736WWNf?U6Dbd37Va3wQkiE;5F!quSnVKnmaIRl)b5rM_ICu4txs+w zj}nsd0I_VG^<%DMR8Zf}vh}kk;heOQTbl ziEoE;9@FBIfR7OO9y4Pwyz02OeA$n)mESpj zdd=xPwA`nO06uGGsXr4n>Cjot7m^~2X~V4yH&- zv2llS{|und45}Pm1-_W@)a-`vFBpD~>eVP(-rVHIIA|HD@%7>k8JPI-O*<7X{L*Ik zh^K`aEN!BteiRaY82FVo6<^8_22=aDIa8P&2A3V<(BQ;;x8Zs-1WuLRWjQvKv1rd2 zt%+fZ!L|ISVKT?$3iCK#7whp|1ivz1rV*R>yc5dS3kIKy_0`)n*%bfNyw%e7Uo}Mnnf>QwDgeH$X5eg_)!pI4EJjh6?kkG2oc6Af0py z(txE}$ukD|Zn=c+R`Oq;m~CSY{ebu9?!is}01sOK_mB?{lSY33E=!KkKtMeI*FO2b z%95awv9;Z|UDp3xm+aP*5I!R-_M2;GxeCRx3ATS0iF<_Do2Mi)Hk2 zjBF35VB>(oamIYjunu?g0O-?LuOvtfs5F(iiIicbu$HMPPF%F>pE@hIRjzT)>aa=m zwe;H9&+2|S!m74!E3xfO{l3E_ab`Q^tZ4yH9=~o2DUEtEMDqG=&D*8!>?2uao%w`&)THr z^>=L3HJquY>6)>dW4pCWbzrIB+>rdr{s}}cL_?#!sOPztRwPm1B=!jP7lQG|Iy6rP zVqZDNA;xaUx&xUt?Ox|;`9?oz`C0#}mc<1Urs#vTW4wd{1_r`eX=BeSV z_9WV*9mz>PH6b^z{VYQJ1nSTSqOFHE9u>cY)m`Q>=w1NzUShxcHsAxasnF2BG;NQ; zqL1tjLjImz_`q=|bAOr_i5_NEijqYZ^;d5y3ZFj6kCYakJh**N_wbfH;ICXq?-p#r z{{ljNDPSytOaG#7=yPmA&5gyYI%^7pLnMOw-RK}#*dk=@usL;|4US?{@K%7esmc&n z5$D*+l&C9)Bo@$d;Nwipd!68&+NnOj^<~vRcKLX>e03E|;to;$ndgR;9~&S-ly5gf z{rzj+j-g$;O|u?;wwxrEpD=8iFzUHQfl{B>bLHqH(9P zI59SS2PEBE;{zJUlcmf(T4DrcO?XRWR}?fekN<($1&AJTRDyW+D*2(Gyi?Qx-i}gy z&BpIO!NeVdLReO!YgdUfnT}7?5Z#~t5rMWqG+$N2n%5o#Np6ccNly}#IZQsW4?|NV zR9hrcyP(l#A+U4XcQvT;4{#i)dU>HK>aS!k1<3s2LyAhm2(!Nu%vRC9T`_yn9D+r} z1i&U~IcQ?4xhZYyH6WL-f%}qIhZkc&}n2N0PM| z6|XA9d-y;!`D{p;xu*gv7a|zaZ*MiQ)}zPzW4GB0mr)}N-DmB&hl1&x`2@sxN572_ zS)RdJyR%<7kW0v3Q_|57JKy&9tUdbqz}|hwn84}U*0r^jt6Ssrp+#1y=JBcZ+F`f(N?O0XL1OFGN`1-r?S<#t4*C9|y~e)!UYZ zRQ3M8m%~M)VriIvn~XzoP;5qeu(ZI>Y#r zAd)J)G9)*BeE%gmm&M@Olg3DI_zokjh9NvdGbT z+u4(Y&uC6tBBefIg~e=J#8i1Zxr>RT)#rGaB2C71usdsT=}mm`<#WY^6V{L*J6v&l z1^Tkr6-+^PA)yC;s1O^3Q!)Reb=fxs)P~I*?i&j{Vbb(Juc?La;cA5(H7#FKIj0Or zgV0BO{DUs`I9HgQ{-!g@5P^Vr|C4}~w6b=#`Zx0XcVSd?(04HUHwK(gJNafgQNB9Z zCi3TgNXAeJ+x|X|b@27$RxuYYuNSUBqo#uyiH6H(b~K*#!@g__4i%HP5wb<+Q7GSb zTZjJw96htUaGZ89$K_iBo4xEOJ#DT#KRu9ozu!GH0cqR>hP$nk=KXM%Y!(%vWQ#}s zy=O#BZ>xjUejMH^F39Bf0}>D}yiAh^toa-ts#gt6Mk9h1D<9_mGMBhLT0Ce2O3d_U znaTkBaxd-8XgwSp5)x-pqX5=+{cSuk6kyl@k|5DQ!5zLUVV%1X9vjY0gerbuG6nwZu5KDMdq(&UMLZ zy?jW#F6joUtVyz`Y?-#Yc0=i*htOFwQ3`hk$8oq35D}0m$FAOp#UFTV3|U3F>@N?d zeXLZCZjRC($%?dz(41e~)CN10qjh^1CdAcY(<=GMGk@`b1ptA&L*{L@_M{%Vd5b*x#b1(qh=7((<_l%ZUaHtmgq} zjchBdiis{Afxf@3CjPR09E*2#X(`W#-n`~6PcbaL_(^3tfDLk?Nb6CkW9v!v#&pWJ3iV-9hz zngp#Q`w`r~2wt&cQ9#S7z0CA^>Mzm7fpt72g<0y-KT{G~l-@L#edmjZQ}7{*$mLgSdJfS$Ge{hrD=mr;GD)uYq8}xS zT>(w_;}894Kb}(P5~FOpFIEjadhmxD(PsZbKwa-qxVa7Oc7~ebPKMeN(pCRzq8s@l z`|l^*X1eK1+Spz--WkSW_nK`Cs@JmkY4+p=U91nJoy{tSH;TzuIyS)Q_(S@;Iakua zpuDo5W54Mo;jY@Ly1dY)j|+M%$FJ0`C=FW#%UvOd&?p}0QqL20Xt!#pr8ujy6CA-2 zFz6Ex5H1i)c9&HUNwG{8K%FRK7HL$RJwvGakleLLo}tsb>t_nBCIuABNo$G--_j!gV&t8L^4N6wC|aLC)l&w04CD6Vc#h^(YH@Zs4nwUGkhc_-yt{dK zMZ<%$swLmUl8`E~RLihGt@J5v;r;vT&*Q!Cx zZ55-zpb;W7_Q{tf$mQvF61(K>kwTq0x{#Din||)B{+6O#ArLi)kiHWVC4`fOT&B(h zw&YV`J1|^FLx~9Q%r-SFhYl4PywI7sF2Q$>4o50~dfp5nn}XHv-_DM?RGs#+4gM;% znU>k=81G~f6u%^Z{bcX&sUv*h|L+|mNq=W43y@{~C zpL-TW3hYPs0^*OqS#KQwA^CGG_A-6#`_{1LBCD&*3nY0UHWJj1D|VP%oQlFxLllaA zVI@2^)HZ%E*=RbQcFOKIP7?+|_xVK+2oG(t_EGl2y;Ovox zZb^qVpe!4^reKvpIBFzx;Ji=PmrV>uu-Hb>`s?k?YZQ?>av45>i(w0V!|n?AP|v5H zm`e&Tgli#lqGEt?=(?~fy<(%#nDU`O@}Vjib6^rfE2xn;qgU6{u36j_+Km%v*2RLnGpsvS+THbZ>p(B zgb{QvqE?~50pkLP^0(`~K& zjT=2Pt2nSnwmnDFi2>;*C|OM1dY|CAZ5R|%SAuU|5KkjRM!LW_)LC*A zf{f>XaD+;rl6Y>Umr>M8y>lF+=nSxZX_-Z7lkTXyuZ(O6?UHw^q; z&$Zsm4U~}KLWz8>_{p*WQ!OgxT1JC&B&>|+LE3Z2mFNTUho<0u?@r^d=2 z-av!n8r#5M|F%l;=D=S1mGLjgFsiYAOODAR}#e^a8 zfVt$k=_o}kt3PTz?EpLkt54dY}kyd$rU zVqc9SN>0c z753j-gdN~UiW*FUDMOpYEkVzP)}{Ds*3_)ZBi)4v26MQr140|QRqhFoP=a|;C{#KS zD^9b-9HM11W+cb1Y)HAuk<^GUUo(ut!5kILBzAe)Vaxwu4Up!7Ql*#DDu z>EB84&xSrh>0jT!*X81jJQq$CRHqNj29!V3FN9DCx)~bvZbLwSlo3l^zPb1sqBnp) zfZpo|amY^H*I==3#8D%x3>zh#_SBf?r2QrD(Y@El!wa;Ja6G9Y1947P*DC|{9~nO& z*vDnnU!8(cV%HevsraF%Y%2{Z>CL0?64eu9r^t#WjW4~3uw8d}WHzsV%oq-T)Y z0-c!FWX5j1{1##?{aTeCW2b$PEnwe;t`VPCm@sQ`+$$L2=3kBR%2XU1{_|__XJ$xt zibjY2QlDVs)RgHH*kl&+jn*JqquF)k_Ypibo00lcc<2RYqsi-G%}k0r(N97H7JEn7@E3ZTH0JK>d8)E~A-D z!B&z9zJw0Bi^fgQZI%LirYaBKnWBXgc`An*qvO^*$xymqKOp(+3}IsnVhu?YnN7qz zNJxDN-JWd7-vIiv2M9ih>x3gNVY%DzzY~dCnA}76IRl!`VM=6=TYQ=o&uuE8kHqZT zoUNod0v+s9D)7aLJ|hVqL0li1hg)%&MAciI(4YJ=%D4H$fGQ&Lu-?@>>@pEgC;ERrL= zI^cS&3q8fvEGTJZgZwL5j&jp%j9U^Of6pR{wA^u=tVt#yCQepXNIbynGnuWbsC_EE zRyMFq{5DK692-*kyGy~An>AdVR9u___fzmmJ4;^s0yAGgO^h{YFmqJ%ZJ_^0BgCET zE6(B*SzeZ4pAxear^B-YW<%BK->X&Cr`g9_;qH~pCle# zdY|UB5cS<}DFRMO;&czbmV(?vzikf)Ks`d$LL801@HTP5@r><}$xp}+Ip`u_AZ~!K zT}{+R9Wkj}DtC=4QIqJok5(~0Ll&_6PPVQ`hZ+2iX1H{YjI8axG_Bw#QJy`6T>1Nn z%u^l`>XJ{^vX`L0 z1%w-ie!dE|!SP<>#c%ma9)8K4gm=!inHn2U+GR+~ zqZVoa!#aS0SP(|**WfQSe?cA=1|Jwk`UDsny%_y{@AV??N>xWekf>_IZLUEK3{Ksi zWWW$if&Go~@Oz)`#=6t_bNtD$d9FMBN#&97+XKa+K2C@I9xWgTE{?Xnhc9_KKPcujj@NprM@e|KtV_SR+ zSpeJ!1FGJ=Te6={;;+;a46-*DW*FjTnBfeuzI_=I1yk8M(}IwEIGWV0Y~wia;}^dg z{BK#G7^J`SE10z4(_Me=kF&4ld*}wpNs91%2Ute>Om`byv9qgK4VfwPj$`axsiZ)wxS4k4KTLb-d~!7I@^Jq`>?TrixHk|9 zqCX7@sWcVfNP8N;(T>>PJgsklQ#GF>F;fz_Rogh3r!dy*0qMr#>hvSua;$d z3TCZ4tlkyWPTD<=5&*bUck~J;oaIzSQ0E03_2x{?weax^jL3o`ZP#uvK{Z5^%H4b6 z%Kbp6K?>{;8>BnQy64Jy$~DN?l(ufkcs6TpaO&i~dC>0fvi-I^7YT#h?m;TVG|nba%CKRG%}3P*wejg) zI(ow&(5X3HR_xk{jrnkA-hbwxEQh|$CET9Qv6UpM+-bY?E!XVorBvHoU59;q<9$hK z%w5K-SK zWT#1OX__$ceoq0cRt>9|)v}$7{PlfwN}%Wh3rwSl;%JD|k~@IBMd5}JD#TOvp=S57 zae=J#0%+oH`-Av}a(Jqhd4h5~eG5ASOD)DfuqujI6p!;xF_GFcc;hZ9k^a7c%%h(J zhY;n&SyJWxju<+r`;pmAAWJmHDs{)V-x7(0-;E?I9FWK@Z6G+?7Py8uLc2~Fh1^0K zzC*V#P88(6U$XBjLmnahi2C!a+|4a)5Ho5>owQw$jaBm<)H2fR=-B*AI8G@@P-8I8 zHios92Q6Nk-n0;;c|WV$Q);Hu4;+y%C@3alP`cJ2{z~*m-@de%OKVgiWp;4Q)qf9n zJ!vmx(C=_>{+??w{U^Bh|LFJ<6t}Er<-Tu{C{dv8eb(kVQ4!fOuopTo!^x1OrG}0D zR{A#SrmN`=7T29bzQ}bwX8OUufW9d9T4>WY2n15=k3_rfGOp6sK0oj7(0xGaEe+-C zVuWa;hS*MB{^$=0`bWF(h|{}?53{5Wf!1M%YxVw}io4u-G2AYN|FdmhI13HvnoK zNS2fStm=?8ZpKt}v1@Dmz0FD(9pu}N@aDG3BY8y`O*xFsSz9f+Y({hFx;P_h>ER_& z`~{z?_vCNS>agYZI?ry*V96_uh;|EFc0*-x*`$f4A$*==p`TUVG;YDO+I4{gJGrj^ zn?ud(B4BlQr;NN?vaz_7{&(D9mfd z8esj=a4tR-ybJjCMtqV8>zn`r{0g$hwoWRUI3}X5=dofN){;vNoftEwX>2t@nUJro z#%7rpie2eH1sRa9i6TbBA4hLE8SBK@blOs=ouBvk{zFCYn4xY;v3QSM%y6?_+FGDn z4A;m)W?JL!gw^*tRx$gqmBXk&VU=Nh$gYp+Swu!h!+e(26(6*3Q!(!MsrMiLri`S= zKItik^R9g!0q7y$lh+L4zBc-?Fsm8`CX1+f>4GK7^X2#*H|oK}reQnT{Mm|0ar<+S zRc_dM%M?a3bC2ILD`|;6vKA`a3*N~(cjw~Xy`zhuY2s{(7KLB{S>QtR3NBQ3>vd+= z#}Q)AJr7Y_-eV(sMN#x!uGX08oE*g=grB*|bBs}%^3!RVA4f%m3=1f0K=T^}iI&2K zuM2GG5_%+#v-&V>?x4W9wQ|jE2Q7Be8mOyJtZrqn#gXy-1fF1P$C8+We&B*-pi#q5 zETp%H6g+%#sH+L4=ww?-h;MRCd2J9zwQUe4gHAbCbH08gDJY;F6F)HtWCRW1fLR;)ysGZanlz*a+|V&@(ipWdB!tz=m_0 z6F}`d$r%33bw?G*azn*}Z;UMr{z4d9j~s`0*foZkUPwpJsGgoR0aF>&@DC;$A&(av z?b|oo;`_jd>_5nye`DVOcMLr-*Nw&nA z82E8Dw^$Lpso)gEMh?N|Uc^X*NIhg=U%enuzZOGi-xcZRUZmkmq~(cP{S|*+A6P;Q zprIkJkIl51@ng)8cR6QSXJtoa$AzT@*(zN3M+6`BTO~ZMo0`9$s;pg0HE3C;&;D@q zd^0zcpT+jC%&=cYJF+j&uzX87d(gP9&kB9|-zN=69ymQS9_K@h3ph&wD5_!4q@qI@ zBMbd`2JJ2%yNX?`3(u&+nUUJLZ=|{t7^Rpw#v-pqD2_3}UEz!QazhRty%|Q~WCo7$ z+sIugHA%Lmm{lBP#bnu_>G}Ja<*6YOvSC;89z67M%iG0dagOt1HDpDn$<&H0DWxMU zxOYaaks6%R@{`l~zlZ*~2}n53mn2|O&gE+j*^ypbrtBv{xd~G(NF?Z%F3>S6+qcry z?ZdF9R*a;3lqX_!rI(Cov8ER_mOqSn6g&ZU(I|DHo7Jj`GJ}mF;T(vax`2+B8)H_D zD0I;%I?*oGD616DsC#j0x*p+ZpBfd=9gR|TvB)832CRhsW_7g&WI@zp@r7dhg}{+4f=(cO2s+)jg0x(*6|^+6W_=YIfSH0lTcK* z%)LyaOL6em@*-_u)}Swe8rU)~#zT-vNiW(D*~?Zp3NWl1y#fo!3sK-5Ek6F$F5l3| zrFFD~WHz1}WHmzzZ!n&O8rTgfytJG*7iE~0`0;HGXgWTgx@2fD`oodipOM*MOWN-} zJY-^>VMEi8v23ZlOn0NXp{7!QV3F1FY_URZjRKMcY(2PV_ms}EIC^x z=EYB5UUQ{@R~$2Mwiw$_JAcF+szKB*n(`MYpDCl>~ss54uDQ%Xf-8|dgO zY)B_qju=IaShS|XsQo=nSYxV$_vQR@hd~;qW)TEfU|BA0&-JSwO}-a*T;^}l;MgLM zz}CjPlJX|W2vCzm3oHw3vqsRc3RY=2()}iw_k2#eKf&VEP7TQ;(DDzEAUgj!z_h2Br;Z3u=K~LqM6YOrlh)v9`!n|6M-s z?XvA~y<5?WJ{+yM~uPh7uVM&g-(;IC3>uA}ud?B3F zelSyc)Nx>(?F=H88O&_70%{ATsLVTAp88F-`+|egQ7C4rpIgOf;1tU1au+D3 zlz?k$jJtTOrl&B2%}D}8d=+$NINOZjY$lb{O<;oT<zXoAp01KYG$Y4*=)!&4g|FL(!54OhR-?)DXC&VS5E|1HGk8LY;)FRJqnz zb_rV2F7=BGwHgDK&4J3{%&IK~rQx<&Kea|qEre;%A~5YD6x`mo>mdR)l?Nd%T2(5U z_ciT02-zt_*C|vn?BYDuqSFrk3R(4B0M@CRFmG{5sovIq4%8AhjXA5UwRGo)MxZlI zI%vz`v8B+#ff*XtGnciczFG}l(I}{YuCco#2E6|+5WJ|>BSDfz0oT+F z%QI^ixD|^(AN`MS6J$ zXlKNTFhb>KDkJp*4*LaZ2WWA5YR~{`={F^hwXGG*rJYQA7kx|nwnC58!eogSIvy{F zm1C#9@$LhK^Tl>&iM0wsnbG7Y^MnQ=q))MgApj4)DQt!Q5S`h+5a%c7M!m%)?+h65 z0NHDiEM^`W+M4)=q^#sk(g!GTpB}edwIe>FJQ+jAbCo#b zXmtd3raGJNH8vnqMtjem<_)9`gU_-RF&ZK!aIenv7B2Y0rZhon=2yh&VsHzM|`y|0x$Zez$bUg5Nqj?@~^ zPN43MB}q0kF&^=#3C;2T*bDBTyO(+#nZnULkVy0JcGJ36or7yl1wt7HI_>V7>mdud zv2II9P61FyEXZuF$=69dn%Z6F;SOwyGL4D5mKfW)q4l$8yUhv7|>>h_-4T*_CwAyu7;DW}_H zo>N_7Gm6eed=UaiEp_7aZko@CC61@(E1be&5I9TUq%AOJW>s^9w%pR5g2{7HW9qyF zh+ZvX;5}PN0!B4q2FUy+C#w5J?0Tkd&S#~94(AP4%fRb^742pgH7Tb1))siXWXHUT z1Wn5CG&!mGtr#jq6(P#!ck@K+FNprcWP?^wA2>mHA03W?kj>5b|P0ErXS) zg2qDTjQ|grCgYhrH-RapWCvMq5vCaF?{R%*mu}1)UDll~6;}3Q*^QOfj!dlt02lSzK z?+P)02Rrq``NbU3j&s*;<%i4Y>y9NK&=&KsYwvEmf5jwTG6?+Pu1q9M8lLlx)uZZ7 zizhr~e0ktGs-=$li-2jz^_48-jk**y&5u0`B2gc#i$T1~t+AS*kEfR*b{^Ec>2-F~ zKYRl&uQ5yO@EtAZX8ZSqx;8+AKf+CqhlUSpp*VfyBMv+%wxN5GukZEi^_to%MFRc0 zdXqJ*jk?#uYT6EJe446@(f6G4vhnxQP|pGeJ?-#|Ksq?g*ky=}x+Qnx+!<>Y(XStN zQIND`{KU}&l)E*ntI^}kJ=ly8DML{!(58Xk4_bzIc@v~e;>wKl_`7G%pGz~4KH*CTp;_|52)d!+ximd$|8v@zzEq%j68QXkgf$7eM~xdM5q5i z{?qFx_W|eq@L03bWJfjy^z@()-iCjzjREuf zb_a(yTz)ZKWCF%Lp>^2-%Q?*t{06}x#DLN3cO=i>h6#-a`z;<5rBGGM6GA(WqvRcX%Pn?Uvs1#e|ePSNJEC%+X(YI$x)`s$%>O#%}D9dgqWfq4yfVz^%FglokdFR}uJQhx|}_w`9Ulx38Ha>ZslKs58c-@IFI&f;?xM zbK>rKNfPFsf>%+k6%(A6=7Aac^_qrOCNqb3ZVJ;8pt!?1DR*ynJb#@II9h?)xB)A~ zm9Kk)Hy}!Z+W}i6ZJDy+?yY_=#kWrzgV)2eZAx_E=}Nh7*#<&mQz`Umfe$+l^P(xd zN}PA2qII4}ddCU+PN+yxkH%y!Qe(;iH3W%bwM3NKbU_saBo<8x9fGNtTAc_SizU=o zC3n2;c%LoU^j90Sz>B_p--Fzqv7x7*?|~-x{haH8RP)p|^u$}S9pD-}5;88pu0J~9 zj}EC`Q^Fw}`^pvAs4qOIuxKvGN@DUdRQ8p-RXh=3S#<`3{+Qv6&nEm)uV|kRVnu6f zco{(rJaWw(T0PWim?kkj9pJ)ZsUk9)dSNLDHf`y&@wbd;_ita>6RXFJ+8XC*-wsiN z(HR|9IF283fn=DI#3Ze&#y3yS5;!yoIBAH(v}3p5_Zr+F99*%+)cp!Sy8e+lG?dOc zuEz<;3X9Z5kkpL_ZYQa`sioR_@_cG z8tT~GOSTWnO~#?$u)AcaBSaV7P~RT?Nn8(OSL1RmzPWRWQ$K2`6*)+&7^zZBeWzud z*xb3|Fc~|R9eH+lQ#4wF#c;)Gka6lL(63C;>(bZob!i8F-3EhYU3|6-JBC0*5`y0| zBs!Frs=s!Sy0qmQNgIH|F`6(SrD1js2prni_QbG9Sv@^Pu2szR9NZl8GU89gWWvVg z2^-b*t+F{Nt>v?js7hnlC`tRU(an0qQG7;h6T~ z-`vf#R-AE$pzk`M{gCaia}F`->O2)60AuGFAJg> z*O2IZqTx=AzDvC49?A92>bQLdb&32_4>0Bgp0ESXXnd4B)!$t$g{*FG%HYdt3b3a^J9#so%BJMyr2 z{y?rzW!>lr097b9(75#&4&@lkB1vT*w&0E>!dS+a|ZOu6t^zro2tiP)bhcNNxn zbJs3_Fz+?t;4bkd8GfDI7ccJ5zU`Bs~ zN~bci`c`a%DoCMel<-KUCBdZRmew`MbZEPYE|R#|*hhvhyhOL#9Yt7$g_)!X?fK^F z8UDz)(zpsvriJ5aro5>qy`Fnz%;IR$@Kg3Z3EE!fv9CAdrAym6QU82=_$_N5*({_1 z7!-=zy(R{xg9S519S6W{HpJZ8Is|kQ!0?`!vxDggmslD59)>iQ15f z7J8NqdR`9f8H|~iFGNsPV!N)(CC9JRmzL9S}7U-K@`X893f3f<8|8Ls!^eA^#(O6nA+ByFIXcz_WLbfeG|nHJ5_sJJ^gNJ%SI9#XEfNRbzV+!RkI zXS$MOVYb2!0vU}Gt7oUy*|WpF^*orBot~b2J@^be?Gq;U%#am8`PmH-UCFZ&uTJlnetYij0z{K1mmivk$bdPbLodu;-R@@#gAV!=d%(caz$E?r zURX0pqAn7UuF6dULnoF1dZ$WM)tHAM{eZK6DbU1J`V5Dw<;xk}Nl`h+nfMO_Rdv z3SyOMzAbYaD;mkxA7_I_DOs#Bk;e5D%gsS3q)hlmi1w{FsjKNJE22`AjmNiAPRnIc zcIkN25;rOn3FipAFd(PnlK9{03w6Q<(68#1Jw`{axEGQE{Ac>^U$h);h2ADICmaNxrfpb`Jdr*)Y1SicpYKCFv$3vf~;5aW>n^7QGa63MJ z;B1+Z>WQ615R2D8JmmT`T{QcgZ+Kz1hTu{9FOL}Q8+iFx-Vyi}ZVVcGjTe>QfA`7W zFoS__+;E_rQIQxd(Bq4$egKeKsk#-9=&A!)(|hBvydsr5ts0Zjp*%*C0lM2sIOx1s zg$xz?Fh?x!P^!vWa|}^+SY8oZHub7f;E!S&Q;F?dZmvBxuFEISC}$^B_x*N-xRRJh zn4W*ThEWaPD*$KBr8_?}XRhHY7h^U1aN6>m=n~?YJQd8+!Uyq_3^)~4>XjelM&!c9 zCo|0KsGq7!KsZ~9@%G?i>LaU7#uSTMpypocm*oqJHR|wOgVWc7_8PVuuw>x{kEG4T z$p^DV`}jUK39zqFc(d5;N+M!Zd3zhZN&?Ww(<@AV-&f!v$uV>%z+dg9((35o@4rqLvTC-se@hkn^6k7+xHiK-vTRvM8{bCejbU;1@U=*r}GTI?Oc$!b6NRcj83-zF; z=TB#ESDB`F`jf4)z=OS76Se}tQDDHh{VKJk#Ad6FDB_=afpK#pyRkGrk~OuzmQG)} z*$t!nZu$KN&B;|O-aD=H<|n6aGGJZ=K9QFLG0y=Jye_ElJFNZJT;fU8P8CZcLBERjioAOC0Vz_pIXIc};)8HjfPwNy zE!g|lkRv3qpmU?shz(BBt5%TbpJC3HzP9!t7k*Fh48!-HlJ4TTgdCr3rCU!iF}kgu z4Qs;K@XOY~4f~N}Jl8V_mGbwzvNLbl&0e9UG4W;kvjTK|5`-Ld+eQ6YRF`N0ct%u% z^3J_{7r#_W1zm|>IPN!yWCRrN)N!7v`~ptNkIXKipQ6ogFvcnI5ugxdoa{d;uD67g zgo^}QuZRkB540Vc!@c80(wFG=$ct}oHq(#W0+-XX(;Rrt`x=<45X}ficNtI2(&}=~ zb(!}tNz?s`wm{gK?2tdf+OEF;tzx<(3fMd7_tM@Ghs$Z(Os-H(kYq#qB|J-aC9Ku?fsWwJhB36c)A zu|a7ZF?V8X7l2g5~xqZf>2=6Dsi5lfo zKIRL&@MLJyaBE)V_9=pJYu%U2wxR*-(0MI5_|yqP`?h@cks(5LR@XUKLMI_xuVtiu zRvpDS8MyUMRFM6`P+Sjc!A_e^H38Qu7b{b7QZ>NHyA6k-YYygQuW&C_OGO(7V7?}r)zedSVpBI zuk29Z4GW3C0GpfozbZQya454sjt@ndQmsp=DA&@sWw&xmOlDk1JIcMNp~-ES$&A~k zG#W(6hBj?!Fu8Q4WYexoSBa8_5=v20xnx6H?e;$t)5|f&{7=vOye^&3_c-Ug?|a@e z=X`&qT_5B7N9vZoPBhXOTEDV;4&x2Je4}T(UB~O-$D#CjX77$R?RZ*`ed~$G;$4YS z4n*|Pop(!NN79Hk2}U#cfEEwdxM)xQm}$~rV03xc=#U@@Y*}qEmot5KvDb=8{!E-n zl4p?}&g2h^sUGyTcGh=0aQzQb*k;K;dvbeZUgmwEv>%#(EPtj=gHKdi|E8@w+|>KC zxEU>b>P+9Xf}pEyQK(}#QrBG4Jaf!iE!qpMbTu>gb!gtdq<`@xO+roQl+S_7)!G(% zdy)$iGmJ1cwP?F=IyyV1-$|kf|EKM3B@I&lZ%NI@VV;*mQdLWjc#t|Vbk_Q~>&O03 zIcSr$(qLAINj7a z;!||v&1D5SX#X@5jNd}jUsi-CH_Scjyht&}q2p*CJCC-`&NyXf)vD5{e!HO629D-O z%bZelTcq=DoRX>zeWCa^RmR3*{x9;3lZ75M#S)!W0bRIFH#P6b%{|HRSZ5!!I#s)W z_|XXZQ<0_`>b^^0Z>LU64Yg1w)8}#M^9se(OZ9~baZ7fsKFc;EtnB>kesci#>=icG zuHdjax2^=!_(9?0l7;G7^-}9>Y#M zm;9*GT~dBuYWdk49%mZM0=H#FY1)}7NE5DE_vsqrA0`?0R0q535qHjWXcl|gz9Fq$ zMKxgL;68l!gm3y0durIr3LHv~y*ABm` zYhQG0UW#hg@*A{&G!;$FS43}rIF$e6yRdGJWVR<}uuJ_5_8qa3xaHH^!VzUteVp;> z<0`M>3tnY$ZFb$(`0sg93TwGyP;`9UYUWxO&CvAnSzei&ap))NcW;R`tA=y^?mBmG+M*&bqW5kL$V(O;(p)aEk`^ci?2Jwxu>0sy>a7+Wa9t z5#I2o;+gr^9^&km^z7>xJWbN&Ft>Vna34E zI@BBzwX)R}K3SL?)enrDJ45QLt;-7CFJk{`cF3L4Z^CtG_r5)0)HV>BOYPIUh#D%| zYQAu31f{bm-D*`_k7DTTr?Nkw_gY%J1cb2&TdtibY?V=|SSIOlA;|5C!2@?YQ z-$?G0jj^mG|MP>DmbF7}T~C$H6=CpZ~hd zZ1C|xV@=h#^~`3LSCnmI(vZ|5r3>eq5*UB)dhdy``*gKY3Eg%jSK8I-`G+OWWlD)T zt$wSQ=||lSkiKy}YF-k}@W9EiS?)z`hK{R!dd-$BCJvBtAN-yXn3njU$MisEtp!?Q z%Vk-*(wy9dd15(-WFw_&^tT;;IpF?ox1`Qq3-0zVTk+$W_?q}GfAQlPcrB^?&tWSI z2BB!K=sH7FUYmXa_dcV^Z3>5z8}~W{S!$jVR_3hu_|wl2|gmRH8ftn^z@fW75*;-`;wU+fY+BR_yx6BZnE5_Hna({jrPiubRp$jZ=T=t$hx&NeCV1!vuCcl4PJ0p0Fjp>6K} zHkoD1gQk=P2hYcT%)cJ2Q5WuA|5_x+dX0%hnozfTF>$#Wz~X!MY>){H4#fB#7^ID* z1*o2Hzp}?WVs&gbS?Uq(CT0sP+F)u9{xfgg6o_{8J#m;|NeJqDHhb(Q8%z8aM_qeM zn83>d`uDd47WIuKp78JBYo2SYupGcNXIzeou^eMY`@%Bv8elZ>q~3uq#~IX)g%g;h zoUXymEd>|kVsMkyb&1l~lrE-`w(0PObapYa35DJ4Y03Jv_!DKp}0HTbOgZRM=;PSsuAJJJ1 zItc+tu9;ANG;qHaCI|T85!euhFK~VK^G2LZV1+cbzS?>ar@>emg;JTI5VAn1g5U~| zU=p&k0OlSzc$U=s#9_uL3&n|6A1X$XvrE9vFV@`A4G#!D1QcFCeE`F2N(deJx>)*A z$XIW0P~-NbAd=5i6`s<~(vAQX9t$dbVqc5|E|CHRtb$1(l&KSNh_t2#k_l95KnP86 z)ns_DGspv-M0z0#h2a+*oH|{5~j{ zXGD=}cLrBSESQ0u$XmQlFfWMCAWaS;wKK%#aSSYK=qljBiY(s zT$v;We24&$w=avIILsMt0%1fDyah|AlLNg#WL$Lu)tf}YfqO%+pH~QC*bZO4aM*i9 zrPFf|5!hv@XY8CzaFh*Dy9vH|2fKKr(@x}`L#9^*vOae|lk`adG#oZZAyk|TOV8`9L zc-sQu%y1MQes&J?)a1}Zc*>-P!6j-T#75V$lLC!TuMB(!G-+D2;XptUxymSPFI-K&0x}B1?h$ z3-9**-9!);fwyiWB5gS$i;P~c=^}5-6G@{4TWDBRDc6(M|%qa-mS`z`u9kWo{Xl_uc;hXOkRd literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..5e20118 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed Sep 16 02:34:12 PDT 2020 +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index af6708f..fbd7c51 100755 --- a/gradlew +++ b/gradlew @@ -1,5 +1,21 @@ #!/usr/bin/env sh +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://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. +# + ############################################################################## ## ## Gradle start up script for UN*X @@ -28,7 +44,7 @@ APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m"' +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" @@ -66,6 +82,7 @@ esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then @@ -109,10 +126,11 @@ if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath @@ -138,19 +156,19 @@ if $cygwin ; then else eval `echo args$i`="\"$arg\"" fi - i=$((i+1)) + i=`expr $i + 1` done case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi @@ -159,14 +177,9 @@ save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } -APP_ARGS=$(save "$@") +APP_ARGS=`save "$@"` # Collect all arguments for the java command, following the shell quoting and substitution rules eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 6d57edc..5093609 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,3 +1,19 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @@ -13,8 +29,11 @@ if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome @@ -65,6 +84,7 @@ set CMD_LINE_ARGS=%* set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% From 79e97445fd75158ed1891964fdcd61f91fe68cfa Mon Sep 17 00:00:00 2001 From: Karthik Kumar Viswanathan Date: Tue, 10 May 2022 22:43:10 -0700 Subject: [PATCH 3/3] Upgrade to Gradle 7.4+. --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 58910 -> 59821 bytes gradle/wrapper/gradle-wrapper.properties | 5 +- gradlew | 257 ++++++++++++++--------- gradlew.bat | 21 +- 5 files changed, 159 insertions(+), 126 deletions(-) diff --git a/build.gradle b/build.gradle index bae6781..8d1b6f9 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ plugins { id 'java' id 'jacoco' - id 'com.github.hierynomus.license' version '0.15.0' + id 'com.github.hierynomus.license' version '0.16.1' } group 'org.dcp' diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 62d4c053550b91381bbd28b1afc82d634bf73a8a..41d9927a4d4fb3f96a785543079b8df6723c946b 100644 GIT binary patch delta 20829 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
;BmaEf^h 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 \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -106,80 +140,95 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. # For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=`expr $i + 1` + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 5093609..107acd3 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -54,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -64,21 +64,6 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line @@ -86,7 +71,7 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell