/////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2017-2018  Ericsson AB
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// which accompanies this distribution, and is available at
// http://www.eclipse.org/legal/epl-v10.html
/////////////////////////////////////////////////////////////////////////////////////
// Contributors:
// Akos Makovics
//
//  File:         UpcUa_Message_Templates.ttcn
//  Rev:          <RnXnn>
//  Prodnr:       CNL113861
/////////////////////////////////////////////////////////////////////////////////////

module OpcUa_Message_Templates {

  import from OpcUa_Types_Binary all;
  import from OpcUa_Templates_Binary all;

  /////////////////////////////////////////////////////////////
  //                                                         //
  //                       General                           //
  //                                                         //
  /////////////////////////////////////////////////////////////

  template MessageChunk tr_baseResponseMessage := {
    header := ?,
    transportMessage := *,
    securityChannelId := *,
    securePolicyUri := *,
    senderCertificate := *,
    receiverCertificateThumbprint := *,
    securityTokenId := *,
    sequenceHeader := *,
    body := *
  }

  const RequestHeader reqHeader := {
    authenticationToken := {
      mask := 0,
	  namespaceUriBit := 0,
	  serverIndexBit := 0,
      reservedBit1 := 0,
	  reservedBit2 := 0,
	  IdType := {
	    twoByte := {
	      nodeValue := 0
	    }
      }
    },
    timestamp := 131556452504050000,
    requestHandle := 4,
    returnDiagnostics := 0,
    auditEntryId := { nullString := { arrayLength := -2147483647 } },
    timeoutHint := 0,
    additionalHeader := {
      typeId := {
        node := {
	      mask := 0,
	      namespaceUriBit := 0,
	  	  serverIndexBit := 0,
		  reservedBit1 := 0,
		  reservedBit2 := 0,
		  IdType := {
		    twoByte := {
		      nodeValue := 0
	        }
	      }
	    },
	    namespaceUri := omit,
	    serverIndex := omit
	  },
	  Value := 0
    }
  }

  const RequestHeader reqHeaderFourByte := {
    authenticationToken := {
      mask := 5,
      namespaceUriBit := 0,
      serverIndexBit := 0,
      reservedBit1 := 0,
      reservedBit2 := 0,
      IdType := {
        byteString := {
          nameSpace := 0,
          nodeValue := {
            realByteString := {
		      lengthValue := 16,
			  byteStringValue := { 213, 222, 175, 58, 50, 191, 56, 110, 161, 40, 190, 206, 46, 98, 162, 70 }
            }
		  }
        }
      }
    },
    timestamp := 131556452504610000,
    requestHandle := 4,
    returnDiagnostics := 0,
    auditEntryId := {
      realString := {
        stringLength := 0,
        stringValue := ""
      }
    },
    timeoutHint := 0,
    additionalHeader := {
      typeId := {
        node := {
          mask := 0,
          namespaceUriBit := 0,
          serverIndexBit := 0,
          reservedBit1 := 0,
          reservedBit2 := 0,
          IdType := {
            twoByte := {
              nodeValue := 0
            }
          }
        },
        namespaceUri := omit,
        serverIndex := omit
      },
      Value := 0
    }
  }

  const ResponseHeader respHeader := {
    timestamp := 131563360189870000,
    requestHandle := 1,
    serviceResult := 0,
    serviceDiagnostics := {
      symbolicIdBit := 0,
      namespaceUriBit := 0,
      localeBit := 0,
      localisedTextBit := 0,
      additionalInfoBit := 0,
      innerStatusCodeBit := 0,
      innerDiagnosticInfoBit := 0,
      reserveBit := 0,
      symbolicId := omit,
      namespaceUri := omit,
      locale := omit,
      localisedText := omit,
      additionalInfo := omit,
      innerStatusCode := omit,
      innerDiagnosticInfo := omit
    },
    stringTable := {
      realArray := {
        arrayLength := 0,
        arrayValues := { }
      }
    },
    additionalHeader := {
      typeId := {
        node := {
          mask := 0,
          namespaceUriBit := 0,
          serverIndexBit := 0,
          reservedBit1 := 0,
          reservedBit2 := 0,
          IdType := {
            twoByte := {
              nodeValue := 0
            }
          }
        },
        namespaceUri := omit,
        serverIndex := omit
      },
      Value := 0
    }
  }

  template UserTokenPolicy userTokenPolicy := {
      policyId := valueof(tr_String("username_basic256")),
      tokenType := USERNAME_1,
      issuedTokenType := valueof(tr_StringNull),
      issuerEndpointUrl := valueof(tr_StringNull),
      securityPolicyUri := valueof(tr_String("http://opcfoundation.org/UA/SecurityPolicy#Basic256"))
    }

