Repository: cadence-workflow/cadence
Pull request #6918: [domain-deletion]Add handler to process delete domain replication task
Author: login: gazi-yestemirova
Created: 2025-05-14T16:00:06Z | Merged: 2025-05-16T06:45:34Z

<!-- Describe what has changed in this PR -->
**What changed?**
This PR introduces the `handleDomainDeleteReplicationTask`handler. It is responsible for processing replication tasks specifically related to domain deletions.
Related IDL changes: https://github.com/cadence-workflow/cadence-idl/pull/200 
https://github.com/cadence-workflow/cadence-idl/pull/201 

<!-- Tell your future self why have you made these changes -->
**Why?**
Currently, domain deletions are not consistently propagated across all replicas, leading to potential inconsistencies. This task handler ensures that domain delete operations are reliably replicated.

<!-- How have you verified this change? Tested locally? Added a unit test? Checked in staging env? -->
**How did you test it?**
Unit tests & local testing

<!-- Assuming the worst case, what can be broken when deploying this change to production? -->
**Potential risks**

<!-- Is it notable for release? e.g. schema updates, configuration or data migration required? If so, please mention it, and also update CHANGELOG.md -->
**Release notes**

<!-- Is there any documentation updates should be made for config, https://cadenceworkflow.io/docs/operation-guide/setup/ ? If so, please open an PR in https://github.com/cadence-workflow/cadence-docs -->
**Documentation Changes**



Diff:
diff --git a/.gen/go/replicator/replicator.go b/.gen/go/replicator/replicator.go
index 833f445dfdc..4326d122eb0 100644
--- a/.gen/go/replicator/replicator.go
+++ b/.gen/go/replicator/replicator.go
@@ -225,6 +225,7 @@ type DomainOperation int32
 const (
 	DomainOperationCreate DomainOperation = 0
 	DomainOperationUpdate DomainOperation = 1
+	DomainOperationDelete DomainOperation = 2
 )
 
 // DomainOperation_Values returns all recognized values of DomainOperation.
@@ -232,6 +233,7 @@ func DomainOperation_Values() []DomainOperation {
 	return []DomainOperation{
 		DomainOperationCreate,
 		DomainOperationUpdate,
+		DomainOperationDelete,
 	}
 }
 
@@ -248,6 +250,9 @@ func (v *DomainOperation) UnmarshalText(value []byte) error {
 	case "Update":
 		*v = DomainOperationUpdate
 		return nil
+	case "Delete":
+		*v = DomainOperationDelete
+		return nil
 	default:
 		val, err := strconv.ParseInt(s, 10, 32)
 		if err != nil {
@@ -270,6 +275,8 @@ func (v DomainOperation) MarshalText() ([]byte, error) {
 		return []byte("Create"), nil
 	case 1:
 		return []byte("Update"), nil
+	case 2:
+		return []byte("Delete"), nil
 	}
 	return []byte(strconv.FormatInt(int64(v), 10)), nil
 }
@@ -285,6 +292,8 @@ func (v DomainOperation) MarshalLogObject(enc zapcore.ObjectEncoder) error {
 		enc.AddString("name", "Create")
 	case 1:
 		enc.AddString("name", "Update")
+	case 2:
+		enc.AddString("name", "Delete")
 	}
 	return nil
 }
@@ -357,6 +366,8 @@ func (v DomainOperation) String() string {
 		return "Create"
 	case 1:
 		return "Update"
+	case 2:
+		return "Delete"
 	}
 	return fmt.Sprintf("DomainOperation(%d)", w)
 }
@@ -379,6 +390,8 @@ func (v DomainOperation) MarshalJSON() ([]byte, error) {
 		return ([]byte)("\"Create\""), nil
 	case 1:
 		return ([]byte)("\"Update\""), nil
+	case 2:
+		return ([]byte)("\"Delete\""), nil
 	}
 	return ([]byte)(strconv.FormatInt(int64(v), 10)), nil
 }
@@ -10777,11 +10790,11 @@ var ThriftModule = &thriftreflect.ThriftModule{
 	Name:     "replicator",
 	Package:  "github.com/uber/cadence/.gen/go/replicator",
 	FilePath: "replicator.thrift",
-	SHA1:     "85475c6529845fd2ee1b039bfa9eda1128146139",
+	SHA1:     "5511dc1dfc4b6025f16d77cac580134c62303bd6",
 	Includes: []*thriftreflect.ThriftModule{
 		shared.ThriftModule,
 	},
 	Raw: rawIDL,
 }
 
