From 0f88a953d7212c5df26ad832773d3c3d64d6be1e Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Thu, 30 Apr 2026 15:34:35 -0400 Subject: [PATCH] proto: add alarm-transition event family + ack/query RPCs (PR A.1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit First PR of the alarms-over-gateway epic (docs/plans/alarms-over-gateway.md in lmxopcua). Pure contract-surface change — no functional wiring yet. Worker-side subscription (A.2), gateway-side dispatch + ack handler (A.3), and ConditionRefresh (A.4) follow. mxaccess_gateway.proto: - Extend MxEventFamily with MX_EVENT_FAMILY_ON_ALARM_TRANSITION = 5. - Extend MxEvent.body oneof with OnAlarmTransitionEvent on_alarm_transition = 24. - Add OnAlarmTransitionEvent message carrying the full MxAccess alarm payload (full reference, source object, alarm-type-name, transition kind, raw severity, original raise timestamp, transition timestamp, operator user/comment, category, description, current/limit value). Mapping to OPC UA 0-1000 severity ladder happens server-side in lmxopcua's MxAccessSeverityMapper (B.1) — gateway preserves the native MxAccess scale. - Add AlarmTransitionKind enum (Raise / Acknowledge / Clear / Retrigger). - Add ActiveAlarmSnapshot + AlarmConditionState for the ConditionRefresh stream. - Add public RPCs AcknowledgeAlarm (unary) and QueryActiveAlarms (server-streaming) on MxAccessGateway service. - Add AcknowledgeAlarmRequest/Reply + QueryActiveAlarmsRequest. GatewayContractInfo.GatewayProtocolVersion bumps 2 -> 3. Fixture manifests (proto-inputs, behavior, parity, golden OpenSessionReply) and protoset descriptor regenerated. Tests: round-trip serialization for the new messages with all-fields-populated and empty-optional-fields cases; oneof last-write-wins guard between OnDataChange and OnAlarmTransition; descriptor service-method enumeration includes the two new RPCs. All 273 existing tests still pass. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../descriptors/mxaccessgw-client-v1.protoset | Bin 71261 -> 80222 bytes clients/proto/fixtures/behavior/manifest.json | 2 +- .../golden/open-session-reply.ok.json | 6 +- .../parity/parity-fixture-matrix.json | 2 +- clients/proto/proto-inputs.json | 2 +- .../GatewayContractInfo.cs | 2 +- .../Generated/MxaccessGateway.cs | 2898 ++++++++++++++++- .../Generated/MxaccessGatewayGrpc.cs | 72 +- .../Protos/mxaccess_gateway.proto | 132 + .../Contracts/GatewayContractInfoTests.cs | 6 +- .../ProtobufContractRoundTripTests.cs | 191 ++ 11 files changed, 3159 insertions(+), 154 deletions(-) diff --git a/clients/proto/descriptors/mxaccessgw-client-v1.protoset b/clients/proto/descriptors/mxaccessgw-client-v1.protoset index 09a9e6e226d7fc88466c2725b02a5bc4b38e1506..6dd07cb9f386813485116e85529b8e0212a09f58 100644 GIT binary patch delta 28101 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 TEDmo!s=1}*#trxU{-FO0AhzXg delta 19839 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 z zFR~E>p$ckl1W~=n76wqxpBL$naeU5NT;j9qweRF7FyRv468o;jN#9*+QyiiY)F}=U z;!ACc#})sw6mT@9bHEs2L1ZsW0R}7Z@@A>j3dU1yQ?7z|wkO1H4TjDK$3%@ff!%bER zL?IY&?4%GgH+g;t#k>J2yg4NwA;q|!2_k!QN;VY?-eL|y2!nCHN?|P3eGkYGxV0%O z9)cz-L*Ul5M?#h%a9dMWh5%@?G6Zh(!&SVuL6{+MdsA430BFK81a5B{W(eHj`HWh+ z)yGK%E;K~;4nHD4^^iy~1nz9g$`Alec8p{Hd#4J!Fj^LO`Ru>F?(Ihry-V_;WTH`t z{@u2UK)3+vDgq*Vw=E(dQM%g}kx>cgJ(kTOS_*1P7}b}(dwlxRkz#c3@#%$YRHA>c zB|r#WP|w34mhbgrGy#IB-s@8W92L4RO*#CRtv#5kjk)ta-`b=5KZ>Jt%3`C^b$@BP zEXfnp1V|y({>2s`5Y@kk$8xVeDm%RUy?Z?E@L;6xw+-H?wBP}su6UtJ+1!$Tf50}6 z6l3}U**t0=5cCH?iE2)AN0NY<}fP5;Gw3fJQRSa%KZw{LUc*J&tqplTIP%jTaRI5jPyFL=Z z=sx243}0JI-gvaB+lDS^x{^j7ZK}#%|Iwx@d;P!Jc6QXsO8}^QQV`X@`N_JStzdNj zX8YMu+1x+Y6qc6&usy|GHusPDvF5RC?jLJb%jSJkvv0@YF=&C3&HECv561mZ|q-N_+vrBT%Ovi0qSooW5Luc=Tk-g9uajl#OEu zk3b!4Af?q)HuYe1pR%d9Sf<|7DFtCkrUa<*2Ql@uPmjwWrk?ht?qWbJJ#D*~#X`^6 zOoUJc)r$&7_Zg;Q3^5p`(@b0})jsR>9Do-x6G5GcAga%L9!X_JfT%v}ITpxFTr4y3 z@7}$dW+IIA-(|lf<7=_BV6*3CIVsB%-ew=h86v#dkJn2OgfYF@r&p@QvIsxt(<>FE zsCfuP^*KL5=P8Klb3VONEtZ-1d{ecOQ#Wk7G83O~>dH)fzNyPhe4(i;Z*rii%1nHr zsVXz^g{CSq@kP&XMKw}#=msa~{%>)diZA+!7D$Ea#Fv`7a_R>4UWY=e zeW|G`Gx4RSDl_qAALgWLWhR2UZ|0}T{8k#CWM0WkeA)987wsTs;wv^27dx4WppAQ( ziLdx^Hfm%hzM?bHh3(7Y4WIoZ&8F>`)8`wm3q&oT)&f$?yLP1kqWZ2?0#eDl zzQ2-B4PDr=EDj3U(x6NKj))$_k3(X_c9dF{gmfB!s0GwoKx$bM(!~jg>XML}0#eJ8 zkZveHR2Bz^?2uH+hmbrt$hY#+FCUUxmWOns1W^m9wSd&JJfw63qPsls!&({5Ahj$H z@q)>Poyy{{kR6_C*$K(RLaJmZsbqy!0tLn&thK<@vchTs(OqG+fYh?WYT23ZQ9^c9 zs%2*+j|}Onik+pFmBHylG(=NCtpsEouMF*aiL-MRYgrj)==&ta)Uq-xkjG0Gb}5Ua zLw0PcWfy8WIyB@*$sz0_wH#yJ0#OU7wSY9`80!`g)nlw%Kq@&Vb_@IOmcZ{xLUxYU z(jqzaxX=>!eJw$1IX>tyUWh_achVqh#PLCo?UYiuI_PzrkYc=95JYx$(3=GiIsw_Z z{}MzPHeoHUg>m=9reRqyK$DeS_lZrz#Nqc%S!oSuva;*`eN$F`D{)fLn>?J5-4__& z83YkNDd?dXq~F#wn=VNnjN2_KM0QQkZ7WEU|3gz&k~(Oza`5^?l4btO!RwDfzZeoi z7>xS_L4^Mp;wM4@B#oaO(&-687K|&66e4?a(2EC~=!IkA1&DO~sC1|bV*O#C!V90Vud1go#gb=b| zT=*sa`~nl6rZ07FU8PC8!ZsBpx$4A zu{2#@w8$p&66-byS#WmjHW1lM!d$&WX^~Ckr7FvBbwPw-6P6@#X;YXeT^7>CZcEG& zVBFE5Dmmh^5HEJ6b#%t%HYg$Nf_g^*B71pAcN8s>Bd!Qlx=scWzQV>5i0~C*ntUWI zhRG3EHl2_h0h$w%Bd%;ZL5{d8=%<2cN{#?^0E5V074+Lcw!BqwP2jI>#dW_${Jkc$ z#GO)0A>DedO+Sc2P;(84oog-E@W)!X#j)uJDaQ2~L(;3)>B<>E==zY_&EE^kVK+U r?h|fpx+vWW>S9GH!nfLD#otun!l-Fjx)n6T(yh0JjbD4}t^NNW7M|o) diff --git a/clients/proto/fixtures/behavior/manifest.json b/clients/proto/fixtures/behavior/manifest.json index ff802a0..aea5a5c 100644 --- a/clients/proto/fixtures/behavior/manifest.json +++ b/clients/proto/fixtures/behavior/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "fixtureSet": "mxaccess-gateway-client-behavior", "contractName": "mxaccess-gateway", - "gatewayProtocolVersion": 2, + "gatewayProtocolVersion": 3, "workerProtocolVersion": 1, "protoInputManifest": "clients/proto/proto-inputs.json", "fixtures": [ diff --git a/clients/proto/fixtures/golden/open-session-reply.ok.json b/clients/proto/fixtures/golden/open-session-reply.ok.json index e242b6d..1be1b4d 100644 --- a/clients/proto/fixtures/golden/open-session-reply.ok.json +++ b/clients/proto/fixtures/golden/open-session-reply.ok.json @@ -3,12 +3,14 @@ "backendName": "mxaccess-worker", "workerProcessId": 1234, "workerProtocolVersion": 1, - "gatewayProtocolVersion": 2, + "gatewayProtocolVersion": 3, "capabilities": [ "unary-open-session", "unary-close-session", "unary-invoke", - "server-stream-events" + "server-stream-events", + "unary-acknowledge-alarm", + "server-stream-active-alarms" ], "defaultCommandTimeout": "30s", "protocolStatus": { diff --git a/clients/proto/fixtures/parity/parity-fixture-matrix.json b/clients/proto/fixtures/parity/parity-fixture-matrix.json index e4f0a5e..447e795 100644 --- a/clients/proto/fixtures/parity/parity-fixture-matrix.json +++ b/clients/proto/fixtures/parity/parity-fixture-matrix.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "fixtureSet": "mxaccess-gateway-parity-fixture-matrix", "contractName": "mxaccess-gateway", - "gatewayProtocolVersion": 2, + "gatewayProtocolVersion": 3, "workerProtocolVersion": 1, "sourceCaptureRoot": "C:/Users/dohertj2/Desktop/mxaccess/captures", "sourceDocs": [ diff --git a/clients/proto/proto-inputs.json b/clients/proto/proto-inputs.json index 9d424b0..4feba3c 100644 --- a/clients/proto/proto-inputs.json +++ b/clients/proto/proto-inputs.json @@ -1,7 +1,7 @@ { "schemaVersion": 1, "contractName": "mxaccess-gateway", - "gatewayProtocolVersion": 2, + "gatewayProtocolVersion": 3, "workerProtocolVersion": 1, "protoRoot": "src/MxGateway.Contracts/Protos", "sourceFiles": [ diff --git a/src/MxGateway.Contracts/GatewayContractInfo.cs b/src/MxGateway.Contracts/GatewayContractInfo.cs index a6b6c92..633623d 100644 --- a/src/MxGateway.Contracts/GatewayContractInfo.cs +++ b/src/MxGateway.Contracts/GatewayContractInfo.cs @@ -6,7 +6,7 @@ namespace MxGateway.Contracts; /// public static class GatewayContractInfo { - public const uint GatewayProtocolVersion = 2; + public const uint GatewayProtocolVersion = 3; public const uint WorkerProtocolVersion = 1; diff --git a/src/MxGateway.Contracts/Generated/MxaccessGateway.cs b/src/MxGateway.Contracts/Generated/MxaccessGateway.cs index dc74ff7..05c543c 100644 --- a/src/MxGateway.Contracts/Generated/MxaccessGateway.cs +++ b/src/MxGateway.Contracts/Generated/MxaccessGateway.cs @@ -192,7 +192,7 @@ namespace MxGateway.Contracts.Proto { "ckluZm9SZXBseRIZChF3b3JrZXJfcHJvY2Vzc19pZBgBIAEoBRIWCg53b3Jr", "ZXJfdmVyc2lvbhgCIAEoCRIXCg9teGFjY2Vzc19wcm9naWQYAyABKAkSFgoO", "bXhhY2Nlc3NfY2xzaWQYBCABKAkiQAoQRHJhaW5FdmVudHNSZXBseRIsCgZl", - "dmVudHMYASADKAsyHC5teGFjY2Vzc19nYXRld2F5LnYxLk14RXZlbnQimwYK", + "dmVudHMYASADKAsyHC5teGFjY2Vzc19nYXRld2F5LnYxLk14RXZlbnQi5wYK", "B014RXZlbnQSMgoGZmFtaWx5GAEgASgOMiIubXhhY2Nlc3NfZ2F0ZXdheS52", "MS5NeEV2ZW50RmFtaWx5EhIKCnNlc3Npb25faWQYAiABKAkSFQoNc2VydmVy", "X2hhbmRsZRgDIAEoBRITCgtpdGVtX2hhbmRsZRgEIAEoBRIrCgV2YWx1ZRgF", @@ -210,138 +210,188 @@ namespace MxGateway.Contracts.Proto { "Y29tcGxldGUYFiABKAsyKy5teGFjY2Vzc19nYXRld2F5LnYxLk9wZXJhdGlv", "bkNvbXBsZXRlRXZlbnRIABJRChdvbl9idWZmZXJlZF9kYXRhX2NoYW5nZRgX", "IAEoCzIuLm14YWNjZXNzX2dhdGV3YXkudjEuT25CdWZmZXJlZERhdGFDaGFu", - "Z2VFdmVudEgAQgYKBGJvZHlCCgoIX2hyZXN1bHQiEwoRT25EYXRhQ2hhbmdl", - "RXZlbnQiFgoUT25Xcml0ZUNvbXBsZXRlRXZlbnQiGAoWT3BlcmF0aW9uQ29t", - "cGxldGVFdmVudCLUAQoZT25CdWZmZXJlZERhdGFDaGFuZ2VFdmVudBIyCglk", - "YXRhX3R5cGUYASABKA4yHy5teGFjY2Vzc19nYXRld2F5LnYxLk14RGF0YVR5", - "cGUSNAoOcXVhbGl0eV92YWx1ZXMYAiABKAsyHC5teGFjY2Vzc19nYXRld2F5", - "LnYxLk14QXJyYXkSNgoQdGltZXN0YW1wX3ZhbHVlcxgDIAEoCzIcLm14YWNj", - "ZXNzX2dhdGV3YXkudjEuTXhBcnJheRIVCg1yYXdfZGF0YV90eXBlGAQgASgF", - "IusBCg1NeFN0YXR1c1Byb3h5Eg8KB3N1Y2Nlc3MYASABKAUSNwoIY2F0ZWdv", - "cnkYAiABKA4yJS5teGFjY2Vzc19nYXRld2F5LnYxLk14U3RhdHVzQ2F0ZWdv", - "cnkSOAoLZGV0ZWN0ZWRfYnkYAyABKA4yIy5teGFjY2Vzc19nYXRld2F5LnYx", - "Lk14U3RhdHVzU291cmNlEg4KBmRldGFpbBgEIAEoBRIUCgxyYXdfY2F0ZWdv", - "cnkYBSABKAUSFwoPcmF3X2RldGVjdGVkX2J5GAYgASgFEhcKD2RpYWdub3N0", - "aWNfdGV4dBgHIAEoCSKnAwoHTXhWYWx1ZRIyCglkYXRhX3R5cGUYASABKA4y", - "Hy5teGFjY2Vzc19nYXRld2F5LnYxLk14RGF0YVR5cGUSFAoMdmFyaWFudF90", - "eXBlGAIgASgJEg8KB2lzX251bGwYAyABKAgSFgoOcmF3X2RpYWdub3N0aWMY", - "BCABKAkSFQoNcmF3X2RhdGFfdHlwZRgFIAEoBRIUCgpib29sX3ZhbHVlGAog", - "ASgISAASFQoLaW50MzJfdmFsdWUYCyABKAVIABIVCgtpbnQ2NF92YWx1ZRgM", - "IAEoA0gAEhUKC2Zsb2F0X3ZhbHVlGA0gASgCSAASFgoMZG91YmxlX3ZhbHVl", - "GA4gASgBSAASFgoMc3RyaW5nX3ZhbHVlGA8gASgJSAASNQoPdGltZXN0YW1w", - "X3ZhbHVlGBAgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgAEjMK", - "C2FycmF5X3ZhbHVlGBEgASgLMhwubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeEFy", - "cmF5SAASEwoJcmF3X3ZhbHVlGBIgASgMSABCBgoEa2luZCL+BAoHTXhBcnJh", - "eRI6ChFlbGVtZW50X2RhdGFfdHlwZRgBIAEoDjIfLm14YWNjZXNzX2dhdGV3", - "YXkudjEuTXhEYXRhVHlwZRIUCgx2YXJpYW50X3R5cGUYAiABKAkSEgoKZGlt", - "ZW5zaW9ucxgDIAMoDRIWCg5yYXdfZGlhZ25vc3RpYxgEIAEoCRIdChVyYXdf", - "ZWxlbWVudF9kYXRhX3R5cGUYBSABKAUSNQoLYm9vbF92YWx1ZXMYCiABKAsy", - "Hi5teGFjY2Vzc19nYXRld2F5LnYxLkJvb2xBcnJheUgAEjcKDGludDMyX3Zh", - "bHVlcxgLIAEoCzIfLm14YWNjZXNzX2dhdGV3YXkudjEuSW50MzJBcnJheUgA", - "EjcKDGludDY0X3ZhbHVlcxgMIAEoCzIfLm14YWNjZXNzX2dhdGV3YXkudjEu", - "SW50NjRBcnJheUgAEjcKDGZsb2F0X3ZhbHVlcxgNIAEoCzIfLm14YWNjZXNz", - "X2dhdGV3YXkudjEuRmxvYXRBcnJheUgAEjkKDWRvdWJsZV92YWx1ZXMYDiAB", - "KAsyIC5teGFjY2Vzc19nYXRld2F5LnYxLkRvdWJsZUFycmF5SAASOQoNc3Ry", - "aW5nX3ZhbHVlcxgPIAEoCzIgLm14YWNjZXNzX2dhdGV3YXkudjEuU3RyaW5n", - "QXJyYXlIABI/ChB0aW1lc3RhbXBfdmFsdWVzGBAgASgLMiMubXhhY2Nlc3Nf", - "Z2F0ZXdheS52MS5UaW1lc3RhbXBBcnJheUgAEjMKCnJhd192YWx1ZXMYESAB", - "KAsyHS5teGFjY2Vzc19nYXRld2F5LnYxLlJhd0FycmF5SABCCAoGdmFsdWVz", - "IhsKCUJvb2xBcnJheRIOCgZ2YWx1ZXMYASADKAgiHAoKSW50MzJBcnJheRIO", - "CgZ2YWx1ZXMYASADKAUiHAoKSW50NjRBcnJheRIOCgZ2YWx1ZXMYASADKAMi", - "HAoKRmxvYXRBcnJheRIOCgZ2YWx1ZXMYASADKAIiHQoLRG91YmxlQXJyYXkS", - "DgoGdmFsdWVzGAEgAygBIh0KC1N0cmluZ0FycmF5Eg4KBnZhbHVlcxgBIAMo", - "CSI8Cg5UaW1lc3RhbXBBcnJheRIqCgZ2YWx1ZXMYASADKAsyGi5nb29nbGUu", - "cHJvdG9idWYuVGltZXN0YW1wIhoKCFJhd0FycmF5Eg4KBnZhbHVlcxgBIAMo", - "DCJYCg5Qcm90b2NvbFN0YXR1cxI1CgRjb2RlGAEgASgOMicubXhhY2Nlc3Nf", - "Z2F0ZXdheS52MS5Qcm90b2NvbFN0YXR1c0NvZGUSDwoHbWVzc2FnZRgCIAEo", - "CSqhCAoNTXhDb21tYW5kS2luZBIfChtNWF9DT01NQU5EX0tJTkRfVU5TUEVD", - "SUZJRUQQABIcChhNWF9DT01NQU5EX0tJTkRfUkVHSVNURVIQARIeChpNWF9D", - "T01NQU5EX0tJTkRfVU5SRUdJU1RFUhACEhwKGE1YX0NPTU1BTkRfS0lORF9B", - "RERfSVRFTRADEh0KGU1YX0NPTU1BTkRfS0lORF9BRERfSVRFTTIQBBIfChtN", - "WF9DT01NQU5EX0tJTkRfUkVNT1ZFX0lURU0QBRIaChZNWF9DT01NQU5EX0tJ", - "TkRfQURWSVNFEAYSHQoZTVhfQ09NTUFORF9LSU5EX1VOX0FEVklTRRAHEiYK", - "Ik1YX0NPTU1BTkRfS0lORF9BRFZJU0VfU1VQRVJWSVNPUlkQCBIlCiFNWF9D", - "T01NQU5EX0tJTkRfQUREX0JVRkZFUkVEX0lURU0QCRIwCixNWF9DT01NQU5E", - "X0tJTkRfU0VUX0JVRkZFUkVEX1VQREFURV9JTlRFUlZBTBAKEhsKF01YX0NP", - "TU1BTkRfS0lORF9TVVNQRU5EEAsSHAoYTVhfQ09NTUFORF9LSU5EX0FDVElW", - "QVRFEAwSGQoVTVhfQ09NTUFORF9LSU5EX1dSSVRFEA0SGgoWTVhfQ09NTUFO", - "RF9LSU5EX1dSSVRFMhAOEiEKHU1YX0NPTU1BTkRfS0lORF9XUklURV9TRUNV", - "UkVEEA8SIgoeTVhfQ09NTUFORF9LSU5EX1dSSVRFX1NFQ1VSRUQyEBASJQoh", - "TVhfQ09NTUFORF9LSU5EX0FVVEhFTlRJQ0FURV9VU0VSEBESKAokTVhfQ09N", - "TUFORF9LSU5EX0FSQ0hFU1RSQV9VU0VSX1RPX0lEEBISIQodTVhfQ09NTUFO", - "RF9LSU5EX0FERF9JVEVNX0JVTEsQExIkCiBNWF9DT01NQU5EX0tJTkRfQURW", - "SVNFX0lURU1fQlVMSxAUEiQKIE1YX0NPTU1BTkRfS0lORF9SRU1PVkVfSVRF", - "TV9CVUxLEBUSJwojTVhfQ09NTUFORF9LSU5EX1VOX0FEVklTRV9JVEVNX0JV", - "TEsQFhIiCh5NWF9DT01NQU5EX0tJTkRfU1VCU0NSSUJFX0JVTEsQFxIkCiBN", - "WF9DT01NQU5EX0tJTkRfVU5TVUJTQ1JJQkVfQlVMSxAYEhgKFE1YX0NPTU1B", - "TkRfS0lORF9QSU5HEGQSJQohTVhfQ09NTUFORF9LSU5EX0dFVF9TRVNTSU9O", - "X1NUQVRFEGUSIwofTVhfQ09NTUFORF9LSU5EX0dFVF9XT1JLRVJfSU5GTxBm", - "EiAKHE1YX0NPTU1BTkRfS0lORF9EUkFJTl9FVkVOVFMQZxIjCh9NWF9DT01N", - "QU5EX0tJTkRfU0hVVERPV05fV09SS0VSEGgq0AEKDU14RXZlbnRGYW1pbHkS", - "HwobTVhfRVZFTlRfRkFNSUxZX1VOU1BFQ0lGSUVEEAASIgoeTVhfRVZFTlRf", - "RkFNSUxZX09OX0RBVEFfQ0hBTkdFEAESJQohTVhfRVZFTlRfRkFNSUxZX09O", - "X1dSSVRFX0NPTVBMRVRFEAISJgoiTVhfRVZFTlRfRkFNSUxZX09QRVJBVElP", - "Tl9DT01QTEVURRADEisKJ01YX0VWRU5UX0ZBTUlMWV9PTl9CVUZGRVJFRF9E", - "QVRBX0NIQU5HRRAEKqUDChBNeFN0YXR1c0NhdGVnb3J5EiIKHk1YX1NUQVRV", - "U19DQVRFR09SWV9VTlNQRUNJRklFRBAAEh4KGk1YX1NUQVRVU19DQVRFR09S", - "WV9VTktOT1dOEAESGQoVTVhfU1RBVFVTX0NBVEVHT1JZX09LEAISHgoaTVhf", - "U1RBVFVTX0NBVEVHT1JZX1BFTkRJTkcQAxIeChpNWF9TVEFUVVNfQ0FURUdP", - "UllfV0FSTklORxAEEioKJk1YX1NUQVRVU19DQVRFR09SWV9DT01NVU5JQ0FU", - "SU9OX0VSUk9SEAUSKgomTVhfU1RBVFVTX0NBVEVHT1JZX0NPTkZJR1VSQVRJ", - "T05fRVJST1IQBhIoCiRNWF9TVEFUVVNfQ0FURUdPUllfT1BFUkFUSU9OQUxf", - "RVJST1IQBxIlCiFNWF9TVEFUVVNfQ0FURUdPUllfU0VDVVJJVFlfRVJST1IQ", - "CBIlCiFNWF9TVEFUVVNfQ0FURUdPUllfU09GVFdBUkVfRVJST1IQCRIiCh5N", - "WF9TVEFUVVNfQ0FURUdPUllfT1RIRVJfRVJST1IQCirKAgoOTXhTdGF0dXNT", - "b3VyY2USIAocTVhfU1RBVFVTX1NPVVJDRV9VTlNQRUNJRklFRBAAEhwKGE1Y", - "X1NUQVRVU19TT1VSQ0VfVU5LTk9XThABEiMKH01YX1NUQVRVU19TT1VSQ0Vf", - "UkVRVUVTVElOR19MTVgQAhIjCh9NWF9TVEFUVVNfU09VUkNFX1JFU1BPTkRJ", - "TkdfTE1YEAMSIwofTVhfU1RBVFVTX1NPVVJDRV9SRVFVRVNUSU5HX05NWBAE", - "EiMKH01YX1NUQVRVU19TT1VSQ0VfUkVTUE9ORElOR19OTVgQBRIxCi1NWF9T", - "VEFUVVNfU09VUkNFX1JFUVVFU1RJTkdfQVVUT01BVElPTl9PQkpFQ1QQBhIx", - "Ci1NWF9TVEFUVVNfU09VUkNFX1JFU1BPTkRJTkdfQVVUT01BVElPTl9PQkpF", - "Q1QQByrdBAoKTXhEYXRhVHlwZRIcChhNWF9EQVRBX1RZUEVfVU5TUEVDSUZJ", - "RUQQABIYChRNWF9EQVRBX1RZUEVfVU5LTk9XThABEhgKFE1YX0RBVEFfVFlQ", - "RV9OT19EQVRBEAISGAoUTVhfREFUQV9UWVBFX0JPT0xFQU4QAxIYChRNWF9E", - "QVRBX1RZUEVfSU5URUdFUhAEEhYKEk1YX0RBVEFfVFlQRV9GTE9BVBAFEhcK", - "E01YX0RBVEFfVFlQRV9ET1VCTEUQBhIXChNNWF9EQVRBX1RZUEVfU1RSSU5H", - "EAcSFQoRTVhfREFUQV9UWVBFX1RJTUUQCBIdChlNWF9EQVRBX1RZUEVfRUxB", - "UFNFRF9USU1FEAkSHwobTVhfREFUQV9UWVBFX1JFRkVSRU5DRV9UWVBFEAoS", - "HAoYTVhfREFUQV9UWVBFX1NUQVRVU19UWVBFEAsSFQoRTVhfREFUQV9UWVBF", - "X0VOVU0QDBItCilNWF9EQVRBX1RZUEVfU0VDVVJJVFlfQ0xBU1NJRklDQVRJ", - "T05fRU5VTRANEiIKHk1YX0RBVEFfVFlQRV9EQVRBX1FVQUxJVFlfVFlQRRAO", - "Eh8KG01YX0RBVEFfVFlQRV9RVUFMSUZJRURfRU5VTRAPEiEKHU1YX0RBVEFf", - "VFlQRV9RVUFMSUZJRURfU1RSVUNUEBASKQolTVhfREFUQV9UWVBFX0lOVEVS", - "TkFUSU9OQUxJWkVEX1NUUklORxAREhsKF01YX0RBVEFfVFlQRV9CSUdfU1RS", - "SU5HEBISFAoQTVhfREFUQV9UWVBFX0VORBATKqMDChJQcm90b2NvbFN0YXR1", - "c0NvZGUSJAogUFJPVE9DT0xfU1RBVFVTX0NPREVfVU5TUEVDSUZJRUQQABIb", - "ChdQUk9UT0NPTF9TVEFUVVNfQ09ERV9PSxABEigKJFBST1RPQ09MX1NUQVRV", - "U19DT0RFX0lOVkFMSURfUkVRVUVTVBACEioKJlBST1RPQ09MX1NUQVRVU19D", - "T0RFX1NFU1NJT05fTk9UX0ZPVU5EEAMSKgomUFJPVE9DT0xfU1RBVFVTX0NP", - "REVfU0VTU0lPTl9OT1RfUkVBRFkQBBIrCidQUk9UT0NPTF9TVEFUVVNfQ09E", - "RV9XT1JLRVJfVU5BVkFJTEFCTEUQBRIgChxQUk9UT0NPTF9TVEFUVVNfQ09E", - "RV9USU1FT1VUEAYSIQodUFJPVE9DT0xfU1RBVFVTX0NPREVfQ0FOQ0VMRUQQ", - "BxIrCidQUk9UT0NPTF9TVEFUVVNfQ09ERV9QUk9UT0NPTF9WSU9MQVRJT04Q", - "CBIpCiVQUk9UT0NPTF9TVEFUVVNfQ09ERV9NWEFDQ0VTU19GQUlMVVJFEAkq", - "vwIKDFNlc3Npb25TdGF0ZRIdChlTRVNTSU9OX1NUQVRFX1VOU1BFQ0lGSUVE", - "EAASGgoWU0VTU0lPTl9TVEFURV9DUkVBVElORxABEiEKHVNFU1NJT05fU1RB", - "VEVfU1RBUlRJTkdfV09SS0VSEAISIgoeU0VTU0lPTl9TVEFURV9XQUlUSU5H", - "X0ZPUl9QSVBFEAMSHQoZU0VTU0lPTl9TVEFURV9IQU5EU0hBS0lORxAEEiUK", - "IVNFU1NJT05fU1RBVEVfSU5JVElBTElaSU5HX1dPUktFUhAFEhcKE1NFU1NJ", - "T05fU1RBVEVfUkVBRFkQBhIZChVTRVNTSU9OX1NUQVRFX0NMT1NJTkcQBxIY", - "ChRTRVNTSU9OX1NUQVRFX0NMT1NFRBAIEhkKFVNFU1NJT05fU1RBVEVfRkFV", - "TFRFRBAJMoIDCg9NeEFjY2Vzc0dhdGV3YXkSXQoLT3BlblNlc3Npb24SJy5t", - "eGFjY2Vzc19nYXRld2F5LnYxLk9wZW5TZXNzaW9uUmVxdWVzdBolLm14YWNj", - "ZXNzX2dhdGV3YXkudjEuT3BlblNlc3Npb25SZXBseRJgCgxDbG9zZVNlc3Np", - "b24SKC5teGFjY2Vzc19nYXRld2F5LnYxLkNsb3NlU2Vzc2lvblJlcXVlc3Qa", - "Ji5teGFjY2Vzc19nYXRld2F5LnYxLkNsb3NlU2Vzc2lvblJlcGx5ElQKBklu", - "dm9rZRIlLm14YWNjZXNzX2dhdGV3YXkudjEuTXhDb21tYW5kUmVxdWVzdBoj", - "Lm14YWNjZXNzX2dhdGV3YXkudjEuTXhDb21tYW5kUmVwbHkSWAoMU3RyZWFt", - "RXZlbnRzEigubXhhY2Nlc3NfZ2F0ZXdheS52MS5TdHJlYW1FdmVudHNSZXF1", - "ZXN0GhwubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeEV2ZW50MAFCHKoCGU14R2F0", - "ZXdheS5Db250cmFjdHMuUHJvdG9iBnByb3RvMw==")); + "Z2VFdmVudEgAEkoKE29uX2FsYXJtX3RyYW5zaXRpb24YGCABKAsyKy5teGFj", + "Y2Vzc19nYXRld2F5LnYxLk9uQWxhcm1UcmFuc2l0aW9uRXZlbnRIAEIGCgRi", + "b2R5QgoKCF9ocmVzdWx0IhMKEU9uRGF0YUNoYW5nZUV2ZW50IhYKFE9uV3Jp", + "dGVDb21wbGV0ZUV2ZW50IhgKFk9wZXJhdGlvbkNvbXBsZXRlRXZlbnQi1AEK", + "GU9uQnVmZmVyZWREYXRhQ2hhbmdlRXZlbnQSMgoJZGF0YV90eXBlGAEgASgO", + "Mh8ubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeERhdGFUeXBlEjQKDnF1YWxpdHlf", + "dmFsdWVzGAIgASgLMhwubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeEFycmF5EjYK", + "EHRpbWVzdGFtcF92YWx1ZXMYAyABKAsyHC5teGFjY2Vzc19nYXRld2F5LnYx", + "Lk14QXJyYXkSFQoNcmF3X2RhdGFfdHlwZRgEIAEoBSL9AwoWT25BbGFybVRy", + "YW5zaXRpb25FdmVudBIcChRhbGFybV9mdWxsX3JlZmVyZW5jZRgBIAEoCRIf", + "Chdzb3VyY2Vfb2JqZWN0X3JlZmVyZW5jZRgCIAEoCRIXCg9hbGFybV90eXBl", + "X25hbWUYAyABKAkSQQoPdHJhbnNpdGlvbl9raW5kGAQgASgOMigubXhhY2Nl", + "c3NfZ2F0ZXdheS52MS5BbGFybVRyYW5zaXRpb25LaW5kEhAKCHNldmVyaXR5", + "GAUgASgFEjwKGG9yaWdpbmFsX3JhaXNlX3RpbWVzdGFtcBgGIAEoCzIaLmdv", + "b2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASOAoUdHJhbnNpdGlvbl90aW1lc3Rh", + "bXAYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhUKDW9wZXJh", + "dG9yX3VzZXIYCCABKAkSGAoQb3BlcmF0b3JfY29tbWVudBgJIAEoCRIQCghj", + "YXRlZ29yeRgKIAEoCRITCgtkZXNjcmlwdGlvbhgLIAEoCRIzCg1jdXJyZW50", + "X3ZhbHVlGAwgASgLMhwubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeFZhbHVlEjEK", + "C2xpbWl0X3ZhbHVlGA0gASgLMhwubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeFZh", + "bHVlIv0DChNBY3RpdmVBbGFybVNuYXBzaG90EhwKFGFsYXJtX2Z1bGxfcmVm", + "ZXJlbmNlGAEgASgJEh8KF3NvdXJjZV9vYmplY3RfcmVmZXJlbmNlGAIgASgJ", + "EhcKD2FsYXJtX3R5cGVfbmFtZRgDIAEoCRIQCghzZXZlcml0eRgEIAEoBRI8", + "ChhvcmlnaW5hbF9yYWlzZV90aW1lc3RhbXAYBSABKAsyGi5nb29nbGUucHJv", + "dG9idWYuVGltZXN0YW1wEj8KDWN1cnJlbnRfc3RhdGUYBiABKA4yKC5teGFj", + "Y2Vzc19nYXRld2F5LnYxLkFsYXJtQ29uZGl0aW9uU3RhdGUSEAoIY2F0ZWdv", + "cnkYByABKAkSEwoLZGVzY3JpcHRpb24YCCABKAkSPQoZbGFzdF90cmFuc2l0", + "aW9uX3RpbWVzdGFtcBgJIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3Rh", + "bXASFQoNb3BlcmF0b3JfdXNlchgKIAEoCRIYChBvcGVyYXRvcl9jb21tZW50", + "GAsgASgJEjMKDWN1cnJlbnRfdmFsdWUYDCABKAsyHC5teGFjY2Vzc19nYXRl", + "d2F5LnYxLk14VmFsdWUSMQoLbGltaXRfdmFsdWUYDSABKAsyHC5teGFjY2Vz", + "c19nYXRld2F5LnYxLk14VmFsdWUikgEKF0Fja25vd2xlZGdlQWxhcm1SZXF1", + "ZXN0EhIKCnNlc3Npb25faWQYASABKAkSHQoVY2xpZW50X2NvcnJlbGF0aW9u", + "X2lkGAIgASgJEhwKFGFsYXJtX2Z1bGxfcmVmZXJlbmNlGAMgASgJEg8KB2Nv", + "bW1lbnQYBCABKAkSFQoNb3BlcmF0b3JfdXNlchgFIAEoCSLzAQoVQWNrbm93", + "bGVkZ2VBbGFybVJlcGx5EhIKCnNlc3Npb25faWQYASABKAkSFgoOY29ycmVs", + "YXRpb25faWQYAiABKAkSPAoPcHJvdG9jb2xfc3RhdHVzGAMgASgLMiMubXhh", + "Y2Nlc3NfZ2F0ZXdheS52MS5Qcm90b2NvbFN0YXR1cxIUCgdocmVzdWx0GAQg", + "ASgFSACIAQESMgoGc3RhdHVzGAUgASgLMiIubXhhY2Nlc3NfZ2F0ZXdheS52", + "MS5NeFN0YXR1c1Byb3h5EhoKEmRpYWdub3N0aWNfbWVzc2FnZRgGIAEoCUIK", + "CghfaHJlc3VsdCJqChhRdWVyeUFjdGl2ZUFsYXJtc1JlcXVlc3QSEgoKc2Vz", + "c2lvbl9pZBgBIAEoCRIdChVjbGllbnRfY29ycmVsYXRpb25faWQYAiABKAkS", + "GwoTYWxhcm1fZmlsdGVyX3ByZWZpeBgDIAEoCSLrAQoNTXhTdGF0dXNQcm94", + "eRIPCgdzdWNjZXNzGAEgASgFEjcKCGNhdGVnb3J5GAIgASgOMiUubXhhY2Nl", + "c3NfZ2F0ZXdheS52MS5NeFN0YXR1c0NhdGVnb3J5EjgKC2RldGVjdGVkX2J5", + "GAMgASgOMiMubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeFN0YXR1c1NvdXJjZRIO", + "CgZkZXRhaWwYBCABKAUSFAoMcmF3X2NhdGVnb3J5GAUgASgFEhcKD3Jhd19k", + "ZXRlY3RlZF9ieRgGIAEoBRIXCg9kaWFnbm9zdGljX3RleHQYByABKAkipwMK", + "B014VmFsdWUSMgoJZGF0YV90eXBlGAEgASgOMh8ubXhhY2Nlc3NfZ2F0ZXdh", + "eS52MS5NeERhdGFUeXBlEhQKDHZhcmlhbnRfdHlwZRgCIAEoCRIPCgdpc19u", + "dWxsGAMgASgIEhYKDnJhd19kaWFnbm9zdGljGAQgASgJEhUKDXJhd19kYXRh", + "X3R5cGUYBSABKAUSFAoKYm9vbF92YWx1ZRgKIAEoCEgAEhUKC2ludDMyX3Zh", + "bHVlGAsgASgFSAASFQoLaW50NjRfdmFsdWUYDCABKANIABIVCgtmbG9hdF92", + "YWx1ZRgNIAEoAkgAEhYKDGRvdWJsZV92YWx1ZRgOIAEoAUgAEhYKDHN0cmlu", + "Z192YWx1ZRgPIAEoCUgAEjUKD3RpbWVzdGFtcF92YWx1ZRgQIAEoCzIaLmdv", + "b2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBIABIzCgthcnJheV92YWx1ZRgRIAEo", + "CzIcLm14YWNjZXNzX2dhdGV3YXkudjEuTXhBcnJheUgAEhMKCXJhd192YWx1", + "ZRgSIAEoDEgAQgYKBGtpbmQi/gQKB014QXJyYXkSOgoRZWxlbWVudF9kYXRh", + "X3R5cGUYASABKA4yHy5teGFjY2Vzc19nYXRld2F5LnYxLk14RGF0YVR5cGUS", + "FAoMdmFyaWFudF90eXBlGAIgASgJEhIKCmRpbWVuc2lvbnMYAyADKA0SFgoO", + "cmF3X2RpYWdub3N0aWMYBCABKAkSHQoVcmF3X2VsZW1lbnRfZGF0YV90eXBl", + "GAUgASgFEjUKC2Jvb2xfdmFsdWVzGAogASgLMh4ubXhhY2Nlc3NfZ2F0ZXdh", + "eS52MS5Cb29sQXJyYXlIABI3CgxpbnQzMl92YWx1ZXMYCyABKAsyHy5teGFj", + "Y2Vzc19nYXRld2F5LnYxLkludDMyQXJyYXlIABI3CgxpbnQ2NF92YWx1ZXMY", + "DCABKAsyHy5teGFjY2Vzc19nYXRld2F5LnYxLkludDY0QXJyYXlIABI3Cgxm", + "bG9hdF92YWx1ZXMYDSABKAsyHy5teGFjY2Vzc19nYXRld2F5LnYxLkZsb2F0", + "QXJyYXlIABI5Cg1kb3VibGVfdmFsdWVzGA4gASgLMiAubXhhY2Nlc3NfZ2F0", + "ZXdheS52MS5Eb3VibGVBcnJheUgAEjkKDXN0cmluZ192YWx1ZXMYDyABKAsy", + "IC5teGFjY2Vzc19nYXRld2F5LnYxLlN0cmluZ0FycmF5SAASPwoQdGltZXN0", + "YW1wX3ZhbHVlcxgQIAEoCzIjLm14YWNjZXNzX2dhdGV3YXkudjEuVGltZXN0", + "YW1wQXJyYXlIABIzCgpyYXdfdmFsdWVzGBEgASgLMh0ubXhhY2Nlc3NfZ2F0", + "ZXdheS52MS5SYXdBcnJheUgAQggKBnZhbHVlcyIbCglCb29sQXJyYXkSDgoG", + "dmFsdWVzGAEgAygIIhwKCkludDMyQXJyYXkSDgoGdmFsdWVzGAEgAygFIhwK", + "CkludDY0QXJyYXkSDgoGdmFsdWVzGAEgAygDIhwKCkZsb2F0QXJyYXkSDgoG", + "dmFsdWVzGAEgAygCIh0KC0RvdWJsZUFycmF5Eg4KBnZhbHVlcxgBIAMoASId", + "CgtTdHJpbmdBcnJheRIOCgZ2YWx1ZXMYASADKAkiPAoOVGltZXN0YW1wQXJy", + "YXkSKgoGdmFsdWVzGAEgAygLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFt", + "cCIaCghSYXdBcnJheRIOCgZ2YWx1ZXMYASADKAwiWAoOUHJvdG9jb2xTdGF0", + "dXMSNQoEY29kZRgBIAEoDjInLm14YWNjZXNzX2dhdGV3YXkudjEuUHJvdG9j", + "b2xTdGF0dXNDb2RlEg8KB21lc3NhZ2UYAiABKAkqoQgKDU14Q29tbWFuZEtp", + "bmQSHwobTVhfQ09NTUFORF9LSU5EX1VOU1BFQ0lGSUVEEAASHAoYTVhfQ09N", + "TUFORF9LSU5EX1JFR0lTVEVSEAESHgoaTVhfQ09NTUFORF9LSU5EX1VOUkVH", + "SVNURVIQAhIcChhNWF9DT01NQU5EX0tJTkRfQUREX0lURU0QAxIdChlNWF9D", + "T01NQU5EX0tJTkRfQUREX0lURU0yEAQSHwobTVhfQ09NTUFORF9LSU5EX1JF", + "TU9WRV9JVEVNEAUSGgoWTVhfQ09NTUFORF9LSU5EX0FEVklTRRAGEh0KGU1Y", + "X0NPTU1BTkRfS0lORF9VTl9BRFZJU0UQBxImCiJNWF9DT01NQU5EX0tJTkRf", + "QURWSVNFX1NVUEVSVklTT1JZEAgSJQohTVhfQ09NTUFORF9LSU5EX0FERF9C", + "VUZGRVJFRF9JVEVNEAkSMAosTVhfQ09NTUFORF9LSU5EX1NFVF9CVUZGRVJF", + "RF9VUERBVEVfSU5URVJWQUwQChIbChdNWF9DT01NQU5EX0tJTkRfU1VTUEVO", + "RBALEhwKGE1YX0NPTU1BTkRfS0lORF9BQ1RJVkFURRAMEhkKFU1YX0NPTU1B", + "TkRfS0lORF9XUklURRANEhoKFk1YX0NPTU1BTkRfS0lORF9XUklURTIQDhIh", + "Ch1NWF9DT01NQU5EX0tJTkRfV1JJVEVfU0VDVVJFRBAPEiIKHk1YX0NPTU1B", + "TkRfS0lORF9XUklURV9TRUNVUkVEMhAQEiUKIU1YX0NPTU1BTkRfS0lORF9B", + "VVRIRU5USUNBVEVfVVNFUhAREigKJE1YX0NPTU1BTkRfS0lORF9BUkNIRVNU", + "UkFfVVNFUl9UT19JRBASEiEKHU1YX0NPTU1BTkRfS0lORF9BRERfSVRFTV9C", + "VUxLEBMSJAogTVhfQ09NTUFORF9LSU5EX0FEVklTRV9JVEVNX0JVTEsQFBIk", + "CiBNWF9DT01NQU5EX0tJTkRfUkVNT1ZFX0lURU1fQlVMSxAVEicKI01YX0NP", + "TU1BTkRfS0lORF9VTl9BRFZJU0VfSVRFTV9CVUxLEBYSIgoeTVhfQ09NTUFO", + "RF9LSU5EX1NVQlNDUklCRV9CVUxLEBcSJAogTVhfQ09NTUFORF9LSU5EX1VO", + "U1VCU0NSSUJFX0JVTEsQGBIYChRNWF9DT01NQU5EX0tJTkRfUElORxBkEiUK", + "IU1YX0NPTU1BTkRfS0lORF9HRVRfU0VTU0lPTl9TVEFURRBlEiMKH01YX0NP", + "TU1BTkRfS0lORF9HRVRfV09SS0VSX0lORk8QZhIgChxNWF9DT01NQU5EX0tJ", + "TkRfRFJBSU5fRVZFTlRTEGcSIwofTVhfQ09NTUFORF9LSU5EX1NIVVRET1dO", + "X1dPUktFUhBoKvkBCg1NeEV2ZW50RmFtaWx5Eh8KG01YX0VWRU5UX0ZBTUlM", + "WV9VTlNQRUNJRklFRBAAEiIKHk1YX0VWRU5UX0ZBTUlMWV9PTl9EQVRBX0NI", + "QU5HRRABEiUKIU1YX0VWRU5UX0ZBTUlMWV9PTl9XUklURV9DT01QTEVURRAC", + "EiYKIk1YX0VWRU5UX0ZBTUlMWV9PUEVSQVRJT05fQ09NUExFVEUQAxIrCidN", + "WF9FVkVOVF9GQU1JTFlfT05fQlVGRkVSRURfREFUQV9DSEFOR0UQBBInCiNN", + "WF9FVkVOVF9GQU1JTFlfT05fQUxBUk1fVFJBTlNJVElPThAFKsoBChNBbGFy", + "bVRyYW5zaXRpb25LaW5kEiUKIUFMQVJNX1RSQU5TSVRJT05fS0lORF9VTlNQ", + "RUNJRklFRBAAEh8KG0FMQVJNX1RSQU5TSVRJT05fS0lORF9SQUlTRRABEiUK", + "IUFMQVJNX1RSQU5TSVRJT05fS0lORF9BQ0tOT1dMRURHRRACEh8KG0FMQVJN", + "X1RSQU5TSVRJT05fS0lORF9DTEVBUhADEiMKH0FMQVJNX1RSQU5TSVRJT05f", + "S0lORF9SRVRSSUdHRVIQBCqqAQoTQWxhcm1Db25kaXRpb25TdGF0ZRIlCiFB", + "TEFSTV9DT05ESVRJT05fU1RBVEVfVU5TUEVDSUZJRUQQABIgChxBTEFSTV9D", + "T05ESVRJT05fU1RBVEVfQUNUSVZFEAESJgoiQUxBUk1fQ09ORElUSU9OX1NU", + "QVRFX0FDVElWRV9BQ0tFRBACEiIKHkFMQVJNX0NPTkRJVElPTl9TVEFURV9J", + "TkFDVElWRRADKqUDChBNeFN0YXR1c0NhdGVnb3J5EiIKHk1YX1NUQVRVU19D", + "QVRFR09SWV9VTlNQRUNJRklFRBAAEh4KGk1YX1NUQVRVU19DQVRFR09SWV9V", + "TktOT1dOEAESGQoVTVhfU1RBVFVTX0NBVEVHT1JZX09LEAISHgoaTVhfU1RB", + "VFVTX0NBVEVHT1JZX1BFTkRJTkcQAxIeChpNWF9TVEFUVVNfQ0FURUdPUllf", + "V0FSTklORxAEEioKJk1YX1NUQVRVU19DQVRFR09SWV9DT01NVU5JQ0FUSU9O", + "X0VSUk9SEAUSKgomTVhfU1RBVFVTX0NBVEVHT1JZX0NPTkZJR1VSQVRJT05f", + "RVJST1IQBhIoCiRNWF9TVEFUVVNfQ0FURUdPUllfT1BFUkFUSU9OQUxfRVJS", + "T1IQBxIlCiFNWF9TVEFUVVNfQ0FURUdPUllfU0VDVVJJVFlfRVJST1IQCBIl", + "CiFNWF9TVEFUVVNfQ0FURUdPUllfU09GVFdBUkVfRVJST1IQCRIiCh5NWF9T", + "VEFUVVNfQ0FURUdPUllfT1RIRVJfRVJST1IQCirKAgoOTXhTdGF0dXNTb3Vy", + "Y2USIAocTVhfU1RBVFVTX1NPVVJDRV9VTlNQRUNJRklFRBAAEhwKGE1YX1NU", + "QVRVU19TT1VSQ0VfVU5LTk9XThABEiMKH01YX1NUQVRVU19TT1VSQ0VfUkVR", + "VUVTVElOR19MTVgQAhIjCh9NWF9TVEFUVVNfU09VUkNFX1JFU1BPTkRJTkdf", + "TE1YEAMSIwofTVhfU1RBVFVTX1NPVVJDRV9SRVFVRVNUSU5HX05NWBAEEiMK", + "H01YX1NUQVRVU19TT1VSQ0VfUkVTUE9ORElOR19OTVgQBRIxCi1NWF9TVEFU", + "VVNfU09VUkNFX1JFUVVFU1RJTkdfQVVUT01BVElPTl9PQkpFQ1QQBhIxCi1N", + "WF9TVEFUVVNfU09VUkNFX1JFU1BPTkRJTkdfQVVUT01BVElPTl9PQkpFQ1QQ", + "ByrdBAoKTXhEYXRhVHlwZRIcChhNWF9EQVRBX1RZUEVfVU5TUEVDSUZJRUQQ", + "ABIYChRNWF9EQVRBX1RZUEVfVU5LTk9XThABEhgKFE1YX0RBVEFfVFlQRV9O", + "T19EQVRBEAISGAoUTVhfREFUQV9UWVBFX0JPT0xFQU4QAxIYChRNWF9EQVRB", + "X1RZUEVfSU5URUdFUhAEEhYKEk1YX0RBVEFfVFlQRV9GTE9BVBAFEhcKE01Y", + "X0RBVEFfVFlQRV9ET1VCTEUQBhIXChNNWF9EQVRBX1RZUEVfU1RSSU5HEAcS", + "FQoRTVhfREFUQV9UWVBFX1RJTUUQCBIdChlNWF9EQVRBX1RZUEVfRUxBUFNF", + "RF9USU1FEAkSHwobTVhfREFUQV9UWVBFX1JFRkVSRU5DRV9UWVBFEAoSHAoY", + "TVhfREFUQV9UWVBFX1NUQVRVU19UWVBFEAsSFQoRTVhfREFUQV9UWVBFX0VO", + "VU0QDBItCilNWF9EQVRBX1RZUEVfU0VDVVJJVFlfQ0xBU1NJRklDQVRJT05f", + "RU5VTRANEiIKHk1YX0RBVEFfVFlQRV9EQVRBX1FVQUxJVFlfVFlQRRAOEh8K", + "G01YX0RBVEFfVFlQRV9RVUFMSUZJRURfRU5VTRAPEiEKHU1YX0RBVEFfVFlQ", + "RV9RVUFMSUZJRURfU1RSVUNUEBASKQolTVhfREFUQV9UWVBFX0lOVEVSTkFU", + "SU9OQUxJWkVEX1NUUklORxAREhsKF01YX0RBVEFfVFlQRV9CSUdfU1RSSU5H", + "EBISFAoQTVhfREFUQV9UWVBFX0VORBATKqMDChJQcm90b2NvbFN0YXR1c0Nv", + "ZGUSJAogUFJPVE9DT0xfU1RBVFVTX0NPREVfVU5TUEVDSUZJRUQQABIbChdQ", + "Uk9UT0NPTF9TVEFUVVNfQ09ERV9PSxABEigKJFBST1RPQ09MX1NUQVRVU19D", + "T0RFX0lOVkFMSURfUkVRVUVTVBACEioKJlBST1RPQ09MX1NUQVRVU19DT0RF", + "X1NFU1NJT05fTk9UX0ZPVU5EEAMSKgomUFJPVE9DT0xfU1RBVFVTX0NPREVf", + "U0VTU0lPTl9OT1RfUkVBRFkQBBIrCidQUk9UT0NPTF9TVEFUVVNfQ09ERV9X", + "T1JLRVJfVU5BVkFJTEFCTEUQBRIgChxQUk9UT0NPTF9TVEFUVVNfQ09ERV9U", + "SU1FT1VUEAYSIQodUFJPVE9DT0xfU1RBVFVTX0NPREVfQ0FOQ0VMRUQQBxIr", + "CidQUk9UT0NPTF9TVEFUVVNfQ09ERV9QUk9UT0NPTF9WSU9MQVRJT04QCBIp", + "CiVQUk9UT0NPTF9TVEFUVVNfQ09ERV9NWEFDQ0VTU19GQUlMVVJFEAkqvwIK", + "DFNlc3Npb25TdGF0ZRIdChlTRVNTSU9OX1NUQVRFX1VOU1BFQ0lGSUVEEAAS", + "GgoWU0VTU0lPTl9TVEFURV9DUkVBVElORxABEiEKHVNFU1NJT05fU1RBVEVf", + "U1RBUlRJTkdfV09SS0VSEAISIgoeU0VTU0lPTl9TVEFURV9XQUlUSU5HX0ZP", + "Ul9QSVBFEAMSHQoZU0VTU0lPTl9TVEFURV9IQU5EU0hBS0lORxAEEiUKIVNF", + "U1NJT05fU1RBVEVfSU5JVElBTElaSU5HX1dPUktFUhAFEhcKE1NFU1NJT05f", + "U1RBVEVfUkVBRFkQBhIZChVTRVNTSU9OX1NUQVRFX0NMT1NJTkcQBxIYChRT", + "RVNTSU9OX1NUQVRFX0NMT1NFRBAIEhkKFVNFU1NJT05fU1RBVEVfRkFVTFRF", + "RBAJMuAECg9NeEFjY2Vzc0dhdGV3YXkSXQoLT3BlblNlc3Npb24SJy5teGFj", + "Y2Vzc19nYXRld2F5LnYxLk9wZW5TZXNzaW9uUmVxdWVzdBolLm14YWNjZXNz", + "X2dhdGV3YXkudjEuT3BlblNlc3Npb25SZXBseRJgCgxDbG9zZVNlc3Npb24S", + "KC5teGFjY2Vzc19nYXRld2F5LnYxLkNsb3NlU2Vzc2lvblJlcXVlc3QaJi5t", + "eGFjY2Vzc19nYXRld2F5LnYxLkNsb3NlU2Vzc2lvblJlcGx5ElQKBkludm9r", + "ZRIlLm14YWNjZXNzX2dhdGV3YXkudjEuTXhDb21tYW5kUmVxdWVzdBojLm14", + "YWNjZXNzX2dhdGV3YXkudjEuTXhDb21tYW5kUmVwbHkSWAoMU3RyZWFtRXZl", + "bnRzEigubXhhY2Nlc3NfZ2F0ZXdheS52MS5TdHJlYW1FdmVudHNSZXF1ZXN0", + "GhwubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeEV2ZW50MAESbAoQQWNrbm93bGVk", + "Z2VBbGFybRIsLm14YWNjZXNzX2dhdGV3YXkudjEuQWNrbm93bGVkZ2VBbGFy", + "bVJlcXVlc3QaKi5teGFjY2Vzc19nYXRld2F5LnYxLkFja25vd2xlZGdlQWxh", + "cm1SZXBseRJuChFRdWVyeUFjdGl2ZUFsYXJtcxItLm14YWNjZXNzX2dhdGV3", + "YXkudjEuUXVlcnlBY3RpdmVBbGFybXNSZXF1ZXN0GigubXhhY2Nlc3NfZ2F0", + "ZXdheS52MS5BY3RpdmVBbGFybVNuYXBzaG90MAFCHKoCGU14R2F0ZXdheS5D", + "b250cmFjdHMuUHJvdG9iBnByb3RvMw==")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { global::Google.Protobuf.WellKnownTypes.DurationReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.TimestampReflection.Descriptor, }, - new pbr::GeneratedClrTypeInfo(new[] {typeof(global::MxGateway.Contracts.Proto.MxCommandKind), typeof(global::MxGateway.Contracts.Proto.MxEventFamily), typeof(global::MxGateway.Contracts.Proto.MxStatusCategory), typeof(global::MxGateway.Contracts.Proto.MxStatusSource), typeof(global::MxGateway.Contracts.Proto.MxDataType), typeof(global::MxGateway.Contracts.Proto.ProtocolStatusCode), typeof(global::MxGateway.Contracts.Proto.SessionState), }, null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(new[] {typeof(global::MxGateway.Contracts.Proto.MxCommandKind), typeof(global::MxGateway.Contracts.Proto.MxEventFamily), typeof(global::MxGateway.Contracts.Proto.AlarmTransitionKind), typeof(global::MxGateway.Contracts.Proto.AlarmConditionState), typeof(global::MxGateway.Contracts.Proto.MxStatusCategory), typeof(global::MxGateway.Contracts.Proto.MxStatusSource), typeof(global::MxGateway.Contracts.Proto.MxDataType), typeof(global::MxGateway.Contracts.Proto.ProtocolStatusCode), typeof(global::MxGateway.Contracts.Proto.SessionState), }, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.OpenSessionRequest), global::MxGateway.Contracts.Proto.OpenSessionRequest.Parser, new[]{ "RequestedBackend", "ClientSessionName", "ClientCorrelationId", "CommandTimeout" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.OpenSessionReply), global::MxGateway.Contracts.Proto.OpenSessionReply.Parser, new[]{ "SessionId", "BackendName", "WorkerProcessId", "WorkerProtocolVersion", "Capabilities", "DefaultCommandTimeout", "ProtocolStatus", "GatewayProtocolVersion" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.CloseSessionRequest), global::MxGateway.Contracts.Proto.CloseSessionRequest.Parser, new[]{ "SessionId", "ClientCorrelationId" }, null, null, null, null), @@ -392,11 +442,16 @@ namespace MxGateway.Contracts.Proto { new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.SessionStateReply), global::MxGateway.Contracts.Proto.SessionStateReply.Parser, new[]{ "State" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.WorkerInfoReply), global::MxGateway.Contracts.Proto.WorkerInfoReply.Parser, new[]{ "WorkerProcessId", "WorkerVersion", "MxaccessProgid", "MxaccessClsid" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.DrainEventsReply), global::MxGateway.Contracts.Proto.DrainEventsReply.Parser, new[]{ "Events" }, null, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.MxEvent), global::MxGateway.Contracts.Proto.MxEvent.Parser, new[]{ "Family", "SessionId", "ServerHandle", "ItemHandle", "Value", "Quality", "SourceTimestamp", "Statuses", "WorkerSequence", "WorkerTimestamp", "GatewayReceiveTimestamp", "Hresult", "RawStatus", "OnDataChange", "OnWriteComplete", "OperationComplete", "OnBufferedDataChange" }, new[]{ "Body", "Hresult" }, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.MxEvent), global::MxGateway.Contracts.Proto.MxEvent.Parser, new[]{ "Family", "SessionId", "ServerHandle", "ItemHandle", "Value", "Quality", "SourceTimestamp", "Statuses", "WorkerSequence", "WorkerTimestamp", "GatewayReceiveTimestamp", "Hresult", "RawStatus", "OnDataChange", "OnWriteComplete", "OperationComplete", "OnBufferedDataChange", "OnAlarmTransition" }, new[]{ "Body", "Hresult" }, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.OnDataChangeEvent), global::MxGateway.Contracts.Proto.OnDataChangeEvent.Parser, null, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.OnWriteCompleteEvent), global::MxGateway.Contracts.Proto.OnWriteCompleteEvent.Parser, null, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.OperationCompleteEvent), global::MxGateway.Contracts.Proto.OperationCompleteEvent.Parser, null, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.OnBufferedDataChangeEvent), global::MxGateway.Contracts.Proto.OnBufferedDataChangeEvent.Parser, new[]{ "DataType", "QualityValues", "TimestampValues", "RawDataType" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.OnAlarmTransitionEvent), global::MxGateway.Contracts.Proto.OnAlarmTransitionEvent.Parser, new[]{ "AlarmFullReference", "SourceObjectReference", "AlarmTypeName", "TransitionKind", "Severity", "OriginalRaiseTimestamp", "TransitionTimestamp", "OperatorUser", "OperatorComment", "Category", "Description", "CurrentValue", "LimitValue" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.ActiveAlarmSnapshot), global::MxGateway.Contracts.Proto.ActiveAlarmSnapshot.Parser, new[]{ "AlarmFullReference", "SourceObjectReference", "AlarmTypeName", "Severity", "OriginalRaiseTimestamp", "CurrentState", "Category", "Description", "LastTransitionTimestamp", "OperatorUser", "OperatorComment", "CurrentValue", "LimitValue" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.AcknowledgeAlarmRequest), global::MxGateway.Contracts.Proto.AcknowledgeAlarmRequest.Parser, new[]{ "SessionId", "ClientCorrelationId", "AlarmFullReference", "Comment", "OperatorUser" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.AcknowledgeAlarmReply), global::MxGateway.Contracts.Proto.AcknowledgeAlarmReply.Parser, new[]{ "SessionId", "CorrelationId", "ProtocolStatus", "Hresult", "Status", "DiagnosticMessage" }, new[]{ "Hresult" }, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.QueryActiveAlarmsRequest), global::MxGateway.Contracts.Proto.QueryActiveAlarmsRequest.Parser, new[]{ "SessionId", "ClientCorrelationId", "AlarmFilterPrefix" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.MxStatusProxy), global::MxGateway.Contracts.Proto.MxStatusProxy.Parser, new[]{ "Success", "Category", "DetectedBy", "Detail", "RawCategory", "RawDetectedBy", "DiagnosticText" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.MxValue), global::MxGateway.Contracts.Proto.MxValue.Parser, new[]{ "DataType", "VariantType", "IsNull", "RawDiagnostic", "RawDataType", "BoolValue", "Int32Value", "Int64Value", "FloatValue", "DoubleValue", "StringValue", "TimestampValue", "ArrayValue", "RawValue" }, new[]{ "Kind" }, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.MxArray), global::MxGateway.Contracts.Proto.MxArray.Parser, new[]{ "ElementDataType", "VariantType", "Dimensions", "RawDiagnostic", "RawElementDataType", "BoolValues", "Int32Values", "Int64Values", "FloatValues", "DoubleValues", "StringValues", "TimestampValues", "RawValues" }, new[]{ "Values" }, null, null, null), @@ -454,6 +509,22 @@ namespace MxGateway.Contracts.Proto { [pbr::OriginalName("MX_EVENT_FAMILY_ON_WRITE_COMPLETE")] OnWriteComplete = 2, [pbr::OriginalName("MX_EVENT_FAMILY_OPERATION_COMPLETE")] OperationComplete = 3, [pbr::OriginalName("MX_EVENT_FAMILY_ON_BUFFERED_DATA_CHANGE")] OnBufferedDataChange = 4, + [pbr::OriginalName("MX_EVENT_FAMILY_ON_ALARM_TRANSITION")] OnAlarmTransition = 5, + } + + public enum AlarmTransitionKind { + [pbr::OriginalName("ALARM_TRANSITION_KIND_UNSPECIFIED")] Unspecified = 0, + [pbr::OriginalName("ALARM_TRANSITION_KIND_RAISE")] Raise = 1, + [pbr::OriginalName("ALARM_TRANSITION_KIND_ACKNOWLEDGE")] Acknowledge = 2, + [pbr::OriginalName("ALARM_TRANSITION_KIND_CLEAR")] Clear = 3, + [pbr::OriginalName("ALARM_TRANSITION_KIND_RETRIGGER")] Retrigger = 4, + } + + public enum AlarmConditionState { + [pbr::OriginalName("ALARM_CONDITION_STATE_UNSPECIFIED")] Unspecified = 0, + [pbr::OriginalName("ALARM_CONDITION_STATE_ACTIVE")] Active = 1, + [pbr::OriginalName("ALARM_CONDITION_STATE_ACTIVE_ACKED")] ActiveAcked = 2, + [pbr::OriginalName("ALARM_CONDITION_STATE_INACTIVE")] Inactive = 3, } public enum MxStatusCategory { @@ -15474,6 +15545,9 @@ namespace MxGateway.Contracts.Proto { case BodyOneofCase.OnBufferedDataChange: OnBufferedDataChange = other.OnBufferedDataChange.Clone(); break; + case BodyOneofCase.OnAlarmTransition: + OnAlarmTransition = other.OnAlarmTransition.Clone(); + break; } _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); @@ -15703,6 +15777,18 @@ namespace MxGateway.Contracts.Proto { } } + /// Field number for the "on_alarm_transition" field. + public const int OnAlarmTransitionFieldNumber = 24; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::MxGateway.Contracts.Proto.OnAlarmTransitionEvent OnAlarmTransition { + get { return bodyCase_ == BodyOneofCase.OnAlarmTransition ? (global::MxGateway.Contracts.Proto.OnAlarmTransitionEvent) body_ : null; } + set { + body_ = value; + bodyCase_ = value == null ? BodyOneofCase.None : BodyOneofCase.OnAlarmTransition; + } + } + private object body_; /// Enum of possible cases for the "body" oneof. public enum BodyOneofCase { @@ -15711,6 +15797,7 @@ namespace MxGateway.Contracts.Proto { OnWriteComplete = 21, OperationComplete = 22, OnBufferedDataChange = 23, + OnAlarmTransition = 24, } private BodyOneofCase bodyCase_ = BodyOneofCase.None; [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -15758,6 +15845,7 @@ namespace MxGateway.Contracts.Proto { if (!object.Equals(OnWriteComplete, other.OnWriteComplete)) return false; if (!object.Equals(OperationComplete, other.OperationComplete)) return false; if (!object.Equals(OnBufferedDataChange, other.OnBufferedDataChange)) return false; + if (!object.Equals(OnAlarmTransition, other.OnAlarmTransition)) return false; if (BodyCase != other.BodyCase) return false; return Equals(_unknownFields, other._unknownFields); } @@ -15783,6 +15871,7 @@ namespace MxGateway.Contracts.Proto { if (bodyCase_ == BodyOneofCase.OnWriteComplete) hash ^= OnWriteComplete.GetHashCode(); if (bodyCase_ == BodyOneofCase.OperationComplete) hash ^= OperationComplete.GetHashCode(); if (bodyCase_ == BodyOneofCase.OnBufferedDataChange) hash ^= OnBufferedDataChange.GetHashCode(); + if (bodyCase_ == BodyOneofCase.OnAlarmTransition) hash ^= OnAlarmTransition.GetHashCode(); hash ^= (int) bodyCase_; if (_unknownFields != null) { hash ^= _unknownFields.GetHashCode(); @@ -15867,6 +15956,10 @@ namespace MxGateway.Contracts.Proto { output.WriteRawTag(186, 1); output.WriteMessage(OnBufferedDataChange); } + if (bodyCase_ == BodyOneofCase.OnAlarmTransition) { + output.WriteRawTag(194, 1); + output.WriteMessage(OnAlarmTransition); + } if (_unknownFields != null) { _unknownFields.WriteTo(output); } @@ -15942,6 +16035,10 @@ namespace MxGateway.Contracts.Proto { output.WriteRawTag(186, 1); output.WriteMessage(OnBufferedDataChange); } + if (bodyCase_ == BodyOneofCase.OnAlarmTransition) { + output.WriteRawTag(194, 1); + output.WriteMessage(OnAlarmTransition); + } if (_unknownFields != null) { _unknownFields.WriteTo(ref output); } @@ -16001,6 +16098,9 @@ namespace MxGateway.Contracts.Proto { if (bodyCase_ == BodyOneofCase.OnBufferedDataChange) { size += 2 + pb::CodedOutputStream.ComputeMessageSize(OnBufferedDataChange); } + if (bodyCase_ == BodyOneofCase.OnAlarmTransition) { + size += 2 + pb::CodedOutputStream.ComputeMessageSize(OnAlarmTransition); + } if (_unknownFields != null) { size += _unknownFields.CalculateSize(); } @@ -16087,6 +16187,12 @@ namespace MxGateway.Contracts.Proto { } OnBufferedDataChange.MergeFrom(other.OnBufferedDataChange); break; + case BodyOneofCase.OnAlarmTransition: + if (OnAlarmTransition == null) { + OnAlarmTransition = new global::MxGateway.Contracts.Proto.OnAlarmTransitionEvent(); + } + OnAlarmTransition.MergeFrom(other.OnAlarmTransition); + break; } _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); @@ -16208,6 +16314,15 @@ namespace MxGateway.Contracts.Proto { OnBufferedDataChange = subBuilder; break; } + case 194: { + global::MxGateway.Contracts.Proto.OnAlarmTransitionEvent subBuilder = new global::MxGateway.Contracts.Proto.OnAlarmTransitionEvent(); + if (bodyCase_ == BodyOneofCase.OnAlarmTransition) { + subBuilder.MergeFrom(OnAlarmTransition); + } + input.ReadMessage(subBuilder); + OnAlarmTransition = subBuilder; + break; + } } } #endif @@ -16327,6 +16442,15 @@ namespace MxGateway.Contracts.Proto { OnBufferedDataChange = subBuilder; break; } + case 194: { + global::MxGateway.Contracts.Proto.OnAlarmTransitionEvent subBuilder = new global::MxGateway.Contracts.Proto.OnAlarmTransitionEvent(); + if (bodyCase_ == BodyOneofCase.OnAlarmTransition) { + subBuilder.MergeFrom(OnAlarmTransition); + } + input.ReadMessage(subBuilder); + OnAlarmTransition = subBuilder; + break; + } } } } @@ -17144,6 +17268,2492 @@ namespace MxGateway.Contracts.Proto { } + /// + /// Carries a single MXAccess alarm transition (raise / acknowledge / clear / + /// re-trigger) in native MXAccess terms. The Part 9 state machine + ACL + + /// multi-source aggregation lives in lmxopcua's AlarmConditionService; the + /// gateway is UA-agnostic and forwards the raw payload. + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class OnAlarmTransitionEvent : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new OnAlarmTransitionEvent()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor { + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[55]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public OnAlarmTransitionEvent() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public OnAlarmTransitionEvent(OnAlarmTransitionEvent other) : this() { + alarmFullReference_ = other.alarmFullReference_; + sourceObjectReference_ = other.sourceObjectReference_; + alarmTypeName_ = other.alarmTypeName_; + transitionKind_ = other.transitionKind_; + severity_ = other.severity_; + originalRaiseTimestamp_ = other.originalRaiseTimestamp_ != null ? other.originalRaiseTimestamp_.Clone() : null; + transitionTimestamp_ = other.transitionTimestamp_ != null ? other.transitionTimestamp_.Clone() : null; + operatorUser_ = other.operatorUser_; + operatorComment_ = other.operatorComment_; + category_ = other.category_; + description_ = other.description_; + currentValue_ = other.currentValue_ != null ? other.currentValue_.Clone() : null; + limitValue_ = other.limitValue_ != null ? other.limitValue_.Clone() : null; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public OnAlarmTransitionEvent Clone() { + return new OnAlarmTransitionEvent(this); + } + + /// Field number for the "alarm_full_reference" field. + public const int AlarmFullReferenceFieldNumber = 1; + private string alarmFullReference_ = ""; + /// + /// Fully-qualified alarm reference (e.g. "Tank01.Level.HiHi"). Stable across + /// transitions of the same condition; used by the lmxopcua side to correlate + /// raise/ack/clear into a single Part 9 condition. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string AlarmFullReference { + get { return alarmFullReference_; } + set { + alarmFullReference_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "source_object_reference" field. + public const int SourceObjectReferenceFieldNumber = 2; + private string sourceObjectReference_ = ""; + /// + /// Galaxy-side source object reference (e.g. "Tank01"). Empty for alarms + /// that do not bind to a Galaxy object. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string SourceObjectReference { + get { return sourceObjectReference_; } + set { + sourceObjectReference_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "alarm_type_name" field. + public const int AlarmTypeNameFieldNumber = 3; + private string alarmTypeName_ = ""; + /// + /// MxAccess alarm-type qualifier (e.g. "AnalogLimitAlarm.HiHi", "DiscAlarm"). + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string AlarmTypeName { + get { return alarmTypeName_; } + set { + alarmTypeName_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "transition_kind" field. + public const int TransitionKindFieldNumber = 4; + private global::MxGateway.Contracts.Proto.AlarmTransitionKind transitionKind_ = global::MxGateway.Contracts.Proto.AlarmTransitionKind.Unspecified; + /// + /// What kind of state change this event represents. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::MxGateway.Contracts.Proto.AlarmTransitionKind TransitionKind { + get { return transitionKind_; } + set { + transitionKind_ = value; + } + } + + /// Field number for the "severity" field. + public const int SeverityFieldNumber = 5; + private int severity_; + /// + /// Raw MXAccess severity value. Mapping to OPC UA 0-1000 happens server-side + /// in lmxopcua via MxAccessSeverityMapper; the gateway preserves the native + /// MXAccess scale. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int Severity { + get { return severity_; } + set { + severity_ = value; + } + } + + /// Field number for the "original_raise_timestamp" field. + public const int OriginalRaiseTimestampFieldNumber = 6; + private global::Google.Protobuf.WellKnownTypes.Timestamp originalRaiseTimestamp_; + /// + /// When the alarm originally entered the active state. Preserved across + /// acknowledge transitions so the Part 9 condition keeps the original raise + /// time. Unset on retrigger from a previously-cleared condition. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Google.Protobuf.WellKnownTypes.Timestamp OriginalRaiseTimestamp { + get { return originalRaiseTimestamp_; } + set { + originalRaiseTimestamp_ = value; + } + } + + /// Field number for the "transition_timestamp" field. + public const int TransitionTimestampFieldNumber = 7; + private global::Google.Protobuf.WellKnownTypes.Timestamp transitionTimestamp_; + /// + /// When this specific transition occurred (raise time on Raise, ack time on + /// Acknowledge, clear time on Clear). + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Google.Protobuf.WellKnownTypes.Timestamp TransitionTimestamp { + get { return transitionTimestamp_; } + set { + transitionTimestamp_ = value; + } + } + + /// Field number for the "operator_user" field. + public const int OperatorUserFieldNumber = 8; + private string operatorUser_ = ""; + /// + /// Operator principal recorded by MXAccess on Acknowledge transitions. + /// Empty on raise / clear. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string OperatorUser { + get { return operatorUser_; } + set { + operatorUser_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "operator_comment" field. + public const int OperatorCommentFieldNumber = 9; + private string operatorComment_ = ""; + /// + /// Operator-supplied comment recorded by MXAccess on Acknowledge transitions. + /// Empty on raise / clear or when no comment was supplied. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string OperatorComment { + get { return operatorComment_; } + set { + operatorComment_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "category" field. + public const int CategoryFieldNumber = 10; + private string category_ = ""; + /// + /// MxAccess alarm category (taxonomy bucket configured in the Galaxy + /// template, e.g. "Process", "Safety", "Diagnostics"). + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Category { + get { return category_; } + set { + category_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "description" field. + public const int DescriptionFieldNumber = 11; + private string description_ = ""; + /// + /// Human-readable alarm description from the MxAccess alarm definition. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Description { + get { return description_; } + set { + description_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "current_value" field. + public const int CurrentValueFieldNumber = 12; + private global::MxGateway.Contracts.Proto.MxValue currentValue_; + /// + /// Current alarm value (the value of the source attribute at the moment of + /// transition). Optional; populated when MxAccess surfaces it. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::MxGateway.Contracts.Proto.MxValue CurrentValue { + get { return currentValue_; } + set { + currentValue_ = value; + } + } + + /// Field number for the "limit_value" field. + public const int LimitValueFieldNumber = 13; + private global::MxGateway.Contracts.Proto.MxValue limitValue_; + /// + /// Limit/threshold value that triggered the transition for limit alarms. + /// Optional; populated for AnalogLimitAlarm-family transitions. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::MxGateway.Contracts.Proto.MxValue LimitValue { + get { return limitValue_; } + set { + limitValue_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) { + return Equals(other as OnAlarmTransitionEvent); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(OnAlarmTransitionEvent other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (AlarmFullReference != other.AlarmFullReference) return false; + if (SourceObjectReference != other.SourceObjectReference) return false; + if (AlarmTypeName != other.AlarmTypeName) return false; + if (TransitionKind != other.TransitionKind) return false; + if (Severity != other.Severity) return false; + if (!object.Equals(OriginalRaiseTimestamp, other.OriginalRaiseTimestamp)) return false; + if (!object.Equals(TransitionTimestamp, other.TransitionTimestamp)) return false; + if (OperatorUser != other.OperatorUser) return false; + if (OperatorComment != other.OperatorComment) return false; + if (Category != other.Category) return false; + if (Description != other.Description) return false; + if (!object.Equals(CurrentValue, other.CurrentValue)) return false; + if (!object.Equals(LimitValue, other.LimitValue)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() { + int hash = 1; + if (AlarmFullReference.Length != 0) hash ^= AlarmFullReference.GetHashCode(); + if (SourceObjectReference.Length != 0) hash ^= SourceObjectReference.GetHashCode(); + if (AlarmTypeName.Length != 0) hash ^= AlarmTypeName.GetHashCode(); + if (TransitionKind != global::MxGateway.Contracts.Proto.AlarmTransitionKind.Unspecified) hash ^= TransitionKind.GetHashCode(); + if (Severity != 0) hash ^= Severity.GetHashCode(); + if (originalRaiseTimestamp_ != null) hash ^= OriginalRaiseTimestamp.GetHashCode(); + if (transitionTimestamp_ != null) hash ^= TransitionTimestamp.GetHashCode(); + if (OperatorUser.Length != 0) hash ^= OperatorUser.GetHashCode(); + if (OperatorComment.Length != 0) hash ^= OperatorComment.GetHashCode(); + if (Category.Length != 0) hash ^= Category.GetHashCode(); + if (Description.Length != 0) hash ^= Description.GetHashCode(); + if (currentValue_ != null) hash ^= CurrentValue.GetHashCode(); + if (limitValue_ != null) hash ^= LimitValue.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (AlarmFullReference.Length != 0) { + output.WriteRawTag(10); + output.WriteString(AlarmFullReference); + } + if (SourceObjectReference.Length != 0) { + output.WriteRawTag(18); + output.WriteString(SourceObjectReference); + } + if (AlarmTypeName.Length != 0) { + output.WriteRawTag(26); + output.WriteString(AlarmTypeName); + } + if (TransitionKind != global::MxGateway.Contracts.Proto.AlarmTransitionKind.Unspecified) { + output.WriteRawTag(32); + output.WriteEnum((int) TransitionKind); + } + if (Severity != 0) { + output.WriteRawTag(40); + output.WriteInt32(Severity); + } + if (originalRaiseTimestamp_ != null) { + output.WriteRawTag(50); + output.WriteMessage(OriginalRaiseTimestamp); + } + if (transitionTimestamp_ != null) { + output.WriteRawTag(58); + output.WriteMessage(TransitionTimestamp); + } + if (OperatorUser.Length != 0) { + output.WriteRawTag(66); + output.WriteString(OperatorUser); + } + if (OperatorComment.Length != 0) { + output.WriteRawTag(74); + output.WriteString(OperatorComment); + } + if (Category.Length != 0) { + output.WriteRawTag(82); + output.WriteString(Category); + } + if (Description.Length != 0) { + output.WriteRawTag(90); + output.WriteString(Description); + } + if (currentValue_ != null) { + output.WriteRawTag(98); + output.WriteMessage(CurrentValue); + } + if (limitValue_ != null) { + output.WriteRawTag(106); + output.WriteMessage(LimitValue); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (AlarmFullReference.Length != 0) { + output.WriteRawTag(10); + output.WriteString(AlarmFullReference); + } + if (SourceObjectReference.Length != 0) { + output.WriteRawTag(18); + output.WriteString(SourceObjectReference); + } + if (AlarmTypeName.Length != 0) { + output.WriteRawTag(26); + output.WriteString(AlarmTypeName); + } + if (TransitionKind != global::MxGateway.Contracts.Proto.AlarmTransitionKind.Unspecified) { + output.WriteRawTag(32); + output.WriteEnum((int) TransitionKind); + } + if (Severity != 0) { + output.WriteRawTag(40); + output.WriteInt32(Severity); + } + if (originalRaiseTimestamp_ != null) { + output.WriteRawTag(50); + output.WriteMessage(OriginalRaiseTimestamp); + } + if (transitionTimestamp_ != null) { + output.WriteRawTag(58); + output.WriteMessage(TransitionTimestamp); + } + if (OperatorUser.Length != 0) { + output.WriteRawTag(66); + output.WriteString(OperatorUser); + } + if (OperatorComment.Length != 0) { + output.WriteRawTag(74); + output.WriteString(OperatorComment); + } + if (Category.Length != 0) { + output.WriteRawTag(82); + output.WriteString(Category); + } + if (Description.Length != 0) { + output.WriteRawTag(90); + output.WriteString(Description); + } + if (currentValue_ != null) { + output.WriteRawTag(98); + output.WriteMessage(CurrentValue); + } + if (limitValue_ != null) { + output.WriteRawTag(106); + output.WriteMessage(LimitValue); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() { + int size = 0; + if (AlarmFullReference.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(AlarmFullReference); + } + if (SourceObjectReference.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(SourceObjectReference); + } + if (AlarmTypeName.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(AlarmTypeName); + } + if (TransitionKind != global::MxGateway.Contracts.Proto.AlarmTransitionKind.Unspecified) { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) TransitionKind); + } + if (Severity != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(Severity); + } + if (originalRaiseTimestamp_ != null) { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(OriginalRaiseTimestamp); + } + if (transitionTimestamp_ != null) { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(TransitionTimestamp); + } + if (OperatorUser.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(OperatorUser); + } + if (OperatorComment.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(OperatorComment); + } + if (Category.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Category); + } + if (Description.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Description); + } + if (currentValue_ != null) { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(CurrentValue); + } + if (limitValue_ != null) { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(LimitValue); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(OnAlarmTransitionEvent other) { + if (other == null) { + return; + } + if (other.AlarmFullReference.Length != 0) { + AlarmFullReference = other.AlarmFullReference; + } + if (other.SourceObjectReference.Length != 0) { + SourceObjectReference = other.SourceObjectReference; + } + if (other.AlarmTypeName.Length != 0) { + AlarmTypeName = other.AlarmTypeName; + } + if (other.TransitionKind != global::MxGateway.Contracts.Proto.AlarmTransitionKind.Unspecified) { + TransitionKind = other.TransitionKind; + } + if (other.Severity != 0) { + Severity = other.Severity; + } + if (other.originalRaiseTimestamp_ != null) { + if (originalRaiseTimestamp_ == null) { + OriginalRaiseTimestamp = new global::Google.Protobuf.WellKnownTypes.Timestamp(); + } + OriginalRaiseTimestamp.MergeFrom(other.OriginalRaiseTimestamp); + } + if (other.transitionTimestamp_ != null) { + if (transitionTimestamp_ == null) { + TransitionTimestamp = new global::Google.Protobuf.WellKnownTypes.Timestamp(); + } + TransitionTimestamp.MergeFrom(other.TransitionTimestamp); + } + if (other.OperatorUser.Length != 0) { + OperatorUser = other.OperatorUser; + } + if (other.OperatorComment.Length != 0) { + OperatorComment = other.OperatorComment; + } + if (other.Category.Length != 0) { + Category = other.Category; + } + if (other.Description.Length != 0) { + Description = other.Description; + } + if (other.currentValue_ != null) { + if (currentValue_ == null) { + CurrentValue = new global::MxGateway.Contracts.Proto.MxValue(); + } + CurrentValue.MergeFrom(other.CurrentValue); + } + if (other.limitValue_ != null) { + if (limitValue_ == null) { + LimitValue = new global::MxGateway.Contracts.Proto.MxValue(); + } + LimitValue.MergeFrom(other.LimitValue); + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + AlarmFullReference = input.ReadString(); + break; + } + case 18: { + SourceObjectReference = input.ReadString(); + break; + } + case 26: { + AlarmTypeName = input.ReadString(); + break; + } + case 32: { + TransitionKind = (global::MxGateway.Contracts.Proto.AlarmTransitionKind) input.ReadEnum(); + break; + } + case 40: { + Severity = input.ReadInt32(); + break; + } + case 50: { + if (originalRaiseTimestamp_ == null) { + OriginalRaiseTimestamp = new global::Google.Protobuf.WellKnownTypes.Timestamp(); + } + input.ReadMessage(OriginalRaiseTimestamp); + break; + } + case 58: { + if (transitionTimestamp_ == null) { + TransitionTimestamp = new global::Google.Protobuf.WellKnownTypes.Timestamp(); + } + input.ReadMessage(TransitionTimestamp); + break; + } + case 66: { + OperatorUser = input.ReadString(); + break; + } + case 74: { + OperatorComment = input.ReadString(); + break; + } + case 82: { + Category = input.ReadString(); + break; + } + case 90: { + Description = input.ReadString(); + break; + } + case 98: { + if (currentValue_ == null) { + CurrentValue = new global::MxGateway.Contracts.Proto.MxValue(); + } + input.ReadMessage(CurrentValue); + break; + } + case 106: { + if (limitValue_ == null) { + LimitValue = new global::MxGateway.Contracts.Proto.MxValue(); + } + input.ReadMessage(LimitValue); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: { + AlarmFullReference = input.ReadString(); + break; + } + case 18: { + SourceObjectReference = input.ReadString(); + break; + } + case 26: { + AlarmTypeName = input.ReadString(); + break; + } + case 32: { + TransitionKind = (global::MxGateway.Contracts.Proto.AlarmTransitionKind) input.ReadEnum(); + break; + } + case 40: { + Severity = input.ReadInt32(); + break; + } + case 50: { + if (originalRaiseTimestamp_ == null) { + OriginalRaiseTimestamp = new global::Google.Protobuf.WellKnownTypes.Timestamp(); + } + input.ReadMessage(OriginalRaiseTimestamp); + break; + } + case 58: { + if (transitionTimestamp_ == null) { + TransitionTimestamp = new global::Google.Protobuf.WellKnownTypes.Timestamp(); + } + input.ReadMessage(TransitionTimestamp); + break; + } + case 66: { + OperatorUser = input.ReadString(); + break; + } + case 74: { + OperatorComment = input.ReadString(); + break; + } + case 82: { + Category = input.ReadString(); + break; + } + case 90: { + Description = input.ReadString(); + break; + } + case 98: { + if (currentValue_ == null) { + CurrentValue = new global::MxGateway.Contracts.Proto.MxValue(); + } + input.ReadMessage(CurrentValue); + break; + } + case 106: { + if (limitValue_ == null) { + LimitValue = new global::MxGateway.Contracts.Proto.MxValue(); + } + input.ReadMessage(LimitValue); + break; + } + } + } + } + #endif + + } + + /// + /// Snapshot of a currently-active MXAccess alarm condition, returned from a + /// QueryActiveAlarms ConditionRefresh stream. + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class ActiveAlarmSnapshot : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new ActiveAlarmSnapshot()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor { + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[56]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ActiveAlarmSnapshot() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ActiveAlarmSnapshot(ActiveAlarmSnapshot other) : this() { + alarmFullReference_ = other.alarmFullReference_; + sourceObjectReference_ = other.sourceObjectReference_; + alarmTypeName_ = other.alarmTypeName_; + severity_ = other.severity_; + originalRaiseTimestamp_ = other.originalRaiseTimestamp_ != null ? other.originalRaiseTimestamp_.Clone() : null; + currentState_ = other.currentState_; + category_ = other.category_; + description_ = other.description_; + lastTransitionTimestamp_ = other.lastTransitionTimestamp_ != null ? other.lastTransitionTimestamp_.Clone() : null; + operatorUser_ = other.operatorUser_; + operatorComment_ = other.operatorComment_; + currentValue_ = other.currentValue_ != null ? other.currentValue_.Clone() : null; + limitValue_ = other.limitValue_ != null ? other.limitValue_.Clone() : null; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ActiveAlarmSnapshot Clone() { + return new ActiveAlarmSnapshot(this); + } + + /// Field number for the "alarm_full_reference" field. + public const int AlarmFullReferenceFieldNumber = 1; + private string alarmFullReference_ = ""; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string AlarmFullReference { + get { return alarmFullReference_; } + set { + alarmFullReference_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "source_object_reference" field. + public const int SourceObjectReferenceFieldNumber = 2; + private string sourceObjectReference_ = ""; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string SourceObjectReference { + get { return sourceObjectReference_; } + set { + sourceObjectReference_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "alarm_type_name" field. + public const int AlarmTypeNameFieldNumber = 3; + private string alarmTypeName_ = ""; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string AlarmTypeName { + get { return alarmTypeName_; } + set { + alarmTypeName_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "severity" field. + public const int SeverityFieldNumber = 4; + private int severity_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int Severity { + get { return severity_; } + set { + severity_ = value; + } + } + + /// Field number for the "original_raise_timestamp" field. + public const int OriginalRaiseTimestampFieldNumber = 5; + private global::Google.Protobuf.WellKnownTypes.Timestamp originalRaiseTimestamp_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Google.Protobuf.WellKnownTypes.Timestamp OriginalRaiseTimestamp { + get { return originalRaiseTimestamp_; } + set { + originalRaiseTimestamp_ = value; + } + } + + /// Field number for the "current_state" field. + public const int CurrentStateFieldNumber = 6; + private global::MxGateway.Contracts.Proto.AlarmConditionState currentState_ = global::MxGateway.Contracts.Proto.AlarmConditionState.Unspecified; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::MxGateway.Contracts.Proto.AlarmConditionState CurrentState { + get { return currentState_; } + set { + currentState_ = value; + } + } + + /// Field number for the "category" field. + public const int CategoryFieldNumber = 7; + private string category_ = ""; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Category { + get { return category_; } + set { + category_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "description" field. + public const int DescriptionFieldNumber = 8; + private string description_ = ""; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Description { + get { return description_; } + set { + description_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "last_transition_timestamp" field. + public const int LastTransitionTimestampFieldNumber = 9; + private global::Google.Protobuf.WellKnownTypes.Timestamp lastTransitionTimestamp_; + /// + /// When the most recent state transition occurred (last raise, last ack, + /// last clear). + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Google.Protobuf.WellKnownTypes.Timestamp LastTransitionTimestamp { + get { return lastTransitionTimestamp_; } + set { + lastTransitionTimestamp_ = value; + } + } + + /// Field number for the "operator_user" field. + public const int OperatorUserFieldNumber = 10; + private string operatorUser_ = ""; + /// + /// Operator who acknowledged the alarm if the current state is ActiveAcked. + /// Empty otherwise. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string OperatorUser { + get { return operatorUser_; } + set { + operatorUser_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "operator_comment" field. + public const int OperatorCommentFieldNumber = 11; + private string operatorComment_ = ""; + /// + /// Operator comment recorded with the most recent acknowledge if the current + /// state is ActiveAcked. Empty otherwise. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string OperatorComment { + get { return operatorComment_; } + set { + operatorComment_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "current_value" field. + public const int CurrentValueFieldNumber = 12; + private global::MxGateway.Contracts.Proto.MxValue currentValue_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::MxGateway.Contracts.Proto.MxValue CurrentValue { + get { return currentValue_; } + set { + currentValue_ = value; + } + } + + /// Field number for the "limit_value" field. + public const int LimitValueFieldNumber = 13; + private global::MxGateway.Contracts.Proto.MxValue limitValue_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::MxGateway.Contracts.Proto.MxValue LimitValue { + get { return limitValue_; } + set { + limitValue_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) { + return Equals(other as ActiveAlarmSnapshot); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(ActiveAlarmSnapshot other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (AlarmFullReference != other.AlarmFullReference) return false; + if (SourceObjectReference != other.SourceObjectReference) return false; + if (AlarmTypeName != other.AlarmTypeName) return false; + if (Severity != other.Severity) return false; + if (!object.Equals(OriginalRaiseTimestamp, other.OriginalRaiseTimestamp)) return false; + if (CurrentState != other.CurrentState) return false; + if (Category != other.Category) return false; + if (Description != other.Description) return false; + if (!object.Equals(LastTransitionTimestamp, other.LastTransitionTimestamp)) return false; + if (OperatorUser != other.OperatorUser) return false; + if (OperatorComment != other.OperatorComment) return false; + if (!object.Equals(CurrentValue, other.CurrentValue)) return false; + if (!object.Equals(LimitValue, other.LimitValue)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() { + int hash = 1; + if (AlarmFullReference.Length != 0) hash ^= AlarmFullReference.GetHashCode(); + if (SourceObjectReference.Length != 0) hash ^= SourceObjectReference.GetHashCode(); + if (AlarmTypeName.Length != 0) hash ^= AlarmTypeName.GetHashCode(); + if (Severity != 0) hash ^= Severity.GetHashCode(); + if (originalRaiseTimestamp_ != null) hash ^= OriginalRaiseTimestamp.GetHashCode(); + if (CurrentState != global::MxGateway.Contracts.Proto.AlarmConditionState.Unspecified) hash ^= CurrentState.GetHashCode(); + if (Category.Length != 0) hash ^= Category.GetHashCode(); + if (Description.Length != 0) hash ^= Description.GetHashCode(); + if (lastTransitionTimestamp_ != null) hash ^= LastTransitionTimestamp.GetHashCode(); + if (OperatorUser.Length != 0) hash ^= OperatorUser.GetHashCode(); + if (OperatorComment.Length != 0) hash ^= OperatorComment.GetHashCode(); + if (currentValue_ != null) hash ^= CurrentValue.GetHashCode(); + if (limitValue_ != null) hash ^= LimitValue.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (AlarmFullReference.Length != 0) { + output.WriteRawTag(10); + output.WriteString(AlarmFullReference); + } + if (SourceObjectReference.Length != 0) { + output.WriteRawTag(18); + output.WriteString(SourceObjectReference); + } + if (AlarmTypeName.Length != 0) { + output.WriteRawTag(26); + output.WriteString(AlarmTypeName); + } + if (Severity != 0) { + output.WriteRawTag(32); + output.WriteInt32(Severity); + } + if (originalRaiseTimestamp_ != null) { + output.WriteRawTag(42); + output.WriteMessage(OriginalRaiseTimestamp); + } + if (CurrentState != global::MxGateway.Contracts.Proto.AlarmConditionState.Unspecified) { + output.WriteRawTag(48); + output.WriteEnum((int) CurrentState); + } + if (Category.Length != 0) { + output.WriteRawTag(58); + output.WriteString(Category); + } + if (Description.Length != 0) { + output.WriteRawTag(66); + output.WriteString(Description); + } + if (lastTransitionTimestamp_ != null) { + output.WriteRawTag(74); + output.WriteMessage(LastTransitionTimestamp); + } + if (OperatorUser.Length != 0) { + output.WriteRawTag(82); + output.WriteString(OperatorUser); + } + if (OperatorComment.Length != 0) { + output.WriteRawTag(90); + output.WriteString(OperatorComment); + } + if (currentValue_ != null) { + output.WriteRawTag(98); + output.WriteMessage(CurrentValue); + } + if (limitValue_ != null) { + output.WriteRawTag(106); + output.WriteMessage(LimitValue); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (AlarmFullReference.Length != 0) { + output.WriteRawTag(10); + output.WriteString(AlarmFullReference); + } + if (SourceObjectReference.Length != 0) { + output.WriteRawTag(18); + output.WriteString(SourceObjectReference); + } + if (AlarmTypeName.Length != 0) { + output.WriteRawTag(26); + output.WriteString(AlarmTypeName); + } + if (Severity != 0) { + output.WriteRawTag(32); + output.WriteInt32(Severity); + } + if (originalRaiseTimestamp_ != null) { + output.WriteRawTag(42); + output.WriteMessage(OriginalRaiseTimestamp); + } + if (CurrentState != global::MxGateway.Contracts.Proto.AlarmConditionState.Unspecified) { + output.WriteRawTag(48); + output.WriteEnum((int) CurrentState); + } + if (Category.Length != 0) { + output.WriteRawTag(58); + output.WriteString(Category); + } + if (Description.Length != 0) { + output.WriteRawTag(66); + output.WriteString(Description); + } + if (lastTransitionTimestamp_ != null) { + output.WriteRawTag(74); + output.WriteMessage(LastTransitionTimestamp); + } + if (OperatorUser.Length != 0) { + output.WriteRawTag(82); + output.WriteString(OperatorUser); + } + if (OperatorComment.Length != 0) { + output.WriteRawTag(90); + output.WriteString(OperatorComment); + } + if (currentValue_ != null) { + output.WriteRawTag(98); + output.WriteMessage(CurrentValue); + } + if (limitValue_ != null) { + output.WriteRawTag(106); + output.WriteMessage(LimitValue); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() { + int size = 0; + if (AlarmFullReference.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(AlarmFullReference); + } + if (SourceObjectReference.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(SourceObjectReference); + } + if (AlarmTypeName.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(AlarmTypeName); + } + if (Severity != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(Severity); + } + if (originalRaiseTimestamp_ != null) { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(OriginalRaiseTimestamp); + } + if (CurrentState != global::MxGateway.Contracts.Proto.AlarmConditionState.Unspecified) { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) CurrentState); + } + if (Category.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Category); + } + if (Description.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Description); + } + if (lastTransitionTimestamp_ != null) { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(LastTransitionTimestamp); + } + if (OperatorUser.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(OperatorUser); + } + if (OperatorComment.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(OperatorComment); + } + if (currentValue_ != null) { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(CurrentValue); + } + if (limitValue_ != null) { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(LimitValue); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(ActiveAlarmSnapshot other) { + if (other == null) { + return; + } + if (other.AlarmFullReference.Length != 0) { + AlarmFullReference = other.AlarmFullReference; + } + if (other.SourceObjectReference.Length != 0) { + SourceObjectReference = other.SourceObjectReference; + } + if (other.AlarmTypeName.Length != 0) { + AlarmTypeName = other.AlarmTypeName; + } + if (other.Severity != 0) { + Severity = other.Severity; + } + if (other.originalRaiseTimestamp_ != null) { + if (originalRaiseTimestamp_ == null) { + OriginalRaiseTimestamp = new global::Google.Protobuf.WellKnownTypes.Timestamp(); + } + OriginalRaiseTimestamp.MergeFrom(other.OriginalRaiseTimestamp); + } + if (other.CurrentState != global::MxGateway.Contracts.Proto.AlarmConditionState.Unspecified) { + CurrentState = other.CurrentState; + } + if (other.Category.Length != 0) { + Category = other.Category; + } + if (other.Description.Length != 0) { + Description = other.Description; + } + if (other.lastTransitionTimestamp_ != null) { + if (lastTransitionTimestamp_ == null) { + LastTransitionTimestamp = new global::Google.Protobuf.WellKnownTypes.Timestamp(); + } + LastTransitionTimestamp.MergeFrom(other.LastTransitionTimestamp); + } + if (other.OperatorUser.Length != 0) { + OperatorUser = other.OperatorUser; + } + if (other.OperatorComment.Length != 0) { + OperatorComment = other.OperatorComment; + } + if (other.currentValue_ != null) { + if (currentValue_ == null) { + CurrentValue = new global::MxGateway.Contracts.Proto.MxValue(); + } + CurrentValue.MergeFrom(other.CurrentValue); + } + if (other.limitValue_ != null) { + if (limitValue_ == null) { + LimitValue = new global::MxGateway.Contracts.Proto.MxValue(); + } + LimitValue.MergeFrom(other.LimitValue); + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + AlarmFullReference = input.ReadString(); + break; + } + case 18: { + SourceObjectReference = input.ReadString(); + break; + } + case 26: { + AlarmTypeName = input.ReadString(); + break; + } + case 32: { + Severity = input.ReadInt32(); + break; + } + case 42: { + if (originalRaiseTimestamp_ == null) { + OriginalRaiseTimestamp = new global::Google.Protobuf.WellKnownTypes.Timestamp(); + } + input.ReadMessage(OriginalRaiseTimestamp); + break; + } + case 48: { + CurrentState = (global::MxGateway.Contracts.Proto.AlarmConditionState) input.ReadEnum(); + break; + } + case 58: { + Category = input.ReadString(); + break; + } + case 66: { + Description = input.ReadString(); + break; + } + case 74: { + if (lastTransitionTimestamp_ == null) { + LastTransitionTimestamp = new global::Google.Protobuf.WellKnownTypes.Timestamp(); + } + input.ReadMessage(LastTransitionTimestamp); + break; + } + case 82: { + OperatorUser = input.ReadString(); + break; + } + case 90: { + OperatorComment = input.ReadString(); + break; + } + case 98: { + if (currentValue_ == null) { + CurrentValue = new global::MxGateway.Contracts.Proto.MxValue(); + } + input.ReadMessage(CurrentValue); + break; + } + case 106: { + if (limitValue_ == null) { + LimitValue = new global::MxGateway.Contracts.Proto.MxValue(); + } + input.ReadMessage(LimitValue); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: { + AlarmFullReference = input.ReadString(); + break; + } + case 18: { + SourceObjectReference = input.ReadString(); + break; + } + case 26: { + AlarmTypeName = input.ReadString(); + break; + } + case 32: { + Severity = input.ReadInt32(); + break; + } + case 42: { + if (originalRaiseTimestamp_ == null) { + OriginalRaiseTimestamp = new global::Google.Protobuf.WellKnownTypes.Timestamp(); + } + input.ReadMessage(OriginalRaiseTimestamp); + break; + } + case 48: { + CurrentState = (global::MxGateway.Contracts.Proto.AlarmConditionState) input.ReadEnum(); + break; + } + case 58: { + Category = input.ReadString(); + break; + } + case 66: { + Description = input.ReadString(); + break; + } + case 74: { + if (lastTransitionTimestamp_ == null) { + LastTransitionTimestamp = new global::Google.Protobuf.WellKnownTypes.Timestamp(); + } + input.ReadMessage(LastTransitionTimestamp); + break; + } + case 82: { + OperatorUser = input.ReadString(); + break; + } + case 90: { + OperatorComment = input.ReadString(); + break; + } + case 98: { + if (currentValue_ == null) { + CurrentValue = new global::MxGateway.Contracts.Proto.MxValue(); + } + input.ReadMessage(CurrentValue); + break; + } + case 106: { + if (limitValue_ == null) { + LimitValue = new global::MxGateway.Contracts.Proto.MxValue(); + } + input.ReadMessage(LimitValue); + break; + } + } + } + } + #endif + + } + + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class AcknowledgeAlarmRequest : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new AcknowledgeAlarmRequest()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor { + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[57]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public AcknowledgeAlarmRequest() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public AcknowledgeAlarmRequest(AcknowledgeAlarmRequest other) : this() { + sessionId_ = other.sessionId_; + clientCorrelationId_ = other.clientCorrelationId_; + alarmFullReference_ = other.alarmFullReference_; + comment_ = other.comment_; + operatorUser_ = other.operatorUser_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public AcknowledgeAlarmRequest Clone() { + return new AcknowledgeAlarmRequest(this); + } + + /// Field number for the "session_id" field. + public const int SessionIdFieldNumber = 1; + private string sessionId_ = ""; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string SessionId { + get { return sessionId_; } + set { + sessionId_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "client_correlation_id" field. + public const int ClientCorrelationIdFieldNumber = 2; + private string clientCorrelationId_ = ""; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string ClientCorrelationId { + get { return clientCorrelationId_; } + set { + clientCorrelationId_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "alarm_full_reference" field. + public const int AlarmFullReferenceFieldNumber = 3; + private string alarmFullReference_ = ""; + /// + /// Fully-qualified alarm reference matching OnAlarmTransitionEvent.alarm_full_reference. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string AlarmFullReference { + get { return alarmFullReference_; } + set { + alarmFullReference_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "comment" field. + public const int CommentFieldNumber = 4; + private string comment_ = ""; + /// + /// Operator-supplied comment forwarded to MXAccess. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Comment { + get { return comment_; } + set { + comment_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "operator_user" field. + public const int OperatorUserFieldNumber = 5; + private string operatorUser_ = ""; + /// + /// Operator principal performing the acknowledgement. The lmxopcua side + /// resolves this from the OPC UA session prior to invoking the RPC. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string OperatorUser { + get { return operatorUser_; } + set { + operatorUser_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) { + return Equals(other as AcknowledgeAlarmRequest); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(AcknowledgeAlarmRequest other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (SessionId != other.SessionId) return false; + if (ClientCorrelationId != other.ClientCorrelationId) return false; + if (AlarmFullReference != other.AlarmFullReference) return false; + if (Comment != other.Comment) return false; + if (OperatorUser != other.OperatorUser) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() { + int hash = 1; + if (SessionId.Length != 0) hash ^= SessionId.GetHashCode(); + if (ClientCorrelationId.Length != 0) hash ^= ClientCorrelationId.GetHashCode(); + if (AlarmFullReference.Length != 0) hash ^= AlarmFullReference.GetHashCode(); + if (Comment.Length != 0) hash ^= Comment.GetHashCode(); + if (OperatorUser.Length != 0) hash ^= OperatorUser.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (SessionId.Length != 0) { + output.WriteRawTag(10); + output.WriteString(SessionId); + } + if (ClientCorrelationId.Length != 0) { + output.WriteRawTag(18); + output.WriteString(ClientCorrelationId); + } + if (AlarmFullReference.Length != 0) { + output.WriteRawTag(26); + output.WriteString(AlarmFullReference); + } + if (Comment.Length != 0) { + output.WriteRawTag(34); + output.WriteString(Comment); + } + if (OperatorUser.Length != 0) { + output.WriteRawTag(42); + output.WriteString(OperatorUser); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (SessionId.Length != 0) { + output.WriteRawTag(10); + output.WriteString(SessionId); + } + if (ClientCorrelationId.Length != 0) { + output.WriteRawTag(18); + output.WriteString(ClientCorrelationId); + } + if (AlarmFullReference.Length != 0) { + output.WriteRawTag(26); + output.WriteString(AlarmFullReference); + } + if (Comment.Length != 0) { + output.WriteRawTag(34); + output.WriteString(Comment); + } + if (OperatorUser.Length != 0) { + output.WriteRawTag(42); + output.WriteString(OperatorUser); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() { + int size = 0; + if (SessionId.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(SessionId); + } + if (ClientCorrelationId.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(ClientCorrelationId); + } + if (AlarmFullReference.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(AlarmFullReference); + } + if (Comment.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Comment); + } + if (OperatorUser.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(OperatorUser); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(AcknowledgeAlarmRequest other) { + if (other == null) { + return; + } + if (other.SessionId.Length != 0) { + SessionId = other.SessionId; + } + if (other.ClientCorrelationId.Length != 0) { + ClientCorrelationId = other.ClientCorrelationId; + } + if (other.AlarmFullReference.Length != 0) { + AlarmFullReference = other.AlarmFullReference; + } + if (other.Comment.Length != 0) { + Comment = other.Comment; + } + if (other.OperatorUser.Length != 0) { + OperatorUser = other.OperatorUser; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + SessionId = input.ReadString(); + break; + } + case 18: { + ClientCorrelationId = input.ReadString(); + break; + } + case 26: { + AlarmFullReference = input.ReadString(); + break; + } + case 34: { + Comment = input.ReadString(); + break; + } + case 42: { + OperatorUser = input.ReadString(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: { + SessionId = input.ReadString(); + break; + } + case 18: { + ClientCorrelationId = input.ReadString(); + break; + } + case 26: { + AlarmFullReference = input.ReadString(); + break; + } + case 34: { + Comment = input.ReadString(); + break; + } + case 42: { + OperatorUser = input.ReadString(); + break; + } + } + } + } + #endif + + } + + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class AcknowledgeAlarmReply : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new AcknowledgeAlarmReply()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor { + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[58]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public AcknowledgeAlarmReply() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public AcknowledgeAlarmReply(AcknowledgeAlarmReply other) : this() { + _hasBits0 = other._hasBits0; + sessionId_ = other.sessionId_; + correlationId_ = other.correlationId_; + protocolStatus_ = other.protocolStatus_ != null ? other.protocolStatus_.Clone() : null; + hresult_ = other.hresult_; + status_ = other.status_ != null ? other.status_.Clone() : null; + diagnosticMessage_ = other.diagnosticMessage_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public AcknowledgeAlarmReply Clone() { + return new AcknowledgeAlarmReply(this); + } + + /// Field number for the "session_id" field. + public const int SessionIdFieldNumber = 1; + private string sessionId_ = ""; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string SessionId { + get { return sessionId_; } + set { + sessionId_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "correlation_id" field. + public const int CorrelationIdFieldNumber = 2; + private string correlationId_ = ""; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string CorrelationId { + get { return correlationId_; } + set { + correlationId_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "protocol_status" field. + public const int ProtocolStatusFieldNumber = 3; + private global::MxGateway.Contracts.Proto.ProtocolStatus protocolStatus_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::MxGateway.Contracts.Proto.ProtocolStatus ProtocolStatus { + get { return protocolStatus_; } + set { + protocolStatus_ = value; + } + } + + /// Field number for the "hresult" field. + public const int HresultFieldNumber = 4; + private readonly static int HresultDefaultValue = 0; + + private int hresult_; + /// + /// HRESULT captured from MXAccess if the ack failed at the COM layer. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int Hresult { + get { if ((_hasBits0 & 1) != 0) { return hresult_; } else { return HresultDefaultValue; } } + set { + _hasBits0 |= 1; + hresult_ = value; + } + } + /// Gets whether the "hresult" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasHresult { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "hresult" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearHresult() { + _hasBits0 &= ~1; + } + + /// Field number for the "status" field. + public const int StatusFieldNumber = 5; + private global::MxGateway.Contracts.Proto.MxStatusProxy status_; + /// + /// Native MxAccess status describing the outcome of the ack. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::MxGateway.Contracts.Proto.MxStatusProxy Status { + get { return status_; } + set { + status_ = value; + } + } + + /// Field number for the "diagnostic_message" field. + public const int DiagnosticMessageFieldNumber = 6; + private string diagnosticMessage_ = ""; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string DiagnosticMessage { + get { return diagnosticMessage_; } + set { + diagnosticMessage_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) { + return Equals(other as AcknowledgeAlarmReply); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(AcknowledgeAlarmReply other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (SessionId != other.SessionId) return false; + if (CorrelationId != other.CorrelationId) return false; + if (!object.Equals(ProtocolStatus, other.ProtocolStatus)) return false; + if (Hresult != other.Hresult) return false; + if (!object.Equals(Status, other.Status)) return false; + if (DiagnosticMessage != other.DiagnosticMessage) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() { + int hash = 1; + if (SessionId.Length != 0) hash ^= SessionId.GetHashCode(); + if (CorrelationId.Length != 0) hash ^= CorrelationId.GetHashCode(); + if (protocolStatus_ != null) hash ^= ProtocolStatus.GetHashCode(); + if (HasHresult) hash ^= Hresult.GetHashCode(); + if (status_ != null) hash ^= Status.GetHashCode(); + if (DiagnosticMessage.Length != 0) hash ^= DiagnosticMessage.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (SessionId.Length != 0) { + output.WriteRawTag(10); + output.WriteString(SessionId); + } + if (CorrelationId.Length != 0) { + output.WriteRawTag(18); + output.WriteString(CorrelationId); + } + if (protocolStatus_ != null) { + output.WriteRawTag(26); + output.WriteMessage(ProtocolStatus); + } + if (HasHresult) { + output.WriteRawTag(32); + output.WriteInt32(Hresult); + } + if (status_ != null) { + output.WriteRawTag(42); + output.WriteMessage(Status); + } + if (DiagnosticMessage.Length != 0) { + output.WriteRawTag(50); + output.WriteString(DiagnosticMessage); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (SessionId.Length != 0) { + output.WriteRawTag(10); + output.WriteString(SessionId); + } + if (CorrelationId.Length != 0) { + output.WriteRawTag(18); + output.WriteString(CorrelationId); + } + if (protocolStatus_ != null) { + output.WriteRawTag(26); + output.WriteMessage(ProtocolStatus); + } + if (HasHresult) { + output.WriteRawTag(32); + output.WriteInt32(Hresult); + } + if (status_ != null) { + output.WriteRawTag(42); + output.WriteMessage(Status); + } + if (DiagnosticMessage.Length != 0) { + output.WriteRawTag(50); + output.WriteString(DiagnosticMessage); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() { + int size = 0; + if (SessionId.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(SessionId); + } + if (CorrelationId.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(CorrelationId); + } + if (protocolStatus_ != null) { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(ProtocolStatus); + } + if (HasHresult) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(Hresult); + } + if (status_ != null) { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Status); + } + if (DiagnosticMessage.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(DiagnosticMessage); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(AcknowledgeAlarmReply other) { + if (other == null) { + return; + } + if (other.SessionId.Length != 0) { + SessionId = other.SessionId; + } + if (other.CorrelationId.Length != 0) { + CorrelationId = other.CorrelationId; + } + if (other.protocolStatus_ != null) { + if (protocolStatus_ == null) { + ProtocolStatus = new global::MxGateway.Contracts.Proto.ProtocolStatus(); + } + ProtocolStatus.MergeFrom(other.ProtocolStatus); + } + if (other.HasHresult) { + Hresult = other.Hresult; + } + if (other.status_ != null) { + if (status_ == null) { + Status = new global::MxGateway.Contracts.Proto.MxStatusProxy(); + } + Status.MergeFrom(other.Status); + } + if (other.DiagnosticMessage.Length != 0) { + DiagnosticMessage = other.DiagnosticMessage; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + SessionId = input.ReadString(); + break; + } + case 18: { + CorrelationId = input.ReadString(); + break; + } + case 26: { + if (protocolStatus_ == null) { + ProtocolStatus = new global::MxGateway.Contracts.Proto.ProtocolStatus(); + } + input.ReadMessage(ProtocolStatus); + break; + } + case 32: { + Hresult = input.ReadInt32(); + break; + } + case 42: { + if (status_ == null) { + Status = new global::MxGateway.Contracts.Proto.MxStatusProxy(); + } + input.ReadMessage(Status); + break; + } + case 50: { + DiagnosticMessage = input.ReadString(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: { + SessionId = input.ReadString(); + break; + } + case 18: { + CorrelationId = input.ReadString(); + break; + } + case 26: { + if (protocolStatus_ == null) { + ProtocolStatus = new global::MxGateway.Contracts.Proto.ProtocolStatus(); + } + input.ReadMessage(ProtocolStatus); + break; + } + case 32: { + Hresult = input.ReadInt32(); + break; + } + case 42: { + if (status_ == null) { + Status = new global::MxGateway.Contracts.Proto.MxStatusProxy(); + } + input.ReadMessage(Status); + break; + } + case 50: { + DiagnosticMessage = input.ReadString(); + break; + } + } + } + } + #endif + + } + + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class QueryActiveAlarmsRequest : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new QueryActiveAlarmsRequest()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor { + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[59]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public QueryActiveAlarmsRequest() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public QueryActiveAlarmsRequest(QueryActiveAlarmsRequest other) : this() { + sessionId_ = other.sessionId_; + clientCorrelationId_ = other.clientCorrelationId_; + alarmFilterPrefix_ = other.alarmFilterPrefix_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public QueryActiveAlarmsRequest Clone() { + return new QueryActiveAlarmsRequest(this); + } + + /// Field number for the "session_id" field. + public const int SessionIdFieldNumber = 1; + private string sessionId_ = ""; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string SessionId { + get { return sessionId_; } + set { + sessionId_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "client_correlation_id" field. + public const int ClientCorrelationIdFieldNumber = 2; + private string clientCorrelationId_ = ""; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string ClientCorrelationId { + get { return clientCorrelationId_; } + set { + clientCorrelationId_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "alarm_filter_prefix" field. + public const int AlarmFilterPrefixFieldNumber = 3; + private string alarmFilterPrefix_ = ""; + /// + /// Optional alarm-reference prefix used to scope a partial ConditionRefresh + /// (e.g. equipment sub-tree). Empty means full refresh. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string AlarmFilterPrefix { + get { return alarmFilterPrefix_; } + set { + alarmFilterPrefix_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) { + return Equals(other as QueryActiveAlarmsRequest); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(QueryActiveAlarmsRequest other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (SessionId != other.SessionId) return false; + if (ClientCorrelationId != other.ClientCorrelationId) return false; + if (AlarmFilterPrefix != other.AlarmFilterPrefix) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() { + int hash = 1; + if (SessionId.Length != 0) hash ^= SessionId.GetHashCode(); + if (ClientCorrelationId.Length != 0) hash ^= ClientCorrelationId.GetHashCode(); + if (AlarmFilterPrefix.Length != 0) hash ^= AlarmFilterPrefix.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (SessionId.Length != 0) { + output.WriteRawTag(10); + output.WriteString(SessionId); + } + if (ClientCorrelationId.Length != 0) { + output.WriteRawTag(18); + output.WriteString(ClientCorrelationId); + } + if (AlarmFilterPrefix.Length != 0) { + output.WriteRawTag(26); + output.WriteString(AlarmFilterPrefix); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (SessionId.Length != 0) { + output.WriteRawTag(10); + output.WriteString(SessionId); + } + if (ClientCorrelationId.Length != 0) { + output.WriteRawTag(18); + output.WriteString(ClientCorrelationId); + } + if (AlarmFilterPrefix.Length != 0) { + output.WriteRawTag(26); + output.WriteString(AlarmFilterPrefix); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() { + int size = 0; + if (SessionId.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(SessionId); + } + if (ClientCorrelationId.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(ClientCorrelationId); + } + if (AlarmFilterPrefix.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(AlarmFilterPrefix); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(QueryActiveAlarmsRequest other) { + if (other == null) { + return; + } + if (other.SessionId.Length != 0) { + SessionId = other.SessionId; + } + if (other.ClientCorrelationId.Length != 0) { + ClientCorrelationId = other.ClientCorrelationId; + } + if (other.AlarmFilterPrefix.Length != 0) { + AlarmFilterPrefix = other.AlarmFilterPrefix; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + SessionId = input.ReadString(); + break; + } + case 18: { + ClientCorrelationId = input.ReadString(); + break; + } + case 26: { + AlarmFilterPrefix = input.ReadString(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: { + SessionId = input.ReadString(); + break; + } + case 18: { + ClientCorrelationId = input.ReadString(); + break; + } + case 26: { + AlarmFilterPrefix = input.ReadString(); + break; + } + } + } + } + #endif + + } + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] public sealed partial class MxStatusProxy : pb::IMessage #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE @@ -17159,7 +19769,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[55]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[60]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -17579,7 +20189,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[56]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[61]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -18436,7 +21046,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[57]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[62]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -19224,7 +21834,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[58]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[63]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -19413,7 +22023,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[59]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[64]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -19602,7 +22212,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[60]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[65]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -19791,7 +22401,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[61]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[66]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -19980,7 +22590,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[62]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[67]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -20169,7 +22779,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[63]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[68]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -20356,7 +22966,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[64]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[69]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -20543,7 +23153,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[65]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[70]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -20730,7 +23340,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[66]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[71]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] diff --git a/src/MxGateway.Contracts/Generated/MxaccessGatewayGrpc.cs b/src/MxGateway.Contracts/Generated/MxaccessGatewayGrpc.cs index 0165045..55606d7 100644 --- a/src/MxGateway.Contracts/Generated/MxaccessGatewayGrpc.cs +++ b/src/MxGateway.Contracts/Generated/MxaccessGatewayGrpc.cs @@ -64,6 +64,14 @@ namespace MxGateway.Contracts.Proto { static readonly grpc::Marshaller __Marshaller_mxaccess_gateway_v1_StreamEventsRequest = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::MxGateway.Contracts.Proto.StreamEventsRequest.Parser)); [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)] static readonly grpc::Marshaller __Marshaller_mxaccess_gateway_v1_MxEvent = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::MxGateway.Contracts.Proto.MxEvent.Parser)); + [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)] + static readonly grpc::Marshaller __Marshaller_mxaccess_gateway_v1_AcknowledgeAlarmRequest = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::MxGateway.Contracts.Proto.AcknowledgeAlarmRequest.Parser)); + [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)] + static readonly grpc::Marshaller __Marshaller_mxaccess_gateway_v1_AcknowledgeAlarmReply = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::MxGateway.Contracts.Proto.AcknowledgeAlarmReply.Parser)); + [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)] + static readonly grpc::Marshaller __Marshaller_mxaccess_gateway_v1_QueryActiveAlarmsRequest = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::MxGateway.Contracts.Proto.QueryActiveAlarmsRequest.Parser)); + [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)] + static readonly grpc::Marshaller __Marshaller_mxaccess_gateway_v1_ActiveAlarmSnapshot = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::MxGateway.Contracts.Proto.ActiveAlarmSnapshot.Parser)); [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)] static readonly grpc::Method __Method_OpenSession = new grpc::Method( @@ -97,6 +105,22 @@ namespace MxGateway.Contracts.Proto { __Marshaller_mxaccess_gateway_v1_StreamEventsRequest, __Marshaller_mxaccess_gateway_v1_MxEvent); + [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)] + static readonly grpc::Method __Method_AcknowledgeAlarm = new grpc::Method( + grpc::MethodType.Unary, + __ServiceName, + "AcknowledgeAlarm", + __Marshaller_mxaccess_gateway_v1_AcknowledgeAlarmRequest, + __Marshaller_mxaccess_gateway_v1_AcknowledgeAlarmReply); + + [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)] + static readonly grpc::Method __Method_QueryActiveAlarms = new grpc::Method( + grpc::MethodType.ServerStreaming, + __ServiceName, + "QueryActiveAlarms", + __Marshaller_mxaccess_gateway_v1_QueryActiveAlarmsRequest, + __Marshaller_mxaccess_gateway_v1_ActiveAlarmSnapshot); + /// Service descriptor public static global::Google.Protobuf.Reflection.ServiceDescriptor Descriptor { @@ -131,6 +155,18 @@ namespace MxGateway.Contracts.Proto { throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); } + [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)] + public virtual global::System.Threading.Tasks.Task AcknowledgeAlarm(global::MxGateway.Contracts.Proto.AcknowledgeAlarmRequest request, grpc::ServerCallContext context) + { + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); + } + + [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)] + public virtual global::System.Threading.Tasks.Task QueryActiveAlarms(global::MxGateway.Contracts.Proto.QueryActiveAlarmsRequest request, grpc::IServerStreamWriter responseStream, grpc::ServerCallContext context) + { + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); + } + } /// Client for MxAccessGateway @@ -230,6 +266,36 @@ namespace MxGateway.Contracts.Proto { { return CallInvoker.AsyncServerStreamingCall(__Method_StreamEvents, null, options, request); } + [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)] + public virtual global::MxGateway.Contracts.Proto.AcknowledgeAlarmReply AcknowledgeAlarm(global::MxGateway.Contracts.Proto.AcknowledgeAlarmRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken)) + { + return AcknowledgeAlarm(request, new grpc::CallOptions(headers, deadline, cancellationToken)); + } + [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)] + public virtual global::MxGateway.Contracts.Proto.AcknowledgeAlarmReply AcknowledgeAlarm(global::MxGateway.Contracts.Proto.AcknowledgeAlarmRequest request, grpc::CallOptions options) + { + return CallInvoker.BlockingUnaryCall(__Method_AcknowledgeAlarm, null, options, request); + } + [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)] + public virtual grpc::AsyncUnaryCall AcknowledgeAlarmAsync(global::MxGateway.Contracts.Proto.AcknowledgeAlarmRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken)) + { + return AcknowledgeAlarmAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken)); + } + [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)] + public virtual grpc::AsyncUnaryCall AcknowledgeAlarmAsync(global::MxGateway.Contracts.Proto.AcknowledgeAlarmRequest request, grpc::CallOptions options) + { + return CallInvoker.AsyncUnaryCall(__Method_AcknowledgeAlarm, null, options, request); + } + [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)] + public virtual grpc::AsyncServerStreamingCall QueryActiveAlarms(global::MxGateway.Contracts.Proto.QueryActiveAlarmsRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken)) + { + return QueryActiveAlarms(request, new grpc::CallOptions(headers, deadline, cancellationToken)); + } + [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)] + public virtual grpc::AsyncServerStreamingCall QueryActiveAlarms(global::MxGateway.Contracts.Proto.QueryActiveAlarmsRequest request, grpc::CallOptions options) + { + return CallInvoker.AsyncServerStreamingCall(__Method_QueryActiveAlarms, null, options, request); + } /// Creates a new instance of client from given ClientBaseConfiguration. [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)] protected override MxAccessGatewayClient NewInstance(ClientBaseConfiguration configuration) @@ -247,7 +313,9 @@ namespace MxGateway.Contracts.Proto { .AddMethod(__Method_OpenSession, serviceImpl.OpenSession) .AddMethod(__Method_CloseSession, serviceImpl.CloseSession) .AddMethod(__Method_Invoke, serviceImpl.Invoke) - .AddMethod(__Method_StreamEvents, serviceImpl.StreamEvents).Build(); + .AddMethod(__Method_StreamEvents, serviceImpl.StreamEvents) + .AddMethod(__Method_AcknowledgeAlarm, serviceImpl.AcknowledgeAlarm) + .AddMethod(__Method_QueryActiveAlarms, serviceImpl.QueryActiveAlarms).Build(); } /// Register service method with a service binder with or without implementation. Useful when customizing the service binding logic. @@ -261,6 +329,8 @@ namespace MxGateway.Contracts.Proto { serviceBinder.AddMethod(__Method_CloseSession, serviceImpl == null ? null : new grpc::UnaryServerMethod(serviceImpl.CloseSession)); serviceBinder.AddMethod(__Method_Invoke, serviceImpl == null ? null : new grpc::UnaryServerMethod(serviceImpl.Invoke)); serviceBinder.AddMethod(__Method_StreamEvents, serviceImpl == null ? null : new grpc::ServerStreamingServerMethod(serviceImpl.StreamEvents)); + serviceBinder.AddMethod(__Method_AcknowledgeAlarm, serviceImpl == null ? null : new grpc::UnaryServerMethod(serviceImpl.AcknowledgeAlarm)); + serviceBinder.AddMethod(__Method_QueryActiveAlarms, serviceImpl == null ? null : new grpc::ServerStreamingServerMethod(serviceImpl.QueryActiveAlarms)); } } diff --git a/src/MxGateway.Contracts/Protos/mxaccess_gateway.proto b/src/MxGateway.Contracts/Protos/mxaccess_gateway.proto index 394a3ec..b7ecf29 100644 --- a/src/MxGateway.Contracts/Protos/mxaccess_gateway.proto +++ b/src/MxGateway.Contracts/Protos/mxaccess_gateway.proto @@ -13,6 +13,8 @@ service MxAccessGateway { rpc CloseSession(CloseSessionRequest) returns (CloseSessionReply); rpc Invoke(MxCommandRequest) returns (MxCommandReply); rpc StreamEvents(StreamEventsRequest) returns (stream MxEvent); + rpc AcknowledgeAlarm(AcknowledgeAlarmRequest) returns (AcknowledgeAlarmReply); + rpc QueryActiveAlarms(QueryActiveAlarmsRequest) returns (stream ActiveAlarmSnapshot); } message OpenSessionRequest { @@ -397,6 +399,7 @@ message MxEvent { OnWriteCompleteEvent on_write_complete = 21; OperationCompleteEvent operation_complete = 22; OnBufferedDataChangeEvent on_buffered_data_change = 23; + OnAlarmTransitionEvent on_alarm_transition = 24; } } @@ -406,6 +409,7 @@ enum MxEventFamily { MX_EVENT_FAMILY_ON_WRITE_COMPLETE = 2; MX_EVENT_FAMILY_OPERATION_COMPLETE = 3; MX_EVENT_FAMILY_ON_BUFFERED_DATA_CHANGE = 4; + MX_EVENT_FAMILY_ON_ALARM_TRANSITION = 5; } message OnDataChangeEvent { @@ -424,6 +428,134 @@ message OnBufferedDataChangeEvent { int32 raw_data_type = 4; } +// Carries a single MXAccess alarm transition (raise / acknowledge / clear / +// re-trigger) in native MXAccess terms. The Part 9 state machine + ACL + +// multi-source aggregation lives in lmxopcua's AlarmConditionService; the +// gateway is UA-agnostic and forwards the raw payload. +message OnAlarmTransitionEvent { + // Fully-qualified alarm reference (e.g. "Tank01.Level.HiHi"). Stable across + // transitions of the same condition; used by the lmxopcua side to correlate + // raise/ack/clear into a single Part 9 condition. + string alarm_full_reference = 1; + + // Galaxy-side source object reference (e.g. "Tank01"). Empty for alarms + // that do not bind to a Galaxy object. + string source_object_reference = 2; + + // MxAccess alarm-type qualifier (e.g. "AnalogLimitAlarm.HiHi", "DiscAlarm"). + string alarm_type_name = 3; + + // What kind of state change this event represents. + AlarmTransitionKind transition_kind = 4; + + // Raw MXAccess severity value. Mapping to OPC UA 0-1000 happens server-side + // in lmxopcua via MxAccessSeverityMapper; the gateway preserves the native + // MXAccess scale. + int32 severity = 5; + + // When the alarm originally entered the active state. Preserved across + // acknowledge transitions so the Part 9 condition keeps the original raise + // time. Unset on retrigger from a previously-cleared condition. + google.protobuf.Timestamp original_raise_timestamp = 6; + + // When this specific transition occurred (raise time on Raise, ack time on + // Acknowledge, clear time on Clear). + google.protobuf.Timestamp transition_timestamp = 7; + + // Operator principal recorded by MXAccess on Acknowledge transitions. + // Empty on raise / clear. + string operator_user = 8; + + // Operator-supplied comment recorded by MXAccess on Acknowledge transitions. + // Empty on raise / clear or when no comment was supplied. + string operator_comment = 9; + + // MxAccess alarm category (taxonomy bucket configured in the Galaxy + // template, e.g. "Process", "Safety", "Diagnostics"). + string category = 10; + + // Human-readable alarm description from the MxAccess alarm definition. + string description = 11; + + // Current alarm value (the value of the source attribute at the moment of + // transition). Optional; populated when MxAccess surfaces it. + MxValue current_value = 12; + + // Limit/threshold value that triggered the transition for limit alarms. + // Optional; populated for AnalogLimitAlarm-family transitions. + MxValue limit_value = 13; +} + +enum AlarmTransitionKind { + ALARM_TRANSITION_KIND_UNSPECIFIED = 0; + ALARM_TRANSITION_KIND_RAISE = 1; + ALARM_TRANSITION_KIND_ACKNOWLEDGE = 2; + ALARM_TRANSITION_KIND_CLEAR = 3; + ALARM_TRANSITION_KIND_RETRIGGER = 4; +} + +// Snapshot of a currently-active MXAccess alarm condition, returned from a +// QueryActiveAlarms ConditionRefresh stream. +message ActiveAlarmSnapshot { + string alarm_full_reference = 1; + string source_object_reference = 2; + string alarm_type_name = 3; + int32 severity = 4; + google.protobuf.Timestamp original_raise_timestamp = 5; + AlarmConditionState current_state = 6; + string category = 7; + string description = 8; + // When the most recent state transition occurred (last raise, last ack, + // last clear). + google.protobuf.Timestamp last_transition_timestamp = 9; + // Operator who acknowledged the alarm if the current state is ActiveAcked. + // Empty otherwise. + string operator_user = 10; + // Operator comment recorded with the most recent acknowledge if the current + // state is ActiveAcked. Empty otherwise. + string operator_comment = 11; + MxValue current_value = 12; + MxValue limit_value = 13; +} + +enum AlarmConditionState { + ALARM_CONDITION_STATE_UNSPECIFIED = 0; + ALARM_CONDITION_STATE_ACTIVE = 1; + ALARM_CONDITION_STATE_ACTIVE_ACKED = 2; + ALARM_CONDITION_STATE_INACTIVE = 3; +} + +message AcknowledgeAlarmRequest { + string session_id = 1; + string client_correlation_id = 2; + // Fully-qualified alarm reference matching OnAlarmTransitionEvent.alarm_full_reference. + string alarm_full_reference = 3; + // Operator-supplied comment forwarded to MXAccess. + string comment = 4; + // Operator principal performing the acknowledgement. The lmxopcua side + // resolves this from the OPC UA session prior to invoking the RPC. + string operator_user = 5; +} + +message AcknowledgeAlarmReply { + string session_id = 1; + string correlation_id = 2; + ProtocolStatus protocol_status = 3; + // HRESULT captured from MXAccess if the ack failed at the COM layer. + optional int32 hresult = 4; + // Native MxAccess status describing the outcome of the ack. + MxStatusProxy status = 5; + string diagnostic_message = 6; +} + +message QueryActiveAlarmsRequest { + string session_id = 1; + string client_correlation_id = 2; + // Optional alarm-reference prefix used to scope a partial ConditionRefresh + // (e.g. equipment sub-tree). Empty means full refresh. + string alarm_filter_prefix = 3; +} + message MxStatusProxy { int32 success = 1; MxStatusCategory category = 2; diff --git a/src/MxGateway.Tests/Contracts/GatewayContractInfoTests.cs b/src/MxGateway.Tests/Contracts/GatewayContractInfoTests.cs index 3dcc8ef..df98abe 100644 --- a/src/MxGateway.Tests/Contracts/GatewayContractInfoTests.cs +++ b/src/MxGateway.Tests/Contracts/GatewayContractInfoTests.cs @@ -11,11 +11,11 @@ public sealed class GatewayContractInfoTests Assert.Equal("mxaccess-worker", GatewayContractInfo.DefaultBackendName); } - /// Verifies that the gateway protocol version starts at version one. + /// Verifies that the gateway protocol version is bumped to three after the alarm proto extension. [Fact] - public void GatewayProtocolVersion_IsVersionTwo() + public void GatewayProtocolVersion_IsVersionThree() { - Assert.Equal(2u, GatewayContractInfo.GatewayProtocolVersion); + Assert.Equal(3u, GatewayContractInfo.GatewayProtocolVersion); } /// Verifies that the worker protocol version starts at version one. diff --git a/src/MxGateway.Tests/Contracts/ProtobufContractRoundTripTests.cs b/src/MxGateway.Tests/Contracts/ProtobufContractRoundTripTests.cs index d077935..f746766 100644 --- a/src/MxGateway.Tests/Contracts/ProtobufContractRoundTripTests.cs +++ b/src/MxGateway.Tests/Contracts/ProtobufContractRoundTripTests.cs @@ -19,6 +19,8 @@ public sealed class ProtobufContractRoundTripTests Assert.Contains(service.Methods, method => method.Name == "CloseSession"); Assert.Contains(service.Methods, method => method.Name == "Invoke"); Assert.Contains(service.Methods, method => method.Name == "StreamEvents"); + Assert.Contains(service.Methods, method => method.Name == "AcknowledgeAlarm"); + Assert.Contains(service.Methods, method => method.Name == "QueryActiveAlarms"); } /// Verifies that worker envelope descriptor contains required correlation fields. @@ -198,4 +200,193 @@ public sealed class ProtobufContractRoundTripTests Assert.Equal(WorkerEnvelope.BodyOneofCase.WorkerCommand, parsed.BodyCase); Assert.Equal(MxCommand.PayloadOneofCase.Advise, parsed.WorkerCommand.Command.PayloadCase); } + + /// Verifies that an OnAlarmTransition event round-trips with full payload. + [Fact] + public void Event_RoundTripsOnAlarmTransitionWithFullPayload() + { + var raise = Timestamp.FromDateTime(new DateTime(2026, 5, 1, 12, 0, 0, DateTimeKind.Utc)); + var ack = Timestamp.FromDateTime(new DateTime(2026, 5, 1, 12, 0, 30, DateTimeKind.Utc)); + var original = new MxEvent + { + Family = MxEventFamily.OnAlarmTransition, + SessionId = "session-1", + WorkerSequence = 99, + WorkerTimestamp = ack, + GatewayReceiveTimestamp = ack, + OnAlarmTransition = new OnAlarmTransitionEvent + { + AlarmFullReference = "Tank01.Level.HiHi", + SourceObjectReference = "Tank01", + AlarmTypeName = "AnalogLimitAlarm.HiHi", + TransitionKind = AlarmTransitionKind.Acknowledge, + Severity = 750, + OriginalRaiseTimestamp = raise, + TransitionTimestamp = ack, + OperatorUser = "operator1", + OperatorComment = "investigating", + Category = "Process", + Description = "Tank 01 high-high level", + CurrentValue = new MxValue + { + DataType = MxDataType.Float, + FloatValue = 95.4f, + VariantType = "VT_R4", + }, + LimitValue = new MxValue + { + DataType = MxDataType.Float, + FloatValue = 90.0f, + VariantType = "VT_R4", + }, + }, + }; + + var parsed = MxEvent.Parser.ParseFrom(original.ToByteArray()); + + Assert.Equal(original, parsed); + Assert.Equal(MxEvent.BodyOneofCase.OnAlarmTransition, parsed.BodyCase); + Assert.Equal(AlarmTransitionKind.Acknowledge, parsed.OnAlarmTransition.TransitionKind); + Assert.Equal(raise, parsed.OnAlarmTransition.OriginalRaiseTimestamp); + Assert.Equal("operator1", parsed.OnAlarmTransition.OperatorUser); + } + + /// Verifies that an OnAlarmTransition event round-trips with only the required fields populated. + [Fact] + public void Event_RoundTripsOnAlarmTransitionWithOptionalFieldsEmpty() + { + var raise = Timestamp.FromDateTime(new DateTime(2026, 5, 1, 12, 0, 0, DateTimeKind.Utc)); + var original = new MxEvent + { + Family = MxEventFamily.OnAlarmTransition, + SessionId = "session-1", + WorkerSequence = 100, + OnAlarmTransition = new OnAlarmTransitionEvent + { + AlarmFullReference = "Tank01.Level.HiHi", + AlarmTypeName = "AnalogLimitAlarm.HiHi", + TransitionKind = AlarmTransitionKind.Raise, + Severity = 750, + TransitionTimestamp = raise, + }, + }; + + var parsed = MxEvent.Parser.ParseFrom(original.ToByteArray()); + + Assert.Equal(original, parsed); + Assert.Equal(string.Empty, parsed.OnAlarmTransition.OperatorUser); + Assert.Equal(string.Empty, parsed.OnAlarmTransition.OperatorComment); + Assert.Null(parsed.OnAlarmTransition.OriginalRaiseTimestamp); + Assert.Null(parsed.OnAlarmTransition.CurrentValue); + } + + /// Verifies that an MxEvent body oneof rejects multiple bodies — last write wins per proto3 semantics. + [Fact] + public void Event_OneofGuard_LastBodyWins() + { + var ev = new MxEvent + { + Family = MxEventFamily.OnAlarmTransition, + OnDataChange = new OnDataChangeEvent(), + OnAlarmTransition = new OnAlarmTransitionEvent + { + AlarmFullReference = "X", + TransitionKind = AlarmTransitionKind.Raise, + }, + }; + + Assert.Equal(MxEvent.BodyOneofCase.OnAlarmTransition, ev.BodyCase); + Assert.Null(ev.OnDataChange); + } + + /// Verifies that AcknowledgeAlarmRequest round-trips through serialization. + [Fact] + public void AcknowledgeAlarmRequest_RoundTripsAllFields() + { + var original = new AcknowledgeAlarmRequest + { + SessionId = "session-1", + ClientCorrelationId = "client-correlation-7", + AlarmFullReference = "Tank01.Level.HiHi", + Comment = "shift handover", + OperatorUser = "operator2", + }; + + var parsed = AcknowledgeAlarmRequest.Parser.ParseFrom(original.ToByteArray()); + + Assert.Equal(original, parsed); + } + + /// Verifies that AcknowledgeAlarmReply round-trips with status, hresult, and diagnostics. + [Fact] + public void AcknowledgeAlarmReply_RoundTripsStatusAndHresult() + { + var original = new AcknowledgeAlarmReply + { + SessionId = "session-1", + CorrelationId = "gateway-correlation-7", + ProtocolStatus = new ProtocolStatus { Code = ProtocolStatusCode.Ok }, + Hresult = 0, + Status = new MxStatusProxy + { + Success = 1, + Category = MxStatusCategory.Ok, + DetectedBy = MxStatusSource.RespondingLmx, + }, + DiagnosticMessage = "ack accepted", + }; + + var parsed = AcknowledgeAlarmReply.Parser.ParseFrom(original.ToByteArray()); + + Assert.Equal(original, parsed); + Assert.True(parsed.HasHresult); + } + + /// Verifies that ActiveAlarmSnapshot round-trips with current state and operator metadata. + [Fact] + public void ActiveAlarmSnapshot_RoundTripsAllFields() + { + var raise = Timestamp.FromDateTime(new DateTime(2026, 5, 1, 12, 0, 0, DateTimeKind.Utc)); + var ack = Timestamp.FromDateTime(new DateTime(2026, 5, 1, 12, 0, 30, DateTimeKind.Utc)); + var original = new ActiveAlarmSnapshot + { + AlarmFullReference = "Tank01.Level.HiHi", + SourceObjectReference = "Tank01", + AlarmTypeName = "AnalogLimitAlarm.HiHi", + Severity = 750, + OriginalRaiseTimestamp = raise, + CurrentState = AlarmConditionState.ActiveAcked, + Category = "Process", + Description = "Tank 01 high-high level", + LastTransitionTimestamp = ack, + OperatorUser = "operator2", + OperatorComment = "investigating", + }; + + var parsed = ActiveAlarmSnapshot.Parser.ParseFrom(original.ToByteArray()); + + Assert.Equal(original, parsed); + Assert.Equal(AlarmConditionState.ActiveAcked, parsed.CurrentState); + } + + /// Verifies that QueryActiveAlarmsRequest round-trips empty filter prefix. + [Fact] + public void QueryActiveAlarmsRequest_RoundTripsWithAndWithoutFilter() + { + var withoutFilter = new QueryActiveAlarmsRequest + { + SessionId = "session-1", + ClientCorrelationId = "client-correlation-8", + }; + + var withFilter = new QueryActiveAlarmsRequest + { + SessionId = "session-1", + ClientCorrelationId = "client-correlation-9", + AlarmFilterPrefix = "Tank01.", + }; + + Assert.Equal(withoutFilter, QueryActiveAlarmsRequest.Parser.ParseFrom(withoutFilter.ToByteArray())); + Assert.Equal(withFilter, QueryActiveAlarmsRequest.Parser.ParseFrom(withFilter.ToByteArray())); + } } -- 2.52.0