  template EndpointDescription endpointDesc := {
    endpointUrl := valueof(tr_String("opc.tcp://zmakako-VirtualBox:4334/UA/MyLittleServer")),
    server := {
      applicationUri := valueof(tr_String("urn:NodeOPCUA-Server-default")),
      productUri := valueof(tr_String("NodeOPCUA-Server")),
      applicationName := {
        localeBit := 0,
        textBit := 1,
        spareBit1 := 0,
        spareBit2 := 0,
        spareBit3 := 0,
        spareBit4 := 0,
        spareBit5 := 0,
        spareBit6 := 0,
        locale := omit,
        text := valueof(tr_String("NodeOPCUA"))
      },
      applicationType := SERVER_0,
      gatewayServerUri := valueof(tr_String("")),
      discoveryProfileUri := valueof(tr_String("")),
      discoveryUrls := valueof(tr_ListOfString( {} ))
    },
    serverCertificate := valueof(tr_ByteString( {48, 130, 4} )),
    securityMode := NONE_1,
    securityPolicyUri := valueof(tr_String("http://opcfoundation.org/UA/SecurityPolicy#None")),
    userIdentityTokens := valueof(tr_ListOfUserTokenPolicy( {valueof(userTokenPolicy)} )),
    transportProfileUri := valueof(tr_String("http://opcfoundation.org/UA-Profile/Transport/uatcp-uasc-uabinary")),
    securityLevel := 3
  }

  /////////////////////////////////////////////////////////////
  //                                                         //
  //                     Hello Message                       //
  //                                                         //
  /////////////////////////////////////////////////////////////

  function f_GetHelloMessage() return octetstring {
    var MessageHeader v_header := valueof(tr_HeaderHello);

    var HelloMessage v_body := {
      version := 0,
      receiveBufferSize := 655360,
      sendBufferSize := 655360,
      maxMessageSize := 0,
      maxChunkCount := 0,
      endPointUrl := valueof(tr_String("opc.tcp://zmakako-VirtualBox:4334/UA/MyLittleServer"))
    }

    var MessageChunk v_msg := valueof(tr_MessageHello(v_header, v_body));

    return enc_MessageChunk (v_msg);
  }



  /////////////////////////////////////////////////////////////
  //                                                         //
  //                      Ack Message                        //
  //                                                         //
  /////////////////////////////////////////////////////////////

  function f_GetAckMessage() return template MessageChunk {

    template MessageChunk responseChunk modifies tr_baseResponseMessage := {
      header := {
        messageType := AckHeaderMsgType,
        chunkType := FinalChunk,
        messageSize := ?
      }
    }

    return responseChunk;
  }

  /////////////////////////////////////////////////////////////
  //                                                         //
  //                OpenSecureChannelRequest                 //
  //                                                         //
  /////////////////////////////////////////////////////////////

  function f_GetOpenSecureChannelRequest() return octetstring {
    var MessageHeader v_header := valueof(tr_HeaderOpenSecureChannel);

    var UInt32 v_securityChannelId := 0;
    var ListOfByte v_securePolicyUri := valueof(tr_ListOfByte({ 104, 116, 116, 112, 58, 47, 47, 111, 112, 99, 102, 111, 117, 110, 100, 97, 116, 105, 111, 110, 46, 111, 114, 103, 47, 85, 65, 47, 83, 101, 99, 117, 114, 105, 116, 121, 80, 111, 108, 105, 99, 121, 35, 78, 111, 110, 101 }));
    var ListOfByte v_senderCertificate := valueof(tr_ListOfByteNull);
    var ListOfByte v_receiverCertificateThumbprint := valueof(tr_ListOfByteNull);
    var SequenceHeader v_sequenceHeader := {
      SequenceNumber := 1,
      RequestId := 1
    }

    var OpenSecureChannelRequest v_openSecReq := {
      requestHeader := reqHeader,
      clientProtocolVersion := 0,
      requestType := ISSUE_0,
      securityMode := NONE_1,
      clientNonce := valueof(tr_ByteStringNull),
      requestedLifetime := 600000
    }

    var ServiceBody v_service := {
      encodingByte := 1,
      namespaceIndex := 0,
      nodeValue := 0,
      list := {
        OpenSecureChannelRequest := v_openSecReq
      }
    }

    var octetstring v_encodedBody := enc_ServiceBody(v_service);

    var MessageChunk v_msg := valueof(tr_MessageOpenSecureChannel(v_header, v_securityChannelId, v_securePolicyUri, v_senderCertificate, v_receiverCertificateThumbprint, v_sequenceHeader, v_encodedBody));
    return enc_MessageChunk (v_msg);
  }