-const rawIDL = "// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nnamespace java com.uber.cadence.replicator\n\ninclude \"shared.thrift\"\n\nenum ReplicationTaskType {\n  Domain\n  History\n  SyncShardStatus\n  SyncActivity\n  HistoryMetadata\n  HistoryV2\n  FailoverMarker\n}\n\nenum DomainOperation {\n  Create\n  Update\n}\n\nstruct DomainTaskAttributes {\n  05: optional DomainOperation domainOperation\n  10: optional string id\n  20: optional shared.DomainInfo info\n  30: optional shared.DomainConfiguration config\n  40: optional shared.DomainReplicationConfiguration replicationConfig\n  50: optional i64 (js.type = \"Long\") configVersion\n  60: optional i64 (js.type = \"Long\") failoverVersion\n  70: optional i64 (js.type = \"Long\") previousFailoverVersion\n}\n\nstruct SyncShardStatusTaskAttributes {\n  10: optional string sourceCluster\n  20: optional i64 (js.type = \"Long\") shardId\n  30: optional i64 (js.type = \"Long\") timestamp\n}\n\nstruct SyncActivityTaskAttributes {\n  10: optional string domainId\n  20: optional string workflowId\n  30: optional string runId\n  40: optional i64 (js.type = \"Long\") version\n  50: optional i64 (js.type = \"Long\") scheduledId\n  60: optional i64 (js.type = \"Long\") scheduledTime\n  70: optional i64 (js.type = \"Long\") startedId\n  80: optional i64 (js.type = \"Long\") startedTime\n  90: optional i64 (js.type = \"Long\") lastHeartbeatTime\n  100: optional binary details\n  110: optional i32 attempt\n  120: optional string lastFailureReason\n  130: optional string lastWorkerIdentity\n  140: optional binary lastFailureDetails\n  150: optional shared.VersionHistory versionHistory\n}\n\nstruct HistoryTaskV2Attributes {\n  05: optional i64 (js.type = \"Long\") taskId\n  10: optional string domainId\n  20: optional string workflowId\n  30: optional string runId\n  40: optional list<shared.VersionHistoryItem> versionHistoryItems\n  50: optional shared.DataBlob events\n  // new run events does not need version history since there is no prior events\n  70: optional shared.DataBlob newRunEvents\n}\n\nstruct FailoverMarkerAttributes{\n\t10: optional string domainID\n\t20: optional i64 (js.type = \"Long\") failoverVersion\n\t30: optional i64 (js.type = \"Long\") creationTime\n}\n\nstruct FailoverMarkers{\n\t10: optional list<FailoverMarkerAttributes> failoverMarkers\n}\n\nstruct ReplicationTask {\n  10: optional ReplicationTaskType taskType\n  11: optional i64 (js.type = \"Long\") sourceTaskId\n  20: optional DomainTaskAttributes domainTaskAttributes\n  40: optional SyncShardStatusTaskAttributes syncShardStatusTaskAttributes\n  50: optional SyncActivityTaskAttributes syncActivityTaskAttributes\n  70: optional HistoryTaskV2Attributes historyTaskV2Attributes\n  80: optional FailoverMarkerAttributes failoverMarkerAttributes\n  90: optional i64 (js.type = \"Long\") creationTime\n}\n\nstruct ReplicationToken {\n  10: optional i32 shardID\n  // lastRetrivedMessageId is where the next fetch should begin with\n  20: optional i64 (js.type = \"Long\") lastRetrievedMessageId\n  // lastProcessedMessageId is the last messageId that is processed on the passive side.\n  // This can be different than lastRetrievedMessageId if passive side supports prefetching messages.\n  30: optional i64 (js.type = \"Long\") lastProcessedMessageId\n}\n\nstruct SyncShardStatus {\n  10: optional i64 (js.type = \"Long\") timestamp\n}\n\nstruct ReplicationMessages {\n  10: optional list<ReplicationTask> replicationTasks\n  // This can be different than the last taskId in the above list, because sender can decide to skip tasks (e.g. for completed workflows).\n  20: optional i64 (js.type = \"Long\") lastRetrievedMessageId\n  30: optional bool hasMore // Hint for flow control\n  40: optional SyncShardStatus syncShardStatus\n}\n\nstruct ReplicationTaskInfo {\n  10: optional string domainID\n  20: optional string workflowID\n  30: optional string runID\n  40: optional i16 taskType\n  50: optional i64 (js.type = \"Long\") taskID\n  60: optional i64 (js.type = \"Long\") version\n  70: optional i64 (js.type = \"Long\") firstEventID\n  80: optional i64 (js.type = \"Long\") nextEventID\n  90: optional i64 (js.type = \"Long\") scheduledID\n}\n\nstruct GetReplicationMessagesRequest {\n  10: optional list<ReplicationToken> tokens\n  20: optional string clusterName\n}\n\nstruct GetReplicationMessagesResponse {\n  10: optional map<i32, ReplicationMessages> messagesByShard\n}\n\nstruct GetDomainReplicationMessagesRequest {\n  // lastRetrievedMessageId is where the next fetch should begin with\n  10: optional i64 (js.type = \"Long\") lastRetrievedMessageId\n  // lastProcessedMessageId is the last messageId that is processed on the passive side.\n  // This can be different than lastRetrievedMessageId if passive side supports prefetching messages.\n  20: optional i64 (js.type = \"Long\") lastProcessedMessageId\n  // clusterName is the name of the pulling cluster\n  30: optional string clusterName\n}\n\nstruct GetDomainReplicationMessagesResponse {\n  10: optional ReplicationMessages messages\n}\n\nstruct GetDLQReplicationMessagesRequest {\n  10: optional list<ReplicationTaskInfo> taskInfos\n}\n\nstruct GetDLQReplicationMessagesResponse {\n  10: optional list<ReplicationTask> replicationTasks\n}\n\nenum DLQType {\n  Replication,\n  Domain,\n}\n\nstruct ReadDLQMessagesRequest{\n  10: optional DLQType type\n  20: optional i32 shardID\n  30: optional string sourceCluster\n  40: optional i64 (js.type = \"Long\") inclusiveEndMessageID\n  50: optional i32 maximumPageSize\n  60: optional binary nextPageToken\n}\n\nstruct ReadDLQMessagesResponse{\n  10: optional DLQType type\n  20: optional list<ReplicationTask> replicationTasks\n  30: optional binary nextPageToken\n  40: optional list<ReplicationTaskInfo> replicationTasksInfo\n}\n\nstruct PurgeDLQMessagesRequest{\n  10: optional DLQType type\n  20: optional i32 shardID\n  30: optional string sourceCluster\n  40: optional i64 (js.type = \"Long\") inclusiveEndMessageID\n}\n\nstruct MergeDLQMessagesRequest{\n  10: optional DLQType type\n  20: optional i32 shardID\n  30: optional string sourceCluster\n  40: optional i64 (js.type = \"Long\") inclusiveEndMessageID\n  50: optional i32 maximumPageSize\n  60: optional binary nextPageToken\n}\n\nstruct MergeDLQMessagesResponse{\n  10: optional binary nextPageToken\n}\n"
+const rawIDL = "// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nnamespace java com.uber.cadence.replicator\n\ninclude \"shared.thrift\"\n\nenum ReplicationTaskType {\n  Domain\n  History\n  SyncShardStatus\n  SyncActivity\n  HistoryMetadata\n  HistoryV2\n  FailoverMarker\n}\n\nenum DomainOperation {\n  Create\n  Update\n  Delete\n}\n\nstruct DomainTaskAttributes {\n  05: optional DomainOperation domainOperation\n  10: optional string id\n  20: optional shared.DomainInfo info\n  30: optional shared.DomainConfiguration config\n  40: optional shared.DomainReplicationConfiguration replicationConfig\n  50: optional i64 (js.type = \"Long\") configVersion\n  60: optional i64 (js.type = \"Long\") failoverVersion\n  70: optional i64 (js.type = \"Long\") previousFailoverVersion\n}\n\nstruct SyncShardStatusTaskAttributes {\n  10: optional string sourceCluster\n  20: optional i64 (js.type = \"Long\") shardId\n  30: optional i64 (js.type = \"Long\") timestamp\n}\n\nstruct SyncActivityTaskAttributes {\n  10: optional string domainId\n  20: optional string workflowId\n  30: optional string runId\n  40: optional i64 (js.type = \"Long\") version\n  50: optional i64 (js.type = \"Long\") scheduledId\n  60: optional i64 (js.type = \"Long\") scheduledTime\n  70: optional i64 (js.type = \"Long\") startedId\n  80: optional i64 (js.type = \"Long\") startedTime\n  90: optional i64 (js.type = \"Long\") lastHeartbeatTime\n  100: optional binary details\n  110: optional i32 attempt\n  120: optional string lastFailureReason\n  130: optional string lastWorkerIdentity\n  140: optional binary lastFailureDetails\n  150: optional shared.VersionHistory versionHistory\n}\n\nstruct HistoryTaskV2Attributes {\n  05: optional i64 (js.type = \"Long\") taskId\n  10: optional string domainId\n  20: optional string workflowId\n  30: optional string runId\n  40: optional list<shared.VersionHistoryItem> versionHistoryItems\n  50: optional shared.DataBlob events\n  // new run events does not need version history since there is no prior events\n  70: optional shared.DataBlob newRunEvents\n}\n\nstruct FailoverMarkerAttributes{\n\t10: optional string domainID\n\t20: optional i64 (js.type = \"Long\") failoverVersion\n\t30: optional i64 (js.type = \"Long\") creationTime\n}\n\nstruct FailoverMarkers{\n\t10: optional list<FailoverMarkerAttributes> failoverMarkers\n}\n\nstruct ReplicationTask {\n  10: optional ReplicationTaskType taskType\n  11: optional i64 (js.type = \"Long\") sourceTaskId\n  20: optional DomainTaskAttributes domainTaskAttributes\n  40: optional SyncShardStatusTaskAttributes syncShardStatusTaskAttributes\n  50: optional SyncActivityTaskAttributes syncActivityTaskAttributes\n  70: optional HistoryTaskV2Attributes historyTaskV2Attributes\n  80: optional FailoverMarkerAttributes failoverMarkerAttributes\n  90: optional i64 (js.type = \"Long\") creationTime\n}\n\nstruct ReplicationToken {\n  10: optional i32 shardID\n  // lastRetrivedMessageId is where the next fetch should begin with\n  20: optional i64 (js.type = \"Long\") lastRetrievedMessageId\n  // lastProcessedMessageId is the last messageId that is processed on the passive side.\n  // This can be different than lastRetrievedMessageId if passive side supports prefetching messages.\n  30: optional i64 (js.type = \"Long\") lastProcessedMessageId\n}\n\nstruct SyncShardStatus {\n  10: optional i64 (js.type = \"Long\") timestamp\n}\n\nstruct ReplicationMessages {\n  10: optional list<ReplicationTask> replicationTasks\n  // This can be different than the last taskId in the above list, because sender can decide to skip tasks (e.g. for completed workflows).\n  20: optional i64 (js.type = \"Long\") lastRetrievedMessageId\n  30: optional bool hasMore // Hint for flow control\n  40: optional SyncShardStatus syncShardStatus\n}\n\nstruct ReplicationTaskInfo {\n  10: optional string domainID\n  20: optional string workflowID\n  30: optional string runID\n  40: optional i16 taskType\n  50: optional i64 (js.type = \"Long\") taskID\n  60: optional i64 (js.type = \"Long\") version\n  70: optional i64 (js.type = \"Long\") firstEventID\n  80: optional i64 (js.type = \"Long\") nextEventID\n  90: optional i64 (js.type = \"Long\") scheduledID\n}\n\nstruct GetReplicationMessagesRequest {\n  10: optional list<ReplicationToken> tokens\n  20: optional string clusterName\n}\n\nstruct GetReplicationMessagesResponse {\n  10: optional map<i32, ReplicationMessages> messagesByShard\n}\n\nstruct GetDomainReplicationMessagesRequest {\n  // lastRetrievedMessageId is where the next fetch should begin with\n  10: optional i64 (js.type = \"Long\") lastRetrievedMessageId\n  // lastProcessedMessageId is the last messageId that is processed on the passive side.\n  // This can be different than lastRetrievedMessageId if passive side supports prefetching messages.\n  20: optional i64 (js.type = \"Long\") lastProcessedMessageId\n  // clusterName is the name of the pulling cluster\n  30: optional string clusterName\n}\n\nstruct GetDomainReplicationMessagesResponse {\n  10: optional ReplicationMessages messages\n}\n\nstruct GetDLQReplicationMessagesRequest {\n  10: optional list<ReplicationTaskInfo> taskInfos\n}\n\nstruct GetDLQReplicationMessagesResponse {\n  10: optional list<ReplicationTask> replicationTasks\n}\n\nenum DLQType {\n  Replication,\n  Domain,\n}\n\nstruct ReadDLQMessagesRequest{\n  10: optional DLQType type\n  20: optional i32 shardID\n  30: optional string sourceCluster\n  40: optional i64 (js.type = \"Long\") inclusiveEndMessageID\n  50: optional i32 maximumPageSize\n  60: optional binary nextPageToken\n}\n\nstruct ReadDLQMessagesResponse{\n  10: optional DLQType type\n  20: optional list<ReplicationTask> replicationTasks\n  30: optional binary nextPageToken\n  40: optional list<ReplicationTaskInfo> replicationTasksInfo\n}\n\nstruct PurgeDLQMessagesRequest{\n  10: optional DLQType type\n  20: optional i32 shardID\n  30: optional string sourceCluster\n  40: optional i64 (js.type = \"Long\") inclusiveEndMessageID\n}\n\nstruct MergeDLQMessagesRequest{\n  10: optional DLQType type\n  20: optional i32 shardID\n  30: optional string sourceCluster\n  40: optional i64 (js.type = \"Long\") inclusiveEndMessageID\n  50: optional i32 maximumPageSize\n  60: optional binary nextPageToken\n}\n\nstruct MergeDLQMessagesResponse{\n  10: optional binary nextPageToken\n}\n"
diff --git a/.gen/proto/history/v1/service.pb.yarpc.go b/.gen/proto/history/v1/service.pb.yarpc.go
index b534328d79e..2f733804c8b 100644
--- a/.gen/proto/history/v1/service.pb.yarpc.go
+++ b/.gen/proto/history/v1/service.pb.yarpc.go
@@ -3879,102 +3879,103 @@ var yarpcFileDescriptorClosurefee8ff76963a38ed = [][]byte{
 	},
 	// uber/cadence/admin/v1/replication.proto
 	[]byte{
-		0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0x4b, 0x73, 0x1a, 0xc7,
-		0x16, 0xf6, 0x80, 0x78, 0xe8, 0x08, 0x01, 0x6a, 0xc9, 0x16, 0x96, 0xac, 0xba, 0x18, 0xbf, 0x64,
-		0xb9, 0x2e, 0x5c, 0xc9, 0xd7, 0xf7, 0x59, 0x29, 0xd7, 0x58, 0xa0, 0x68, 0x62, 0x3d, 0x1b, 0x2c,
-		0x47, 0xa9, 0x4a, 0x4d, 0x8d, 0x66, 0x5a, 0x62, 0x4a, 0x30, 0x43, 0x4d, 0x37, 0xc8, 0xec, 0x92,
-		0x7d, 0xaa, 0xb2, 0xc9, 0x2e, 0xcb, 0xfc, 0x8d, 0xac, 0xb3, 0x4d, 0x7e, 0x52, 0x6a, 0xba, 0x7b,
-		0x80, 0x81, 0x01, 0xcb, 0xe5, 0x45, 0x76, 0xf4, 0x39, 0xdf, 0x79, 0xf4, 0xe9, 0xd3, 0xdf, 0x69,
-		0x06, 0x9e, 0x75, 0x2f, 0x88, 0x57, 0x31, 0x0d, 0x8b, 0x38, 0x26, 0xa9, 0x18, 0x56, 0xdb, 0x76,
-		0x2a, 0xbd, 0xed, 0x8a, 0x47, 0x3a, 0x2d, 0xdb, 0x34, 0x98, 0xed, 0x3a, 0xe5, 0x8e, 0xe7, 0x32,
-		0x17, 0xdd, 0xf5, 0x81, 0x65, 0x09, 0x2c, 0x73, 0x60, 0xb9, 0xb7, 0xbd, 0xf6, 0xb7, 0x2b, 0xd7,
-		0xbd, 0x6a, 0x91, 0x0a, 0x07, 0x5d, 0x74, 0x2f, 0x2b, 0xcc, 0x6e, 0x13, 0xca, 0x8c, 0x76, 0x47,
-		0xd8, 0xad, 0x15, 0xc3, 0x01, 0x3a, 0xb6, 0xef, 0xde, 0x74, 0xdb, 0xed, 0xc0, 0x73, 0x34, 0xc2,
-		0x72, 0xdb, 0x86, 0x1d, 0x20, 0x1e, 0x45, 0x27, 0xd9, 0xb4, 0x29, 0x73, 0xbd, 0xbe, 0x00, 0x95,
-		0x7e, 0x8a, 0xc1, 0x32, 0x1e, 0xa6, 0x7d, 0x48, 0x28, 0x35, 0xae, 0x08, 0x45, 0x75, 0x58, 0x1a,
-		0xd9, 0x8d, 0xce, 0x0c, 0x7a, 0x4d, 0x0b, 0x4a, 0x31, 0xbe, 0xb9, 0xb0, 0xf3, 0xb4, 0x1c, 0xb9,
-		0xa9, 0xf2, 0x88, 0x9b, 0x86, 0x41, 0xaf, 0x71, 0xde, 0x0b, 0x0b, 0x28, 0xfa, 0x2f, 0xdc, 0x6f,
-		0x19, 0x94, 0xe9, 0x1e, 0x61, 0x9e, 0x4d, 0x7a, 0xc4, 0xd2, 0xdb, 0x22, 0x9e, 0x6e, 0x5b, 0x85,
-		0x58, 0x51, 0xd9, 0x8c, 0xe3, 0x7b, 0x3e, 0x00, 0x07, 0x7a, 0x99, 0x8e, 0x66, 0xa1, 0xfb, 0x90,
-		0x6e, 0x1a, 0x54, 0x6f, 0xbb, 0x1e, 0x29, 0xc4, 0x8b, 0xca, 0x66, 0x1a, 0xa7, 0x9a, 0x06, 0x3d,
-		0x74, 0x3d, 0x82, 0x30, 0x2c, 0xd1, 0xbe, 0x63, 0xea, 0xb4, 0x69, 0x78, 0x96, 0x4e, 0x99, 0xc1,
-		0xba, 0xb4, 0x30, 0x57, 0x54, 0x66, 0xa4, 0x5a, 0xef, 0x3b, 0x66, 0xdd, 0x87, 0xd7, 0x39, 0x1a,
-		0xe7, 0x68, 0x58, 0x50, 0xfa, 0x31, 0x09, 0xb9, 0xb1, 0xfd, 0xa0, 0x2f, 0x61, 0xde, 0x2f, 0x83,
-		0xce, 0xfa, 0x1d, 0x52, 0x50, 0x8a, 0xca, 0x66, 0x76, 0x67, 0xeb, 0x76, 0xa5, 0x68, 0xf4, 0x3b,
-		0x04, 0xa7, 0x99, 0xfc, 0x85, 0x1e, 0x43, 0x96, 0xba, 0x5d, 0xcf, 0x24, 0xbc, 0xac, 0xc3, 0xbd,
-		0x67, 0x84, 0xd4, 0xb7, 0xd0, 0x2c, 0xf4, 0x1a, 0x16, 0x4d, 0x8f, 0xc8, 0xf2, 0xdb, 0x6d, 0xb1,
-		0xed, 0x85, 0x9d, 0xb5, 0xb2, 0xe8, 0x9d, 0x72, 0xd0, 0x3b, 0xe5, 0x46, 0xd0, 0x3b, 0x38, 0x13,
-		0x18, 0xf8, 0x22, 0x64, 0xc2, 0x3d, 0xd1, 0x0f, 0x22, 0x8c, 0xc1, 0x98, 0x67, 0x5f, 0x74, 0x19,
-		0x09, 0x8a, 0xf3, 0x62, 0x4a, 0xf2, 0x55, 0x6e, 0xe4, 0x67, 0xa1, 0x0e, 0x4c, 0xf6, 0xef, 0xe0,
-		0x15, 0x2b, 0x42, 0x8e, 0xbe, 0x53, 0xe0, 0xe1, 0x44, 0xf5, 0x27, 0x02, 0x26, 0x78, 0xc0, 0x7f,
-		0xde, 0xee, 0x34, 0x26, 0x22, 0x6f, 0xd0, 0x59, 0x00, 0xd4, 0x03, 0x0e, 0xd0, 0x0d, 0x93, 0xd9,
-		0x3d, 0x9b, 0xf5, 0x27, 0xa2, 0x27, 0x79, 0xf4, 0xed, 0x19, 0xd1, 0x55, 0x69, 0x3a, 0x11, 0x7a,
-		0x8d, 0x4e, 0xd5, 0xa2, 0x36, 0xac, 0xc9, 0xbb, 0x24, 0x22, 0xf6, 0x76, 0x46, 0x83, 0xa6, 0x78,
-		0xd0, 0xf2, 0x94, 0xa0, 0xfb, 0xc2, 0xd0, 0xf7, 0x78, 0xb6, 0x13, 0x8a, 0xb8, 0xda, 0x8c, 0x56,
-		0x21, 0x17, 0xd6, 0x2e, 0x0d, 0xbb, 0xe5, 0xf6, 0x88, 0xa7, 0xb7, 0x0d, 0xef, 0x9a, 0x78, 0xa3,
-		0xe1, 0xd2, 0x3c, 0x5c, 0x65, 0x4a, 0xb8, 0x3d, 0x69, 0x78, 0xc8, 0xed, 0x42, 0xf1, 0x0a, 0x97,
-		0x53, 0x74, 0x6f, 0x32, 0x00, 0xc3, 0x00, 0xa5, 0x5f, 0x63, 0xb0, 0x12, 0xd5, 0x19, 0xe8, 0x14,
-		0xf2, 0xb2, 0xcd, 0xdc, 0x0e, 0xf1, 0x78, 0xfb, 0xc9, 0xdb, 0xf1, 0x74, 0x66, 0x83, 0x1d, 0x07,
-		0x68, 0x9c, 0xb3, 0xc2, 0x02, 0x94, 0x85, 0x98, 0xbc, 0x14, 0xf3, 0x38, 0x66, 0x5b, 0xe8, 0x25,
-		0x24, 0x05, 0x44, 0xde, 0x81, 0xf5, 0x31, 0xc7, 0x1d, 0x7b, 0xe8, 0x16, 0x4b, 0x28, 0x7a, 0x02,
-		0x59, 0xd3, 0x75, 0x2e, 0xed, 0x2b, 0xbd, 0x47, 0x3c, 0xea, 0x67, 0x35, 0xc7, 0x6f, 0xd9, 0xa2,
-		0x90, 0x9e, 0x09, 0x21, 0x7a, 0x0e, 0xf9, 0x41, 0x59, 0x03, 0x60, 0x82, 0x03, 0x73, 0x81, 0x3c,
-		0x80, 0xfe, 0x0f, 0xee, 0x77, 0x3c, 0xd2, 0xb3, 0xdd, 0x2e, 0xd5, 0x27, 0x6c, 0x92, 0xdc, 0x66,
-		0x35, 0x00, 0xec, 0x85, 0x6d, 0x4b, 0x3f, 0x2b, 0xb0, 0x31, 0xb3, 0xcf, 0xfd, 0x7c, 0x25, 0x2b,
-		0x98, 0xad, 0x2e, 0x65, 0xc4, 0xe3, 0x55, 0x9c, 0xc7, 0x8b, 0x42, 0xba, 0x2b, 0x84, 0x3e, 0x11,
-		0x8a, 0xab, 0x26, 0x2b, 0x94, 0xc0, 0x29, 0xbe, 0xd6, 0x2c, 0xf4, 0x1f, 0x98, 0x1f, 0xcc, 0x91,
-		0x5b, 0xb0, 0xc5, 0x10, 0x5c, 0xfa, 0x3d, 0x01, 0x6b, 0xd3, 0xef, 0x01, 0x5a, 0x87, 0x79, 0x79,
-		0xc4, 0xb6, 0x25, 0xb3, 0x4a, 0x0b, 0x81, 0x66, 0xa1, 0x77, 0x80, 0x6e, 0x5c, 0xef, 0xfa, 0xb2,
-		0xe5, 0xde, 0xe8, 0xe4, 0x03, 0x31, 0xbb, 0xbc, 0x03, 0x62, 0x91, 0xfc, 0x2b, 0x0e, 0xea, 0xbd,
-		0x84, 0xd7, 0x02, 0x34, 0x5e, 0xba, 0x19, 0x17, 0xa1, 0x02, 0xa4, 0x82, 0xd2, 0xc6, 0x79, 0x69,
-		0x83, 0x25, 0x7a, 0x08, 0x19, 0x6a, 0x36, 0x89, 0xd5, 0x6d, 0x11, 0x5e, 0x05, 0x71, 0xac, 0x0b,
-		0x03, 0x99, 0x66, 0x21, 0x15, 0xb2, 0x43, 0x08, 0x27, 0xcf, 0xc4, 0x47, 0xcb, 0xb1, 0x38, 0xb0,
-		0xe0, 0xec, 0xb9, 0x01, 0x40, 0x99, 0xe1, 0x31, 0x11, 0x43, 0x9c, 0xee, 0xbc, 0x94, 0x68, 0x16,
-		0xfa, 0x02, 0x32, 0x81, 0x9a, 0xfb, 0x4f, 0x7d, 0xd4, 0xff, 0x82, 0xc4, 0x73, 0xef, 0x5f, 0xc1,
-		0x32, 0x9f, 0x84, 0x4d, 0x62, 0x78, 0xec, 0x82, 0x18, 0x4c, 0x78, 0x49, 0x7f, 0xd4, 0xcb, 0x92,
-		0x6f, 0xb6, 0x1f, 0x58, 0x71, 0x5f, 0xff, 0x82, 0x94, 0x45, 0x98, 0x61, 0xb7, 0x68, 0x61, 0x9e,
-		0xdb, 0x3f, 0x88, 0xac, 0xfa, 0x89, 0xd1, 0x6f, 0xb9, 0x86, 0x85, 0x03, 0xb0, 0x5f, 0x61, 0x83,
-		0x31, 0xd2, 0xee, 0xb0, 0x02, 0x88, 0x46, 0x92, 0x4b, 0xf4, 0x1a, 0x32, 0x3c, 0x3b, 0xbf, 0xc9,
-		0xbb, 0x1e, 0x29, 0x2c, 0xcc, 0x70, 0xbb, 0x27, 0x30, 0x78, 0xc1, 0xb7, 0x90, 0x0b, 0xf4, 0x0f,
-		0x58, 0xe1, 0x0e, 0xfc, 0x63, 0x25, 0x9e, 0x6e, 0x5b, 0xc4, 0x61, 0x36, 0xeb, 0x17, 0x32, 0xbc,
-		0x77, 0x90, 0xaf, 0x7b, 0xcf, 0x55, 0x9a, 0xd4, 0xa0, 0x23, 0xc8, 0xc9, 0xf3, 0xd5, 0x25, 0x01,
-		0x16, 0x16, 0x79, 0xd4, 0x27, 0x53, 0x48, 0x44, 0x5e, 0x2c, 0x49, 0xa4, 0x38, 0xdb, 0x0b, 0xad,
-		0x4b, 0xdf, 0xc7, 0x61, 0x75, 0x0a, 0xc9, 0xa2, 0x55, 0x48, 0x05, 0x83, 0x57, 0xe1, 0xe7, 0x9a,
-		0x64, 0x62, 0xe4, 0x86, 0xfa, 0x3c, 0x76, 0xab, 0x3e, 0x8f, 0x7f, 0x6e, 0x9f, 0x7f, 0x0b, 0x77,
-		0xc7, 0x36, 0xae, 0xdb, 0x8c, 0xb4, 0xfd, 0x21, 0xed, 0x3f, 0xb6, 0x9e, 0xdf, 0x6a, 0xfb, 0x1a,
-		0x23, 0x6d, 0xbc, 0xdc, 0x9b, 0x90, 0x51, 0xf4, 0x0a, 0x92, 0xa4, 0x47, 0x1c, 0x16, 0xcc, 0xe0,
-		0x8d, 0x68, 0xea, 0x34, 0x98, 0xf1, 0xa6, 0xe5, 0x5e, 0x60, 0x09, 0x46, 0xbb, 0x90, 0x75, 0xc8,
-		0x8d, 0xee, 0x75, 0x1d, 0x5d, 0x9a, 0x27, 0x6f, 0x63, 0x9e, 0x71, 0xc8, 0x0d, 0xee, 0x3a, 0x35,
-		0x6e, 0x52, 0xfa, 0x45, 0x81, 0xc2, 0xb4, 0xc9, 0x33, 0x9b, 0x53, 0xa2, 0x48, 0x39, 0x16, 0x4d,
-		0xca, 0x9f, 0xfb, 0x4c, 0x2a, 0xfd, 0xa0, 0xc0, 0x72, 0x38, 0xcb, 0x86, 0x7b, 0x4d, 0x1c, 0x3f,
-		0xc1, 0x80, 0x68, 0xc5, 0xcb, 0x37, 0x81, 0xd3, 0x92, 0x69, 0x29, 0xfa, 0x1a, 0x72, 0x63, 0xc3,
-		0x58, 0x32, 0xde, 0xa7, 0x4e, 0x60, 0x9c, 0x0d, 0xcf, 0xdf, 0xd2, 0x6f, 0xe1, 0x07, 0x39, 0x7f,
-		0x0c, 0x3a, 0x97, 0xee, 0x5f, 0xc2, 0xc1, 0xeb, 0xa3, 0x2f, 0xde, 0x38, 0xe7, 0x88, 0xe1, 0x2b,
-		0x76, 0xe4, 0x16, 0xcd, 0x85, 0x6e, 0xd1, 0x08, 0x73, 0x27, 0xc2, 0xcc, 0xfd, 0x18, 0xb2, 0x97,
-		0xb6, 0x47, 0x99, 0xe8, 0xa9, 0x21, 0xaf, 0x66, 0xb8, 0x94, 0x77, 0x8d, 0x66, 0xa1, 0x12, 0x2c,
-		0x3a, 0xe4, 0xc3, 0x08, 0x28, 0x25, 0x08, 0xde, 0x17, 0x06, 0x98, 0xf1, 0x19, 0x90, 0x9e, 0x98,
-		0x01, 0x7e, 0xf7, 0xe5, 0x47, 0x0b, 0xc9, 0x0f, 0x75, 0x74, 0x7a, 0x2a, 0xe1, 0xe9, 0xf9, 0x19,
-		0x7f, 0x4e, 0x02, 0xd3, 0x8e, 0xe7, 0x9a, 0x84, 0xd2, 0xb0, 0x69, 0x7c, 0x68, 0x7a, 0x12, 0xe8,
-		0x07, 0xa6, 0xa5, 0xb7, 0x90, 0x1b, 0x7b, 0x16, 0x84, 0xc7, 0xb8, 0xf2, 0x29, 0x63, 0xdc, 0x81,
-		0x15, 0x79, 0xf9, 0xab, 0x07, 0xa7, 0xbb, 0x6e, 0xd7, 0x61, 0x35, 0x87, 0x79, 0x7d, 0xb4, 0x02,
-		0x09, 0xd3, 0x5f, 0x49, 0xba, 0x13, 0x8b, 0x59, 0x2f, 0x89, 0xc9, 0xb7, 0x48, 0x3c, 0xe2, 0x2d,
-		0xb2, 0xf5, 0xc7, 0x64, 0xaf, 0xf2, 0xd6, 0x78, 0x08, 0x1b, 0xb8, 0x76, 0x72, 0xa0, 0xed, 0xaa,
-		0x0d, 0xed, 0xf8, 0x48, 0x6f, 0xa8, 0xf5, 0xb7, 0x7a, 0xe3, 0xfc, 0xa4, 0xa6, 0x6b, 0x47, 0x67,
-		0xea, 0x81, 0x56, 0xcd, 0xdf, 0x41, 0x45, 0x78, 0x10, 0x0d, 0xa9, 0x1e, 0x1f, 0xaa, 0xda, 0x51,
-		0x5e, 0x99, 0xee, 0x64, 0x5f, 0xab, 0x37, 0x8e, 0xf1, 0x79, 0x3e, 0x86, 0x5e, 0xc0, 0xb3, 0x68,
-		0x48, 0xfd, 0xfc, 0x68, 0x57, 0xaf, 0xef, 0xab, 0xb8, 0xaa, 0xd7, 0x1b, 0x6a, 0xe3, 0x5d, 0x3d,
-		0x1f, 0x47, 0xcf, 0xe0, 0xd1, 0x0c, 0xb0, 0xba, 0xdb, 0xd0, 0xce, 0xb4, 0xc6, 0x79, 0x7e, 0x0e,
-		0x6d, 0xc1, 0xd3, 0x99, 0x81, 0xf5, 0xc3, 0x5a, 0x43, 0xad, 0xaa, 0x0d, 0x35, 0x9f, 0x40, 0x8f,
-		0xa1, 0x38, 0x1b, 0x7b, 0xb6, 0x93, 0x4f, 0xa2, 0xe7, 0xf0, 0x24, 0x1a, 0xb5, 0xa7, 0x6a, 0x07,
-		0xc7, 0x67, 0x35, 0xac, 0x1f, 0xaa, 0xf8, 0x6d, 0x0d, 0xe7, 0x53, 0x5b, 0x36, 0xe4, 0xc6, 0x9e,
-		0xc7, 0xe8, 0x01, 0x14, 0x44, 0x51, 0xf4, 0xe3, 0x93, 0x1a, 0x16, 0x2e, 0x86, 0x85, 0x5c, 0x87,
-		0xd5, 0x09, 0xed, 0x2e, 0xae, 0xa9, 0x8d, 0x5a, 0x5e, 0x89, 0x54, 0xbe, 0x3b, 0xa9, 0xfa, 0xca,
-		0xd8, 0xd6, 0x11, 0xa4, 0xaa, 0x07, 0xa7, 0xfc, 0xc0, 0x56, 0x20, 0x5f, 0x3d, 0x38, 0x1d, 0x3f,
-		0xa3, 0x02, 0xac, 0x0c, 0xa4, 0x23, 0xf9, 0xe7, 0x15, 0xb4, 0x0c, 0xb9, 0x81, 0x46, 0x1e, 0x58,
-		0xec, 0xcd, 0xbf, 0xbf, 0x79, 0x75, 0x65, 0xb3, 0x66, 0xf7, 0xa2, 0x6c, 0xba, 0xed, 0xca, 0xe8,
-		0xc7, 0x87, 0xbf, 0xdb, 0x56, 0xab, 0x72, 0xe5, 0x8a, 0xcf, 0x1d, 0x83, 0x2f, 0x11, 0xff, 0xe7,
-		0x3f, 0x7a, 0xdb, 0x17, 0x49, 0x2e, 0x7f, 0xf9, 0x67, 0x00, 0x00, 0x00, 0xff, 0xff, 0x40, 0x11,
-		0xc6, 0x58, 0x56, 0x11, 0x00, 0x00,
+		0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0xcd, 0x6f, 0xdb, 0xc6,
+		0x12, 0x0f, 0x25, 0xeb, 0xc3, 0x63, 0x59, 0xa2, 0xd7, 0x4e, 0xac, 0xd8, 0x31, 0x9e, 0xa2, 0x7c,
+		0x39, 0x0e, 0x9e, 0xf4, 0xec, 0xbc, 0xbc, 0x4f, 0x3c, 0x04, 0x8c, 0x25, 0x3f, 0xb3, 0xf1, 0xe7,
+		0x8a, 0x71, 0xea, 0x02, 0x05, 0x41, 0x93, 0x6b, 0x8b, 0xb0, 0x44, 0x0a, 0xe4, 0x4a, 0x8e, 0x6e,
+		0xed, 0xa5, 0xa7, 0x02, 0xbd, 0xf4, 0xd6, 0x63, 0xff, 0x8d, 0x9e, 0x7b, 0x6d, 0xff, 0xa4, 0x82,
+		0xbb, 0x4b, 0x49, 0x94, 0x28, 0xc5, 0x41, 0x0e, 0xbd, 0x69, 0x67, 0x7e, 0x33, 0xb3, 0x3b, 0x3b,
+		0xfb, 0x9b, 0x11, 0xe1, 0x59, 0xf7, 0x82, 0x78, 0x55, 0xd3, 0xb0, 0x88, 0x63, 0x92, 0xaa, 0x61,
+		0xb5, 0x6d, 0xa7, 0xda, 0xdb, 0xae, 0x7a, 0xa4, 0xd3, 0xb2, 0x4d, 0x83, 0xda, 0xae, 0x53, 0xe9,
+		0x78, 0x2e, 0x75, 0xd1, 0xdd, 0x00, 0x58, 0x11, 0xc0, 0x0a, 0x03, 0x56, 0x7a, 0xdb, 0x6b, 0x7f,
+		0xb9, 0x72, 0xdd, 0xab, 0x16, 0xa9, 0x32, 0xd0, 0x45, 0xf7, 0xb2, 0x4a, 0xed, 0x36, 0xf1, 0xa9,
+		0xd1, 0xee, 0x70, 0xbb, 0xb5, 0x52, 0x34, 0x40, 0xc7, 0x0e, 0xdc, 0x9b, 0x6e, 0xbb, 0x1d, 0x7a,
+		0x8e, 0x47, 0x58, 0x6e, 0xdb, 0xb0, 0x43, 0xc4, 0xa3, 0xf8, 0x4d, 0x36, 0x6d, 0x9f, 0xba, 0x5e,
+		0x9f, 0x83, 0xca, 0x3f, 0x26, 0x60, 0x19, 0x0f, 0xb7, 0x7d, 0x48, 0x7c, 0xdf, 0xb8, 0x22, 0x3e,
+		0x6a, 0xc0, 0xd2, 0xc8, 0x69, 0x74, 0x6a, 0xf8, 0xd7, 0x7e, 0x51, 0x2a, 0x25, 0x37, 0x17, 0x76,
+		0x9e, 0x56, 0x62, 0x0f, 0x55, 0x19, 0x71, 0xa3, 0x19, 0xfe, 0x35, 0x96, 0xbd, 0xa8, 0xc0, 0x47,
+		0xff, 0x86, 0xfb, 0x2d, 0xc3, 0xa7, 0xba, 0x47, 0xa8, 0x67, 0x93, 0x1e, 0xb1, 0xf4, 0x36, 0x8f,
+		0xa7, 0xdb, 0x56, 0x31, 0x51, 0x92, 0x36, 0x93, 0xf8, 0x5e, 0x00, 0xc0, 0xa1, 0x5e, 0x6c, 0x47,
+		0xb5, 0xd0, 0x7d, 0xc8, 0x36, 0x0d, 0x5f, 0x6f, 0xbb, 0x1e, 0x29, 0x26, 0x4b, 0xd2, 0x66, 0x16,
+		0x67, 0x9a, 0x86, 0x7f, 0xe8, 0x7a, 0x04, 0x61, 0x58, 0xf2, 0xfb, 0x8e, 0xa9, 0xfb, 0x4d, 0xc3,
+		0xb3, 0x74, 0x9f, 0x1a, 0xb4, 0xeb, 0x17, 0xe7, 0x4a, 0xd2, 0x8c, 0xad, 0x36, 0xfa, 0x8e, 0xd9,
+		0x08, 0xe0, 0x0d, 0x86, 0xc6, 0x05, 0x3f, 0x2a, 0x28, 0xff, 0x90, 0x86, 0xc2, 0xd8, 0x79, 0xd0,
+		0xff, 0x61, 0x3e, 0x48, 0x83, 0x4e, 0xfb, 0x1d, 0x52, 0x94, 0x4a, 0xd2, 0x66, 0x7e, 0x67, 0xeb,
+		0x76, 0xa9, 0xd0, 0xfa, 0x1d, 0x82, 0xb3, 0x54, 0xfc, 0x42, 0x8f, 0x21, 0xef, 0xbb, 0x5d, 0xcf,
+		0x24, 0x2c, 0xad, 0xc3, 0xb3, 0xe7, 0xb8, 0x34, 0xb0, 0x50, 0x2d, 0xf4, 0x1a, 0x16, 0x4d, 0x8f,
+		0x88, 0xf4, 0xdb, 0x6d, 0x7e, 0xec, 0x85, 0x9d, 0xb5, 0x0a, 0xaf, 0x9d, 0x4a, 0x58, 0x3b, 0x15,
+		0x2d, 0xac, 0x1d, 0x9c, 0x0b, 0x0d, 0x02, 0x11, 0x32, 0xe1, 0x1e, 0xaf, 0x07, 0x1e, 0xc6, 0xa0,
+		0xd4, 0xb3, 0x2f, 0xba, 0x94, 0x84, 0xc9, 0x79, 0x31, 0x65, 0xf3, 0x35, 0x66, 0x14, 0xec, 0x42,
+		0x19, 0x98, 0xec, 0xdf, 0xc1, 0x2b, 0x56, 0x8c, 0x1c, 0x7d, 0x23, 0xc1, 0xc3, 0x89, 0xec, 0x4f,
+		0x04, 0x4c, 0xb1, 0x80, 0x7f, 0xbf, 0xdd, 0x6d, 0x4c, 0x44, 0xde, 0xf0, 0x67, 0x01, 0x50, 0x0f,
+		0x18, 0x40, 0x37, 0x4c, 0x6a, 0xf7, 0x6c, 0xda, 0x9f, 0x88, 0x9e, 0x66, 0xd1, 0xb7, 0x67, 0x44,
+		0x57, 0x84, 0xe9, 0x44, 0xe8, 0x35, 0x7f, 0xaa, 0x16, 0xb5, 0x61, 0x4d, 0xbc, 0x25, 0x1e, 0xb1,
+		0xb7, 0x33, 0x1a, 0x34, 0xc3, 0x82, 0x56, 0xa6, 0x04, 0xdd, 0xe7, 0x86, 0x81, 0xc7, 0xb3, 0x9d,
+		0x48, 0xc4, 0xd5, 0x66, 0xbc, 0x0a, 0xb9, 0xb0, 0x76, 0x69, 0xd8, 0x2d, 0xb7, 0x47, 0x3c, 0xbd,
+		0x6d, 0x78, 0xd7, 0xc4, 0x1b, 0x0d, 0x97, 0x65, 0xe1, 0xaa, 0x53, 0xc2, 0xed, 0x09, 0xc3, 0x43,
+		0x66, 0x17, 0x89, 0x57, 0xbc, 0x9c, 0xa2, 0x7b, 0x93, 0x03, 0x18, 0x06, 0x28, 0xff, 0x92, 0x80,
+		0x95, 0xb8, 0xca, 0x40, 0xa7, 0x20, 0x8b, 0x32, 0x73, 0x3b, 0xc4, 0x63, 0xe5, 0x27, 0x5e, 0xc7,
+		0xd3, 0x99, 0x05, 0x76, 0x1c, 0xa2, 0x71, 0xc1, 0x8a, 0x0a, 0x50, 0x1e, 0x12, 0xe2, 0x51, 0xcc,
+		0xe3, 0x84, 0x6d, 0xa1, 0x97, 0x90, 0xe6, 0x10, 0xf1, 0x06, 0xd6, 0xc7, 0x1c, 0x77, 0xec, 0xa1,
+		0x5b, 0x2c, 0xa0, 0xe8, 0x09, 0xe4, 0x4d, 0xd7, 0xb9, 0xb4, 0xaf, 0xf4, 0x1e, 0xf1, 0xfc, 0x60,
+		0x57, 0x73, 0xec, 0x95, 0x2d, 0x72, 0xe9, 0x19, 0x17, 0xa2, 0xe7, 0x20, 0x0f, 0xd2, 0x1a, 0x02,
+		0x53, 0x0c, 0x58, 0x08, 0xe5, 0x21, 0xf4, 0x3f, 0x70, 0xbf, 0xe3, 0x91, 0x9e, 0xed, 0x76, 0x7d,
+		0x7d, 0xc2, 0x26, 0xcd, 0x6c, 0x56, 0x43, 0xc0, 0x5e, 0xd4, 0xb6, 0xfc, 0x93, 0x04, 0x1b, 0x33,
+		0xeb, 0x3c, 0xd8, 0xaf, 0x60, 0x05, 0xb3, 0xd5, 0xf5, 0x29, 0xf1, 0x58, 0x16, 0xe7, 0xf1, 0x22,
+		0x97, 0xee, 0x72, 0x61, 0x40, 0x84, 0xfc, 0xa9, 0x89, 0x0c, 0xa5, 0x70, 0x86, 0xad, 0x55, 0x0b,
+		0xfd, 0x0b, 0xe6, 0x07, 0x7d, 0xe4, 0x16, 0x6c, 0x31, 0x04, 0x97, 0x7f, 0x4b, 0xc1, 0xda, 0xf4,
+		0x77, 0x80, 0xd6, 0x61, 0x5e, 0x5c, 0xb1, 0x6d, 0x89, 0x5d, 0x65, 0xb9, 0x40, 0xb5, 0xd0, 0x3b,
+		0x40, 0x37, 0xae, 0x77, 0x7d, 0xd9, 0x72, 0x6f, 0x74, 0xf2, 0x81, 0x98, 0x5d, 0x56, 0x01, 0x89,
+		0x58, 0xfe, 0xe5, 0x17, 0xf5, 0x5e, 0xc0, 0xeb, 0x21, 0x1a, 0x2f, 0xdd, 0x8c, 0x8b, 0x50, 0x11,
+		0x32, 0x61, 0x6a, 0x93, 0x2c, 0xb5, 0xe1, 0x12, 0x3d, 0x84, 0x9c, 0x6f, 0x36, 0x89, 0xd5, 0x6d,
+		0x11, 0x96, 0x05, 0x7e, 0xad, 0x0b, 0x03, 0x99, 0x6a, 0x21, 0x05, 0xf2, 0x43, 0x08, 0x23, 0xcf,
+		0xd4, 0x47, 0xd3, 0xb1, 0x38, 0xb0, 0x60, 0xec, 0xb9, 0x01, 0xe0, 0x53, 0xc3, 0xa3, 0x3c, 0x06,
+		0xbf, 0xdd, 0x79, 0x21, 0x51, 0x2d, 0xf4, 0x3f, 0xc8, 0x85, 0x6a, 0xe6, 0x3f, 0xf3, 0x51, 0xff,
+		0x0b, 0x02, 0xcf, 0xbc, 0x7f, 0x01, 0xcb, 0xac, 0x13, 0x36, 0x89, 0xe1, 0xd1, 0x0b, 0x62, 0x50,
+		0xee, 0x25, 0xfb, 0x51, 0x2f, 0x4b, 0x81, 0xd9, 0x7e, 0x68, 0xc5, 0x7c, 0xfd, 0x03, 0x32, 0x16,
+		0xa1, 0x86, 0xdd, 0xf2, 0x8b, 0xf3, 0xcc, 0xfe, 0x41, 0x6c, 0xd6, 0x4f, 0x8c, 0x7e, 0xcb, 0x35,
+		0x2c, 0x1c, 0x82, 0x83, 0x0c, 0x1b, 0x94, 0x92, 0x76, 0x87, 0x16, 0x81, 0x17, 0x92, 0x58, 0xa2,
+		0xd7, 0x90, 0x63, 0xbb, 0x0b, 0x8a, 0xbc, 0xeb, 0x91, 0xe2, 0xc2, 0x0c, 0xb7, 0x7b, 0x1c, 0x83,
+		0x17, 0x02, 0x0b, 0xb1, 0x40, 0x7f, 0x83, 0x15, 0xe6, 0x20, 0xb8, 0x56, 0xe2, 0xe9, 0xb6, 0x45,
+		0x1c, 0x6a, 0xd3, 0x7e, 0x31, 0xc7, 0x6a, 0x07, 0x05, 0xba, 0xf7, 0x4c, 0xa5, 0x0a, 0x0d, 0x3a,
+		0x82, 0x82, 0xb8, 0x5f, 0x5d, 0x10, 0x60, 0x71, 0x91, 0x45, 0x7d, 0x32, 0x85, 0x44, 0xc4, 0xc3,
+		0x12, 0x44, 0x8a, 0xf3, 0xbd, 0xc8, 0xba, 0xfc, 0x6d, 0x12, 0x56, 0xa7, 0x90, 0x2c, 0x5a, 0x85,
+		0x4c, 0xd8, 0x78, 0x25, 0x76, 0xaf, 0x69, 0xca, 0x5b, 0x6e, 0xa4, 0xce, 0x13, 0xb7, 0xaa, 0xf3,
+		0xe4, 0xe7, 0xd6, 0xf9, 0xd7, 0x70, 0x77, 0xec, 0xe0, 0xba, 0x4d, 0x49, 0x3b, 0x68, 0xd2, 0xc1,
+		0xb0, 0xf5, 0xfc, 0x56, 0xc7, 0x57, 0x29, 0x69, 0xe3, 0xe5, 0xde, 0x84, 0xcc, 0x47, 0xaf, 0x20,
+		0x4d, 0x7a, 0xc4, 0xa1, 0x61, 0x0f, 0xde, 0x88, 0xa7, 0x4e, 0x83, 0x1a, 0x6f, 0x5a, 0xee, 0x05,
+		0x16, 0x60, 0xb4, 0x0b, 0x79, 0x87, 0xdc, 0xe8, 0x5e, 0xd7, 0xd1, 0x85, 0x79, 0xfa, 0x36, 0xe6,
+		0x39, 0x87, 0xdc, 0xe0, 0xae, 0x53, 0x67, 0x26, 0xe5, 0x9f, 0x25, 0x28, 0x4e, 0xeb, 0x3c, 0xb3,
+		0x39, 0x25, 0x8e, 0x94, 0x13, 0xf1, 0xa4, 0xfc, 0xb9, 0x63, 0x52, 0xf9, 0x7b, 0x09, 0x96, 0xa3,
+		0xbb, 0xd4, 0xdc, 0x6b, 0xe2, 0x04, 0x1b, 0x0c, 0x89, 0x96, 0x4f, 0xbe, 0x29, 0x9c, 0x15, 0x4c,
+		0xeb, 0xa3, 0x2f, 0xa1, 0x30, 0xd6, 0x8c, 0x05, 0xe3, 0x7d, 0x6a, 0x07, 0xc6, 0xf9, 0x68, 0xff,
+		0x2d, 0xff, 0x1a, 0x1d, 0xc8, 0xd9, 0x30, 0xe8, 0x5c, 0xba, 0x7f, 0x0a, 0x07, 0xaf, 0x8f, 0x4e,
+		0xbc, 0x49, 0xc6, 0x11, 0xc3, 0x29, 0x76, 0xe4, 0x15, 0xcd, 0x45, 0x5e, 0xd1, 0x08, 0x73, 0xa7,
+		0xa2, 0xcc, 0xfd, 0x18, 0xf2, 0x97, 0xb6, 0xe7, 0x53, 0x5e, 0x53, 0x43, 0x5e, 0xcd, 0x31, 0x29,
+		0xab, 0x1a, 0xd5, 0x42, 0x65, 0x58, 0x74, 0xc8, 0x87, 0x11, 0x50, 0x86, 0x13, 0x7c, 0x20, 0x0c,
+		0x31, 0xe3, 0x3d, 0x20, 0x3b, 0xd1, 0x03, 0x82, 0xea, 0x93, 0x47, 0x13, 0xc9, 0x2e, 0x75, 0xb4,
+		0x7b, 0x4a, 0xd1, 0xee, 0xf9, 0x19, 0x7f, 0x4e, 0x42, 0xd3, 0x8e, 0xe7, 0x9a, 0xc4, 0xf7, 0xa3,
+		0xa6, 0xc9, 0xa1, 0xe9, 0x49, 0xa8, 0x1f, 0x98, 0x96, 0xdf, 0x42, 0x61, 0x6c, 0x2c, 0x88, 0xb6,
+		0x71, 0xe9, 0x53, 0xda, 0xb8, 0x03, 0x2b, 0xe2, 0xf1, 0xd7, 0x0e, 0x4e, 0x77, 0xdd, 0xae, 0x43,
+		0xeb, 0x0e, 0xf5, 0xfa, 0x68, 0x05, 0x52, 0x66, 0xb0, 0x12, 0x74, 0xc7, 0x17, 0xb3, 0x26, 0x89,
+		0xc9, 0x59, 0x24, 0x19, 0x33, 0x8b, 0x6c, 0xfd, 0x3e, 0x59, 0xab, 0xac, 0x34, 0x1e, 0xc2, 0x06,
+		0xae, 0x9f, 0x1c, 0xa8, 0xbb, 0x8a, 0xa6, 0x1e, 0x1f, 0xe9, 0x9a, 0xd2, 0x78, 0xab, 0x6b, 0xe7,
+		0x27, 0x75, 0x5d, 0x3d, 0x3a, 0x53, 0x0e, 0xd4, 0x9a, 0x7c, 0x07, 0x95, 0xe0, 0x41, 0x3c, 0xa4,
+		0x76, 0x7c, 0xa8, 0xa8, 0x47, 0xb2, 0x34, 0xdd, 0xc9, 0xbe, 0xda, 0xd0, 0x8e, 0xf1, 0xb9, 0x9c,
+		0x40, 0x2f, 0xe0, 0x59, 0x3c, 0xa4, 0x71, 0x7e, 0xb4, 0xab, 0x37, 0xf6, 0x15, 0x5c, 0xd3, 0x1b,
+		0x9a, 0xa2, 0xbd, 0x6b, 0xc8, 0x49, 0xf4, 0x0c, 0x1e, 0xcd, 0x00, 0x2b, 0xbb, 0x9a, 0x7a, 0xa6,
+		0x6a, 0xe7, 0xf2, 0x1c, 0xda, 0x82, 0xa7, 0x33, 0x03, 0xeb, 0x87, 0x75, 0x4d, 0xa9, 0x29, 0x9a,
+		0x22, 0xa7, 0xd0, 0x63, 0x28, 0xcd, 0xc6, 0x9e, 0xed, 0xc8, 0x69, 0xf4, 0x1c, 0x9e, 0xc4, 0xa3,
+		0xf6, 0x14, 0xf5, 0xe0, 0xf8, 0xac, 0x8e, 0xf5, 0x43, 0x05, 0xbf, 0xad, 0x63, 0x39, 0xb3, 0xf5,
+		0x9d, 0x04, 0x85, 0xb1, 0xf9, 0x18, 0x3d, 0x80, 0x22, 0xcf, 0x8a, 0x7e, 0x7c, 0x52, 0xc7, 0xdc,
+		0xc7, 0x30, 0x93, 0xeb, 0xb0, 0x3a, 0xa1, 0xdd, 0xc5, 0x75, 0x45, 0xab, 0xcb, 0x52, 0xac, 0xf2,
+		0xdd, 0x49, 0x2d, 0x50, 0x26, 0x62, 0x95, 0xb5, 0xfa, 0x41, 0x5d, 0xab, 0xcb, 0xc9, 0xad, 0x23,
+		0xc8, 0xd4, 0x0e, 0x4e, 0xd9, 0x75, 0xae, 0x80, 0x5c, 0x3b, 0x38, 0x1d, 0xbf, 0xc1, 0x22, 0xac,
+		0x0c, 0xa4, 0x23, 0xa7, 0x93, 0x25, 0xb4, 0x0c, 0x85, 0x81, 0x46, 0x5c, 0x67, 0xe2, 0xcd, 0x3f,
+		0xbf, 0x7a, 0x75, 0x65, 0xd3, 0x66, 0xf7, 0xa2, 0x62, 0xba, 0xed, 0xea, 0xe8, 0xa7, 0x89, 0xbf,
+		0xda, 0x56, 0xab, 0x7a, 0xe5, 0xf2, 0x8f, 0x21, 0x83, 0xef, 0x14, 0xff, 0x65, 0x3f, 0x7a, 0xdb,
+		0x17, 0x69, 0x26, 0x7f, 0xf9, 0x47, 0x00, 0x00, 0x00, 0xff, 0xff, 0x02, 0x9c, 0xe5, 0x90, 0x74,
+		0x11, 0x00, 0x00,
 	},
 	// uber/cadence/api/v1/domain.proto
 	[]byte{
diff --git a/cmd/server/go.mod b/cmd/server/go.mod
index 9b0f28481df..51794fbb876 100644
--- a/cmd/server/go.mod
+++ b/cmd/server/go.mod
@@ -44,7 +44,7 @@ require (
 	github.com/startreedata/pinot-client-go v0.2.0 // latest release supports pinot v0.12.0 which is also internal version
 	github.com/stretchr/testify v1.10.0
 	github.com/uber-go/tally v3.3.15+incompatible // indirect
-	github.com/uber/cadence-idl v0.0.0-20250511103706-e5b4197e2aef
+	github.com/uber/cadence-idl v0.0.0-20250513140852-97f83aeb4caa
 	github.com/uber/ringpop-go v0.8.5 // indirect
 	github.com/uber/tchannel-go v1.22.2 // indirect
 	github.com/valyala/fastjson v1.4.1 // indirect
diff --git a/cmd/server/go.sum b/cmd/server/go.sum
index dfc0057c570..5ae02f70611 100644
--- a/cmd/server/go.sum
+++ b/cmd/server/go.sum
@@ -425,8 +425,8 @@ github.com/uber-go/tally v3.3.12+incompatible/go.mod h1:YDTIBxdXyOU/sCWilKB4bgyu
 github.com/uber-go/tally v3.3.15+incompatible h1:9hLSgNBP28CjIaDmAuRTq9qV+UZY+9PcvAkXO4nNMwg=
 github.com/uber-go/tally v3.3.15+incompatible/go.mod h1:YDTIBxdXyOU/sCWilKB4bgyufu1cEi0jdVnRdxvjnmU=
 github.com/uber/cadence-idl v0.0.0-20211111101836-d6b70b60eb8c/go.mod h1:oyUK7GCNCRHCCyWyzifSzXpVrRYVBbAMHAzF5dXiKws=
-github.com/uber/cadence-idl v0.0.0-20250511103706-e5b4197e2aef h1:KMG6RR8Cx30kbFSLgdwK4M3AYKsRykSBv6KYr7gw8Tc=
-github.com/uber/cadence-idl v0.0.0-20250511103706-e5b4197e2aef/go.mod h1:oyUK7GCNCRHCCyWyzifSzXpVrRYVBbAMHAzF5dXiKws=
+github.com/uber/cadence-idl v0.0.0-20250513140852-97f83aeb4caa h1:cqGYBhmrR1H0wBEeV/IRGzYfOfdxJAz8B4VZAmuXgCU=
+github.com/uber/cadence-idl v0.0.0-20250513140852-97f83aeb4caa/go.mod h1:oyUK7GCNCRHCCyWyzifSzXpVrRYVBbAMHAzF5dXiKws=
 github.com/uber/jaeger-client-go v2.22.1+incompatible h1:NHcubEkVbahf9t3p75TOCR83gdUHXjRJvjoBh1yACsM=
 github.com/uber/jaeger-client-go v2.22.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
 github.com/uber/jaeger-lib v2.2.0+incompatible h1:MxZXOiR2JuoANZ3J6DE/U0kSFv/eJ/GfSYVCjK7dyaw=
diff --git a/common/domain/handler.go b/common/domain/handler.go
index 025b830d6a6..e258943cb3b 100644
--- a/common/domain/handler.go
+++ b/common/domain/handler.go
@@ -600,15 +600,35 @@ func (d *handlerImpl) DeleteDomain(
 	if err != nil {
 		return err
 	}
+	isGlobalDomain := getResponse.IsGlobalDomain
+	if isGlobalDomain && !d.clusterMetadata.IsPrimaryCluster() {
+		return errNotPrimaryCluster
+	}
+
 	deleteReq := &persistence.DeleteDomainByNameRequest{
 		Name: getResponse.Info.Name,
 	}
-
 	err = d.domainManager.DeleteDomainByName(ctx, deleteReq)
 	if err != nil {
 		return err
 	}
 
+	if isGlobalDomain {
+		if err := d.domainReplicator.HandleTransmissionTask(
+			ctx,
+			types.DomainOperationDelete,
+			getResponse.Info,
+			getResponse.Config,
+			getResponse.ReplicationConfig,
+			getResponse.ConfigVersion,
+			getResponse.FailoverVersion,
+			getResponse.PreviousFailoverVersion,
+			isGlobalDomain,
+		); err != nil {
+			return fmt.Errorf("unable to delete a domain in replica cluster: %v", err)
+		}
+	}
+
 	d.logger.Info("Delete domain succeeded",
 		tag.WorkflowDomainName(getResponse.Info.Name),
 		tag.WorkflowDomainID(getResponse.Info.ID),
diff --git a/common/domain/replicationTaskExecutor.go b/common/domain/replicationTaskExecutor.go
index b4b8dd2f890..d72d8e301ac 100644
--- a/common/domain/replicationTaskExecutor.go
+++ b/common/domain/replicationTaskExecutor.go
@@ -24,6 +24,7 @@ package domain
 
 import (
 	"context"
+	"errors"
 	"time"
 
 	"github.com/uber/cadence/common/clock"
@@ -99,6 +100,8 @@ func (h *domainReplicationTaskExecutorImpl) Execute(task *types.DomainTaskAttrib
 		return h.handleDomainCreationReplicationTask(ctx, task)
 	case types.DomainOperationUpdate:
 		return h.handleDomainUpdateReplicationTask(ctx, task)
+	case types.DomainOperationDelete:
+		return h.handleDomainDeleteReplicationTask(ctx, task)
 	default:
 		return ErrInvalidDomainOperation
 	}
@@ -273,6 +276,26 @@ func (h *domainReplicationTaskExecutorImpl) handleDomainUpdateReplicationTask(ct
 	return h.domainManager.UpdateDomain(ctx, request)
 }
 
+// handleDomainDeleteReplicationTask handles the domain delete replication task
+func (h *domainReplicationTaskExecutorImpl) handleDomainDeleteReplicationTask(ctx context.Context, task *types.DomainTaskAttributes) error {
+	request := &persistence.DeleteDomainByNameRequest{
+		Name: task.Info.GetName(),
+	}
+
+	err := h.domainManager.DeleteDomainByName(ctx, request)
+	if err != nil {
+		_, err := h.domainManager.GetDomain(ctx, &persistence.GetDomainRequest{
+			Name: task.Info.GetName(),
+		})
+
+		var entityNotExistsError *types.EntityNotExistsError
+		if errors.As(err, &entityNotExistsError) {
+			return nil
+		}
+	}
+	return err
+}
+
 func (h *domainReplicationTaskExecutorImpl) validateDomainReplicationTask(task *types.DomainTaskAttributes) error {
 	if task == nil {
 		return ErrEmptyDomainReplicationTask
diff --git a/common/types/mapper/proto/shared.go b/common/types/mapper/proto/shared.go
index 768894cc7e2..4e0d2253729 100644
--- a/common/types/mapper/proto/shared.go
+++ b/common/types/mapper/proto/shared.go
@@ -496,6 +496,8 @@ func FromDomainOperation(t *types.DomainOperation) adminv1.DomainOperation {
 		return adminv1.DomainOperation_DOMAIN_OPERATION_CREATE
 	case types.DomainOperationUpdate:
 		return adminv1.DomainOperation_DOMAIN_OPERATION_UPDATE
+	case types.DomainOperationDelete:
+		return adminv1.DomainOperation_DOMAIN_OPERATION_DELETE
 	}
 	panic("unexpected enum value")
 }
@@ -508,6 +510,8 @@ func ToDomainOperation(t adminv1.DomainOperation) *types.DomainOperation {
 		return types.DomainOperationCreate.Ptr()
 	case adminv1.DomainOperation_DOMAIN_OPERATION_UPDATE:
 		return types.DomainOperationUpdate.Ptr()
+	case adminv1.DomainOperation_DOMAIN_OPERATION_DELETE:
+		return types.DomainOperationDelete.Ptr()
 	}
 	panic("unexpected enum value")
 }
diff --git a/common/types/mapper/thrift/replicator.go b/common/types/mapper/thrift/replicator.go
index ae275e0f620..573a63f3ac8 100644
--- a/common/types/mapper/thrift/replicator.go
+++ b/common/types/mapper/thrift/replicator.go
@@ -69,6 +69,9 @@ func FromDomainOperation(t *types.DomainOperation) *replicator.DomainOperation {
 	case types.DomainOperationUpdate:
 		v := replicator.DomainOperationUpdate
 		return &v
+	case types.DomainOperationDelete:
+		v := replicator.DomainOperationDelete
+		return &v
 	}
 	panic("unexpected enum value")
 }
@@ -85,6 +88,9 @@ func ToDomainOperation(t *replicator.DomainOperation) *types.DomainOperation {
 	case replicator.DomainOperationUpdate:
 		v := types.DomainOperationUpdate
 		return &v
+	case replicator.DomainOperationDelete:
+		v := types.DomainOperationDelete
+		return &v
 	}
 	panic("unexpected enum value")
 }
diff --git a/common/types/replicator.go b/common/types/replicator.go
index d37adda1bba..5a781d9aaa0 100644
--- a/common/types/replicator.go
+++ b/common/types/replicator.go
@@ -93,6 +93,8 @@ func (e DomainOperation) String() string {
 		return "Create"
 	case 1:
 		return "Update"
+	case 2:
+		return "Delete"
 	}
 	return fmt.Sprintf("DomainOperation(%d)", w)
 }
@@ -106,6 +108,9 @@ func (e *DomainOperation) UnmarshalText(value []byte) error {
 	case "UPDATE":
 		*e = DomainOperationUpdate
 		return nil
+	case "DELETE":
+		*e = DomainOperationDelete
+		return nil
 	default:
 		val, err := strconv.ParseInt(s, 10, 32)
 		if err != nil {
@@ -126,6 +131,8 @@ const (
 	DomainOperationCreate DomainOperation = iota
 	// DomainOperationUpdate is an option for DomainOperation
 	DomainOperationUpdate
+	// DomainOperationDelete is an option for DomainOperation
+	DomainOperationDelete
 )
 
 // DomainTaskAttributes is an internal type (TBD...)
diff --git a/common/types/replicator_test.go b/common/types/replicator_test.go
index cd8571022cd..7ba0fe5a2a8 100644
--- a/common/types/replicator_test.go
+++ b/common/types/replicator_test.go
@@ -91,8 +91,11 @@ func TestDomainOperation_String(t *testing.T) {
 	domainOp = DomainOperationUpdate
 	assert.Equal(t, "Update", domainOp.String())
 
-	domainOp = 2
-	assert.Equal(t, "DomainOperation(2)", domainOp.String())
+	domainOp = DomainOperationDelete
+	assert.Equal(t, "Delete", domainOp.String())
+
+	domainOp = 3
+	assert.Equal(t, "DomainOperation(3)", domainOp.String())
 }
 
 func TestDomainOperation_UnmarshalText(t *testing.T) {
diff --git a/go.mod b/go.mod
index 07b0c5487d1..70f59535674 100644
--- a/go.mod
+++ b/go.mod
@@ -42,7 +42,7 @@ require (
 	github.com/startreedata/pinot-client-go v0.2.0 // latest release supports pinot v0.12.0 which is also internal version
 	github.com/stretchr/testify v1.9.0
 	github.com/uber-go/tally v3.3.15+incompatible
-	github.com/uber/cadence-idl v0.0.0-20250511103706-e5b4197e2aef
+	github.com/uber/cadence-idl v0.0.0-20250513140852-97f83aeb4caa
 	github.com/uber/ringpop-go v0.8.5
 	github.com/uber/tchannel-go v1.22.2
 	github.com/urfave/cli/v2 v2.27.4
diff --git a/go.sum b/go.sum
index 6d846683ae0..bef7acc9e28 100644
--- a/go.sum
+++ b/go.sum
@@ -456,8 +456,8 @@ github.com/uber-go/tally v3.3.12+incompatible/go.mod h1:YDTIBxdXyOU/sCWilKB4bgyu
 github.com/uber-go/tally v3.3.15+incompatible h1:9hLSgNBP28CjIaDmAuRTq9qV+UZY+9PcvAkXO4nNMwg=
 github.com/uber-go/tally v3.3.15+incompatible/go.mod h1:YDTIBxdXyOU/sCWilKB4bgyufu1cEi0jdVnRdxvjnmU=
 github.com/uber/cadence-idl v0.0.0-20211111101836-d6b70b60eb8c/go.mod h1:oyUK7GCNCRHCCyWyzifSzXpVrRYVBbAMHAzF5dXiKws=
-github.com/uber/cadence-idl v0.0.0-20250511103706-e5b4197e2aef h1:KMG6RR8Cx30kbFSLgdwK4M3AYKsRykSBv6KYr7gw8Tc=
-github.com/uber/cadence-idl v0.0.0-20250511103706-e5b4197e2aef/go.mod h1:oyUK7GCNCRHCCyWyzifSzXpVrRYVBbAMHAzF5dXiKws=
+github.com/uber/cadence-idl v0.0.0-20250513140852-97f83aeb4caa h1:cqGYBhmrR1H0wBEeV/IRGzYfOfdxJAz8B4VZAmuXgCU=
+github.com/uber/cadence-idl v0.0.0-20250513140852-97f83aeb4caa/go.mod h1:oyUK7GCNCRHCCyWyzifSzXpVrRYVBbAMHAzF5dXiKws=
 github.com/uber/jaeger-client-go v2.22.1+incompatible h1:NHcubEkVbahf9t3p75TOCR83gdUHXjRJvjoBh1yACsM=
 github.com/uber/jaeger-client-go v2.22.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
 github.com/uber/jaeger-lib v2.2.0+incompatible h1:MxZXOiR2JuoANZ3J6DE/U0kSFv/eJ/GfSYVCjK7dyaw=
diff --git a/idls b/idls
index e5b4197e2ae..97f83aeb4ca 160000
--- a/idls
+++ b/idls
@@ -1 +1 @@
-Subproject commit e5b4197e2aef3c407ecbb4dec30a49173a93d61e
+Subproject commit 97f83aeb4caa06b5bc211f918fb8d28d0d78aa04
diff --git a/proto/persistenceblobs/v1/message.proto b/proto/persistenceblobs/v1/message.proto
index 882b444df08..4955ac8775f 100644
--- a/proto/persistenceblobs/v1/message.proto
+++ b/proto/persistenceblobs/v1/message.proto
@@ -1064,6 +1064,7 @@ enum DomainOperation {
     DOMAIN_OPERATION_UNSPECIFIED = 0;
     DOMAIN_OPERATION_CREATE = 1;
     DOMAIN_OPERATION_UPDATE = 2;
+    DOMAIN_OPERATION_DELETE = 3;
 }
 
 message HistoryTaskAttributes {


Reviews:
user: login: shijiesheng
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-14T20:53:13Z
user: login: gazi-yestemirova
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-14T21:05:46Z
user: login: shijiesheng
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-14T21:11:31Z
user: login: gazi-yestemirova
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-14T21:14:38Z
user: login: shijiesheng
state: APPROVED
author_association: MEMBER
submitted_at: 2025-05-14T22:23:09Z
user: login: shijiesheng
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-14T22:24:47Z
user: login: timl3136
state: APPROVED
author_association: MEMBER
submitted_at: 2025-05-14T22:39:04Z
user: login: taylanisikdemir
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-15T03:10:05Z
user: login: gazi-yestemirova
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-15T12:06:29Z
user: login: taylanisikdemir
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-15T20:37:38Z
user: login: taylanisikdemir
state: APPROVED
author_association: MEMBER
submitted_at: 2025-05-15T20:38:43Z

Review comments:
diff_hunk: @@ -600,15 +600,35 @@ func (d *handlerImpl) DeleteDomain(
 	if err != nil {
 		return err
 	}
+	isGlobalDomain := getResponse.IsGlobalDomain
+	if isGlobalDomain && !d.clusterMetadata.IsPrimaryCluster() {
+		return errNotPrimaryCluster
+	}
+
 	deleteReq := &persistence.DeleteDomainByNameRequest{
 		Name: getResponse.Info.Name,
 	}
-
 	err = d.domainManager.DeleteDomainByName(ctx, deleteReq)
 	if err != nil {
 		return err
 	}
 
+	if isGlobalDomain {
+		if err := d.domainReplicator.HandleTransmissionTask(
+			ctx,
+			types.DomainOperationDelete,
+			getResponse.Info,
+			getResponse.Config,
+			getResponse.ReplicationConfig,
+			getResponse.ConfigVersion,
+			getResponse.FailoverVersion,
+			getResponse.PreviousFailoverVersion,
+			isGlobalDomain,
+		); err != nil {
+			return err
path: common/domain/handler.go
user: login: shijiesheng
body: wrap error with additional information warning that domain in replicas was not deleted correctly. 
created_at: 2025-05-14T20:53:12Z
author_association: MEMBER
diff_hunk: @@ -600,15 +600,35 @@ func (d *handlerImpl) DeleteDomain(
 	if err != nil {
 		return err
 	}
+	isGlobalDomain := getResponse.IsGlobalDomain
+	if isGlobalDomain && !d.clusterMetadata.IsPrimaryCluster() {
+		return errNotPrimaryCluster
+	}
+
 	deleteReq := &persistence.DeleteDomainByNameRequest{
 		Name: getResponse.Info.Name,
 	}
-
 	err = d.domainManager.DeleteDomainByName(ctx, deleteReq)
 	if err != nil {
 		return err
 	}
 
+	if isGlobalDomain {
+		if err := d.domainReplicator.HandleTransmissionTask(
+			ctx,
+			types.DomainOperationDelete,
+			getResponse.Info,
+			getResponse.Config,
+			getResponse.ReplicationConfig,
+			getResponse.ConfigVersion,
+			getResponse.FailoverVersion,
+			getResponse.PreviousFailoverVersion,
+			isGlobalDomain,
+		); err != nil {
+			return err
path: common/domain/handler.go
user: login: gazi-yestemirova
body: Thank you, good point! Updated the PR
created_at: 2025-05-14T21:05:46Z
author_association: CONTRIBUTOR
diff_hunk: @@ -273,6 +276,26 @@ func (h *domainReplicationTaskExecutorImpl) handleDomainUpdateReplicationTask(ct
 	return h.domainManager.UpdateDomain(ctx, request)
 }
 
+// handleDomainDeleteReplicationTask handles the domain delete replication task
+func (h *domainReplicationTaskExecutorImpl) handleDomainDeleteReplicationTask(ctx context.Context, task *types.DomainTaskAttributes) error {
path: common/domain/replicationTaskExecutor.go
user: login: shijiesheng
body: The implementation cannot handle the edge case of deletion during failover. 

Consider deletion on primary-to-be-passive cluster A. At the same time, failover update happens on passive-to-be-active cluster B. At t0, deletion on cluster A succeeded. At t1, updateReplicationTask was applied on cluster A, it triggers creation on entityNotExist error. On cluster B, since deletionReplicationTask was applied, domain was deleted.

Thus domain resurrects only on passive domain and cannot be deleted due to the active check. 
created_at: 2025-05-14T21:11:30Z
author_association: MEMBER
diff_hunk: @@ -273,6 +276,26 @@ func (h *domainReplicationTaskExecutorImpl) handleDomainUpdateReplicationTask(ct
 	return h.domainManager.UpdateDomain(ctx, request)
 }
 
+// handleDomainDeleteReplicationTask handles the domain delete replication task
+func (h *domainReplicationTaskExecutorImpl) handleDomainDeleteReplicationTask(ctx context.Context, task *types.DomainTaskAttributes) error {
path: common/domain/replicationTaskExecutor.go
user: login: gazi-yestemirova
body: To delete a domain, it has to be in a deprecated state. Do deprecated domains get failed over? 
Let me double check this. If not, I don't think we should handle such case, right?
created_at: 2025-05-14T21:14:38Z
author_association: CONTRIBUTOR
diff_hunk: @@ -273,6 +276,26 @@ func (h *domainReplicationTaskExecutorImpl) handleDomainUpdateReplicationTask(ct
 	return h.domainManager.UpdateDomain(ctx, request)
 }
 
+// handleDomainDeleteReplicationTask handles the domain delete replication task
+func (h *domainReplicationTaskExecutorImpl) handleDomainDeleteReplicationTask(ctx context.Context, task *types.DomainTaskAttributes) error {
path: common/domain/replicationTaskExecutor.go
user: login: shijiesheng
body: Offline discussion. There is a check in handler that a domain is in deprecated state. In this case, failover cannot happen. Thus there won't be this edge case. 
created_at: 2025-05-14T22:24:46Z
author_association: MEMBER
diff_hunk: @@ -99,6 +100,8 @@ func (h *domainReplicationTaskExecutorImpl) Execute(task *types.DomainTaskAttrib
 		return h.handleDomainCreationReplicationTask(ctx, task)
 	case types.DomainOperationUpdate:
 		return h.handleDomainUpdateReplicationTask(ctx, task)
+	case types.DomainOperationDelete:
path: common/domain/replicationTaskExecutor.go
user: login: taylanisikdemir
body: Is there a forward compatibility issue we should worry about? 
e.g. Cluster A has this change but cluster B is not deployed yet. Cluster A starts generating DELETE tasks which get replicated to cluster B. Cluster B doesn't recognize it and falls into default case below. In that case does the task get discarded, tried forever or put into dlq?

If such cases would cause hard-to-recover situations, let's split idl changes and its usage into separate commits/prereleases. 
created_at: 2025-05-15T03:10:05Z
author_association: MEMBER
diff_hunk: @@ -99,6 +100,8 @@ func (h *domainReplicationTaskExecutorImpl) Execute(task *types.DomainTaskAttrib
 		return h.handleDomainCreationReplicationTask(ctx, task)
 	case types.DomainOperationUpdate:
 		return h.handleDomainUpdateReplicationTask(ctx, task)
+	case types.DomainOperationDelete:
path: common/domain/replicationTaskExecutor.go
user: login: gazi-yestemirova
body: Great point! Thank you!
To address these concerns, I've introduced a feature flag that will be enabled when the changes have been rolled out in active and replica clusters as well. Here is the link - https://github.com/cadence-workflow/cadence/pull/6920 
Please let me know what you think 
created_at: 2025-05-15T12:06:29Z
author_association: CONTRIBUTOR
diff_hunk: @@ -99,6 +100,8 @@ func (h *domainReplicationTaskExecutorImpl) Execute(task *types.DomainTaskAttrib
 		return h.handleDomainCreationReplicationTask(ctx, task)
 	case types.DomainOperationUpdate:
 		return h.handleDomainUpdateReplicationTask(ctx, task)
+	case types.DomainOperationDelete:
path: common/domain/replicationTaskExecutor.go
user: login: taylanisikdemir
body: I think this is a great way to safely rollout this change. Thanks
created_at: 2025-05-15T20:37:38Z
author_association: MEMBER

PR comments:
user: login: timl3136
created_at: 2025-05-14T20:49:21Z
body: This is also an IDL dependency update, can you link related the IDL commit as well?
author_association: MEMBER
user: login: gazi-yestemirova
created_at: 2025-05-14T20:51:17Z
body: > This is also an IDL dependency update, can you link related the IDL commit as well?

sure, here are the links: https://github.com/cadence-workflow/cadence-idl/pull/200 
https://github.com/cadence-workflow/cadence-idl/pull/201 

I will update the summary as well
author_association: CONTRIBUTOR