This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/develop by this push:
     new a63713b869 fix: Made the Request objects more null-safe fixes: #2280
a63713b869 is described below

commit a63713b86927c01605d47f71970c2e199904a78d
Author: Christofer Dutz <christofer.d...@c-ware.de>
AuthorDate: Fri Sep 26 16:07:08 2025 +0200

    fix: Made the Request objects more null-safe
    fixes: #2280
    
    chore: Migrated to a more Java 21 code style
    chore: Removed the "Proprietary" request options.
---
 .../java/spi/messages/DefaultPlcDiscoveryItem.java |  6 +--
 .../java/spi/messages/DefaultPlcReadRequest.java   |  4 +-
 .../java/spi/messages/DefaultPlcReadResponse.java  | 48 ++++++++--------------
 .../spi/messages/DefaultPlcSubscriptionEvent.java  |  1 -
 .../messages/DefaultPlcSubscriptionRequest.java    |  2 +-
 .../messages/DefaultPlcUnsubscriptionRequest.java  |  5 +--
 .../java/spi/messages/DefaultPlcWriteRequest.java  | 12 +++---
 .../java/spi/messages/PlcProprietaryRequest.java   | 25 -----------
 .../java/spi/messages/PlcProprietaryResponse.java  | 25 -----------
 .../java/spi/messages/PlcProprietarySender.java    | 25 -----------
 10 files changed, 29 insertions(+), 124 deletions(-)

diff --git 
a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcDiscoveryItem.java
 