  /////////////////////////////////////////////////////////////
  //                                                         //
  //                OpenSecureChannelResponse                //
  //                                                         //
  /////////////////////////////////////////////////////////////

  function f_GetOpenSecureChannelResponse() return template MessageChunk {

    template MessageChunk responseChunk modifies tr_baseResponseMessage := {
      header := {
        messageType := OpenSecureChannelMsgType,
        chunkType := FinalChunk,
        messageSize := ?
      }
    }

    return responseChunk;
  }

  /////////////////////////////////////////////////////////////
  //                                                         //
  //                    GetEndpointsRequest                  //
  //                                                         //
  /////////////////////////////////////////////////////////////

  function f_GetEndpointsRequest() return octetstring {
    var MessageHeader v_header := valueof(tr_HeaderService);

    var UInt32 v_securityChannelId := 1;
    var UInt32 v_securityTokenId := 1
    var SequenceHeader v_sequenceHeader := {
      SequenceNumber := 2,
      RequestId := 2
    }

    var GetEndpointsRequest v_getEndpointsReq := {
      requestHeader := reqHeader,
      endpointUrl := valueof(tr_String( "" )),
      localeIds := valueof(tr_ListOfLocaleId ( {} )),
      profileUris := valueof(tr_ListOfString ( {} ))
    }

    var ServiceBody v_service := {
      encodingByte := 1,
      namespaceIndex := 0,
      nodeValue := 0,
      list := {
        GetEndpointsRequest := v_getEndpointsReq
      }
    }

    var octetstring v_encodedBody := enc_ServiceBody(v_service);
    var MessageChunk v_msg := valueof(tr_MessageCloseSecureChannel(v_header, v_securityChannelId, v_securityTokenId, v_sequenceHeader, v_encodedBody));
    return enc_MessageChunk (v_msg);
  }

  /////////////////////////////////////////////////////////////
  //                                                         //
  //                 CreateSessionRequest                    //
  //                                                         //
  /////////////////////////////////////////////////////////////

