Author: centic
Date: Sun Dec 30 10:07:52 2018
New Revision: 1849969

URL: http://svn.apache.org/viewvc?rev=1849969&view=rev
Log:
Bug 60845: Apply patch and adjust tests

Modified:
    poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFont.java
    
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/extensions/XSSFCellBorder.java
    
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/extensions/XSSFCellFill.java
    
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCellStyle.java

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFont.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFont.java?rev=1849969&r1=1849968&r2=1849969&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFont.java 
(original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFont.java Sun 
Dec 30 10:07:52 2018
@@ -39,6 +39,8 @@ import org.openxmlformats.schemas.spread
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.STUnderlineValues;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.STVerticalAlignRun;
 
+import java.util.Objects;
+
 /**
  * Represents a font used in a workbook.
  *
@@ -542,10 +544,16 @@ public class XSSFFont implements Font {
      *  to the style table
      */
     public long registerTo(StylesTable styles) {
+        return registerTo(styles, true);
+    }
+
+    public long registerTo(StylesTable styles, boolean force) {
         this._themes = styles.getTheme();
-        this._index = styles.putFont(this, true);
+        this._index = styles.putFont(this, force);
         return this._index;
     }
+
+
     /**
      * Records the Themes Table that is associated with
      *  the current font, used when looking up theme
@@ -635,7 +643,22 @@ public class XSSFFont implements Font {
         if(!(o instanceof XSSFFont)) return false;
 
         XSSFFont cf = (XSSFFont)o;
-        return _ctFont.toString().equals(cf.getCTFont().toString());
+
+        // BUG 60845
+        return Objects.equals(this.getItalic(), cf.getItalic())
+                        && Objects.equals(this.getBold(), cf.getBold())
+                        && Objects.equals(this.getStrikeout(), 
cf.getStrikeout())
+                        && Objects.equals(this.getCharSet(), cf.getCharSet())
+                        && Objects.equals(this.getBold(), cf.getBold())
+                        && Objects.equals(this.getColor(), cf.getColor())
+                        && Objects.equals(this.getFamily(), cf.getFamily())
+                        && Objects.equals(this.getFontHeight(), 
cf.getFontHeight())
+                        && Objects.equals(this.getFontName(), cf.getFontName())
+                        && Objects.equals(this.getScheme(), cf.getScheme())
+                        && Objects.equals(this.getThemeColor(), 
cf.getThemeColor())
+                        && Objects.equals(this.getTypeOffset(), 
cf.getTypeOffset())
+                        && Objects.equals(this.getUnderline(), 
cf.getUnderline())
+                        && Objects.equals(this.getXSSFColor(), 
cf.getXSSFColor());
     }
 
 }

Modified: 
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/extensions/XSSFCellBorder.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/extensions/XSSFCellBorder.java?rev=1849969&r1=1849968&r2=1849969&view=diff
==============================================================================
--- 
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/extensions/XSSFCellBorder.java
 (original)
+++ 
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/extensions/XSSFCellBorder.java
 Sun Dec 30 10:07:52 2018
@@ -17,6 +17,8 @@
 package org.apache.poi.xssf.usermodel.extensions;
 
 
+import java.util.Objects;
+
 import org.apache.poi.ss.usermodel.BorderStyle;
 import org.apache.poi.xssf.model.ThemesTable;
 import org.apache.poi.xssf.usermodel.IndexedColorMap;
@@ -196,6 +198,21 @@ public class XSSFCellBorder {
         if (!(o instanceof XSSFCellBorder)) return false;
 
         XSSFCellBorder cf = (XSSFCellBorder) o;
-        return border.toString().equals(cf.getCTBorder().toString());
+
+        // bug 60845
+        // Do not compare the representing strings but the properties
+        // Reason:
+        //   The strings are different if the XMLObject is a fragment (e.g. 
the ones from cloneStyle)
+        //   even if they are in fact representing the same style
+        boolean equal = true;
+        for(BorderSide side : BorderSide.values()){
+            if(!Objects.equals(this.getBorderColor(side), 
cf.getBorderColor(side))
+                    || !Objects.equals(this.getBorderStyle(side), 
cf.getBorderStyle(side))){
+                equal = false;
+                break;
+            }
+        }
+        
+        return equal;
     }
 }
\ No newline at end of file

Modified: 
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/extensions/XSSFCellFill.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/extensions/XSSFCellFill.java?rev=1849969&r1=1849968&r2=1849969&view=diff
==============================================================================
--- 
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/extensions/XSSFCellFill.java
 (original)
+++ 
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/extensions/XSSFCellFill.java
 Sun Dec 30 10:07:52 2018
@@ -22,6 +22,9 @@ import org.openxmlformats.schemas.spread
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.STPatternType;
 import org.apache.poi.xssf.usermodel.IndexedColorMap;
 import org.apache.poi.xssf.usermodel.XSSFColor;
+
+import java.util.Objects;
+
 import org.apache.poi.util.Internal;
 
 /**
@@ -173,6 +176,14 @@ public final class XSSFCellFill {
         if (!(o instanceof XSSFCellFill)) return false;
 
         XSSFCellFill cf = (XSSFCellFill) o;
-        return _fill.toString().equals(cf.getCTFill().toString());
+        
+        // bug 60845
+        // Do not compare the representing strings but the properties
+        // Reason:
+        //   The strings are different if the XMLObject is a fragment (e.g. 
the ones from cloneStyle)
+        //   even if they are in fact representing the same style
+        return Objects.equals(this.getFillBackgroundColor(), 
cf.getFillBackgroundColor())
+                && Objects.equals(this.getFillForegroundColor(), 
cf.getFillForegroundColor())
+                && Objects.equals(this.getPatternType(), cf.getPatternType());
     }
 }

Modified: 
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCellStyle.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCellStyle.java?rev=1849969&r1=1849968&r2=1849969&view=diff
==============================================================================
--- 
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCellStyle.java
 (original)
+++ 
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCellStyle.java
 Sun Dec 30 10:07:52 2018
@@ -21,6 +21,7 @@ import static org.junit.Assert.assertEqu
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNotSame;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
@@ -67,10 +68,10 @@ public class TestXSSFCellStyle {
                ctBorderA = CTBorder.Factory.newInstance();
                XSSFCellBorder borderA = new XSSFCellBorder(ctBorderA);
                long borderId = stylesTable.putBorder(borderA);
-               assertEquals(1, borderId);
+               assertEquals(0, borderId);
 
                XSSFCellBorder borderB = new XSSFCellBorder();
-               assertEquals(1, stylesTable.putBorder(borderB));
+               assertEquals(0, stylesTable.putBorder(borderB));
 
                ctFill = CTFill.Factory.newInstance();
                XSSFCellFill fill = new XSSFCellFill(ctFill, null);
@@ -133,7 +134,10 @@ public class TestXSSFCellStyle {
         assertEquals(num, stylesTable.getBorders().size());
         borderId = (int)cellStyle.getCoreXf().getBorderId();
         ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
-        assertFalse(ctBorder.isSetBottom());
+        //none is not the same as "not set", therefore the following doesn't 
work any more
+        //assertFalse(ctBorder.isSetBottom());
+        //replacement:
+        assertEquals(ctBorder.getBottom().getStyle(), STBorderStyle.NONE);
     }
 
        @Test
@@ -168,7 +172,10 @@ public class TestXSSFCellStyle {
         assertEquals(num, stylesTable.getBorders().size());
         borderId = (int)cellStyle.getCoreXf().getBorderId();
         ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
-        assertFalse(ctBorder.isSetRight());
+        //none is not the same as "not set", therefore the following doesn't 
work any more
+        //assertFalse(ctBorder.isSetRight());
+        //replacement:
+        assertEquals(ctBorder.getRight().getStyle(), STBorderStyle.NONE);
     }
 
        @Test
@@ -203,7 +210,10 @@ public class TestXSSFCellStyle {
         assertEquals(num, stylesTable.getBorders().size());
         borderId = (int)cellStyle.getCoreXf().getBorderId();
         ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
-        assertFalse(ctBorder.isSetLeft());
+        //none is not the same as "not set", therefore the following doesn't 
work any more
+        //assertFalse(ctBorder.isSetLeft());
+        //replacement:
+        assertEquals(ctBorder.getLeft().getStyle(), STBorderStyle.NONE);
        }
 
        @Test
@@ -238,7 +248,10 @@ public class TestXSSFCellStyle {
         assertEquals(num, stylesTable.getBorders().size());
         borderId = (int)cellStyle.getCoreXf().getBorderId();
         ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
-        assertFalse(ctBorder.isSetTop());
+        //none is not the same as "not set", therefore the following doesn't 
work any more
+        //assertFalse(ctBorder.isSetTop());
+        //replacement:
+        assertEquals(ctBorder.getTop().getStyle(), STBorderStyle.NONE);
     }
     
     private void testGetSetBorderXMLBean(BorderStyle border, 
STBorderStyle.Enum expected) {
@@ -258,10 +271,14 @@ public class TestXSSFCellStyle {
         cellStyle.setBorderTop(BorderStyle.NONE);
         assertEquals(BorderStyle.NONE, cellStyle.getBorderTop());
         int borderId = (int)cellStyle.getCoreXf().getBorderId();
-        assertTrue(borderId > 0);
+        // The default Style is already "none"
+        // Therefore the new style already exists as Id=0
+        //assertTrue(borderId > 0);
+        // replacement:
+        assertEquals(0, borderId);
         //check changes in the underlying xml bean
         CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
-        assertNull(ctBorder.getTop());
+        assertNotNull(ctBorder.getTop());
         // no border style and STBorderStyle.NONE are equivalent
         // POI prefers to unset the border style than explicitly set it 
STBorderStyle.NONE
     }
@@ -537,7 +554,6 @@ public class TestXSSFCellStyle {
         assertEquals(IndexedColors.AUTOMATIC.getIndex(), 
cellStyle.getFillBackgroundColor());
        }
 
-       @SuppressWarnings("deprecation")
     @Test
     public void testDefaultStyles() throws IOException {
 
@@ -571,7 +587,6 @@ public class TestXSSFCellStyle {
        }
 
     @Test
-    @SuppressWarnings("deprecation")
     public void testGetFillForegroundColor() throws IOException {
         XSSFWorkbook wb = new XSSFWorkbook();
         StylesTable styles = wb.getStylesSource();
@@ -580,7 +595,7 @@ public class TestXSSFCellStyle {
 
         XSSFCellStyle defaultStyle = wb.getCellStyleAt((short)0);
         assertEquals(IndexedColors.AUTOMATIC.getIndex(), 
defaultStyle.getFillForegroundColor());
-        assertEquals(null, defaultStyle.getFillForegroundXSSFColor());
+        assertNull(defaultStyle.getFillForegroundXSSFColor());
         assertEquals(FillPatternType.NO_FILL, defaultStyle.getFillPattern());
         assertEquals(FillPatternType.NO_FILL, 
defaultStyle.getFillPatternEnum());
 
@@ -636,8 +651,7 @@ public class TestXSSFCellStyle {
         assertEquals(FillPatternType.NO_FILL, cellStyle.getFillPattern());
         fillId = (int)cellStyle.getCoreXf().getFillId();
         ctFill2 = stylesTable.getFillAt(fillId).getCTFill();
-        assertFalse(ctFill2.getPatternFill().isSetPatternType());
-
+        assertNull(ctFill2.getPatternFill());
        }
 
        @Test
@@ -753,9 +767,9 @@ public class TestXSSFCellStyle {
       assertEquals(18, orig.getDataFormat());
       
       XSSFCellStyle clone = wb.createCellStyle();
-      assertFalse(HorizontalAlignment.RIGHT == clone.getAlignment());
-      assertFalse(fnt == clone.getFont());
-      assertFalse(18 == clone.getDataFormat());
+        assertNotSame(HorizontalAlignment.RIGHT, clone.getAlignment());
+        assertNotSame(fnt, clone.getFont());
+        assertNotEquals(18, clone.getDataFormat());
       
       clone.cloneStyleFrom(orig);
       assertEquals(HorizontalAlignment.RIGHT, clone.getAlignment());
@@ -770,87 +784,95 @@ public class TestXSSFCellStyle {
       wb.close();
        }
 
-       /**
-        * Cloning one XSSFCellStyle onto Another, different XSSFWorkbooks
-        */
-       @Test
+    /**
+     * Cloning one XSSFCellStyle onto Another, different XSSFWorkbooks
+     */
+    @Test
     public void testCloneStyleDiffWB() throws IOException {
-       XSSFWorkbook wbOrig = new XSSFWorkbook();
-       assertEquals(1, wbOrig.getNumberOfFonts());
-       assertEquals(0, wbOrig.getStylesSource().getNumberFormats().size());
-       
-       XSSFFont fnt = wbOrig.createFont();
-       fnt.setFontName("TestingFont");
-       assertEquals(2, wbOrig.getNumberOfFonts());
-       assertEquals(0, wbOrig.getStylesSource().getNumberFormats().size());
-       
-       XSSFDataFormat fmt = wbOrig.createDataFormat();
-       fmt.getFormat("MadeUpOne");
-       fmt.getFormat("MadeUpTwo");
-       
-       XSSFCellStyle orig = wbOrig.createCellStyle();
-       orig.setAlignment(HorizontalAlignment.RIGHT);
-       orig.setFont(fnt);
-       orig.setDataFormat(fmt.getFormat("Test##"));
-       
-       assertTrue(HorizontalAlignment.RIGHT == orig.getAlignment());
-       assertTrue(fnt == orig.getFont());
-       assertTrue(fmt.getFormat("Test##") == orig.getDataFormat());
-       
-       assertEquals(2, wbOrig.getNumberOfFonts());
-       assertEquals(3, wbOrig.getStylesSource().getNumberFormats().size());
-       
-       
-       // Now a style on another workbook
-       XSSFWorkbook wbClone = new XSSFWorkbook();
-       assertEquals(1, wbClone.getNumberOfFonts());
-       assertEquals(0, wbClone.getStylesSource().getNumberFormats().size());
-       assertEquals(1, wbClone.getNumCellStyles());
-       
-       XSSFDataFormat fmtClone = wbClone.createDataFormat();
-       XSSFCellStyle clone = wbClone.createCellStyle();
-       
-       assertEquals(1, wbClone.getNumberOfFonts());
-       assertEquals(0, wbClone.getStylesSource().getNumberFormats().size());
-       
-       assertFalse(HorizontalAlignment.RIGHT == clone.getAlignment());
-       assertNotEquals("TestingFont", clone.getFont().getFontName());
-       
-       clone.cloneStyleFrom(orig);
-       
-       assertEquals(2, wbClone.getNumberOfFonts());
-       assertEquals(2, wbClone.getNumCellStyles());
-       assertEquals(1, wbClone.getStylesSource().getNumberFormats().size());
-       
-       assertEquals(HorizontalAlignment.RIGHT, clone.getAlignment());
-       assertEquals("TestingFont", clone.getFont().getFontName());
-       assertEquals(fmtClone.getFormat("Test##"), clone.getDataFormat());
-       assertFalse(fmtClone.getFormat("Test##") == fmt.getFormat("Test##"));
-       
-       // Save it and re-check
-       XSSFWorkbook wbReload = 
XSSFTestDataSamples.writeOutAndReadBack(wbClone);
-       assertEquals(2, wbReload.getNumberOfFonts());
-       assertEquals(2, wbReload.getNumCellStyles());
-       assertEquals(1, wbReload.getStylesSource().getNumberFormats().size());
-       
-       XSSFCellStyle reload = wbReload.getCellStyleAt((short)1);
-       assertEquals(HorizontalAlignment.RIGHT, reload.getAlignment());
-       assertEquals("TestingFont", reload.getFont().getFontName());
-       assertEquals(fmtClone.getFormat("Test##"), reload.getDataFormat());
-       assertFalse(fmtClone.getFormat("Test##") == fmt.getFormat("Test##"));
-
-       XSSFWorkbook wbOrig2 = XSSFTestDataSamples.writeOutAndReadBack(wbOrig);
-       assertNotNull(wbOrig2);
-       wbOrig2.close();
-       
-       XSSFWorkbook wbClone2 = 
XSSFTestDataSamples.writeOutAndReadBack(wbClone);
-       assertNotNull(wbClone2);
-       wbClone2.close();
-       
-       wbReload.close();
-       wbClone.close();
-       wbOrig.close();
-   }
+        XSSFWorkbook wbOrig = new XSSFWorkbook();
+        assertEquals(1, wbOrig.getNumberOfFonts());
+        assertEquals(0, wbOrig.getStylesSource().getNumberFormats().size());
+
+        XSSFFont fnt = wbOrig.createFont();
+        fnt.setFontName("TestingFont");
+        assertEquals(2, wbOrig.getNumberOfFonts());
+        assertEquals(0, wbOrig.getStylesSource().getNumberFormats().size());
+
+        XSSFDataFormat fmt = wbOrig.createDataFormat();
+        fmt.getFormat("MadeUpOne");
+        fmt.getFormat("MadeUpTwo");
+
+        XSSFCellStyle orig = wbOrig.createCellStyle();
+        orig.setAlignment(HorizontalAlignment.RIGHT);
+        orig.setFont(fnt);
+        orig.setDataFormat(fmt.getFormat("Test##"));
+        orig.setFillPattern(FillPatternType.SOLID_FOREGROUND);
+        orig.setFillForegroundColor(IndexedColors.BRIGHT_GREEN.getIndex());
+
+        XSSFCellStyle origEmpty = wbOrig.createCellStyle();
+
+        assertSame(HorizontalAlignment.RIGHT, orig.getAlignment());
+        assertSame(fnt, orig.getFont());
+        assertEquals(fmt.getFormat("Test##"), orig.getDataFormat());
+
+        assertEquals(2, wbOrig.getNumberOfFonts());
+        assertEquals(3, wbOrig.getStylesSource().getNumberFormats().size());
+
+
+        // Now a style on another workbook
+        XSSFWorkbook wbClone = new XSSFWorkbook();
+        assertEquals(1, wbClone.getNumberOfFonts());
+        assertEquals(0, wbClone.getStylesSource().getNumberFormats().size());
+        assertEquals(1, wbClone.getNumCellStyles());
+
+        XSSFDataFormat fmtClone = wbClone.createDataFormat();
+        XSSFCellStyle clone = wbClone.createCellStyle();
+
+        assertEquals(1, wbClone.getNumberOfFonts());
+        assertEquals(0, wbClone.getStylesSource().getNumberFormats().size());
+
+        assertNotSame(HorizontalAlignment.RIGHT, clone.getAlignment());
+        assertNotEquals("TestingFont", clone.getFont().getFontName());
+
+        clone.cloneStyleFrom(orig);
+
+        assertEquals(2, wbClone.getNumberOfFonts());
+        assertEquals(2, wbClone.getNumCellStyles());
+        assertEquals(1, wbClone.getStylesSource().getNumberFormats().size());
+
+        assertEquals(HorizontalAlignment.RIGHT, clone.getAlignment());
+        assertEquals("TestingFont", clone.getFont().getFontName());
+        assertEquals(fmtClone.getFormat("Test##"), clone.getDataFormat());
+        assertNotEquals(fmtClone.getFormat("Test##"), fmt.getFormat("Test##"));
+        assertEquals(clone.getFillPatternEnum(), 
FillPatternType.SOLID_FOREGROUND);
+        assertEquals(clone.getFillForegroundColor(), 
IndexedColors.BRIGHT_GREEN.getIndex());
+
+        // Save it and re-check
+        XSSFWorkbook wbReload = 
XSSFTestDataSamples.writeOutAndReadBack(wbClone);
+        assertEquals(2, wbReload.getNumberOfFonts());
+        assertEquals(2, wbReload.getNumCellStyles());
+        assertEquals(1, wbReload.getStylesSource().getNumberFormats().size());
+
+        XSSFCellStyle reload = wbReload.getCellStyleAt((short)1);
+        assertEquals(HorizontalAlignment.RIGHT, reload.getAlignment());
+        assertEquals("TestingFont", reload.getFont().getFontName());
+        assertEquals(fmtClone.getFormat("Test##"), reload.getDataFormat());
+        assertNotEquals(fmtClone.getFormat("Test##"), fmt.getFormat("Test##"));
+        assertEquals(clone.getFillPatternEnum(), 
FillPatternType.SOLID_FOREGROUND);
+        assertEquals(clone.getFillForegroundColor(), 
IndexedColors.BRIGHT_GREEN.getIndex());
+
+        XSSFWorkbook wbOrig2 = XSSFTestDataSamples.writeOutAndReadBack(wbOrig);
+        assertNotNull(wbOrig2);
+        wbOrig2.close();
+
+        XSSFWorkbook wbClone2 = 
XSSFTestDataSamples.writeOutAndReadBack(wbClone);
+        assertNotNull(wbClone2);
+        wbClone2.close();
+
+        wbReload.close();
+        wbClone.close();
+        wbOrig.close();
+    }
 
     /**
      * Avoid ArrayIndexOutOfBoundsException  when creating cell style
@@ -900,7 +922,7 @@ public class TestXSSFCellStyle {
        Row r = s.getRow(0);
        CellStyle cs = r.getCell(0).getCellStyle();
 
-       assertEquals(true, cs.getShrinkToFit());
+        assertTrue(cs.getShrinkToFit());
 
        // New file
        XSSFWorkbook wb2 = new XSSFWorkbook();
@@ -919,8 +941,8 @@ public class TestXSSFCellStyle {
        XSSFWorkbook wb3 = XSSFTestDataSamples.writeOutAndReadBack(wb2);
        s = wb3.getSheetAt(0);
        r = s.getRow(0);
-       assertEquals(false, r.getCell(0).getCellStyle().getShrinkToFit());
-       assertEquals(true,  r.getCell(1).getCellStyle().getShrinkToFit());
+        assertFalse(r.getCell(0).getCellStyle().getShrinkToFit());
+        assertTrue(r.getCell(1).getCellStyle().getShrinkToFit());
 
        XSSFWorkbook wb4 = XSSFTestDataSamples.writeOutAndReadBack(wb2);
        assertNotNull(wb4);



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to