b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcDiscoveryItem.java
index 0aecb61003..85780ae7f5 100644
--- 
a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcDiscoveryItem.java
+++ 
b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcDiscoveryItem.java
@@ -85,7 +85,7 @@ public class DefaultPlcDiscoveryItem implements 
PlcDiscoveryItem, Serializable {
     @Override
     public String getConnectionUrl() {
         StringBuilder sb = new StringBuilder(String.format("%s:%s://%s",
-            protocolCode, transportCode, transportUrl.toString()));
+            protocolCode, transportCode, transportUrl));
         if(options != null && !options.isEmpty()) {
             boolean first = true;
             for (Map.Entry<String, String> optionEntry : options.entrySet()) {
@@ -112,8 +112,8 @@ public class DefaultPlcDiscoveryItem implements 
PlcDiscoveryItem, Serializable {
             transportCode.getBytes(StandardCharsets.UTF_8).length * 8,
             transportCode, 
WithOption.WithEncoding(StandardCharsets.UTF_8.name()));
         writeBuffer.writeString("transportUrl",
-            transportUrl.toString().getBytes(StandardCharsets.UTF_8).length * 
8,
-            transportUrl.toString(), 
WithOption.WithEncoding(StandardCharsets.UTF_8.name()));
+            transportUrl.getBytes(StandardCharsets.UTF_8).length * 8,
+            transportUrl, 
WithOption.WithEncoding(StandardCharsets.UTF_8.name()));
         if(options != null && !options.isEmpty()) {
             writeBuffer.pushContext("options");
             for (Map.Entry<String, String> optionEntry : options.entrySet()) {
diff --git 
a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcReadRequest.java
 
b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcReadRequest.java
index ebc112b26a..b3e1787e15 100644
--- 
a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcReadRequest.java
+++ 
b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcReadRequest.java
@@ -78,12 +78,12 @@ public class DefaultPlcReadRequest implements 
PlcReadRequest, PlcTagRequest, Ser
 
     @Override
     public PlcTag getTag(String tagName) {
-        return tags.get(tagName).getTag();
+        return tags.get(tagName) != null ? tags.get(tagName).getTag() : null;
     }
 
     @Override
     public PlcResponseCode getTagResponseCode(String tagName) {
-        return tags.get(tagName).getResponseCode();
+        return tags.get(tagName) != null ? tags.get(tagName).getResponseCode() 
: null;
     }
 
     @Override
diff --git 
a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcReadResponse.java
 
b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcReadResponse.java
index f0ee410501..2c6745a9e9 100644
--- 
a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcReadResponse.java
+++ 
b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcReadResponse.java
@@ -96,8 +96,7 @@ public class DefaultPlcReadResponse implements 
PlcReadResponse, Serializable {
     @Override
     public int getNumberOfValues(String name) {
         PlcValue tagInternal = getTagInternal(name);
-        if(tagInternal instanceof PlcList) {
-            PlcList plcList = (PlcList) tagInternal;
+        if(tagInternal instanceof PlcList plcList) {
             return plcList.getLength();
         } else {
             return 1;
@@ -146,8 +145,7 @@ public class DefaultPlcReadResponse implements 
PlcReadResponse, Serializable {
     @Override
     public Collection<Object> getAllObjects(String name) {
         PlcValue tagInternal = getTagInternal(name);
-        if(tagInternal instanceof PlcList) {
-            PlcList plcList = (PlcList) tagInternal;
+        if(tagInternal instanceof PlcList plcList) {
             List<Object> items = new ArrayList<>(plcList.getLength());
             for (PlcValue plcValue : plcList.getList()) {
                 items.add(plcValue.getObject());
@@ -182,8 +180,7 @@ public class DefaultPlcReadResponse implements 
PlcReadResponse, Serializable {
     @Override
     public Collection<Boolean> getAllBooleans(String name) {
         PlcValue tagInternal = getTagInternal(name);
-        if(tagInternal instanceof PlcList) {
-            PlcList plcList = (PlcList) tagInternal;
+        if(tagInternal instanceof PlcList plcList) {
             List<Boolean> items = new ArrayList<>(plcList.getLength());
             for (PlcValue plcValue : plcList.getList()) {
                 items.add(plcValue.getBoolean());
@@ -218,8 +215,7 @@ public class DefaultPlcReadResponse implements 
PlcReadResponse, Serializable {
     @Override
     public Collection<Byte> getAllBytes(String name) {
         PlcValue tagInternal = getTagInternal(name);
-        if(tagInternal instanceof PlcList) {
-            PlcList plcList = (PlcList) tagInternal;
+        if(tagInternal instanceof PlcList plcList) {
             List<Byte> items = new ArrayList<>(plcList.getLength());
             for (PlcValue plcValue : plcList.getList()) {
                 items.add(plcValue.getByte());
@@ -254,8 +250,7 @@ public class DefaultPlcReadResponse implements 
PlcReadResponse, Serializable {
     @Override
     public Collection<Short> getAllShorts(String name) {
         PlcValue tagInternal = getTagInternal(name);
-        if(tagInternal instanceof PlcList) {
-            PlcList plcList = (PlcList) tagInternal;
+        if(tagInternal instanceof PlcList plcList) {
             List<Short> items = new ArrayList<>(plcList.getLength());
             for (PlcValue plcValue : plcList.getList()) {
                 items.add(plcValue.getShort());
@@ -290,8 +285,7 @@ public class DefaultPlcReadResponse implements 
PlcReadResponse, Serializable {
     @Override
     public Collection<Integer> getAllIntegers(String name) {
         PlcValue tagInternal = getTagInternal(name);
-        if(tagInternal instanceof PlcList) {
-            PlcList plcList = (PlcList) tagInternal;
+        if(tagInternal instanceof PlcList plcList) {
             List<Integer> items = new ArrayList<>(plcList.getLength());
             for (PlcValue plcValue : plcList.getList()) {
                 items.add(plcValue.getInteger());
@@ -326,8 +320,7 @@ public class DefaultPlcReadResponse implements 
PlcReadResponse, Serializable {
     @Override
     public Collection<BigInteger> getAllBigIntegers(String name) {
         PlcValue tagInternal = getTagInternal(name);
-        if(tagInternal instanceof PlcList) {
-            PlcList plcList = (PlcList) tagInternal;
+        if(tagInternal instanceof PlcList plcList) {
             List<BigInteger> items = new ArrayList<>(plcList.getLength());
             for (PlcValue plcValue : plcList.getList()) {
                 items.add(plcValue.getBigInteger());
@@ -362,8 +355,7 @@ public class DefaultPlcReadResponse implements 
PlcReadResponse, Serializable {
     @Override
     public Collection<Long> getAllLongs(String name) {
         PlcValue tagInternal = getTagInternal(name);
-        if(tagInternal instanceof PlcList) {
-            PlcList plcList = (PlcList) tagInternal;
+        if(tagInternal instanceof PlcList plcList) {
             List<Long> items = new ArrayList<>(plcList.getLength());
             for (PlcValue plcValue : plcList.getList()) {
                 items.add(plcValue.getLong());
@@ -398,8 +390,7 @@ public class DefaultPlcReadResponse implements 
PlcReadResponse, Serializable {
     @Override
     public Collection<Float> getAllFloats(String name) {
         PlcValue tagInternal = getTagInternal(name);
-        if(tagInternal instanceof PlcList) {
-            PlcList plcList = (PlcList) tagInternal;
+        if(tagInternal instanceof PlcList plcList) {
             List<Float> items = new ArrayList<>(plcList.getLength());
             for (PlcValue plcValue : plcList.getList()) {
                 items.add(plcValue.getFloat());
@@ -434,8 +425,7 @@ public class DefaultPlcReadResponse implements 
PlcReadResponse, Serializable {
     @Override
     public Collection<Double> getAllDoubles(String name) {
         PlcValue tagInternal = getTagInternal(name);
-        if(tagInternal instanceof PlcList) {
-            PlcList plcList = (PlcList) tagInternal;
+        if(tagInternal instanceof PlcList plcList) {
             List<Double> items = new ArrayList<>(plcList.getLength());
             for (PlcValue plcValue : plcList.getList()) {
                 items.add(plcValue.getDouble());
@@ -470,8 +460,7 @@ public class DefaultPlcReadResponse implements 
PlcReadResponse, Serializable {
     @Override
     public Collection<BigDecimal> getAllBigDecimals(String name) {
         PlcValue tagInternal = getTagInternal(name);
-        if(tagInternal instanceof PlcList) {
-            PlcList plcList = (PlcList) tagInternal;
+        if(tagInternal instanceof PlcList plcList) {
             List<BigDecimal> items = new ArrayList<>(plcList.getLength());
             for (PlcValue plcValue : plcList.getList()) {
                 items.add(plcValue.getBigDecimal());
@@ -506,8 +495,7 @@ public class DefaultPlcReadResponse implements 
PlcReadResponse, Serializable {
     @Override
     public Collection<String> getAllStrings(String name) {
         PlcValue tagInternal = getTagInternal(name);
-        if(tagInternal instanceof PlcList) {
-            PlcList plcList = (PlcList) tagInternal;
+        if(tagInternal instanceof PlcList plcList) {
             List<String> items = new ArrayList<>(plcList.getLength());
             for (PlcValue plcValue : plcList.getList()) {
                 items.add(plcValue.getString());
@@ -542,8 +530,7 @@ public class DefaultPlcReadResponse implements 
PlcReadResponse, Serializable {
     @Override
     public Collection<LocalTime> getAllTimes(String name) {
         PlcValue tagInternal = getTagInternal(name);
-        if(tagInternal instanceof PlcList) {
-            PlcList plcList = (PlcList) tagInternal;
+        if(tagInternal instanceof PlcList plcList) {
             List<LocalTime> items = new ArrayList<>(plcList.getLength());
             for (PlcValue plcValue : plcList.getList()) {
                 items.add(plcValue.getTime());
@@ -578,8 +565,7 @@ public class DefaultPlcReadResponse implements 
PlcReadResponse, Serializable {
     @Override
     public Collection<LocalDate> getAllDates(String name) {
         PlcValue tagInternal = getTagInternal(name);
-        if(tagInternal instanceof PlcList) {
-            PlcList plcList = (PlcList) tagInternal;
+        if(tagInternal instanceof PlcList plcList) {
             List<LocalDate> items = new ArrayList<>(plcList.getLength());
             for (PlcValue plcValue : plcList.getList()) {
                 items.add(plcValue.getDate());
@@ -614,8 +600,7 @@ public class DefaultPlcReadResponse implements 
PlcReadResponse, Serializable {
     @Override
     public Collection<LocalDateTime> getAllDateTimes(String name) {
         PlcValue tagInternal = getTagInternal(name);
-        if(tagInternal instanceof PlcList) {
-            PlcList plcList = (PlcList) tagInternal;
+        if(tagInternal instanceof PlcList plcList) {
             List<LocalDateTime> items = new ArrayList<>(plcList.getLength());
             for (PlcValue plcValue : plcList.getList()) {
                 items.add(plcValue.getDateTime());
@@ -649,8 +634,7 @@ public class DefaultPlcReadResponse implements 
PlcReadResponse, Serializable {
 
     protected PlcValue getTagIndexInternal(String name, int index) {
         final PlcValue values = getTagInternal(name);
-        if(values instanceof PlcList) {
-            PlcList plcList = (PlcList) values;
+        if(values instanceof PlcList plcList) {
             if(index > (plcList.getLength() - 1)) {
                 return null;
             }
diff --git 
a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcSubscriptionEvent.java
 
b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcSubscriptionEvent.java
index e4ef1835aa..03a04d0793 100644
--- 
a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcSubscriptionEvent.java
+++ 
b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcSubscriptionEvent.java
@@ -21,7 +21,6 @@ package org.apache.plc4x.java.spi.messages;
 import java.util.Collections;
 import org.apache.plc4x.java.api.messages.PlcSubscriptionEvent;
 import org.apache.plc4x.java.api.metadata.Metadata;
-import org.apache.plc4x.java.spi.metadata.DefaultMetadata;
 import org.apache.plc4x.java.api.model.PlcTag;
 import org.apache.plc4x.java.api.value.PlcValue;
 import org.apache.plc4x.java.spi.messages.utils.PlcResponseItem;
diff --git 
a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcSubscriptionRequest.java
 
b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcSubscriptionRequest.java
index 65e1a3a6cb..1e1e8a98aa 100644
--- 
a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcSubscriptionRequest.java
+++ 
b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcSubscriptionRequest.java
@@ -77,7 +77,7 @@ public class DefaultPlcSubscriptionRequest implements 
PlcSubscriptionRequest, Se
 
     @Override
     public PlcSubscriptionTag getTag(String tagName) {
-        return tags.get(tagName).getTag();
+        return tags.get(tagName) != null ? tags.get(tagName).getTag() : null;
     }
 
     @Override
diff --git 
a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcUnsubscriptionRequest.java
 
b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcUnsubscriptionRequest.java
index 64570741f8..ba97959179 100644
--- 
a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcUnsubscriptionRequest.java
+++ 
b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcUnsubscriptionRequest.java
@@ -28,7 +28,6 @@ import org.apache.plc4x.java.spi.utils.Serializable;
 
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
-import java.util.stream.Collectors;
 
 public class DefaultPlcUnsubscriptionRequest implements 
PlcUnsubscriptionRequest, PlcRequest, Serializable {
 
@@ -83,13 +82,13 @@ public class DefaultPlcUnsubscriptionRequest implements 
PlcUnsubscriptionRequest
         @Override
         public PlcUnsubscriptionRequest.Builder 
addHandles(PlcSubscriptionHandle plcSubscriptionHandle1, 
PlcSubscriptionHandle... plcSubscriptionHandles) {
             this.plcSubscriptionHandles.add(plcSubscriptionHandle1);
-            
this.plcSubscriptionHandles.addAll(Arrays.stream(plcSubscriptionHandles).map(PlcSubscriptionHandle.class::cast).collect(Collectors.toList()));
+            
this.plcSubscriptionHandles.addAll(Arrays.stream(plcSubscriptionHandles).map(PlcSubscriptionHandle.class::cast).toList());
             return this;
         }
 
         @Override
         public PlcUnsubscriptionRequest.Builder 
addHandles(Collection<PlcSubscriptionHandle> plcSubscriptionHandles) {
-            
this.plcSubscriptionHandles.addAll(plcSubscriptionHandles.stream().map(PlcSubscriptionHandle.class::cast).collect(Collectors.toList()));
+            
this.plcSubscriptionHandles.addAll(plcSubscriptionHandles.stream().map(PlcSubscriptionHandle.class::cast).toList());
             return this;
         }
 
diff --git 
a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteRequest.java
 
b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteRequest.java
index d8530196f2..f4b23d1051 100644
--- 
a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteRequest.java
+++ 
b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteRequest.java
@@ -77,12 +77,12 @@ public class DefaultPlcWriteRequest implements 
PlcWriteRequest, Serializable {
 
     @Override
     public PlcResponseCode getTagResponseCode(String tagName) {
-        return tags.get(tagName).getResponseCode();
+        return tags.get(tagName) != null ? tags.get(tagName).getResponseCode() 
: null;
     }
 
     @Override
-    public PlcTag getTag(String name) {
-        return tags.get(name).getTag();
+    public PlcTag getTag(String tagName) {
+        return tags.get(tagName) != null ? tags.get(tagName).getTag() : null;
     }
 
     @Override
@@ -105,8 +105,7 @@ public class DefaultPlcWriteRequest implements 
PlcWriteRequest, Serializable {
     @Override
     public int getNumberOfValues(String name) {
         final PlcValue value = tags.get(name).getValue();
-        if (value instanceof PlcList) {
-            PlcList list = (PlcList) value;
+        if (value instanceof PlcList list) {
             return list.getLength();
         }
         return 1;
@@ -135,8 +134,7 @@ public class DefaultPlcWriteRequest implements 
PlcWriteRequest, Serializable {
     }
 
     protected void serializePlcValue(PlcValue plcValue, WriteBuffer 
writeBuffer) throws SerializationException {
-        if (plcValue instanceof Serializable) {
-            Serializable serializable = (Serializable) plcValue;
+        if (plcValue instanceof Serializable serializable) {
             serializable.serialize(writeBuffer);
         } else {
             String plcValueString = plcValue.getString();
diff --git 
a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/PlcProprietaryRequest.java
 
b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/PlcProprietaryRequest.java
deleted file mode 100644
index a93fb2d7e0..0000000000
--- 
a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/PlcProprietaryRequest.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   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.
- */
-package org.apache.plc4x.java.spi.messages;
-
-import org.apache.plc4x.java.api.messages.PlcRequest;
-
-public interface PlcProprietaryRequest<REQUEST> extends PlcRequest {
-    REQUEST getProprietaryRequest();
-}
diff --git 
a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/PlcProprietaryResponse.java
 
b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/PlcProprietaryResponse.java
deleted file mode 100644
index 667bd960d7..0000000000
--- 
a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/PlcProprietaryResponse.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   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.
- */
-package org.apache.plc4x.java.spi.messages;
-
-import org.apache.plc4x.java.api.messages.PlcResponse;
-
-public interface PlcProprietaryResponse<T> extends PlcResponse {
-    T getResponse();
-}
diff --git 
a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/PlcProprietarySender.java
 
b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/PlcProprietarySender.java
deleted file mode 100644
index af1b7c2070..0000000000
--- 
a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/PlcProprietarySender.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   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.
- */
-package org.apache.plc4x.java.spi.messages;
-
-import java.util.concurrent.CompletableFuture;
-
-public interface PlcProprietarySender {
-    <T> CompletableFuture<PlcProprietaryResponse<T>> 
send(PlcProprietaryRequest proprietaryRequest);
-}

Reply via email to