  function f_GetCreateSessionRequest() return octetstring {
    var MessageHeader v_header := valueof(tr_HeaderService);

    var UInt32 v_securityChannelId := 1;
    var UInt32 v_securityTokenId := 1
    var SequenceHeader v_sequenceHeader := {
      SequenceNumber := 3,
      RequestId := 3
    }

    var CreateSessionRequest v_createSessionReq := {
      requestHeader := reqHeader,
      clientDescription := {
        applicationUri := valueof(tr_String( "urn:zmakako-VirtualBox:Node-OPCUA-Server" )),
        productUri := valueof(tr_String( "NodeOPCUA-Client" )),
        applicationName := {
          localeBit := 0,
          textBit := 1,
          spareBit1 := 0,
          spareBit2 := 0,
          spareBit3 := 0,
          spareBit4 := 0,
          spareBit5 := 0,
          spareBit6 := 0,
          locale := omit,
          text := valueof(tr_String( "NodeOPCUA-Client" ))
        },
        applicationType := CLIENT_1,
        gatewayServerUri := valueof(tr_String( "" )),
        discoveryProfileUri := valueof(tr_String( "" )),
        discoveryUrls := valueof(tr_ListOfString({}))
      },
      serverUri := valueof(tr_String( "urn:NodeOPCUA-Server-default" )),
      endpointUrl := valueof(tr_String( "opc.tcp://zmakako-VirtualBox:4334/UA/MyLittleServer" )),
      sessionName := valueof(tr_String( "Session1" )),
      clientNonce := valueof(tr_ByteString( {103, 70, 147, 188, 171, 213, 166, 143, 188, 174, 139, 130, 248, 135, 93, 222, 115, 134, 67, 84, 89, 51, 182, 246, 95, 47, 244, 69, 162, 87, 120, 54} )),
      clientCertificate := valueof(tr_ByteString( { 48, 130, 4, 172, 48, 130, 3, 148, 160, 3, 2, 1, 2, 2, 9, 0, 193, 232, 116, 99, 18, 62, 6, 87, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 11, 5, 0, 48, 88, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 70, 82, 49, 12, 48, 10, 6, 3, 85, 4, 8, 19, 3, 73, 68, 70, 49, 14, 48, 12, 6, 3, 85, 4, 7, 19, 5, 80, 97, 114, 105, 115, 49, 18, 48, 16, 6, 3, 85, 4, 10, 19, 9, 78, 111, 100, 101, 79, 80, 67, 85, 65, 49, 23, 48, 21, 6, 3, 85, 4, 3, 19, 14, 78, 111, 100, 101, 79, 80, 67, 85, 65, 45, 84, 69, 83, 84, 48, 30, 23, 13, 49, 55, 49, 48, 49, 57, 48, 57, 50, 53, 51, 50, 90, 23, 13, 51, 50, 49, 48, 49, 53, 48, 57, 50, 53, 51, 50, 90, 48, 88, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 70, 82, 49, 12, 48, 10, 6, 3, 85, 4, 8, 19, 3, 73, 68, 70, 49, 14, 48, 12, 6, 3, 85, 4, 7, 19, 5, 80, 97, 114, 105, 115, 49, 18, 48, 16, 6, 3, 85, 4, 10, 19, 9, 78, 111, 100, 101, 79, 80, 67, 85, 65, 49, 23, 48, 21, 6, 3, 85, 4, 3, 19, 14, 78, 111, 100, 101, 79, 80, 67, 85, 65, 45, 84, 69, 83, 84, 48, 130, 1, 34, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 130, 1, 15, 0, 48, 130, 1, 10, 2, 130, 1, 1, 0, 162, 249, 118, 193, 122, 59, 9, 123, 20, 81, 132, 230, 222, 31, 81, 153, 95, 230, 235, 165, 119, 149, 47, 216, 100, 87, 85, 235, 155, 201, 46, 49, 153, 192, 135, 198, 208, 239, 3, 173, 127, 215, 133, 117, 6, 21, 120, 154, 177, 14, 220, 215, 143, 17, 104, 15, 105, 187, 57, 59, 145, 222, 79, 62, 112, 222, 116, 40, 83, 121, 96, 179, 7, 77, 67, 70, 91, 253, 110, 243, 2, 81, 104, 228, 225, 144, 127, 148, 248, 156, 216, 58, 197, 3, 51, 50, 199, 161, 26, 172, 237, 196, 225, 4, 6, 119, 147, 181, 126, 190, 36, 200, 233, 199, 193, 65, 191, 36, 90, 76, 127, 20, 121, 206, 146, 82, 191, 69, 5, 49, 212, 72, 182, 75, 41, 131, 110, 194, 181, 235, 28, 96, 205, 132, 150, 179, 171, 90, 170, 66, 190, 90, 141, 117, 180, 203, 175, 232, 36, 50, 221, 64, 115, 64, 13, 0, 84, 195, 97, 154, 52, 5, 156, 114, 95, 30, 192, 69, 179, 74, 148, 67, 181, 216, 51, 129, 195, 120, 211, 1, 114, 14, 148, 139, 211, 231, 91, 128, 26, 63, 36, 99, 193, 148, 251, 251, 76, 231, 95, 84, 68, 212, 235, 101, 119, 68, 15, 238, 199, 232, 239, 3, 228, 124, 41, 133, 193, 108, 180, 218, 49, 13, 140, 13, 43, 187, 108, 60, 6, 163, 251, 202, 53, 180, 177, 141, 114, 45, 39, 236, 196, 248, 61, 33, 142, 215, 2, 3, 1, 0, 1, 163, 130, 1, 119, 48, 130, 1, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 17, 124, 191, 30, 233, 154, 127, 115, 204, 254, 168, 65, 112, 82, 167, 146, 191, 42, 85, 25, 48, 129, 137, 6, 3, 85, 29, 35, 4, 129, 129, 48, 127, 128, 20, 17, 124, 191, 30, 233, 154, 127, 115, 204, 254, 168, 65, 112, 82, 167, 146, 191, 42, 85, 25, 161, 92, 164, 90, 48, 88, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 70, 82, 49, 12, 48, 10, 6, 3, 85, 4, 8, 19, 3, 73, 68, 70, 49, 14, 48, 12, 6, 3, 85, 4, 7, 19, 5, 80, 97, 114, 105, 115, 49, 18, 48, 16, 6, 3, 85, 4, 10, 19, 9, 78, 111, 100, 101, 79, 80, 67, 85, 65, 49, 23, 48, 21, 6, 3, 85, 4, 3, 19, 14, 78, 111, 100, 101, 79, 80, 67, 85, 65, 45, 84, 69, 83, 84, 130, 9, 0, 193, 232, 116, 99, 18, 62, 6, 87, 48, 12, 6, 3, 85, 29, 19, 4, 5, 48, 3, 1, 1, 255, 48, 14, 6, 3, 85, 29, 15, 1, 1, 255, 4, 4, 3, 2, 1, 6, 48, 95, 6, 9, 96, 134, 72, 1, 134, 248, 66, 1, 13, 4, 82, 22, 80, 83, 101, 108, 102, 83, 105, 103, 110, 101, 100, 32, 67, 101, 114, 116, 105, 102, 105, 99, 97, 116, 101, 32, 103, 101, 110, 101, 114, 97, 116, 101, 100, 32, 98, 121, 32, 78, 111, 100, 101, 45, 79, 80, 67, 85, 65, 32, 67, 101, 114, 116, 105, 102, 105, 99, 97, 116, 101, 32, 117, 116, 105, 108, 105, 116, 121, 32, 117, 115, 105, 110, 103, 32, 111, 112, 101, 110, 115, 115, 108, 48, 71, 6, 3, 85, 29, 17, 4, 64, 48, 62, 134, 40, 117, 114, 110, 58, 122, 109, 97, 107, 97, 107, 111, 45, 86, 105, 114, 116, 117, 97, 108, 66, 111, 120, 58, 78, 111, 100, 101, 45, 79, 80, 67, 85, 65, 45, 83, 101, 114, 118, 101, 114, 130, 18, 122, 109, 97, 107, 97, 107, 111, 45, 86, 105, 114, 116, 117, 97, 108, 66, 111, 120, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 11, 5, 0, 3, 130, 1, 1, 0, 22, 137, 144, 225, 128, 121, 63, 231, 142, 198, 56, 192, 141, 111, 226, 217, 215, 23, 136, 6, 246, 32, 201, 216, 83, 191, 107, 116, 101, 236, 227, 174, 40, 89, 16, 196, 106, 206, 58, 44, 57, 190, 231, 202, 222, 55, 3, 168, 5, 103, 54, 33, 245, 247, 158, 62, 14, 112, 252, 208, 199, 100, 88, 213, 165, 102, 115, 74, 184, 43, 25, 9, 189, 163, 137, 161, 77, 181, 46, 144, 124, 165, 161, 118, 16, 41, 139, 181, 209, 148, 149, 224, 171, 144, 145, 100, 226, 44, 24, 66, 28, 51, 227, 20, 25, 83, 242, 103, 94, 196, 143, 192, 51, 243, 186, 84, 113, 168, 82, 52, 244, 119, 221, 183, 151, 180, 112, 254, 132, 85, 243, 150, 149, 132, 233, 19, 190, 98, 178, 166, 90, 4, 136, 187, 43, 107, 11, 96, 124, 28, 0, 114, 9, 225, 161, 234, 23, 18, 67, 210, 67, 62, 65, 72, 55, 22, 82, 33, 147, 226, 174, 198, 179, 177, 213, 77, 54, 146, 15, 11, 109, 169, 116, 143, 70, 183, 213, 36, 114, 114, 131, 3, 164, 221, 35, 226, 221, 20, 11, 15, 248, 241, 151, 61, 229, 12, 151, 80, 69, 33, 56, 204, 248, 42, 78, 185, 61, 146, 254, 196, 188, 51, 129, 226, 133, 167, 193, 58, 159, 148, 222, 249, 96, 143, 122, 178, 30, 201, 40, 197, 240, 101, 58, 71, 87, 229, 138, 96, 24, 191, 194, 35, 23, 123, 136, 20} )),
      requestedSessionTimeout := 60000.0,
      maxResponseMessageSize := 800000
    }

    var ServiceBody v_service := {
      encodingByte := 1,
      namespaceIndex := 0,
      nodeValue := 0,
      list := {
        CreateSessionRequest := v_createSessionReq
      }
    }

    var octetstring v_encodedBody := enc_ServiceBody(v_service);
    var MessageChunk v_msg := valueof(tr_MessageCloseSecureChannel(v_header, v_securityChannelId, v_securityTokenId, v_sequenceHeader, v_encodedBody));

    return enc_MessageChunk (v_msg);
  }

  /////////////////////////////////////////////////////////////
  //                                                         //
  //                ActivateSessionRequest                   //
  //                                                         //
  /////////////////////////////////////////////////////////////

  function f_GetActivateSessionRequest() return octetstring {
    var MessageHeader v_header := valueof(tr_HeaderService);

    var UInt32 v_securityChannelId := 1;
    var UInt32 v_securityTokenId := 1
    var SequenceHeader v_sequenceHeader := {
      SequenceNumber := 4,
      RequestId := 4
    }

    var ActivateSessionRequest v_activateSessionReq := {
      requestHeader := reqHeaderFourByte,
      clientSignature := {
        algorithm := valueof(tr_StringNull),
        Signature := valueof(tr_ByteStringNull)
      },
      clientSoftwareCertificates := valueof(tr_ListOfSignedSoftwareCertificate({})),
      localeIds := valueof(tr_ListOfLocaleId({})),
      userIdentityToken := {
        encodingByte := 1,
        twoByteNodeValue := omit,
        namespaceIndex := 0,
        fourByteNodeValue := 321,
        encoding := 1,
        parameterLength := 13,
        extensibleParameterBody := {
          anonymousIdentityToken := {
            policyId := valueof(tr_String( "anonymous"))
          }
        }
      },
      userTokenSignature := {
        algorithm := valueof(tr_StringNull),
        Signature := valueof(tr_ByteStringNull)
      }
    }

    var ServiceBody v_service := {
      encodingByte := 1,
      namespaceIndex := 0,
      nodeValue := 0,
      list := {
        ActivateSessionRequest := v_activateSessionReq
      }
    }

    var octetstring v_encodedBody := enc_ServiceBody(v_service);
    var MessageChunk v_msg := valueof(tr_MessageCloseSecureChannel(v_header, v_securityChannelId, v_securityTokenId, v_sequenceHeader, v_encodedBody));


    var octetstring res := enc_MessageChunk (v_msg);
    log (lengthof(res));
    log("=======================");

    return enc_MessageChunk (v_msg);
  }

  /////////////////////////////////////////////////////////////
  //                                                         //
  //                    BrowseRequest                        //
  //                                                         //
  /////////////////////////////////////////////////////////////

  function f_GetBrowseRequest() return octetstring {
    var MessageHeader v_header := valueof(tr_HeaderService);

    var UInt32 v_securityChannelId := 1;
    var UInt32 v_securityTokenId := 1
    var SequenceHeader v_sequenceHeader := {
      SequenceNumber := 5,
      RequestId := 5
    }

    var BrowseRequest v_browseReq := {
      requestHeader := {
        authenticationToken := {
          mask := 5,
          namespaceUriBit := 0,
          serverIndexBit := 0,
          reservedBit1 := 0,
          reservedBit2 := 0,
          IdType := {
            byteString := {
              nameSpace := 0,
              nodeValue := {
                realByteString := {
                  lengthValue := 16,
                  byteStringValue := {
                    213,
                    222,
                    175,
                    58,
                    50,
                    191,
                    56,
                    110,
                    161,
                    40,
                    190,
                    206,
                    46,
                    98,
                    162,
                    70
                  }
                }
              }
            }
          }
        },
        timestamp := 131556452505810000,
        requestHandle := 5,
        returnDiagnostics := 0,
        auditEntryId := {
          realString := {
            stringLength := 0,
            stringValue := ""
          }
        },
        timeoutHint := 0,
        additionalHeader := {
          typeId := {
            node := {
              mask := 0,
              namespaceUriBit := 0,
              serverIndexBit := 0,
              reservedBit1 := 0,
              reservedBit2 := 0,
              IdType := {
                twoByte := {
                  nodeValue := 0
                }
              }
            },
            namespaceUri := omit,
            serverIndex := omit
          },
          Value := 0
        }
      },
      view := {
        viewId := {
          mask := 0,
          namespaceUriBit := 0,
          serverIndexBit := 0,
          reservedBit1 := 0,
          reservedBit2 := 0,
          IdType := {
            twoByte := {
              nodeValue := 0
            }
          }
        },
        timestamp := 0,
        viewVersion := 0
      },
      requestedMaxReferencesPerNode := 10000,
      nodesToBrowse := {
        realArray := {
          arrayLength := 1,
          arrayValues := {
            {
              nodeId := {
                mask := 0,
                namespaceUriBit := 0,
                serverIndexBit := 0,
                reservedBit1 := 0,
                reservedBit2 := 0,
                IdType := {
                  twoByte := {
                    nodeValue := 84
                  }
                }
              },
              browseDirection := BOTH_2,
              referenceTypeId := {
                mask := 0,
                namespaceUriBit := 0,
                serverIndexBit := 0,
                reservedBit1 := 0,
                reservedBit2 := 0,
                IdType := {
                  twoByte := {
                    nodeValue := 0
                  }
                }
              },
              includeSubtypes := 1,
              nodeClassMask := 0,
              resultMask := 63
            }
          }
        }
      }
    }

    var ServiceBody v_service := {
      encodingByte := 1,
      namespaceIndex := 0,
      nodeValue := 0,
      list := {
        BrowseRequest := v_browseReq
      }
    }

    var octetstring v_encodedBody := enc_ServiceBody(v_service);
    var MessageChunk v_msg := valueof(tr_MessageCloseSecureChannel(v_header, v_securityChannelId, v_securityTokenId, v_sequenceHeader, v_encodedBody));

    return enc_MessageChunk (v_msg);
  }

  /////////////////////////////////////////////////////////////
  //                                                         //
  //                     ReadRequest                         //
  //                                                         //
  /////////////////////////////////////////////////////////////

  function f_GetReadRequest() return octetstring {
    var MessageHeader v_header := valueof(tr_HeaderService);

    var UInt32 v_securityChannelId := 1;
    var UInt32 v_securityTokenId := 1
    var SequenceHeader v_sequenceHeader := {
      SequenceNumber := 6,
      RequestId := 6
    }

    var ReadRequest v_readReq := {
      requestHeader := {
        authenticationToken := {
          mask := 5,
          namespaceUriBit := 0,
          serverIndexBit := 0,
          reservedBit1 := 0,
          reservedBit2 := 0,
          IdType := {
            byteString := {
              nameSpace := 0,
              nodeValue := valueof(tr_ByteString( { 213, 222, 175, 58, 50, 191, 56, 110, 161, 40, 190, 206, 46, 98, 162, 70 } ))
            }
          }
        },
        timestamp := 131556452505980000,
        requestHandle := 7,
        returnDiagnostics := 0,
        auditEntryId := {
          realString := {
            stringLength := 0,
            stringValue := ""
          }
        },
        timeoutHint := 0,
        additionalHeader := {
          typeId := {
            node := {
              mask := 0,
              namespaceUriBit := 0,
              serverIndexBit := 0,
              reservedBit1 := 0,
              reservedBit2 := 0,
              IdType := {
                twoByte := {
                  nodeValue := 0
                }
              }
            },
            namespaceUri := omit,
            serverIndex := omit
          },
          Value := 0
        }
      },
      maxAge := 0.0,
      timestampsToReturn := BOTH_2,
      nodesToRead := {
        realArray := {
          arrayLength := 1,
          arrayValues := {
            {
              nodeId := {
                mask := 3,
                namespaceUriBit := 0,
                serverIndexBit := 0,
                reservedBit1 := 0,
                reservedBit2 := 0,
                IdType := {
                  string := {
                    nameSpace := 1,
                    nodeValue :=  valueof (tr_String("free_memory"))
                  }
                }
              },
              attributeId := 13,
              indexRange := valueof(tr_StringNull),
              dataEncoding := {
                namespaceIndex := 0,
                name :=  valueof(tr_StringNull)
              }
            }
          }
        }
      }
    }

    var ServiceBody v_service := {
      encodingByte := 1,
      namespaceIndex := 0,
      nodeValue := 0,
      list := {
        ReadRequest := v_readReq
      }
    }

    var octetstring v_encodedBody := enc_ServiceBody(v_service);
    var MessageChunk v_msg := valueof(tr_MessageCloseSecureChannel(v_header, v_securityChannelId, v_securityTokenId, v_sequenceHeader, v_encodedBody));

    return enc_MessageChunk (v_msg);
  }

  /////////////////////////////////////////////////////////////
  //                                                         //
  //               CreateSubscriptionRequest                 //
  //                                                         //
  /////////////////////////////////////////////////////////////

  function f_GetCreateSubscRequest() return octetstring {
    var MessageHeader v_header := valueof(tr_HeaderService);

    var UInt32 v_securityChannelId := 1;
    var UInt32 v_securityTokenId := 1
    var SequenceHeader v_sequenceHeader := {
      SequenceNumber := 6,
      RequestId := 6
    }

    var CreateSubscriptionRequest v_createSubsReq := {
      requestHeader := {
        authenticationToken := {
          mask := 5,
          namespaceUriBit := 0,
          serverIndexBit := 0,
          reservedBit1 := 0,
          reservedBit2 := 0,
          IdType := {
            byteString := {
              nameSpace := 0,
              nodeValue := {
                realByteString := {
                  lengthValue := 16,
                  byteStringValue := {
                    213,
                    222,
                    175,
                    58,
                    50,
                    191,
                    56,
                    110,
                    161,
                    40,
                    190,
                    206,
                    46,
                    98,
                    162,
                    70
                  }
                }
              }
            }
          }
        },
        timestamp := 131556452506070000,
        requestHandle := 8,
        returnDiagnostics := 0,
        auditEntryId := {
          realString := {
            stringLength := 0,
            stringValue := ""
          }
        },
        timeoutHint := 0,
        additionalHeader := {
          typeId := {
            node := {
              mask := 0,
              namespaceUriBit := 0,
              serverIndexBit := 0,
              reservedBit1 := 0,
              reservedBit2 := 0,
              IdType := {
                twoByte := {
                  nodeValue := 0
                }
              }
            },
            namespaceUri := omit,
            serverIndex := omit
          },
          Value := 0
        }
      },
      requestedPublishingInterval := 100.0,
      requestedLifetimeCount := 10,
      requestedMaxKeepAliveCount := 2,
      maxNotificationsPerPublish := 10,
      publishingEnabled := 1,
      priorityInt32 := 10
    }

    var ServiceBody v_service := {
      encodingByte := 1,
      namespaceIndex := 0,
      nodeValue := 0,
      list := {
        CreateSubscriptionRequest := v_createSubsReq
      }
    }

    var octetstring v_encodedBody := enc_ServiceBody(v_service);
    var MessageChunk v_msg := valueof(tr_MessageCloseSecureChannel(v_header, v_securityChannelId, v_securityTokenId, v_sequenceHeader, v_encodedBody));

    return enc_MessageChunk (v_msg);
  }

  /////////////////////////////////////////////////////////////
  //                                                         //
  //                   ServiceResponse                       //
  //                                                         //
  /////////////////////////////////////////////////////////////

  function f_GetServiceResponse() return template MessageChunk {

    template MessageChunk responseChunk modifies tr_baseResponseMessage := {
      header := {
        messageType := ServicesMsgType,
        chunkType := FinalChunk,
        messageSize := ?
      }
    }

    return responseChunk;
  }

  /////////////////////////////////////////////////////////////
  //                                                         //
  //                   CloseSessionRequest                   //
  //                                                         //
  /////////////////////////////////////////////////////////////

  function f_GetCloseSessionRequest() return octetstring {
    var MessageHeader v_header := valueof(tr_HeaderService);

    var UInt32 v_securityChannelId := 1;
    var UInt32 v_securityTokenId := 1
    var SequenceHeader v_sequenceHeader := {
      SequenceNumber := 21,
      RequestId := 21
    }

    var CloseSessionRequest v_closeSessionReq := {
      requestHeader := {
        authenticationToken := {
          mask := 5,
          namespaceUriBit := 0,
          serverIndexBit := 0,
          reservedBit1 := 0,
          reservedBit2 := 0,
          IdType := {
            byteString := {
              nameSpace := 0,
              nodeValue := {
                realByteString := {
                  lengthValue := 16,
                  byteStringValue := {
                    213,
                    222,
                    175,
                    58,
                    50,
                    191,
                    56,
                    110,
                    161,
                    40,
                    190,
                    206,
                    46,
                    98,
                    162,
                    70
                  }
                }
              }
            }
          }
        },
        timestamp := 131556452556620000,
        requestHandle := 20,
        returnDiagnostics := 0,
        auditEntryId := {
          realString := {
            stringLength := 0,
            stringValue := ""
          }
        },
        timeoutHint := 0,
        additionalHeader := {
          typeId := {
            node := {
              mask := 0,
              namespaceUriBit := 0,
              serverIndexBit := 0,
              reservedBit1 := 0,
              reservedBit2 := 0,
              IdType := {
                twoByte := {
                  nodeValue := 0
                }
              }
            },
            namespaceUri := omit,
            serverIndex := omit
          },
          Value := 0
        }
      },
      deleteSubscriptions := 1
    }

    var ServiceBody v_service := {
      encodingByte := 1,
      namespaceIndex := 0,
      nodeValue := 0,
      list := {
        CloseSessionRequest := v_closeSessionReq
      }
    }

    var octetstring v_encodedBody := enc_ServiceBody(v_service);
    var MessageChunk v_msg := valueof(tr_MessageCloseSecureChannel(v_header, v_securityChannelId, v_securityTokenId, v_sequenceHeader, v_encodedBody));

    return enc_MessageChunk(v_msg);
  }

  /////////////////////////////////////////////////////////////
  //                                                         //
  //                CloseSecureChannelRequest                //
  //                                                         //
  /////////////////////////////////////////////////////////////

  function f_GetCloseSecureChannelRequest() return octetstring {
    var MessageHeader v_header := valueof(tr_HeaderCloseSecureChannel);

    var UInt32 v_securityChannelId := 1;
    var UInt32 v_securityTokenId := 1
    var SequenceHeader v_sequenceHeader := {
      SequenceNumber := 21,
      RequestId := 21
    }

    var CloseSecureChannelRequest v_closeSecReq := {
      requestHeader := reqHeader
    }

    var ServiceBody v_service := {
      encodingByte := 1,
      namespaceIndex := 0,
      nodeValue := 0,
      list := {
        CloseSecureChannelRequest := v_closeSecReq
      }
    }

    var octetstring v_encodedBody := enc_ServiceBody(v_service);
    var MessageChunk v_msg := valueof(tr_MessageCloseSecureChannel(v_header, v_securityChannelId, v_securityTokenId, v_sequenceHeader, v_encodedBody));

    return enc_MessageChunk(v_msg);
  }
}
