Add deployment for ADML agent with http interface
authorEduardo Ramos Testillano (eramedu) <eduardo.ramos.testillano@ericsson.com>
Mon, 27 Apr 2020 00:13:57 +0000 (02:13 +0200)
committerEduardo Ramos Testillano (eramedu) <eduardo.ramos.testillano@ericsson.com>
Mon, 27 Apr 2020 00:23:47 +0000 (02:23 +0200)
Reuse ADML agent for aots-setup through symlink.
Centralize stacks with stacks examples. Some modifications
 needed in legacy scripts to reference new dictionary names.
Eval is needed in new start script in order to integrate
the httpServer calculation.

* Upgrade compiler to C++14 (to use std::quoted from iomanip)
* Improve HTTP handler to answer a json body with result (true/false)
  and data (description for the operation):
  {
    "result": "true",
    "data": "Success"
  }
* Fix core dump due to uninitialized 'sessionBasedModelsTypeEnum'
* New 'state' operation to now the state in real time for a test id.

84 files changed:
CMakeLists.txt
example/diameter/launcher/Launcher.cpp
example/diameter/launcher/Launcher.hpp
example/diameter/launcher/MyHandler.cpp
example/diameter/launcher/deploy-aots-adml.sh [new file with mode: 0755]
example/diameter/launcher/deploy-aots.sh
example/diameter/launcher/deploy-setups.sh
example/diameter/launcher/deployments/aots-adml/ACTIONS.md [new file with mode: 0644]
example/diameter/launcher/deployments/aots-adml/HINTS.md [new file with mode: 0644]
example/diameter/launcher/deployments/aots-adml/args.ft [new file with mode: 0644]
example/diameter/launcher/deployments/aots-adml/args.st [new file with mode: 0644]
example/diameter/launcher/deployments/aots-adml/services.xml.example [new file with mode: 0644]
example/diameter/launcher/deployments/aots-adml/stacks [new symlink]
example/diameter/launcher/deployments/aots-adml/start.sh [new file with mode: 0755]
example/diameter/launcher/deployments/aots-adml/stop.sh [new file with mode: 0755]
example/diameter/launcher/deployments/aots-setup/README.md [new file with mode: 0644]
example/diameter/launcher/deployments/aots-setup/agents/ADML [new symlink]
example/diameter/launcher/deployments/aots-setup/agents/HTTPMOCK/ACTIONS.md [new file with mode: 0644]
example/diameter/launcher/deployments/aots-setup/agents/HTTPMOCK/Provision.sh [new file with mode: 0755]
example/diameter/launcher/deployments/aots-setup/agents/KAFKA/ACTIONS.md [new file with mode: 0644]
example/diameter/launcher/deployments/aots-setup/agents/KAFKA/Admin.py [new file with mode: 0644]
example/diameter/launcher/deployments/aots-setup/agents/KAFKA/Consumer.py [new file with mode: 0644]
example/diameter/launcher/deployments/aots-setup/agents/KAFKA/Producer.py [new file with mode: 0644]
example/diameter/launcher/deployments/aots-setup/launcher.py [new file with mode: 0755]
example/diameter/launcher/deployments/aots-setup/loader.py [new file with mode: 0755]
example/diameter/launcher/deployments/aots-setup/tests.example/agents.yml [new file with mode: 0644]
example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch01-ipv4/1.Initial.yml [new file with mode: 0644]
example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch01-ipv4/2.Initial2.yml [new file with mode: 0644]
example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch01-ipv4/AAA.xml [new file with mode: 0644]
example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch01-ipv4/AAR.xml [new file with mode: 0644]
example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch01-ipv4/AAR2.xml [new file with mode: 0644]
example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch01-ipv4/expected.json.template [new file with mode: 0644]
example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch02-ipv6/1.Initial.yml [new file with mode: 0644]
example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch02-ipv6/2.Initial2.yml [new file with mode: 0644]
example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch02-ipv6/3.Initial3.yml [new file with mode: 0644]
example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch02-ipv6/AAA.xml [new file with mode: 0644]
example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch02-ipv6/AAR-ipv6.xml [new file with mode: 0644]
example/diameter/launcher/deployments/aots-setup/tests.example/ts02-errors/ch01-protocolErrors/1.MissingRealm.yml [new file with mode: 0644]
example/diameter/launcher/deployments/aots-setup/tests.example/ts02-errors/ch01-protocolErrors/AAA-bad.xml [new file with mode: 0644]
example/diameter/launcher/deployments/aots-setup/tests.example/ts02-errors/ch01-protocolErrors/AAR-bad.xml [new file with mode: 0644]
example/diameter/launcher/deployments/aots/README.md [deleted file]
example/diameter/launcher/deployments/aots/agents/ADML/ACTIONS.md [deleted file]
example/diameter/launcher/deployments/aots/agents/ADML/HINTS.md [deleted file]
example/diameter/launcher/deployments/aots/agents/ADML/args.ft [deleted file]
example/diameter/launcher/deployments/aots/agents/ADML/args.st [deleted file]
example/diameter/launcher/deployments/aots/agents/ADML/services.xml.example [deleted file]
example/diameter/launcher/deployments/aots/agents/ADML/stacks/DictionaryGx.16777238.xml [deleted file]
example/diameter/launcher/deployments/aots/agents/ADML/stacks/DictionaryRx.16777236.xml [deleted file]
example/diameter/launcher/deployments/aots/agents/ADML/stacks/DictionarySy.16777302.xml [deleted file]
example/diameter/launcher/deployments/aots/agents/ADML/stacks/diameter_base.0.xml [deleted file]
example/diameter/launcher/deployments/aots/agents/ADML/start.sh [deleted file]
example/diameter/launcher/deployments/aots/agents/ADML/stop.sh [deleted file]
example/diameter/launcher/deployments/aots/agents/HTTPMOCK/ACTIONS.md [deleted file]
example/diameter/launcher/deployments/aots/agents/HTTPMOCK/Provision.sh [deleted file]
example/diameter/launcher/deployments/aots/agents/KAFKA/ACTIONS.md [deleted file]
example/diameter/launcher/deployments/aots/agents/KAFKA/Admin.py [deleted file]
example/diameter/launcher/deployments/aots/agents/KAFKA/Consumer.py [deleted file]
example/diameter/launcher/deployments/aots/agents/KAFKA/Producer.py [deleted file]
example/diameter/launcher/deployments/aots/launcher.py [deleted file]
example/diameter/launcher/deployments/aots/loader.py [deleted file]
example/diameter/launcher/deployments/aots/tests.example/agents.yml [deleted file]
example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch01-ipv4/1.Initial.yml [deleted file]
example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch01-ipv4/2.Initial2.yml [deleted file]
example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch01-ipv4/AAA.xml [deleted file]
example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch01-ipv4/AAR.xml [deleted file]
example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch01-ipv4/AAR2.xml [deleted file]
example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch01-ipv4/expected.json.template [deleted file]
example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch02-ipv6/1.Initial.yml [deleted file]
example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch02-ipv6/2.Initial2.yml [deleted file]
example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch02-ipv6/3.Initial3.yml [deleted file]
example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch02-ipv6/AAA.xml [deleted file]
example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch02-ipv6/AAR-ipv6.xml [deleted file]
example/diameter/launcher/deployments/aots/tests.example/ts02-errors/ch01-protocolErrors/1.MissingRealm.yml [deleted file]
example/diameter/launcher/deployments/aots/tests.example/ts02-errors/ch01-protocolErrors/AAA-bad.xml [deleted file]
example/diameter/launcher/deployments/aots/tests.example/ts02-errors/ch01-protocolErrors/AAR-bad.xml [deleted file]
example/diameter/launcher/resources/stack_examples/0.xml [deleted file]
example/diameter/launcher/resources/stack_examples/16777236.xml [deleted file]
example/diameter/launcher/resources/stack_examples/16777238.xml [deleted file]
example/diameter/launcher/resources/stack_examples/16777302.xml [deleted file]
example/diameter/launcher/resources/stack_examples/DictionaryGx.16777238.xml [new file with mode: 0755]
example/diameter/launcher/resources/stack_examples/DictionaryRx.16777236.xml [new file with mode: 0755]
example/diameter/launcher/resources/stack_examples/DictionarySy.16777302.xml [new file with mode: 0755]
example/diameter/launcher/resources/stack_examples/diameter_base.0.xml [new file with mode: 0755]
include/anna/testing/TestCase.hpp

index 0032d57..e35da4b 100644 (file)
@@ -70,7 +70,7 @@ message(STATUS "CMAKE_CXX_COMPILER_ID = ${CMAKE_CXX_COMPILER_ID}")
 if(CMAKE_CXX_COMPILER_ID MATCHES GNU)
     #execute_process(COMMAND g++ --version >/dev/null 2>/dev/null)
     set(CMAKE_CXX_COMPILER             "/usr/bin/g++")
-    set(CMAKE_CXX_FLAGS                "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wno-deprecated -Wwrite-strings -Wno-unknown-pragmas -Wno-sign-compare -Wno-maybe-uninitialized -Wno-unused -Wno-reorder")
+    set(CMAKE_CXX_FLAGS                "${CMAKE_CXX_FLAGS} -std=c++14 -Wall -Wno-deprecated -Wwrite-strings -Wno-unknown-pragmas -Wno-sign-compare -Wno-maybe-uninitialized -Wno-unused -Wno-reorder")
     set(CMAKE_CXX_FLAGS_DEBUG          "-O0 -g3")
     set(CMAKE_CXX_FLAGS_MINSIZEREL     "-Os -DNDEBUG")
     set(CMAKE_CXX_FLAGS_RELEASE        "-O3")
@@ -80,7 +80,7 @@ elseif(CMAKE_CXX_COMPILER_ID MATCHES Clang)
     #execute_process(COMMAND clang++ --version >/dev/null 2>/dev/null)
     add_definitions(-DIS_CLANG)
     set(CMAKE_CXX_COMPILER             "/usr/bin/clang++")
-    set(CMAKE_CXX_FLAGS                "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wno-deprecated -Wwrite-strings -Wno-unknown-pragmas -Wno-sign-compare -Wno-maybe-uninitialized -Wno-unused -Wno-reorder -Wno-parentheses-equality")
+    set(CMAKE_CXX_FLAGS                "${CMAKE_CXX_FLAGS} -std=c++14 -Wall -Wno-deprecated -Wwrite-strings -Wno-unknown-pragmas -Wno-sign-compare -Wno-maybe-uninitialized -Wno-unused -Wno-reorder -Wno-parentheses-equality")
     set(CMAKE_CXX_FLAGS_DEBUG          "-O0 -g3")
     set(CMAKE_CXX_FLAGS_MINSIZEREL     "-Os -DNDEBUG")
     set(CMAKE_CXX_FLAGS_RELEASE        "-O3")
index 2175263..420a498 100644 (file)
@@ -330,7 +330,7 @@ void Launcher::servicesFromXML(const anna::xml::Node* servicesNode, bool eventOp
 
       // Checking command line parameters
       std::string sessionBasedModelsType;
-      anna::diameter::comm::Entity::SessionBasedModelsType::_v sessionBasedModelsTypeEnum;
+      anna::diameter::comm::Entity::SessionBasedModelsType::_v sessionBasedModelsTypeEnum = anna::diameter::comm::Entity::SessionBasedModelsType::SessionIdLowPart;
       if(sessionBasedModelsClientSocketSelection) {
         sessionBasedModelsType = sessionBasedModelsClientSocketSelection->getValue();
        if (sessionBasedModelsType == "RoundRobin") {
@@ -1463,6 +1463,8 @@ std::string Launcher::help() const throw() {
   result += "\n                                 Test cases reports are not dumped on process context (too many information in general).";
   result += "\n                                 The report contains context information in every moment: this operation acts as a snapshot.";
   result += "\n";
+  result += "\n   test|state[|id]               Get test case state for id provided, current 'in-process' test case when missing.";
+  result += "\n";
   result += "\n   test|interact|amount[|id]     Makes interactive a specific test case id. The amount is the margin of execution steps";
   result += "\n                                 to be done. Normally, we will execute 'test|interact|0[|<test case id>]', which means that";
   result += "\n                                 the test case is selected to be interactive, but no step is executed. Then you have to";
@@ -1567,7 +1569,7 @@ std::string Launcher::help() const throw() {
   result += "\n";
   result += "\nThe alternative using SIGUSR2 signal requires the creation of the task(s) file which will be read at";
   result += "\n signal event:";
-  result += "\n   echo \"<<operation>\" > "; result += getSignalUSR2InputFile();
+  result += "\n   echo \"<operation>\" > "; result += getSignalUSR2InputFile();
   result += "\n    then";
   result += "\n   kill -12 <pid>";
   result += "\n    or";
@@ -1619,9 +1621,12 @@ void Launcher::logStatisticsSamples(const std::string &conceptsList) throw() {
 }
 
 
-void Launcher::eventOperation(const std::string &operation, std::string &response_content) throw(anna::RuntimeException) {
+bool Launcher::eventOperation(const std::string &operation, std::string &response_content) throw(anna::RuntimeException) {
+
+  bool result = true;
+
   LOGMETHOD(anna::TraceMethod tm("Launcher", "eventOperation", ANNA_FILE_LOCATION));
-  if (operation == "") return; // ignore
+  if (operation == "") return result; // ignore
   LOGDEBUG(anna::Logger::debug(anna::functions::asString("Operation: %s", operation.c_str()), ANNA_FILE_LOCATION));
 
   // Default response:
@@ -1651,15 +1656,15 @@ void Launcher::eventOperation(const std::string &operation, std::string &respons
     catch(anna::RuntimeException &ex) {
       ex.trace();
       response_content = ex.asString();
-      return;
+      return false;
     }
-    return;
+    return true; // OK
   }
 
   // Help:
   if(operation == "help") {
     response_content = help();
-    return;
+    return true; // OK
   }
 
   // Reset performance data:
@@ -1667,26 +1672,26 @@ void Launcher::eventOperation(const std::string &operation, std::string &respons
     resetCounters();
     resetStatistics();
     response_content = "All process counters & statistic information have been reset";
-    return;
+    return true; // OK
   }
 
   // Counters dump on demand:
   if(operation == "forceCountersRecord") {
     forceCountersRecord();
     response_content = "Current counters have been dump to disk";
-    return;
+    return true; // OK
   }
 
   // OAM & statistics:
   if(operation == "show-oam") {
     anna::xml::Node root("root");
     response_content = anna::xml::Compiler().apply(oamAsXML(&root));
-    return;
+    return true; // OK
   }
   if(operation == "show-stats") {
     anna::xml::Node root("root");
     response_content = anna::xml::Compiler().apply(statsAsXML(&root));
-    return;
+    return true; // OK
   }
 
   ///////////////////////////////////////////////////////////////////
@@ -1761,25 +1766,27 @@ void Launcher::eventOperation(const std::string &operation, std::string &respons
     std::string contextFile = ((numParams == 1) ? param1 : anna::functions::asString("/var/tmp/anna.context.%05d", getPid()));
     writeContext(contextFile);
     response_content = anna::functions::asString("Context dumped on file '%s'", contextFile.c_str());
-    return;
+    return true; // OK
   }
 
   if(opType == "log-statistics-samples") {
     logStatisticsSamples(param1);
     response_content = anna::functions::asString("Log statistics samples for '%s' concepts", param1.c_str());
-    return;
+    return true; // OK
   }
 
   // Change execution directory:
   if(opType == "change-dir") {
     if (param1 == "") param1 = a_initialWorkingDirectory;
-    if (chdir(param1.c_str()) == 0)
+    result = (chdir(param1.c_str()) == 0);
+
+    if (result)
       response_content = "New execution directory configured: ";
     else
       response_content = "Cannot assign provided execution directory: ";
 
     response_content += param1;
-    return;
+    return result;
   }
 
   if(opType == "services") {
@@ -1790,10 +1797,10 @@ void Launcher::eventOperation(const std::string &operation, std::string &respons
     catch(anna::RuntimeException &ex) {
       ex.trace();
       response_content = anna::functions::asString("Loaded services from file '%s' with errors", servicesFile.c_str());
-      return;
+      return false;
     }
     response_content = anna::functions::asString("Loaded services from file '%s'", servicesFile.c_str());
-    return;
+    return true; // OK
   }
 
   // Host switch:
@@ -1810,12 +1817,12 @@ void Launcher::eventOperation(const std::string &operation, std::string &respons
         response_content = "Working node is automatic";
       }
     }
-    return;
+    return true; // OK
   }
   if(opType == "node_auto") {
     a_workingNode = NULL;
     response_content = "Working node has been set to automatic";
-    return;
+    return true; // OK
   }
 
   // Operated host from possible forced-working node:
@@ -2159,9 +2166,33 @@ void Launcher::eventOperation(const std::string &operation, std::string &respons
 
       if (testCase) {
         response_content = testCase->asXMLString();
-        return;
+        return true; // OK
+      }
+      else {
+        result = false;
+        if (id == -1) {
+          opt_response_content = "no current test case detected (testing started ?)";
+        }
+        else {
+          opt_response_content = "cannot found test id (";
+          opt_response_content += anna::functions::asString(id);
+          opt_response_content += ")";
+        }
+      }
+    }
+    else if(param1 == "state") {
+      if (numParams > 2)
+        throw anna::RuntimeException("Wrong body content format on HTTP Request. Use 'help' management command to see more information.", ANNA_FILE_LOCATION);
+
+      int id = ((param2 != "") ? atoi(param2.c_str()) : -1);
+      anna::testing::TestCase *testCase = testManager.findTestCase(id);
+
+      if (testCase) {
+        response_content = anna::testing::TestCase::asText(testCase->getState());
+        return testCase->isSuccess();
       }
       else {
+        result = false;
         if (id == -1) {
           opt_response_content = "no current test case detected (testing started ?)";
         }
@@ -2198,6 +2229,7 @@ void Launcher::eventOperation(const std::string &operation, std::string &respons
         opt_response_content += anna::functions::asString(id);
       }
       else {
+        result = false;
         opt_response_content = "cannot found test id (";
         opt_response_content += anna::functions::asString(id);
         opt_response_content += ")";
@@ -2228,6 +2260,7 @@ void Launcher::eventOperation(const std::string &operation, std::string &respons
           opt_response_content = param2; opt_response_content += " reset have been sent to all programmed tests: "; opt_response_content += anyReset ? "some/all have been reset" : "nothing was reset";
         }
         else {
+          result = false;
           opt_response_content = "cannot found test id (";
           opt_response_content += anna::functions::asString(id);
           opt_response_content += ")";
@@ -2269,19 +2302,19 @@ void Launcher::eventOperation(const std::string &operation, std::string &respons
     }
     else if(param1 == "junit") {
       response_content = testManager.junitAsXMLString();
-      return;
+      return true; // OK
     }
     else if(param1 == "summary-counts") {
       response_content = testManager.summaryCounts();
-      return;
+      return true; // OK
     }
     else if(param1 == "summary-states") {
       response_content = testManager.summaryStates();
-      return;
+      return true; // OK
     }
     else if(param1 == "summary") {
       response_content = testManager.asXMLString();
-      return;
+      return true; // OK
     }
     else {
       int id = atoi(param1.c_str());
@@ -2488,7 +2521,7 @@ void Launcher::eventOperation(const std::string &operation, std::string &respons
   } else if(opType == "loadxml") {
     codecMsg.loadXML(param1);
     response_content = codecMsg.asXMLString();
-    return;
+    return true; // OK
   } else if(opType == "diameterServerSessions") {
     int diameterServerSessions = atoi(param1.c_str());
     getOperatedServer()->setMaxConnections(diameterServerSessions);
@@ -2496,7 +2529,7 @@ void Launcher::eventOperation(const std::string &operation, std::string &respons
   } else if(opType == "answerxml2c") {
     if(param1 == "") { // programmed answers FIFO's to stdout
       response_content = getOperatedServer()->getReactingAnswers()->asString("ANSWERS TO CLIENT");
-      return;
+      return true; // OK
     } else if (param1 == "rotate") {
       getOperatedServer()->getReactingAnswers()->rotate(true);
     } else if (param1 == "exhaust") {
@@ -2522,7 +2555,7 @@ void Launcher::eventOperation(const std::string &operation, std::string &respons
 
     if(param1 == "") { // programmed answers FIFO's to stdout
       response_content = getOperatedEntity()->getReactingAnswers()->asString("ANSWERS TO ENTITY");
-      return;
+      return true; // OK
     } else if (param1 == "rotate") {
       getOperatedEntity()->getReactingAnswers()->rotate(true);
     } else if (param1 == "exhaust") {
@@ -2554,6 +2587,8 @@ void Launcher::eventOperation(const std::string &operation, std::string &respons
     response_content += " => ";
     response_content += opt_response_content;
   }
+
+  return result;
 }
 
 anna::xml::Node* Launcher::asXML(anna::xml::Node* parent) const
index c97fe7b..a74ef39 100644 (file)
@@ -104,7 +104,7 @@ public:
 
 
   MyCommunicator *getCommunicator() throw() { return a_communicator; }
-  void eventOperation(const std::string &, std::string &) throw(anna::RuntimeException);
+  bool eventOperation(const std::string &, std::string &) throw(anna::RuntimeException); // returns success/failed
   void forceCountersRecord() throw(anna::RuntimeException) { if (a_counterRecorderClock) a_counterRecorderClock->tick(); }
   void logStatisticsSamples(const std::string &conceptsList) throw();
 
index 9f893a7..9ac1c44 100644 (file)
@@ -8,6 +8,8 @@
 
 // Standard
 #include <string>
+#include <sstream>
+#include <iomanip>
 
 // Project
 #include <anna/http/Request.hpp>
@@ -34,18 +36,20 @@ throw(anna::RuntimeException) {
   // Operation:
   std::string response_content;
 
+  bool opOk{};
+
   try {
     Launcher& my_app = static_cast <Launcher&>(anna::app::functions::getApp());
-    my_app.eventOperation(body_content, response_content);
+    opOk = my_app.eventOperation(body_content, response_content);
   } catch(RuntimeException &ex) {
     ex.trace();
+    opOk = false;
   }
 
   anna::http::Response* response = allocateResponse();
   response->setStatusCode(200);  // http://en.wikipedia.org/wiki/List_of_HTTP_status_codes
-  anna::DataBlock db_content(true);
-  db_content = response_content;
-  response->setBody(db_content);
+
+// EXAMPLES TO SET HEADERS:
 //   response->find(anna::http::Header::Type::Date)->setValue("Mon, 30 Jan 2006 14:36:18 GMT");
 //   anna::http::Header* keepAlive = response->find("Keep-Alive");
 //
@@ -54,6 +58,20 @@ throw(anna::RuntimeException) {
 //
 //   keepAlive->setValue("Verificacion del cambio 1.0.7");
 
+  // Content-Type header:
+  anna::http::Header* contentType = response->find("Content-Type");
+  if (contentType == NULL)
+    contentType = response->createHeader("Content-Type");
+  contentType->setValue("application/json");
+
+  // Json Body for response:
+  std::stringstream ss;
+
+  ss << R"({ "result":")" << (opOk ? "true":"false") << R"(", "data": )" << std::quoted(response_content) << R"( })";
+  anna::DataBlock db_content(true);
+  db_content = ss.str();
+  response->setBody(db_content);
+
   try {
     clientSocket.send(*response);
   } catch(Exception& ex) {
diff --git a/example/diameter/launcher/deploy-aots-adml.sh b/example/diameter/launcher/deploy-aots-adml.sh
new file mode 100755 (executable)
index 0000000..4dc5aa6
--- /dev/null
@@ -0,0 +1,116 @@
+#!/bin/bash
+
+#############
+# VARIABLES #
+#############
+SCR_DIR=`readlink -f $0 | xargs dirname`
+PROJECT_ROOT=$(readlink -f $SCR_DIR/../../..)
+
+#############
+# FUNCTIONS #
+#############
+_exit () {
+  local msg="$1"
+  local rc=$2
+  [ -z "$rc" ] && rc=1
+
+  # Exit message:
+  [ -n "$msg" ] && echo -e "\n${msg}\n"
+
+  exit $rc
+}
+
+#############
+# EXECUTION #
+#############
+
+echo
+echo "------------------------------------------------------"
+echo "               AOTS ADML Agent installation           "
+echo "------------------------------------------------------"
+echo
+[ -d $PROJECT_ROOT/build/Release ] && VARIANT=Release
+[ -d $PROJECT_ROOT/build/Debug ] && VARIANT=Debug
+[ -z "$VARIANT" ] && _exit "Cannot locate neither 'Release' nor 'Debug' variant !"
+build_type_letter=$(echo $VARIANT | cut -c1 | tr '[:upper:]' '[:lower:]')
+
+version__dflt=v"`date +'%y'`.`date +'%m'`.`date +'%d'`$build_type_letter"
+INSTALL__dflt=$HOME/3rdParty/anna-aots-adml-builds/v"`date +'%y'`.`date +'%m'`.`date +'%d'`$build_type_letter"
+
+echo "Choose the target path for installation [$INSTALL__dflt]:"
+echo " (enter a non-existent directory)"
+read INSTALL
+[ -z "$INSTALL" ] && INSTALL=$INSTALL__dflt
+INSTALL=`readlink -m $INSTALL`
+[ -d $INSTALL ] && _exit "The target installation directory ($INSTALL) already exists ! (if you want to reinstall, remove it first)"
+
+echo
+echo "Stage 1: Deploying resources ......................"
+echo
+mkdir -p $INSTALL
+cp -rL $SCR_DIR/deployments/aots-adml/* $INSTALL
+
+# VARIABLES ######################################
+# Sources:
+LDIR=${PROJECT_ROOT}/example/diameter/launcher
+BIN_DIR=${PROJECT_ROOT}/build/$VARIANT/bin
+LIB_DIR=${PROJECT_ROOT}/build/$VARIANT/lib
+
+# Targets:
+ADML=${INSTALL}
+DTDs=${ADML}/DTDs
+DYNLIBS=${ADML}/dynlibs
+##################################################
+
+echo
+echo "Variant: $VARIANT"
+echo
+
+# Empty directories:
+mkdir -p ${ADML}/counters
+mkdir -p ${ADML}/test-reports
+
+# Scripts:
+cp ${PROJECT_ROOT}/example/diameter/launcher/resources/scripts/operation_curl.sh ${ADML}/operation.sh
+
+# Templates:
+mkdir $DTDs
+cp ${PROJECT_ROOT}/include/anna/diameter/codec/message.dtd ${DTDs}
+cp ${PROJECT_ROOT}/include/anna/diameter/stack/dictionary.dtd ${DTDs}
+cp ${PROJECT_ROOT}/example/diameter/launcher/resources/services_examples/services.dtd ${DTDs}
+
+# Main Launcher and dynamic libraries:
+cp ${BIN_DIR}/anna_diameter_launcher ${ADML}/ADML
+cp -r $LIB_DIR/dynamic/launcher ${DYNLIBS}
+cp $LIB_DIR/libanna_testing_shared.so ${DYNLIBS}
+
+# Get stuff from leaf directories:
+cd $LIB_DIR/dynamic/launcher
+leafs=( $(find . -type d -links 2) )
+cd - >/dev/null
+
+cd ${PROJECT_ROOT}/dynamic/launcher
+for dir in ${leafs[@]}
+do
+    cp $dir/*.xml ${DYNLIBS}/$dir 2>/dev/null
+    cp $dir/dynamic.suffix ${DYNLIBS}/$dir 2>/dev/null
+    cp -r $dir/services ${DYNLIBS}/$dir 2>/dev/null
+done
+cd - >/dev/null
+
+# ADML dynamic libs selection script:
+cp ${LDIR}/resources/scripts/select_dynlib.sh ${DYNLIBS}/select.sh
+
+# Default dynamic library:
+cd ${DYNLIBS}
+ln -sf default/libanna_launcher_procedure_default_shared.so
+cd - >/dev/null
+
+# ADML Agent shall use http server:
+httpOpt="--httpServer \`grep -v ^# .httpServer\`"
+echo "${httpOpt}" >> ${ADML}/args.ft
+echo "${httpOpt}" >> ${ADML}/args.st
+echo "localhost:8000" > ${ADML}/.httpServer
+
+_exit "Done!" 0
+
index 8a7f8b7..1e7f471 100755 (executable)
@@ -35,20 +35,20 @@ echo
 build_type_letter=$(echo $VARIANT | cut -c1 | tr '[:upper:]' '[:lower:]')
 
 version__dflt=v"`date +'%y'`.`date +'%m'`.`date +'%d'`$build_type_letter"
-INSTALL_AOTS__dflt=$HOME/3rdParty/anna-aots-builds/v"`date +'%y'`.`date +'%m'`.`date +'%d'`$build_type_letter"
+INSTALL__dflt=$HOME/3rdParty/anna-aots-builds/v"`date +'%y'`.`date +'%m'`.`date +'%d'`$build_type_letter"
 
-echo "Choose the target path for installation [$INSTALL_AOTS__dflt]:"
+echo "Choose the target path for installation [$INSTALL__dflt]:"
 echo " (enter a non-existent directory)"
-read INSTALL_AOTS
-[ -z "$INSTALL_AOTS" ] && INSTALL_AOTS=$INSTALL_AOTS__dflt
-INSTALL_AOTS=`readlink -m $INSTALL_AOTS`
-[ -d $INSTALL_AOTS ] && _exit "The target installation directory ($INSTALL_AOTS) already exists ! (if you want to reinstall, remove it first)"
+read INSTALL
+[ -z "$INSTALL" ] && INSTALL=$INSTALL__dflt
+INSTALL=`readlink -m $INSTALL`
+[ -d $INSTALL ] && _exit "The target installation directory ($INSTALL) already exists ! (if you want to reinstall, remove it first)"
 
 echo
 echo "Stage 1: Deploying resources ......................"
 echo
-mkdir -p $INSTALL_AOTS
-cp -r $SCR_DIR/deployments/aots/* $INSTALL_AOTS
+mkdir -p $INSTALL
+cp -rL $SCR_DIR/deployments/aots-setup/* $INSTALL
 
 # VARIABLES ######################################
 # Sources:
@@ -57,7 +57,7 @@ BIN_DIR=${PROJECT_ROOT}/build/$VARIANT/bin
 LIB_DIR=${PROJECT_ROOT}/build/$VARIANT/lib
 
 # Targets:
-ADML=${INSTALL_AOTS}/agents/ADML
+ADML=${INSTALL}/agents/ADML
 DTDs=${ADML}/DTDs
 DYNLIBS=${ADML}/dynlibs
 ##################################################
index bdc5bd9..3c8b47b 100755 (executable)
@@ -109,12 +109,12 @@ case $type in
     echo s | ./configure.sh >/dev/null
     sed -i 's/3868/3869/' services.xml
     # Gx dictionary:
-    ln -sf stack_examples/other/16777238.xml dictionary.xml
+    ln -sf stack_examples/other/DictionaryGx.16777238.xml dictionary.xml
     cd - >/dev/null
     cd $target/ADML-serverRx
     echo s | ./configure.sh >/dev/null
     # Rx dictionary:
-    ln -sf stack_examples/other/16777236.xml dictionary.xml
+    ln -sf stack_examples/other/DictionaryRx.16777236.xml dictionary.xml
     cd - >/dev/null
   ;;
 
diff --git a/example/diameter/launcher/deployments/aots-adml/ACTIONS.md b/example/diameter/launcher/deployments/aots-adml/ACTIONS.md
new file mode 100644 (file)
index 0000000..280b214
--- /dev/null
@@ -0,0 +1,84 @@
+# ADML actions
+
+## send_xml_to_entity
+
+Sends a diameter message in xml format (see DTDs/message.dtd) as client to the server(s) configured.
+
+Arguments: xml[, answers_to]
+* xml: the diameter message in xml format.
+* answers_to: optional step number of a 'wait_xml_from_entity' for a request message.
+              Steps are the actions numbered from 1 to N
+Example(1):
+```
+- action: AF/send_xml_to_entity
+    xml: aar-initial.xml
+```
+
+Example(2):
+```
+- action: AF/wait_xml_from_entity
+  arguments:
+    xml: dpr.xml
+
+- action: AF/send_xml_to_entity
+  arguments:
+    xml: dpa.xml
+    answers_to: 1
+```
+
+## wait_xml_from_entity
+
+Waits a diameter message in xml format (see DTDs/message.dtd) as client from the server(s) connected.
+Step blocks until match reception (regular expressions could be used).
+
+Arguments: xml
+* xml: the diameter message in xml format.
+
+Example:
+```
+- action: AFPC/wait_xml_from_entity
+  arguments:
+    xml: aaa.xml
+```
+
+## send_xml_to_client
+
+Sends a diameter message in xml format (see DTDs/message.dtd) as server to any client(s) connected.
+
+Arguments: xml[, answers_to]
+* xml: the diameter message in xml format.
+* answers_to: optional step number of a 'wait_xml_from_client' for a request message.
+              Steps are the actions numbered from 1 to N
+Example(1):
+```
+- action: AF/send_xml_to_client
+  arguments:
+    xml: dpr.xml
+```
+
+Example(2):
+```
+- action: AFPC/wait_xml_from_client
+    xml: dpr.xml
+  arguments:
+
+- action: AFPC/send_xml_to_client
+    xml: dpa.xml
+  arguments:
+```
+
+## wait_xml_from_client
+
+Waits a diameter message in xml format (see DTDs/message.dtd) as server from the client(s) connected.
+Step blocks until match reception (regular expressions could be used).
+
+Arguments: xml
+* xml: the diameter message in xml format.
+
+Example:
+```
+- action: AFPC/wait_xml_from_client
+  arguments:
+    xml: dpr.xml
+```
+
diff --git a/example/diameter/launcher/deployments/aots-adml/HINTS.md b/example/diameter/launcher/deployments/aots-adml/HINTS.md
new file mode 100644 (file)
index 0000000..a9314e3
--- /dev/null
@@ -0,0 +1,28 @@
+# ADML hints
+
+## AF-Application-Identifier
+
+Diameter RFC assigned the format 'OctetString' to this AVP although it is almost always intended to be human-readable. 'UTF8String' format could be more appropiate, but probably the intention was to avoid possible limits.
+
+ADML message codec shows readable data when possible using the field 'data'. When this is not possible, the 'hex-data' field will encode the information. The 'OctetString' format is hexadecimal by nature (string of octets), then always 'hex-data' will be shown for this kind of AVPs.
+
+For example:
+<avp name="AF-Application-Identifier" hex-data="75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c"/>
+
+You could decode using hex dump utility: 'xxd'
+
+$> echo "75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c" | xxd -p -r
+$> urn%3Aurn-xxx%3A3gpp-service.ims.icsi.mmtel
+
+But the thing that you may probably need, is to encode a desired value into xml messages while designing a test case. For this situation, use the opossite (drop reverse flag '-r' to xxd):
+
+$> echo -n "urn%3Aurn-xxx%3A3gpp-service.ims.icsi.mmtel" | xxd -p | tr -d '\n'
+$> 75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c
+
+or use 'od' (files dump) utility:
+
+$> echo -n "urn%3Aurn-xxx%3A3gpp-service.ims.icsi.mmtel" | od -A n -t x1 | tr -d ' ' | tr -d '\n'
+$> 75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c
+
+The '-n' in the echo is neccessary to avoid encoding of carriage return (0x0a) for the string provided.
+
diff --git a/example/diameter/launcher/deployments/aots-adml/args.ft b/example/diameter/launcher/deployments/aots-adml/args.ft
new file mode 100644 (file)
index 0000000..fa3411d
--- /dev/null
@@ -0,0 +1,21 @@
+# ADML will start with base protocol dictionary and no nodes on services.xml:
+--services services.xml
+
+# Counters directory:
+--cntDir counters
+# Counters record procedure period in milliseconds.
+# If missing, default value of 300000 (5 minutes) will be assigned.
+# Zero value, disable the dump procedure.
+#--cntRecordPeriod 10000
+
+# System test:
+--tmDir test-reports
+# To override traffic logs configuration in order to be disabled for all the
+# loaded nodes, launch the process by mean: './start.sh st'
+
+# Statistics:
+--logStatisticSamples all
+
+# Add to take debug traces once started
+--trace debug
+
diff --git a/example/diameter/launcher/deployments/aots-adml/args.st b/example/diameter/launcher/deployments/aots-adml/args.st
new file mode 100644 (file)
index 0000000..733daaf
--- /dev/null
@@ -0,0 +1,22 @@
+# ADML will start with base protocol dictionary and no nodes on services.xml:
+--services services.xml
+
+# Counters directory:
+--cntDir counters
+# Counters record procedure period in milliseconds.
+# If missing, default value of 300000 (5 minutes) will be assigned.
+# Zero value, disable the dump procedure.
+#--cntRecordPeriod 10000
+
+# System test:
+--tmDir test-reports
+# To override traffic logs configuration in order to be disabled for all the
+# loaded nodes, launch the process by mean: './start.sh st'
+
+# Statistics:
+--logStatisticSamples all
+
+# Add to take debug traces once started
+# --trace debug
+--disableLogs
+
diff --git a/example/diameter/launcher/deployments/aots-adml/services.xml.example b/example/diameter/launcher/deployments/aots-adml/services.xml.example
new file mode 100644 (file)
index 0000000..a54cf09
--- /dev/null
@@ -0,0 +1,29 @@
+<services>
+  <!--
+  Stacks
+
+  * Monostack: you could select any id value, normally 0.
+  * Multistack: use the application id for the id value.
+                This eases codec engine selection for
+                processed messages.
+  -->
+  <stack id="0" dictionary="dictionary.xml" fixMode="Never"/>
+
+  <!--
+  Nodes
+
+  * Client example:
+
+  <node originHost="<origin host>" applicationId="<application id>"
+        entity="<addr1:port1[,addr2:port2]...[,addrN:portN]>"
+        cer="<cer xml file>" answersTimeout="300000" dumpLog="yes"/>
+
+  * Server example:
+
+  <node originHost="<origin host>" applicationId="<application id>"
+        diameterServer="<addr:port>" diameterServerSessions="10"
+        cea="<cea xml file>" answersTimeout="300000" dumpLog="yes"/>
+  -->
+  <node originHost="afHost.afRealm.com" applicationId="0" entity="localhost:3868"/>
+
+</services>
diff --git a/example/diameter/launcher/deployments/aots-adml/stacks b/example/diameter/launcher/deployments/aots-adml/stacks
new file mode 120000 (symlink)
index 0000000..b2773bc
--- /dev/null
@@ -0,0 +1 @@
+../../resources/stack_examples
\ No newline at end of file
diff --git a/example/diameter/launcher/deployments/aots-adml/start.sh b/example/diameter/launcher/deployments/aots-adml/start.sh
new file mode 100755 (executable)
index 0000000..d2b371e
--- /dev/null
@@ -0,0 +1,21 @@
+#!/bin/bash
+# $1: args type could be 'ft' (function test) or 'st' (system test). By default: ft
+function pgrep_live {
+  pids=$(pgrep "$1");
+  [ "$pids" ] || return;
+  ps -o s= -o pid= $pids | sed -n 's/^[^ZT][[:space:]]\+//p';
+}
+cd `dirname $0`
+ARGS=args.$1
+[ -z "$1" ] && ARGS=args.ft
+STARTED=`pgrep_live ADML`
+[ -n "$STARTED"  ] && { echo "Already started !"; echo "PID $STARTED" ; exit 1 ; }
+0> launcher.trace
+for file in `ls *.launcher.log 2>/dev/null`; do 0> $file; done
+mkdir -p counters test-reports
+rm -f counters/* test-reports/* *.csv
+export LD_LIBRARY_PATH=$PWD/dynlibs
+eval ./ADML `grep -v ^# $ARGS` &
+echo $! > .pid
+echo "Done !"
+
diff --git a/example/diameter/launcher/deployments/aots-adml/stop.sh b/example/diameter/launcher/deployments/aots-adml/stop.sh
new file mode 100755 (executable)
index 0000000..a4f1121
--- /dev/null
@@ -0,0 +1,26 @@
+#!/bin/bash
+function pgrep_live {
+  pids=$(pgrep "$1");
+  [ "$pids" ] || return;
+  ps -o s= -o pid= $pids | sed -n 's/^[^ZT][[:space:]]\+//p';
+}
+cd `dirname $0`
+PID=$(pgrep_live ^ADML)
+[ -z "$PID" ] && exit 0
+kill $PID
+
+# Protection to force kill (with SIGKILL) if ADML still alive after certain time:
+seconds2force=3
+count=$((10*seconds2force))
+kill0=0
+while [ $kill0 -eq 0 -a $count -gt 0 ]
+do
+  sleep 0.1
+  count=$((count-1))
+  kill -0 $PID 2>/dev/null
+  kill0=$?
+  echo -n .
+done
+[ $kill0 -eq 0 ] && { echo " sigkill to ADML pid $PID !" ; kill -9 $PID ; }
+rm -f .pid
+
diff --git a/example/diameter/launcher/deployments/aots-setup/README.md b/example/diameter/launcher/deployments/aots-setup/README.md
new file mode 100644 (file)
index 0000000..35570c1
--- /dev/null
@@ -0,0 +1,495 @@
+# Anna Agents-Oriented Testing Setup
+
+## Agents configuration
+
+```
+$> python3 loader.py -h
+usage: loader.py [-h] -f FILE
+
+Anna Agents-Oriented Testing Setup Loader
+
+optional arguments:
+  -h, --help            show this help message and exit
+  -f FILE, --file FILE  Agents yaml configuration file
+```
+
+The python script 'loader.py' will preload and configure all the needed agents.
+Also, ADML ones will start with the configured endpoints, ready for work.
+
+```
+python3 loader.py --file <tests directory>/agents.yml
+```
+
+See example at './tests.example/agents.yml'.
+
+It is recommended to have that file within the tests directory compatible with such layout.
+Anyway, you could have a common agents definition for multiple directories wherever you want to store them.
+Next procedure (execution) will get a working directory which will be the parent for all the tests processed.
+
+Also, you could load several agents definitions.
+
+The format for agents file specification is:
+
+For KAFKA:
+
+```
+<node label>:
+  description: <description>
+  template: KAFKA
+  topic: <kafka topic>
+```
+
+For ADML (diameter):
+
+```
+<node label>:
+  description: <description>
+  template: ADML
+  application_id: <value>
+  dictionary: <xml dictionary path (absolute or relative to ./agents/ADML)>
+  type: client | server
+  origin_host: <origin host>
+  origin_realm: <origin realm>
+  address: <ip/server:port[,ip2/server2:port,...]>
+```
+
+For HTTPMOCK:
+
+```
+<node label>:
+  description: <description>
+  template: HTTPMOCK
+  address: <ip/server:port>
+```
+
+Example:
+
+```
+AF:
+  description: AF Diameter Rx Node
+  template: ADML
+  application_id: 16777236
+  dictionary: stacks/DictionaryRx.16777236.xml
+  type: client
+  origin_host: machine.source.server.realm.com
+  origin_realm: source.server.realm.com
+  address: 127.0.0.1:3868
+
+SMPC:
+  description: SMPC N7 Node
+  template: KAFKA
+  topic: n7topic
+
+DB:
+  description: database
+  template HTTPMOCK
+  address: dbnode:9090
+```
+
+
+## Test launcher
+
+```
+$> python3 launcher.py -h
+usage: launcher.py [-h] -t TESTS_DIR [-k] [-s] [-i] [-d]                                                                                        [1/708]
+
+Anna Agents-Oriented Testing Setup Launcher
+
+optional arguments:
+  -h, --help            show this help message and exit
+  -t TESTS_DIR, --tests-dir TESTS_DIR
+                        Tests parent directory where to find .yml files (from
+                        the next directories level)
+  -k, --keep-list-if-exists
+                        Keeps intact the list of test cases (<test-
+                        dir>/launcher.list), creates it if missing
+  -s, --stop-adml-at-the-end
+                        At the end, ADML keeps running to ease debugging. You
+                        could force stop with this option
+  -i, --interactive     Interactive execution to ease debugging of test cases
+  -d, --dry-run         Used to test and debug provision, no execution is
+                        launched
+  -p IP_LIMIT, --ip-limit IP_LIMIT
+                        In-Progress limit is the number of coexisting In-
+                        Progress State test cases. Defaults to 1 (sequential),
+                        -1 would be 'no limit').
+  -r TTPS, --ttps TTPS  Rate of test cases launched (test ticks per second).
+                        By default 50 (recommended for monothread version).
+```
+
+The python script 'launcher.py' will execute the test cases under the provided directory.
+Test cases at the directory provided itself will be ignored (searchs are performed at second level in order to avoid catching agents definitions).
+Then we recommend this structure:
+
+```
+<tests directory>/agents.yml
+<tests directory>/<test suite>/.../<test case>.yml
+<tests directory>/<test suite(i)>/.../<dir(j)>/.../<test case(k)>.yml
+```
+
+The organization of test cases, chapters, test suites, or whatever desired concept is completely free for user preferences. Anyway, we recommend the use of numeric prefixes to control the default order of execution (alphabetical order).
+
+To execute the tests, just provide the global parent directory.
+NO TEST CASES SHALL BE LOCATED THERE BY CONVENTION (indeed, you could have them, but they would be ignored).
+
+```
+python3 launcher.py --tests-dir <tests directory>
+```
+
+The procedure will look for the file ```'<tests directory>'/launcher.list'``` in order to plan the execution.
+That list will be created/refreshed always, except if you pass the option '-k|--keep-list-if-exists' (in case you want to play with edited lists).
+The algorithm to create the list is based in a recursive search of yaml files in alphabetical order under the tests directory provided, in a similar way than the output of:
+
+```
+find <tests directory> -mindepth 2 -name "*.yml" | sort -t'/'
+```
+
+### Interactive mode
+
+One interesting feature from AOTS is the possibility to interact test cases even to deep level (step by step).
+You could enable the interactive mode by mean:
+
+```
+python3 launcher.py --tests-dir <tests directory> --interactive
+```
+
+A menu will be shown after test cases programming to give you a complete control of the ADML operations:
+
+```
+    MAIN INTERACTIVE MENU
+    =====================
+    (prefix option with 'h' to get detailed help)
+
+    General:
+    0.  Exit/Quit
+
+    Position:
+    1.  Go to
+    2.  Look
+
+    Test cases execution:
+    3.  Start with test rate
+    4.  Start next N test cases
+    5.  In-progress limit
+
+    Low level execution: test case steps
+    6.  Execute next N steps
+
+    Status & cycling:
+    7.  Reset
+    8.  Pool repeats
+    9.  Collect
+    10. Auto reset
+    11. Reports configuration
+```
+
+### User-defined lists
+
+You could edit such list and remove or comment (#) entries (each line is a test case) in order to "disable" such test cases.
+You could also mess the order with something like:
+
+```
+sort -R <tests directory>/launcher.list
+```
+
+Don't forget to pass the option '-k|--keep-list-if-exists' or the list will be overwritten during launcher procedure execution.
+
+### Test cases
+
+Files used by parsers within the test cases (xml diameter messages, json kafka ones, etc.), are relative to the test case file path location, anyway you could set absolute paths for the stuff used.
+
+Recomendations:
+
+* Alternative 1: create a directory called ```'$(basename <test case file> .yml)'```
+  in order to keep order:
+
+```
+     <dir>/tc1-initial-with-ipv4.yml
+     <dir>/tc1-initial-with-ipv4/AAA.xml
+     <dir>/tc1-initial-with-ipv4/smpc-consumed.json
+     <dir>/tc2-initial-with-ipv6.yml
+     <dir>/tc2-initial-with-ipv6/AAA.xml
+     <dir>/tc2-initial-with-ipv6/smpc-consumed.json
+     ...
+```
+
+* Alternative 2: create a unique directory for the definition and all the test case stuff:
+
+```
+     <dir>/tc1/initial-with-ipv4.yml
+     <dir>/tc1/AAA.xml
+     <dir>/tc1/smpc-consumed.json
+     <dir>/tc2/initial-with-ipv6.yml
+     <dir>/tc2/AAA.xml
+     <dir>/tc2/smpc-consumed.json
+     ...
+```
+
+The last one seems to be better and cleaner alternative.
+
+### Test case definition
+
+A test case is a yaml list of steps. Each step is a dictionary object with mandatory keys called 'action' and 'arguments'.
+An action could be generic (no agent id specified) or agent-related.
+Arguments depends on the type of action and are documented at ```'agents/<template>/ACTIONS.md'``` file.
+Generic actions are documented below ([Generic actions](#generic-actions)).
+
+```
+- action: [<agent id>/]<action id>
+  arguments:
+    <argument 1>: <value 1>
+    ...
+    <argument m>: <value m>
+  ...
+```
+
+Example:
+
+```
+# Step 1: Establish a timeout for the whole test case
+- action: timeout_ms
+  arguments:
+    value: 1000
+
+# Step 2: Clean kafka message bus for the SMPC topic
+- action: SMPC/admin
+  arguments:
+    operation: clean_topic
+
+# Step 3: Send the AA-Request to the server
+- action: AF/send_xml_to_entity
+  arguments:
+    xml: AAR.xml
+
+# Step 4: Wait for AA-Answer for the previous request sent
+- action: AF/wait_xml_from_entity
+  arguments:
+    xml: AAA.xml
+    answers_to: 3
+
+# Step 4: Check the message bus for a kafka notify reception
+- action: SMPC/consume_json
+  arguments:
+    json: expected.json
+    auto_offset_reset: earliest
+
+```
+
+It is good to comment each step with the position number (1..N). Take into account that lists are processed in order. Some steps could reference to other steps and this position could be useful for that purpose (see step 4 in the example above).
+
+### Generic actions
+
+#### sh_command
+
+Sets a shell command script execution.
+
+Arguments: value
+* value: command and arguments
+
+Example:
+```
+- action: sh_command
+  arguments:
+    value: cat AAR.xml
+```
+
+#### timeout_ms
+
+Sets timeout (milliseconds) to complete the whole test case, or get a Failed state if not completed.
+This could be configured at any step point, where will be started as time measuring reference.
+It is recommended in order to ensure that test will not be in-progress eternally.
+The launcher executor will calculate 15 seconds per test case by default just in case this
+timeout feature is not used.
+
+Arguments: value
+* value: numeric value for the lapse of time in milliseconds.
+
+Example:
+```
+- action: timeout_ms
+  arguments:
+    value: 3500
+```
+
+#### delay_ms
+
+Sets delay (milliseconds) to sleep the test case at the corresponding delay step.
+
+Arguments: value
+* value: numeric value for the lapse of time in milliseconds.
+
+Example:
+```
+- action: delay_ms
+  arguments:
+    value: 200
+```
+
+#### ip_limit
+
+Controller In-Progress limit. A value of 1 means that only 1 test case with
+status "in progress" is allowed. That is to say, ip_limit=1 is the same as
+sequential execution of test cases.
+
+This value can be set for the whole launcher execution by mean '-p|--ip-limit'
+argument, but anyway, the value set in a test case definition has priority
+because it will remain for the following test cases executed if the action
+is not used to update the value again. Summing up, the command line for
+launcher only sets the initial ip-limit value (1 by default).
+
+Also we can restore the command-line value in any moment just configuring
+"launcher" for this action value.
+
+A typical use case for this is when a chapter or a whole test suite need a
+initial (or intermediate) administration step to do global actions which
+could impact in the real test cases if everything is executed in parallel.
+For example, remove kafka bus or create first dummy message, could impact
+in the real test cases which are consuming data from the kafka message bus.
+Then, we will define a first test-suite case with the proper administrative
+operations setting ip-limit to 1, doing needed operations and updating this
+limit again (to -1, no limit, or any other). The reserved word "launcher"
+helps to restore the value which the user provided through the launcher
+procedure (in this way, if user wanted sequential, the tests will be
+sequentially executed).
+
+To ensure that an intermediate test case is the only executed we should
+first set the ip-limit to 1, then perform a delay step with the maximum
+timeout of the suite test cases, and then, perform the administrative
+operations. Finally, as it is unpredictable to know which test case is the
+following, in the same administrative test case, we end defining another
+ip_limit action to restore the parallel value (ip limit > 1 or "launcher").
+Also, those administrative operations should be blocking until completed.
+
+Arguments: value
+* value: in progress limit amount (-1: no limit, 0: stops the ttps clock). Reserved 'launcher' sets the command-line launcher received value.
+
+Example:
+```
+- action: ip_limit
+  arguments:
+    value: 1
+```
+
+#### modify_xml_avp_data
+
+Replace operations over ANNA diameter message xml representation.
+Replaces data (or hex-data) fields for specific avps before processing.
+XPath is used to select the node(s) to be processed. The value provided
+will replace the data or hex-data field. A list is used to allow one or
+more replace operations over the same xml file.
+
+Arguments: xml, new_xml, xpath_value_list
+* xml: the diameter message in xml format. Could be a symlink to common template.
+* new_xml: new diameter message in xml format. Should be the one referred at test case.
+* xpath_value_list: list of items with fields: xpath, value
+
+Example:
+```
+- action: modify_xml_avp_data
+  arguments:
+    xml: AAR.xml.template
+    new_xml: AAR.xml
+    xpath_value_list:
+    - xpath: "avp[@name='Session-Id']"
+      value: "mytest;afNodeHostname.nodeHostRealm.com;1;005"
+    - xpath: "avp[@name='Framed-IP-Address']"
+      value: "c52a0b20"
+```
+
+Important note: better don't use for diameter messages used in wait conditions.
+The reason is that wait conditions acts using the xml content as regular
+expression to be matched with serialized message received at the endpoint.
+The thing is that diameter xml representation compared with python parser
+representation will be probably different and regular expression won't be
+valid to match. Summing up, this kind of messages must be statically
+created with the expected content. Anyway, fields like hop-by-hop, end-to-end
+and Origin-State-Id AVP values, will be automatically matched regardless its
+value (regular expression is internally modified to replace them by '[0-9]+').
+
+#### modify_json_key_value
+
+Replaces value fields for specific keys before processing.
+
+Arguments: json, new_json, kpath_value_list
+* json: the json file. Could be a symlink to common template.
+* new_json: new json file. Must be the one referred at test case.
+* kpath_value_list: list of items with fields: kpath, value
+
+The 'key path' concept (kpath field) consist in json node location
+by mean a dot-separated string: <node1>[.<node2>]..[.<nodeN>].
+
+Example:
+```
+- action: modify_json_key_value
+  arguments:
+    json: notify.json.template
+    new_json: notify.json
+    kpath_value_list:
+    - kpath: "session.smSessionId"
+      value: "the_sm_session_id"
+```
+
+#### system_cmd
+
+Launchs an inline shell command or a user script file.
+
+Arguments: [shell, file, file_parameters]
+* shell: inline shell command and parameters.
+* file: script or procedure defined in a test case file
+* file_parameters: script file parameters (empty by default)
+
+Example:
+```
+- action: system_cmd
+  arguments:
+    shell: echo "this is a test"
+
+- action: system_cmd
+  arguments:
+    shell: rdate remote_host
+
+- action: system_cmd
+  arguments:
+    file: check_consumer_step.py
+    file_parameters: 2
+```
+
+## Environment variables
+
+Agents directory, where templates ADML and KAFKA are located, could be accessible through environment variable 'AGENTS_DIR'.
+For example, you could use it for an system_cmd action:
+
+Example:
+```
+- action: system_cmd
+  arguments:
+    value: check_consumption.sh $AGENTS_DIR/KAFKA/SMPC-consumer.sh.output
+```
+
+## Logs generated
+
+After launcher execution, a '<tests directory>.logs' directory is created within test directory processed.
+This is an example of logs created by AOTS:
+
+```
+drwxrwxr-x 2 vagrant vagrant  4096 Aug 18 21:24 traffic
+-rw-rw-r-- 1 vagrant vagrant 16065 Aug 18 21:24 junit.xml
+-rw-rw-r-- 1 vagrant vagrant 15166 Aug 18 21:24 tests.summary
+-rw-rw-r-- 1 vagrant vagrant 10747 Aug 18 21:24 tests.oam
+-rw-rw-r-- 1 vagrant vagrant   697 Aug 18 21:24 tests.stats
+-rw-rw-r-- 1 vagrant vagrant 83839 Aug 18 21:24 adml.context
+drwxrwxr-x 2 vagrant vagrant  4096 Aug 18 21:24 counters
+drwxrwxr-x 2 vagrant vagrant  4096 Aug 18 21:24 test-reports
+drwxrwxr-x 2 vagrant vagrant  4096 Aug 18 21:24 debug
+```
+
+* traffic: folder containing traffic logs, for example diameter interfaces flow information.
+* junit.xml: JUnit report for the testsuite execution.
+* tests.summary: ADML director tests summary in xml format.
+* tests.oam: ADML director Operation & Maintenance information (counters)
+* tests.stats: ADML director statistic module information (average, deviation, max & min values for any of the statistic concepts registered, for example processing time in every interface, messages size, etc.).
+* adml.context: context information in xml format for the ADML director process.
+* counters: counters information, for example diameter events.
+* test-reports: ADML tests reports in xml format.
+* debug: debug information (ADML traces, yml test case files list, relation between ids and descriptions, ADML operations dumps, etc.).
+
diff --git a/example/diameter/launcher/deployments/aots-setup/agents/ADML b/example/diameter/launcher/deployments/aots-setup/agents/ADML
new file mode 120000 (symlink)
index 0000000..703e402
--- /dev/null
@@ -0,0 +1 @@
+../../aots-adml
\ No newline at end of file
diff --git a/example/diameter/launcher/deployments/aots-setup/agents/HTTPMOCK/ACTIONS.md b/example/diameter/launcher/deployments/aots-setup/agents/HTTPMOCK/ACTIONS.md
new file mode 100644 (file)
index 0000000..4a3548a
--- /dev/null
@@ -0,0 +1,20 @@
+# HTTPMOCK actions
+
+## serve_json
+
+Serve a json response body for specific method is given uri.
+
+Arguments: json, method, uri
+* json: json file for response body.
+* method: POST, PUT, GET, DELETE.
+* uri: uri where the json response is served.
+
+Example:
+```
+- action: DA/serve_json
+  arguments:
+    json: reponse.json
+    method: POST
+    uri: <uri-where-to-serve>
+```
+
diff --git a/example/diameter/launcher/deployments/aots-setup/agents/HTTPMOCK/Provision.sh b/example/diameter/launcher/deployments/aots-setup/agents/HTTPMOCK/Provision.sh
new file mode 100755 (executable)
index 0000000..7da49eb
--- /dev/null
@@ -0,0 +1,36 @@
+#!/bin/bash
+
+usage() {
+  cat << EOF
+
+  Usage: $0 <test id> <step id> <test path> <address> <mock json> <method: POST|PUT|GET|DELETE> <uri>
+
+EOF
+  exit 1
+}
+
+[ -z "$7" ] && usage
+
+control_post_request=$(mktemp)
+cat << EOF > ${control_post_request}
+{
+  "control": {
+    "flowId": "$1",
+    "flowStepId": "$2",
+    "flowPath":"$3"
+  },
+  "action": {
+    "id": "serve_json",
+    "arguments": {
+      "json": "$5",
+      "method": "$6",
+      "uri": "$7"
+    }
+  }
+}
+EOF
+
+CONTROL_URI=http://$4/aots-control/v1/ctrl/action/annotate
+CURL="curl -s --http2-prior-knowledge"
+${CURL} -d@${control_post_request} -H "Content-Type: application/json" -X $6 ${CONTROL_URI}/serve_json >/dev/null
+rm ${control_post_request}
diff --git a/example/diameter/launcher/deployments/aots-setup/agents/KAFKA/ACTIONS.md b/example/diameter/launcher/deployments/aots-setup/agents/KAFKA/ACTIONS.md
new file mode 100644 (file)
index 0000000..bf7d7b1
--- /dev/null
@@ -0,0 +1,93 @@
+# KAFKA actions
+
+## consume_json
+
+Consume until reception of json message.
+
+Arguments: json[, auto_offset_reset, timeout, background, debug]
+* json: json file that we want to wait for ('any' to skip matching).
+* timeout: timeout for the operation in seconds.
+* auto_offset_reset: auto offset reset (earliest, latest, etc.). By default: latest.
+* background: "yes"|["no"]. Executes the step in background. By default is blocking, allowing to gather the result code for the step.
+* debug: "yes"|["no"]. Python kafka library debug information.
+
+Example:
+```
+- action: SMPC/consume_json
+  arguments:
+    json: expected.json
+    timeout: 5
+    auto_offset_reset: earliest
+```
+
+## produce_json
+
+Produces a json message to the kafka message bus.
+
+Arguments: json[, delay_ms, background, debug]
+* json: json file that we want to produce.
+* delay_ms: delay before producing in milliseconds.
+* background: "yes"|["no"]. Executes the step in background. By default is blocking, allowing to gather the result code for the step.
+* debug: "yes"|["no"]. Python kafka library debug information.
+
+Example:
+```
+- action: SMPC/produce_json:
+  arguments:
+    json: produced.json
+```
+
+## admin
+
+Administration actions.
+
+Arguments: operation[, debug]
+* operation: only 'clean_topic' implemented
+* debug: "yes"|["no"]. Python kafka library debug information.
+
+clean_topic: administration operation to clear message bus in case you want to consume reading earliest messages in the queue. By default, consumer offsets to latest message, but it won't see nothing if it is launched after production of the expected message. Depending on the way you define the test case, you will need clean or not the message bus.
+
+* Example(1): given an 'SMPC' kafka node:
+
+```
+- action: SMPC/admin:
+  arguments:
+    operation: clean_topic
+
+- action: AF/send_xml_to_entity
+  arguments:
+    xml: AAR.xml
+
+- action: SPMC/consume_json
+  arguments:
+    json: expected.json
+    auto_offset_reset: earliest
+```
+
+* Example(2): given an 'SMPC' kafka node:
+
+```
+- action: SPMC/consume_json
+  arguments:
+    json: expected.json
+    background: "yes"
+
+- action: AF/send_xml_to_entity
+  arguments:
+    xml: AAR.xml
+```
+
+* Example(3): given an 'SMPC' kafka node:
+
+```
+- action: SPMC/produce_json
+  arguments:
+    json: produced.json
+    delay_ms: 200
+    background: "yes"
+
+- action: AF/wait_xml_from_entity
+  arguments:
+    xml: ASR.xml
+```
+
diff --git a/example/diameter/launcher/deployments/aots-setup/agents/KAFKA/Admin.py b/example/diameter/launcher/deployments/aots-setup/agents/KAFKA/Admin.py
new file mode 100644 (file)
index 0000000..060faee
--- /dev/null
@@ -0,0 +1,92 @@
+#!/usr/bin/env python
+
+import os, sys, datetime, logging
+
+from kafka.admin import KafkaAdminClient
+from argparse import ArgumentParser
+
+from kafka.errors import (UnknownError, KafkaConnectionError, FailedPayloadsError,
+                          KafkaTimeoutError, KafkaUnavailableError,
+                          LeaderNotAvailableError, UnknownTopicOrPartitionError,
+                          NotLeaderForPartitionError, ReplicaNotAvailableError)
+
+
+def _exit(message = None, rc=0):
+  if (message): printMsg(message)
+  printMsg("Exiting [rc={}]".format(rc))
+  sys.exit(rc)
+
+
+def timeFormat():
+  return '%b.%d.%Y-%H.%M.%S.%f'
+
+
+def printMsg(message):
+  print ("[{}] [{}] {}".format(datetime.datetime.now().strftime(timeFormat()), GNode, message))
+
+
+class MyKafkaAdmin:
+    kafka_service = os.environ.get('KAFKA_SERVER')
+    kafka_port = os.environ.get('KAFKA_PORT')
+
+    if not kafka_service: kafka_service = "localhost"
+    if not kafka_port: kafka_port = "9092"
+
+    server = kafka_service + ':' + kafka_port
+
+    def __init__(self, topic, rtopic):
+
+      # Topic:
+      printMsg("Working topic: '{}'".format(topic))
+
+      # Action 'remove topic':
+      printMsg("Remove topic from message bus: {}".format(str(rtopic)))
+
+      if (rtopic):
+        admin = KafkaAdminClient(bootstrap_servers=self.server)
+        try:
+          admin.delete_topics([topic])
+        except UnknownTopicOrPartitionError as e:
+          printMsg("UnknownTopicOrPartitionError => missing messages for topic (removal considered successful)")
+
+
+def parse_arguments():
+
+  parser = ArgumentParser(description='Kafka Manager')
+  parser.add_argument('-n', '--node', help='Node name (spaces are removed)', required=True)
+  parser.add_argument('-t', '--topic', help='Kafka topic', required=True)
+  parser.add_argument('-r', '--remove-topic', help='Remove topic from message bus', required=False, action='store_true')
+  parser.add_argument('-d', '--debug', help='Debug kafka', required=False, action='store_true')
+
+  arguments = parser.parse_args()
+
+  return arguments
+
+
+#####################
+#      M A I N      #
+#####################
+
+if __name__ == "__main__":
+
+  arguments = parse_arguments()
+
+  GNode = arguments.node.replace(" ", "")
+  topic = arguments.topic
+  rtopic = arguments.remove_topic
+  debug = arguments.debug
+
+  printMsg("Starting")
+
+  if (debug):
+    now = datetime.datetime.now().strftime(timeFormat())
+    logfile='{}-Admin-{}.log'.format(GNode, now)
+    printMsg("Logging kafka in: '{}'".format(logfile))
+    logging.basicConfig(filename=logfile, format='%(asctime)s - %(message)s', datefmt=timeFormat(), level=logging.DEBUG)
+
+  try:
+    admin = MyKafkaAdmin(topic, rtopic)
+    _exit()
+
+  except Exception as e:
+    _exit(e, 1)
diff --git a/example/diameter/launcher/deployments/aots-setup/agents/KAFKA/Consumer.py b/example/diameter/launcher/deployments/aots-setup/agents/KAFKA/Consumer.py
new file mode 100644 (file)
index 0000000..5b3d56c
--- /dev/null
@@ -0,0 +1,177 @@
+#!/usr/bin/env python
+
+import os, sys, re, datetime, logging, json, signal
+
+from kafka import KafkaConsumer
+from json import loads
+from argparse import ArgumentParser
+
+
+def _exit(message = None, rc=0):
+  if (message): printMsg(message)
+  printMsg("Exiting [rc={}]".format(rc))
+  sys.exit(rc)
+
+def timeFormat():
+  return '%b.%d.%Y-%H.%M.%S.%f'
+
+
+def printMsg(message):
+  print ("[{}] [{}] {}".format(datetime.datetime.now().strftime(timeFormat()), GNode, message))
+
+
+class MyKafkaConsumer:
+    kafka_service = os.environ.get('KAFKA_SERVER')
+    kafka_port = os.environ.get('KAFKA_PORT')
+
+    if not kafka_service: kafka_service = "localhost"
+    if not kafka_port: kafka_port = "9092"
+
+    server = kafka_service + ':' + kafka_port
+
+    def __init__(self, topic, mregexp, aor, showReadWhenMatchingEnabled):
+
+        # Auto offset reset:
+        printMsg("Auto offset reset: '{}'".format(aor))
+
+        # Topic:
+        printMsg("Working topic: '{}'".format(topic))
+
+        # Show fulfilled:
+        self.showReadWhenMatchingEnabled = showReadWhenMatchingEnabled
+
+        # Json content:
+        self.json = None
+        if GJfile:
+          with open(GJfile) as json_file:
+            self.json = json.load(json_file)
+          printMsg("Established break condition for expected json ('{}'): {}".format(GJfile, self.json))
+        else:
+          printMsg("No expected json ('any' selected)")
+
+        # Interpreted as regexp indicator:
+        self.mregexp = mregexp
+        if GJfile:
+          if (self.mregexp): printMsg("Json file will be matched as regular expression")
+          else: printMsg("Json file will be matched as exact comparison")
+
+
+        self.consumer = KafkaConsumer(topic,
+                        bootstrap_servers=[self.server],
+                        auto_offset_reset=aor,
+                        enable_auto_commit=True,
+                        value_deserializer=lambda x:
+                        json.loads(x.decode('utf-8')))
+
+    def match(self, json):
+       if self.mregexp:
+         for key, value in  sorted(json.items()):
+           match = re.match(self.json[key], value)
+           if not match: return False
+         return True
+
+       else:
+         return (sorted(self.json.items()) == sorted(json.items()))
+
+    def receive_data(self):
+        printMsg('Reading data from kafka ...')
+
+        for message in self.consumer:
+            # Show read
+            if (self.showReadWhenMatchingEnabled if self.json else True):
+              printMsg('Data read: {}'.format(message))
+
+            # Break condition (in case that a expected json is blocking consumer):
+            if (self.json):
+              #if (sorted(self.json.items()) == sorted(message.value.items())):
+              if (self.match(message.value)):
+                printMsg('Message retrieved: condition fulfilled !')
+                return message
+              else:
+                global GSequence
+                GSequence += 1
+                #saved='{}.read.{}.json'.format(os.path.basename(GJfile), GSequence)
+                saved='{}.read.{}.json'.format(GJfile, GSequence)
+                with open(saved, 'w') as outfile:
+                  json.dump(message.value, outfile)
+
+                printMsg('Message retrieved: condition not fulfilled (saved {}) !'.format(saved))
+
+
+    def close (self):
+      self.consumer.close()
+
+
+def handler_function(signum, frame):
+  rc=0
+  if (GJfile): rc=1
+  _exit('Timeout !', rc)
+
+
+def parse_arguments():
+
+  parser = ArgumentParser(description='Kafka Consumer Simulator')
+  parser.add_argument('-n', '--node', help='Node name (spaces are removed)', required=True)
+  parser.add_argument('-t', '--topic', help='Kafka topic', required=True)
+  parser.add_argument('-o', '--auto-offset-reset', help='Auto offset reset (earliest, latest, etc.). By default: latest', required=False)
+  parser.add_argument('-f', '--file', help='Json file to consume (consumer will break execution with rc=0)', required=False)
+  parser.add_argument('-m', '--match-regexp', help='Match file as regexp (exact match by default)', required=False, action='store_true')
+  parser.add_argument('-w', '--timeout', help='Timeout (in seconds) for completion. Timeout will break execution with rc=1', required=False)
+  parser.add_argument('-d', '--debug', help='Debug kafka', required=False, action='store_true')
+  parser.add_argument('-r', '--show-read-when-matching-enabled', help='Show read messages. False by default when json file for matching is provided.', required=False, action='store_true')
+
+  arguments = parser.parse_args()
+
+  return arguments
+
+
+#####################
+#      M A I N      #
+#####################
+
+if __name__ == "__main__":
+
+  arguments = parse_arguments()
+
+  GNode = arguments.node.replace(" ", "")
+  topic = arguments.topic
+  auto_offset_reset = arguments.auto_offset_reset
+  GJfile = arguments.file
+  mregexp = arguments.match_regexp
+  timeout = arguments.timeout
+  debug = arguments.debug
+  show_read_when_matching_enabled = arguments.show_read_when_matching_enabled
+
+  GSequence = 0
+
+  printMsg("Starting")
+
+  if (debug):
+    now = datetime.datetime.now().strftime(timeFormat())
+    logfile='{}-Consumer-{}.log'.format(GNode, now)
+    printMsg("Logging kafka in: '{}'".format(logfile))
+    logging.basicConfig(filename=logfile, format='%(asctime)s - %(message)s', datefmt=timeFormat(), level=logging.DEBUG)
+
+  if (timeout):
+    printMsg("Established timeout for consumer: '{} seconds'".format(timeout))
+    # Signal to terminate after timeout:
+    signal.signal(signal.SIGALRM,handler_function)
+    signal.alarm(int(timeout))
+
+
+  if not GJfile:
+    if (mregexp): printMsg("To match json file as regexp, you must provide the file. See help (-h) !")
+    printMsg("Show messages read (matching is enabled): {}".format(str(show_read_when_matching_enabled)));
+
+  if not auto_offset_reset: auto_offset_reset='latest'
+
+  consumer = None
+  try:
+    consumer = MyKafkaConsumer(topic, mregexp, auto_offset_reset, show_read_when_matching_enabled)
+    consumer.receive_data()
+    consumer.close()
+    _exit()
+
+  except Exception as e:
+    consumer.close()
+    _exit(e, 1)
diff --git a/example/diameter/launcher/deployments/aots-setup/agents/KAFKA/Producer.py b/example/diameter/launcher/deployments/aots-setup/agents/KAFKA/Producer.py
new file mode 100644 (file)
index 0000000..f969c63
--- /dev/null
@@ -0,0 +1,125 @@
+#!/usr/bin/env python
+
+import os, sys, datetime, logging, json, time
+
+from kafka import KafkaProducer
+from json import loads
+from argparse import ArgumentParser
+
+
+def _exit(message = None, rc=0):
+  if (message): printMsg(message)
+  printMsg("Exiting [rc={}]".format(rc))
+  sys.exit(rc)
+
+
+def timeFormat():
+  return '%b.%d.%Y-%H.%M.%S.%f'
+
+
+def printMsg(message):
+  print ("[{}] [{}] {}".format(datetime.datetime.now().strftime(timeFormat()), GNode, message))
+
+
+class MyKafkaProducer:
+    kafka_service = os.environ.get('KAFKA_SERVER')
+    kafka_port = os.environ.get('KAFKA_PORT')
+
+    if not kafka_service: kafka_service = "localhost"
+    if not kafka_port: kafka_port = "9092"
+
+    server = kafka_service + ':' + kafka_port
+
+    def __init__(self):
+        self.producer = KafkaProducer(bootstrap_servers=[self.server],
+                        value_serializer=lambda x:
+                        json.dumps(x).encode('utf-8'))
+
+    def send_data(self, topic, data):
+        json = self.__read_json_data(data)
+        self.producer.send(topic, value=json)
+        self.producer.flush()
+        printMsg("Json produced on topic '{}': {}".format(topic, json))
+
+    def __read_json_data(self,jsonData):
+        with open(jsonData,'r') as schema_file:
+            schema_data = schema_file.read()
+        schema = json.loads(schema_data)
+        return schema
+
+    def set_producer_topic(self, kafka_topic):
+        self.kafka_topic = kafka_topic
+
+    def close(self):
+        self.producer.close()
+
+class MyProducer:
+    #def __init__(self):
+    producer = MyKafkaProducer()
+
+    def send_data(self, topic, data):
+        self.producer.send_data(topic, data)
+
+    def close(self):
+        self.producer.close()
+
+
+def parse_arguments():
+
+  parser = ArgumentParser(description='Kafka Producer Simulator')
+  parser.add_argument('-n', '--node', help='Node name (spaces are removed)', required=True)
+  parser.add_argument('-t', '--topic', help='Kafka topic', required=True)
+  parser.add_argument('-w', '--delay', help='Delay (in milliseconds) before producing', required=False)
+  parser.add_argument('-f', '--file', help='Json file to produce', required=True)
+  parser.add_argument('-d', '--debug', help='Debug kafka', required=False, action='store_true')
+
+  arguments = parser.parse_args()
+
+  return arguments
+
+
+#####################
+#      M A I N      #
+#####################
+
+if __name__ == "__main__":
+
+  arguments = parse_arguments()
+
+  GNode = arguments.node.replace(" ", "")
+  topic = arguments.topic
+  delay = arguments.delay
+  jfile = arguments.file
+  debug = arguments.debug
+
+  printMsg("Starting")
+
+  if (debug):
+    now = datetime.datetime.now().strftime(timeFormat())
+    logfile='{}-Producer-{}.log'.format(GNode, now)
+    printMsg("Logging kafka in: '{}'".format(logfile))
+    logging.basicConfig(filename=logfile, format='%(asctime)s - %(message)s', datefmt=timeFormat(), level=logging.DEBUG)
+
+  if not os.path.exists(jfile):
+    _exit("Invalid provided file '{}'".format(jfile), 1)
+
+  if (delay):
+    try:
+      delay = int(delay)
+    except:
+      _exit("Invalid provided delay '{}'. Must be an integer value !".format(str(delay)))
+
+    printMsg("Delay before producing: {} milliseconds ...".format(delay))
+    time.sleep(delay / 1000)
+    printMsg("Delay completed !".format(delay))
+
+  producer = None
+  try:
+    producer = MyProducer()
+    producer.send_data(topic, jfile)
+    producer.close()
+    _exit()
+
+  except Exception as e:
+    producer.close()
+    _exit(e, 1)
diff --git a/example/diameter/launcher/deployments/aots-setup/launcher.py b/example/diameter/launcher/deployments/aots-setup/launcher.py
new file mode 100755 (executable)
index 0000000..88317d6
--- /dev/null
@@ -0,0 +1,991 @@
+#!/usr/bin/env python
+# Anna Agents-Oriented Testing Setup Launcher
+
+# Requires PyYAML: pip install pyyaml
+
+import os, sys, datetime, glob, re, json, time, shutil, filecmp, datetime
+from argparse import ArgumentParser
+import xml.etree.ElementTree
+#from pathlib import Path
+
+from json import loads
+
+# PyYAML
+from yaml import load, dump
+try:
+    from yaml import CLoader as Loader, CDumper as Dumper
+except ImportError:
+    from yaml import Loader, Dumper
+
+from enum import Enum
+
+
+class AttributeType(Enum):
+  Mandatory = "Mandatory"
+  Optional = "Optional"
+
+
+def _exit(message = None, rc=0):
+  if (message): printMsg(message)
+  printMsg("Exiting [rc={}]".format(rc))
+  sys.exit(rc)
+
+
+def timeFormat():
+  return '%b.%d.%Y-%H.%M.%S'
+
+
+def printMsg(message):
+  print ("[{}] {}".format(datetime.datetime.now().strftime(timeFormat()), message))
+
+
+class YamlConfigParser():
+  """
+  Yaml parser
+  """
+  def __init__(self, yaml_config_file):
+    """
+    Convert the yaml file into a Python object
+    """
+    self.data = None
+    try:
+      with open(yaml_config_file, 'r') as ss:
+        self.data = load(ss, Loader=Loader)
+        ss.close()
+
+    except Exception:
+     raise
+
+  def getData(self):
+    return self.data
+
+  def show(self, options):
+    output = dump(self.data, Dumper=Dumper)
+    print(output)
+
+
+def writeFileContent(filename, content):
+  _file = open(filename, "w")
+  _file.write(content)
+  _file.close()
+
+
+def getNodeValue(dictionary, key, attributeType = AttributeType.Mandatory):
+
+  # Type checking:
+  if not isinstance(attributeType, AttributeType):
+    raise TypeError("'attributeType' must be an instance of AttributeType Enum")
+
+  value = None
+  try:
+    value = dictionary[key]
+  except Exception as e:
+    if (attributeType == AttributeType.Mandatory): _exit ("Missing mandatory key: {}".format(e) , 1)
+
+  #printMsg("getNodeValue -> {}: {}".format(key, value))
+  return value
+
+
+def get_parent_dir(_file):
+  abspath = os.path.abspath(_file)
+  return os.path.dirname(abspath)
+
+
+def is_absolute_path(path):
+  return os.path.isabs(path)
+
+
+def provision_begin(iplimit):
+  global GProvisionContent
+
+  GProvisionContent += '''test|report
+test|ip-limit|{}
+test|dump-stdout|yes
+'''.format(iplimit)
+
+def assertFile(filepath):
+  if not (os.path.exists(filepath)):
+    raise Exception ("File '{}' not found !".format(filepath))
+
+
+def assertAgentId(agent_id):
+  global agents_ADML_dir
+  global agents_KAFKA_dir
+  global agents_HTTPMOCK_dir
+
+  adml_node_file = agents_ADML_dir + "/{}.node".format(agent_id)
+  kafka_node_file = agents_KAFKA_dir + "/{}.node".format(agent_id)
+  httpmock_node_file = agents_HTTPMOCK_dir + "/{}.node".format(agent_id)
+  if (os.path.exists(adml_node_file)):
+    return "ADML"
+  elif (os.path.exists(kafka_node_file)):
+    return "KAFKA"
+  elif (os.path.exists(httpmock_node_file)):
+    return "HTTPMOCK"
+  else:
+    raise Exception ("Agent id '{}' not found as registered. Check the agents yaml configuration loaded !".format(agent_id))
+
+
+def modify_xml_avp_data(stepNumber, arguments):
+  assertSupportedKeys(stepNumber, arguments, ["xml", "new_xml", "xpath_value_list"])
+
+  _xml = getNodeValue(arguments, "xml")
+  if not is_absolute_path(_xml): _xml = GTcDir + "/" + _xml
+  assertFile(_xml)
+
+  new_xml = getNodeValue(arguments, "new_xml")
+  if not is_absolute_path(new_xml): new_xml = GTcDir + "/" + new_xml
+
+  # xml tree:
+  et = xml.etree.ElementTree.parse(_xml)
+  root = et.getroot()
+
+  xv_list = getNodeValue(arguments, "xpath_value_list")
+  for item in xv_list:
+    assertSupportedKeys(stepNumber, item, ["xpath", "value"])
+    xpath = getNodeValue(item, "xpath")
+    value = getNodeValue(item, "value")
+
+    # Replace operation:
+    targets = root.findall(xpath)
+    for target in targets:
+      if "data" in target.attrib:
+        target.attrib["data"] = value
+      elif "hex-data" in target.attrib:
+        target.attrib["hex-data"] = value
+
+  et.write(new_xml)
+
+
+def modify_json_key_value(stepNumber, arguments):
+  assertSupportedKeys(stepNumber, arguments, ["json", "new_json", "kpath_value_list"])
+
+  _json = getNodeValue(arguments, "json")
+  if not is_absolute_path(_json): _json = GTcDir + "/" + _json
+  assertFile(_json)
+
+  new_json = getNodeValue(arguments, "new_json")
+  if not is_absolute_path(new_json): new_json = GTcDir + "/" + new_json
+
+  # Replace operation:
+  with open(_json, 'r') as json_file:
+    json_data = json_file.read()
+    json_dict = json.loads(json_data)
+
+  kv_list = getNodeValue(arguments, "kpath_value_list")
+  for item in kv_list:
+    assertSupportedKeys(stepNumber, item, ["kpath", "value"])
+    kpath = getNodeValue(item, "kpath")
+    value = getNodeValue(item, "value")
+
+    key_path_list = kpath.split(".")
+    elem = key_path_list[0]
+    if (len(key_path_list) == 1):
+      json_dict[elem] = value
+
+    else:
+      aux_dict = json_dict[elem]
+      #print("aux dict: " + str(aux_dict))
+      for elem in key_path_list[1:-1]:
+        aux_dict = aux_dict[elem]
+
+      aux_dict[key_path_list[-1]] = value
+
+
+  content = json.dumps(json_dict)
+  writeFileContent(new_json, content)
+
+
+def system_cmd(stepNumber, arguments):
+  global GProvisionContent
+
+  assertSupportedKeys(stepNumber, arguments, ["shell", "file", "file_parameters"])
+
+  shell = getNodeValue(arguments, "shell", AttributeType.Optional)
+  _file = getNodeValue(arguments, "file", AttributeType.Optional)
+  fp = getNodeValue(arguments, "file_parameters", AttributeType.Optional)
+  file_parameters = ""
+  if (fp): file_parameters = fp
+
+  if (shell and _file):
+    raise Exception ("Both 'shell' and 'file' cannot be provided at system_cmd action !")
+
+  if (not shell and not _file):
+    raise Exception ("Neither 'shell' nor 'file' have been provided at system_cmd action !")
+
+  if (shell and fp):
+    raise Exception ("Both 'shell' and 'file_parameters' cannot be provided at system_cmd action !")
+
+  if (shell):
+    GProvisionContent += 'test|{}|sh-command|{}\n'.format(GTcNumber, shell)
+
+  elif (_file):
+    if not is_absolute_path(_file): _file = GTcDir + "/" + _file
+    assertFile(_file)
+    GProvisionContent += 'test|{}|sh-command|{} {}\n'.format(GTcNumber, _file, file_parameters)
+
+
+def process_test_case_step_GENERIC(stepNumber, action_id, arguments):
+  global GProvisionContent
+  global GTcNumber
+  global GIpLimit
+
+  if action_id == "sh_command":
+    GProvisionContent += 'test|{}|sh-command|{}\n'.format(GTcNumber, getNodeValue(arguments, "value"))
+  elif action_id == "ip_limit":
+    il = getNodeValue(arguments, "value")
+    if (il):
+      value = None
+      if (il == "launcher"):
+        value = GIpLimit
+      else:
+        value = il
+
+      GProvisionContent += 'test|{}|ip-limit|{}\n'.format(GTcNumber, value)
+
+  elif action_id == "timeout_ms":
+    GProvisionContent += 'test|{}|timeout|{}\n'.format(GTcNumber, getNodeValue(arguments, "value"))
+  elif action_id == "delay_ms":
+    GProvisionContent += 'test|{}|delay|{}\n'.format(GTcNumber, getNodeValue(arguments, "value"))
+  elif action_id == "modify_xml_avp_data":
+    # Always create the step or step references will be impossible to determine:
+    GProvisionContent += 'test|{}|sh-command|echo "{}"\n'.format(GTcNumber, "Replacing xml file: " + str(arguments))
+    modify_xml_avp_data(stepNumber, arguments)
+  elif action_id == "modify_json_key_value":
+    # Always create the step or step references will be impossible to determine:
+    GProvisionContent += 'test|{}|sh-command|echo "{}"\n'.format(GTcNumber, "Replacing json file: " + str(arguments))
+    modify_json_key_value(stepNumber, arguments)
+  elif action_id == "system_cmd":
+    system_cmd(stepNumber, arguments)
+  else:
+    raise Exception("ERROR: Step {}: unsupported generic action-id '{}'".format(stepNumber, action_id))
+
+
+def assertSupportedKeys(stepNumber, arguments, supported):
+  for key in arguments:
+    if not key in supported:
+      raise Exception("ERROR: Step {}: unsupported argument '{}' (allowed: {})".format(stepNumber, key, str(supported)))
+
+
+def process_test_case_step_ADML(stepNumber, agent_id, action_id, arguments):
+  global GProvisionContent
+  global GTcDir
+
+  if action_id == "send_xml_to_entity":
+    assertSupportedKeys(stepNumber, arguments, ["xml", "answers_to"])
+
+    xml = getNodeValue(arguments, "xml")
+    if not is_absolute_path(xml): xml = GTcDir + "/" + xml
+    assertFile(xml)
+
+    at = getNodeValue(arguments, "answers_to", AttributeType.Optional)
+    answers_to = ""
+    if (at): answers_to = "|{}".format(at)
+
+    GProvisionContent += 'test|{}|sendxml2e|{}{}\n'.format(GTcNumber, xml, answers_to)
+
+  elif action_id == "wait_xml_from_entity":
+    assertSupportedKeys(stepNumber, arguments, ["xml"])
+
+    xml = getNodeValue(arguments, "xml")
+    if not is_absolute_path(xml): xml = GTcDir + "/" + xml
+    assertFile(xml)
+
+    GProvisionContent += 'test|{}|waitfe-xml|{}\n'.format(GTcNumber, xml)
+
+  elif action_id == "send_xml_to_client":
+    assertSupportedKeys(stepNumber, arguments, ["xml", "answers_to"])
+
+    xml = getNodeValue(arguments, "xml")
+    if not is_absolute_path(xml): xml = GTcDir + "/" + xml
+    assertFile(xml)
+
+    at = getNodeValue(arguments, "answers_to", AttributeType.Optional)
+    answers_to = ""
+    if (at): answers_to = "|{}".format(at)
+
+    GProvisionContent += 'test|{}|sendxml2c|{}{}\n'.format(GTcNumber, xml, answers_to)
+
+  elif action_id == "wait_xml_from_client":
+    assertSupportedKeys(stepNumber, arguments, ["xml"])
+
+    xml = getNodeValue(arguments, "xml")
+    if not is_absolute_path(xml): xml = GTcDir + "/" + xml
+    assertFile(xml)
+
+    GProvisionContent += 'test|{}|waitfc-xml|{}\n'.format(GTcNumber, xml)
+
+  else:
+    raise Exception("ERROR: Step {}: unsupported generic action-id '{}' for ADML node type (agent '{}')".format(stepNumber, action_id, agent_id))
+
+
+def process_test_case_step_HTTPMOCK(stepNumber, agent_id, action_id, arguments):
+  global GProvisionContent
+  global GTcDir
+  global agents_HTTPMOCK_dir
+
+  if action_id == "serve_json":
+    assertSupportedKeys(stepNumber, arguments, ["json", "method", "uri"])
+
+    json = getNodeValue(arguments, "json")
+    if not is_absolute_path(json): json = GTcDir + "/" + json
+    assertFile(json)
+
+    method = getNodeValue(arguments, "method")
+    uri = getNodeValue(arguments, "uri")
+
+
+    # Provision script is in the form: agents/HTTPMOCK/<agent-id>-provision.sh
+    provision_script = agents_HTTPMOCK_dir + "/" + agent_id + "-provision.sh "
+    args = str(GTcNumber) + " " + str(stepNumber) + " " + GTcDir + " \"" + json + "\" " + method + " \"" + uri + "\""
+    GProvisionContent += 'test|{}|sh-command|{}\n'.format(GTcNumber, provision_script + args)
+
+  else:
+    raise Exception("ERROR: Step {}: unsupported generic action-id '{}' for HTTPMOCK node type (agent '{}')".format(stepNumber, action_id, agent_id))
+
+
+def process_test_case_step_KAFKA(stepNumber, agent_id, action_id, arguments):
+  global GProvisionContent
+  global GTcDir
+  global agents_KAFKA_dir
+
+  if action_id == "consume_json":
+    assertSupportedKeys(stepNumber, arguments, ["json", "timeout", "auto_offset_reset", "background", "debug"])
+
+    json = getNodeValue(arguments, "json")
+    if json != "any":
+      if not is_absolute_path(json): json = GTcDir + "/" + json
+      assertFile(json)
+
+    autoOffsetReset = ""
+    aor = getNodeValue(arguments, "auto_offset_reset", AttributeType.Optional)
+    if (aor): autoOffsetReset = aor
+
+    timeout = 0
+    to = getNodeValue(arguments, "timeout", AttributeType.Optional)
+    if(to): timeout = to
+
+    background = ""
+    bck = getNodeValue(arguments, "background", AttributeType.Optional)
+    if (bck == "yes"): background = "&"
+
+    debug = "no"
+    deb = getNodeValue(arguments, "debug", AttributeType.Optional)
+    if (deb): debug = deb
+
+    # Consumer script is in the form: agents/KAFKA/<agent-id>-consumer.sh
+    consumer_script = agents_KAFKA_dir + "/" + agent_id + "-consumer.sh "
+    args = json + " " + autoOffsetReset + " " + str(timeout) + " " + debug
+    GProvisionContent += 'test|{}|sh-command|{}{}\n'.format(GTcNumber, consumer_script + args, background)
+
+  elif action_id == "produce_json":
+    assertSupportedKeys(stepNumber, arguments, ["json", "delay_ms", "background", "debug"])
+
+    json = getNodeValue(arguments, "json")
+    if not is_absolute_path(json): json = GTcDir + "/" + json
+    assertFile(json)
+
+    delay_ms = 0
+    dl = getNodeValue(arguments, "delay_ms", AttributeType.Optional)
+    if(dl): delay_ms = dl
+
+    background = ""
+    bck = getNodeValue(arguments, "background", AttributeType.Optional)
+    if (bck == "yes"): background = "&"
+
+    debug = "no"
+    deb = getNodeValue(arguments, "debug", AttributeType.Optional)
+    if (deb): debug = deb
+
+    # Producer script is in the form: agents/KAFKA/<agent-id>-producer.sh
+    producer_script = agents_KAFKA_dir + "/" + agent_id + "-producer.sh "
+    args = json + " " + str(delay_ms) + " " + debug
+    GProvisionContent += 'test|{}|sh-command|{}{}\n'.format(GTcNumber, producer_script + args, background)
+
+  elif action_id == "admin":
+    assertSupportedKeys(stepNumber, arguments, ["operation", "debug"])
+
+    operation = getNodeValue(arguments, "operation")
+
+    debug = "no"
+    deb = getNodeValue(arguments, "debug", AttributeType.Optional)
+    if (deb): debug = deb
+
+    # Admin script is in the form: agents/KAFKA/<agent-id>-admin.sh
+    admin_script = agents_KAFKA_dir + "/" + agent_id + "-admin.sh "
+    args = operation + " " + debug
+    GProvisionContent += 'test|{}|sh-command|{}\n'.format(GTcNumber, admin_script + args)
+
+  else:
+    raise Exception("ERROR: Step {}: unsupported generic action-id '{}' for KAFKA node type (agent '{}')".format(stepNumber, action_id, agent_id))
+
+
+def process_test_case_step(stepNumber, dictionary):
+
+  action = getNodeValue(dictionary, "action")
+  arguments = getNodeValue(dictionary, "arguments")
+
+  # Action is in the form '[agent id/]<action id>':
+  # OPTIONAL: agent_id
+  # MANDATORY: action_id
+  agent_id = None
+  agent_template = None
+  try:
+    agent_id, action_id = action.split('/')
+    agent_template = assertAgentId(agent_id)
+
+  except ValueError:
+    action_id = action
+    pass
+
+  # Actions for ADML
+  if agent_template == "ADML":
+    process_test_case_step_ADML(stepNumber, agent_id, action_id, arguments)
+  elif agent_template == "KAFKA":
+    process_test_case_step_KAFKA(stepNumber, agent_id, action_id, arguments)
+  elif agent_template == "HTTPMOCK":
+    process_test_case_step_HTTPMOCK(stepNumber, agent_id, action_id, arguments)
+  else:
+    process_test_case_step_GENERIC(stepNumber, action_id, arguments)
+
+  #trace = "Step {}, Agent-Id '{}', Action-Id '{}', Parameters: {}"
+  #print(trace.format(stepNumber, str(agent_id), action_id, str(arguments)))
+
+
+def  process_test_case_yml(testcaseList):
+  for step in testcaseList:
+    indx = testcaseList.index(step)
+    process_test_case_step(indx+1, step)
+
+
+def provision_test_case(filename, testcaseList):
+
+  global GTcNumber
+  global GTcDir
+  global GIdsVsDescs
+  global GProvisionContent
+  GTcNumber += 1
+  GTcDir = get_parent_dir(filename)
+
+  id_desc = "{} : {}".format(GTcNumber, filename)
+  GIdsVsDescs += id_desc + "\n"
+  tc_desc = "test case '{}'".format(id_desc)
+
+  printMsg("Provisioning {} ...".format(tc_desc))
+
+  # Set test case description
+  GProvisionContent += 'test|{}|description|{}\n'.format(GTcNumber, filename)
+
+  # Process the yml definition for the test case
+  process_test_case_yml(testcaseList)
+
+
+def provision_tests(files):
+  for filename in files.splitlines():
+    if (filename[0] == "#"):
+      printMsg("Ignoring commented test case: '{}'".format(filename))
+    else:
+      # Test case is a list of steps:
+      tc = YamlConfigParser(filename)
+      provision_test_case(filename, tc.getData())
+
+
+def parse_arguments():
+
+  parser = ArgumentParser(description='Anna Agents-Oriented Testing Setup Launcher')
+  parser.add_argument('-t', '--tests-dir', help='Tests parent directory where to find .yml files (from the next directories level)', required=True)
+  parser.add_argument('-k', '--keep-list-if-exists', help='Keeps intact the list of test cases (<test-dir>/launcher.list), creates it if missing', required=False, action='store_true')
+  parser.add_argument('-s', '--stop-adml-at-the-end', help='At the end, ADML keeps running to ease debugging. You could force stop with this option', required=False, action='store_true')
+  parser.add_argument('-i', '--interactive', help='Interactive execution to ease debugging of test cases', required=False, action='store_true')
+  parser.add_argument('-d', '--dry-run', help='Used to test and debug provision, no execution is launched', required=False, action='store_true')
+  parser.add_argument('-p', '--ip-limit', help="In-Progress limit is the number of coexisting In-Progress State test cases. Defaults to 1 (sequential), -1 would be 'no limit').", required=False)
+  parser.add_argument('-r', '--ttps', help="Rate of test cases launched (test ticks per second). By default 50 (recommended for monothread version).", required=False)
+
+
+  arguments = parser.parse_args()
+
+  return arguments
+
+
+def start_agents():
+  # At the moment, only ADML is started (KAFKA/HTTPMOCK agents uses scripts):
+  global agents_ADML_dir
+
+  rc = 1
+  maxRetries = 5
+  retry = 0
+  os.system(agents_ADML_dir + "/stop.sh")
+  os.system(agents_ADML_dir + "/start.sh")
+
+  rc = adml_operation("node >/dev/null")
+  while rc != 0:
+    retry += 1
+    if (retry > maxRetries): break
+    time.sleep(1)
+    printMsg("Check ADML health retry ({}/{}) ...".format(retry, maxRetries))
+    rc = adml_operation("node >/dev/null")
+
+  return rc
+
+
+def adml_operation(arguments):
+  global agents_ADML_dir
+
+  rc = os.system(agents_ADML_dir + "/operation.sh " + arguments)
+  return rc
+
+
+def adml_operation_output(operation):
+  global agents_ADML_dir
+
+  output = os.popen(agents_ADML_dir + "/operation.sh {}".format(operation)).read()
+  return output
+
+
+def collect_results(abs_tdir):
+  global agents_ADML_dir
+
+  # Logs directory:
+  logs_dir = abs_tdir + ".logs"
+  shutil.rmtree(logs_dir, ignore_errors=True)
+  os.mkdir(logs_dir)
+  os.mkdir(logs_dir + "/traffic")
+  os.mkdir(logs_dir + "/counters")
+  os.mkdir(logs_dir + "/test-reports")
+  os.mkdir(logs_dir + "/debug")
+
+  # Summary states:
+  print("\n\n")
+  printMsg("Retrieving tests summary states ...")
+  statesOUTPUT = adml_operation_output("\"test|summary-states\"")
+  writeFileContent(logs_dir + "/tests.summary-states", statesOUTPUT)
+
+  # Summary counts:
+  print("\n\n")
+  printMsg("Retrieving tests summary counts ...")
+  verdictOUTPUT = adml_operation_output("\"test|summary-counts\"")
+  writeFileContent(logs_dir + "/tests.summary-counts", verdictOUTPUT)
+  verdictRC = 1
+  if "PASS" in verdictOUTPUT: verdictRC = 0
+
+  # Traffic logs:
+  # ADML
+  printMsg("Retrieving diameter traffic logs ...")
+  for f in glob.glob(agents_ADML_dir + "/*.log"):
+    shutil.copy(f, logs_dir + "/traffic")
+  for f in glob.glob(agents_ADML_dir + "/*.xml"):
+    shutil.copy(f, logs_dir + "/traffic")
+  # KAFKA
+  printMsg("Retrieving kafka traffic logs ...")
+  for f in glob.glob(agents_KAFKA_dir + "/*.log"):
+    shutil.copy(f, logs_dir + "/traffic")
+  for f in glob.glob(agents_KAFKA_dir + "/*.json"):
+    shutil.copy(f, logs_dir + "/traffic")
+
+  # HTTPMOCK
+  #printMsg("Retrieving httpmock activity logs ...")
+  #...
+
+  printMsg("Generating junit report ...")
+  writeFileContent(logs_dir + "/junit.xml", adml_operation_output("\"test|junit\""))
+  printMsg("Generating tests summary ...")
+  writeFileContent(logs_dir + "/tests.summary", adml_operation_output("\"test|summary\""))
+
+  printMsg("Generating tests oam reports ...")
+  writeFileContent(logs_dir + "/tests.oam", adml_operation_output("\"show-oam\""))
+  printMsg("Generating tests statistics ...")
+  writeFileContent(logs_dir + "/tests.stats", adml_operation_output("\"show-stats\""))
+  printMsg("Dumping ADML process context information ...")
+  adml_operation("\"context|{}\" >/dev/null".format(logs_dir + "/adml.context"))
+  adml_operation("forceCountersRecord >/dev/null")
+
+  # Move 'counters' and 'test-reports'
+  printMsg("Retrieving counters information ...")
+  for f in glob.glob(agents_ADML_dir + "/counters/*"):
+    shutil.copy(f, logs_dir + "/counters")
+  printMsg("Retrieving tests reports information ...")
+  for f in glob.glob(agents_ADML_dir + "/test-reports/*"):
+    shutil.copy(f, logs_dir + "/test-reports")
+
+  # Debug:
+  printMsg("Retrieving debug information ...")
+  for f in glob.glob(agents_ADML_dir + "/launcher.trace*"):
+    shutil.copy(f, logs_dir + "/debug")
+
+  # Backup tests directory itself (some replacements could be happened):
+  target_once_executed = logs_dir + "/debug/" + os.path.basename(abs_tdir)
+  shutil.copytree(abs_tdir, target_once_executed) # , symlinks=True)
+
+  return statesOUTPUT, verdictOUTPUT, verdictRC
+
+
+def interactive_execution():
+  printMsg("Starting interactive execution of test cases")
+
+  stay = True
+  while stay:
+    print("--------------------------------------------")
+    adml_operation("\"test|summary-counts\"")
+    print("--------------------------------------------")
+
+    print ('''
+    MAIN INTERACTIVE MENU
+    =====================
+    (prefix option with 'h' to get detailed help)
+
+    General:
+    0.  Exit/Quit
+
+    Position:
+    1.  Go to
+    2.  Look
+
+    Test cases execution:
+    3.  Start with test rate
+    4.  Start next N test cases
+    5.  In-progress limit
+
+    Low level execution: test case steps
+    6.  Execute next N steps
+
+    Status & cycling:
+    7.  Reset
+    8.  Pool repeats
+    9.  Reset statistics & counters
+    10. Auto reset
+    11. Reports configuration
+    ''')
+
+    opt=input("Input option: \n")
+    if opt=="h0":
+      print("Just exit this menu")
+    elif opt=="0":
+      stay = False
+
+    elif opt=="h1":
+      print("Updates the current test pointer position.")
+    elif opt=="1":
+      _id=input("Input the test case id: ")
+      adml_operation("\"test|goto|{}\"".format(_id))
+
+    elif opt=="h2":
+      print("Show programmed test case for id provided, current 'in-process' test case when missing.")
+    elif opt=="2":
+      _id=input("Input the test case id [empty will show current]: ")
+      if _id: _id="|" + _id
+      adml_operation("\"test|look{}\"".format(_id))
+
+    elif opt=="h3":
+      print('''
+Starts/resume the provided number of test ticks per second (ttps). The ADML starts
+with the event trigger system suspended, and this operation is neccessary to begin
+those cases which need this time event (internal triggering). Some other test cases
+could be started through external events (first test case event could be programmed
+to wait specific message), but is not usual this external mode and neither usual to
+mix triggering types. Normally, you will pause/stop new test launchs providing 0 as
+ttps value, and also you could dynamically modify the load rate updating that value.
+If a test case has N messages then 'ttps * N' will be the virtual number of messages
+managed per second when no bottleneck exists.
+
+Provide 0 in order to stop the timer triggering.
+
+The timer manager resolution currently harcoded allows a maximum  of 50 events
+per second. To reach greater rates ADML will join synchronously the needed number of
+new time-triggered test cases per a single event, writting a warning-level trace to
+advice about the risk of burst sendings and recommend launching multiple instances
+to achieve such load with a lower rate per instance.''')
+    elif opt=="3":
+      ttps=input("Input the test ticks per second (0: stops the test rate clock): ")
+      adml_operation("\"test|ttps|{}\"".format(ttps))
+
+    elif opt=="h4":
+      print('''
+Forces the execution of the next test case(s) without waiting for test manager tick.
+Provide an integer value for 'sync-amount' to send a burst synchronous amount of the
+next programmed test cases (1 by default). This event works regardless the timer tick
+function, but it is normally used with the test manager tick stopped.''')
+    elif opt=="4":
+      amount=input("Input the number of tests to execute synchronously [1 by default]: ")
+      if not amount: amount=1
+      adml_operation("\"test|next|{}\"".format(amount))
+
+    elif opt=="h5":
+      print('''
+In-progress limit of test cases. No new test cases will be launched over this value
+(test Manager tick work will be ignored). Zero-value is equivalent to stop the clock.
+tick, -1 is used to specify 'no limit'. If missing amount, the limit and current
+amount of in-progress test cases will be shown.
+
+Default is 1 to ensure sequential execution for testcases (function test mode).
+For system test, it is recommended to set '-1' (no limit).''')
+    elif opt=="5":
+      print("\nTypical 'in-progress limit' values:")
+      print("-1: no limit")
+      print(" 0: similar to stop the test rate clock")
+      print(" 1: sequential execution for testcases (function test mode)\n")
+      limit=input("Input the desired in-progress limit amount [show current by default]: ")
+      if limit: limit = "|" + limit
+      adml_operation("\"test|ip-limit{}\"".format(limit))
+
+    elif opt=="h6":
+      print('''
+Makes interactive a specific test case id. The amount is the margin of execution steps
+to be done. With amount of '0' the test case is selected to be interactive, but no step
+is executed. Then you have to interact with positive amounts (usually 1), executing the
+provided number of steps if they are ready and fulfill the needed conditions. The value
+of 0, implies no execution steps margin, which could be useful to 'freeze' a test in the
+middle of its execution.  You could also provide -1 to make it non-interactive resuming
+it from the current step.
+By default, current test case id is selected for interaction.''')
+    elif opt=="6":
+      amount=input("Input the number of steps to execute (-1: resumes the test case; 0: freezes it) [1 by default]: ")
+      if not amount: amount = 1
+      test_id=input("Input the test id [current by default (remember to set a valid pointer with 'go to')]: ")
+      if test_id: test_id = "|" + test_id
+      adml_operation("\"test|interact|{}{}\"".format(amount, test_id))
+
+    elif opt=="h7":
+      print('''
+Reset the test case for id provided, all the tests when missing. It could be hard/soft:
+- hard: you probably may need to stop the load rate before. This operation initializes
+  all test cases regardless their states.
+- soft: only for finished cases (those with 'Success' or 'Failed' states). It does not
+  affect to test cases with 'InProgress' state.''')
+    elif opt=="7":
+      rtype=input("Input the reset type (soft/hard) [hard]: ")
+      if not rtype: rtype = "hard"
+      test_id=input("Input the test id [all tests by default]: ")
+      if test_id: test_id = "|" + test_id
+      adml_operation("\"test|reset|{}{}\"".format(rtype, test_id))
+
+    elif opt=="h8":
+      print('''
+Restarts the whole programmed test list when finished the amount number of times (repeats
+forever if value -1 is provided). This is disabled by default (amount = 0): testing trigger
+system will enter suspended state until new ttps operation is received and a soft reset has
+been done before. Test cases state & data will be reset (when achieved again), but general
+statistics and counters will continue measuring until reset with 'collect' operation.''')
+    elif opt=="8":
+      amount=input("Input the number of cycle repeats (-1: repeats forever; 0: disables repetitions): ")
+      adml_operation("\"test|repeats|{}\"".format(amount))
+
+    elif opt=="h9":
+      print('''
+Reset statistics and counters to start a new test stage of performance measurement.
+This affects to final logs retrieved on exit (option 0).''')
+    elif opt=="9":
+      adml_operation("\"collect\"")
+
+    elif opt=="h10":
+      print('''
+When cycling, current test cases can be soft (default) or hard reset. If no timeout has
+been configured for the test case, hard reset could prevent stuck on the next cycle for
+those test cases still in progress.''')
+    elif opt=="10":
+      rtype=input("Input the reset type (soft/hard) [hard]: ")
+      if not rtype: rtype = "hard"
+      adml_operation("\"test|auto-reset|{}\"".format(rtype))
+
+    elif opt=="h11":
+      print('''
+Enables/disables report generation for a certain test case state: initialized, in-progress,
+failed or success (also 'all' and 'none' reserved words could be used). This applies to report
+summary (final logs retrieved) and automatic dumps during testing where only failed or
+successful states will appear: every time a test case is finished its xml representation will
+be dump on a file under (logs test-reports) with the name:
+
+   'cycle-<cycle id>.testcase-<test case id>.xml'.
+
+By default, all the states are disabled to avoid IO overload. In most of cases not all the
+tests are going to fail then you could enable only such failed dumps. Anyway you could set
+the reports visibility to fit your needs in a given situation.
+
+Also you could enable hexadecimal representation for diameter messages on reports.''')
+    elif opt=="11":
+      print("\nInput the report target operation, capital letters to enable:")
+      rtype=input("(I/i)nitialized, in-(P/p)rogress, (F/f)ailed, (S/s)uccess, (A/a)ll, (N/n)one [A: all will be enabled by default]: ")
+      if not rtype: rtype = "A"
+      target = None
+      enable = "no"
+      upper_rtype = rtype.upper()
+      if (upper_rtype == rtype): enable = "yes"
+      if (upper_rtype == "I" ):
+        target="initialized"
+      elif (upper_rtype == "P"):
+        target="in-progress"
+      elif (upper_rtype == "F"):
+        target="failed"
+      elif (upper_rtype == "S"):
+        target="success"
+      elif (upper_rtype == "A"):
+        target="all"
+      elif (upper_rtype == "N"):
+        target="none"
+
+      if not target:
+        print("Invalid target. Try again !")
+      else:
+        print(" - Target selected: " + target)
+        print(" - Enable:          " + enable)
+        adml_operation("\"test|report|{}|{}\"".format(target, enable))
+
+      enableHex=input("\nEnable/Disable hexadecimal dumps for diameter messages in test reports (yes/no) [no]: ")
+      if not enableHex: enableHex = "no"
+      adml_operation("\"test|report-hex|{}\"".format(enableHex))
+
+    elif opt !="":
+      print("\nInvalid choice. Try again !")
+
+
+    if stay: input("\nPress ENTER to continue ...\n")
+
+
+
+#####################
+#      M A I N      #
+#####################
+
+if __name__ == "__main__":
+
+  # Agents:
+  abspath = os.path.abspath(__file__)
+  dname = os.path.dirname(abspath)
+  agents_KAFKA_dir = dname + "/agents/KAFKA"
+  agents_HTTPMOCK_dir = dname + "/agents/HTTPMOCK"
+  agents_ADML_dir = dname + "/agents/ADML"
+
+  # Injected environment variables (could be used in system_cmd commands:
+  os.putenv("AGENTS_DIR", dname + "/agents")
+
+  arguments = parse_arguments()
+
+  tdir = arguments.tests_dir
+  keep = arguments.keep_list_if_exists
+  stopAdml = arguments.stop_adml_at_the_end
+  interactive = arguments.interactive
+  dryrun = arguments.dry_run
+  iplimit = arguments.ip_limit
+  ttps = arguments.ttps
+
+  # Tests list: 'launcher.list':
+  llist = tdir + "/launcher.list"
+  llist_current = llist + ".updated"
+
+  # Auxiliary:
+  abs_tdir = get_parent_dir(llist)
+  llist_exists = os.path.exists(llist)
+
+  # Create the current list of test cases:
+  list_content = None
+  list_content = os.popen("find {} -mindepth 2 -name \"*.yml\" | sort -t'/'".format(tdir)).read()
+
+  # Performance:
+  if not ttps: ttps = 50
+  if not iplimit: iplimit = 1
+  if iplimit == "auto":
+    printMsg("AUTO IP-LIMIT ALGORITHM IS UNDER CONSTRUCTION (configuring value 1) ... ")
+    iplimit = 1
+
+  GIpLimit = iplimit
+
+
+  if llist_exists:
+    # Detect updates:
+    writeFileContent(llist_current, list_content)
+    if filecmp.cmp(llist, llist_current):
+      os.remove(llist_current)
+    else:
+      printMsg("The list '{}' has been created".format(llist_current))
+      printMsg("Warning: detected local changes (may be commented test cases) in '{}' regarding current tests list '{}'".format(llist, llist_current))
+
+    # Respect existing list (except if -k is not provided):
+    if keep:
+      printMsg("Reuse the current list '{}'".format(llist))
+      with open(llist) as llist_file:
+        list_content = llist_file.read()
+
+  if not llist_exists or not keep:
+    writeFileContent(llist, list_content)
+    printMsg("The list '{}' has been created".format(llist))
+
+
+  try:
+    global GTcNumber
+    global GProvisionContent
+    global GIdsVsDescs
+    GTcNumber = 0
+    GProvisionContent = ""
+    GIdsVsDescs = ""
+
+    provision_begin(iplimit)
+    provision_tests(list_content)
+
+    llist_of_operations = abs_tdir + "/launcher.list.adml_operations"
+    lids = abs_tdir + "/launcher.ids"
+    writeFileContent(llist_of_operations, GProvisionContent)
+    writeFileContent(lids, GIdsVsDescs)
+
+    if dryrun:
+      if interactive: printMsg("Interactive mode is not reached at dry-run mode")
+      _exit("Dry-run execution finished", 0)
+
+    rc = start_agents()
+    if (rc != 0):
+      _exit("Failed to initiate ADML director!", 1)
+
+    # Provision test cases in ADML:
+    adml_operation("-f " + llist_of_operations + " >/dev/null")
+
+
+    if (interactive):
+      interactive_execution()
+
+    else:
+      # Initial time:
+      t_initial = datetime.datetime.now()
+
+      # Start test cases:
+      adml_operation("\"test|ttps|" + str(ttps) + "\"")
+
+      # Estimated time to finish: worst case is timeout (we assume maximum timeout of 15 seconds per test case):
+      # worstTime = 15*GTcNumber
+
+      # We will check the progress: initialized test cases must be 0 again (cycle completed).
+      # But this only is guaranteed if all the tests define a timeout. If not, a wait step could stuck
+      #  any test eternally (worstTime is used to exit the following loop):
+      cycle = 0
+      #sleepTime=15
+      #maxCycles=GTcNumber
+      # Better resolution:
+      #sleepTime=1
+      maxCycles=15*GTcNumber
+
+      while True:
+        cycle += 1
+        #time.sleep(sleepTime)
+        time.sleep(1)
+        output = adml_operation_output("\"test|finished\"")
+        if "test|finished => {}".format(GTcNumber) in output: break
+        if (cycle > maxCycles): break
+        #printMsg("Checking progress ({}/{}) ...".format(cycle, maxCycles))
+        if not (cycle % 60): printMsg("Working ...")
+
+      # Final time:
+      t_final = datetime.datetime.now()
+      t_elapsed = t_final - t_initial
+      elapsedOUTPUT = "\nElapsed time in seconds: {}\n\n".format(t_elapsed.total_seconds())
+
+    # Collect results at tests-directory:
+    statesOUTPUT, verdictOUTPUT, verdictRC = collect_results(abs_tdir)
+
+    # Stop ADML:
+    if stopAdml:
+      printMsg("Stoping ADML director ...")
+      time.sleep(6)
+      os.system(agents_ADML_dir + "/stop.sh >/dev/null")
+
+    # Exit with verdict:
+    _exit(statesOUTPUT + elapsedOUTPUT + verdictOUTPUT, verdictRC)
+
+  except Exception as e:
+    _exit(e, 1)
diff --git a/example/diameter/launcher/deployments/aots-setup/loader.py b/example/diameter/launcher/deployments/aots-setup/loader.py
new file mode 100755 (executable)
index 0000000..608566f
--- /dev/null
@@ -0,0 +1,352 @@
+#!/usr/bin/env python
+# Anna Agents-Oriented Testing Setup Loader
+
+# Requires PyYAML: pip install pyyaml
+
+import os, sys, datetime
+from argparse import ArgumentParser
+
+# PyYAML
+from yaml import load, dump
+try:
+    from yaml import CLoader as Loader, CDumper as Dumper
+except ImportError:
+    from yaml import Loader, Dumper
+
+
+def _exit(message = None, rc=0):
+  if (message): printMsg(message)
+  printMsg("Exiting [rc={}]".format(rc))
+  sys.exit(rc)
+
+
+def timeFormat():
+  return '%b.%d.%Y-%H.%M.%S'
+
+
+def printMsg(message):
+  print ("[{}] {}".format(datetime.datetime.now().strftime(timeFormat()), message))
+
+
+class YamlConfigParser():
+  """
+  Yaml parser
+  """
+  def __init__(self, yaml_config_file):
+    """
+    Convert the yaml file into a Python object
+    """
+    self.data = None
+    try:
+      with open(yaml_config_file, 'r') as ss:
+        self.data = load(ss, Loader=Loader)
+        ss.close()
+
+    except Exception:
+     raise
+
+  def getData(self):
+    return self.data
+
+  def show(self, options):
+    output = dump(self.data, Dumper=Dumper)
+    print(output)
+
+
+def writeFileContent(filename, content):
+  _file = open(filename, "w")
+  _file.write(content)
+  _file.close()
+
+
+def getNodeValue(dictionary, key):
+
+  value = dictionary[key]
+  printMsg("  {}: {}".format(key, value))
+  return value
+
+
+def configure_agent_adml(node, description, application_id, dictionary, _type, origin_host, origin_realm, address):
+
+  # Agent ADML configuration is basically generation of services:
+
+  if (_type == "client"):
+    stacks='''  <stack id="{application_id}" dictionary="{dictionary}" fixMode="Always" ignoreFlagsOnValidation="yes"/>'''.format(application_id=application_id, dictionary=dictionary)
+
+    nodes='''  <node originHost="{origin_host}" applicationId="{application_id}" entity="{address}" cer="cer.{application_id}.xml" answersTimeout="300000" dumpLog="yes"/>'''.format(application_id=application_id, dictionary=dictionary, origin_host=origin_host, address=address)
+
+    ce_path = agents_ADML_dir + "/cer.{}.xml".format(application_id)
+    ce_content='''<message version="1" name="CER" application-id="0">
+   <avp name="Origin-Host" data="{origin_host}"/>
+   <avp name="Origin-Realm" data="{origin_realm}"/>
+   <avp name="Host-IP-Address" data="1|127.0.0.1"/>
+   <avp name="Vendor-Id" data="10415"/>
+   <avp name="Product-Name" data="{description}"/>
+   <avp name="Auth-Application-Id" data="{application_id}"/>
+</message>'''.format(application_id=application_id, origin_host=origin_host, origin_realm=origin_realm, description=description)
+
+  elif (_type == "server"):
+    stacks='''  <stack id="{application_id}" dictionary="{dictionary}" fixMode="Never"/>'''.format(application_id=application_id, dictionary=dictionary)
+
+    nodes='''  <node originHost="{origin_host}" applicationId="{application_id}" diameterServer="{address}" diameterServerSessions="10" cea="cea.{application_id}.xml" answersTimeout="300000" dumpLog="yes"/>'''.format(application_id=application_id, dictionary=dictionary, origin_host=origin_host, address=address)
+
+    ce_path = agents_ADML_dir + "/cea.{}.xml".format(application_id)
+    ce_content='''<message version="1" name="CEA" application-id="0">
+   <avp name="Result-Code" data="2001" alias="DIAMETER_SUCCESS"/>
+   <avp name="Origin-Host" data="{origin_host}"/>
+   <avp name="Origin-Realm" data="{origin_realm}"/>
+   <avp name="Host-IP-Address" data="1|127.0.0.1"/>
+   <avp name="Vendor-Id" data="10415"/>
+   <avp name="Product-Name" data="{description}"/>
+</message>'''.format(origin_host=origin_host, origin_realm=origin_realm, description=description)
+
+  else:
+    raise Exception("Invalid ADML type '{}' (allowed: client|server)".format(_type))
+
+  # Create cer/cea files:
+  writeFileContent(ce_path, ce_content)
+
+
+  return stacks, nodes
+
+
+def configure_agent_kafka(node, description, topic):
+
+  # Producer script:
+  content = '''#!/bin/bash
+# Positional arguments: json, delay, debug indicator
+[ -z "$3" ] && echo "Usage: $0 <json file> <delay in milliseconds: 0 is no delay> <debug indicator: yes|no>" && exit 1
+
+json=$1
+delay=""
+[ "$2" != "0" ] && delay="-w $2"
+debug=""
+[ "$3" = "yes" ] && debug="-d"
+
+echo "[{description}] Kafka Producer Step"
+cd $(dirname $0)
+python3 Producer.py -n {node} -t {topic} -f $json $delay $debug 2>&1 | tee -a {node}-producer.sh.output
+exit ${{PIPESTATUS[0]}}
+'''.format(description=description, node=node, topic=topic)
+
+  path = agents_KAFKA_dir + "/{}-producer.sh".format(node)
+  writeFileContent(path, content)
+  os.chmod(path, 0o755)
+  #printMsg("Created procedure '{}'".format(path))
+
+  # Consumer script:
+  content = '''#!/bin/bash
+# Positional arguments: json, offset, timeout, debug indicator
+[ -z "$4" ] && echo "Usage: $0 <json file ('any' to skip matching)> <auto offset reset> <timeout in seconds: 0 is no timeout> <debug indicator: yes|no>" && exit 1
+
+file=""
+[ "$1" != "any" ] && file="-f $1"
+offset=$2
+timeout=""
+[ "$3" != "0" ] && timeout="-w $3"
+debug=""
+[ "$4" = "yes" ] && debug="-d"
+
+echo "[{description}] Kafka Consumer Step"
+cd $(dirname $0)
+python3 Consumer.py -n {node} -t {topic} $file -o "$offset" $timeout $debug 2>&1 | tee -a {node}-consumer.sh.output
+exit ${{PIPESTATUS[0]}}
+'''.format(description=description, node=node, topic=topic)
+
+  # We don't use -m (match as regular expression) because some problems have been detected with big json files.
+
+  path = agents_KAFKA_dir + "/{}-consumer.sh".format(node)
+  writeFileContent(path, content)
+  os.chmod(path, 0o755)
+  #printMsg("Created procedure '{}'".format(path))
+
+  # Admin script:
+  content = '''#!/bin/bash
+# Positional arguments: operation, debug indicator
+[ -z "$2" ] && echo "Usage: $0 <operation: clean_topic (at the moment)> <debug indicator: yes|no>" && exit 1
+operation=""
+case $1 in
+  clean_topic)
+    operation="-r"
+    ;;
+esac
+debug=""
+[ "$2" = "yes" ] && debug="-d"
+
+echo "[{description}] Kafka Administration Step"
+cd $(dirname $0)
+python3 Admin.py -n {node} -t {topic} $operation $debug 2>&1 | tee -a {node}-admin.sh.output
+exit ${{PIPESTATUS[0]}}
+'''.format(description=description, node=node, topic=topic)
+
+  path = agents_KAFKA_dir + "/{}-admin.sh".format(node)
+  writeFileContent(path, content)
+  os.chmod(path, 0o755)
+  #printMsg("Created procedure '{}'".format(path))
+
+
+def configure_agent_kafkacpp(node, description, topic):
+
+  # Consumer script:
+  content = '''#!/bin/bash
+# Positional arguments: json, offset, timeout, debug indicator
+[ -z "$4" ] && echo "Usage: $0 <json file ('any' to skip matching)> <auto offset reset> <timeout in seconds: 0 is no timeout> <debug indicator: yes|no>" && exit 1
+
+file=""
+[ "$1" != "any" ] && file="-f $1"
+offset=$2
+timeout=""
+[ "$3" != "0" ] && timeout="-w $3"
+debug=""
+[ "$4" = "yes" ] && debug="-d"
+
+echo "[{description}] Kafkacpp Consumer Step"
+cd $(dirname $0)
+sh Consumer -n {node} -t {topic} $file -o "$offset" $timeout $debug 2>&1 | tee -a {node}-consumer.sh.output
+exit ${{PIPESTATUS[0]}}
+'''.format(description=description, node=node, topic=topic)
+
+  # We don't use -m (match as regular expression) because some problems have been detected with big json files.
+
+  path = agents_KAFKACPP_dir + "/{}-consumer.sh".format(node)
+  writeFileContent(path, content)
+  os.chmod(path, 0o755)
+  #printMsg("Created procedure '{}'".format(path))
+
+
+def configure_agent_httpmock(node, description, address):
+
+  # Provisioning script:
+  content = '''#!/bin/bash
+# Positional arguments: json, method, uri
+[ -z "$3" ] && echo "Usage: $0 <test id> <step id> <test path> <json file> <method: POST|PUT|GET|DELETE> <uri>" && exit 1
+
+echo "[{description}] Http Mock Provision Step"
+cd $(dirname $0)
+sh Provision.sh $1 $2 $3 "{address}" "$4" "$5" "$6" 2>&1 | tee -a {node}-provision.sh.output
+exit ${{PIPESTATUS[0]}}
+'''.format(description=description, node=node, address=address)
+
+  path = agents_HTTPMOCK_dir + "/{}-provision.sh".format(node)
+  writeFileContent(path, content)
+  os.chmod(path, 0o755)
+  #printMsg("Created procedure '{}'".format(path))
+
+
+def configure_agents(agents):
+
+  stacks = ""
+  nodes = ""
+
+  for node in agents:
+
+    if (node == "ADML"): raise Exception('Invalid node id: "ADML" is reserved')
+    if (node == "KAFKA"): raise Exception('Invalid node id: "KAFKA" is reserved')
+    if (node == "KAFKACPP"): raise Exception('Invalid node id: "KAFKACPP" is reserved')
+    if (node == "HTTPMOCK"): raise Exception('Invalid node id: "HTTPMOCK" is reserved')
+
+    printMsg("Node: {}".format(node))
+
+    description = getNodeValue(agents[node], "description")
+    template = getNodeValue(agents[node], "template")
+
+    if (template == "ADML"):
+      # Node file:
+      path = agents_ADML_dir + "/{}.node".format(node)
+      writeFileContent(path, description)
+
+      application_id = getNodeValue(agents[node], "application_id")
+      dictionary = getNodeValue(agents[node], "dictionary")
+      _type = getNodeValue(agents[node], "type")
+      origin_host = getNodeValue(agents[node], "origin_host")
+      origin_realm = getNodeValue(agents[node], "origin_realm")
+      address = getNodeValue(agents[node], "address")
+
+      # Here stacks and nodes are accumulated. Consolidation of 'services.xml' is done at the end of iteration (*)
+      s,n = configure_agent_adml(node, description, application_id, dictionary, _type, origin_host, origin_realm, address)
+      stacks += s
+      stacks += "\n"
+      nodes += n
+      nodes += "\n"
+
+    if (template == "KAFKA"):
+      # Node file:
+      path = agents_KAFKA_dir + "/{}.node".format(node)
+      writeFileContent(path, description)
+
+      topic = getNodeValue(agents[node], "topic")
+
+      configure_agent_kafka(node, description, topic)
+
+
+    if (template == "KAFKACPP"):
+      # Node file:
+      path = agents_KAFKACPP_dir + "/{}.node".format(node)
+      writeFileContent(path, description)
+
+      topic = getNodeValue(agents[node], "topic")
+
+      configure_agent_kafkacpp(node, description, topic)
+
+
+    if (template == "HTTPMOCK"):
+      # Node file:
+      path = agents_HTTPMOCK_dir + "/{}.node".format(node)
+      writeFileContent(path, description)
+
+      address = getNodeValue(agents[node], "address")
+
+      configure_agent_httpmock(node, description, address)
+
+
+  #(*) Consolidate services.xml
+  path = agents_ADML_dir + "/services.xml"
+
+  content='''<services>
+{}
+{}
+</services>'''.format(stacks, nodes)
+
+  writeFileContent(path, content)
+
+
+
+def parse_arguments():
+
+  parser = ArgumentParser(description='Anna Agents-Oriented Testing Setup Loader')
+  parser.add_argument('-f', '--file', help='Agents yaml configuration file', required=True)
+
+
+  arguments = parser.parse_args()
+
+  return arguments
+
+
+#####################
+#      M A I N      #
+#####################
+
+if __name__ == "__main__":
+
+  # Agents:
+  abspath = os.path.abspath(__file__)
+  dname = os.path.dirname(abspath)
+  agents_ADML_dir = dname + "/agents/ADML"
+  agents_KAFKA_dir = dname + "/agents/KAFKA"
+  agents_KAFKACPP_dir = dname + "/agents/KAFKACPP"
+  agents_HTTPMOCK_dir = dname + "/agents/HTTPMOCK"
+
+  arguments = parse_arguments()
+
+  afile = arguments.file
+
+  try:
+    agents = YamlConfigParser(arguments.file)
+
+    configure_agents(agents.getData())
+    #start_agents(agents)
+
+    _exit()
+
+  except Exception as e:
+    _exit(e, 1)
diff --git a/example/diameter/launcher/deployments/aots-setup/tests.example/agents.yml b/example/diameter/launcher/deployments/aots-setup/tests.example/agents.yml
new file mode 100644 (file)
index 0000000..0c65f2c
--- /dev/null
@@ -0,0 +1,14 @@
+AF:
+  description: AF Diameter Rx Node
+  template: ADML
+  application_id: 16777236
+  dictionary: stacks/DictionaryRx.16777236.xml
+  type: client
+  origin_host: machine.source.server.realm.com
+  origin_realm: source.server.realm.com
+  address: 127.0.0.1:3868
+
+SMPC:
+  description: SMPC N7 Node
+  template: KAFKA
+  topic: n7topic
diff --git a/example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch01-ipv4/1.Initial.yml b/example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch01-ipv4/1.Initial.yml
new file mode 100644 (file)
index 0000000..781ee00
--- /dev/null
@@ -0,0 +1,28 @@
+- action: modify_json_key_value
+  arguments:
+    json: expected.json.template
+    new_json: expected.json
+    kpath_value_list:
+    - kpath: SessionRx
+      value: the_rx_session
+
+- action: SMPC/admin
+  arguments:
+    operation: clean_topic
+
+- action: timeout_ms
+  arguments:
+    value: 3000
+
+- action: AF/send_xml_to_entity
+  arguments:
+    xml: AAR.xml
+
+- action: AF/wait_xml_from_entity
+  arguments:
+    xml: AAA.xml
+
+- action: SMPC/consume_json
+  arguments:
+    json: expected.json
+    auto_offset_reset: earliest
diff --git a/example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch01-ipv4/2.Initial2.yml b/example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch01-ipv4/2.Initial2.yml
new file mode 100644 (file)
index 0000000..90b53c7
--- /dev/null
@@ -0,0 +1,11 @@
+- action: timeout_ms
+  arguments:
+    value: 2000
+
+- action: AF/send_xml_to_entity
+  arguments:
+    xml: AAR2.xml
+
+- action: AF/wait_xml_from_entity
+  arguments:
+    xml: AAA.xml
diff --git a/example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch01-ipv4/AAA.xml b/example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch01-ipv4/AAA.xml
new file mode 100644 (file)
index 0000000..00198ea
--- /dev/null
@@ -0,0 +1,13 @@
+<message version="1" name="AA-Answer" application-id="16777236" hop-by-hop-id="10" end-to-end-id="20">
+ <avp name="Session-Id" data="mytest;afNodeHostname.nodeHostRealm.com;default;1"/>
+ <avp name="Auth-Application-Id" data="16777236"/>
+ <avp name="Origin-Host" data="afNodeHostname.nodeHostRealm.com"/>
+ <avp name="Origin-Realm" data="(none)"/>
+ <avp name="Result-Code" data="2001" alias="DIAMETER_SUCCESS"/>
+ <avp name="Supported-Features" flags="128">
+ <avp name="Vendor-Id" data="10415"/>
+ <avp name="Feature-List-ID" data="1"/>
+ <avp name="Feature-List" data="19"/>
+ </avp>
+ <avp name="Origin-State-Id" data="1510836560"/>
+</message>
diff --git a/example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch01-ipv4/AAR.xml b/example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch01-ipv4/AAR.xml
new file mode 100644 (file)
index 0000000..db6ddae
--- /dev/null
@@ -0,0 +1,68 @@
+<message version="1" name="AA-Request" application-id="16777236" hop-by-hop-id="10" end-to-end-id="20">
+   <avp name="Session-Id" data="mytest;afNodeHostname.nodeHostRealm.com;2;555231"/>
+   <avp name="Destination-Host" data="sapcOwnHostId.operatorRealm.com"/>
+   <avp name="Destination-Realm" data="operatorRealm.com"/>
+   <avp name="Origin-Host" data="afNodeHostname.nodeHostRealm.com"/>
+   <avp name="Origin-Realm" data="nodeHostRealm.com"/>
+   <avp name="Auth-Application-Id" data="16777236"/>
+   <avp name="Origin-State-Id" data="1"/>
+   <avp name="Framed-IP-Address" hex-data="c52a0a20"/>
+   <avp name="AF-Application-Identifier" hex-data="75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c"/>
+   <avp name="Media-Component-Description">
+      <avp name="Media-Component-Number" data="1"/>
+      <avp name="Media-Sub-Component">
+         <avp name="Flow-Number" data="1"/>
+         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2234 to 10.95.130.50 2234"/>
+         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2234 to 48.148.70.168 2234"/>
+         <avp name="Flow-Status" data="2" alias="ENABLED"/>
+         <avp name="Flow-Usage" data="0" alias="NO_INFORMATION"/>
+      </avp>
+      <avp name="Media-Sub-Component">
+         <avp name="Flow-Number" data="2"/>
+         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2235 to 10.95.130.50 2235"/>
+         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2235 to 48.148.70.168 2235"/>
+         <avp name="Flow-Status" data="2" alias="ENABLED"/>
+         <avp name="Flow-Usage" data="1" alias="RTCP"/>
+      </avp>
+      <avp name="AF-Application-Identifier" hex-data="75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c"/>
+      <avp name="Media-Type" data="0" alias="OTHER"/>
+      <avp name="Max-Requested-Bandwidth-UL" data="128000"/>
+      <avp name="Max-Requested-Bandwidth-DL" data="128000"/>
+      <avp name="Flow-Status" data="2" alias="ENABLED"/>
+      <avp name="Reservation-Priority" data="3" alias="PRIORITY-THREE"/>
+      <avp name="RR-Bandwidth" data="64000"/>
+      <avp name="RS-Bandwidth" data="64000"/>
+   </avp>
+   <avp name="Media-Component-Description">
+      <avp name="Media-Component-Number" data="2"/>
+      <avp name="Media-Sub-Component">
+         <avp name="Flow-Number" data="1"/>
+         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2236 to 10.95.130.50 2236"/>
+         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2236 to 48.148.70.168 2236"/>
+         <avp name="Flow-Status" data="2" alias="ENABLED"/>
+         <avp name="Flow-Usage" data="0" alias="NO_INFORMATION"/>
+      </avp>
+      <avp name="Media-Sub-Component">
+         <avp name="Flow-Number" data="2"/>
+         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2237 to 10.95.130.50 2237"/>
+         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2237 to 48.148.70.168 2237"/>
+         <avp name="Flow-Status" data="2" alias="ENABLED"/>
+         <avp name="Flow-Usage" data="1" alias="RTCP"/>
+      </avp>
+      <avp name="AF-Application-Identifier" hex-data="75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c"/>
+      <avp name="Media-Type" data="1" alias="VIDEO"/>
+      <avp name="Max-Requested-Bandwidth-UL" data="128000"/>
+      <avp name="Max-Requested-Bandwidth-DL" data="128000"/>
+      <avp name="Flow-Status" data="2" alias="ENABLED"/>
+      <avp name="Reservation-Priority" data="4" alias="PRIORITY-FOUR"/>
+      <avp name="RR-Bandwidth" data="64000"/>
+      <avp name="RS-Bandwidth" data="64000"/>
+   </avp>
+   <avp name="AF-Charging-Identifier" hex-data="41462d4368617267696e674964656e746966696572"/>
+   <avp name="SIP-Forking-Indication" data="0" alias="SINGLE_DIALOGUE"/>
+   <avp name="Supported-Features" flags="192">
+      <avp name="Vendor-Id" data="10415"/>
+      <avp name="Feature-List-ID" data="1"/>
+      <avp name="Feature-List" data="19"/>
+   </avp>
+</message>
diff --git a/example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch01-ipv4/AAR2.xml b/example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch01-ipv4/AAR2.xml
new file mode 100644 (file)
index 0000000..db6ddae
--- /dev/null
@@ -0,0 +1,68 @@
+<message version="1" name="AA-Request" application-id="16777236" hop-by-hop-id="10" end-to-end-id="20">
+   <avp name="Session-Id" data="mytest;afNodeHostname.nodeHostRealm.com;2;555231"/>
+   <avp name="Destination-Host" data="sapcOwnHostId.operatorRealm.com"/>
+   <avp name="Destination-Realm" data="operatorRealm.com"/>
+   <avp name="Origin-Host" data="afNodeHostname.nodeHostRealm.com"/>
+   <avp name="Origin-Realm" data="nodeHostRealm.com"/>
+   <avp name="Auth-Application-Id" data="16777236"/>
+   <avp name="Origin-State-Id" data="1"/>
+   <avp name="Framed-IP-Address" hex-data="c52a0a20"/>
+   <avp name="AF-Application-Identifier" hex-data="75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c"/>
+   <avp name="Media-Component-Description">
+      <avp name="Media-Component-Number" data="1"/>
+      <avp name="Media-Sub-Component">
+         <avp name="Flow-Number" data="1"/>
+         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2234 to 10.95.130.50 2234"/>
+         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2234 to 48.148.70.168 2234"/>
+         <avp name="Flow-Status" data="2" alias="ENABLED"/>
+         <avp name="Flow-Usage" data="0" alias="NO_INFORMATION"/>
+      </avp>
+      <avp name="Media-Sub-Component">
+         <avp name="Flow-Number" data="2"/>
+         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2235 to 10.95.130.50 2235"/>
+         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2235 to 48.148.70.168 2235"/>
+         <avp name="Flow-Status" data="2" alias="ENABLED"/>
+         <avp name="Flow-Usage" data="1" alias="RTCP"/>
+      </avp>
+      <avp name="AF-Application-Identifier" hex-data="75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c"/>
+      <avp name="Media-Type" data="0" alias="OTHER"/>
+      <avp name="Max-Requested-Bandwidth-UL" data="128000"/>
+      <avp name="Max-Requested-Bandwidth-DL" data="128000"/>
+      <avp name="Flow-Status" data="2" alias="ENABLED"/>
+      <avp name="Reservation-Priority" data="3" alias="PRIORITY-THREE"/>
+      <avp name="RR-Bandwidth" data="64000"/>
+      <avp name="RS-Bandwidth" data="64000"/>
+   </avp>
+   <avp name="Media-Component-Description">
+      <avp name="Media-Component-Number" data="2"/>
+      <avp name="Media-Sub-Component">
+         <avp name="Flow-Number" data="1"/>
+         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2236 to 10.95.130.50 2236"/>
+         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2236 to 48.148.70.168 2236"/>
+         <avp name="Flow-Status" data="2" alias="ENABLED"/>
+         <avp name="Flow-Usage" data="0" alias="NO_INFORMATION"/>
+      </avp>
+      <avp name="Media-Sub-Component">
+         <avp name="Flow-Number" data="2"/>
+         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2237 to 10.95.130.50 2237"/>
+         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2237 to 48.148.70.168 2237"/>
+         <avp name="Flow-Status" data="2" alias="ENABLED"/>
+         <avp name="Flow-Usage" data="1" alias="RTCP"/>
+      </avp>
+      <avp name="AF-Application-Identifier" hex-data="75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c"/>
+      <avp name="Media-Type" data="1" alias="VIDEO"/>
+      <avp name="Max-Requested-Bandwidth-UL" data="128000"/>
+      <avp name="Max-Requested-Bandwidth-DL" data="128000"/>
+      <avp name="Flow-Status" data="2" alias="ENABLED"/>
+      <avp name="Reservation-Priority" data="4" alias="PRIORITY-FOUR"/>
+      <avp name="RR-Bandwidth" data="64000"/>
+      <avp name="RS-Bandwidth" data="64000"/>
+   </avp>
+   <avp name="AF-Charging-Identifier" hex-data="41462d4368617267696e674964656e746966696572"/>
+   <avp name="SIP-Forking-Indication" data="0" alias="SINGLE_DIALOGUE"/>
+   <avp name="Supported-Features" flags="192">
+      <avp name="Vendor-Id" data="10415"/>
+      <avp name="Feature-List-ID" data="1"/>
+      <avp name="Feature-List" data="19"/>
+   </avp>
+</message>
diff --git a/example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch01-ipv4/expected.json.template b/example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch01-ipv4/expected.json.template
new file mode 100644 (file)
index 0000000..eaacfa8
--- /dev/null
@@ -0,0 +1,4 @@
+{
+  "SessionRx":"one_rx_session",
+  "SessionGx":"the_gx_session"
+}
diff --git a/example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch02-ipv6/1.Initial.yml b/example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch02-ipv6/1.Initial.yml
new file mode 100644 (file)
index 0000000..5c6395c
--- /dev/null
@@ -0,0 +1,11 @@
+- action: timeout_ms
+  arguments:
+    value: 1000
+
+- action: AF/send_xml_to_entity
+  arguments:
+    xml: AAR-ipv6.xml
+
+- action: AF/wait_xml_from_entity
+  arguments:
+    xml: AAA.xml
diff --git a/example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch02-ipv6/2.Initial2.yml b/example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch02-ipv6/2.Initial2.yml
new file mode 100644 (file)
index 0000000..614bbee
--- /dev/null
@@ -0,0 +1,11 @@
+- action: timeout_ms
+  arguments:
+    value: 2000
+
+- action: AF/send_xml_to_entity
+  arguments:
+    xml: AAR-ipv6.xml
+
+- action: AF/wait_xml_from_entity
+  arguments:
+    xml: AAA.xml
diff --git a/example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch02-ipv6/3.Initial3.yml b/example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch02-ipv6/3.Initial3.yml
new file mode 100644 (file)
index 0000000..7b94b48
--- /dev/null
@@ -0,0 +1,11 @@
+- action: timeout_ms
+  arguments:
+    value: 3000
+
+- action: AF/send_xml_to_entity
+  arguments:
+    xml: AAR-ipv6.xml
+
+- action: AF/wait_xml_from_entity
+  arguments:
+    xml: AAA.xml
diff --git a/example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch02-ipv6/AAA.xml b/example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch02-ipv6/AAA.xml
new file mode 100644 (file)
index 0000000..00198ea
--- /dev/null
@@ -0,0 +1,13 @@
+<message version="1" name="AA-Answer" application-id="16777236" hop-by-hop-id="10" end-to-end-id="20">
+ <avp name="Session-Id" data="mytest;afNodeHostname.nodeHostRealm.com;default;1"/>
+ <avp name="Auth-Application-Id" data="16777236"/>
+ <avp name="Origin-Host" data="afNodeHostname.nodeHostRealm.com"/>
+ <avp name="Origin-Realm" data="(none)"/>
+ <avp name="Result-Code" data="2001" alias="DIAMETER_SUCCESS"/>
+ <avp name="Supported-Features" flags="128">
+ <avp name="Vendor-Id" data="10415"/>
+ <avp name="Feature-List-ID" data="1"/>
+ <avp name="Feature-List" data="19"/>
+ </avp>
+ <avp name="Origin-State-Id" data="1510836560"/>
+</message>
diff --git a/example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch02-ipv6/AAR-ipv6.xml b/example/diameter/launcher/deployments/aots-setup/tests.example/ts01-general/ch02-ipv6/AAR-ipv6.xml
new file mode 100644 (file)
index 0000000..db6ddae
--- /dev/null
@@ -0,0 +1,68 @@
+<message version="1" name="AA-Request" application-id="16777236" hop-by-hop-id="10" end-to-end-id="20">
+   <avp name="Session-Id" data="mytest;afNodeHostname.nodeHostRealm.com;2;555231"/>
+   <avp name="Destination-Host" data="sapcOwnHostId.operatorRealm.com"/>
+   <avp name="Destination-Realm" data="operatorRealm.com"/>
+   <avp name="Origin-Host" data="afNodeHostname.nodeHostRealm.com"/>
+   <avp name="Origin-Realm" data="nodeHostRealm.com"/>
+   <avp name="Auth-Application-Id" data="16777236"/>
+   <avp name="Origin-State-Id" data="1"/>
+   <avp name="Framed-IP-Address" hex-data="c52a0a20"/>
+   <avp name="AF-Application-Identifier" hex-data="75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c"/>
+   <avp name="Media-Component-Description">
+      <avp name="Media-Component-Number" data="1"/>
+      <avp name="Media-Sub-Component">
+         <avp name="Flow-Number" data="1"/>
+         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2234 to 10.95.130.50 2234"/>
+         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2234 to 48.148.70.168 2234"/>
+         <avp name="Flow-Status" data="2" alias="ENABLED"/>
+         <avp name="Flow-Usage" data="0" alias="NO_INFORMATION"/>
+      </avp>
+      <avp name="Media-Sub-Component">
+         <avp name="Flow-Number" data="2"/>
+         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2235 to 10.95.130.50 2235"/>
+         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2235 to 48.148.70.168 2235"/>
+         <avp name="Flow-Status" data="2" alias="ENABLED"/>
+         <avp name="Flow-Usage" data="1" alias="RTCP"/>
+      </avp>
+      <avp name="AF-Application-Identifier" hex-data="75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c"/>
+      <avp name="Media-Type" data="0" alias="OTHER"/>
+      <avp name="Max-Requested-Bandwidth-UL" data="128000"/>
+      <avp name="Max-Requested-Bandwidth-DL" data="128000"/>
+      <avp name="Flow-Status" data="2" alias="ENABLED"/>
+      <avp name="Reservation-Priority" data="3" alias="PRIORITY-THREE"/>
+      <avp name="RR-Bandwidth" data="64000"/>
+      <avp name="RS-Bandwidth" data="64000"/>
+   </avp>
+   <avp name="Media-Component-Description">
+      <avp name="Media-Component-Number" data="2"/>
+      <avp name="Media-Sub-Component">
+         <avp name="Flow-Number" data="1"/>
+         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2236 to 10.95.130.50 2236"/>
+         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2236 to 48.148.70.168 2236"/>
+         <avp name="Flow-Status" data="2" alias="ENABLED"/>
+         <avp name="Flow-Usage" data="0" alias="NO_INFORMATION"/>
+      </avp>
+      <avp name="Media-Sub-Component">
+         <avp name="Flow-Number" data="2"/>
+         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2237 to 10.95.130.50 2237"/>
+         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2237 to 48.148.70.168 2237"/>
+         <avp name="Flow-Status" data="2" alias="ENABLED"/>
+         <avp name="Flow-Usage" data="1" alias="RTCP"/>
+      </avp>
+      <avp name="AF-Application-Identifier" hex-data="75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c"/>
+      <avp name="Media-Type" data="1" alias="VIDEO"/>
+      <avp name="Max-Requested-Bandwidth-UL" data="128000"/>
+      <avp name="Max-Requested-Bandwidth-DL" data="128000"/>
+      <avp name="Flow-Status" data="2" alias="ENABLED"/>
+      <avp name="Reservation-Priority" data="4" alias="PRIORITY-FOUR"/>
+      <avp name="RR-Bandwidth" data="64000"/>
+      <avp name="RS-Bandwidth" data="64000"/>
+   </avp>
+   <avp name="AF-Charging-Identifier" hex-data="41462d4368617267696e674964656e746966696572"/>
+   <avp name="SIP-Forking-Indication" data="0" alias="SINGLE_DIALOGUE"/>
+   <avp name="Supported-Features" flags="192">
+      <avp name="Vendor-Id" data="10415"/>
+      <avp name="Feature-List-ID" data="1"/>
+      <avp name="Feature-List" data="19"/>
+   </avp>
+</message>
diff --git a/example/diameter/launcher/deployments/aots-setup/tests.example/ts02-errors/ch01-protocolErrors/1.MissingRealm.yml b/example/diameter/launcher/deployments/aots-setup/tests.example/ts02-errors/ch01-protocolErrors/1.MissingRealm.yml
new file mode 100644 (file)
index 0000000..78dd722
--- /dev/null
@@ -0,0 +1,11 @@
+- action: timeout_ms
+  arguments:
+    value: 1000
+
+- action: AF/send_xml_to_entity
+  arguments:
+    xml: AAR-bad.xml
+
+- action: AF/wait_xml_from_entity
+  arguments:
+    xml: AAA-bad.xml
diff --git a/example/diameter/launcher/deployments/aots-setup/tests.example/ts02-errors/ch01-protocolErrors/AAA-bad.xml b/example/diameter/launcher/deployments/aots-setup/tests.example/ts02-errors/ch01-protocolErrors/AAA-bad.xml
new file mode 100644 (file)
index 0000000..a43e1de
--- /dev/null
@@ -0,0 +1,13 @@
+<message version="1" name="AA-Answer" application-id="16777236" hop-by-hop-id="10" end-to-end-id="20">
+ <avp name="Session-Id" data="mytest;afNodeHostname.nodeHostRealm.com;default;1"/>
+ <avp name="Auth-Application-Id" data="16777236"/>
+ <avp name="Origin-Host" data="afNodeHostname.nodeHostRealm.com"/>
+ <avp name="Origin-Realm" data="(none)"/>
+ <avp name="Result-Code" data="5005" alias="DIAMETER_MISSING_AVP"/>
+ <avp name="Supported-Features" flags="128">
+ <avp name="Vendor-Id" data="10415"/>
+ <avp name="Feature-List-ID" data="1"/>
+ <avp name="Feature-List" data="19"/>
+ </avp>
+ <avp name="Origin-State-Id" data="1510836560"/>
+</message>
diff --git a/example/diameter/launcher/deployments/aots-setup/tests.example/ts02-errors/ch01-protocolErrors/AAR-bad.xml b/example/diameter/launcher/deployments/aots-setup/tests.example/ts02-errors/ch01-protocolErrors/AAR-bad.xml
new file mode 100644 (file)
index 0000000..40aec3f
--- /dev/null
@@ -0,0 +1,66 @@
+<message version="1" name="AA-Request" application-id="16777236" hop-by-hop-id="10" end-to-end-id="20">
+   <avp name="Session-Id" data="mytest;afNodeHostname.nodeHostRealm.com;2;555231"/>
+   <avp name="Destination-Host" data="sapcOwnHostId.operatorRealm.com"/>
+   <avp name="Origin-Host" data="afNodeHostname.nodeHostRealm.com"/>
+   <avp name="Auth-Application-Id" data="16777236"/>
+   <avp name="Origin-State-Id" data="1"/>
+   <avp name="Framed-IP-Address" hex-data="c52a0a20"/>
+   <avp name="AF-Application-Identifier" hex-data="75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c"/>
+   <avp name="Media-Component-Description">
+      <avp name="Media-Component-Number" data="1"/>
+      <avp name="Media-Sub-Component">
+         <avp name="Flow-Number" data="1"/>
+         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2234 to 10.95.130.50 2234"/>
+         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2234 to 48.148.70.168 2234"/>
+         <avp name="Flow-Status" data="2" alias="ENABLED"/>
+         <avp name="Flow-Usage" data="0" alias="NO_INFORMATION"/>
+      </avp>
+      <avp name="Media-Sub-Component">
+         <avp name="Flow-Number" data="2"/>
+         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2235 to 10.95.130.50 2235"/>
+         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2235 to 48.148.70.168 2235"/>
+         <avp name="Flow-Status" data="2" alias="ENABLED"/>
+         <avp name="Flow-Usage" data="1" alias="RTCP"/>
+      </avp>
+      <avp name="AF-Application-Identifier" hex-data="75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c"/>
+      <avp name="Media-Type" data="0" alias="OTHER"/>
+      <avp name="Max-Requested-Bandwidth-UL" data="128000"/>
+      <avp name="Max-Requested-Bandwidth-DL" data="128000"/>
+      <avp name="Flow-Status" data="2" alias="ENABLED"/>
+      <avp name="Reservation-Priority" data="3" alias="PRIORITY-THREE"/>
+      <avp name="RR-Bandwidth" data="64000"/>
+      <avp name="RS-Bandwidth" data="64000"/>
+   </avp>
+   <avp name="Media-Component-Description">
+      <avp name="Media-Component-Number" data="2"/>
+      <avp name="Media-Sub-Component">
+         <avp name="Flow-Number" data="1"/>
+         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2236 to 10.95.130.50 2236"/>
+         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2236 to 48.148.70.168 2236"/>
+         <avp name="Flow-Status" data="2" alias="ENABLED"/>
+         <avp name="Flow-Usage" data="0" alias="NO_INFORMATION"/>
+      </avp>
+      <avp name="Media-Sub-Component">
+         <avp name="Flow-Number" data="2"/>
+         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2237 to 10.95.130.50 2237"/>
+         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2237 to 48.148.70.168 2237"/>
+         <avp name="Flow-Status" data="2" alias="ENABLED"/>
+         <avp name="Flow-Usage" data="1" alias="RTCP"/>
+      </avp>
+      <avp name="AF-Application-Identifier" hex-data="75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c"/>
+      <avp name="Media-Type" data="1" alias="VIDEO"/>
+      <avp name="Max-Requested-Bandwidth-UL" data="128000"/>
+      <avp name="Max-Requested-Bandwidth-DL" data="128000"/>
+      <avp name="Flow-Status" data="2" alias="ENABLED"/>
+      <avp name="Reservation-Priority" data="4" alias="PRIORITY-FOUR"/>
+      <avp name="RR-Bandwidth" data="64000"/>
+      <avp name="RS-Bandwidth" data="64000"/>
+   </avp>
+   <avp name="AF-Charging-Identifier" hex-data="41462d4368617267696e674964656e746966696572"/>
+   <avp name="SIP-Forking-Indication" data="0" alias="SINGLE_DIALOGUE"/>
+   <avp name="Supported-Features" flags="192">
+      <avp name="Vendor-Id" data="10415"/>
+      <avp name="Feature-List-ID" data="1"/>
+      <avp name="Feature-List" data="19"/>
+   </avp>
+</message>
diff --git a/example/diameter/launcher/deployments/aots/README.md b/example/diameter/launcher/deployments/aots/README.md
deleted file mode 100644 (file)
index 35570c1..0000000
+++ /dev/null
@@ -1,495 +0,0 @@
-# Anna Agents-Oriented Testing Setup
-
-## Agents configuration
-
-```
-$> python3 loader.py -h
-usage: loader.py [-h] -f FILE
-
-Anna Agents-Oriented Testing Setup Loader
-
-optional arguments:
-  -h, --help            show this help message and exit
-  -f FILE, --file FILE  Agents yaml configuration file
-```
-
-The python script 'loader.py' will preload and configure all the needed agents.
-Also, ADML ones will start with the configured endpoints, ready for work.
-
-```
-python3 loader.py --file <tests directory>/agents.yml
-```
-
-See example at './tests.example/agents.yml'.
-
-It is recommended to have that file within the tests directory compatible with such layout.
-Anyway, you could have a common agents definition for multiple directories wherever you want to store them.
-Next procedure (execution) will get a working directory which will be the parent for all the tests processed.
-
-Also, you could load several agents definitions.
-
-The format for agents file specification is:
-
-For KAFKA:
-
-```
-<node label>:
-  description: <description>
-  template: KAFKA
-  topic: <kafka topic>
-```
-
-For ADML (diameter):
-
-```
-<node label>:
-  description: <description>
-  template: ADML
-  application_id: <value>
-  dictionary: <xml dictionary path (absolute or relative to ./agents/ADML)>
-  type: client | server
-  origin_host: <origin host>
-  origin_realm: <origin realm>
-  address: <ip/server:port[,ip2/server2:port,...]>
-```
-
-For HTTPMOCK:
-
-```
-<node label>:
-  description: <description>
-  template: HTTPMOCK
-  address: <ip/server:port>
-```
-
-Example:
-
-```
-AF:
-  description: AF Diameter Rx Node
-  template: ADML
-  application_id: 16777236
-  dictionary: stacks/DictionaryRx.16777236.xml
-  type: client
-  origin_host: machine.source.server.realm.com
-  origin_realm: source.server.realm.com
-  address: 127.0.0.1:3868
-
-SMPC:
-  description: SMPC N7 Node
-  template: KAFKA
-  topic: n7topic
-
-DB:
-  description: database
-  template HTTPMOCK
-  address: dbnode:9090
-```
-
-
-## Test launcher
-
-```
-$> python3 launcher.py -h
-usage: launcher.py [-h] -t TESTS_DIR [-k] [-s] [-i] [-d]                                                                                        [1/708]
-
-Anna Agents-Oriented Testing Setup Launcher
-
-optional arguments:
-  -h, --help            show this help message and exit
-  -t TESTS_DIR, --tests-dir TESTS_DIR
-                        Tests parent directory where to find .yml files (from
-                        the next directories level)
-  -k, --keep-list-if-exists
-                        Keeps intact the list of test cases (<test-
-                        dir>/launcher.list), creates it if missing
-  -s, --stop-adml-at-the-end
-                        At the end, ADML keeps running to ease debugging. You
-                        could force stop with this option
-  -i, --interactive     Interactive execution to ease debugging of test cases
-  -d, --dry-run         Used to test and debug provision, no execution is
-                        launched
-  -p IP_LIMIT, --ip-limit IP_LIMIT
-                        In-Progress limit is the number of coexisting In-
-                        Progress State test cases. Defaults to 1 (sequential),
-                        -1 would be 'no limit').
-  -r TTPS, --ttps TTPS  Rate of test cases launched (test ticks per second).
-                        By default 50 (recommended for monothread version).
-```
-
-The python script 'launcher.py' will execute the test cases under the provided directory.
-Test cases at the directory provided itself will be ignored (searchs are performed at second level in order to avoid catching agents definitions).
-Then we recommend this structure:
-
-```
-<tests directory>/agents.yml
-<tests directory>/<test suite>/.../<test case>.yml
-<tests directory>/<test suite(i)>/.../<dir(j)>/.../<test case(k)>.yml
-```
-
-The organization of test cases, chapters, test suites, or whatever desired concept is completely free for user preferences. Anyway, we recommend the use of numeric prefixes to control the default order of execution (alphabetical order).
-
-To execute the tests, just provide the global parent directory.
-NO TEST CASES SHALL BE LOCATED THERE BY CONVENTION (indeed, you could have them, but they would be ignored).
-
-```
-python3 launcher.py --tests-dir <tests directory>
-```
-
-The procedure will look for the file ```'<tests directory>'/launcher.list'``` in order to plan the execution.
-That list will be created/refreshed always, except if you pass the option '-k|--keep-list-if-exists' (in case you want to play with edited lists).
-The algorithm to create the list is based in a recursive search of yaml files in alphabetical order under the tests directory provided, in a similar way than the output of:
-
-```
-find <tests directory> -mindepth 2 -name "*.yml" | sort -t'/'
-```
-
-### Interactive mode
-
-One interesting feature from AOTS is the possibility to interact test cases even to deep level (step by step).
-You could enable the interactive mode by mean:
-
-```
-python3 launcher.py --tests-dir <tests directory> --interactive
-```
-
-A menu will be shown after test cases programming to give you a complete control of the ADML operations:
-
-```
-    MAIN INTERACTIVE MENU
-    =====================
-    (prefix option with 'h' to get detailed help)
-
-    General:
-    0.  Exit/Quit
-
-    Position:
-    1.  Go to
-    2.  Look
-
-    Test cases execution:
-    3.  Start with test rate
-    4.  Start next N test cases
-    5.  In-progress limit
-
-    Low level execution: test case steps
-    6.  Execute next N steps
-
-    Status & cycling:
-    7.  Reset
-    8.  Pool repeats
-    9.  Collect
-    10. Auto reset
-    11. Reports configuration
-```
-
-### User-defined lists
-
-You could edit such list and remove or comment (#) entries (each line is a test case) in order to "disable" such test cases.
-You could also mess the order with something like:
-
-```
-sort -R <tests directory>/launcher.list
-```
-
-Don't forget to pass the option '-k|--keep-list-if-exists' or the list will be overwritten during launcher procedure execution.
-
-### Test cases
-
-Files used by parsers within the test cases (xml diameter messages, json kafka ones, etc.), are relative to the test case file path location, anyway you could set absolute paths for the stuff used.
-
-Recomendations:
-
-* Alternative 1: create a directory called ```'$(basename <test case file> .yml)'```
-  in order to keep order:
-
-```
-     <dir>/tc1-initial-with-ipv4.yml
-     <dir>/tc1-initial-with-ipv4/AAA.xml
-     <dir>/tc1-initial-with-ipv4/smpc-consumed.json
-     <dir>/tc2-initial-with-ipv6.yml
-     <dir>/tc2-initial-with-ipv6/AAA.xml
-     <dir>/tc2-initial-with-ipv6/smpc-consumed.json
-     ...
-```
-
-* Alternative 2: create a unique directory for the definition and all the test case stuff:
-
-```
-     <dir>/tc1/initial-with-ipv4.yml
-     <dir>/tc1/AAA.xml
-     <dir>/tc1/smpc-consumed.json
-     <dir>/tc2/initial-with-ipv6.yml
-     <dir>/tc2/AAA.xml
-     <dir>/tc2/smpc-consumed.json
-     ...
-```
-
-The last one seems to be better and cleaner alternative.
-
-### Test case definition
-
-A test case is a yaml list of steps. Each step is a dictionary object with mandatory keys called 'action' and 'arguments'.
-An action could be generic (no agent id specified) or agent-related.
-Arguments depends on the type of action and are documented at ```'agents/<template>/ACTIONS.md'``` file.
-Generic actions are documented below ([Generic actions](#generic-actions)).
-
-```
-- action: [<agent id>/]<action id>
-  arguments:
-    <argument 1>: <value 1>
-    ...
-    <argument m>: <value m>
-  ...
-```
-
-Example:
-
-```
-# Step 1: Establish a timeout for the whole test case
-- action: timeout_ms
-  arguments:
-    value: 1000
-
-# Step 2: Clean kafka message bus for the SMPC topic
-- action: SMPC/admin
-  arguments:
-    operation: clean_topic
-
-# Step 3: Send the AA-Request to the server
-- action: AF/send_xml_to_entity
-  arguments:
-    xml: AAR.xml
-
-# Step 4: Wait for AA-Answer for the previous request sent
-- action: AF/wait_xml_from_entity
-  arguments:
-    xml: AAA.xml
-    answers_to: 3
-
-# Step 4: Check the message bus for a kafka notify reception
-- action: SMPC/consume_json
-  arguments:
-    json: expected.json
-    auto_offset_reset: earliest
-
-```
-
-It is good to comment each step with the position number (1..N). Take into account that lists are processed in order. Some steps could reference to other steps and this position could be useful for that purpose (see step 4 in the example above).
-
-### Generic actions
-
-#### sh_command
-
-Sets a shell command script execution.
-
-Arguments: value
-* value: command and arguments
-
-Example:
-```
-- action: sh_command
-  arguments:
-    value: cat AAR.xml
-```
-
-#### timeout_ms
-
-Sets timeout (milliseconds) to complete the whole test case, or get a Failed state if not completed.
-This could be configured at any step point, where will be started as time measuring reference.
-It is recommended in order to ensure that test will not be in-progress eternally.
-The launcher executor will calculate 15 seconds per test case by default just in case this
-timeout feature is not used.
-
-Arguments: value
-* value: numeric value for the lapse of time in milliseconds.
-
-Example:
-```
-- action: timeout_ms
-  arguments:
-    value: 3500
-```
-
-#### delay_ms
-
-Sets delay (milliseconds) to sleep the test case at the corresponding delay step.
-
-Arguments: value
-* value: numeric value for the lapse of time in milliseconds.
-
-Example:
-```
-- action: delay_ms
-  arguments:
-    value: 200
-```
-
-#### ip_limit
-
-Controller In-Progress limit. A value of 1 means that only 1 test case with
-status "in progress" is allowed. That is to say, ip_limit=1 is the same as
-sequential execution of test cases.
-
-This value can be set for the whole launcher execution by mean '-p|--ip-limit'
-argument, but anyway, the value set in a test case definition has priority
-because it will remain for the following test cases executed if the action
-is not used to update the value again. Summing up, the command line for
-launcher only sets the initial ip-limit value (1 by default).
-
-Also we can restore the command-line value in any moment just configuring
-"launcher" for this action value.
-
-A typical use case for this is when a chapter or a whole test suite need a
-initial (or intermediate) administration step to do global actions which
-could impact in the real test cases if everything is executed in parallel.
-For example, remove kafka bus or create first dummy message, could impact
-in the real test cases which are consuming data from the kafka message bus.
-Then, we will define a first test-suite case with the proper administrative
-operations setting ip-limit to 1, doing needed operations and updating this
-limit again (to -1, no limit, or any other). The reserved word "launcher"
-helps to restore the value which the user provided through the launcher
-procedure (in this way, if user wanted sequential, the tests will be
-sequentially executed).
-
-To ensure that an intermediate test case is the only executed we should
-first set the ip-limit to 1, then perform a delay step with the maximum
-timeout of the suite test cases, and then, perform the administrative
-operations. Finally, as it is unpredictable to know which test case is the
-following, in the same administrative test case, we end defining another
-ip_limit action to restore the parallel value (ip limit > 1 or "launcher").
-Also, those administrative operations should be blocking until completed.
-
-Arguments: value
-* value: in progress limit amount (-1: no limit, 0: stops the ttps clock). Reserved 'launcher' sets the command-line launcher received value.
-
-Example:
-```
-- action: ip_limit
-  arguments:
-    value: 1
-```
-
-#### modify_xml_avp_data
-
-Replace operations over ANNA diameter message xml representation.
-Replaces data (or hex-data) fields for specific avps before processing.
-XPath is used to select the node(s) to be processed. The value provided
-will replace the data or hex-data field. A list is used to allow one or
-more replace operations over the same xml file.
-
-Arguments: xml, new_xml, xpath_value_list
-* xml: the diameter message in xml format. Could be a symlink to common template.
-* new_xml: new diameter message in xml format. Should be the one referred at test case.
-* xpath_value_list: list of items with fields: xpath, value
-
-Example:
-```
-- action: modify_xml_avp_data
-  arguments:
-    xml: AAR.xml.template
-    new_xml: AAR.xml
-    xpath_value_list:
-    - xpath: "avp[@name='Session-Id']"
-      value: "mytest;afNodeHostname.nodeHostRealm.com;1;005"
-    - xpath: "avp[@name='Framed-IP-Address']"
-      value: "c52a0b20"
-```
-
-Important note: better don't use for diameter messages used in wait conditions.
-The reason is that wait conditions acts using the xml content as regular
-expression to be matched with serialized message received at the endpoint.
-The thing is that diameter xml representation compared with python parser
-representation will be probably different and regular expression won't be
-valid to match. Summing up, this kind of messages must be statically
-created with the expected content. Anyway, fields like hop-by-hop, end-to-end
-and Origin-State-Id AVP values, will be automatically matched regardless its
-value (regular expression is internally modified to replace them by '[0-9]+').
-
-#### modify_json_key_value
-
-Replaces value fields for specific keys before processing.
-
-Arguments: json, new_json, kpath_value_list
-* json: the json file. Could be a symlink to common template.
-* new_json: new json file. Must be the one referred at test case.
-* kpath_value_list: list of items with fields: kpath, value
-
-The 'key path' concept (kpath field) consist in json node location
-by mean a dot-separated string: <node1>[.<node2>]..[.<nodeN>].
-
-Example:
-```
-- action: modify_json_key_value
-  arguments:
-    json: notify.json.template
-    new_json: notify.json
-    kpath_value_list:
-    - kpath: "session.smSessionId"
-      value: "the_sm_session_id"
-```
-
-#### system_cmd
-
-Launchs an inline shell command or a user script file.
-
-Arguments: [shell, file, file_parameters]
-* shell: inline shell command and parameters.
-* file: script or procedure defined in a test case file
-* file_parameters: script file parameters (empty by default)
-
-Example:
-```
-- action: system_cmd
-  arguments:
-    shell: echo "this is a test"
-
-- action: system_cmd
-  arguments:
-    shell: rdate remote_host
-
-- action: system_cmd
-  arguments:
-    file: check_consumer_step.py
-    file_parameters: 2
-```
-
-## Environment variables
-
-Agents directory, where templates ADML and KAFKA are located, could be accessible through environment variable 'AGENTS_DIR'.
-For example, you could use it for an system_cmd action:
-
-Example:
-```
-- action: system_cmd
-  arguments:
-    value: check_consumption.sh $AGENTS_DIR/KAFKA/SMPC-consumer.sh.output
-```
-
-## Logs generated
-
-After launcher execution, a '<tests directory>.logs' directory is created within test directory processed.
-This is an example of logs created by AOTS:
-
-```
-drwxrwxr-x 2 vagrant vagrant  4096 Aug 18 21:24 traffic
--rw-rw-r-- 1 vagrant vagrant 16065 Aug 18 21:24 junit.xml
--rw-rw-r-- 1 vagrant vagrant 15166 Aug 18 21:24 tests.summary
--rw-rw-r-- 1 vagrant vagrant 10747 Aug 18 21:24 tests.oam
--rw-rw-r-- 1 vagrant vagrant   697 Aug 18 21:24 tests.stats
--rw-rw-r-- 1 vagrant vagrant 83839 Aug 18 21:24 adml.context
-drwxrwxr-x 2 vagrant vagrant  4096 Aug 18 21:24 counters
-drwxrwxr-x 2 vagrant vagrant  4096 Aug 18 21:24 test-reports
-drwxrwxr-x 2 vagrant vagrant  4096 Aug 18 21:24 debug
-```
-
-* traffic: folder containing traffic logs, for example diameter interfaces flow information.
-* junit.xml: JUnit report for the testsuite execution.
-* tests.summary: ADML director tests summary in xml format.
-* tests.oam: ADML director Operation & Maintenance information (counters)
-* tests.stats: ADML director statistic module information (average, deviation, max & min values for any of the statistic concepts registered, for example processing time in every interface, messages size, etc.).
-* adml.context: context information in xml format for the ADML director process.
-* counters: counters information, for example diameter events.
-* test-reports: ADML tests reports in xml format.
-* debug: debug information (ADML traces, yml test case files list, relation between ids and descriptions, ADML operations dumps, etc.).
-
diff --git a/example/diameter/launcher/deployments/aots/agents/ADML/ACTIONS.md b/example/diameter/launcher/deployments/aots/agents/ADML/ACTIONS.md
deleted file mode 100644 (file)
index 280b214..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-# ADML actions
-
-## send_xml_to_entity
-
-Sends a diameter message in xml format (see DTDs/message.dtd) as client to the server(s) configured.
-
-Arguments: xml[, answers_to]
-* xml: the diameter message in xml format.
-* answers_to: optional step number of a 'wait_xml_from_entity' for a request message.
-              Steps are the actions numbered from 1 to N
-Example(1):
-```
-- action: AF/send_xml_to_entity
-    xml: aar-initial.xml
-```
-
-Example(2):
-```
-- action: AF/wait_xml_from_entity
-  arguments:
-    xml: dpr.xml
-
-- action: AF/send_xml_to_entity
-  arguments:
-    xml: dpa.xml
-    answers_to: 1
-```
-
-## wait_xml_from_entity
-
-Waits a diameter message in xml format (see DTDs/message.dtd) as client from the server(s) connected.
-Step blocks until match reception (regular expressions could be used).
-
-Arguments: xml
-* xml: the diameter message in xml format.
-
-Example:
-```
-- action: AFPC/wait_xml_from_entity
-  arguments:
-    xml: aaa.xml
-```
-
-## send_xml_to_client
-
-Sends a diameter message in xml format (see DTDs/message.dtd) as server to any client(s) connected.
-
-Arguments: xml[, answers_to]
-* xml: the diameter message in xml format.
-* answers_to: optional step number of a 'wait_xml_from_client' for a request message.
-              Steps are the actions numbered from 1 to N
-Example(1):
-```
-- action: AF/send_xml_to_client
-  arguments:
-    xml: dpr.xml
-```
-
-Example(2):
-```
-- action: AFPC/wait_xml_from_client
-    xml: dpr.xml
-  arguments:
-
-- action: AFPC/send_xml_to_client
-    xml: dpa.xml
-  arguments:
-```
-
-## wait_xml_from_client
-
-Waits a diameter message in xml format (see DTDs/message.dtd) as server from the client(s) connected.
-Step blocks until match reception (regular expressions could be used).
-
-Arguments: xml
-* xml: the diameter message in xml format.
-
-Example:
-```
-- action: AFPC/wait_xml_from_client
-  arguments:
-    xml: dpr.xml
-```
-
diff --git a/example/diameter/launcher/deployments/aots/agents/ADML/HINTS.md b/example/diameter/launcher/deployments/aots/agents/ADML/HINTS.md
deleted file mode 100644 (file)
index a9314e3..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-# ADML hints
-
-## AF-Application-Identifier
-
-Diameter RFC assigned the format 'OctetString' to this AVP although it is almost always intended to be human-readable. 'UTF8String' format could be more appropiate, but probably the intention was to avoid possible limits.
-
-ADML message codec shows readable data when possible using the field 'data'. When this is not possible, the 'hex-data' field will encode the information. The 'OctetString' format is hexadecimal by nature (string of octets), then always 'hex-data' will be shown for this kind of AVPs.
-
-For example:
-<avp name="AF-Application-Identifier" hex-data="75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c"/>
-
-You could decode using hex dump utility: 'xxd'
-
-$> echo "75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c" | xxd -p -r
-$> urn%3Aurn-xxx%3A3gpp-service.ims.icsi.mmtel
-
-But the thing that you may probably need, is to encode a desired value into xml messages while designing a test case. For this situation, use the opossite (drop reverse flag '-r' to xxd):
-
-$> echo -n "urn%3Aurn-xxx%3A3gpp-service.ims.icsi.mmtel" | xxd -p | tr -d '\n'
-$> 75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c
-
-or use 'od' (files dump) utility:
-
-$> echo -n "urn%3Aurn-xxx%3A3gpp-service.ims.icsi.mmtel" | od -A n -t x1 | tr -d ' ' | tr -d '\n'
-$> 75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c
-
-The '-n' in the echo is neccessary to avoid encoding of carriage return (0x0a) for the string provided.
-
diff --git a/example/diameter/launcher/deployments/aots/agents/ADML/args.ft b/example/diameter/launcher/deployments/aots/agents/ADML/args.ft
deleted file mode 100644 (file)
index fa3411d..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-# ADML will start with base protocol dictionary and no nodes on services.xml:
---services services.xml
-
-# Counters directory:
---cntDir counters
-# Counters record procedure period in milliseconds.
-# If missing, default value of 300000 (5 minutes) will be assigned.
-# Zero value, disable the dump procedure.
-#--cntRecordPeriod 10000
-
-# System test:
---tmDir test-reports
-# To override traffic logs configuration in order to be disabled for all the
-# loaded nodes, launch the process by mean: './start.sh st'
-
-# Statistics:
---logStatisticSamples all
-
-# Add to take debug traces once started
---trace debug
-
diff --git a/example/diameter/launcher/deployments/aots/agents/ADML/args.st b/example/diameter/launcher/deployments/aots/agents/ADML/args.st
deleted file mode 100644 (file)
index 733daaf..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-# ADML will start with base protocol dictionary and no nodes on services.xml:
---services services.xml
-
-# Counters directory:
---cntDir counters
-# Counters record procedure period in milliseconds.
-# If missing, default value of 300000 (5 minutes) will be assigned.
-# Zero value, disable the dump procedure.
-#--cntRecordPeriod 10000
-
-# System test:
---tmDir test-reports
-# To override traffic logs configuration in order to be disabled for all the
-# loaded nodes, launch the process by mean: './start.sh st'
-
-# Statistics:
---logStatisticSamples all
-
-# Add to take debug traces once started
-# --trace debug
---disableLogs
-
diff --git a/example/diameter/launcher/deployments/aots/agents/ADML/services.xml.example b/example/diameter/launcher/deployments/aots/agents/ADML/services.xml.example
deleted file mode 100644 (file)
index a54cf09..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-<services>
-  <!--
-  Stacks
-
-  * Monostack: you could select any id value, normally 0.
-  * Multistack: use the application id for the id value.
-                This eases codec engine selection for
-                processed messages.
-  -->
-  <stack id="0" dictionary="dictionary.xml" fixMode="Never"/>
-
-  <!--
-  Nodes
-
-  * Client example:
-
-  <node originHost="<origin host>" applicationId="<application id>"
-        entity="<addr1:port1[,addr2:port2]...[,addrN:portN]>"
-        cer="<cer xml file>" answersTimeout="300000" dumpLog="yes"/>
-
-  * Server example:
-
-  <node originHost="<origin host>" applicationId="<application id>"
-        diameterServer="<addr:port>" diameterServerSessions="10"
-        cea="<cea xml file>" answersTimeout="300000" dumpLog="yes"/>
-  -->
-  <node originHost="afHost.afRealm.com" applicationId="0" entity="localhost:3868"/>
-
-</services>
diff --git a/example/diameter/launcher/deployments/aots/agents/ADML/stacks/DictionaryGx.16777238.xml b/example/diameter/launcher/deployments/aots/agents/ADML/stacks/DictionaryGx.16777238.xml
deleted file mode 100755 (executable)
index 5922ae7..0000000
+++ /dev/null
@@ -1,1477 +0,0 @@
-<dictionary name="DictionaryGx | Application-Id: 16777238">
-   <vendor name="IETF" code="0"/>
-   <vendor name="ERICSSON" code="193"/>
-   <vendor name="3GPP2" code="5535"/>
-   <vendor name="3GPP" code="10415"/>
-   <avp name="User-Name" code="1" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Framed-IP-Address" code="8" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Class" code="25" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Session-Timeout" code="27" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Called-Station-Id" code="30" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Proxy-State" code="33" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Acct-Session-Id" code="44" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Acct-Multi-Session-Id" code="50" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Event-Timestamp" code="55" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Time"/>
-   </avp>
-   <avp name="Acct-Interim-Interval" code="85" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Framed-IPv6-Prefix" code="97" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Host-IP-Address" code="257" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Address"/>
-   </avp>
-   <avp name="Auth-Application-Id" code="258" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Acct-Application-Id" code="259" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Vendor-Specific-Application-Id" code="260" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Vendor-Id" type="Mandatory" qual="1*"/>
-         <avprule id="Auth-Application-Id" type="Optional"/>
-         <avprule id="Acct-Application-Id" type="Optional"/>
-      </grouped>
-   </avp>
-   <avp name="Redirect-Host-Usage" code="261" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-6">
-         <label data="0" alias="DONT_CACHE"/>
-         <label data="1" alias="ALL_SESSION"/>
-         <label data="2" alias="ALL_REALM"/>
-         <label data="3" alias="REALM_AND_APPLICATION"/>
-         <label data="4" alias="ALL_APPLICATION"/>
-         <label data="5" alias="ALL_HOST"/>
-         <label data="6" alias="ALL_USER"/>
-      </single>
-   </avp>
-   <avp name="Redirect-Max-Cache-Time" code="262" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Session-Id" code="263" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Origin-Host" code="264" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Supported-Vendor-Id" code="265" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Vendor-Id" code="266" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Firmware-Revision" code="267" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Result-Code" code="268" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32">
-         <label data="1001" alias="DIAMETER_MULTI_ROUND_AUTH"/>
-         <label data="2001" alias="DIAMETER_SUCCESS"/>
-         <label data="2002" alias="DIAMETER_LIMITED_SUCCESS"/>
-         <label data="3001" alias="DIAMETER_COMMAND_UNSUPPORTED"/>
-         <label data="3002" alias="DIAMETER_UNABLE_TO_DELIVER"/>
-         <label data="3003" alias="DIAMETER_REALM_NOT_SERVED"/>
-         <label data="3004" alias="DIAMETER_TOO_BUSY"/>
-         <label data="3005" alias="DIAMETER_LOOP_DETECTED"/>
-         <label data="3006" alias="DIAMETER_REDIRECT_INDICATION"/>
-         <label data="3007" alias="DIAMETER_APPLICATION_UNSUPPORTED"/>
-         <label data="3008" alias="DIAMETER_INVALID_HDR_BITS"/>
-         <label data="3009" alias="DIAMETER_INVALID_AVP_BITS"/>
-         <label data="3010" alias="DIAMETER_UNKNOWN_PEER"/>
-         <label data="4001" alias="DIAMETER_AUTHENTICATION_REJECTED"/>
-         <label data="4002" alias="DIAMETER_OUT_OF_SPACE"/>
-         <label data="4003" alias="DIAMETER_ELECTION_LOST"/>
-         <label data="4241" alias="DIAMETER_NO_AVAILABLE_POLICY_COUNTERS"/>
-         <label data="5001" alias="DIAMETER_AVP_UNSUPPORTED"/>
-         <label data="5002" alias="DIAMETER_UNKNOWN_SESSION_ID"/>
-         <label data="5003" alias="DIAMETER_AUTHORIZATION_REJECTED"/>
-         <label data="5004" alias="DIAMETER_INVALID_AVP_VALUE"/>
-         <label data="5005" alias="DIAMETER_MISSING_AVP"/>
-         <label data="5006" alias="DIAMETER_RESOURCES_EXCEEDED"/>
-         <label data="5007" alias="DIAMETER_CONTRADICTING_AVPS"/>
-         <label data="5008" alias="DIAMETER_AVP_NOT_ALLOWED"/>
-         <label data="5009" alias="DIAMETER_AVP_OCCURS_TOO_MANY_TIMES"/>
-         <label data="5010" alias="DIAMETER_NO_COMMON_APPLICATION"/>
-         <label data="5011" alias="DIAMETER_UNSUPPORTED_VERSION"/>
-         <label data="5012" alias="DIAMETER_UNABLE_TO_COMPLY"/>
-         <label data="5013" alias="DIAMETER_INVALID_BIT_IN_HEADER"/>
-         <label data="5014" alias="DIAMETER_INVALID_AVP_LENGTH"/>
-         <label data="5015" alias="DIAMETER_INVALID_MESSAGE_LENGTH"/>
-         <label data="5016" alias="DIAMETER_INVALID_AVP_BIT_COMBO"/>
-         <label data="5017" alias="DIAMETER_NO_COMMON_SECURITY"/>
-         <label data="5030" alias="DIAMETER_USER_UNKNOWN"/>
-         <label data="5063" alias="REQUESTED_SERVICE_NOT_AUTHORIZED"/>
-         <label data="5065" alias="IP_CAN_SESSION_NOT_AVAILABLE"/>
-      </single>
-   </avp>
-   <avp name="Product-Name" code="269" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Session-Binding" code="270" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Session-Server-Failover" code="271" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-3">
-         <label data="0" alias="REFUSE_SERVICE"/>
-         <label data="1" alias="TRY_AGAIN"/>
-         <label data="2" alias="ALLOW_SERVICE"/>
-         <label data="3" alias="TRY_AGAIN_ALLOW_SERVICE"/>
-      </single>
-   </avp>
-   <avp name="Multi-Round-Time-Out" code="272" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Disconnect-Cause" code="273" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-2">
-         <label data="0" alias="REBOOTING"/>
-         <label data="1" alias="BUSY"/>
-         <label data="2" alias="DO_NOT_WANT_TO_TALK_TO_YOU"/>
-      </single>
-   </avp>
-   <avp name="Auth-Request-Type" code="274" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-3">
-         <label data="1" alias="AUTHENTICATE_ONLY"/>
-         <label data="2" alias="AUTHORIZE_ONLY"/>
-         <label data="3" alias="AUTHORIZE_AUTHENTICATE"/>
-      </single>
-   </avp>
-   <avp name="Auth-Grace-Period" code="276" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Auth-Session-State" code="277" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="STATE_MAINTAINED"/>
-         <label data="1" alias="NO_STATE_MAINTAINED"/>
-      </single>
-   </avp>
-   <avp name="Origin-State-Id" code="278" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Failed-AVP" code="279" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="AVP" type="Mandatory" qual="1*"/>
-      </grouped>
-   </avp>
-   <avp name="Proxy-Host" code="280" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Error-Message" code="281" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Route-Record" code="282" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Destination-Realm" code="283" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Proxy-Info" code="284" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Proxy-Host" type="Mandatory"/>
-         <avprule id="Proxy-State" type="Mandatory"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Re-Auth-Request-Type" code="285" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="AUTHORIZE_ONLY"/>
-         <label data="1" alias="AUTHORIZE_AUTHENTICATE"/>
-      </single>
-   </avp>
-   <avp name="Accounting-Sub-Session-Id" code="287" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned64"/>
-   </avp>
-   <avp name="Redirect-Host" code="292" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterURI"/>
-   </avp>
-   <avp name="Destination-Host" code="293" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Error-Reporting-Host" code="294" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Termination-Cause" code="295" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-8">
-         <label data="1" alias="LOGOUT"/>
-         <label data="2" alias="SERVICE_NOT_PROVIDED"/>
-         <label data="3" alias="BAD_ANSWER"/>
-         <label data="4" alias="ADMINISTRATIVE"/>
-         <label data="5" alias="LINK_BROKEN"/>
-         <label data="6" alias="AUTH_EXPIRED"/>
-         <label data="7" alias="USER_MOVED"/>
-         <label data="8" alias="SESSION_TIMEOUT"/>
-      </single>
-   </avp>
-   <avp name="Origin-Realm" code="296" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Experimental-Result" code="297" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Vendor-Id" type="Mandatory"/>
-         <avprule id="Experimental-Result-Code" type="Mandatory"/>
-      </grouped>
-   </avp>
-   <avp name="Experimental-Result-Code" code="298" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Inband-Security-Id" code="299" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="E2E-Sequence" code="300" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="AVP" type="Mandatory" qual="2*"/>
-      </grouped>
-   </avp>
-   <avp name="CC-Input-Octets" code="412" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned64"/>
-   </avp>
-   <avp name="CC-Output-Octets" code="414" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned64"/>
-   </avp>
-   <avp name="CC-Request-Number" code="415" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="CC-Request-Type" code="416" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-4">
-         <label data="1" alias="INITIAL_REQUEST"/>
-         <label data="2" alias="UPDATE_REQUEST"/>
-         <label data="3" alias="TERMINATION_REQUEST"/>
-         <label data="4" alias="EVENT_REQUEST"/>
-      </single>
-   </avp>
-   <avp name="CC-Time" code="420" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="CC-Total-Octets" code="421" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned64"/>
-   </avp>
-   <avp name="Granted-Service-Unit" code="431" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <grouped>
-         <avprule id="CC-Total-Octets" type="Optional"/>
-         <avprule id="CC-Time" type="Optional"/>
-         <avprule id="CC-Input-Octets" type="Optional"/>
-         <avprule id="CC-Output-Octets" type="Optional"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Rating-Group" code="432" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Redirect-Address-Type" code="433" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-3">
-         <label data="0" alias="IPv4"/>
-         <label data="1" alias="IPv6Addr"/>
-         <label data="2" alias="URL"/>
-         <label data="3" alias="SIP"/>
-      </single>
-   </avp>
-   <avp name="Redirect-Server-Address" code="435" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Service-Identifier" code="439" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Subscription-Id" code="443" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Subscription-Id-Type" type="Mandatory"/>
-         <avprule id="Subscription-Id-Data" type="Mandatory"/>
-      </grouped>
-   </avp>
-   <avp name="Subscription-Id-Data" code="444" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Used-Service-Unit" code="446" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <grouped>
-         <avprule id="CC-Total-Octets" type="Optional"/>
-         <avprule id="CC-Time" type="Optional"/>
-         <avprule id="CC-Input-Octets" type="Optional"/>
-         <avprule id="CC-Output-Octets" type="Optional"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Subscription-Id-Type" code="450" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-4">
-         <label data="0" alias="END_USER_E164"/>
-         <label data="1" alias="END_USER_IMSI"/>
-         <label data="2" alias="END_USER_SIP_URI"/>
-         <label data="3" alias="END_USER_NAI"/>
-         <label data="4" alias="END_USER_PRIVATE"/>
-      </single>
-   </avp>
-   <avp name="User-Equipment-Info" code="458" may-encrypt="yes" v-bit="mustnot" m-bit="may" p-bit="mustnot">
-      <grouped>
-         <avprule id="User-Equipment-Info-Type" type="Mandatory"/>
-         <avprule id="User-Equipment-Info-Value" type="Mandatory"/>
-      </grouped>
-   </avp>
-   <avp name="User-Equipment-Info-Type" code="459" may-encrypt="yes" v-bit="mustnot" m-bit="may" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-3">
-         <label data="0" alias="IMEISV"/>
-         <label data="1" alias="MAC"/>
-         <label data="2" alias="EUI64"/>
-         <label data="3" alias="MODIFIED_EUI64"/>
-      </single>
-   </avp>
-   <avp name="User-Equipment-Info-Value" code="460" may-encrypt="yes" v-bit="mustnot" m-bit="may" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Accounting-Record-Type" code="480" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-4">
-         <label data="1" alias="EVENT_RECORD"/>
-         <label data="2" alias="START_RECORD"/>
-         <label data="3" alias="INTERIM_RECORD"/>
-         <label data="4" alias="STOP_RECORD"/>
-      </single>
-   </avp>
-   <avp name="Accounting-Realtime-Required" code="483" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-3">
-         <label data="1" alias="DELIVER_AND_GRANT"/>
-         <label data="2" alias="GRANT_AND_STORE"/>
-         <label data="3" alias="GRANT_AND_LOSE"/>
-      </single>
-   </avp>
-   <avp name="Accounting-Record-Number" code="485" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Rule-Space-Suggestion" code="290" vendor-name="ERICSSON" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Rule-Space-Decision" code="291" vendor-name="ERICSSON" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Charging-Rule-Authorization" code="1055" vendor-name="ERICSSON" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Authorization-State" type="Mandatory"/>
-         <avprule id="Authorization-State-Change-Time" type="Optional"/>
-         <avprule id="Next-Authorization-State" type="Optional"/>
-         <avprule id="One-Time-Redirect-Control" type="Optional"/>
-      </grouped>
-   </avp>
-   <avp name="Authorization-State" code="1056" vendor-name="ERICSSON" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-12">
-         <label data="0" alias="AUTHORIZED"/>
-         <label data="1" alias="DENIED_CALENDAR_TIME"/>
-         <label data="2" alias="DENIED_ROAMING"/>
-         <label data="3" alias="DENIED_QUALITY_OF_SERVICE"/>
-         <label data="4" alias="DENIED_BLACKLISTED"/>
-         <label data="5" alias="DENIED_TERMINAL"/>
-         <label data="6" alias="DENIED_OPERATOR_REASON_ONE"/>
-         <label data="7" alias="DENIED_OPERATOR_REASON_TWO"/>
-         <label data="8" alias="DENIED_OPERATOR_REASON_THREE"/>
-         <label data="9" alias="DENIED_OPERATOR_REASON_FOUR"/>
-         <label data="10" alias="DENIED_OPERATOR_REASON_FIVE"/>
-         <label data="11" alias="DENIED_UNKNOWN_REASON"/>
-         <label data="12" alias="DENIED_USAGE_CONTROL"/>
-      </single>
-   </avp>
-   <avp name="Gx-Capability-List" code="1060" vendor-name="ERICSSON" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Content-Filtering-Profile-Id" code="1138" vendor-name="ERICSSON" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Customer-Id" code="1146" vendor-name="ERICSSON" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="One-Time-Redirect-Control" code="1193" vendor-name="ERICSSON" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-10">
-         <label data="0" alias="INACTIVE"/>
-         <label data="1" alias="DEFAULT"/>
-         <label data="2" alias="ROAMING"/>
-         <label data="3" alias="QBAU"/>
-         <label data="4" alias="TIME"/>
-         <label data="5" alias="OPERATOR_REASON_ONE"/>
-         <label data="6" alias="OPERATOR_REASON_TWO"/>
-         <label data="7" alias="OPERATOR_REASON_THREE"/>
-         <label data="8" alias="OPERATOR_REASON_FOUR"/>
-         <label data="9" alias="OPERATOR_REASON_FIVE"/>
-         <label data="10" alias="OPERATOR_REASON_SIX"/>
-      </single>
-   </avp>
-   <avp name="3GPP2-BSID" code="9010" vendor-name="3GPP2" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="3GPP-SGSN-Address" code="6" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="3GPP-Charging-Characteristics" code="13" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="3GPP-SGSN-IPv6-Address" code="15" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="3GPP-SGSN-MCC-MNC" code="18" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="3GPP-RAT-Type" code="21" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="3GPP-User-Location-Info" code="22" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="3GPP-MS-TimeZone" code="23" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Access-Network-Charging-Address" code="501" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Address"/>
-   </avp>
-   <avp name="Access-Network-Charging-Identifier-Value" code="503" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="AF-Charging-Identifier" code="505" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Flow-Description" code="507" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="IPFilterRule"/>
-   </avp>
-   <avp name="Flow-Number" code="509" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Flows" code="510" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Media-Component-Number" type="Mandatory"/>
-         <avprule id="Flow-Number" type="Optional" qual="*"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Flow-Status" code="511" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-4">
-         <label data="0" alias="ENABLED-UPLINK"/>
-         <label data="1" alias="ENABLED-DOWNLINK"/>
-         <label data="2" alias="ENABLED"/>
-         <label data="3" alias="DISABLED"/>
-         <label data="4" alias="REMOVED"/>
-      </single>
-   </avp>
-   <avp name="Max-Requested-Bandwidth-DL" code="515" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Max-Requested-Bandwidth-UL" code="516" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Media-Component-Number" code="518" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Required-Access-Info" code="536" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="USER_LOCATION"/>
-         <label data="1" alias="MS_TIME_ZONE"/>
-      </single>
-   </avp>
-   <avp name="Charging-Information" code="618" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Primary-Event-Charging-Function-Name" type="Optional"/>
-         <avprule id="Secondary-Event-Charging-Function-Name" type="Optional"/>
-         <avprule id="Primary-Charging-Collection-Function-Name" type="Optional"/>
-         <avprule id="Secondary-Charging-Collection-Function-Name" type="Optional"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Primary-Event-Charging-Function-Name" code="619" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterURI"/>
-   </avp>
-   <avp name="Secondary-Event-Charging-Function-Name" code="620" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterURI"/>
-   </avp>
-   <avp name="Primary-Charging-Collection-Function-Name" code="621" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterURI"/>
-   </avp>
-   <avp name="Secondary-Charging-Collection-Function-Name" code="622" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterURI"/>
-   </avp>
-   <avp name="Supported-Features" code="628" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="may" p-bit="mustnot">
-      <grouped>
-         <avprule id="Vendor-Id" type="Mandatory"/>
-         <avprule id="Feature-List-ID" type="Mandatory"/>
-         <avprule id="Feature-List" type="Mandatory"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Feature-List-ID" code="629" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Feature-List" code="630" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="RAI" code="909" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Bearer-Usage" code="1000" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="GENERAL"/>
-         <label data="1" alias="IMS_SIGNALLING"/>
-      </single>
-   </avp>
-   <avp name="Charging-Rule-Install" code="1001" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Charging-Rule-Definition" type="Optional" qual="*"/>
-         <avprule id="Charging-Rule-Name" type="Optional" qual="*"/>
-         <avprule id="Charging-Rule-Base-Name" type="Optional" qual="*"/>
-         <avprule id="Charging-Rule-Authorization" type="Optional" qual="*"/>
-         <avprule id="Bearer-Identifier" type="Optional"/>
-         <avprule id="Rule-Activation-Time" type="Optional"/>
-         <avprule id="Rule-DeActivation-Time" type="Optional"/>
-         <avprule id="Resource-Allocation-Notification" type="Optional"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Charging-Rule-Remove" code="1002" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Charging-Rule-Name" type="Optional" qual="*"/>
-         <avprule id="Charging-Rule-Base-Name" type="Optional" qual="*"/>
-         <avprule id="Required-Access-Info" type="Optional" qual="*"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Charging-Rule-Definition" code="1003" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Charging-Rule-Name" type="Mandatory"/>
-         <avprule id="Service-Identifier" type="Optional"/>
-         <avprule id="Rating-Group" type="Optional"/>
-         <avprule id="Flow-Information" type="Optional" qual="*"/>
-         <avprule id="Flow-Status" type="Optional"/>
-         <avprule id="QoS-Information" type="Optional"/>
-         <avprule id="Reporting-Level" type="Optional"/>
-         <avprule id="Online" type="Optional"/>
-         <avprule id="Offline" type="Optional"/>
-         <avprule id="Metering-Method" type="Optional"/>
-         <avprule id="Precedence" type="Optional"/>
-         <avprule id="AF-Charging-Identifier" type="Optional"/>
-         <avprule id="Flows" type="Optional" qual="*"/>
-         <avprule id="Monitoring-Key" type="Optional"/>
-         <avprule id="Required-Access-Info" type="Optional" qual="*"/>
-         <avprule id="TDF-Application-Identifier" type="Optional"/>
-         <avprule id="Redirect-Information" type="Optional"/>
-         <avprule id="Mute-Notification" type="Optional"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Charging-Rule-Base-Name" code="1004" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Charging-Rule-Name" code="1005" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Event-Trigger" code="1006" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-2,4-4,7-7,12-13,15-17,20-22,25-27,29-29,33-34,39-40,45-45,48">
-         <label data="0" alias="SGSN_CHANGE"/>
-         <label data="1" alias="QOS_CHANGE"/>
-         <label data="2" alias="RAT_CHANGE"/>
-         <label data="4" alias="PLMN_CHANGE"/>
-         <label data="7" alias="IP-CAN-CHANGE"/>
-         <label data="12" alias="RAI_CHANGE"/>
-         <label data="13" alias="USER_LOCATION_CHANGE"/>
-         <label data="15" alias="OUT_OF_CREDIT"/>
-         <label data="16" alias="REALLOCATION_OF_CREDIT"/>
-         <label data="17" alias="REVALIDATION_TIMEOUT"/>
-         <label data="20" alias="DEFAULT_EPS_BEARER_QOS_CHANGE"/>
-         <label data="21" alias="AN_GW_CHANGE"/>
-         <label data="22" alias="SUCCESSFUL_RESOURCE_ALLOCATION"/>
-         <label data="25" alias="UE_TIME_ZONE_CHANGE"/>
-         <label data="26" alias="TAI_CHANGE"/>
-         <label data="27" alias="ECGI_CHANGE"/>
-         <label data="29" alias="APN-AMBR_MODIFICATION_FAILURE"/>
-         <label data="33" alias="USAGE_REPORT"/>
-         <label data="34" alias="DEFAULT-EPS-BEARER-QOS_MODIFICATION_FAILURE"/>
-         <label data="39" alias="APPLICATION_START"/>
-         <label data="40" alias="APPLICATION_STOP"/>
-         <label data="45" alias="ACCESS_NETWORK_INFO_REPORT"/>
-         <label data="48" alias="CHANGE_OF_UE_PRESENCE_IN_PRESENCE_REPORTING_AREA_REPORT"/>
-      </single>
-   </avp>
-   <avp name="Metering-Method" code="1007" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-2">
-         <label data="0" alias="DURATION"/>
-         <label data="1" alias="VOLUME"/>
-         <label data="2" alias="DURATION_VOLUME"/>
-      </single>
-   </avp>
-   <avp name="Offline" code="1008" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="DISABLE_OFFLINE"/>
-         <label data="1" alias="ENABLE_OFFLINE"/>
-      </single>
-   </avp>
-   <avp name="Online" code="1009" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="DISABLE_ONLINE"/>
-         <label data="1" alias="ENABLE_ONLINE"/>
-      </single>
-   </avp>
-   <avp name="Precedence" code="1010" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Reporting-Level" code="1011" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="SERVICE_IDENTIFIER_LEVEL"/>
-         <label data="1" alias="RATING_GROUP_LEVEL"/>
-      </single>
-   </avp>
-   <avp name="ToS-Traffic-Class" code="1014" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="QoS-Information" code="1016" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="QoS-Class-Identifier" type="Optional"/>
-         <avprule id="Max-Requested-Bandwidth-UL" type="Optional"/>
-         <avprule id="Max-Requested-Bandwidth-DL" type="Optional"/>
-         <avprule id="Guaranteed-Bitrate-UL" type="Optional"/>
-         <avprule id="Guaranteed-Bitrate-DL" type="Optional"/>
-         <avprule id="Bearer-Identifier" type="Optional"/>
-         <avprule id="Allocation-Retention-Priority" type="Optional"/>
-         <avprule id="APN-Aggregate-Max-Bitrate-UL" type="Optional"/>
-         <avprule id="APN-Aggregate-Max-Bitrate-DL" type="Optional"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Charging-Rule-Report" code="1018" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Charging-Rule-Name" type="Optional" qual="*"/>
-         <avprule id="Charging-Rule-Base-Name" type="Optional" qual="*"/>
-         <avprule id="PCC-Rule-Status" type="Optional"/>
-         <avprule id="Rule-Failure-Code" type="Optional"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="PCC-Rule-Status" code="1019" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-2">
-         <label data="0" alias="ACTIVE"/>
-         <label data="1" alias="INACTIVE"/>
-         <label data="2" alias="TEMPORARILY_INACTIVE"/>
-      </single>
-   </avp>
-   <avp name="Bearer-Identifier" code="1020" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Bearer-Operation" code="1021" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-2">
-         <label data="0" alias="TERMINATION"/>
-         <label data="1" alias="ESTABLISHMENT"/>
-         <label data="2" alias="MODIFICATION"/>
-      </single>
-   </avp>
-   <avp name="Access-Network-Charging-Identifier-Gx" code="1022" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Access-Network-Charging-Identifier-Value" type="Mandatory"/>
-         <avprule id="Charging-Rule-Base-Name" type="Optional" qual="*"/>
-         <avprule id="Charging-Rule-Name" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Bearer-Control-Mode" code="1023" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-2">
-         <label data="0" alias="UE_ONLY"/>
-         <label data="1" alias="RESERVED"/>
-         <label data="2" alias="UE_NW"/>
-      </single>
-   </avp>
-   <avp name="Network-Request-Support" code="1024" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="NETWORK_REQUEST_NOT_SUPPORTED"/>
-         <label data="1" alias="NETWORK_REQUEST_SUPPORTED"/>
-      </single>
-   </avp>
-   <avp name="Guaranteed-Bitrate-DL" code="1025" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Guaranteed-Bitrate-UL" code="1026" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="IP-CAN-Type" code="1027" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-7">
-         <label data="0" alias="3GPP-GPRS"/>
-         <label data="1" alias="DOCSIS"/>
-         <label data="2" alias="xDSL"/>
-         <label data="3" alias="WiMAX"/>
-         <label data="4" alias="3GPP2"/>
-         <label data="5" alias="3GPP-EPS"/>
-         <label data="6" alias="Non-3GPP-EPS"/>
-         <label data="7" alias="FBA"/>
-      </single>
-   </avp>
-   <avp name="QoS-Class-Identifier" code="1028" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-254">
-         <label data="1" alias="QCI_1"/>
-         <label data="2" alias="QCI_2"/>
-         <label data="3" alias="QCI_3"/>
-         <label data="4" alias="QCI_4"/>
-         <label data="5" alias="QCI_5"/>
-         <label data="6" alias="QCI_6"/>
-         <label data="7" alias="QCI_7"/>
-         <label data="8" alias="QCI_8"/>
-         <label data="9" alias="QCI_9"/>
-         <label data="10" alias="QCI_10"/>
-         <label data="11" alias="QCI_11"/>
-         <label data="12" alias="QCI_12"/>
-         <label data="13" alias="QCI_13"/>
-         <label data="14" alias="QCI_14"/>
-         <label data="15" alias="QCI_15"/>
-         <label data="16" alias="QCI_16"/>
-         <label data="17" alias="QCI_17"/>
-         <label data="18" alias="QCI_18"/>
-         <label data="19" alias="QCI_19"/>
-         <label data="20" alias="QCI_20"/>
-         <label data="21" alias="QCI_21"/>
-         <label data="22" alias="QCI_22"/>
-         <label data="23" alias="QCI_23"/>
-         <label data="24" alias="QCI_24"/>
-         <label data="25" alias="QCI_25"/>
-         <label data="26" alias="QCI_26"/>
-         <label data="27" alias="QCI_27"/>
-         <label data="28" alias="QCI_28"/>
-         <label data="29" alias="QCI_29"/>
-         <label data="30" alias="QCI_30"/>
-         <label data="31" alias="QCI_31"/>
-         <label data="32" alias="QCI_32"/>
-         <label data="33" alias="QCI_33"/>
-         <label data="34" alias="QCI_34"/>
-         <label data="35" alias="QCI_35"/>
-         <label data="36" alias="QCI_36"/>
-         <label data="37" alias="QCI_37"/>
-         <label data="38" alias="QCI_38"/>
-         <label data="39" alias="QCI_39"/>
-         <label data="40" alias="QCI_40"/>
-         <label data="41" alias="QCI_41"/>
-         <label data="42" alias="QCI_42"/>
-         <label data="43" alias="QCI_43"/>
-         <label data="44" alias="QCI_44"/>
-         <label data="45" alias="QCI_45"/>
-         <label data="46" alias="QCI_46"/>
-         <label data="47" alias="QCI_47"/>
-         <label data="48" alias="QCI_48"/>
-         <label data="49" alias="QCI_49"/>
-         <label data="50" alias="QCI_50"/>
-         <label data="51" alias="QCI_51"/>
-         <label data="52" alias="QCI_52"/>
-         <label data="53" alias="QCI_53"/>
-         <label data="54" alias="QCI_54"/>
-         <label data="55" alias="QCI_55"/>
-         <label data="56" alias="QCI_56"/>
-         <label data="57" alias="QCI_57"/>
-         <label data="58" alias="QCI_58"/>
-         <label data="59" alias="QCI_59"/>
-         <label data="60" alias="QCI_60"/>
-         <label data="61" alias="QCI_61"/>
-         <label data="62" alias="QCI_62"/>
-         <label data="63" alias="QCI_63"/>
-         <label data="64" alias="QCI_64"/>
-         <label data="65" alias="QCI_65"/>
-         <label data="66" alias="QCI_66"/>
-         <label data="67" alias="QCI_67"/>
-         <label data="68" alias="QCI_68"/>
-         <label data="69" alias="QCI_69"/>
-         <label data="70" alias="QCI_70"/>
-         <label data="71" alias="QCI_71"/>
-         <label data="72" alias="QCI_72"/>
-         <label data="73" alias="QCI_73"/>
-         <label data="74" alias="QCI_74"/>
-         <label data="75" alias="QCI_75"/>
-         <label data="76" alias="QCI_76"/>
-         <label data="77" alias="QCI_77"/>
-         <label data="78" alias="QCI_78"/>
-         <label data="79" alias="QCI_79"/>
-         <label data="80" alias="QCI_80"/>
-         <label data="81" alias="QCI_81"/>
-         <label data="82" alias="QCI_82"/>
-         <label data="83" alias="QCI_83"/>
-         <label data="84" alias="QCI_84"/>
-         <label data="85" alias="QCI_85"/>
-         <label data="86" alias="QCI_86"/>
-         <label data="87" alias="QCI_87"/>
-         <label data="88" alias="QCI_88"/>
-         <label data="89" alias="QCI_89"/>
-         <label data="90" alias="QCI_90"/>
-         <label data="91" alias="QCI_91"/>
-         <label data="92" alias="QCI_92"/>
-         <label data="93" alias="QCI_93"/>
-         <label data="94" alias="QCI_94"/>
-         <label data="95" alias="QCI_95"/>
-         <label data="96" alias="QCI_96"/>
-         <label data="97" alias="QCI_97"/>
-         <label data="98" alias="QCI_98"/>
-         <label data="99" alias="QCI_99"/>
-         <label data="100" alias="QCI_100"/>
-         <label data="101" alias="QCI_101"/>
-         <label data="102" alias="QCI_102"/>
-         <label data="103" alias="QCI_103"/>
-         <label data="104" alias="QCI_104"/>
-         <label data="105" alias="QCI_105"/>
-         <label data="106" alias="QCI_106"/>
-         <label data="107" alias="QCI_107"/>
-         <label data="108" alias="QCI_108"/>
-         <label data="109" alias="QCI_109"/>
-         <label data="110" alias="QCI_110"/>
-         <label data="111" alias="QCI_111"/>
-         <label data="112" alias="QCI_112"/>
-         <label data="113" alias="QCI_113"/>
-         <label data="114" alias="QCI_114"/>
-         <label data="115" alias="QCI_115"/>
-         <label data="116" alias="QCI_116"/>
-         <label data="117" alias="QCI_117"/>
-         <label data="118" alias="QCI_118"/>
-         <label data="119" alias="QCI_119"/>
-         <label data="120" alias="QCI_120"/>
-         <label data="121" alias="QCI_121"/>
-         <label data="122" alias="QCI_122"/>
-         <label data="123" alias="QCI_123"/>
-         <label data="124" alias="QCI_124"/>
-         <label data="125" alias="QCI_125"/>
-         <label data="126" alias="QCI_126"/>
-         <label data="127" alias="QCI_127"/>
-         <label data="128" alias="QCI_128"/>
-         <label data="129" alias="QCI_129"/>
-         <label data="130" alias="QCI_130"/>
-         <label data="131" alias="QCI_131"/>
-         <label data="132" alias="QCI_132"/>
-         <label data="133" alias="QCI_133"/>
-         <label data="134" alias="QCI_134"/>
-         <label data="135" alias="QCI_135"/>
-         <label data="136" alias="QCI_136"/>
-         <label data="137" alias="QCI_137"/>
-         <label data="138" alias="QCI_138"/>
-         <label data="139" alias="QCI_139"/>
-         <label data="140" alias="QCI_140"/>
-         <label data="141" alias="QCI_141"/>
-         <label data="142" alias="QCI_142"/>
-         <label data="143" alias="QCI_143"/>
-         <label data="144" alias="QCI_144"/>
-         <label data="145" alias="QCI_145"/>
-         <label data="146" alias="QCI_146"/>
-         <label data="147" alias="QCI_147"/>
-         <label data="148" alias="QCI_148"/>
-         <label data="149" alias="QCI_149"/>
-         <label data="150" alias="QCI_150"/>
-         <label data="151" alias="QCI_151"/>
-         <label data="152" alias="QCI_152"/>
-         <label data="153" alias="QCI_153"/>
-         <label data="154" alias="QCI_154"/>
-         <label data="155" alias="QCI_155"/>
-         <label data="156" alias="QCI_156"/>
-         <label data="157" alias="QCI_157"/>
-         <label data="158" alias="QCI_158"/>
-         <label data="159" alias="QCI_159"/>
-         <label data="160" alias="QCI_160"/>
-         <label data="161" alias="QCI_161"/>
-         <label data="162" alias="QCI_162"/>
-         <label data="163" alias="QCI_163"/>
-         <label data="164" alias="QCI_164"/>
-         <label data="165" alias="QCI_165"/>
-         <label data="166" alias="QCI_166"/>
-         <label data="167" alias="QCI_167"/>
-         <label data="168" alias="QCI_168"/>
-         <label data="169" alias="QCI_169"/>
-         <label data="170" alias="QCI_170"/>
-         <label data="171" alias="QCI_171"/>
-         <label data="172" alias="QCI_172"/>
-         <label data="173" alias="QCI_173"/>
-         <label data="174" alias="QCI_174"/>
-         <label data="175" alias="QCI_175"/>
-         <label data="176" alias="QCI_176"/>
-         <label data="177" alias="QCI_177"/>
-         <label data="178" alias="QCI_178"/>
-         <label data="179" alias="QCI_179"/>
-         <label data="180" alias="QCI_180"/>
-         <label data="181" alias="QCI_181"/>
-         <label data="182" alias="QCI_182"/>
-         <label data="183" alias="QCI_183"/>
-         <label data="184" alias="QCI_184"/>
-         <label data="185" alias="QCI_185"/>
-         <label data="186" alias="QCI_186"/>
-         <label data="187" alias="QCI_187"/>
-         <label data="188" alias="QCI_188"/>
-         <label data="189" alias="QCI_189"/>
-         <label data="190" alias="QCI_190"/>
-         <label data="191" alias="QCI_191"/>
-         <label data="192" alias="QCI_192"/>
-         <label data="193" alias="QCI_193"/>
-         <label data="194" alias="QCI_194"/>
-         <label data="195" alias="QCI_195"/>
-         <label data="196" alias="QCI_196"/>
-         <label data="197" alias="QCI_197"/>
-         <label data="198" alias="QCI_198"/>
-         <label data="199" alias="QCI_199"/>
-         <label data="200" alias="QCI_200"/>
-         <label data="201" alias="QCI_201"/>
-         <label data="202" alias="QCI_202"/>
-         <label data="203" alias="QCI_203"/>
-         <label data="204" alias="QCI_204"/>
-         <label data="205" alias="QCI_205"/>
-         <label data="206" alias="QCI_206"/>
-         <label data="207" alias="QCI_207"/>
-         <label data="208" alias="QCI_208"/>
-         <label data="209" alias="QCI_209"/>
-         <label data="210" alias="QCI_210"/>
-         <label data="211" alias="QCI_211"/>
-         <label data="212" alias="QCI_212"/>
-         <label data="213" alias="QCI_213"/>
-         <label data="214" alias="QCI_214"/>
-         <label data="215" alias="QCI_215"/>
-         <label data="216" alias="QCI_216"/>
-         <label data="217" alias="QCI_217"/>
-         <label data="218" alias="QCI_218"/>
-         <label data="219" alias="QCI_219"/>
-         <label data="220" alias="QCI_220"/>
-         <label data="221" alias="QCI_221"/>
-         <label data="222" alias="QCI_222"/>
-         <label data="223" alias="QCI_223"/>
-         <label data="224" alias="QCI_224"/>
-         <label data="225" alias="QCI_225"/>
-         <label data="226" alias="QCI_226"/>
-         <label data="227" alias="QCI_227"/>
-         <label data="228" alias="QCI_228"/>
-         <label data="229" alias="QCI_229"/>
-         <label data="230" alias="QCI_230"/>
-         <label data="231" alias="QCI_231"/>
-         <label data="232" alias="QCI_232"/>
-         <label data="233" alias="QCI_233"/>
-         <label data="234" alias="QCI_234"/>
-         <label data="235" alias="QCI_235"/>
-         <label data="236" alias="QCI_236"/>
-         <label data="237" alias="QCI_237"/>
-         <label data="238" alias="QCI_238"/>
-         <label data="239" alias="QCI_239"/>
-         <label data="240" alias="QCI_240"/>
-         <label data="241" alias="QCI_241"/>
-         <label data="242" alias="QCI_242"/>
-         <label data="243" alias="QCI_243"/>
-         <label data="244" alias="QCI_244"/>
-         <label data="245" alias="QCI_245"/>
-         <label data="246" alias="QCI_246"/>
-         <label data="247" alias="QCI_247"/>
-         <label data="248" alias="QCI_248"/>
-         <label data="249" alias="QCI_249"/>
-         <label data="250" alias="QCI_250"/>
-         <label data="251" alias="QCI_251"/>
-         <label data="252" alias="QCI_252"/>
-         <label data="253" alias="QCI_253"/>
-         <label data="254" alias="QCI_254"/>
-      </single>
-   </avp>
-   <avp name="QoS-Negotiation" code="1029" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="NO_QoS_NEGOTIATION"/>
-         <label data="1" alias="QoS_NEGOTIATION_SUPPORTED"/>
-      </single>
-   </avp>
-   <avp name="QoS-Upgrade" code="1030" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="QoS_UPGRADE_NOT_SUPPORTED"/>
-         <label data="1" alias="QoS_UPGRADE_SUPPORTED"/>
-      </single>
-   </avp>
-   <avp name="Rule-Failure-Code" code="1031" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-15,18">
-         <label data="1" alias="UNKNOWN_RULE_NAME"/>
-         <label data="2" alias="RATING_GROUP_ERROR"/>
-         <label data="3" alias="SERVICE_IDENTIFIER_ERROR"/>
-         <label data="4" alias="GWPCEF_MALFUNCTION"/>
-         <label data="5" alias="RESOURCES_LIMITATION"/>
-         <label data="6" alias="MAX_NR_BEARERS_REACHED"/>
-         <label data="7" alias="UNKNOWN_BEARER_ID"/>
-         <label data="8" alias="MISSING_BEARER_ID"/>
-         <label data="9" alias="MISSING_FLOW_INFORMATION"/>
-         <label data="10" alias="RESOURCE_ALLOCATION_FAILURE"/>
-         <label data="11" alias="UNSUCCESSFUL_QOS_VALIDATION"/>
-         <label data="12" alias="INCORRECT_FLOW_INFORMATION"/>
-         <label data="13" alias="PS_TO_CS_HANDOVER"/>
-         <label data="14" alias="TDF_APPLICATION_IDENTIFIER_ERROR"/>
-         <label data="15" alias="NO_BEARER_BOUND"/>
-         <label data="18" alias="MISSING_REDIRECT_SERVER_ADDRESS"/>
-      </single>
-   </avp>
-   <avp name="RAT-Type" code="1032" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1,1000-1004,2000-2003">
-         <label data="0" alias="WLAN"/>
-         <label data="1" alias="VIRTUAL"/>
-         <label data="1000" alias="UTRAN"/>
-         <label data="1001" alias="GERAN"/>
-         <label data="1002" alias="GAN"/>
-         <label data="1003" alias="HSPA_EVOLUTION"/>
-         <label data="1004" alias="EUTRAN"/>
-         <label data="2000" alias="CDMA2000_1X"/>
-         <label data="2001" alias="HRPD"/>
-         <label data="2002" alias="UMB"/>
-         <label data="2003" alias="EHRPD"/>
-      </single>
-   </avp>
-   <avp name="Allocation-Retention-Priority" code="1034" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <grouped>
-         <avprule id="Priority-Level" type="Mandatory"/>
-         <avprule id="Pre-emption-Capability" type="Optional"/>
-         <avprule id="Pre-emption-Vulnerability" type="Optional"/>
-      </grouped>
-   </avp>
-   <avp name="APN-Aggregate-Max-Bitrate-DL" code="1040" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="APN-Aggregate-Max-Bitrate-UL" code="1041" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Revalidation-Time" code="1042" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Rule-Activation-Time" code="1043" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Rule-DeActivation-Time" code="1044" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Session-Release-Cause" code="1045" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="UNSPECIFIED_REASON"/>
-         <label data="1" alias="UE_SUBSCRIPTION_REASON"/>
-      </single>
-   </avp>
-   <avp name="Priority-Level" code="1046" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Pre-emption-Capability" code="1047" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="PRE-EMPTION_CAPABILITY_ENABLED"/>
-         <label data="1" alias="PRE-EMPTION_CAPABILITY_DISABLED"/>
-      </single>
-   </avp>
-   <avp name="Pre-emption-Vulnerability" code="1048" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="PRE-EMPTION_VULNERABILITY_ENABLED"/>
-         <label data="1" alias="PRE-EMPTION_VULNERABILITY_DISABLED"/>
-      </single>
-   </avp>
-   <avp name="Default-EPS-Bearer-QoS" code="1049" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <grouped>
-         <avprule id="QoS-Class-Identifier" type="Optional"/>
-         <avprule id="Allocation-Retention-Priority" type="Optional"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="AN-GW-Address" code="1050" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Address"/>
-   </avp>
-   <avp name="Authorization-State-Change-Time" code="1057" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Time"/>
-   </avp>
-   <avp name="Flow-Information" code="1058" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <grouped>
-         <avprule id="Flow-Description" type="Optional"/>
-         <avprule id="Flow-Direction" type="Optional"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Next-Authorization-State" code="1059" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="AUTHORIZED"/>
-         <label data="1" alias="DENIED_CALENDAR_TIME"/>
-      </single>
-   </avp>
-   <avp name="Resource-Allocation-Notification" code="1063" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0">
-         <label data="0" alias="ENABLE_NOTIFICATION"/>
-      </single>
-   </avp>
-   <avp name="Monitoring-Key" code="1066" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Usage-Monitoring-Information" code="1067" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <grouped>
-         <avprule id="Monitoring-Key" type="Optional"/>
-         <avprule id="Granted-Service-Unit" type="Optional"/>
-         <avprule id="Used-Service-Unit" type="Optional"/>
-         <avprule id="Usage-Monitoring-Level" type="Optional"/>
-         <avprule id="Usage-Monitoring-Report" type="Optional"/>
-         <avprule id="Usage-Monitoring-Support" type="Optional"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Usage-Monitoring-Level" code="1068" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="SESSION_LEVEL"/>
-         <label data="1" alias="PCC_RULE_LEVEL"/>
-      </single>
-   </avp>
-   <avp name="Usage-Monitoring-Report" code="1069" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0">
-         <label data="0" alias="USAGE_MONITORING_REPORT_REQUIRED"/>
-      </single>
-   </avp>
-   <avp name="Usage-Monitoring-Support" code="1070" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0">
-         <label data="0" alias="USAGE_MONITORING_DISABLED"/>
-      </single>
-   </avp>
-   <avp name="Flow-Direction" code="1080" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-3">
-         <label data="0" alias="UNSPECIFIED"/>
-         <label data="1" alias="DOWNLINK"/>
-         <label data="2" alias="UPLINK"/>
-         <label data="3" alias="BIDIRECTIONAL"/>
-      </single>
-   </avp>
-   <avp name="Redirect-Information" code="1085" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <grouped>
-         <avprule id="Redirect-Support" type="Optional"/>
-         <avprule id="Redirect-Address-Type" type="Optional"/>
-         <avprule id="Redirect-Server-Address" type="Optional"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Redirect-Support" code="1086" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="REDIRECTION_DISABLED"/>
-         <label data="1" alias="REDIRECTION_ENABLED"/>
-      </single>
-   </avp>
-   <avp name="TDF-Application-Identifier" code="1088" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Application-Detection-Information" code="1098" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <grouped>
-         <avprule id="TDF-Application-Identifier" type="Mandatory"/>
-         <avprule id="TDF-Application-Instance-Identifier" type="Optional"/>
-         <avprule id="Flow-Information" type="Optional" qual="*"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="TDF-Application-Instance-Identifier" code="2802" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Mute-Notification" code="2809" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0">
-         <label data="0" alias="MUTE_REQUIRED"/>
-      </single>
-   </avp>
-   <avp name="User-Location-Info-Time" code="2812" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Time"/>
-   </avp>
-   <avp name="Presence-Reporting-Area-Elements-List" code="2820" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Presence-Reporting-Area-Identifier" code="2821" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Presence-Reporting-Area-Information" code="2822" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <grouped>
-         <avprule id="Presence-Reporting-Area-Identifier" type="Optional"/>
-         <avprule id="Presence-Reporting-Area-Status" type="Optional"/>
-         <avprule id="Presence-Reporting-Area-Elements-List" type="Optional"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Presence-Reporting-Area-Status" code="2823" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="NetLoc-Access-Support" code="2824" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <command name="CER" code="257" type="Request">
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Host-IP-Address" type="Mandatory" qual="1*"/>
-      <avprule id="Vendor-Id" type="Mandatory"/>
-      <avprule id="Product-Name" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Supported-Vendor-Id" type="Optional" qual="*"/>
-      <avprule id="Auth-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Inband-Security-Id" type="Optional" qual="*"/>
-      <avprule id="Acct-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Firmware-Revision" type="Optional"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="CEA" code="257" type="Answer">
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Host-IP-Address" type="Mandatory" qual="1*"/>
-      <avprule id="Vendor-Id" type="Mandatory"/>
-      <avprule id="Product-Name" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Supported-Vendor-Id" type="Optional" qual="*"/>
-      <avprule id="Auth-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Inband-Security-Id" type="Optional" qual="*"/>
-      <avprule id="Acct-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Firmware-Revision" type="Optional"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="RA-Request" code="258" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Mandatory"/>
-      <avprule id="Re-Auth-Request-Type" type="Mandatory"/>
-      <avprule id="Session-Release-Cause" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Event-Trigger" type="Optional" qual="*"/>
-      <avprule id="Charging-Rule-Remove" type="Optional" qual="*"/>
-      <avprule id="Charging-Rule-Install" type="Optional" qual="*"/>
-      <avprule id="Default-EPS-Bearer-QoS" type="Optional"/>
-      <avprule id="QoS-Information" type="Optional"/>
-      <avprule id="Revalidation-Time" type="Optional"/>
-      <avprule id="Content-Filtering-Profile-Id" type="Optional"/>
-      <avprule id="Usage-Monitoring-Information" type="Optional" qual="*"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="Presence-Reporting-Area-Information" type="Optional"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="RA-Answer" code="258" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Result-Code" type="Optional"/>
-      <avprule id="Experimental-Result" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="IP-CAN-Type" type="Optional"/>
-      <avprule id="RAT-Type" type="Optional"/>
-      <avprule id="AN-GW-Address" type="Optional" qual="0*2"/>
-      <avprule id="3GPP-SGSN-MCC-MNC" type="Optional"/>
-      <avprule id="3GPP-SGSN-Address" type="Optional"/>
-      <avprule id="3GPP-SGSN-IPv6-Address" type="Optional"/>
-      <avprule id="RAI" type="Optional"/>
-      <avprule id="3GPP-User-Location-Info" type="Optional"/>
-      <avprule id="3GPP-MS-TimeZone" type="Optional"/>
-      <avprule id="Charging-Rule-Report" type="Optional" qual="*"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="NetLoc-Access-Support" type="Optional"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ACR" code="271" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Accounting-Record-Type" type="Mandatory"/>
-      <avprule id="Accounting-Record-Number" type="Mandatory"/>
-      <avprule id="Acct-Application-Id" type="Optional"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Accounting-Sub-Session-Id" type="Optional"/>
-      <avprule id="Acct-Session-Id" type="Optional"/>
-      <avprule id="Acct-Multi-Session-Id" type="Optional"/>
-      <avprule id="Acct-Interim-Interval" type="Optional"/>
-      <avprule id="Accounting-Realtime-Required" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Event-Timestamp" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ACA" code="271" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Accounting-Record-Type" type="Mandatory"/>
-      <avprule id="Accounting-Record-Number" type="Mandatory"/>
-      <avprule id="Acct-Application-Id" type="Optional"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Accounting-Sub-Session-Id" type="Optional"/>
-      <avprule id="Acct-Session-Id" type="Optional"/>
-      <avprule id="Acct-Multi-Session-Id" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Acct-Interim-Interval" type="Optional"/>
-      <avprule id="Accounting-Realtime-Required" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Event-Timestamp" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="CC-Request" code="272" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="CC-Request-Type" type="Mandatory"/>
-      <avprule id="CC-Request-Number" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Subscription-Id" type="Optional" qual="*"/>
-      <avprule id="Supported-Features" type="Optional" qual="*"/>
-      <avprule id="Network-Request-Support" type="Optional"/>
-      <avprule id="Bearer-Identifier" type="Optional"/>
-      <avprule id="Bearer-Operation" type="Optional"/>
-      <avprule id="Framed-IP-Address" type="Optional"/>
-      <avprule id="Framed-IPv6-Prefix" type="Optional"/>
-      <avprule id="IP-CAN-Type" type="Optional"/>
-      <avprule id="3GPP-RAT-Type" type="Optional"/>
-      <avprule id="RAT-Type" type="Optional"/>
-      <avprule id="Termination-Cause" type="Optional"/>
-      <avprule id="User-Equipment-Info" type="Optional"/>
-      <avprule id="QoS-Information" type="Optional"/>
-      <avprule id="QoS-Negotiation" type="Optional"/>
-      <avprule id="QoS-Upgrade" type="Optional"/>
-      <avprule id="Default-EPS-Bearer-QoS" type="Optional"/>
-      <avprule id="AN-GW-Address" type="Optional" qual="0*2"/>
-      <avprule id="3GPP-SGSN-MCC-MNC" type="Optional"/>
-      <avprule id="3GPP-SGSN-Address" type="Optional"/>
-      <avprule id="3GPP-SGSN-IPv6-Address" type="Optional"/>
-      <avprule id="RAI" type="Optional"/>
-      <avprule id="3GPP-User-Location-Info" type="Optional"/>
-      <avprule id="3GPP-MS-TimeZone" type="Optional"/>
-      <avprule id="User-Location-Info-Time" type="Optional"/>
-      <avprule id="Called-Station-Id" type="Optional"/>
-      <avprule id="Bearer-Usage" type="Optional"/>
-      <avprule id="Online" type="Optional"/>
-      <avprule id="Offline" type="Optional"/>
-      <avprule id="3GPP-Charging-Characteristics" type="Optional"/>
-      <avprule id="Gx-Capability-List" type="Optional"/>
-      <avprule id="Rule-Space-Decision" type="Optional"/>
-      <avprule id="Rule-Space-Suggestion" type="Optional"/>
-      <avprule id="Charging-Rule-Report" type="Optional" qual="*"/>
-      <avprule id="Event-Trigger" type="Optional" qual="*"/>
-      <avprule id="Access-Network-Charging-Address" type="Optional"/>
-      <avprule id="Application-Detection-Information" type="Optional" qual="*"/>
-      <avprule id="Access-Network-Charging-Identifier-Gx" type="Optional" qual="*"/>
-      <avprule id="Usage-Monitoring-Information" type="Optional" qual="*"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="Presence-Reporting-Area-Information" type="Optional"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="CC-Answer" code="272" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="CC-Request-Type" type="Mandatory"/>
-      <avprule id="CC-Request-Number" type="Mandatory"/>
-      <avprule id="Result-Code" type="Optional"/>
-      <avprule id="Experimental-Result" type="Optional"/>
-      <avprule id="Supported-Features" type="Optional" qual="*"/>
-      <avprule id="Bearer-Control-Mode" type="Optional"/>
-      <avprule id="Event-Trigger" type="Optional" qual="*"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Redirect-Host" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host-Usage" type="Optional"/>
-      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
-      <avprule id="Charging-Rule-Remove" type="Optional" qual="*"/>
-      <avprule id="Charging-Rule-Install" type="Optional" qual="*"/>
-      <avprule id="Charging-Information" type="Optional"/>
-      <avprule id="Online" type="Optional"/>
-      <avprule id="Offline" type="Optional"/>
-      <avprule id="Content-Filtering-Profile-Id" type="Optional"/>
-      <avprule id="3GPP-Charging-Characteristics" type="Optional"/>
-      <avprule id="Gx-Capability-List" type="Optional"/>
-      <avprule id="QoS-Information" type="Optional"/>
-      <avprule id="Revalidation-Time" type="Optional"/>
-      <avprule id="Default-EPS-Bearer-QoS" type="Optional"/>
-      <avprule id="Customer-Id" type="Optional"/>
-      <avprule id="Usage-Monitoring-Information" type="Optional" qual="*"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="Presence-Reporting-Area-Information" type="Optional"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ASR" code="274" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Mandatory"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ASA" code="274" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host-Usage" type="Optional"/>
-      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="STR" code="275" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Termination-Cause" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Destination-Host" type="Optional"/>
-      <avprule id="Class" type="Optional" qual="*"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="STA" code="275" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Class" type="Optional" qual="*"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Redirect-Host" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host-Usage" type="Optional"/>
-      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="DWR" code="280" type="Request">
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-   </command>
-   <command name="DWA" code="280" type="Answer">
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-   </command>
-   <command name="DPR" code="282" type="Request">
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Disconnect-Cause" type="Mandatory"/>
-   </command>
-   <command name="DPA" code="282" type="Answer">
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-   </command>
-</dictionary>
diff --git a/example/diameter/launcher/deployments/aots/agents/ADML/stacks/DictionaryRx.16777236.xml b/example/diameter/launcher/deployments/aots/agents/ADML/stacks/DictionaryRx.16777236.xml
deleted file mode 100755 (executable)
index bfd6c3c..0000000
+++ /dev/null
@@ -1,835 +0,0 @@
-<dictionary name="DictionaryRx | Application-Id: 16777236">
-   <vendor name="IETF" code="0"/>
-   <vendor name="3GPP" code="10415"/>
-   <vendor name="ETSI" code="13019"/>
-   <avp name="User-Name" code="1" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Framed-IP-Address" code="8" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Class" code="25" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Session-Timeout" code="27" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Called-Station-Id" code="30" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Proxy-State" code="33" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Acct-Session-Id" code="44" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Acct-Multi-Session-Id" code="50" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Event-Timestamp" code="55" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Time"/>
-   </avp>
-   <avp name="Acct-Interim-Interval" code="85" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Framed-IPv6-Prefix" code="97" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Host-IP-Address" code="257" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Address"/>
-   </avp>
-   <avp name="Auth-Application-Id" code="258" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Acct-Application-Id" code="259" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Vendor-Specific-Application-Id" code="260" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Vendor-Id" type="Mandatory" qual="1*"/>
-         <avprule id="Auth-Application-Id" type="Optional"/>
-         <avprule id="Acct-Application-Id" type="Optional"/>
-      </grouped>
-   </avp>
-   <avp name="Redirect-Host-Usage" code="261" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-6">
-         <label data="0" alias="DONT_CACHE"/>
-         <label data="1" alias="ALL_SESSION"/>
-         <label data="2" alias="ALL_REALM"/>
-         <label data="3" alias="REALM_AND_APPLICATION"/>
-         <label data="4" alias="ALL_APPLICATION"/>
-         <label data="5" alias="ALL_HOST"/>
-         <label data="6" alias="ALL_USER"/>
-      </single>
-   </avp>
-   <avp name="Redirect-Max-Cache-Time" code="262" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Session-Id" code="263" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Origin-Host" code="264" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Supported-Vendor-Id" code="265" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Vendor-Id" code="266" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Firmware-Revision" code="267" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Result-Code" code="268" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32">
-         <label data="1001" alias="DIAMETER_MULTI_ROUND_AUTH"/>
-         <label data="2001" alias="DIAMETER_SUCCESS"/>
-         <label data="2002" alias="DIAMETER_LIMITED_SUCCESS"/>
-         <label data="3001" alias="DIAMETER_COMMAND_UNSUPPORTED"/>
-         <label data="3002" alias="DIAMETER_UNABLE_TO_DELIVER"/>
-         <label data="3003" alias="DIAMETER_REALM_NOT_SERVED"/>
-         <label data="3004" alias="DIAMETER_TOO_BUSY"/>
-         <label data="3005" alias="DIAMETER_LOOP_DETECTED"/>
-         <label data="3006" alias="DIAMETER_REDIRECT_INDICATION"/>
-         <label data="3007" alias="DIAMETER_APPLICATION_UNSUPPORTED"/>
-         <label data="3008" alias="DIAMETER_INVALID_HDR_BITS"/>
-         <label data="3009" alias="DIAMETER_INVALID_AVP_BITS"/>
-         <label data="3010" alias="DIAMETER_UNKNOWN_PEER"/>
-         <label data="4001" alias="DIAMETER_AUTHENTICATION_REJECTED"/>
-         <label data="4002" alias="DIAMETER_OUT_OF_SPACE"/>
-         <label data="4003" alias="DIAMETER_ELECTION_LOST"/>
-         <label data="4241" alias="DIAMETER_NO_AVAILABLE_POLICY_COUNTERS"/>
-         <label data="5001" alias="DIAMETER_AVP_UNSUPPORTED"/>
-         <label data="5002" alias="DIAMETER_UNKNOWN_SESSION_ID"/>
-         <label data="5003" alias="DIAMETER_AUTHORIZATION_REJECTED"/>
-         <label data="5004" alias="DIAMETER_INVALID_AVP_VALUE"/>
-         <label data="5005" alias="DIAMETER_MISSING_AVP"/>
-         <label data="5006" alias="DIAMETER_RESOURCES_EXCEEDED"/>
-         <label data="5007" alias="DIAMETER_CONTRADICTING_AVPS"/>
-         <label data="5008" alias="DIAMETER_AVP_NOT_ALLOWED"/>
-         <label data="5009" alias="DIAMETER_AVP_OCCURS_TOO_MANY_TIMES"/>
-         <label data="5010" alias="DIAMETER_NO_COMMON_APPLICATION"/>
-         <label data="5011" alias="DIAMETER_UNSUPPORTED_VERSION"/>
-         <label data="5012" alias="DIAMETER_UNABLE_TO_COMPLY"/>
-         <label data="5013" alias="DIAMETER_INVALID_BIT_IN_HEADER"/>
-         <label data="5014" alias="DIAMETER_INVALID_AVP_LENGTH"/>
-         <label data="5015" alias="DIAMETER_INVALID_MESSAGE_LENGTH"/>
-         <label data="5016" alias="DIAMETER_INVALID_AVP_BIT_COMBO"/>
-         <label data="5017" alias="DIAMETER_NO_COMMON_SECURITY"/>
-         <label data="5030" alias="DIAMETER_USER_UNKNOWN"/>
-         <label data="5063" alias="REQUESTED_SERVICE_NOT_AUTHORIZED"/>
-         <label data="5065" alias="IP_CAN_SESSION_NOT_AVAILABLE"/>
-      </single>
-   </avp>
-   <avp name="Product-Name" code="269" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Session-Binding" code="270" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Session-Server-Failover" code="271" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-3">
-         <label data="0" alias="REFUSE_SERVICE"/>
-         <label data="1" alias="TRY_AGAIN"/>
-         <label data="2" alias="ALLOW_SERVICE"/>
-         <label data="3" alias="TRY_AGAIN_ALLOW_SERVICE"/>
-      </single>
-   </avp>
-   <avp name="Multi-Round-Time-Out" code="272" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Disconnect-Cause" code="273" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-2">
-         <label data="0" alias="REBOOTING"/>
-         <label data="1" alias="BUSY"/>
-         <label data="2" alias="DO_NOT_WANT_TO_TALK_TO_YOU"/>
-      </single>
-   </avp>
-   <avp name="Auth-Request-Type" code="274" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-3">
-         <label data="1" alias="AUTHENTICATE_ONLY"/>
-         <label data="2" alias="AUTHORIZE_ONLY"/>
-         <label data="3" alias="AUTHORIZE_AUTHENTICATE"/>
-      </single>
-   </avp>
-   <avp name="Auth-Grace-Period" code="276" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Auth-Session-State" code="277" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="STATE_MAINTAINED"/>
-         <label data="1" alias="NO_STATE_MAINTAINED"/>
-      </single>
-   </avp>
-   <avp name="Origin-State-Id" code="278" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Failed-AVP" code="279" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="AVP" type="Mandatory" qual="1*"/>
-      </grouped>
-   </avp>
-   <avp name="Proxy-Host" code="280" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Error-Message" code="281" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Route-Record" code="282" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Destination-Realm" code="283" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Proxy-Info" code="284" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Proxy-Host" type="Mandatory"/>
-         <avprule id="Proxy-State" type="Mandatory"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Re-Auth-Request-Type" code="285" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="AUTHORIZE_ONLY"/>
-         <label data="1" alias="AUTHORIZE_AUTHENTICATE"/>
-      </single>
-   </avp>
-   <avp name="Accounting-Sub-Session-Id" code="287" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned64"/>
-   </avp>
-   <avp name="Redirect-Host" code="292" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterURI"/>
-   </avp>
-   <avp name="Destination-Host" code="293" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Error-Reporting-Host" code="294" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Termination-Cause" code="295" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-8">
-         <label data="1" alias="LOGOUT"/>
-         <label data="2" alias="SERVICE_NOT_PROVIDED"/>
-         <label data="3" alias="BAD_ANSWER"/>
-         <label data="4" alias="ADMINISTRATIVE"/>
-         <label data="5" alias="LINK_BROKEN"/>
-         <label data="6" alias="AUTH_EXPIRED"/>
-         <label data="7" alias="USER_MOVED"/>
-         <label data="8" alias="SESSION_TIMEOUT"/>
-      </single>
-   </avp>
-   <avp name="Origin-Realm" code="296" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Experimental-Result" code="297" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Vendor-Id" type="Mandatory"/>
-         <avprule id="Experimental-Result-Code" type="Mandatory"/>
-      </grouped>
-   </avp>
-   <avp name="Experimental-Result-Code" code="298" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Inband-Security-Id" code="299" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="E2E-Sequence" code="300" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="AVP" type="Mandatory" qual="2*"/>
-      </grouped>
-   </avp>
-   <avp name="Subscription-Id" code="443" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Subscription-Id-Type" type="Mandatory"/>
-         <avprule id="Subscription-Id-Data" type="Mandatory"/>
-      </grouped>
-   </avp>
-   <avp name="Subscription-Id-Data" code="444" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Subscription-Id-Type" code="450" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-4">
-         <label data="0" alias="END_USER_E164"/>
-         <label data="1" alias="END_USER_IMSI"/>
-         <label data="2" alias="END_USER_SIP_URI"/>
-         <label data="3" alias="END_USER_NAI"/>
-         <label data="4" alias="END_USER_PRIVATE"/>
-      </single>
-   </avp>
-   <avp name="User-Equipment-Info" code="458" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <grouped>
-         <avprule id="User-Equipment-Info-Type" type="Mandatory"/>
-         <avprule id="User-Equipment-Info-Value" type="Mandatory"/>
-      </grouped>
-   </avp>
-   <avp name="User-Equipment-Info-Type" code="459" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-3">
-         <label data="0" alias="IMEISV"/>
-         <label data="1" alias="MAC"/>
-         <label data="2" alias="EUI64"/>
-         <label data="3" alias="MODIFIED_EUI64"/>
-      </single>
-   </avp>
-   <avp name="User-Equipment-Info-Value" code="460" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Accounting-Record-Type" code="480" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-4">
-         <label data="1" alias="EVENT_RECORD"/>
-         <label data="2" alias="START_RECORD"/>
-         <label data="3" alias="INTERIM_RECORD"/>
-         <label data="4" alias="STOP_RECORD"/>
-      </single>
-   </avp>
-   <avp name="Accounting-Realtime-Required" code="483" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-3">
-         <label data="1" alias="DELIVER_AND_GRANT"/>
-         <label data="2" alias="GRANT_AND_STORE"/>
-         <label data="3" alias="GRANT_AND_LOSE"/>
-      </single>
-   </avp>
-   <avp name="Accounting-Record-Number" code="485" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="3GPP-SGSN-MCC-MNC" code="18" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="3GPP-User-Location-Info" code="22" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="3GPP-MS-TimeZone" code="23" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="TWAN-Identifier" code="29" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Abort-Cause" code="500" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-4">
-         <label data="0" alias="BEARER_RELEASED"/>
-         <label data="1" alias="INSUFFICIENT_SERVER_RESOURCES"/>
-         <label data="2" alias="INSUFFICIENT_BEARER_RESOURCES"/>
-         <label data="3" alias="PS_TO_CS_HANDOVER"/>
-         <label data="4" alias="SPONSORED_DATA_CONNECTIVITY_DISALLOWED"/>
-      </single>
-   </avp>
-   <avp name="Access-Network-Charging-Identifier" code="502" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Access-Network-Charging-Identifier-Value" type="Mandatory"/>
-         <avprule id="Flows" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Access-Network-Charging-Identifier-Value" code="503" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="AF-Application-Identifier" code="504" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="AF-Charging-Identifier" code="505" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Flow-Description" code="507" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="IPFilterRule"/>
-   </avp>
-   <avp name="Flow-Number" code="509" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Flows" code="510" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Media-Component-Number" type="Mandatory"/>
-         <avprule id="Flow-Number" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Flow-Status" code="511" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-4">
-         <label data="0" alias="ENABLED-UPLINK"/>
-         <label data="1" alias="ENABLED-DOWNLINK"/>
-         <label data="2" alias="ENABLED"/>
-         <label data="3" alias="DISABLED"/>
-         <label data="4" alias="REMOVED"/>
-      </single>
-   </avp>
-   <avp name="Flow-Usage" code="512" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-2">
-         <label data="0" alias="NO_INFORMATION"/>
-         <label data="1" alias="RTCP"/>
-         <label data="2" alias="AF_SIGNALLING"/>
-      </single>
-   </avp>
-   <avp name="Specific-Action" code="513" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-4,6-14,16">
-         <label data="1" alias="CHARGING_CORRELATION_EXCHANGE"/>
-         <label data="2" alias="INDICATION_OF_LOSS_OF_BEARER"/>
-         <label data="3" alias="INDICATION_OF_RECOVERY_OF_BEARER"/>
-         <label data="4" alias="INDICATION_OF_RELEASE_OF_BEARER"/>
-         <label data="6" alias="IP-CAN_CHANGE"/>
-         <label data="7" alias="INDICATION_OF_OUT_OF_CREDIT"/>
-         <label data="8" alias="INDICATION_OF_SUCCESSFUL_RESOURCES_ALLOCATION"/>
-         <label data="9" alias="INDICATION_OF_FAILED_RESOURCES_ALLOCATION"/>
-         <label data="10" alias="INDICATION_OF_LIMITED_PCC_DEPLOYMENT"/>
-         <label data="11" alias="USAGE_REPORT"/>
-         <label data="12" alias="ACCESS_NETWORK_INFO_REPORT"/>
-         <label data="13" alias="INDICATION_OF_RECOVERY_FROM_LIMITED_PCC_DEPLOYMENT"/>
-         <label data="14" alias="INDICATION_OF_ACCESS_NETWORK_INFO_REPORTING_FAILURE"/>
-         <label data="16" alias="PLMN_CHANGE"/>
-      </single>
-   </avp>
-   <avp name="Max-Requested-Bandwidth-DL" code="515" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Max-Requested-Bandwidth-UL" code="516" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Media-Component-Description" code="517" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Media-Component-Number" type="Mandatory"/>
-         <avprule id="Media-Sub-Component" type="Optional" qual="*"/>
-         <avprule id="AF-Application-Identifier" type="Optional"/>
-         <avprule id="Media-Type" type="Optional"/>
-         <avprule id="Max-Requested-Bandwidth-UL" type="Optional"/>
-         <avprule id="Max-Requested-Bandwidth-DL" type="Optional"/>
-         <avprule id="Min-Requested-Bandwidth-UL" type="Optional"/>
-         <avprule id="Min-Requested-Bandwidth-DL" type="Optional"/>
-         <avprule id="Extended-Max-Requested-BW-UL" type="Optional"/>
-         <avprule id="Extended-Max-Requested-BW-DL" type="Optional"/>
-         <avprule id="Flow-Status" type="Optional"/>
-         <avprule id="Reservation-Priority" type="Optional"/>
-         <avprule id="RS-Bandwidth" type="Optional"/>
-         <avprule id="RR-Bandwidth" type="Optional"/>
-         <avprule id="Codec-Data" type="Optional" qual="*"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Media-Component-Number" code="518" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Media-Sub-Component" code="519" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Flow-Number" type="Mandatory"/>
-         <avprule id="Flow-Description" type="Optional" qual="0*2"/>
-         <avprule id="Flow-Status" type="Optional"/>
-         <avprule id="Flow-Usage" type="Optional"/>
-         <avprule id="AF-Signalling-Protocol" type="Optional"/>
-         <avprule id="Max-Requested-Bandwidth-UL" type="Optional"/>
-         <avprule id="Max-Requested-Bandwidth-DL" type="Optional"/>
-         <avprule id="Extended-Max-Requested-BW-UL" type="Optional"/>
-         <avprule id="Extended-Max-Requested-BW-DL" type="Optional"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Media-Type" code="520" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-6">
-         <label data="0" alias="OTHER"/>
-         <label data="1" alias="VIDEO"/>
-         <label data="2" alias="DATA"/>
-         <label data="3" alias="APPLICATION"/>
-         <label data="4" alias="CONTROL"/>
-         <label data="5" alias="TEXT"/>
-         <label data="6" alias="MESSAGE"/>
-      </single>
-   </avp>
-   <avp name="RR-Bandwidth" code="521" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="RS-Bandwidth" code="522" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="SIP-Forking-Indication" code="523" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="SINGLE_DIALOGUE"/>
-         <label data="1" alias="SEVERAL_DIALOGUES"/>
-      </single>
-   </avp>
-   <avp name="Codec-Data" code="524" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Service-URN" code="525" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Service-Info-Status" code="527" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="FINAL_SERVICE_INFORMATION"/>
-         <label data="1" alias="PRELIMINARY_SERVICE_INFORMATION"/>
-      </single>
-   </avp>
-   <avp name="MPS-Identifier" code="528" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="AF-Signalling-Protocol" code="529" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="NO_INFORMATION"/>
-         <label data="1" alias="SIP"/>
-      </single>
-   </avp>
-   <avp name="Rx-Request-Type" code="533" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-2">
-         <label data="0" alias="INITIAL_REQUEST"/>
-         <label data="1" alias="UPDATE_REQUEST"/>
-         <label data="2" alias="PCSCF_RESTORATION"/>
-      </single>
-   </avp>
-   <avp name="Min-Requested-Bandwidth-DL" code="534" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Min-Requested-Bandwidth-UL" code="535" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Required-Access-Info" code="536" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="USER_LOCATION"/>
-         <label data="1" alias="MS_TIME_ZONE"/>
-      </single>
-   </avp>
-   <avp name="IP-Domain-Id" code="537" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="AF-Requested-Data" code="551" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Extended-Max-Requested-BW-DL" code="554" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Extended-Max-Requested-BW-UL" code="555" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Supported-Features" code="628" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Vendor-Id" type="Mandatory"/>
-         <avprule id="Feature-List-ID" type="Mandatory"/>
-         <avprule id="Feature-List" type="Mandatory"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Feature-List-ID" code="629" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Feature-List" code="630" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="IP-CAN-Type" code="1027" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-7">
-         <label data="0" alias="3GPP-GPRS"/>
-         <label data="1" alias="DOCSIS"/>
-         <label data="2" alias="xDSL"/>
-         <label data="3" alias="WiMAX"/>
-         <label data="4" alias="3GPP2"/>
-         <label data="5" alias="3GPP-EPS"/>
-         <label data="6" alias="Non-3GPP-EPS"/>
-         <label data="7" alias="FBA"/>
-      </single>
-   </avp>
-   <avp name="RAT-Type" code="1032" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1,1000-1005,2000-2003">
-         <label data="0" alias="WLAN"/>
-         <label data="1" alias="VIRTUAL"/>
-         <label data="1000" alias="UTRAN"/>
-         <label data="1001" alias="GERAN"/>
-         <label data="1002" alias="GAN"/>
-         <label data="1003" alias="HSPA_EVOLUTION"/>
-         <label data="1004" alias="EUTRAN"/>
-         <label data="1005" alias="EUTRAN-NB-IoT"/>
-         <label data="2000" alias="CDMA2000_1X"/>
-         <label data="2001" alias="HRPD"/>
-         <label data="2002" alias="UMB"/>
-         <label data="2003" alias="EHRPD"/>
-      </single>
-   </avp>
-   <avp name="AN-GW-Address" code="1050" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Address"/>
-   </avp>
-   <avp name="AN-Trusted" code="1503" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="TRUSTED"/>
-         <label data="1" alias="UNTRUSTED"/>
-      </single>
-   </avp>
-   <avp name="User-Equipment-Local-IP-Address" code="2805" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="UDP-Source-Port" code="2806" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="User-Location-Info-Time" code="2812" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Time"/>
-   </avp>
-   <avp name="NetLoc-Access-Support" code="2824" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="TCP-Source-Port" code="2843" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Reservation-Priority" code="458" vendor-name="ETSI" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-15">
-         <label data="0" alias="DEFAULT"/>
-         <label data="1" alias="PRIORITY-ONE"/>
-         <label data="2" alias="PRIORITY-TWO"/>
-         <label data="3" alias="PRIORITY-THREE"/>
-         <label data="4" alias="PRIORITY-FOUR"/>
-         <label data="5" alias="PRIORITY-FIVE"/>
-         <label data="6" alias="PRIORITY-SIX"/>
-         <label data="7" alias="PRIORITY-SEVEN"/>
-         <label data="8" alias="PRIORITY-EIGHT"/>
-         <label data="9" alias="PRIORITY-NINE"/>
-         <label data="10" alias="PRIORITY-TEN"/>
-         <label data="11" alias="PRIORITY-ELEVEN"/>
-         <label data="12" alias="PRIORITY-TWELVE"/>
-         <label data="13" alias="PRIORITY-THIRTEEN"/>
-         <label data="14" alias="PRIORITY-FOURTEEN"/>
-         <label data="15" alias="PRIORITY-FIFTEEN"/>
-      </single>
-   </avp>
-   <command name="CER" code="257" type="Request">
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Host-IP-Address" type="Mandatory" qual="1*"/>
-      <avprule id="Vendor-Id" type="Mandatory"/>
-      <avprule id="Product-Name" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Supported-Vendor-Id" type="Optional" qual="*"/>
-      <avprule id="Auth-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Inband-Security-Id" type="Optional" qual="*"/>
-      <avprule id="Acct-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Firmware-Revision" type="Optional"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="CEA" code="257" type="Answer">
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Host-IP-Address" type="Mandatory" qual="1*"/>
-      <avprule id="Vendor-Id" type="Mandatory"/>
-      <avprule id="Product-Name" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Supported-Vendor-Id" type="Optional" qual="*"/>
-      <avprule id="Auth-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Inband-Security-Id" type="Optional" qual="*"/>
-      <avprule id="Acct-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Firmware-Revision" type="Optional"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="RA-Request" code="258" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Mandatory"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Specific-Action" type="Mandatory" qual="*"/>
-      <avprule id="Access-Network-Charging-Identifier" type="Optional" qual="*"/>
-      <avprule id="Flows" type="Optional" qual="*"/>
-      <avprule id="Abort-Cause" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="3GPP-MS-TimeZone" type="Optional"/>
-      <avprule id="3GPP-User-Location-Info" type="Optional"/>
-      <avprule id="User-Equipment-Local-IP-Address" type="Optional"/>
-      <avprule id="TCP-Source-Port" type="Optional"/>
-      <avprule id="UDP-Source-Port" type="Optional"/>
-      <avprule id="TWAN-Identifier" type="Optional"/>
-      <avprule id="3GPP-SGSN-MCC-MNC" type="Optional"/>
-      <avprule id="NetLoc-Access-Support" type="Optional"/>
-      <avprule id="User-Location-Info-Time" type="Optional"/>
-      <avprule id="IP-CAN-Type" type="Optional"/>
-      <avprule id="RAT-Type" type="Optional"/>
-      <avprule id="AN-Trusted" type="Optional"/>
-      <avprule id="AN-GW-Address" type="Optional" qual="0*2"/>
-   </command>
-   <command name="RA-Answer" code="258" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Result-Code" type="Optional"/>
-      <avprule id="Experimental-Result" type="Optional"/>
-      <avprule id="Media-Component-Description" type="Optional" qual="*"/>
-      <avprule id="Service-URN" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Class" type="Optional" qual="*"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Redirect-Host" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host-Usage" type="Optional"/>
-      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="AA-Request" code="265" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Optional"/>
-      <avprule id="IP-Domain-Id" type="Optional"/>
-      <avprule id="AF-Application-Identifier" type="Optional"/>
-      <avprule id="Media-Component-Description" type="Optional" qual="*"/>
-      <avprule id="Service-Info-Status" type="Optional"/>
-      <avprule id="AF-Charging-Identifier" type="Optional"/>
-      <avprule id="SIP-Forking-Indication" type="Optional"/>
-      <avprule id="Specific-Action" type="Optional" qual="*"/>
-      <avprule id="Subscription-Id" type="Optional" qual="*"/>
-      <avprule id="Supported-Features" type="Optional" qual="*"/>
-      <avprule id="Reservation-Priority" type="Optional"/>
-      <avprule id="Framed-IP-Address" type="Optional"/>
-      <avprule id="Framed-IPv6-Prefix" type="Optional"/>
-      <avprule id="Called-Station-Id" type="Optional"/>
-      <avprule id="Service-URN" type="Optional"/>
-      <avprule id="MPS-Identifier" type="Optional"/>
-      <avprule id="Rx-Request-Type" type="Optional"/>
-      <avprule id="Required-Access-Info" type="Optional" qual="*"/>
-      <avprule id="AF-Requested-Data" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="AA-Answer" code="265" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Result-Code" type="Optional"/>
-      <avprule id="Experimental-Result" type="Optional"/>
-      <avprule id="AN-Trusted" type="Optional"/>
-      <avprule id="IP-CAN-Type" type="Optional"/>
-      <avprule id="RAT-Type" type="Optional"/>
-      <avprule id="Supported-Features" type="Optional" qual="*"/>
-      <avprule id="Subscription-Id" type="Optional" qual="*"/>
-      <avprule id="User-Equipment-Info" type="Optional"/>
-      <avprule id="3GPP-SGSN-MCC-MNC" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-   </command>
-   <command name="ACR" code="271" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Accounting-Record-Type" type="Mandatory"/>
-      <avprule id="Accounting-Record-Number" type="Mandatory"/>
-      <avprule id="Acct-Application-Id" type="Optional"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Accounting-Sub-Session-Id" type="Optional"/>
-      <avprule id="Acct-Session-Id" type="Optional"/>
-      <avprule id="Acct-Multi-Session-Id" type="Optional"/>
-      <avprule id="Acct-Interim-Interval" type="Optional"/>
-      <avprule id="Accounting-Realtime-Required" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Event-Timestamp" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ACA" code="271" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Accounting-Record-Type" type="Mandatory"/>
-      <avprule id="Accounting-Record-Number" type="Mandatory"/>
-      <avprule id="Acct-Application-Id" type="Optional"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Accounting-Sub-Session-Id" type="Optional"/>
-      <avprule id="Acct-Session-Id" type="Optional"/>
-      <avprule id="Acct-Multi-Session-Id" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Acct-Interim-Interval" type="Optional"/>
-      <avprule id="Accounting-Realtime-Required" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Event-Timestamp" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="AS-Request" code="274" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Mandatory"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Abort-Cause" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-   </command>
-   <command name="AS-Answer" code="274" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Result-Code" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional"/>
-      <avprule id="Redirect-Host" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host-Usage" type="Optional"/>
-      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ST-Request" code="275" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Termination-Cause" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Optional"/>
-      <avprule id="Required-Access-Info" type="Optional" qual="*"/>
-      <avprule id="Class" type="Optional" qual="*"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ST-Answer" code="275" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Result-Code" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="3GPP-MS-TimeZone" type="Optional"/>
-      <avprule id="3GPP-User-Location-Info" type="Optional"/>
-      <avprule id="User-Equipment-Local-IP-Address" type="Optional"/>
-      <avprule id="TCP-Source-Port" type="Optional"/>
-      <avprule id="UDP-Source-Port" type="Optional"/>
-      <avprule id="TWAN-Identifier" type="Optional"/>
-      <avprule id="3GPP-SGSN-MCC-MNC" type="Optional"/>
-      <avprule id="NetLoc-Access-Support" type="Optional"/>
-      <avprule id="User-Location-Info-Time" type="Optional"/>
-   </command>
-   <command name="DWR" code="280" type="Request">
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-   </command>
-   <command name="DWA" code="280" type="Answer">
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-   </command>
-   <command name="DPR" code="282" type="Request">
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Disconnect-Cause" type="Mandatory"/>
-   </command>
-   <command name="DPA" code="282" type="Answer">
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-   </command>
-</dictionary>
diff --git a/example/diameter/launcher/deployments/aots/agents/ADML/stacks/DictionarySy.16777302.xml b/example/diameter/launcher/deployments/aots/agents/ADML/stacks/DictionarySy.16777302.xml
deleted file mode 100755 (executable)
index 0817e8e..0000000
+++ /dev/null
@@ -1,554 +0,0 @@
-<dictionary name="DictionarySy | Application-Id: 16777302">
-   <vendor name="IETF" code="0"/>
-   <vendor name="3GPP" code="10415"/>
-   <avp name="User-Name" code="1" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Class" code="25" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Session-Timeout" code="27" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Proxy-State" code="33" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Acct-Session-Id" code="44" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Acct-Multi-Session-Id" code="50" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Event-Timestamp" code="55" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Time"/>
-   </avp>
-   <avp name="Acct-Interim-Interval" code="85" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Host-IP-Address" code="257" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Address"/>
-   </avp>
-   <avp name="Auth-Application-Id" code="258" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Acct-Application-Id" code="259" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Vendor-Specific-Application-Id" code="260" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Vendor-Id" type="Mandatory" qual="1*"/>
-         <avprule id="Auth-Application-Id" type="Optional"/>
-         <avprule id="Acct-Application-Id" type="Optional"/>
-      </grouped>
-   </avp>
-   <avp name="Redirect-Host-Usage" code="261" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-6">
-         <label data="0" alias="DONT_CACHE"/>
-         <label data="1" alias="ALL_SESSION"/>
-         <label data="2" alias="ALL_REALM"/>
-         <label data="3" alias="REALM_AND_APPLICATION"/>
-         <label data="4" alias="ALL_APPLICATION"/>
-         <label data="5" alias="ALL_HOST"/>
-         <label data="6" alias="ALL_USER"/>
-      </single>
-   </avp>
-   <avp name="Redirect-Max-Cache-Time" code="262" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Session-Id" code="263" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Origin-Host" code="264" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Supported-Vendor-Id" code="265" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Vendor-Id" code="266" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Firmware-Revision" code="267" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Result-Code" code="268" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32">
-         <label data="1001" alias="DIAMETER_MULTI_ROUND_AUTH"/>
-         <label data="2001" alias="DIAMETER_SUCCESS"/>
-         <label data="2002" alias="DIAMETER_LIMITED_SUCCESS"/>
-         <label data="3001" alias="DIAMETER_COMMAND_UNSUPPORTED"/>
-         <label data="3002" alias="DIAMETER_UNABLE_TO_DELIVER"/>
-         <label data="3003" alias="DIAMETER_REALM_NOT_SERVED"/>
-         <label data="3004" alias="DIAMETER_TOO_BUSY"/>
-         <label data="3005" alias="DIAMETER_LOOP_DETECTED"/>
-         <label data="3006" alias="DIAMETER_REDIRECT_INDICATION"/>
-         <label data="3007" alias="DIAMETER_APPLICATION_UNSUPPORTED"/>
-         <label data="3008" alias="DIAMETER_INVALID_HDR_BITS"/>
-         <label data="3009" alias="DIAMETER_INVALID_AVP_BITS"/>
-         <label data="3010" alias="DIAMETER_UNKNOWN_PEER"/>
-         <label data="4001" alias="DIAMETER_AUTHENTICATION_REJECTED"/>
-         <label data="4002" alias="DIAMETER_OUT_OF_SPACE"/>
-         <label data="4003" alias="DIAMETER_ELECTION_LOST"/>
-         <label data="4241" alias="DIAMETER_NO_AVAILABLE_POLICY_COUNTERS"/>
-         <label data="5001" alias="DIAMETER_AVP_UNSUPPORTED"/>
-         <label data="5002" alias="DIAMETER_UNKNOWN_SESSION_ID"/>
-         <label data="5003" alias="DIAMETER_AUTHORIZATION_REJECTED"/>
-         <label data="5004" alias="DIAMETER_INVALID_AVP_VALUE"/>
-         <label data="5005" alias="DIAMETER_MISSING_AVP"/>
-         <label data="5006" alias="DIAMETER_RESOURCES_EXCEEDED"/>
-         <label data="5007" alias="DIAMETER_CONTRADICTING_AVPS"/>
-         <label data="5008" alias="DIAMETER_AVP_NOT_ALLOWED"/>
-         <label data="5009" alias="DIAMETER_AVP_OCCURS_TOO_MANY_TIMES"/>
-         <label data="5010" alias="DIAMETER_NO_COMMON_APPLICATION"/>
-         <label data="5011" alias="DIAMETER_UNSUPPORTED_VERSION"/>
-         <label data="5012" alias="DIAMETER_UNABLE_TO_COMPLY"/>
-         <label data="5013" alias="DIAMETER_INVALID_BIT_IN_HEADER"/>
-         <label data="5014" alias="DIAMETER_INVALID_AVP_LENGTH"/>
-         <label data="5015" alias="DIAMETER_INVALID_MESSAGE_LENGTH"/>
-         <label data="5016" alias="DIAMETER_INVALID_AVP_BIT_COMBO"/>
-         <label data="5017" alias="DIAMETER_NO_COMMON_SECURITY"/>
-         <label data="5030" alias="DIAMETER_USER_UNKNOWN"/>
-         <label data="5063" alias="REQUESTED_SERVICE_NOT_AUTHORIZED"/>
-         <label data="5065" alias="IP_CAN_SESSION_NOT_AVAILABLE"/>
-      </single>
-   </avp>
-   <avp name="Product-Name" code="269" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Session-Binding" code="270" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Session-Server-Failover" code="271" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-3">
-         <label data="0" alias="REFUSE_SERVICE"/>
-         <label data="1" alias="TRY_AGAIN"/>
-         <label data="2" alias="ALLOW_SERVICE"/>
-         <label data="3" alias="TRY_AGAIN_ALLOW_SERVICE"/>
-      </single>
-   </avp>
-   <avp name="Multi-Round-Time-Out" code="272" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Disconnect-Cause" code="273" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-2">
-         <label data="0" alias="REBOOTING"/>
-         <label data="1" alias="BUSY"/>
-         <label data="2" alias="DO_NOT_WANT_TO_TALK_TO_YOU"/>
-      </single>
-   </avp>
-   <avp name="Auth-Request-Type" code="274" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-3">
-         <label data="1" alias="AUTHENTICATE_ONLY"/>
-         <label data="2" alias="AUTHORIZE_ONLY"/>
-         <label data="3" alias="AUTHORIZE_AUTHENTICATE"/>
-      </single>
-   </avp>
-   <avp name="Auth-Grace-Period" code="276" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Auth-Session-State" code="277" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="STATE_MAINTAINED"/>
-         <label data="1" alias="NO_STATE_MAINTAINED"/>
-      </single>
-   </avp>
-   <avp name="Origin-State-Id" code="278" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Failed-AVP" code="279" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="AVP" type="Mandatory" qual="1*"/>
-      </grouped>
-   </avp>
-   <avp name="Proxy-Host" code="280" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Error-Message" code="281" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Route-Record" code="282" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Destination-Realm" code="283" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Proxy-Info" code="284" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Proxy-Host" type="Mandatory"/>
-         <avprule id="Proxy-State" type="Mandatory"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Re-Auth-Request-Type" code="285" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="AUTHORIZE_ONLY"/>
-         <label data="1" alias="AUTHORIZE_AUTHENTICATE"/>
-      </single>
-   </avp>
-   <avp name="Accounting-Sub-Session-Id" code="287" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned64"/>
-   </avp>
-   <avp name="Redirect-Host" code="292" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterURI"/>
-   </avp>
-   <avp name="Destination-Host" code="293" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Error-Reporting-Host" code="294" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Termination-Cause" code="295" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-8">
-         <label data="1" alias="LOGOUT"/>
-         <label data="2" alias="SERVICE_NOT_PROVIDED"/>
-         <label data="3" alias="BAD_ANSWER"/>
-         <label data="4" alias="ADMINISTRATIVE"/>
-         <label data="5" alias="LINK_BROKEN"/>
-         <label data="6" alias="AUTH_EXPIRED"/>
-         <label data="7" alias="USER_MOVED"/>
-         <label data="8" alias="SESSION_TIMEOUT"/>
-      </single>
-   </avp>
-   <avp name="Origin-Realm" code="296" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Experimental-Result" code="297" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Vendor-Id" type="Mandatory"/>
-         <avprule id="Experimental-Result-Code" type="Mandatory"/>
-      </grouped>
-   </avp>
-   <avp name="Experimental-Result-Code" code="298" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Inband-Security-Id" code="299" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="E2E-Sequence" code="300" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="AVP" type="Mandatory" qual="2*"/>
-      </grouped>
-   </avp>
-   <avp name="Logical-Access-ID" code="302" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Physical-Access-ID" code="313" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Subscription-Id" code="443" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Subscription-Id-Type" type="Mandatory"/>
-         <avprule id="Subscription-Id-Data" type="Mandatory"/>
-      </grouped>
-   </avp>
-   <avp name="Subscription-Id-Data" code="444" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Subscription-Id-Type" code="450" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-4">
-         <label data="0" alias="END_USER_E164"/>
-         <label data="1" alias="END_USER_IMSI"/>
-         <label data="2" alias="END_USER_SIP_URI"/>
-         <label data="3" alias="END_USER_NAI"/>
-         <label data="4" alias="END_USER_PRIVATE"/>
-      </single>
-   </avp>
-   <avp name="Accounting-Record-Type" code="480" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-4">
-         <label data="1" alias="EVENT_RECORD"/>
-         <label data="2" alias="START_RECORD"/>
-         <label data="3" alias="INTERIM_RECORD"/>
-         <label data="4" alias="STOP_RECORD"/>
-      </single>
-   </avp>
-   <avp name="Accounting-Realtime-Required" code="483" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-3">
-         <label data="1" alias="DELIVER_AND_GRANT"/>
-         <label data="2" alias="GRANT_AND_STORE"/>
-         <label data="3" alias="GRANT_AND_LOSE"/>
-      </single>
-   </avp>
-   <avp name="Accounting-Record-Number" code="485" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Policy-Counter-Identifier" code="2901" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Policy-Counter-Status" code="2902" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Policy-Counter-Status-Report" code="2903" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Policy-Counter-Identifier" type="Mandatory"/>
-         <avprule id="Policy-Counter-Status" type="Mandatory"/>
-         <avprule id="Pending-Policy-Counter-Information" type="Optional" qual="*"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="SL-Request-Type" code="2904" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="INITIAL_REQUEST"/>
-         <label data="1" alias="INTERMEDIATE_REQUEST"/>
-      </single>
-   </avp>
-   <avp name="Pending-Policy-Counter-Information" code="2905" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Policy-Counter-Status" type="Mandatory"/>
-         <avprule id="Pending-Policy-Counter-Change-Time" type="Mandatory"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Pending-Policy-Counter-Change-Time" code="2906" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Time"/>
-   </avp>
-   <command name="CER" code="257" type="Request">
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Host-IP-Address" type="Mandatory" qual="1*"/>
-      <avprule id="Vendor-Id" type="Mandatory"/>
-      <avprule id="Product-Name" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Supported-Vendor-Id" type="Optional" qual="*"/>
-      <avprule id="Auth-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Inband-Security-Id" type="Optional" qual="*"/>
-      <avprule id="Acct-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Firmware-Revision" type="Optional"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="CEA" code="257" type="Answer">
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Host-IP-Address" type="Mandatory" qual="1*"/>
-      <avprule id="Vendor-Id" type="Mandatory"/>
-      <avprule id="Product-Name" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Supported-Vendor-Id" type="Optional" qual="*"/>
-      <avprule id="Auth-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Inband-Security-Id" type="Optional" qual="*"/>
-      <avprule id="Acct-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Firmware-Revision" type="Optional"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="RAR" code="258" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Mandatory"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Re-Auth-Request-Type" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="RAA" code="258" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host-Usage" type="Optional"/>
-      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ACR" code="271" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Accounting-Record-Type" type="Mandatory"/>
-      <avprule id="Accounting-Record-Number" type="Mandatory"/>
-      <avprule id="Acct-Application-Id" type="Optional"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Accounting-Sub-Session-Id" type="Optional"/>
-      <avprule id="Acct-Session-Id" type="Optional"/>
-      <avprule id="Acct-Multi-Session-Id" type="Optional"/>
-      <avprule id="Acct-Interim-Interval" type="Optional"/>
-      <avprule id="Accounting-Realtime-Required" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Event-Timestamp" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ACA" code="271" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Accounting-Record-Type" type="Mandatory"/>
-      <avprule id="Accounting-Record-Number" type="Mandatory"/>
-      <avprule id="Acct-Application-Id" type="Optional"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Accounting-Sub-Session-Id" type="Optional"/>
-      <avprule id="Acct-Session-Id" type="Optional"/>
-      <avprule id="Acct-Multi-Session-Id" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Acct-Interim-Interval" type="Optional"/>
-      <avprule id="Accounting-Realtime-Required" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Event-Timestamp" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ASR" code="274" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Mandatory"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ASA" code="274" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host-Usage" type="Optional"/>
-      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ST-Request" code="275" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Termination-Cause" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ST-Answer" code="275" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Result-Code" type="Optional"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Redirect-Host" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host-Usage" type="Optional"/>
-      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="DWR" code="280" type="Request">
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-   </command>
-   <command name="DWA" code="280" type="Answer">
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-   </command>
-   <command name="DPR" code="282" type="Request">
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Disconnect-Cause" type="Mandatory"/>
-   </command>
-   <command name="DPA" code="282" type="Answer">
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="SL-Request" code="8388635" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="SL-Request-Type" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Subscription-Id" type="Optional" qual="*"/>
-      <avprule id="Policy-Counter-Identifier" type="Optional" qual="*"/>
-      <avprule id="Logical-Access-ID" type="Optional"/>
-      <avprule id="Physical-Access-ID" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="SL-Answer" code="8388635" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Result-Code" type="Optional"/>
-      <avprule id="Experimental-Result" type="Optional"/>
-      <avprule id="Policy-Counter-Status-Report" type="Optional" qual="*"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Redirect-Host" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host-Usage" type="Optional"/>
-      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="SN-Request" code="8388636" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Mandatory"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Policy-Counter-Status-Report" type="Optional" qual="*"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="SN-Answer" code="8388636" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Result-Code" type="Optional"/>
-      <avprule id="Experimental-Result" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Redirect-Host" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host-Usage" type="Optional"/>
-      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-</dictionary>
diff --git a/example/diameter/launcher/deployments/aots/agents/ADML/stacks/diameter_base.0.xml b/example/diameter/launcher/deployments/aots/agents/ADML/stacks/diameter_base.0.xml
deleted file mode 100755 (executable)
index 0724bec..0000000
+++ /dev/null
@@ -1,439 +0,0 @@
-<dictionary name="diameter_gen_base_rfc3588 | Application-Id: 0">
-   <vendor name="IETF" code="0"/>
-   <avp name="User-Name" code="1" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Class" code="25" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Session-Timeout" code="27" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Proxy-State" code="33" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Acct-Session-Id" code="44" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Acct-Multi-Session-Id" code="50" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Event-Timestamp" code="55" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Time"/>
-   </avp>
-   <avp name="Acct-Interim-Interval" code="85" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Host-IP-Address" code="257" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Address"/>
-   </avp>
-   <avp name="Auth-Application-Id" code="258" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Acct-Application-Id" code="259" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Vendor-Specific-Application-Id" code="260" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Vendor-Id" type="Mandatory" qual="1*"/>
-         <avprule id="Auth-Application-Id" type="Optional"/>
-         <avprule id="Acct-Application-Id" type="Optional"/>
-      </grouped>
-   </avp>
-   <avp name="Redirect-Host-Usage" code="261" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-6">
-         <label data="0" alias="DONT_CACHE"/>
-         <label data="1" alias="ALL_SESSION"/>
-         <label data="2" alias="ALL_REALM"/>
-         <label data="3" alias="REALM_AND_APPLICATION"/>
-         <label data="4" alias="ALL_APPLICATION"/>
-         <label data="5" alias="ALL_HOST"/>
-         <label data="6" alias="ALL_USER"/>
-      </single>
-   </avp>
-   <avp name="Redirect-Max-Cache-Time" code="262" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Session-Id" code="263" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Origin-Host" code="264" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Supported-Vendor-Id" code="265" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Vendor-Id" code="266" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Firmware-Revision" code="267" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Result-Code" code="268" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32">
-         <label data="1001" alias="DIAMETER_MULTI_ROUND_AUTH"/>
-         <label data="2001" alias="DIAMETER_SUCCESS"/>
-         <label data="2002" alias="DIAMETER_LIMITED_SUCCESS"/>
-         <label data="3001" alias="DIAMETER_COMMAND_UNSUPPORTED"/>
-         <label data="3002" alias="DIAMETER_UNABLE_TO_DELIVER"/>
-         <label data="3003" alias="DIAMETER_REALM_NOT_SERVED"/>
-         <label data="3004" alias="DIAMETER_TOO_BUSY"/>
-         <label data="3005" alias="DIAMETER_LOOP_DETECTED"/>
-         <label data="3006" alias="DIAMETER_REDIRECT_INDICATION"/>
-         <label data="3007" alias="DIAMETER_APPLICATION_UNSUPPORTED"/>
-         <label data="3008" alias="DIAMETER_INVALID_HDR_BITS"/>
-         <label data="3009" alias="DIAMETER_INVALID_AVP_BITS"/>
-         <label data="3010" alias="DIAMETER_UNKNOWN_PEER"/>
-         <label data="4001" alias="DIAMETER_AUTHENTICATION_REJECTED"/>
-         <label data="4002" alias="DIAMETER_OUT_OF_SPACE"/>
-         <label data="4003" alias="DIAMETER_ELECTION_LOST"/>
-         <label data="4241" alias="DIAMETER_NO_AVAILABLE_POLICY_COUNTERS"/>
-         <label data="5001" alias="DIAMETER_AVP_UNSUPPORTED"/>
-         <label data="5002" alias="DIAMETER_UNKNOWN_SESSION_ID"/>
-         <label data="5003" alias="DIAMETER_AUTHORIZATION_REJECTED"/>
-         <label data="5004" alias="DIAMETER_INVALID_AVP_VALUE"/>
-         <label data="5005" alias="DIAMETER_MISSING_AVP"/>
-         <label data="5006" alias="DIAMETER_RESOURCES_EXCEEDED"/>
-         <label data="5007" alias="DIAMETER_CONTRADICTING_AVPS"/>
-         <label data="5008" alias="DIAMETER_AVP_NOT_ALLOWED"/>
-         <label data="5009" alias="DIAMETER_AVP_OCCURS_TOO_MANY_TIMES"/>
-         <label data="5010" alias="DIAMETER_NO_COMMON_APPLICATION"/>
-         <label data="5011" alias="DIAMETER_UNSUPPORTED_VERSION"/>
-         <label data="5012" alias="DIAMETER_UNABLE_TO_COMPLY"/>
-         <label data="5013" alias="DIAMETER_INVALID_BIT_IN_HEADER"/>
-         <label data="5014" alias="DIAMETER_INVALID_AVP_LENGTH"/>
-         <label data="5015" alias="DIAMETER_INVALID_MESSAGE_LENGTH"/>
-         <label data="5016" alias="DIAMETER_INVALID_AVP_BIT_COMBO"/>
-         <label data="5017" alias="DIAMETER_NO_COMMON_SECURITY"/>
-         <label data="5030" alias="DIAMETER_USER_UNKNOWN"/>
-         <label data="5063" alias="REQUESTED_SERVICE_NOT_AUTHORIZED"/>
-         <label data="5065" alias="IP_CAN_SESSION_NOT_AVAILABLE"/>
-      </single>
-   </avp>
-   <avp name="Product-Name" code="269" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Session-Binding" code="270" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Session-Server-Failover" code="271" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-3">
-         <label data="0" alias="REFUSE_SERVICE"/>
-         <label data="1" alias="TRY_AGAIN"/>
-         <label data="2" alias="ALLOW_SERVICE"/>
-         <label data="3" alias="TRY_AGAIN_ALLOW_SERVICE"/>
-      </single>
-   </avp>
-   <avp name="Multi-Round-Time-Out" code="272" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Disconnect-Cause" code="273" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-2">
-         <label data="0" alias="REBOOTING"/>
-         <label data="1" alias="BUSY"/>
-         <label data="2" alias="DO_NOT_WANT_TO_TALK_TO_YOU"/>
-      </single>
-   </avp>
-   <avp name="Auth-Request-Type" code="274" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-3">
-         <label data="1" alias="AUTHENTICATE_ONLY"/>
-         <label data="2" alias="AUTHORIZE_ONLY"/>
-         <label data="3" alias="AUTHORIZE_AUTHENTICATE"/>
-      </single>
-   </avp>
-   <avp name="Auth-Grace-Period" code="276" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Auth-Session-State" code="277" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="STATE_MAINTAINED"/>
-         <label data="1" alias="NO_STATE_MAINTAINED"/>
-      </single>
-   </avp>
-   <avp name="Origin-State-Id" code="278" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Failed-AVP" code="279" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="AVP" type="Mandatory" qual="1*"/>
-      </grouped>
-   </avp>
-   <avp name="Proxy-Host" code="280" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Error-Message" code="281" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Route-Record" code="282" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Destination-Realm" code="283" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Proxy-Info" code="284" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Proxy-Host" type="Mandatory"/>
-         <avprule id="Proxy-State" type="Mandatory"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Re-Auth-Request-Type" code="285" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="AUTHORIZE_ONLY"/>
-         <label data="1" alias="AUTHORIZE_AUTHENTICATE"/>
-      </single>
-   </avp>
-   <avp name="Accounting-Sub-Session-Id" code="287" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned64"/>
-   </avp>
-   <avp name="Redirect-Host" code="292" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterURI"/>
-   </avp>
-   <avp name="Destination-Host" code="293" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Error-Reporting-Host" code="294" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Termination-Cause" code="295" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-8">
-         <label data="1" alias="LOGOUT"/>
-         <label data="2" alias="SERVICE_NOT_PROVIDED"/>
-         <label data="3" alias="BAD_ANSWER"/>
-         <label data="4" alias="ADMINISTRATIVE"/>
-         <label data="5" alias="LINK_BROKEN"/>
-         <label data="6" alias="AUTH_EXPIRED"/>
-         <label data="7" alias="USER_MOVED"/>
-         <label data="8" alias="SESSION_TIMEOUT"/>
-      </single>
-   </avp>
-   <avp name="Origin-Realm" code="296" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Experimental-Result" code="297" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Vendor-Id" type="Mandatory"/>
-         <avprule id="Experimental-Result-Code" type="Mandatory"/>
-      </grouped>
-   </avp>
-   <avp name="Experimental-Result-Code" code="298" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Inband-Security-Id" code="299" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="E2E-Sequence" code="300" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="AVP" type="Mandatory" qual="2*"/>
-      </grouped>
-   </avp>
-   <avp name="Accounting-Record-Type" code="480" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-4">
-         <label data="1" alias="EVENT_RECORD"/>
-         <label data="2" alias="START_RECORD"/>
-         <label data="3" alias="INTERIM_RECORD"/>
-         <label data="4" alias="STOP_RECORD"/>
-      </single>
-   </avp>
-   <avp name="Accounting-Realtime-Required" code="483" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-3">
-         <label data="1" alias="DELIVER_AND_GRANT"/>
-         <label data="2" alias="GRANT_AND_STORE"/>
-         <label data="3" alias="GRANT_AND_LOSE"/>
-      </single>
-   </avp>
-   <avp name="Accounting-Record-Number" code="485" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <command name="CER" code="257" type="Request">
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Host-IP-Address" type="Mandatory" qual="1*"/>
-      <avprule id="Vendor-Id" type="Mandatory"/>
-      <avprule id="Product-Name" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Supported-Vendor-Id" type="Optional" qual="*"/>
-      <avprule id="Auth-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Inband-Security-Id" type="Optional" qual="*"/>
-      <avprule id="Acct-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Firmware-Revision" type="Optional"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="CEA" code="257" type="Answer">
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Host-IP-Address" type="Mandatory" qual="1*"/>
-      <avprule id="Vendor-Id" type="Mandatory"/>
-      <avprule id="Product-Name" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Supported-Vendor-Id" type="Optional" qual="*"/>
-      <avprule id="Auth-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Inband-Security-Id" type="Optional" qual="*"/>
-      <avprule id="Acct-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Firmware-Revision" type="Optional"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="RAR" code="258" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Mandatory"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Re-Auth-Request-Type" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="RAA" code="258" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host-Usage" type="Optional"/>
-      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ACR" code="271" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Accounting-Record-Type" type="Mandatory"/>
-      <avprule id="Accounting-Record-Number" type="Mandatory"/>
-      <avprule id="Acct-Application-Id" type="Optional"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Accounting-Sub-Session-Id" type="Optional"/>
-      <avprule id="Acct-Session-Id" type="Optional"/>
-      <avprule id="Acct-Multi-Session-Id" type="Optional"/>
-      <avprule id="Acct-Interim-Interval" type="Optional"/>
-      <avprule id="Accounting-Realtime-Required" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Event-Timestamp" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ACA" code="271" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Accounting-Record-Type" type="Mandatory"/>
-      <avprule id="Accounting-Record-Number" type="Mandatory"/>
-      <avprule id="Acct-Application-Id" type="Optional"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Accounting-Sub-Session-Id" type="Optional"/>
-      <avprule id="Acct-Session-Id" type="Optional"/>
-      <avprule id="Acct-Multi-Session-Id" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Acct-Interim-Interval" type="Optional"/>
-      <avprule id="Accounting-Realtime-Required" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Event-Timestamp" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ASR" code="274" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Mandatory"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ASA" code="274" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host-Usage" type="Optional"/>
-      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="STR" code="275" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Termination-Cause" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Destination-Host" type="Optional"/>
-      <avprule id="Class" type="Optional" qual="*"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="STA" code="275" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Class" type="Optional" qual="*"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Redirect-Host" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host-Usage" type="Optional"/>
-      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="DWR" code="280" type="Request">
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-   </command>
-   <command name="DWA" code="280" type="Answer">
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-   </command>
-   <command name="DPR" code="282" type="Request">
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Disconnect-Cause" type="Mandatory"/>
-   </command>
-   <command name="DPA" code="282" type="Answer">
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-   </command>
-</dictionary>
diff --git a/example/diameter/launcher/deployments/aots/agents/ADML/start.sh b/example/diameter/launcher/deployments/aots/agents/ADML/start.sh
deleted file mode 100755 (executable)
index 213a8e0..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-# $1: args type could be 'ft' (function test) or 'st' (system test). By default: ft
-function pgrep_live {
-  pids=$(pgrep "$1");
-  [ "$pids" ] || return;
-  ps -o s= -o pid= $pids | sed -n 's/^[^ZT][[:space:]]\+//p';
-}
-cd `dirname $0`
-ARGS=args.$1
-[ -z "$1" ] && ARGS=args.ft
-STARTED=`pgrep_live ADML`
-[ -n "$STARTED"  ] && { echo "Already started !"; echo "PID $STARTED" ; exit 1 ; }
-0> launcher.trace
-for file in `ls *.launcher.log 2>/dev/null`; do 0> $file; done
-mkdir -p counters test-reports
-rm -f counters/* test-reports/* *.csv
-export LD_LIBRARY_PATH=$PWD/dynlibs
-./ADML `grep -v ^# $ARGS` &
-echo $! > .pid
-echo "Done !"
-
diff --git a/example/diameter/launcher/deployments/aots/agents/ADML/stop.sh b/example/diameter/launcher/deployments/aots/agents/ADML/stop.sh
deleted file mode 100755 (executable)
index a4f1121..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/bash
-function pgrep_live {
-  pids=$(pgrep "$1");
-  [ "$pids" ] || return;
-  ps -o s= -o pid= $pids | sed -n 's/^[^ZT][[:space:]]\+//p';
-}
-cd `dirname $0`
-PID=$(pgrep_live ^ADML)
-[ -z "$PID" ] && exit 0
-kill $PID
-
-# Protection to force kill (with SIGKILL) if ADML still alive after certain time:
-seconds2force=3
-count=$((10*seconds2force))
-kill0=0
-while [ $kill0 -eq 0 -a $count -gt 0 ]
-do
-  sleep 0.1
-  count=$((count-1))
-  kill -0 $PID 2>/dev/null
-  kill0=$?
-  echo -n .
-done
-[ $kill0 -eq 0 ] && { echo " sigkill to ADML pid $PID !" ; kill -9 $PID ; }
-rm -f .pid
-
diff --git a/example/diameter/launcher/deployments/aots/agents/HTTPMOCK/ACTIONS.md b/example/diameter/launcher/deployments/aots/agents/HTTPMOCK/ACTIONS.md
deleted file mode 100644 (file)
index 4a3548a..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-# HTTPMOCK actions
-
-## serve_json
-
-Serve a json response body for specific method is given uri.
-
-Arguments: json, method, uri
-* json: json file for response body.
-* method: POST, PUT, GET, DELETE.
-* uri: uri where the json response is served.
-
-Example:
-```
-- action: DA/serve_json
-  arguments:
-    json: reponse.json
-    method: POST
-    uri: <uri-where-to-serve>
-```
-
diff --git a/example/diameter/launcher/deployments/aots/agents/HTTPMOCK/Provision.sh b/example/diameter/launcher/deployments/aots/agents/HTTPMOCK/Provision.sh
deleted file mode 100755 (executable)
index 7da49eb..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/bin/bash
-
-usage() {
-  cat << EOF
-
-  Usage: $0 <test id> <step id> <test path> <address> <mock json> <method: POST|PUT|GET|DELETE> <uri>
-
-EOF
-  exit 1
-}
-
-[ -z "$7" ] && usage
-
-control_post_request=$(mktemp)
-cat << EOF > ${control_post_request}
-{
-  "control": {
-    "flowId": "$1",
-    "flowStepId": "$2",
-    "flowPath":"$3"
-  },
-  "action": {
-    "id": "serve_json",
-    "arguments": {
-      "json": "$5",
-      "method": "$6",
-      "uri": "$7"
-    }
-  }
-}
-EOF
-
-CONTROL_URI=http://$4/aots-control/v1/ctrl/action/annotate
-CURL="curl -s --http2-prior-knowledge"
-${CURL} -d@${control_post_request} -H "Content-Type: application/json" -X $6 ${CONTROL_URI}/serve_json >/dev/null
-rm ${control_post_request}
diff --git a/example/diameter/launcher/deployments/aots/agents/KAFKA/ACTIONS.md b/example/diameter/launcher/deployments/aots/agents/KAFKA/ACTIONS.md
deleted file mode 100644 (file)
index bf7d7b1..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-# KAFKA actions
-
-## consume_json
-
-Consume until reception of json message.
-
-Arguments: json[, auto_offset_reset, timeout, background, debug]
-* json: json file that we want to wait for ('any' to skip matching).
-* timeout: timeout for the operation in seconds.
-* auto_offset_reset: auto offset reset (earliest, latest, etc.). By default: latest.
-* background: "yes"|["no"]. Executes the step in background. By default is blocking, allowing to gather the result code for the step.
-* debug: "yes"|["no"]. Python kafka library debug information.
-
-Example:
-```
-- action: SMPC/consume_json
-  arguments:
-    json: expected.json
-    timeout: 5
-    auto_offset_reset: earliest
-```
-
-## produce_json
-
-Produces a json message to the kafka message bus.
-
-Arguments: json[, delay_ms, background, debug]
-* json: json file that we want to produce.
-* delay_ms: delay before producing in milliseconds.
-* background: "yes"|["no"]. Executes the step in background. By default is blocking, allowing to gather the result code for the step.
-* debug: "yes"|["no"]. Python kafka library debug information.
-
-Example:
-```
-- action: SMPC/produce_json:
-  arguments:
-    json: produced.json
-```
-
-## admin
-
-Administration actions.
-
-Arguments: operation[, debug]
-* operation: only 'clean_topic' implemented
-* debug: "yes"|["no"]. Python kafka library debug information.
-
-clean_topic: administration operation to clear message bus in case you want to consume reading earliest messages in the queue. By default, consumer offsets to latest message, but it won't see nothing if it is launched after production of the expected message. Depending on the way you define the test case, you will need clean or not the message bus.
-
-* Example(1): given an 'SMPC' kafka node:
-
-```
-- action: SMPC/admin:
-  arguments:
-    operation: clean_topic
-
-- action: AF/send_xml_to_entity
-  arguments:
-    xml: AAR.xml
-
-- action: SPMC/consume_json
-  arguments:
-    json: expected.json
-    auto_offset_reset: earliest
-```
-
-* Example(2): given an 'SMPC' kafka node:
-
-```
-- action: SPMC/consume_json
-  arguments:
-    json: expected.json
-    background: "yes"
-
-- action: AF/send_xml_to_entity
-  arguments:
-    xml: AAR.xml
-```
-
-* Example(3): given an 'SMPC' kafka node:
-
-```
-- action: SPMC/produce_json
-  arguments:
-    json: produced.json
-    delay_ms: 200
-    background: "yes"
-
-- action: AF/wait_xml_from_entity
-  arguments:
-    xml: ASR.xml
-```
-
diff --git a/example/diameter/launcher/deployments/aots/agents/KAFKA/Admin.py b/example/diameter/launcher/deployments/aots/agents/KAFKA/Admin.py
deleted file mode 100644 (file)
index 060faee..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-#!/usr/bin/env python
-
-import os, sys, datetime, logging
-
-from kafka.admin import KafkaAdminClient
-from argparse import ArgumentParser
-
-from kafka.errors import (UnknownError, KafkaConnectionError, FailedPayloadsError,
-                          KafkaTimeoutError, KafkaUnavailableError,
-                          LeaderNotAvailableError, UnknownTopicOrPartitionError,
-                          NotLeaderForPartitionError, ReplicaNotAvailableError)
-
-
-def _exit(message = None, rc=0):
-  if (message): printMsg(message)
-  printMsg("Exiting [rc={}]".format(rc))
-  sys.exit(rc)
-
-
-def timeFormat():
-  return '%b.%d.%Y-%H.%M.%S.%f'
-
-
-def printMsg(message):
-  print ("[{}] [{}] {}".format(datetime.datetime.now().strftime(timeFormat()), GNode, message))
-
-
-class MyKafkaAdmin:
-    kafka_service = os.environ.get('KAFKA_SERVER')
-    kafka_port = os.environ.get('KAFKA_PORT')
-
-    if not kafka_service: kafka_service = "localhost"
-    if not kafka_port: kafka_port = "9092"
-
-    server = kafka_service + ':' + kafka_port
-
-    def __init__(self, topic, rtopic):
-
-      # Topic:
-      printMsg("Working topic: '{}'".format(topic))
-
-      # Action 'remove topic':
-      printMsg("Remove topic from message bus: {}".format(str(rtopic)))
-
-      if (rtopic):
-        admin = KafkaAdminClient(bootstrap_servers=self.server)
-        try:
-          admin.delete_topics([topic])
-        except UnknownTopicOrPartitionError as e:
-          printMsg("UnknownTopicOrPartitionError => missing messages for topic (removal considered successful)")
-
-
-def parse_arguments():
-
-  parser = ArgumentParser(description='Kafka Manager')
-  parser.add_argument('-n', '--node', help='Node name (spaces are removed)', required=True)
-  parser.add_argument('-t', '--topic', help='Kafka topic', required=True)
-  parser.add_argument('-r', '--remove-topic', help='Remove topic from message bus', required=False, action='store_true')
-  parser.add_argument('-d', '--debug', help='Debug kafka', required=False, action='store_true')
-
-  arguments = parser.parse_args()
-
-  return arguments
-
-
-#####################
-#      M A I N      #
-#####################
-
-if __name__ == "__main__":
-
-  arguments = parse_arguments()
-
-  GNode = arguments.node.replace(" ", "")
-  topic = arguments.topic
-  rtopic = arguments.remove_topic
-  debug = arguments.debug
-
-  printMsg("Starting")
-
-  if (debug):
-    now = datetime.datetime.now().strftime(timeFormat())
-    logfile='{}-Admin-{}.log'.format(GNode, now)
-    printMsg("Logging kafka in: '{}'".format(logfile))
-    logging.basicConfig(filename=logfile, format='%(asctime)s - %(message)s', datefmt=timeFormat(), level=logging.DEBUG)
-
-  try:
-    admin = MyKafkaAdmin(topic, rtopic)
-    _exit()
-
-  except Exception as e:
-    _exit(e, 1)
diff --git a/example/diameter/launcher/deployments/aots/agents/KAFKA/Consumer.py b/example/diameter/launcher/deployments/aots/agents/KAFKA/Consumer.py
deleted file mode 100644 (file)
index 5b3d56c..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-#!/usr/bin/env python
-
-import os, sys, re, datetime, logging, json, signal
-
-from kafka import KafkaConsumer
-from json import loads
-from argparse import ArgumentParser
-
-
-def _exit(message = None, rc=0):
-  if (message): printMsg(message)
-  printMsg("Exiting [rc={}]".format(rc))
-  sys.exit(rc)
-
-def timeFormat():
-  return '%b.%d.%Y-%H.%M.%S.%f'
-
-
-def printMsg(message):
-  print ("[{}] [{}] {}".format(datetime.datetime.now().strftime(timeFormat()), GNode, message))
-
-
-class MyKafkaConsumer:
-    kafka_service = os.environ.get('KAFKA_SERVER')
-    kafka_port = os.environ.get('KAFKA_PORT')
-
-    if not kafka_service: kafka_service = "localhost"
-    if not kafka_port: kafka_port = "9092"
-
-    server = kafka_service + ':' + kafka_port
-
-    def __init__(self, topic, mregexp, aor, showReadWhenMatchingEnabled):
-
-        # Auto offset reset:
-        printMsg("Auto offset reset: '{}'".format(aor))
-
-        # Topic:
-        printMsg("Working topic: '{}'".format(topic))
-
-        # Show fulfilled:
-        self.showReadWhenMatchingEnabled = showReadWhenMatchingEnabled
-
-        # Json content:
-        self.json = None
-        if GJfile:
-          with open(GJfile) as json_file:
-            self.json = json.load(json_file)
-          printMsg("Established break condition for expected json ('{}'): {}".format(GJfile, self.json))
-        else:
-          printMsg("No expected json ('any' selected)")
-
-        # Interpreted as regexp indicator:
-        self.mregexp = mregexp
-        if GJfile:
-          if (self.mregexp): printMsg("Json file will be matched as regular expression")
-          else: printMsg("Json file will be matched as exact comparison")
-
-
-        self.consumer = KafkaConsumer(topic,
-                        bootstrap_servers=[self.server],
-                        auto_offset_reset=aor,
-                        enable_auto_commit=True,
-                        value_deserializer=lambda x:
-                        json.loads(x.decode('utf-8')))
-
-    def match(self, json):
-       if self.mregexp:
-         for key, value in  sorted(json.items()):
-           match = re.match(self.json[key], value)
-           if not match: return False
-         return True
-
-       else:
-         return (sorted(self.json.items()) == sorted(json.items()))
-
-    def receive_data(self):
-        printMsg('Reading data from kafka ...')
-
-        for message in self.consumer:
-            # Show read
-            if (self.showReadWhenMatchingEnabled if self.json else True):
-              printMsg('Data read: {}'.format(message))
-
-            # Break condition (in case that a expected json is blocking consumer):
-            if (self.json):
-              #if (sorted(self.json.items()) == sorted(message.value.items())):
-              if (self.match(message.value)):
-                printMsg('Message retrieved: condition fulfilled !')
-                return message
-              else:
-                global GSequence
-                GSequence += 1
-                #saved='{}.read.{}.json'.format(os.path.basename(GJfile), GSequence)
-                saved='{}.read.{}.json'.format(GJfile, GSequence)
-                with open(saved, 'w') as outfile:
-                  json.dump(message.value, outfile)
-
-                printMsg('Message retrieved: condition not fulfilled (saved {}) !'.format(saved))
-
-
-    def close (self):
-      self.consumer.close()
-
-
-def handler_function(signum, frame):
-  rc=0
-  if (GJfile): rc=1
-  _exit('Timeout !', rc)
-
-
-def parse_arguments():
-
-  parser = ArgumentParser(description='Kafka Consumer Simulator')
-  parser.add_argument('-n', '--node', help='Node name (spaces are removed)', required=True)
-  parser.add_argument('-t', '--topic', help='Kafka topic', required=True)
-  parser.add_argument('-o', '--auto-offset-reset', help='Auto offset reset (earliest, latest, etc.). By default: latest', required=False)
-  parser.add_argument('-f', '--file', help='Json file to consume (consumer will break execution with rc=0)', required=False)
-  parser.add_argument('-m', '--match-regexp', help='Match file as regexp (exact match by default)', required=False, action='store_true')
-  parser.add_argument('-w', '--timeout', help='Timeout (in seconds) for completion. Timeout will break execution with rc=1', required=False)
-  parser.add_argument('-d', '--debug', help='Debug kafka', required=False, action='store_true')
-  parser.add_argument('-r', '--show-read-when-matching-enabled', help='Show read messages. False by default when json file for matching is provided.', required=False, action='store_true')
-
-  arguments = parser.parse_args()
-
-  return arguments
-
-
-#####################
-#      M A I N      #
-#####################
-
-if __name__ == "__main__":
-
-  arguments = parse_arguments()
-
-  GNode = arguments.node.replace(" ", "")
-  topic = arguments.topic
-  auto_offset_reset = arguments.auto_offset_reset
-  GJfile = arguments.file
-  mregexp = arguments.match_regexp
-  timeout = arguments.timeout
-  debug = arguments.debug
-  show_read_when_matching_enabled = arguments.show_read_when_matching_enabled
-
-  GSequence = 0
-
-  printMsg("Starting")
-
-  if (debug):
-    now = datetime.datetime.now().strftime(timeFormat())
-    logfile='{}-Consumer-{}.log'.format(GNode, now)
-    printMsg("Logging kafka in: '{}'".format(logfile))
-    logging.basicConfig(filename=logfile, format='%(asctime)s - %(message)s', datefmt=timeFormat(), level=logging.DEBUG)
-
-  if (timeout):
-    printMsg("Established timeout for consumer: '{} seconds'".format(timeout))
-    # Signal to terminate after timeout:
-    signal.signal(signal.SIGALRM,handler_function)
-    signal.alarm(int(timeout))
-
-
-  if not GJfile:
-    if (mregexp): printMsg("To match json file as regexp, you must provide the file. See help (-h) !")
-    printMsg("Show messages read (matching is enabled): {}".format(str(show_read_when_matching_enabled)));
-
-  if not auto_offset_reset: auto_offset_reset='latest'
-
-  consumer = None
-  try:
-    consumer = MyKafkaConsumer(topic, mregexp, auto_offset_reset, show_read_when_matching_enabled)
-    consumer.receive_data()
-    consumer.close()
-    _exit()
-
-  except Exception as e:
-    consumer.close()
-    _exit(e, 1)
diff --git a/example/diameter/launcher/deployments/aots/agents/KAFKA/Producer.py b/example/diameter/launcher/deployments/aots/agents/KAFKA/Producer.py
deleted file mode 100644 (file)
index f969c63..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-#!/usr/bin/env python
-
-import os, sys, datetime, logging, json, time
-
-from kafka import KafkaProducer
-from json import loads
-from argparse import ArgumentParser
-
-
-def _exit(message = None, rc=0):
-  if (message): printMsg(message)
-  printMsg("Exiting [rc={}]".format(rc))
-  sys.exit(rc)
-
-
-def timeFormat():
-  return '%b.%d.%Y-%H.%M.%S.%f'
-
-
-def printMsg(message):
-  print ("[{}] [{}] {}".format(datetime.datetime.now().strftime(timeFormat()), GNode, message))
-
-
-class MyKafkaProducer:
-    kafka_service = os.environ.get('KAFKA_SERVER')
-    kafka_port = os.environ.get('KAFKA_PORT')
-
-    if not kafka_service: kafka_service = "localhost"
-    if not kafka_port: kafka_port = "9092"
-
-    server = kafka_service + ':' + kafka_port
-
-    def __init__(self):
-        self.producer = KafkaProducer(bootstrap_servers=[self.server],
-                        value_serializer=lambda x:
-                        json.dumps(x).encode('utf-8'))
-
-    def send_data(self, topic, data):
-        json = self.__read_json_data(data)
-        self.producer.send(topic, value=json)
-        self.producer.flush()
-        printMsg("Json produced on topic '{}': {}".format(topic, json))
-
-    def __read_json_data(self,jsonData):
-        with open(jsonData,'r') as schema_file:
-            schema_data = schema_file.read()
-        schema = json.loads(schema_data)
-        return schema
-
-    def set_producer_topic(self, kafka_topic):
-        self.kafka_topic = kafka_topic
-
-    def close(self):
-        self.producer.close()
-
-class MyProducer:
-    #def __init__(self):
-    producer = MyKafkaProducer()
-
-    def send_data(self, topic, data):
-        self.producer.send_data(topic, data)
-
-    def close(self):
-        self.producer.close()
-
-
-def parse_arguments():
-
-  parser = ArgumentParser(description='Kafka Producer Simulator')
-  parser.add_argument('-n', '--node', help='Node name (spaces are removed)', required=True)
-  parser.add_argument('-t', '--topic', help='Kafka topic', required=True)
-  parser.add_argument('-w', '--delay', help='Delay (in milliseconds) before producing', required=False)
-  parser.add_argument('-f', '--file', help='Json file to produce', required=True)
-  parser.add_argument('-d', '--debug', help='Debug kafka', required=False, action='store_true')
-
-  arguments = parser.parse_args()
-
-  return arguments
-
-
-#####################
-#      M A I N      #
-#####################
-
-if __name__ == "__main__":
-
-  arguments = parse_arguments()
-
-  GNode = arguments.node.replace(" ", "")
-  topic = arguments.topic
-  delay = arguments.delay
-  jfile = arguments.file
-  debug = arguments.debug
-
-  printMsg("Starting")
-
-  if (debug):
-    now = datetime.datetime.now().strftime(timeFormat())
-    logfile='{}-Producer-{}.log'.format(GNode, now)
-    printMsg("Logging kafka in: '{}'".format(logfile))
-    logging.basicConfig(filename=logfile, format='%(asctime)s - %(message)s', datefmt=timeFormat(), level=logging.DEBUG)
-
-  if not os.path.exists(jfile):
-    _exit("Invalid provided file '{}'".format(jfile), 1)
-
-  if (delay):
-    try:
-      delay = int(delay)
-    except:
-      _exit("Invalid provided delay '{}'. Must be an integer value !".format(str(delay)))
-
-    printMsg("Delay before producing: {} milliseconds ...".format(delay))
-    time.sleep(delay / 1000)
-    printMsg("Delay completed !".format(delay))
-
-  producer = None
-  try:
-    producer = MyProducer()
-    producer.send_data(topic, jfile)
-    producer.close()
-    _exit()
-
-  except Exception as e:
-    producer.close()
-    _exit(e, 1)
diff --git a/example/diameter/launcher/deployments/aots/launcher.py b/example/diameter/launcher/deployments/aots/launcher.py
deleted file mode 100755 (executable)
index 88317d6..0000000
+++ /dev/null
@@ -1,991 +0,0 @@
-#!/usr/bin/env python
-# Anna Agents-Oriented Testing Setup Launcher
-
-# Requires PyYAML: pip install pyyaml
-
-import os, sys, datetime, glob, re, json, time, shutil, filecmp, datetime
-from argparse import ArgumentParser
-import xml.etree.ElementTree
-#from pathlib import Path
-
-from json import loads
-
-# PyYAML
-from yaml import load, dump
-try:
-    from yaml import CLoader as Loader, CDumper as Dumper
-except ImportError:
-    from yaml import Loader, Dumper
-
-from enum import Enum
-
-
-class AttributeType(Enum):
-  Mandatory = "Mandatory"
-  Optional = "Optional"
-
-
-def _exit(message = None, rc=0):
-  if (message): printMsg(message)
-  printMsg("Exiting [rc={}]".format(rc))
-  sys.exit(rc)
-
-
-def timeFormat():
-  return '%b.%d.%Y-%H.%M.%S'
-
-
-def printMsg(message):
-  print ("[{}] {}".format(datetime.datetime.now().strftime(timeFormat()), message))
-
-
-class YamlConfigParser():
-  """
-  Yaml parser
-  """
-  def __init__(self, yaml_config_file):
-    """
-    Convert the yaml file into a Python object
-    """
-    self.data = None
-    try:
-      with open(yaml_config_file, 'r') as ss:
-        self.data = load(ss, Loader=Loader)
-        ss.close()
-
-    except Exception:
-     raise
-
-  def getData(self):
-    return self.data
-
-  def show(self, options):
-    output = dump(self.data, Dumper=Dumper)
-    print(output)
-
-
-def writeFileContent(filename, content):
-  _file = open(filename, "w")
-  _file.write(content)
-  _file.close()
-
-
-def getNodeValue(dictionary, key, attributeType = AttributeType.Mandatory):
-
-  # Type checking:
-  if not isinstance(attributeType, AttributeType):
-    raise TypeError("'attributeType' must be an instance of AttributeType Enum")
-
-  value = None
-  try:
-    value = dictionary[key]
-  except Exception as e:
-    if (attributeType == AttributeType.Mandatory): _exit ("Missing mandatory key: {}".format(e) , 1)
-
-  #printMsg("getNodeValue -> {}: {}".format(key, value))
-  return value
-
-
-def get_parent_dir(_file):
-  abspath = os.path.abspath(_file)
-  return os.path.dirname(abspath)
-
-
-def is_absolute_path(path):
-  return os.path.isabs(path)
-
-
-def provision_begin(iplimit):
-  global GProvisionContent
-
-  GProvisionContent += '''test|report
-test|ip-limit|{}
-test|dump-stdout|yes
-'''.format(iplimit)
-
-def assertFile(filepath):
-  if not (os.path.exists(filepath)):
-    raise Exception ("File '{}' not found !".format(filepath))
-
-
-def assertAgentId(agent_id):
-  global agents_ADML_dir
-  global agents_KAFKA_dir
-  global agents_HTTPMOCK_dir
-
-  adml_node_file = agents_ADML_dir + "/{}.node".format(agent_id)
-  kafka_node_file = agents_KAFKA_dir + "/{}.node".format(agent_id)
-  httpmock_node_file = agents_HTTPMOCK_dir + "/{}.node".format(agent_id)
-  if (os.path.exists(adml_node_file)):
-    return "ADML"
-  elif (os.path.exists(kafka_node_file)):
-    return "KAFKA"
-  elif (os.path.exists(httpmock_node_file)):
-    return "HTTPMOCK"
-  else:
-    raise Exception ("Agent id '{}' not found as registered. Check the agents yaml configuration loaded !".format(agent_id))
-
-
-def modify_xml_avp_data(stepNumber, arguments):
-  assertSupportedKeys(stepNumber, arguments, ["xml", "new_xml", "xpath_value_list"])
-
-  _xml = getNodeValue(arguments, "xml")
-  if not is_absolute_path(_xml): _xml = GTcDir + "/" + _xml
-  assertFile(_xml)
-
-  new_xml = getNodeValue(arguments, "new_xml")
-  if not is_absolute_path(new_xml): new_xml = GTcDir + "/" + new_xml
-
-  # xml tree:
-  et = xml.etree.ElementTree.parse(_xml)
-  root = et.getroot()
-
-  xv_list = getNodeValue(arguments, "xpath_value_list")
-  for item in xv_list:
-    assertSupportedKeys(stepNumber, item, ["xpath", "value"])
-    xpath = getNodeValue(item, "xpath")
-    value = getNodeValue(item, "value")
-
-    # Replace operation:
-    targets = root.findall(xpath)
-    for target in targets:
-      if "data" in target.attrib:
-        target.attrib["data"] = value
-      elif "hex-data" in target.attrib:
-        target.attrib["hex-data"] = value
-
-  et.write(new_xml)
-
-
-def modify_json_key_value(stepNumber, arguments):
-  assertSupportedKeys(stepNumber, arguments, ["json", "new_json", "kpath_value_list"])
-
-  _json = getNodeValue(arguments, "json")
-  if not is_absolute_path(_json): _json = GTcDir + "/" + _json
-  assertFile(_json)
-
-  new_json = getNodeValue(arguments, "new_json")
-  if not is_absolute_path(new_json): new_json = GTcDir + "/" + new_json
-
-  # Replace operation:
-  with open(_json, 'r') as json_file:
-    json_data = json_file.read()
-    json_dict = json.loads(json_data)
-
-  kv_list = getNodeValue(arguments, "kpath_value_list")
-  for item in kv_list:
-    assertSupportedKeys(stepNumber, item, ["kpath", "value"])
-    kpath = getNodeValue(item, "kpath")
-    value = getNodeValue(item, "value")
-
-    key_path_list = kpath.split(".")
-    elem = key_path_list[0]
-    if (len(key_path_list) == 1):
-      json_dict[elem] = value
-
-    else:
-      aux_dict = json_dict[elem]
-      #print("aux dict: " + str(aux_dict))
-      for elem in key_path_list[1:-1]:
-        aux_dict = aux_dict[elem]
-
-      aux_dict[key_path_list[-1]] = value
-
-
-  content = json.dumps(json_dict)
-  writeFileContent(new_json, content)
-
-
-def system_cmd(stepNumber, arguments):
-  global GProvisionContent
-
-  assertSupportedKeys(stepNumber, arguments, ["shell", "file", "file_parameters"])
-
-  shell = getNodeValue(arguments, "shell", AttributeType.Optional)
-  _file = getNodeValue(arguments, "file", AttributeType.Optional)
-  fp = getNodeValue(arguments, "file_parameters", AttributeType.Optional)
-  file_parameters = ""
-  if (fp): file_parameters = fp
-
-  if (shell and _file):
-    raise Exception ("Both 'shell' and 'file' cannot be provided at system_cmd action !")
-
-  if (not shell and not _file):
-    raise Exception ("Neither 'shell' nor 'file' have been provided at system_cmd action !")
-
-  if (shell and fp):
-    raise Exception ("Both 'shell' and 'file_parameters' cannot be provided at system_cmd action !")
-
-  if (shell):
-    GProvisionContent += 'test|{}|sh-command|{}\n'.format(GTcNumber, shell)
-
-  elif (_file):
-    if not is_absolute_path(_file): _file = GTcDir + "/" + _file
-    assertFile(_file)
-    GProvisionContent += 'test|{}|sh-command|{} {}\n'.format(GTcNumber, _file, file_parameters)
-
-
-def process_test_case_step_GENERIC(stepNumber, action_id, arguments):
-  global GProvisionContent
-  global GTcNumber
-  global GIpLimit
-
-  if action_id == "sh_command":
-    GProvisionContent += 'test|{}|sh-command|{}\n'.format(GTcNumber, getNodeValue(arguments, "value"))
-  elif action_id == "ip_limit":
-    il = getNodeValue(arguments, "value")
-    if (il):
-      value = None
-      if (il == "launcher"):
-        value = GIpLimit
-      else:
-        value = il
-
-      GProvisionContent += 'test|{}|ip-limit|{}\n'.format(GTcNumber, value)
-
-  elif action_id == "timeout_ms":
-    GProvisionContent += 'test|{}|timeout|{}\n'.format(GTcNumber, getNodeValue(arguments, "value"))
-  elif action_id == "delay_ms":
-    GProvisionContent += 'test|{}|delay|{}\n'.format(GTcNumber, getNodeValue(arguments, "value"))
-  elif action_id == "modify_xml_avp_data":
-    # Always create the step or step references will be impossible to determine:
-    GProvisionContent += 'test|{}|sh-command|echo "{}"\n'.format(GTcNumber, "Replacing xml file: " + str(arguments))
-    modify_xml_avp_data(stepNumber, arguments)
-  elif action_id == "modify_json_key_value":
-    # Always create the step or step references will be impossible to determine:
-    GProvisionContent += 'test|{}|sh-command|echo "{}"\n'.format(GTcNumber, "Replacing json file: " + str(arguments))
-    modify_json_key_value(stepNumber, arguments)
-  elif action_id == "system_cmd":
-    system_cmd(stepNumber, arguments)
-  else:
-    raise Exception("ERROR: Step {}: unsupported generic action-id '{}'".format(stepNumber, action_id))
-
-
-def assertSupportedKeys(stepNumber, arguments, supported):
-  for key in arguments:
-    if not key in supported:
-      raise Exception("ERROR: Step {}: unsupported argument '{}' (allowed: {})".format(stepNumber, key, str(supported)))
-
-
-def process_test_case_step_ADML(stepNumber, agent_id, action_id, arguments):
-  global GProvisionContent
-  global GTcDir
-
-  if action_id == "send_xml_to_entity":
-    assertSupportedKeys(stepNumber, arguments, ["xml", "answers_to"])
-
-    xml = getNodeValue(arguments, "xml")
-    if not is_absolute_path(xml): xml = GTcDir + "/" + xml
-    assertFile(xml)
-
-    at = getNodeValue(arguments, "answers_to", AttributeType.Optional)
-    answers_to = ""
-    if (at): answers_to = "|{}".format(at)
-
-    GProvisionContent += 'test|{}|sendxml2e|{}{}\n'.format(GTcNumber, xml, answers_to)
-
-  elif action_id == "wait_xml_from_entity":
-    assertSupportedKeys(stepNumber, arguments, ["xml"])
-
-    xml = getNodeValue(arguments, "xml")
-    if not is_absolute_path(xml): xml = GTcDir + "/" + xml
-    assertFile(xml)
-
-    GProvisionContent += 'test|{}|waitfe-xml|{}\n'.format(GTcNumber, xml)
-
-  elif action_id == "send_xml_to_client":
-    assertSupportedKeys(stepNumber, arguments, ["xml", "answers_to"])
-
-    xml = getNodeValue(arguments, "xml")
-    if not is_absolute_path(xml): xml = GTcDir + "/" + xml
-    assertFile(xml)
-
-    at = getNodeValue(arguments, "answers_to", AttributeType.Optional)
-    answers_to = ""
-    if (at): answers_to = "|{}".format(at)
-
-    GProvisionContent += 'test|{}|sendxml2c|{}{}\n'.format(GTcNumber, xml, answers_to)
-
-  elif action_id == "wait_xml_from_client":
-    assertSupportedKeys(stepNumber, arguments, ["xml"])
-
-    xml = getNodeValue(arguments, "xml")
-    if not is_absolute_path(xml): xml = GTcDir + "/" + xml
-    assertFile(xml)
-
-    GProvisionContent += 'test|{}|waitfc-xml|{}\n'.format(GTcNumber, xml)
-
-  else:
-    raise Exception("ERROR: Step {}: unsupported generic action-id '{}' for ADML node type (agent '{}')".format(stepNumber, action_id, agent_id))
-
-
-def process_test_case_step_HTTPMOCK(stepNumber, agent_id, action_id, arguments):
-  global GProvisionContent
-  global GTcDir
-  global agents_HTTPMOCK_dir
-
-  if action_id == "serve_json":
-    assertSupportedKeys(stepNumber, arguments, ["json", "method", "uri"])
-
-    json = getNodeValue(arguments, "json")
-    if not is_absolute_path(json): json = GTcDir + "/" + json
-    assertFile(json)
-
-    method = getNodeValue(arguments, "method")
-    uri = getNodeValue(arguments, "uri")
-
-
-    # Provision script is in the form: agents/HTTPMOCK/<agent-id>-provision.sh
-    provision_script = agents_HTTPMOCK_dir + "/" + agent_id + "-provision.sh "
-    args = str(GTcNumber) + " " + str(stepNumber) + " " + GTcDir + " \"" + json + "\" " + method + " \"" + uri + "\""
-    GProvisionContent += 'test|{}|sh-command|{}\n'.format(GTcNumber, provision_script + args)
-
-  else:
-    raise Exception("ERROR: Step {}: unsupported generic action-id '{}' for HTTPMOCK node type (agent '{}')".format(stepNumber, action_id, agent_id))
-
-
-def process_test_case_step_KAFKA(stepNumber, agent_id, action_id, arguments):
-  global GProvisionContent
-  global GTcDir
-  global agents_KAFKA_dir
-
-  if action_id == "consume_json":
-    assertSupportedKeys(stepNumber, arguments, ["json", "timeout", "auto_offset_reset", "background", "debug"])
-
-    json = getNodeValue(arguments, "json")
-    if json != "any":
-      if not is_absolute_path(json): json = GTcDir + "/" + json
-      assertFile(json)
-
-    autoOffsetReset = ""
-    aor = getNodeValue(arguments, "auto_offset_reset", AttributeType.Optional)
-    if (aor): autoOffsetReset = aor
-
-    timeout = 0
-    to = getNodeValue(arguments, "timeout", AttributeType.Optional)
-    if(to): timeout = to
-
-    background = ""
-    bck = getNodeValue(arguments, "background", AttributeType.Optional)
-    if (bck == "yes"): background = "&"
-
-    debug = "no"
-    deb = getNodeValue(arguments, "debug", AttributeType.Optional)
-    if (deb): debug = deb
-
-    # Consumer script is in the form: agents/KAFKA/<agent-id>-consumer.sh
-    consumer_script = agents_KAFKA_dir + "/" + agent_id + "-consumer.sh "
-    args = json + " " + autoOffsetReset + " " + str(timeout) + " " + debug
-    GProvisionContent += 'test|{}|sh-command|{}{}\n'.format(GTcNumber, consumer_script + args, background)
-
-  elif action_id == "produce_json":
-    assertSupportedKeys(stepNumber, arguments, ["json", "delay_ms", "background", "debug"])
-
-    json = getNodeValue(arguments, "json")
-    if not is_absolute_path(json): json = GTcDir + "/" + json
-    assertFile(json)
-
-    delay_ms = 0
-    dl = getNodeValue(arguments, "delay_ms", AttributeType.Optional)
-    if(dl): delay_ms = dl
-
-    background = ""
-    bck = getNodeValue(arguments, "background", AttributeType.Optional)
-    if (bck == "yes"): background = "&"
-
-    debug = "no"
-    deb = getNodeValue(arguments, "debug", AttributeType.Optional)
-    if (deb): debug = deb
-
-    # Producer script is in the form: agents/KAFKA/<agent-id>-producer.sh
-    producer_script = agents_KAFKA_dir + "/" + agent_id + "-producer.sh "
-    args = json + " " + str(delay_ms) + " " + debug
-    GProvisionContent += 'test|{}|sh-command|{}{}\n'.format(GTcNumber, producer_script + args, background)
-
-  elif action_id == "admin":
-    assertSupportedKeys(stepNumber, arguments, ["operation", "debug"])
-
-    operation = getNodeValue(arguments, "operation")
-
-    debug = "no"
-    deb = getNodeValue(arguments, "debug", AttributeType.Optional)
-    if (deb): debug = deb
-
-    # Admin script is in the form: agents/KAFKA/<agent-id>-admin.sh
-    admin_script = agents_KAFKA_dir + "/" + agent_id + "-admin.sh "
-    args = operation + " " + debug
-    GProvisionContent += 'test|{}|sh-command|{}\n'.format(GTcNumber, admin_script + args)
-
-  else:
-    raise Exception("ERROR: Step {}: unsupported generic action-id '{}' for KAFKA node type (agent '{}')".format(stepNumber, action_id, agent_id))
-
-
-def process_test_case_step(stepNumber, dictionary):
-
-  action = getNodeValue(dictionary, "action")
-  arguments = getNodeValue(dictionary, "arguments")
-
-  # Action is in the form '[agent id/]<action id>':
-  # OPTIONAL: agent_id
-  # MANDATORY: action_id
-  agent_id = None
-  agent_template = None
-  try:
-    agent_id, action_id = action.split('/')
-    agent_template = assertAgentId(agent_id)
-
-  except ValueError:
-    action_id = action
-    pass
-
-  # Actions for ADML
-  if agent_template == "ADML":
-    process_test_case_step_ADML(stepNumber, agent_id, action_id, arguments)
-  elif agent_template == "KAFKA":
-    process_test_case_step_KAFKA(stepNumber, agent_id, action_id, arguments)
-  elif agent_template == "HTTPMOCK":
-    process_test_case_step_HTTPMOCK(stepNumber, agent_id, action_id, arguments)
-  else:
-    process_test_case_step_GENERIC(stepNumber, action_id, arguments)
-
-  #trace = "Step {}, Agent-Id '{}', Action-Id '{}', Parameters: {}"
-  #print(trace.format(stepNumber, str(agent_id), action_id, str(arguments)))
-
-
-def  process_test_case_yml(testcaseList):
-  for step in testcaseList:
-    indx = testcaseList.index(step)
-    process_test_case_step(indx+1, step)
-
-
-def provision_test_case(filename, testcaseList):
-
-  global GTcNumber
-  global GTcDir
-  global GIdsVsDescs
-  global GProvisionContent
-  GTcNumber += 1
-  GTcDir = get_parent_dir(filename)
-
-  id_desc = "{} : {}".format(GTcNumber, filename)
-  GIdsVsDescs += id_desc + "\n"
-  tc_desc = "test case '{}'".format(id_desc)
-
-  printMsg("Provisioning {} ...".format(tc_desc))
-
-  # Set test case description
-  GProvisionContent += 'test|{}|description|{}\n'.format(GTcNumber, filename)
-
-  # Process the yml definition for the test case
-  process_test_case_yml(testcaseList)
-
-
-def provision_tests(files):
-  for filename in files.splitlines():
-    if (filename[0] == "#"):
-      printMsg("Ignoring commented test case: '{}'".format(filename))
-    else:
-      # Test case is a list of steps:
-      tc = YamlConfigParser(filename)
-      provision_test_case(filename, tc.getData())
-
-
-def parse_arguments():
-
-  parser = ArgumentParser(description='Anna Agents-Oriented Testing Setup Launcher')
-  parser.add_argument('-t', '--tests-dir', help='Tests parent directory where to find .yml files (from the next directories level)', required=True)
-  parser.add_argument('-k', '--keep-list-if-exists', help='Keeps intact the list of test cases (<test-dir>/launcher.list), creates it if missing', required=False, action='store_true')
-  parser.add_argument('-s', '--stop-adml-at-the-end', help='At the end, ADML keeps running to ease debugging. You could force stop with this option', required=False, action='store_true')
-  parser.add_argument('-i', '--interactive', help='Interactive execution to ease debugging of test cases', required=False, action='store_true')
-  parser.add_argument('-d', '--dry-run', help='Used to test and debug provision, no execution is launched', required=False, action='store_true')
-  parser.add_argument('-p', '--ip-limit', help="In-Progress limit is the number of coexisting In-Progress State test cases. Defaults to 1 (sequential), -1 would be 'no limit').", required=False)
-  parser.add_argument('-r', '--ttps', help="Rate of test cases launched (test ticks per second). By default 50 (recommended for monothread version).", required=False)
-
-
-  arguments = parser.parse_args()
-
-  return arguments
-
-
-def start_agents():
-  # At the moment, only ADML is started (KAFKA/HTTPMOCK agents uses scripts):
-  global agents_ADML_dir
-
-  rc = 1
-  maxRetries = 5
-  retry = 0
-  os.system(agents_ADML_dir + "/stop.sh")
-  os.system(agents_ADML_dir + "/start.sh")
-
-  rc = adml_operation("node >/dev/null")
-  while rc != 0:
-    retry += 1
-    if (retry > maxRetries): break
-    time.sleep(1)
-    printMsg("Check ADML health retry ({}/{}) ...".format(retry, maxRetries))
-    rc = adml_operation("node >/dev/null")
-
-  return rc
-
-
-def adml_operation(arguments):
-  global agents_ADML_dir
-
-  rc = os.system(agents_ADML_dir + "/operation.sh " + arguments)
-  return rc
-
-
-def adml_operation_output(operation):
-  global agents_ADML_dir
-
-  output = os.popen(agents_ADML_dir + "/operation.sh {}".format(operation)).read()
-  return output
-
-
-def collect_results(abs_tdir):
-  global agents_ADML_dir
-
-  # Logs directory:
-  logs_dir = abs_tdir + ".logs"
-  shutil.rmtree(logs_dir, ignore_errors=True)
-  os.mkdir(logs_dir)
-  os.mkdir(logs_dir + "/traffic")
-  os.mkdir(logs_dir + "/counters")
-  os.mkdir(logs_dir + "/test-reports")
-  os.mkdir(logs_dir + "/debug")
-
-  # Summary states:
-  print("\n\n")
-  printMsg("Retrieving tests summary states ...")
-  statesOUTPUT = adml_operation_output("\"test|summary-states\"")
-  writeFileContent(logs_dir + "/tests.summary-states", statesOUTPUT)
-
-  # Summary counts:
-  print("\n\n")
-  printMsg("Retrieving tests summary counts ...")
-  verdictOUTPUT = adml_operation_output("\"test|summary-counts\"")
-  writeFileContent(logs_dir + "/tests.summary-counts", verdictOUTPUT)
-  verdictRC = 1
-  if "PASS" in verdictOUTPUT: verdictRC = 0
-
-  # Traffic logs:
-  # ADML
-  printMsg("Retrieving diameter traffic logs ...")
-  for f in glob.glob(agents_ADML_dir + "/*.log"):
-    shutil.copy(f, logs_dir + "/traffic")
-  for f in glob.glob(agents_ADML_dir + "/*.xml"):
-    shutil.copy(f, logs_dir + "/traffic")
-  # KAFKA
-  printMsg("Retrieving kafka traffic logs ...")
-  for f in glob.glob(agents_KAFKA_dir + "/*.log"):
-    shutil.copy(f, logs_dir + "/traffic")
-  for f in glob.glob(agents_KAFKA_dir + "/*.json"):
-    shutil.copy(f, logs_dir + "/traffic")
-
-  # HTTPMOCK
-  #printMsg("Retrieving httpmock activity logs ...")
-  #...
-
-  printMsg("Generating junit report ...")
-  writeFileContent(logs_dir + "/junit.xml", adml_operation_output("\"test|junit\""))
-  printMsg("Generating tests summary ...")
-  writeFileContent(logs_dir + "/tests.summary", adml_operation_output("\"test|summary\""))
-
-  printMsg("Generating tests oam reports ...")
-  writeFileContent(logs_dir + "/tests.oam", adml_operation_output("\"show-oam\""))
-  printMsg("Generating tests statistics ...")
-  writeFileContent(logs_dir + "/tests.stats", adml_operation_output("\"show-stats\""))
-  printMsg("Dumping ADML process context information ...")
-  adml_operation("\"context|{}\" >/dev/null".format(logs_dir + "/adml.context"))
-  adml_operation("forceCountersRecord >/dev/null")
-
-  # Move 'counters' and 'test-reports'
-  printMsg("Retrieving counters information ...")
-  for f in glob.glob(agents_ADML_dir + "/counters/*"):
-    shutil.copy(f, logs_dir + "/counters")
-  printMsg("Retrieving tests reports information ...")
-  for f in glob.glob(agents_ADML_dir + "/test-reports/*"):
-    shutil.copy(f, logs_dir + "/test-reports")
-
-  # Debug:
-  printMsg("Retrieving debug information ...")
-  for f in glob.glob(agents_ADML_dir + "/launcher.trace*"):
-    shutil.copy(f, logs_dir + "/debug")
-
-  # Backup tests directory itself (some replacements could be happened):
-  target_once_executed = logs_dir + "/debug/" + os.path.basename(abs_tdir)
-  shutil.copytree(abs_tdir, target_once_executed) # , symlinks=True)
-
-  return statesOUTPUT, verdictOUTPUT, verdictRC
-
-
-def interactive_execution():
-  printMsg("Starting interactive execution of test cases")
-
-  stay = True
-  while stay:
-    print("--------------------------------------------")
-    adml_operation("\"test|summary-counts\"")
-    print("--------------------------------------------")
-
-    print ('''
-    MAIN INTERACTIVE MENU
-    =====================
-    (prefix option with 'h' to get detailed help)
-
-    General:
-    0.  Exit/Quit
-
-    Position:
-    1.  Go to
-    2.  Look
-
-    Test cases execution:
-    3.  Start with test rate
-    4.  Start next N test cases
-    5.  In-progress limit
-
-    Low level execution: test case steps
-    6.  Execute next N steps
-
-    Status & cycling:
-    7.  Reset
-    8.  Pool repeats
-    9.  Reset statistics & counters
-    10. Auto reset
-    11. Reports configuration
-    ''')
-
-    opt=input("Input option: \n")
-    if opt=="h0":
-      print("Just exit this menu")
-    elif opt=="0":
-      stay = False
-
-    elif opt=="h1":
-      print("Updates the current test pointer position.")
-    elif opt=="1":
-      _id=input("Input the test case id: ")
-      adml_operation("\"test|goto|{}\"".format(_id))
-
-    elif opt=="h2":
-      print("Show programmed test case for id provided, current 'in-process' test case when missing.")
-    elif opt=="2":
-      _id=input("Input the test case id [empty will show current]: ")
-      if _id: _id="|" + _id
-      adml_operation("\"test|look{}\"".format(_id))
-
-    elif opt=="h3":
-      print('''
-Starts/resume the provided number of test ticks per second (ttps). The ADML starts
-with the event trigger system suspended, and this operation is neccessary to begin
-those cases which need this time event (internal triggering). Some other test cases
-could be started through external events (first test case event could be programmed
-to wait specific message), but is not usual this external mode and neither usual to
-mix triggering types. Normally, you will pause/stop new test launchs providing 0 as
-ttps value, and also you could dynamically modify the load rate updating that value.
-If a test case has N messages then 'ttps * N' will be the virtual number of messages
-managed per second when no bottleneck exists.
-
-Provide 0 in order to stop the timer triggering.
-
-The timer manager resolution currently harcoded allows a maximum  of 50 events
-per second. To reach greater rates ADML will join synchronously the needed number of
-new time-triggered test cases per a single event, writting a warning-level trace to
-advice about the risk of burst sendings and recommend launching multiple instances
-to achieve such load with a lower rate per instance.''')
-    elif opt=="3":
-      ttps=input("Input the test ticks per second (0: stops the test rate clock): ")
-      adml_operation("\"test|ttps|{}\"".format(ttps))
-
-    elif opt=="h4":
-      print('''
-Forces the execution of the next test case(s) without waiting for test manager tick.
-Provide an integer value for 'sync-amount' to send a burst synchronous amount of the
-next programmed test cases (1 by default). This event works regardless the timer tick
-function, but it is normally used with the test manager tick stopped.''')
-    elif opt=="4":
-      amount=input("Input the number of tests to execute synchronously [1 by default]: ")
-      if not amount: amount=1
-      adml_operation("\"test|next|{}\"".format(amount))
-
-    elif opt=="h5":
-      print('''
-In-progress limit of test cases. No new test cases will be launched over this value
-(test Manager tick work will be ignored). Zero-value is equivalent to stop the clock.
-tick, -1 is used to specify 'no limit'. If missing amount, the limit and current
-amount of in-progress test cases will be shown.
-
-Default is 1 to ensure sequential execution for testcases (function test mode).
-For system test, it is recommended to set '-1' (no limit).''')
-    elif opt=="5":
-      print("\nTypical 'in-progress limit' values:")
-      print("-1: no limit")
-      print(" 0: similar to stop the test rate clock")
-      print(" 1: sequential execution for testcases (function test mode)\n")
-      limit=input("Input the desired in-progress limit amount [show current by default]: ")
-      if limit: limit = "|" + limit
-      adml_operation("\"test|ip-limit{}\"".format(limit))
-
-    elif opt=="h6":
-      print('''
-Makes interactive a specific test case id. The amount is the margin of execution steps
-to be done. With amount of '0' the test case is selected to be interactive, but no step
-is executed. Then you have to interact with positive amounts (usually 1), executing the
-provided number of steps if they are ready and fulfill the needed conditions. The value
-of 0, implies no execution steps margin, which could be useful to 'freeze' a test in the
-middle of its execution.  You could also provide -1 to make it non-interactive resuming
-it from the current step.
-By default, current test case id is selected for interaction.''')
-    elif opt=="6":
-      amount=input("Input the number of steps to execute (-1: resumes the test case; 0: freezes it) [1 by default]: ")
-      if not amount: amount = 1
-      test_id=input("Input the test id [current by default (remember to set a valid pointer with 'go to')]: ")
-      if test_id: test_id = "|" + test_id
-      adml_operation("\"test|interact|{}{}\"".format(amount, test_id))
-
-    elif opt=="h7":
-      print('''
-Reset the test case for id provided, all the tests when missing. It could be hard/soft:
-- hard: you probably may need to stop the load rate before. This operation initializes
-  all test cases regardless their states.
-- soft: only for finished cases (those with 'Success' or 'Failed' states). It does not
-  affect to test cases with 'InProgress' state.''')
-    elif opt=="7":
-      rtype=input("Input the reset type (soft/hard) [hard]: ")
-      if not rtype: rtype = "hard"
-      test_id=input("Input the test id [all tests by default]: ")
-      if test_id: test_id = "|" + test_id
-      adml_operation("\"test|reset|{}{}\"".format(rtype, test_id))
-
-    elif opt=="h8":
-      print('''
-Restarts the whole programmed test list when finished the amount number of times (repeats
-forever if value -1 is provided). This is disabled by default (amount = 0): testing trigger
-system will enter suspended state until new ttps operation is received and a soft reset has
-been done before. Test cases state & data will be reset (when achieved again), but general
-statistics and counters will continue measuring until reset with 'collect' operation.''')
-    elif opt=="8":
-      amount=input("Input the number of cycle repeats (-1: repeats forever; 0: disables repetitions): ")
-      adml_operation("\"test|repeats|{}\"".format(amount))
-
-    elif opt=="h9":
-      print('''
-Reset statistics and counters to start a new test stage of performance measurement.
-This affects to final logs retrieved on exit (option 0).''')
-    elif opt=="9":
-      adml_operation("\"collect\"")
-
-    elif opt=="h10":
-      print('''
-When cycling, current test cases can be soft (default) or hard reset. If no timeout has
-been configured for the test case, hard reset could prevent stuck on the next cycle for
-those test cases still in progress.''')
-    elif opt=="10":
-      rtype=input("Input the reset type (soft/hard) [hard]: ")
-      if not rtype: rtype = "hard"
-      adml_operation("\"test|auto-reset|{}\"".format(rtype))
-
-    elif opt=="h11":
-      print('''
-Enables/disables report generation for a certain test case state: initialized, in-progress,
-failed or success (also 'all' and 'none' reserved words could be used). This applies to report
-summary (final logs retrieved) and automatic dumps during testing where only failed or
-successful states will appear: every time a test case is finished its xml representation will
-be dump on a file under (logs test-reports) with the name:
-
-   'cycle-<cycle id>.testcase-<test case id>.xml'.
-
-By default, all the states are disabled to avoid IO overload. In most of cases not all the
-tests are going to fail then you could enable only such failed dumps. Anyway you could set
-the reports visibility to fit your needs in a given situation.
-
-Also you could enable hexadecimal representation for diameter messages on reports.''')
-    elif opt=="11":
-      print("\nInput the report target operation, capital letters to enable:")
-      rtype=input("(I/i)nitialized, in-(P/p)rogress, (F/f)ailed, (S/s)uccess, (A/a)ll, (N/n)one [A: all will be enabled by default]: ")
-      if not rtype: rtype = "A"
-      target = None
-      enable = "no"
-      upper_rtype = rtype.upper()
-      if (upper_rtype == rtype): enable = "yes"
-      if (upper_rtype == "I" ):
-        target="initialized"
-      elif (upper_rtype == "P"):
-        target="in-progress"
-      elif (upper_rtype == "F"):
-        target="failed"
-      elif (upper_rtype == "S"):
-        target="success"
-      elif (upper_rtype == "A"):
-        target="all"
-      elif (upper_rtype == "N"):
-        target="none"
-
-      if not target:
-        print("Invalid target. Try again !")
-      else:
-        print(" - Target selected: " + target)
-        print(" - Enable:          " + enable)
-        adml_operation("\"test|report|{}|{}\"".format(target, enable))
-
-      enableHex=input("\nEnable/Disable hexadecimal dumps for diameter messages in test reports (yes/no) [no]: ")
-      if not enableHex: enableHex = "no"
-      adml_operation("\"test|report-hex|{}\"".format(enableHex))
-
-    elif opt !="":
-      print("\nInvalid choice. Try again !")
-
-
-    if stay: input("\nPress ENTER to continue ...\n")
-
-
-
-#####################
-#      M A I N      #
-#####################
-
-if __name__ == "__main__":
-
-  # Agents:
-  abspath = os.path.abspath(__file__)
-  dname = os.path.dirname(abspath)
-  agents_KAFKA_dir = dname + "/agents/KAFKA"
-  agents_HTTPMOCK_dir = dname + "/agents/HTTPMOCK"
-  agents_ADML_dir = dname + "/agents/ADML"
-
-  # Injected environment variables (could be used in system_cmd commands:
-  os.putenv("AGENTS_DIR", dname + "/agents")
-
-  arguments = parse_arguments()
-
-  tdir = arguments.tests_dir
-  keep = arguments.keep_list_if_exists
-  stopAdml = arguments.stop_adml_at_the_end
-  interactive = arguments.interactive
-  dryrun = arguments.dry_run
-  iplimit = arguments.ip_limit
-  ttps = arguments.ttps
-
-  # Tests list: 'launcher.list':
-  llist = tdir + "/launcher.list"
-  llist_current = llist + ".updated"
-
-  # Auxiliary:
-  abs_tdir = get_parent_dir(llist)
-  llist_exists = os.path.exists(llist)
-
-  # Create the current list of test cases:
-  list_content = None
-  list_content = os.popen("find {} -mindepth 2 -name \"*.yml\" | sort -t'/'".format(tdir)).read()
-
-  # Performance:
-  if not ttps: ttps = 50
-  if not iplimit: iplimit = 1
-  if iplimit == "auto":
-    printMsg("AUTO IP-LIMIT ALGORITHM IS UNDER CONSTRUCTION (configuring value 1) ... ")
-    iplimit = 1
-
-  GIpLimit = iplimit
-
-
-  if llist_exists:
-    # Detect updates:
-    writeFileContent(llist_current, list_content)
-    if filecmp.cmp(llist, llist_current):
-      os.remove(llist_current)
-    else:
-      printMsg("The list '{}' has been created".format(llist_current))
-      printMsg("Warning: detected local changes (may be commented test cases) in '{}' regarding current tests list '{}'".format(llist, llist_current))
-
-    # Respect existing list (except if -k is not provided):
-    if keep:
-      printMsg("Reuse the current list '{}'".format(llist))
-      with open(llist) as llist_file:
-        list_content = llist_file.read()
-
-  if not llist_exists or not keep:
-    writeFileContent(llist, list_content)
-    printMsg("The list '{}' has been created".format(llist))
-
-
-  try:
-    global GTcNumber
-    global GProvisionContent
-    global GIdsVsDescs
-    GTcNumber = 0
-    GProvisionContent = ""
-    GIdsVsDescs = ""
-
-    provision_begin(iplimit)
-    provision_tests(list_content)
-
-    llist_of_operations = abs_tdir + "/launcher.list.adml_operations"
-    lids = abs_tdir + "/launcher.ids"
-    writeFileContent(llist_of_operations, GProvisionContent)
-    writeFileContent(lids, GIdsVsDescs)
-
-    if dryrun:
-      if interactive: printMsg("Interactive mode is not reached at dry-run mode")
-      _exit("Dry-run execution finished", 0)
-
-    rc = start_agents()
-    if (rc != 0):
-      _exit("Failed to initiate ADML director!", 1)
-
-    # Provision test cases in ADML:
-    adml_operation("-f " + llist_of_operations + " >/dev/null")
-
-
-    if (interactive):
-      interactive_execution()
-
-    else:
-      # Initial time:
-      t_initial = datetime.datetime.now()
-
-      # Start test cases:
-      adml_operation("\"test|ttps|" + str(ttps) + "\"")
-
-      # Estimated time to finish: worst case is timeout (we assume maximum timeout of 15 seconds per test case):
-      # worstTime = 15*GTcNumber
-
-      # We will check the progress: initialized test cases must be 0 again (cycle completed).
-      # But this only is guaranteed if all the tests define a timeout. If not, a wait step could stuck
-      #  any test eternally (worstTime is used to exit the following loop):
-      cycle = 0
-      #sleepTime=15
-      #maxCycles=GTcNumber
-      # Better resolution:
-      #sleepTime=1
-      maxCycles=15*GTcNumber
-
-      while True:
-        cycle += 1
-        #time.sleep(sleepTime)
-        time.sleep(1)
-        output = adml_operation_output("\"test|finished\"")
-        if "test|finished => {}".format(GTcNumber) in output: break
-        if (cycle > maxCycles): break
-        #printMsg("Checking progress ({}/{}) ...".format(cycle, maxCycles))
-        if not (cycle % 60): printMsg("Working ...")
-
-      # Final time:
-      t_final = datetime.datetime.now()
-      t_elapsed = t_final - t_initial
-      elapsedOUTPUT = "\nElapsed time in seconds: {}\n\n".format(t_elapsed.total_seconds())
-
-    # Collect results at tests-directory:
-    statesOUTPUT, verdictOUTPUT, verdictRC = collect_results(abs_tdir)
-
-    # Stop ADML:
-    if stopAdml:
-      printMsg("Stoping ADML director ...")
-      time.sleep(6)
-      os.system(agents_ADML_dir + "/stop.sh >/dev/null")
-
-    # Exit with verdict:
-    _exit(statesOUTPUT + elapsedOUTPUT + verdictOUTPUT, verdictRC)
-
-  except Exception as e:
-    _exit(e, 1)
diff --git a/example/diameter/launcher/deployments/aots/loader.py b/example/diameter/launcher/deployments/aots/loader.py
deleted file mode 100755 (executable)
index 608566f..0000000
+++ /dev/null
@@ -1,352 +0,0 @@
-#!/usr/bin/env python
-# Anna Agents-Oriented Testing Setup Loader
-
-# Requires PyYAML: pip install pyyaml
-
-import os, sys, datetime
-from argparse import ArgumentParser
-
-# PyYAML
-from yaml import load, dump
-try:
-    from yaml import CLoader as Loader, CDumper as Dumper
-except ImportError:
-    from yaml import Loader, Dumper
-
-
-def _exit(message = None, rc=0):
-  if (message): printMsg(message)
-  printMsg("Exiting [rc={}]".format(rc))
-  sys.exit(rc)
-
-
-def timeFormat():
-  return '%b.%d.%Y-%H.%M.%S'
-
-
-def printMsg(message):
-  print ("[{}] {}".format(datetime.datetime.now().strftime(timeFormat()), message))
-
-
-class YamlConfigParser():
-  """
-  Yaml parser
-  """
-  def __init__(self, yaml_config_file):
-    """
-    Convert the yaml file into a Python object
-    """
-    self.data = None
-    try:
-      with open(yaml_config_file, 'r') as ss:
-        self.data = load(ss, Loader=Loader)
-        ss.close()
-
-    except Exception:
-     raise
-
-  def getData(self):
-    return self.data
-
-  def show(self, options):
-    output = dump(self.data, Dumper=Dumper)
-    print(output)
-
-
-def writeFileContent(filename, content):
-  _file = open(filename, "w")
-  _file.write(content)
-  _file.close()
-
-
-def getNodeValue(dictionary, key):
-
-  value = dictionary[key]
-  printMsg("  {}: {}".format(key, value))
-  return value
-
-
-def configure_agent_adml(node, description, application_id, dictionary, _type, origin_host, origin_realm, address):
-
-  # Agent ADML configuration is basically generation of services:
-
-  if (_type == "client"):
-    stacks='''  <stack id="{application_id}" dictionary="{dictionary}" fixMode="Always" ignoreFlagsOnValidation="yes"/>'''.format(application_id=application_id, dictionary=dictionary)
-
-    nodes='''  <node originHost="{origin_host}" applicationId="{application_id}" entity="{address}" cer="cer.{application_id}.xml" answersTimeout="300000" dumpLog="yes"/>'''.format(application_id=application_id, dictionary=dictionary, origin_host=origin_host, address=address)
-
-    ce_path = agents_ADML_dir + "/cer.{}.xml".format(application_id)
-    ce_content='''<message version="1" name="CER" application-id="0">
-   <avp name="Origin-Host" data="{origin_host}"/>
-   <avp name="Origin-Realm" data="{origin_realm}"/>
-   <avp name="Host-IP-Address" data="1|127.0.0.1"/>
-   <avp name="Vendor-Id" data="10415"/>
-   <avp name="Product-Name" data="{description}"/>
-   <avp name="Auth-Application-Id" data="{application_id}"/>
-</message>'''.format(application_id=application_id, origin_host=origin_host, origin_realm=origin_realm, description=description)
-
-  elif (_type == "server"):
-    stacks='''  <stack id="{application_id}" dictionary="{dictionary}" fixMode="Never"/>'''.format(application_id=application_id, dictionary=dictionary)
-
-    nodes='''  <node originHost="{origin_host}" applicationId="{application_id}" diameterServer="{address}" diameterServerSessions="10" cea="cea.{application_id}.xml" answersTimeout="300000" dumpLog="yes"/>'''.format(application_id=application_id, dictionary=dictionary, origin_host=origin_host, address=address)
-
-    ce_path = agents_ADML_dir + "/cea.{}.xml".format(application_id)
-    ce_content='''<message version="1" name="CEA" application-id="0">
-   <avp name="Result-Code" data="2001" alias="DIAMETER_SUCCESS"/>
-   <avp name="Origin-Host" data="{origin_host}"/>
-   <avp name="Origin-Realm" data="{origin_realm}"/>
-   <avp name="Host-IP-Address" data="1|127.0.0.1"/>
-   <avp name="Vendor-Id" data="10415"/>
-   <avp name="Product-Name" data="{description}"/>
-</message>'''.format(origin_host=origin_host, origin_realm=origin_realm, description=description)
-
-  else:
-    raise Exception("Invalid ADML type '{}' (allowed: client|server)".format(_type))
-
-  # Create cer/cea files:
-  writeFileContent(ce_path, ce_content)
-
-
-  return stacks, nodes
-
-
-def configure_agent_kafka(node, description, topic):
-
-  # Producer script:
-  content = '''#!/bin/bash
-# Positional arguments: json, delay, debug indicator
-[ -z "$3" ] && echo "Usage: $0 <json file> <delay in milliseconds: 0 is no delay> <debug indicator: yes|no>" && exit 1
-
-json=$1
-delay=""
-[ "$2" != "0" ] && delay="-w $2"
-debug=""
-[ "$3" = "yes" ] && debug="-d"
-
-echo "[{description}] Kafka Producer Step"
-cd $(dirname $0)
-python3 Producer.py -n {node} -t {topic} -f $json $delay $debug 2>&1 | tee -a {node}-producer.sh.output
-exit ${{PIPESTATUS[0]}}
-'''.format(description=description, node=node, topic=topic)
-
-  path = agents_KAFKA_dir + "/{}-producer.sh".format(node)
-  writeFileContent(path, content)
-  os.chmod(path, 0o755)
-  #printMsg("Created procedure '{}'".format(path))
-
-  # Consumer script:
-  content = '''#!/bin/bash
-# Positional arguments: json, offset, timeout, debug indicator
-[ -z "$4" ] && echo "Usage: $0 <json file ('any' to skip matching)> <auto offset reset> <timeout in seconds: 0 is no timeout> <debug indicator: yes|no>" && exit 1
-
-file=""
-[ "$1" != "any" ] && file="-f $1"
-offset=$2
-timeout=""
-[ "$3" != "0" ] && timeout="-w $3"
-debug=""
-[ "$4" = "yes" ] && debug="-d"
-
-echo "[{description}] Kafka Consumer Step"
-cd $(dirname $0)
-python3 Consumer.py -n {node} -t {topic} $file -o "$offset" $timeout $debug 2>&1 | tee -a {node}-consumer.sh.output
-exit ${{PIPESTATUS[0]}}
-'''.format(description=description, node=node, topic=topic)
-
-  # We don't use -m (match as regular expression) because some problems have been detected with big json files.
-
-  path = agents_KAFKA_dir + "/{}-consumer.sh".format(node)
-  writeFileContent(path, content)
-  os.chmod(path, 0o755)
-  #printMsg("Created procedure '{}'".format(path))
-
-  # Admin script:
-  content = '''#!/bin/bash
-# Positional arguments: operation, debug indicator
-[ -z "$2" ] && echo "Usage: $0 <operation: clean_topic (at the moment)> <debug indicator: yes|no>" && exit 1
-operation=""
-case $1 in
-  clean_topic)
-    operation="-r"
-    ;;
-esac
-debug=""
-[ "$2" = "yes" ] && debug="-d"
-
-echo "[{description}] Kafka Administration Step"
-cd $(dirname $0)
-python3 Admin.py -n {node} -t {topic} $operation $debug 2>&1 | tee -a {node}-admin.sh.output
-exit ${{PIPESTATUS[0]}}
-'''.format(description=description, node=node, topic=topic)
-
-  path = agents_KAFKA_dir + "/{}-admin.sh".format(node)
-  writeFileContent(path, content)
-  os.chmod(path, 0o755)
-  #printMsg("Created procedure '{}'".format(path))
-
-
-def configure_agent_kafkacpp(node, description, topic):
-
-  # Consumer script:
-  content = '''#!/bin/bash
-# Positional arguments: json, offset, timeout, debug indicator
-[ -z "$4" ] && echo "Usage: $0 <json file ('any' to skip matching)> <auto offset reset> <timeout in seconds: 0 is no timeout> <debug indicator: yes|no>" && exit 1
-
-file=""
-[ "$1" != "any" ] && file="-f $1"
-offset=$2
-timeout=""
-[ "$3" != "0" ] && timeout="-w $3"
-debug=""
-[ "$4" = "yes" ] && debug="-d"
-
-echo "[{description}] Kafkacpp Consumer Step"
-cd $(dirname $0)
-sh Consumer -n {node} -t {topic} $file -o "$offset" $timeout $debug 2>&1 | tee -a {node}-consumer.sh.output
-exit ${{PIPESTATUS[0]}}
-'''.format(description=description, node=node, topic=topic)
-
-  # We don't use -m (match as regular expression) because some problems have been detected with big json files.
-
-  path = agents_KAFKACPP_dir + "/{}-consumer.sh".format(node)
-  writeFileContent(path, content)
-  os.chmod(path, 0o755)
-  #printMsg("Created procedure '{}'".format(path))
-
-
-def configure_agent_httpmock(node, description, address):
-
-  # Provisioning script:
-  content = '''#!/bin/bash
-# Positional arguments: json, method, uri
-[ -z "$3" ] && echo "Usage: $0 <test id> <step id> <test path> <json file> <method: POST|PUT|GET|DELETE> <uri>" && exit 1
-
-echo "[{description}] Http Mock Provision Step"
-cd $(dirname $0)
-sh Provision.sh $1 $2 $3 "{address}" "$4" "$5" "$6" 2>&1 | tee -a {node}-provision.sh.output
-exit ${{PIPESTATUS[0]}}
-'''.format(description=description, node=node, address=address)
-
-  path = agents_HTTPMOCK_dir + "/{}-provision.sh".format(node)
-  writeFileContent(path, content)
-  os.chmod(path, 0o755)
-  #printMsg("Created procedure '{}'".format(path))
-
-
-def configure_agents(agents):
-
-  stacks = ""
-  nodes = ""
-
-  for node in agents:
-
-    if (node == "ADML"): raise Exception('Invalid node id: "ADML" is reserved')
-    if (node == "KAFKA"): raise Exception('Invalid node id: "KAFKA" is reserved')
-    if (node == "KAFKACPP"): raise Exception('Invalid node id: "KAFKACPP" is reserved')
-    if (node == "HTTPMOCK"): raise Exception('Invalid node id: "HTTPMOCK" is reserved')
-
-    printMsg("Node: {}".format(node))
-
-    description = getNodeValue(agents[node], "description")
-    template = getNodeValue(agents[node], "template")
-
-    if (template == "ADML"):
-      # Node file:
-      path = agents_ADML_dir + "/{}.node".format(node)
-      writeFileContent(path, description)
-
-      application_id = getNodeValue(agents[node], "application_id")
-      dictionary = getNodeValue(agents[node], "dictionary")
-      _type = getNodeValue(agents[node], "type")
-      origin_host = getNodeValue(agents[node], "origin_host")
-      origin_realm = getNodeValue(agents[node], "origin_realm")
-      address = getNodeValue(agents[node], "address")
-
-      # Here stacks and nodes are accumulated. Consolidation of 'services.xml' is done at the end of iteration (*)
-      s,n = configure_agent_adml(node, description, application_id, dictionary, _type, origin_host, origin_realm, address)
-      stacks += s
-      stacks += "\n"
-      nodes += n
-      nodes += "\n"
-
-    if (template == "KAFKA"):
-      # Node file:
-      path = agents_KAFKA_dir + "/{}.node".format(node)
-      writeFileContent(path, description)
-
-      topic = getNodeValue(agents[node], "topic")
-
-      configure_agent_kafka(node, description, topic)
-
-
-    if (template == "KAFKACPP"):
-      # Node file:
-      path = agents_KAFKACPP_dir + "/{}.node".format(node)
-      writeFileContent(path, description)
-
-      topic = getNodeValue(agents[node], "topic")
-
-      configure_agent_kafkacpp(node, description, topic)
-
-
-    if (template == "HTTPMOCK"):
-      # Node file:
-      path = agents_HTTPMOCK_dir + "/{}.node".format(node)
-      writeFileContent(path, description)
-
-      address = getNodeValue(agents[node], "address")
-
-      configure_agent_httpmock(node, description, address)
-
-
-  #(*) Consolidate services.xml
-  path = agents_ADML_dir + "/services.xml"
-
-  content='''<services>
-{}
-{}
-</services>'''.format(stacks, nodes)
-
-  writeFileContent(path, content)
-
-
-
-def parse_arguments():
-
-  parser = ArgumentParser(description='Anna Agents-Oriented Testing Setup Loader')
-  parser.add_argument('-f', '--file', help='Agents yaml configuration file', required=True)
-
-
-  arguments = parser.parse_args()
-
-  return arguments
-
-
-#####################
-#      M A I N      #
-#####################
-
-if __name__ == "__main__":
-
-  # Agents:
-  abspath = os.path.abspath(__file__)
-  dname = os.path.dirname(abspath)
-  agents_ADML_dir = dname + "/agents/ADML"
-  agents_KAFKA_dir = dname + "/agents/KAFKA"
-  agents_KAFKACPP_dir = dname + "/agents/KAFKACPP"
-  agents_HTTPMOCK_dir = dname + "/agents/HTTPMOCK"
-
-  arguments = parse_arguments()
-
-  afile = arguments.file
-
-  try:
-    agents = YamlConfigParser(arguments.file)
-
-    configure_agents(agents.getData())
-    #start_agents(agents)
-
-    _exit()
-
-  except Exception as e:
-    _exit(e, 1)
diff --git a/example/diameter/launcher/deployments/aots/tests.example/agents.yml b/example/diameter/launcher/deployments/aots/tests.example/agents.yml
deleted file mode 100644 (file)
index 0c65f2c..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-AF:
-  description: AF Diameter Rx Node
-  template: ADML
-  application_id: 16777236
-  dictionary: stacks/DictionaryRx.16777236.xml
-  type: client
-  origin_host: machine.source.server.realm.com
-  origin_realm: source.server.realm.com
-  address: 127.0.0.1:3868
-
-SMPC:
-  description: SMPC N7 Node
-  template: KAFKA
-  topic: n7topic
diff --git a/example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch01-ipv4/1.Initial.yml b/example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch01-ipv4/1.Initial.yml
deleted file mode 100644 (file)
index 781ee00..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-- action: modify_json_key_value
-  arguments:
-    json: expected.json.template
-    new_json: expected.json
-    kpath_value_list:
-    - kpath: SessionRx
-      value: the_rx_session
-
-- action: SMPC/admin
-  arguments:
-    operation: clean_topic
-
-- action: timeout_ms
-  arguments:
-    value: 3000
-
-- action: AF/send_xml_to_entity
-  arguments:
-    xml: AAR.xml
-
-- action: AF/wait_xml_from_entity
-  arguments:
-    xml: AAA.xml
-
-- action: SMPC/consume_json
-  arguments:
-    json: expected.json
-    auto_offset_reset: earliest
diff --git a/example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch01-ipv4/2.Initial2.yml b/example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch01-ipv4/2.Initial2.yml
deleted file mode 100644 (file)
index 90b53c7..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-- action: timeout_ms
-  arguments:
-    value: 2000
-
-- action: AF/send_xml_to_entity
-  arguments:
-    xml: AAR2.xml
-
-- action: AF/wait_xml_from_entity
-  arguments:
-    xml: AAA.xml
diff --git a/example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch01-ipv4/AAA.xml b/example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch01-ipv4/AAA.xml
deleted file mode 100644 (file)
index 00198ea..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-<message version="1" name="AA-Answer" application-id="16777236" hop-by-hop-id="10" end-to-end-id="20">
- <avp name="Session-Id" data="mytest;afNodeHostname.nodeHostRealm.com;default;1"/>
- <avp name="Auth-Application-Id" data="16777236"/>
- <avp name="Origin-Host" data="afNodeHostname.nodeHostRealm.com"/>
- <avp name="Origin-Realm" data="(none)"/>
- <avp name="Result-Code" data="2001" alias="DIAMETER_SUCCESS"/>
- <avp name="Supported-Features" flags="128">
- <avp name="Vendor-Id" data="10415"/>
- <avp name="Feature-List-ID" data="1"/>
- <avp name="Feature-List" data="19"/>
- </avp>
- <avp name="Origin-State-Id" data="1510836560"/>
-</message>
diff --git a/example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch01-ipv4/AAR.xml b/example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch01-ipv4/AAR.xml
deleted file mode 100644 (file)
index db6ddae..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-<message version="1" name="AA-Request" application-id="16777236" hop-by-hop-id="10" end-to-end-id="20">
-   <avp name="Session-Id" data="mytest;afNodeHostname.nodeHostRealm.com;2;555231"/>
-   <avp name="Destination-Host" data="sapcOwnHostId.operatorRealm.com"/>
-   <avp name="Destination-Realm" data="operatorRealm.com"/>
-   <avp name="Origin-Host" data="afNodeHostname.nodeHostRealm.com"/>
-   <avp name="Origin-Realm" data="nodeHostRealm.com"/>
-   <avp name="Auth-Application-Id" data="16777236"/>
-   <avp name="Origin-State-Id" data="1"/>
-   <avp name="Framed-IP-Address" hex-data="c52a0a20"/>
-   <avp name="AF-Application-Identifier" hex-data="75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c"/>
-   <avp name="Media-Component-Description">
-      <avp name="Media-Component-Number" data="1"/>
-      <avp name="Media-Sub-Component">
-         <avp name="Flow-Number" data="1"/>
-         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2234 to 10.95.130.50 2234"/>
-         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2234 to 48.148.70.168 2234"/>
-         <avp name="Flow-Status" data="2" alias="ENABLED"/>
-         <avp name="Flow-Usage" data="0" alias="NO_INFORMATION"/>
-      </avp>
-      <avp name="Media-Sub-Component">
-         <avp name="Flow-Number" data="2"/>
-         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2235 to 10.95.130.50 2235"/>
-         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2235 to 48.148.70.168 2235"/>
-         <avp name="Flow-Status" data="2" alias="ENABLED"/>
-         <avp name="Flow-Usage" data="1" alias="RTCP"/>
-      </avp>
-      <avp name="AF-Application-Identifier" hex-data="75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c"/>
-      <avp name="Media-Type" data="0" alias="OTHER"/>
-      <avp name="Max-Requested-Bandwidth-UL" data="128000"/>
-      <avp name="Max-Requested-Bandwidth-DL" data="128000"/>
-      <avp name="Flow-Status" data="2" alias="ENABLED"/>
-      <avp name="Reservation-Priority" data="3" alias="PRIORITY-THREE"/>
-      <avp name="RR-Bandwidth" data="64000"/>
-      <avp name="RS-Bandwidth" data="64000"/>
-   </avp>
-   <avp name="Media-Component-Description">
-      <avp name="Media-Component-Number" data="2"/>
-      <avp name="Media-Sub-Component">
-         <avp name="Flow-Number" data="1"/>
-         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2236 to 10.95.130.50 2236"/>
-         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2236 to 48.148.70.168 2236"/>
-         <avp name="Flow-Status" data="2" alias="ENABLED"/>
-         <avp name="Flow-Usage" data="0" alias="NO_INFORMATION"/>
-      </avp>
-      <avp name="Media-Sub-Component">
-         <avp name="Flow-Number" data="2"/>
-         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2237 to 10.95.130.50 2237"/>
-         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2237 to 48.148.70.168 2237"/>
-         <avp name="Flow-Status" data="2" alias="ENABLED"/>
-         <avp name="Flow-Usage" data="1" alias="RTCP"/>
-      </avp>
-      <avp name="AF-Application-Identifier" hex-data="75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c"/>
-      <avp name="Media-Type" data="1" alias="VIDEO"/>
-      <avp name="Max-Requested-Bandwidth-UL" data="128000"/>
-      <avp name="Max-Requested-Bandwidth-DL" data="128000"/>
-      <avp name="Flow-Status" data="2" alias="ENABLED"/>
-      <avp name="Reservation-Priority" data="4" alias="PRIORITY-FOUR"/>
-      <avp name="RR-Bandwidth" data="64000"/>
-      <avp name="RS-Bandwidth" data="64000"/>
-   </avp>
-   <avp name="AF-Charging-Identifier" hex-data="41462d4368617267696e674964656e746966696572"/>
-   <avp name="SIP-Forking-Indication" data="0" alias="SINGLE_DIALOGUE"/>
-   <avp name="Supported-Features" flags="192">
-      <avp name="Vendor-Id" data="10415"/>
-      <avp name="Feature-List-ID" data="1"/>
-      <avp name="Feature-List" data="19"/>
-   </avp>
-</message>
diff --git a/example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch01-ipv4/AAR2.xml b/example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch01-ipv4/AAR2.xml
deleted file mode 100644 (file)
index db6ddae..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-<message version="1" name="AA-Request" application-id="16777236" hop-by-hop-id="10" end-to-end-id="20">
-   <avp name="Session-Id" data="mytest;afNodeHostname.nodeHostRealm.com;2;555231"/>
-   <avp name="Destination-Host" data="sapcOwnHostId.operatorRealm.com"/>
-   <avp name="Destination-Realm" data="operatorRealm.com"/>
-   <avp name="Origin-Host" data="afNodeHostname.nodeHostRealm.com"/>
-   <avp name="Origin-Realm" data="nodeHostRealm.com"/>
-   <avp name="Auth-Application-Id" data="16777236"/>
-   <avp name="Origin-State-Id" data="1"/>
-   <avp name="Framed-IP-Address" hex-data="c52a0a20"/>
-   <avp name="AF-Application-Identifier" hex-data="75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c"/>
-   <avp name="Media-Component-Description">
-      <avp name="Media-Component-Number" data="1"/>
-      <avp name="Media-Sub-Component">
-         <avp name="Flow-Number" data="1"/>
-         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2234 to 10.95.130.50 2234"/>
-         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2234 to 48.148.70.168 2234"/>
-         <avp name="Flow-Status" data="2" alias="ENABLED"/>
-         <avp name="Flow-Usage" data="0" alias="NO_INFORMATION"/>
-      </avp>
-      <avp name="Media-Sub-Component">
-         <avp name="Flow-Number" data="2"/>
-         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2235 to 10.95.130.50 2235"/>
-         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2235 to 48.148.70.168 2235"/>
-         <avp name="Flow-Status" data="2" alias="ENABLED"/>
-         <avp name="Flow-Usage" data="1" alias="RTCP"/>
-      </avp>
-      <avp name="AF-Application-Identifier" hex-data="75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c"/>
-      <avp name="Media-Type" data="0" alias="OTHER"/>
-      <avp name="Max-Requested-Bandwidth-UL" data="128000"/>
-      <avp name="Max-Requested-Bandwidth-DL" data="128000"/>
-      <avp name="Flow-Status" data="2" alias="ENABLED"/>
-      <avp name="Reservation-Priority" data="3" alias="PRIORITY-THREE"/>
-      <avp name="RR-Bandwidth" data="64000"/>
-      <avp name="RS-Bandwidth" data="64000"/>
-   </avp>
-   <avp name="Media-Component-Description">
-      <avp name="Media-Component-Number" data="2"/>
-      <avp name="Media-Sub-Component">
-         <avp name="Flow-Number" data="1"/>
-         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2236 to 10.95.130.50 2236"/>
-         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2236 to 48.148.70.168 2236"/>
-         <avp name="Flow-Status" data="2" alias="ENABLED"/>
-         <avp name="Flow-Usage" data="0" alias="NO_INFORMATION"/>
-      </avp>
-      <avp name="Media-Sub-Component">
-         <avp name="Flow-Number" data="2"/>
-         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2237 to 10.95.130.50 2237"/>
-         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2237 to 48.148.70.168 2237"/>
-         <avp name="Flow-Status" data="2" alias="ENABLED"/>
-         <avp name="Flow-Usage" data="1" alias="RTCP"/>
-      </avp>
-      <avp name="AF-Application-Identifier" hex-data="75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c"/>
-      <avp name="Media-Type" data="1" alias="VIDEO"/>
-      <avp name="Max-Requested-Bandwidth-UL" data="128000"/>
-      <avp name="Max-Requested-Bandwidth-DL" data="128000"/>
-      <avp name="Flow-Status" data="2" alias="ENABLED"/>
-      <avp name="Reservation-Priority" data="4" alias="PRIORITY-FOUR"/>
-      <avp name="RR-Bandwidth" data="64000"/>
-      <avp name="RS-Bandwidth" data="64000"/>
-   </avp>
-   <avp name="AF-Charging-Identifier" hex-data="41462d4368617267696e674964656e746966696572"/>
-   <avp name="SIP-Forking-Indication" data="0" alias="SINGLE_DIALOGUE"/>
-   <avp name="Supported-Features" flags="192">
-      <avp name="Vendor-Id" data="10415"/>
-      <avp name="Feature-List-ID" data="1"/>
-      <avp name="Feature-List" data="19"/>
-   </avp>
-</message>
diff --git a/example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch01-ipv4/expected.json.template b/example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch01-ipv4/expected.json.template
deleted file mode 100644 (file)
index eaacfa8..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-  "SessionRx":"one_rx_session",
-  "SessionGx":"the_gx_session"
-}
diff --git a/example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch02-ipv6/1.Initial.yml b/example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch02-ipv6/1.Initial.yml
deleted file mode 100644 (file)
index 5c6395c..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-- action: timeout_ms
-  arguments:
-    value: 1000
-
-- action: AF/send_xml_to_entity
-  arguments:
-    xml: AAR-ipv6.xml
-
-- action: AF/wait_xml_from_entity
-  arguments:
-    xml: AAA.xml
diff --git a/example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch02-ipv6/2.Initial2.yml b/example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch02-ipv6/2.Initial2.yml
deleted file mode 100644 (file)
index 614bbee..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-- action: timeout_ms
-  arguments:
-    value: 2000
-
-- action: AF/send_xml_to_entity
-  arguments:
-    xml: AAR-ipv6.xml
-
-- action: AF/wait_xml_from_entity
-  arguments:
-    xml: AAA.xml
diff --git a/example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch02-ipv6/3.Initial3.yml b/example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch02-ipv6/3.Initial3.yml
deleted file mode 100644 (file)
index 7b94b48..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-- action: timeout_ms
-  arguments:
-    value: 3000
-
-- action: AF/send_xml_to_entity
-  arguments:
-    xml: AAR-ipv6.xml
-
-- action: AF/wait_xml_from_entity
-  arguments:
-    xml: AAA.xml
diff --git a/example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch02-ipv6/AAA.xml b/example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch02-ipv6/AAA.xml
deleted file mode 100644 (file)
index 00198ea..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-<message version="1" name="AA-Answer" application-id="16777236" hop-by-hop-id="10" end-to-end-id="20">
- <avp name="Session-Id" data="mytest;afNodeHostname.nodeHostRealm.com;default;1"/>
- <avp name="Auth-Application-Id" data="16777236"/>
- <avp name="Origin-Host" data="afNodeHostname.nodeHostRealm.com"/>
- <avp name="Origin-Realm" data="(none)"/>
- <avp name="Result-Code" data="2001" alias="DIAMETER_SUCCESS"/>
- <avp name="Supported-Features" flags="128">
- <avp name="Vendor-Id" data="10415"/>
- <avp name="Feature-List-ID" data="1"/>
- <avp name="Feature-List" data="19"/>
- </avp>
- <avp name="Origin-State-Id" data="1510836560"/>
-</message>
diff --git a/example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch02-ipv6/AAR-ipv6.xml b/example/diameter/launcher/deployments/aots/tests.example/ts01-general/ch02-ipv6/AAR-ipv6.xml
deleted file mode 100644 (file)
index db6ddae..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-<message version="1" name="AA-Request" application-id="16777236" hop-by-hop-id="10" end-to-end-id="20">
-   <avp name="Session-Id" data="mytest;afNodeHostname.nodeHostRealm.com;2;555231"/>
-   <avp name="Destination-Host" data="sapcOwnHostId.operatorRealm.com"/>
-   <avp name="Destination-Realm" data="operatorRealm.com"/>
-   <avp name="Origin-Host" data="afNodeHostname.nodeHostRealm.com"/>
-   <avp name="Origin-Realm" data="nodeHostRealm.com"/>
-   <avp name="Auth-Application-Id" data="16777236"/>
-   <avp name="Origin-State-Id" data="1"/>
-   <avp name="Framed-IP-Address" hex-data="c52a0a20"/>
-   <avp name="AF-Application-Identifier" hex-data="75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c"/>
-   <avp name="Media-Component-Description">
-      <avp name="Media-Component-Number" data="1"/>
-      <avp name="Media-Sub-Component">
-         <avp name="Flow-Number" data="1"/>
-         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2234 to 10.95.130.50 2234"/>
-         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2234 to 48.148.70.168 2234"/>
-         <avp name="Flow-Status" data="2" alias="ENABLED"/>
-         <avp name="Flow-Usage" data="0" alias="NO_INFORMATION"/>
-      </avp>
-      <avp name="Media-Sub-Component">
-         <avp name="Flow-Number" data="2"/>
-         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2235 to 10.95.130.50 2235"/>
-         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2235 to 48.148.70.168 2235"/>
-         <avp name="Flow-Status" data="2" alias="ENABLED"/>
-         <avp name="Flow-Usage" data="1" alias="RTCP"/>
-      </avp>
-      <avp name="AF-Application-Identifier" hex-data="75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c"/>
-      <avp name="Media-Type" data="0" alias="OTHER"/>
-      <avp name="Max-Requested-Bandwidth-UL" data="128000"/>
-      <avp name="Max-Requested-Bandwidth-DL" data="128000"/>
-      <avp name="Flow-Status" data="2" alias="ENABLED"/>
-      <avp name="Reservation-Priority" data="3" alias="PRIORITY-THREE"/>
-      <avp name="RR-Bandwidth" data="64000"/>
-      <avp name="RS-Bandwidth" data="64000"/>
-   </avp>
-   <avp name="Media-Component-Description">
-      <avp name="Media-Component-Number" data="2"/>
-      <avp name="Media-Sub-Component">
-         <avp name="Flow-Number" data="1"/>
-         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2236 to 10.95.130.50 2236"/>
-         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2236 to 48.148.70.168 2236"/>
-         <avp name="Flow-Status" data="2" alias="ENABLED"/>
-         <avp name="Flow-Usage" data="0" alias="NO_INFORMATION"/>
-      </avp>
-      <avp name="Media-Sub-Component">
-         <avp name="Flow-Number" data="2"/>
-         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2237 to 10.95.130.50 2237"/>
-         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2237 to 48.148.70.168 2237"/>
-         <avp name="Flow-Status" data="2" alias="ENABLED"/>
-         <avp name="Flow-Usage" data="1" alias="RTCP"/>
-      </avp>
-      <avp name="AF-Application-Identifier" hex-data="75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c"/>
-      <avp name="Media-Type" data="1" alias="VIDEO"/>
-      <avp name="Max-Requested-Bandwidth-UL" data="128000"/>
-      <avp name="Max-Requested-Bandwidth-DL" data="128000"/>
-      <avp name="Flow-Status" data="2" alias="ENABLED"/>
-      <avp name="Reservation-Priority" data="4" alias="PRIORITY-FOUR"/>
-      <avp name="RR-Bandwidth" data="64000"/>
-      <avp name="RS-Bandwidth" data="64000"/>
-   </avp>
-   <avp name="AF-Charging-Identifier" hex-data="41462d4368617267696e674964656e746966696572"/>
-   <avp name="SIP-Forking-Indication" data="0" alias="SINGLE_DIALOGUE"/>
-   <avp name="Supported-Features" flags="192">
-      <avp name="Vendor-Id" data="10415"/>
-      <avp name="Feature-List-ID" data="1"/>
-      <avp name="Feature-List" data="19"/>
-   </avp>
-</message>
diff --git a/example/diameter/launcher/deployments/aots/tests.example/ts02-errors/ch01-protocolErrors/1.MissingRealm.yml b/example/diameter/launcher/deployments/aots/tests.example/ts02-errors/ch01-protocolErrors/1.MissingRealm.yml
deleted file mode 100644 (file)
index 78dd722..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-- action: timeout_ms
-  arguments:
-    value: 1000
-
-- action: AF/send_xml_to_entity
-  arguments:
-    xml: AAR-bad.xml
-
-- action: AF/wait_xml_from_entity
-  arguments:
-    xml: AAA-bad.xml
diff --git a/example/diameter/launcher/deployments/aots/tests.example/ts02-errors/ch01-protocolErrors/AAA-bad.xml b/example/diameter/launcher/deployments/aots/tests.example/ts02-errors/ch01-protocolErrors/AAA-bad.xml
deleted file mode 100644 (file)
index a43e1de..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-<message version="1" name="AA-Answer" application-id="16777236" hop-by-hop-id="10" end-to-end-id="20">
- <avp name="Session-Id" data="mytest;afNodeHostname.nodeHostRealm.com;default;1"/>
- <avp name="Auth-Application-Id" data="16777236"/>
- <avp name="Origin-Host" data="afNodeHostname.nodeHostRealm.com"/>
- <avp name="Origin-Realm" data="(none)"/>
- <avp name="Result-Code" data="5005" alias="DIAMETER_MISSING_AVP"/>
- <avp name="Supported-Features" flags="128">
- <avp name="Vendor-Id" data="10415"/>
- <avp name="Feature-List-ID" data="1"/>
- <avp name="Feature-List" data="19"/>
- </avp>
- <avp name="Origin-State-Id" data="1510836560"/>
-</message>
diff --git a/example/diameter/launcher/deployments/aots/tests.example/ts02-errors/ch01-protocolErrors/AAR-bad.xml b/example/diameter/launcher/deployments/aots/tests.example/ts02-errors/ch01-protocolErrors/AAR-bad.xml
deleted file mode 100644 (file)
index 40aec3f..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-<message version="1" name="AA-Request" application-id="16777236" hop-by-hop-id="10" end-to-end-id="20">
-   <avp name="Session-Id" data="mytest;afNodeHostname.nodeHostRealm.com;2;555231"/>
-   <avp name="Destination-Host" data="sapcOwnHostId.operatorRealm.com"/>
-   <avp name="Origin-Host" data="afNodeHostname.nodeHostRealm.com"/>
-   <avp name="Auth-Application-Id" data="16777236"/>
-   <avp name="Origin-State-Id" data="1"/>
-   <avp name="Framed-IP-Address" hex-data="c52a0a20"/>
-   <avp name="AF-Application-Identifier" hex-data="75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c"/>
-   <avp name="Media-Component-Description">
-      <avp name="Media-Component-Number" data="1"/>
-      <avp name="Media-Sub-Component">
-         <avp name="Flow-Number" data="1"/>
-         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2234 to 10.95.130.50 2234"/>
-         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2234 to 48.148.70.168 2234"/>
-         <avp name="Flow-Status" data="2" alias="ENABLED"/>
-         <avp name="Flow-Usage" data="0" alias="NO_INFORMATION"/>
-      </avp>
-      <avp name="Media-Sub-Component">
-         <avp name="Flow-Number" data="2"/>
-         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2235 to 10.95.130.50 2235"/>
-         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2235 to 48.148.70.168 2235"/>
-         <avp name="Flow-Status" data="2" alias="ENABLED"/>
-         <avp name="Flow-Usage" data="1" alias="RTCP"/>
-      </avp>
-      <avp name="AF-Application-Identifier" hex-data="75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c"/>
-      <avp name="Media-Type" data="0" alias="OTHER"/>
-      <avp name="Max-Requested-Bandwidth-UL" data="128000"/>
-      <avp name="Max-Requested-Bandwidth-DL" data="128000"/>
-      <avp name="Flow-Status" data="2" alias="ENABLED"/>
-      <avp name="Reservation-Priority" data="3" alias="PRIORITY-THREE"/>
-      <avp name="RR-Bandwidth" data="64000"/>
-      <avp name="RS-Bandwidth" data="64000"/>
-   </avp>
-   <avp name="Media-Component-Description">
-      <avp name="Media-Component-Number" data="2"/>
-      <avp name="Media-Sub-Component">
-         <avp name="Flow-Number" data="1"/>
-         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2236 to 10.95.130.50 2236"/>
-         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2236 to 48.148.70.168 2236"/>
-         <avp name="Flow-Status" data="2" alias="ENABLED"/>
-         <avp name="Flow-Usage" data="0" alias="NO_INFORMATION"/>
-      </avp>
-      <avp name="Media-Sub-Component">
-         <avp name="Flow-Number" data="2"/>
-         <avp name="Flow-Description" data="permit in 17 from 48.148.70.168 2237 to 10.95.130.50 2237"/>
-         <avp name="Flow-Description" data="permit out 17 from 10.95.130.50 2237 to 48.148.70.168 2237"/>
-         <avp name="Flow-Status" data="2" alias="ENABLED"/>
-         <avp name="Flow-Usage" data="1" alias="RTCP"/>
-      </avp>
-      <avp name="AF-Application-Identifier" hex-data="75726e25334175726e2d787878253341336770702d736572766963652e696d732e696373692e6d6d74656c"/>
-      <avp name="Media-Type" data="1" alias="VIDEO"/>
-      <avp name="Max-Requested-Bandwidth-UL" data="128000"/>
-      <avp name="Max-Requested-Bandwidth-DL" data="128000"/>
-      <avp name="Flow-Status" data="2" alias="ENABLED"/>
-      <avp name="Reservation-Priority" data="4" alias="PRIORITY-FOUR"/>
-      <avp name="RR-Bandwidth" data="64000"/>
-      <avp name="RS-Bandwidth" data="64000"/>
-   </avp>
-   <avp name="AF-Charging-Identifier" hex-data="41462d4368617267696e674964656e746966696572"/>
-   <avp name="SIP-Forking-Indication" data="0" alias="SINGLE_DIALOGUE"/>
-   <avp name="Supported-Features" flags="192">
-      <avp name="Vendor-Id" data="10415"/>
-      <avp name="Feature-List-ID" data="1"/>
-      <avp name="Feature-List" data="19"/>
-   </avp>
-</message>
diff --git a/example/diameter/launcher/resources/stack_examples/0.xml b/example/diameter/launcher/resources/stack_examples/0.xml
deleted file mode 100644 (file)
index c1e23cc..0000000
+++ /dev/null
@@ -1,438 +0,0 @@
-<dictionary name="diameter_gen_base_rfc3588 | Application-Id: 0">
-   <vendor name="IETF" code="0"/>
-   <avp name="User-Name" code="1" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Class" code="25" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Session-Timeout" code="27" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Proxy-State" code="33" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Acct-Session-Id" code="44" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Acct-Multi-Session-Id" code="50" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Event-Timestamp" code="55" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Time"/>
-   </avp>
-   <avp name="Acct-Interim-Interval" code="85" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Host-IP-Address" code="257" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Address"/>
-   </avp>
-   <avp name="Auth-Application-Id" code="258" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Acct-Application-Id" code="259" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Vendor-Specific-Application-Id" code="260" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Vendor-Id" type="Mandatory" qual="1*"/>
-         <avprule id="Auth-Application-Id" type="Optional"/>
-         <avprule id="Acct-Application-Id" type="Optional"/>
-      </grouped>
-   </avp>
-   <avp name="Redirect-Host-Usage" code="261" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-6">
-         <label data="0" alias="DONT_CACHE"/>
-         <label data="1" alias="ALL_SESSION"/>
-         <label data="2" alias="ALL_REALM"/>
-         <label data="3" alias="REALM_AND_APPLICATION"/>
-         <label data="4" alias="ALL_APPLICATION"/>
-         <label data="5" alias="ALL_HOST"/>
-         <label data="6" alias="ALL_USER"/>
-      </single>
-   </avp>
-   <avp name="Redirect-Max-Cache-Time" code="262" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Session-Id" code="263" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Origin-Host" code="264" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Supported-Vendor-Id" code="265" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Vendor-Id" code="266" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Firmware-Revision" code="267" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Result-Code" code="268" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32">
-         <label data="1001" alias="DIAMETER_MULTI_ROUND_AUTH"/>
-         <label data="2001" alias="DIAMETER_SUCCESS"/>
-         <label data="2002" alias="DIAMETER_LIMITED_SUCCESS"/>
-         <label data="3001" alias="DIAMETER_COMMAND_UNSUPPORTED"/>
-         <label data="3002" alias="DIAMETER_UNABLE_TO_DELIVER"/>
-         <label data="3003" alias="DIAMETER_REALM_NOT_SERVED"/>
-         <label data="3004" alias="DIAMETER_TOO_BUSY"/>
-         <label data="3005" alias="DIAMETER_LOOP_DETECTED"/>
-         <label data="3006" alias="DIAMETER_REDIRECT_INDICATION"/>
-         <label data="3007" alias="DIAMETER_APPLICATION_UNSUPPORTED"/>
-         <label data="3008" alias="DIAMETER_INVALID_HDR_BITS"/>
-         <label data="3009" alias="DIAMETER_INVALID_AVP_BITS"/>
-         <label data="3010" alias="DIAMETER_UNKNOWN_PEER"/>
-         <label data="4001" alias="DIAMETER_AUTHENTICATION_REJECTED"/>
-         <label data="4002" alias="DIAMETER_OUT_OF_SPACE"/>
-         <label data="4003" alias="DIAMETER_ELECTION_LOST"/>
-         <label data="5001" alias="DIAMETER_AVP_UNSUPPORTED"/>
-         <label data="5002" alias="DIAMETER_UNKNOWN_SESSION_ID"/>
-         <label data="5003" alias="DIAMETER_AUTHORIZATION_REJECTED"/>
-         <label data="5004" alias="DIAMETER_INVALID_AVP_VALUE"/>
-         <label data="5005" alias="DIAMETER_MISSING_AVP"/>
-         <label data="5006" alias="DIAMETER_RESOURCES_EXCEEDED"/>
-         <label data="5007" alias="DIAMETER_CONTRADICTING_AVPS"/>
-         <label data="5008" alias="DIAMETER_AVP_NOT_ALLOWED"/>
-         <label data="5009" alias="DIAMETER_AVP_OCCURS_TOO_MANY_TIMES"/>
-         <label data="5010" alias="DIAMETER_NO_COMMON_APPLICATION"/>
-         <label data="5011" alias="DIAMETER_UNSUPPORTED_VERSION"/>
-         <label data="5012" alias="DIAMETER_UNABLE_TO_COMPLY"/>
-         <label data="5013" alias="DIAMETER_INVALID_BIT_IN_HEADER"/>
-         <label data="5014" alias="DIAMETER_INVALID_AVP_LENGTH"/>
-         <label data="5015" alias="DIAMETER_INVALID_MESSAGE_LENGTH"/>
-         <label data="5016" alias="DIAMETER_INVALID_AVP_BIT_COMBO"/>
-         <label data="5017" alias="DIAMETER_NO_COMMON_SECURITY"/>
-         <label data="5030" alias="DIAMETER_USER_UNKNOWN"/>
-         <label data="5063" alias="REQUESTED_SERVICE_NOT_AUTHORIZED"/>
-         <label data="5065" alias="IP_CAN_SESSION_NOT_AVAILABLE"/>
-      </single>
-   </avp>
-   <avp name="Product-Name" code="269" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Session-Binding" code="270" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Session-Server-Failover" code="271" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-3">
-         <label data="0" alias="REFUSE_SERVICE"/>
-         <label data="1" alias="TRY_AGAIN"/>
-         <label data="2" alias="ALLOW_SERVICE"/>
-         <label data="3" alias="TRY_AGAIN_ALLOW_SERVICE"/>
-      </single>
-   </avp>
-   <avp name="Multi-Round-Time-Out" code="272" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Disconnect-Cause" code="273" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-2">
-         <label data="0" alias="REBOOTING"/>
-         <label data="1" alias="BUSY"/>
-         <label data="2" alias="DO_NOT_WANT_TO_TALK_TO_YOU"/>
-      </single>
-   </avp>
-   <avp name="Auth-Request-Type" code="274" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-3">
-         <label data="1" alias="AUTHENTICATE_ONLY"/>
-         <label data="2" alias="AUTHORIZE_ONLY"/>
-         <label data="3" alias="AUTHORIZE_AUTHENTICATE"/>
-      </single>
-   </avp>
-   <avp name="Auth-Grace-Period" code="276" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Auth-Session-State" code="277" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="STATE_MAINTAINED"/>
-         <label data="1" alias="NO_STATE_MAINTAINED"/>
-      </single>
-   </avp>
-   <avp name="Origin-State-Id" code="278" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Failed-AVP" code="279" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="AVP" type="Mandatory" qual="1*"/>
-      </grouped>
-   </avp>
-   <avp name="Proxy-Host" code="280" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Error-Message" code="281" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Route-Record" code="282" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Destination-Realm" code="283" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Proxy-Info" code="284" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Proxy-Host" type="Mandatory"/>
-         <avprule id="Proxy-State" type="Mandatory"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Re-Auth-Request-Type" code="285" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="AUTHORIZE_ONLY"/>
-         <label data="1" alias="AUTHORIZE_AUTHENTICATE"/>
-      </single>
-   </avp>
-   <avp name="Accounting-Sub-Session-Id" code="287" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned64"/>
-   </avp>
-   <avp name="Redirect-Host" code="292" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterURI"/>
-   </avp>
-   <avp name="Destination-Host" code="293" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Error-Reporting-Host" code="294" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Termination-Cause" code="295" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-8">
-         <label data="1" alias="LOGOUT"/>
-         <label data="2" alias="SERVICE_NOT_PROVIDED"/>
-         <label data="3" alias="BAD_ANSWER"/>
-         <label data="4" alias="ADMINISTRATIVE"/>
-         <label data="5" alias="LINK_BROKEN"/>
-         <label data="6" alias="AUTH_EXPIRED"/>
-         <label data="7" alias="USER_MOVED"/>
-         <label data="8" alias="SESSION_TIMEOUT"/>
-      </single>
-   </avp>
-   <avp name="Origin-Realm" code="296" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Experimental-Result" code="297" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Vendor-Id" type="Mandatory"/>
-         <avprule id="Experimental-Result-Code" type="Mandatory"/>
-      </grouped>
-   </avp>
-   <avp name="Experimental-Result-Code" code="298" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Inband-Security-Id" code="299" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="E2E-Sequence" code="300" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="AVP" type="Mandatory" qual="2*"/>
-      </grouped>
-   </avp>
-   <avp name="Accounting-Record-Type" code="480" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-4">
-         <label data="1" alias="EVENT_RECORD"/>
-         <label data="2" alias="START_RECORD"/>
-         <label data="3" alias="INTERIM_RECORD"/>
-         <label data="4" alias="STOP_RECORD"/>
-      </single>
-   </avp>
-   <avp name="Accounting-Realtime-Required" code="483" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-3">
-         <label data="1" alias="DELIVER_AND_GRANT"/>
-         <label data="2" alias="GRANT_AND_STORE"/>
-         <label data="3" alias="GRANT_AND_LOSE"/>
-      </single>
-   </avp>
-   <avp name="Accounting-Record-Number" code="485" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <command name="CER" code="257" type="Request">
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Host-IP-Address" type="Mandatory" qual="1*"/>
-      <avprule id="Vendor-Id" type="Mandatory"/>
-      <avprule id="Product-Name" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Supported-Vendor-Id" type="Optional" qual="*"/>
-      <avprule id="Auth-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Inband-Security-Id" type="Optional" qual="*"/>
-      <avprule id="Acct-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Firmware-Revision" type="Optional"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="CEA" code="257" type="Answer">
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Host-IP-Address" type="Mandatory" qual="1*"/>
-      <avprule id="Vendor-Id" type="Mandatory"/>
-      <avprule id="Product-Name" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Supported-Vendor-Id" type="Optional" qual="*"/>
-      <avprule id="Auth-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Inband-Security-Id" type="Optional" qual="*"/>
-      <avprule id="Acct-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Firmware-Revision" type="Optional"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="RAR" code="258" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Mandatory"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Re-Auth-Request-Type" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="RAA" code="258" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host-Usage" type="Optional"/>
-      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ACR" code="271" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Accounting-Record-Type" type="Mandatory"/>
-      <avprule id="Accounting-Record-Number" type="Mandatory"/>
-      <avprule id="Acct-Application-Id" type="Optional"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Accounting-Sub-Session-Id" type="Optional"/>
-      <avprule id="Acct-Session-Id" type="Optional"/>
-      <avprule id="Acct-Multi-Session-Id" type="Optional"/>
-      <avprule id="Acct-Interim-Interval" type="Optional"/>
-      <avprule id="Accounting-Realtime-Required" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Event-Timestamp" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ACA" code="271" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Accounting-Record-Type" type="Mandatory"/>
-      <avprule id="Accounting-Record-Number" type="Mandatory"/>
-      <avprule id="Acct-Application-Id" type="Optional"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Accounting-Sub-Session-Id" type="Optional"/>
-      <avprule id="Acct-Session-Id" type="Optional"/>
-      <avprule id="Acct-Multi-Session-Id" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Acct-Interim-Interval" type="Optional"/>
-      <avprule id="Accounting-Realtime-Required" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Event-Timestamp" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ASR" code="274" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Mandatory"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ASA" code="274" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host-Usage" type="Optional"/>
-      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="STR" code="275" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Termination-Cause" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Destination-Host" type="Optional"/>
-      <avprule id="Class" type="Optional" qual="*"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="STA" code="275" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Class" type="Optional" qual="*"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Redirect-Host" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host-Usage" type="Optional"/>
-      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="DWR" code="280" type="Request">
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-   </command>
-   <command name="DWA" code="280" type="Answer">
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-   </command>
-   <command name="DPR" code="282" type="Request">
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Disconnect-Cause" type="Mandatory"/>
-   </command>
-   <command name="DPA" code="282" type="Answer">
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-   </command>
-</dictionary>
diff --git a/example/diameter/launcher/resources/stack_examples/16777236.xml b/example/diameter/launcher/resources/stack_examples/16777236.xml
deleted file mode 100644 (file)
index a0d53e3..0000000
+++ /dev/null
@@ -1,696 +0,0 @@
-<dictionary name="DictionaryRx | Application-Id: 16777236">
-   <vendor name="IETF" code="0"/>
-   <vendor name="3GPP" code="10415"/>
-   <vendor name="ETSI" code="13019"/>
-   <avp name="User-Name" code="1" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Framed-IP-Address" code="8" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Class" code="25" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Session-Timeout" code="27" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Called-Station-Id" code="30" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Proxy-State" code="33" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Acct-Session-Id" code="44" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Acct-Multi-Session-Id" code="50" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Event-Timestamp" code="55" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Time"/>
-   </avp>
-   <avp name="Acct-Interim-Interval" code="85" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Framed-IPv6-Prefix" code="97" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Host-IP-Address" code="257" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Address"/>
-   </avp>
-   <avp name="Auth-Application-Id" code="258" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Acct-Application-Id" code="259" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Vendor-Specific-Application-Id" code="260" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Vendor-Id" type="Mandatory" qual="1*"/>
-         <avprule id="Auth-Application-Id" type="Optional"/>
-         <avprule id="Acct-Application-Id" type="Optional"/>
-      </grouped>
-   </avp>
-   <avp name="Redirect-Host-Usage" code="261" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-6">
-         <label data="0" alias="DONT_CACHE"/>
-         <label data="1" alias="ALL_SESSION"/>
-         <label data="2" alias="ALL_REALM"/>
-         <label data="3" alias="REALM_AND_APPLICATION"/>
-         <label data="4" alias="ALL_APPLICATION"/>
-         <label data="5" alias="ALL_HOST"/>
-         <label data="6" alias="ALL_USER"/>
-      </single>
-   </avp>
-   <avp name="Redirect-Max-Cache-Time" code="262" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Session-Id" code="263" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Origin-Host" code="264" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Supported-Vendor-Id" code="265" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Vendor-Id" code="266" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Firmware-Revision" code="267" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Result-Code" code="268" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32">
-         <label data="1001" alias="DIAMETER_MULTI_ROUND_AUTH"/>
-         <label data="2001" alias="DIAMETER_SUCCESS"/>
-         <label data="2002" alias="DIAMETER_LIMITED_SUCCESS"/>
-         <label data="3001" alias="DIAMETER_COMMAND_UNSUPPORTED"/>
-         <label data="3002" alias="DIAMETER_UNABLE_TO_DELIVER"/>
-         <label data="3003" alias="DIAMETER_REALM_NOT_SERVED"/>
-         <label data="3004" alias="DIAMETER_TOO_BUSY"/>
-         <label data="3005" alias="DIAMETER_LOOP_DETECTED"/>
-         <label data="3006" alias="DIAMETER_REDIRECT_INDICATION"/>
-         <label data="3007" alias="DIAMETER_APPLICATION_UNSUPPORTED"/>
-         <label data="3008" alias="DIAMETER_INVALID_HDR_BITS"/>
-         <label data="3009" alias="DIAMETER_INVALID_AVP_BITS"/>
-         <label data="3010" alias="DIAMETER_UNKNOWN_PEER"/>
-         <label data="4001" alias="DIAMETER_AUTHENTICATION_REJECTED"/>
-         <label data="4002" alias="DIAMETER_OUT_OF_SPACE"/>
-         <label data="4003" alias="DIAMETER_ELECTION_LOST"/>
-         <label data="5001" alias="DIAMETER_AVP_UNSUPPORTED"/>
-         <label data="5002" alias="DIAMETER_UNKNOWN_SESSION_ID"/>
-         <label data="5003" alias="DIAMETER_AUTHORIZATION_REJECTED"/>
-         <label data="5004" alias="DIAMETER_INVALID_AVP_VALUE"/>
-         <label data="5005" alias="DIAMETER_MISSING_AVP"/>
-         <label data="5006" alias="DIAMETER_RESOURCES_EXCEEDED"/>
-         <label data="5007" alias="DIAMETER_CONTRADICTING_AVPS"/>
-         <label data="5008" alias="DIAMETER_AVP_NOT_ALLOWED"/>
-         <label data="5009" alias="DIAMETER_AVP_OCCURS_TOO_MANY_TIMES"/>
-         <label data="5010" alias="DIAMETER_NO_COMMON_APPLICATION"/>
-         <label data="5011" alias="DIAMETER_UNSUPPORTED_VERSION"/>
-         <label data="5012" alias="DIAMETER_UNABLE_TO_COMPLY"/>
-         <label data="5013" alias="DIAMETER_INVALID_BIT_IN_HEADER"/>
-         <label data="5014" alias="DIAMETER_INVALID_AVP_LENGTH"/>
-         <label data="5015" alias="DIAMETER_INVALID_MESSAGE_LENGTH"/>
-         <label data="5016" alias="DIAMETER_INVALID_AVP_BIT_COMBO"/>
-         <label data="5017" alias="DIAMETER_NO_COMMON_SECURITY"/>
-         <label data="5030" alias="DIAMETER_USER_UNKNOWN"/>
-         <label data="5063" alias="REQUESTED_SERVICE_NOT_AUTHORIZED"/>
-         <label data="5065" alias="IP_CAN_SESSION_NOT_AVAILABLE"/>
-      </single>
-   </avp>
-   <avp name="Product-Name" code="269" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Session-Binding" code="270" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Session-Server-Failover" code="271" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-3">
-         <label data="0" alias="REFUSE_SERVICE"/>
-         <label data="1" alias="TRY_AGAIN"/>
-         <label data="2" alias="ALLOW_SERVICE"/>
-         <label data="3" alias="TRY_AGAIN_ALLOW_SERVICE"/>
-      </single>
-   </avp>
-   <avp name="Multi-Round-Time-Out" code="272" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Disconnect-Cause" code="273" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-2">
-         <label data="0" alias="REBOOTING"/>
-         <label data="1" alias="BUSY"/>
-         <label data="2" alias="DO_NOT_WANT_TO_TALK_TO_YOU"/>
-      </single>
-   </avp>
-   <avp name="Auth-Request-Type" code="274" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-3">
-         <label data="1" alias="AUTHENTICATE_ONLY"/>
-         <label data="2" alias="AUTHORIZE_ONLY"/>
-         <label data="3" alias="AUTHORIZE_AUTHENTICATE"/>
-      </single>
-   </avp>
-   <avp name="Auth-Grace-Period" code="276" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Auth-Session-State" code="277" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="STATE_MAINTAINED"/>
-         <label data="1" alias="NO_STATE_MAINTAINED"/>
-      </single>
-   </avp>
-   <avp name="Origin-State-Id" code="278" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Failed-AVP" code="279" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="AVP" type="Mandatory" qual="1*"/>
-      </grouped>
-   </avp>
-   <avp name="Proxy-Host" code="280" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Error-Message" code="281" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Route-Record" code="282" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Destination-Realm" code="283" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Proxy-Info" code="284" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Proxy-Host" type="Mandatory"/>
-         <avprule id="Proxy-State" type="Mandatory"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Re-Auth-Request-Type" code="285" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="AUTHORIZE_ONLY"/>
-         <label data="1" alias="AUTHORIZE_AUTHENTICATE"/>
-      </single>
-   </avp>
-   <avp name="Accounting-Sub-Session-Id" code="287" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned64"/>
-   </avp>
-   <avp name="Redirect-Host" code="292" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterURI"/>
-   </avp>
-   <avp name="Destination-Host" code="293" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Error-Reporting-Host" code="294" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Termination-Cause" code="295" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-8">
-         <label data="1" alias="LOGOUT"/>
-         <label data="2" alias="SERVICE_NOT_PROVIDED"/>
-         <label data="3" alias="BAD_ANSWER"/>
-         <label data="4" alias="ADMINISTRATIVE"/>
-         <label data="5" alias="LINK_BROKEN"/>
-         <label data="6" alias="AUTH_EXPIRED"/>
-         <label data="7" alias="USER_MOVED"/>
-         <label data="8" alias="SESSION_TIMEOUT"/>
-      </single>
-   </avp>
-   <avp name="Origin-Realm" code="296" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Experimental-Result" code="297" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Vendor-Id" type="Mandatory"/>
-         <avprule id="Experimental-Result-Code" type="Mandatory"/>
-      </grouped>
-   </avp>
-   <avp name="Experimental-Result-Code" code="298" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Inband-Security-Id" code="299" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="E2E-Sequence" code="300" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="AVP" type="Mandatory" qual="2*"/>
-      </grouped>
-   </avp>
-   <avp name="Subscription-Id" code="443" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Subscription-Id-Type" type="Mandatory"/>
-         <avprule id="Subscription-Id-Data" type="Mandatory"/>
-      </grouped>
-   </avp>
-   <avp name="Subscription-Id-Data" code="444" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Subscription-Id-Type" code="450" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-4">
-         <label data="0" alias="END_USER_E164"/>
-         <label data="1" alias="END_USER_IMSI"/>
-         <label data="2" alias="END_USER_SIP_URI"/>
-         <label data="3" alias="END_USER_NAI"/>
-         <label data="4" alias="END_USER_PRIVATE"/>
-      </single>
-   </avp>
-   <avp name="Accounting-Record-Type" code="480" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-4">
-         <label data="1" alias="EVENT_RECORD"/>
-         <label data="2" alias="START_RECORD"/>
-         <label data="3" alias="INTERIM_RECORD"/>
-         <label data="4" alias="STOP_RECORD"/>
-      </single>
-   </avp>
-   <avp name="Accounting-Realtime-Required" code="483" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-3">
-         <label data="1" alias="DELIVER_AND_GRANT"/>
-         <label data="2" alias="GRANT_AND_STORE"/>
-         <label data="3" alias="GRANT_AND_LOSE"/>
-      </single>
-   </avp>
-   <avp name="Accounting-Record-Number" code="485" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Abort-Cause" code="500" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-4">
-         <label data="0" alias="BEARER_RELEASED"/>
-         <label data="1" alias="INSUFFICIENT_SERVER_RESOURCES"/>
-         <label data="2" alias="INSUFFICIENT_BEARER_RESOURCES"/>
-         <label data="3" alias="PS_TO_CS_HANDOVER"/>
-         <label data="4" alias="SPONSORED_DATA_CONNECTIVITY_DISALLOWED"/>
-      </single>
-   </avp>
-   <avp name="AF-Application-Identifier" code="504" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="AF-Charging-Identifier" code="505" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Flow-Description" code="507" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="IPFilterRule"/>
-   </avp>
-   <avp name="Flow-Number" code="509" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Flows" code="510" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Media-Component-Number" type="Mandatory"/>
-         <avprule id="Flow-Number" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Flow-Status" code="511" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-4">
-         <label data="0" alias="ENABLED-UPLINK"/>
-         <label data="1" alias="ENABLED-DOWNLINK"/>
-         <label data="2" alias="ENABLED"/>
-         <label data="3" alias="DISABLED"/>
-         <label data="4" alias="REMOVED"/>
-      </single>
-   </avp>
-   <avp name="Flow-Usage" code="512" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-2">
-         <label data="0" alias="NO_INFORMATION"/>
-         <label data="1" alias="RTCP"/>
-         <label data="2" alias="AF_SIGNALLING"/>
-      </single>
-   </avp>
-   <avp name="Specific-Action" code="513" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-4,6-14">
-         <label data="1" alias="CHARGING_CORRELATION_EXCHANGE"/>
-         <label data="2" alias="INDICATION_OF_LOSS_OF_BEARER"/>
-         <label data="3" alias="INDICATION_OF_RECOVERY_OF_BEARER"/>
-         <label data="4" alias="INDICATION_OF_RELEASE_OF_BEARER"/>
-         <label data="6" alias="IP-CAN_CHANGE"/>
-         <label data="7" alias="INDICATION_OF_OUT_OF_CREDIT"/>
-         <label data="8" alias="INDICATION_OF_SUCCESSFUL_RESOURCES_ALLOCATION"/>
-         <label data="9" alias="INDICATION_OF_FAILED_RESOURCES_ALLOCATION"/>
-         <label data="10" alias="INDICATION_OF_LIMITED_PCC_DEPLOYMENT"/>
-         <label data="11" alias="USAGE_REPORT"/>
-         <label data="12" alias="ACCESS_NETWORK_INFO_REPORT"/>
-         <label data="13" alias="INDICATION_OF_RECOVERY_FROM_LIMITED_PCC_DEPLOYMENT"/>
-         <label data="14" alias="INDICATION_OF_ACCESS_NETWORK_INFO_REPORTING_FAILURE"/>
-      </single>
-   </avp>
-   <avp name="Max-Requested-Bandwidth-DL" code="515" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Max-Requested-Bandwidth-UL" code="516" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Media-Component-Description" code="517" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Media-Component-Number" type="Mandatory"/>
-         <avprule id="Media-Sub-Component" type="Optional" qual="*"/>
-         <avprule id="AF-Application-Identifier" type="Optional"/>
-         <avprule id="Media-Type" type="Optional"/>
-         <avprule id="Max-Requested-Bandwidth-UL" type="Optional"/>
-         <avprule id="Max-Requested-Bandwidth-DL" type="Optional"/>
-         <avprule id="Min-Requested-Bandwidth-UL" type="Optional"/>
-         <avprule id="Min-Requested-Bandwidth-DL" type="Optional"/>
-         <avprule id="Flow-Status" type="Optional"/>
-         <avprule id="Reservation-Priority" type="Optional"/>
-         <avprule id="RS-Bandwidth" type="Optional"/>
-         <avprule id="RR-Bandwidth" type="Optional"/>
-         <avprule id="Codec-Data" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Media-Component-Number" code="518" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Media-Sub-Component" code="519" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Flow-Number" type="Mandatory"/>
-         <avprule id="Flow-Description" type="Optional" qual="0*2"/>
-         <avprule id="Flow-Status" type="Optional"/>
-         <avprule id="Flow-Usage" type="Optional"/>
-         <avprule id="Max-Requested-Bandwidth-UL" type="Optional"/>
-         <avprule id="Max-Requested-Bandwidth-DL" type="Optional"/>
-      </grouped>
-   </avp>
-   <avp name="Media-Type" code="520" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-6">
-         <label data="0" alias="OTHER"/>
-         <label data="1" alias="VIDEO"/>
-         <label data="2" alias="DATA"/>
-         <label data="3" alias="APPLICATION"/>
-         <label data="4" alias="CONTROL"/>
-         <label data="5" alias="TEXT"/>
-         <label data="6" alias="MESSAGE"/>
-      </single>
-   </avp>
-   <avp name="RR-Bandwidth" code="521" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="RS-Bandwidth" code="522" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="SIP-Forking-Indication" code="523" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="SINGLE_DIALOGUE"/>
-         <label data="1" alias="SEVERAL_DIALOGUES"/>
-      </single>
-   </avp>
-   <avp name="Codec-Data" code="524" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Service-URN" code="525" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Service-Info-Status" code="527" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="FINAL_SERVICE_INFORMATION"/>
-         <label data="1" alias="PRELIMINARY_SERVICE_INFORMATION"/>
-      </single>
-   </avp>
-   <avp name="MPS-Identifier" code="528" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="AF-Signalling-Protocol" code="529" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="NO_INFORMATION"/>
-         <label data="1" alias="SIP"/>
-      </single>
-   </avp>
-   <avp name="Rx-Request-Type" code="533" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="INITIAL_REQUEST"/>
-         <label data="1" alias="UPDATE_REQUEST"/>
-      </single>
-   </avp>
-   <avp name="Min-Requested-Bandwidth-DL" code="534" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Min-Requested-Bandwidth-UL" code="535" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Required-Access-Info" code="536" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="USER_LOCATION"/>
-         <label data="1" alias="MS_TIME_ZONE"/>
-      </single>
-   </avp>
-   <avp name="IP-Domain-Id" code="537" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Supported-Features" code="628" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="may" p-bit="mustnot">
-      <grouped>
-         <avprule id="Vendor-Id" type="Mandatory"/>
-         <avprule id="Feature-List-ID" type="Mandatory"/>
-         <avprule id="Feature-List" type="Mandatory"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Feature-List-ID" code="629" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Feature-List" code="630" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Reservation-Priority" code="458" vendor-name="ETSI" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-15">
-         <label data="0" alias="DEFAULT"/>
-         <label data="1" alias="PRIORITY-ONE"/>
-         <label data="2" alias="PRIORITY-TWO"/>
-         <label data="3" alias="PRIORITY-THREE"/>
-         <label data="4" alias="PRIORITY-FOUR"/>
-         <label data="5" alias="PRIORITY-FIVE"/>
-         <label data="6" alias="PRIORITY-SIX"/>
-         <label data="7" alias="PRIORITY-SEVEN"/>
-         <label data="8" alias="PRIORITY-EIGHT"/>
-         <label data="9" alias="PRIORITY-NINE"/>
-         <label data="10" alias="PRIORITY-TEN"/>
-         <label data="11" alias="PRIORITY-ELEVEN"/>
-         <label data="12" alias="PRIORITY-TWELVE"/>
-         <label data="13" alias="PRIORITY-THIRTEEN"/>
-         <label data="14" alias="PRIORITY-FOURTEEN"/>
-         <label data="15" alias="PRIORITY-FIFTEEN"/>
-      </single>
-   </avp>
-   <command name="CER" code="257" type="Request">
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Host-IP-Address" type="Mandatory" qual="1*"/>
-      <avprule id="Vendor-Id" type="Mandatory"/>
-      <avprule id="Product-Name" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Supported-Vendor-Id" type="Optional" qual="*"/>
-      <avprule id="Auth-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Inband-Security-Id" type="Optional" qual="*"/>
-      <avprule id="Acct-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Firmware-Revision" type="Optional"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="CEA" code="257" type="Answer">
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Host-IP-Address" type="Mandatory" qual="1*"/>
-      <avprule id="Vendor-Id" type="Mandatory"/>
-      <avprule id="Product-Name" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Supported-Vendor-Id" type="Optional" qual="*"/>
-      <avprule id="Auth-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Inband-Security-Id" type="Optional" qual="*"/>
-      <avprule id="Acct-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Firmware-Revision" type="Optional"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="RA-Request" code="258" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Mandatory"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Specific-Action" type="Mandatory" qual="*"/>
-      <avprule id="Flows" type="Optional" qual="*"/>
-      <avprule id="Abort-Cause" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-   </command>
-   <command name="RA-Answer" code="258" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Result-Code" type="Optional"/>
-      <avprule id="Experimental-Result" type="Optional"/>
-      <avprule id="Media-Component-Description" type="Optional" qual="*"/>
-      <avprule id="Service-URN" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Class" type="Optional" qual="*"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Redirect-Host" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host-Usage" type="Optional"/>
-      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="AA-Request" code="265" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Optional"/>
-      <avprule id="IP-Domain-Id" type="Optional"/>
-      <avprule id="AF-Application-Identifier" type="Optional"/>
-      <avprule id="Media-Component-Description" type="Optional" qual="*"/>
-      <avprule id="Service-Info-Status" type="Optional"/>
-      <avprule id="AF-Charging-Identifier" type="Optional"/>
-      <avprule id="SIP-Forking-Indication" type="Optional"/>
-      <avprule id="Specific-Action" type="Optional" qual="*"/>
-      <avprule id="Subscription-Id" type="Optional" qual="*"/>
-      <avprule id="Supported-Features" type="Optional" qual="*"/>
-      <avprule id="Reservation-Priority" type="Optional"/>
-      <avprule id="Framed-IP-Address" type="Optional"/>
-      <avprule id="Framed-IPv6-Prefix" type="Optional"/>
-      <avprule id="Called-Station-Id" type="Optional"/>
-      <avprule id="Service-URN" type="Optional"/>
-      <avprule id="MPS-Identifier" type="Optional"/>
-      <avprule id="Rx-Request-Type" type="Optional"/>
-      <avprule id="Required-Access-Info" type="Optional" qual="*"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="AA-Answer" code="265" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Result-Code" type="Optional"/>
-      <avprule id="Experimental-Result" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Supported-Features" type="Optional" qual="*"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-   </command>
-   <command name="ACR" code="271" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Accounting-Record-Type" type="Mandatory"/>
-      <avprule id="Accounting-Record-Number" type="Mandatory"/>
-      <avprule id="Acct-Application-Id" type="Optional"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Accounting-Sub-Session-Id" type="Optional"/>
-      <avprule id="Acct-Session-Id" type="Optional"/>
-      <avprule id="Acct-Multi-Session-Id" type="Optional"/>
-      <avprule id="Acct-Interim-Interval" type="Optional"/>
-      <avprule id="Accounting-Realtime-Required" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Event-Timestamp" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ACA" code="271" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Accounting-Record-Type" type="Mandatory"/>
-      <avprule id="Accounting-Record-Number" type="Mandatory"/>
-      <avprule id="Acct-Application-Id" type="Optional"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Accounting-Sub-Session-Id" type="Optional"/>
-      <avprule id="Acct-Session-Id" type="Optional"/>
-      <avprule id="Acct-Multi-Session-Id" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Acct-Interim-Interval" type="Optional"/>
-      <avprule id="Accounting-Realtime-Required" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Event-Timestamp" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="AS-Request" code="274" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Mandatory"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Abort-Cause" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-   </command>
-   <command name="AS-Answer" code="274" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Result-Code" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host-Usage" type="Optional"/>
-      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ST-Request" code="275" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Termination-Cause" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Optional"/>
-      <avprule id="Required-Access-Info" type="Optional" qual="*"/>
-      <avprule id="Class" type="Optional" qual="*"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ST-Answer" code="275" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Result-Code" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-   </command>
-   <command name="DWR" code="280" type="Request">
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-   </command>
-   <command name="DWA" code="280" type="Answer">
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-   </command>
-   <command name="DPR" code="282" type="Request">
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Disconnect-Cause" type="Mandatory"/>
-   </command>
-   <command name="DPA" code="282" type="Answer">
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-   </command>
-</dictionary>
diff --git a/example/diameter/launcher/resources/stack_examples/16777238.xml b/example/diameter/launcher/resources/stack_examples/16777238.xml
deleted file mode 100644 (file)
index efc5acd..0000000
+++ /dev/null
@@ -1,1270 +0,0 @@
-<dictionary name="DictionaryGx | Application-Id: 16777238">
-   <vendor name="IETF" code="0"/>
-   <vendor name="ERICSSON" code="193"/>
-   <vendor name="3GPP2" code="5535"/>
-   <vendor name="3GPP" code="10415"/>
-   <avp name="User-Name" code="1" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Framed-IP-Address" code="8" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Class" code="25" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Session-Timeout" code="27" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Called-Station-Id" code="30" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Proxy-State" code="33" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Acct-Session-Id" code="44" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Acct-Multi-Session-Id" code="50" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Event-Timestamp" code="55" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Time"/>
-   </avp>
-   <avp name="Acct-Interim-Interval" code="85" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Framed-IPv6-Prefix" code="97" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Host-IP-Address" code="257" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Address"/>
-   </avp>
-   <avp name="Auth-Application-Id" code="258" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Acct-Application-Id" code="259" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Vendor-Specific-Application-Id" code="260" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Vendor-Id" type="Mandatory" qual="1*"/>
-         <avprule id="Auth-Application-Id" type="Optional"/>
-         <avprule id="Acct-Application-Id" type="Optional"/>
-      </grouped>
-   </avp>
-   <avp name="Redirect-Host-Usage" code="261" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-6">
-         <label data="0" alias="DONT_CACHE"/>
-         <label data="1" alias="ALL_SESSION"/>
-         <label data="2" alias="ALL_REALM"/>
-         <label data="3" alias="REALM_AND_APPLICATION"/>
-         <label data="4" alias="ALL_APPLICATION"/>
-         <label data="5" alias="ALL_HOST"/>
-         <label data="6" alias="ALL_USER"/>
-      </single>
-   </avp>
-   <avp name="Redirect-Max-Cache-Time" code="262" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Session-Id" code="263" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Origin-Host" code="264" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Supported-Vendor-Id" code="265" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Vendor-Id" code="266" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Firmware-Revision" code="267" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Result-Code" code="268" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32">
-         <label data="1001" alias="DIAMETER_MULTI_ROUND_AUTH"/>
-         <label data="2001" alias="DIAMETER_SUCCESS"/>
-         <label data="2002" alias="DIAMETER_LIMITED_SUCCESS"/>
-         <label data="3001" alias="DIAMETER_COMMAND_UNSUPPORTED"/>
-         <label data="3002" alias="DIAMETER_UNABLE_TO_DELIVER"/>
-         <label data="3003" alias="DIAMETER_REALM_NOT_SERVED"/>
-         <label data="3004" alias="DIAMETER_TOO_BUSY"/>
-         <label data="3005" alias="DIAMETER_LOOP_DETECTED"/>
-         <label data="3006" alias="DIAMETER_REDIRECT_INDICATION"/>
-         <label data="3007" alias="DIAMETER_APPLICATION_UNSUPPORTED"/>
-         <label data="3008" alias="DIAMETER_INVALID_HDR_BITS"/>
-         <label data="3009" alias="DIAMETER_INVALID_AVP_BITS"/>
-         <label data="3010" alias="DIAMETER_UNKNOWN_PEER"/>
-         <label data="4001" alias="DIAMETER_AUTHENTICATION_REJECTED"/>
-         <label data="4002" alias="DIAMETER_OUT_OF_SPACE"/>
-         <label data="4003" alias="DIAMETER_ELECTION_LOST"/>
-         <label data="5001" alias="DIAMETER_AVP_UNSUPPORTED"/>
-         <label data="5002" alias="DIAMETER_UNKNOWN_SESSION_ID"/>
-         <label data="5003" alias="DIAMETER_AUTHORIZATION_REJECTED"/>
-         <label data="5004" alias="DIAMETER_INVALID_AVP_VALUE"/>
-         <label data="5005" alias="DIAMETER_MISSING_AVP"/>
-         <label data="5006" alias="DIAMETER_RESOURCES_EXCEEDED"/>
-         <label data="5007" alias="DIAMETER_CONTRADICTING_AVPS"/>
-         <label data="5008" alias="DIAMETER_AVP_NOT_ALLOWED"/>
-         <label data="5009" alias="DIAMETER_AVP_OCCURS_TOO_MANY_TIMES"/>
-         <label data="5010" alias="DIAMETER_NO_COMMON_APPLICATION"/>
-         <label data="5011" alias="DIAMETER_UNSUPPORTED_VERSION"/>
-         <label data="5012" alias="DIAMETER_UNABLE_TO_COMPLY"/>
-         <label data="5013" alias="DIAMETER_INVALID_BIT_IN_HEADER"/>
-         <label data="5014" alias="DIAMETER_INVALID_AVP_LENGTH"/>
-         <label data="5015" alias="DIAMETER_INVALID_MESSAGE_LENGTH"/>
-         <label data="5016" alias="DIAMETER_INVALID_AVP_BIT_COMBO"/>
-         <label data="5017" alias="DIAMETER_NO_COMMON_SECURITY"/>
-         <label data="5030" alias="DIAMETER_USER_UNKNOWN"/>
-         <label data="5063" alias="REQUESTED_SERVICE_NOT_AUTHORIZED"/>
-         <label data="5065" alias="IP_CAN_SESSION_NOT_AVAILABLE"/>
-      </single>
-   </avp>
-   <avp name="Product-Name" code="269" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Session-Binding" code="270" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Session-Server-Failover" code="271" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-3">
-         <label data="0" alias="REFUSE_SERVICE"/>
-         <label data="1" alias="TRY_AGAIN"/>
-         <label data="2" alias="ALLOW_SERVICE"/>
-         <label data="3" alias="TRY_AGAIN_ALLOW_SERVICE"/>
-      </single>
-   </avp>
-   <avp name="Multi-Round-Time-Out" code="272" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Disconnect-Cause" code="273" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-2">
-         <label data="0" alias="REBOOTING"/>
-         <label data="1" alias="BUSY"/>
-         <label data="2" alias="DO_NOT_WANT_TO_TALK_TO_YOU"/>
-      </single>
-   </avp>
-   <avp name="Auth-Request-Type" code="274" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-3">
-         <label data="1" alias="AUTHENTICATE_ONLY"/>
-         <label data="2" alias="AUTHORIZE_ONLY"/>
-         <label data="3" alias="AUTHORIZE_AUTHENTICATE"/>
-      </single>
-   </avp>
-   <avp name="Auth-Grace-Period" code="276" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Auth-Session-State" code="277" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="STATE_MAINTAINED"/>
-         <label data="1" alias="NO_STATE_MAINTAINED"/>
-      </single>
-   </avp>
-   <avp name="Origin-State-Id" code="278" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Failed-AVP" code="279" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="AVP" type="Mandatory" qual="1*"/>
-      </grouped>
-   </avp>
-   <avp name="Proxy-Host" code="280" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Error-Message" code="281" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Route-Record" code="282" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Destination-Realm" code="283" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Proxy-Info" code="284" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Proxy-Host" type="Mandatory"/>
-         <avprule id="Proxy-State" type="Mandatory"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Re-Auth-Request-Type" code="285" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="AUTHORIZE_ONLY"/>
-         <label data="1" alias="AUTHORIZE_AUTHENTICATE"/>
-      </single>
-   </avp>
-   <avp name="Accounting-Sub-Session-Id" code="287" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned64"/>
-   </avp>
-   <avp name="Redirect-Host" code="292" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterURI"/>
-   </avp>
-   <avp name="Destination-Host" code="293" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Error-Reporting-Host" code="294" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Termination-Cause" code="295" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-8">
-         <label data="1" alias="LOGOUT"/>
-         <label data="2" alias="SERVICE_NOT_PROVIDED"/>
-         <label data="3" alias="BAD_ANSWER"/>
-         <label data="4" alias="ADMINISTRATIVE"/>
-         <label data="5" alias="LINK_BROKEN"/>
-         <label data="6" alias="AUTH_EXPIRED"/>
-         <label data="7" alias="USER_MOVED"/>
-         <label data="8" alias="SESSION_TIMEOUT"/>
-      </single>
-   </avp>
-   <avp name="Origin-Realm" code="296" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Experimental-Result" code="297" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Vendor-Id" type="Mandatory"/>
-         <avprule id="Experimental-Result-Code" type="Mandatory"/>
-      </grouped>
-   </avp>
-   <avp name="Experimental-Result-Code" code="298" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Inband-Security-Id" code="299" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="E2E-Sequence" code="300" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="AVP" type="Mandatory" qual="2*"/>
-      </grouped>
-   </avp>
-   <avp name="CC-Input-Octets" code="412" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned64"/>
-   </avp>
-   <avp name="CC-Output-Octets" code="414" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned64"/>
-   </avp>
-   <avp name="CC-Request-Number" code="415" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="CC-Request-Type" code="416" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-4">
-         <label data="1" alias="INITIAL_REQUEST"/>
-         <label data="2" alias="UPDATE_REQUEST"/>
-         <label data="3" alias="TERMINATION_REQUEST"/>
-         <label data="4" alias="EVENT_REQUEST"/>
-      </single>
-   </avp>
-   <avp name="CC-Time" code="420" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="CC-Total-Octets" code="421" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned64"/>
-   </avp>
-   <avp name="Granted-Service-Unit" code="431" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <grouped>
-         <avprule id="CC-Total-Octets" type="Optional"/>
-         <avprule id="CC-Time" type="Optional"/>
-         <avprule id="CC-Input-Octets" type="Optional"/>
-         <avprule id="CC-Output-Octets" type="Optional"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Rating-Group" code="432" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Redirect-Server-Address" code="435" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Service-Identifier" code="439" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Subscription-Id" code="443" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Subscription-Id-Type" type="Mandatory"/>
-         <avprule id="Subscription-Id-Data" type="Mandatory"/>
-      </grouped>
-   </avp>
-   <avp name="Subscription-Id-Data" code="444" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Used-Service-Unit" code="446" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <grouped>
-         <avprule id="CC-Total-Octets" type="Optional"/>
-         <avprule id="CC-Time" type="Optional"/>
-         <avprule id="CC-Input-Octets" type="Optional"/>
-         <avprule id="CC-Output-Octets" type="Optional"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Subscription-Id-Type" code="450" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-4">
-         <label data="0" alias="END_USER_E164"/>
-         <label data="1" alias="END_USER_IMSI"/>
-         <label data="2" alias="END_USER_SIP_URI"/>
-         <label data="3" alias="END_USER_NAI"/>
-         <label data="4" alias="END_USER_PRIVATE"/>
-      </single>
-   </avp>
-   <avp name="User-Equipment-Info" code="458" may-encrypt="yes" v-bit="mustnot" m-bit="may" p-bit="mustnot">
-      <grouped>
-         <avprule id="User-Equipment-Info-Type" type="Mandatory"/>
-         <avprule id="User-Equipment-Info-Value" type="Mandatory"/>
-      </grouped>
-   </avp>
-   <avp name="User-Equipment-Info-Type" code="459" may-encrypt="yes" v-bit="mustnot" m-bit="may" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-3">
-         <label data="0" alias="IMEISV"/>
-         <label data="1" alias="MAC"/>
-         <label data="2" alias="EUI64"/>
-         <label data="3" alias="MODIFIED_EUI64"/>
-      </single>
-   </avp>
-   <avp name="User-Equipment-Info-Value" code="460" may-encrypt="yes" v-bit="mustnot" m-bit="may" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Accounting-Record-Type" code="480" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-4">
-         <label data="1" alias="EVENT_RECORD"/>
-         <label data="2" alias="START_RECORD"/>
-         <label data="3" alias="INTERIM_RECORD"/>
-         <label data="4" alias="STOP_RECORD"/>
-      </single>
-   </avp>
-   <avp name="Accounting-Realtime-Required" code="483" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-3">
-         <label data="1" alias="DELIVER_AND_GRANT"/>
-         <label data="2" alias="GRANT_AND_STORE"/>
-         <label data="3" alias="GRANT_AND_LOSE"/>
-      </single>
-   </avp>
-   <avp name="Accounting-Record-Number" code="485" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Rule-Space-Suggestion" code="290" vendor-name="ERICSSON" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Authorization-State" code="1056" vendor-name="ERICSSON" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-12">
-         <label data="0" alias="AUTHORIZED"/>
-         <label data="1" alias="DENIED_CALENDAR_TIME"/>
-         <label data="2" alias="DENIED_ROAMING"/>
-         <label data="3" alias="DENIED_QUALITY_OF_SERVICE"/>
-         <label data="4" alias="DENIED_BLACKLISTED"/>
-         <label data="5" alias="DENIED_TERMINAL"/>
-         <label data="6" alias="DENIED_OPERATOR_REASON_ONE"/>
-         <label data="7" alias="DENIED_OPERATOR_REASON_TWO"/>
-         <label data="8" alias="DENIED_OPERATOR_REASON_THREE"/>
-         <label data="9" alias="DENIED_OPERATOR_REASON_FOUR"/>
-         <label data="10" alias="DENIED_OPERATOR_REASON_FIVE"/>
-         <label data="11" alias="DENIED_UNKNOWN_REASON"/>
-         <label data="12" alias="DENIED_USAGE_CONTROL"/>
-      </single>
-   </avp>
-   <avp name="Gx-Capability-List" code="1060" vendor-name="ERICSSON" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Content-Filtering-Profile-Id" code="1138" vendor-name="ERICSSON" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="3GPP2-BSID" code="9010" vendor-name="3GPP2" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="3GPP-SGSN-Address" code="6" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="3GPP-Charging-Characteristics" code="13" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="3GPP-SGSN-IPv6-Address" code="15" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="3GPP-SGSN-MCC-MNC" code="18" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="3GPP-RAT-Type" code="21" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="3GPP-User-Location-Info" code="22" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="3GPP-MS-TimeZone" code="23" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Access-Network-Charging-Address" code="501" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Address"/>
-   </avp>
-   <avp name="Access-Network-Charging-Identifier-Value" code="503" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="AF-Charging-Identifier" code="505" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Flow-Description" code="507" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="IPFilterRule"/>
-   </avp>
-   <avp name="Flow-Number" code="509" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Flows" code="510" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Media-Component-Number" type="Mandatory"/>
-         <avprule id="Flow-Number" type="Optional" qual="*"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Flow-Status" code="511" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-4">
-         <label data="0" alias="ENABLED-UPLINK"/>
-         <label data="1" alias="ENABLED-DOWNLINK"/>
-         <label data="2" alias="ENABLED"/>
-         <label data="3" alias="DISABLED"/>
-         <label data="4" alias="REMOVED"/>
-      </single>
-   </avp>
-   <avp name="Max-Requested-Bandwidth-DL" code="515" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Max-Requested-Bandwidth-UL" code="516" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Media-Component-Number" code="518" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Charging-Information" code="618" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Primary-Event-Charging-Function-Name" type="Optional"/>
-         <avprule id="Secondary-Event-Charging-Function-Name" type="Optional"/>
-         <avprule id="Primary-Charging-Collection-Function-Name" type="Optional"/>
-         <avprule id="Secondary-Charging-Collection-Function-Name" type="Optional"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Primary-Event-Charging-Function-Name" code="619" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterURI"/>
-   </avp>
-   <avp name="Secondary-Event-Charging-Function-Name" code="620" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterURI"/>
-   </avp>
-   <avp name="Primary-Charging-Collection-Function-Name" code="621" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterURI"/>
-   </avp>
-   <avp name="Secondary-Charging-Collection-Function-Name" code="622" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterURI"/>
-   </avp>
-   <avp name="Supported-Features" code="628" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="may" p-bit="mustnot">
-      <grouped>
-         <avprule id="Vendor-Id" type="Mandatory"/>
-         <avprule id="Feature-List-ID" type="Mandatory"/>
-         <avprule id="Feature-List" type="Mandatory"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Feature-List-ID" code="629" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Feature-List" code="630" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="RAI" code="909" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Bearer-Usage" code="1000" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="GENERAL"/>
-         <label data="1" alias="IMS_SIGNALLING"/>
-      </single>
-   </avp>
-   <avp name="Charging-Rule-Install" code="1001" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Charging-Rule-Definition" type="Optional" qual="*"/>
-         <avprule id="Charging-Rule-Name" type="Optional" qual="*"/>
-         <avprule id="Charging-Rule-Base-Name" type="Optional" qual="*"/>
-         <avprule id="Charging-Rule-Authorization" type="Optional" qual="*"/>
-         <avprule id="Bearer-Identifier" type="Optional"/>
-         <avprule id="Rule-Activation-Time" type="Optional"/>
-         <avprule id="Rule-DeActivation-Time" type="Optional"/>
-         <avprule id="Resource-Allocation-Notification" type="Optional"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Charging-Rule-Remove" code="1002" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Charging-Rule-Name" type="Optional" qual="*"/>
-         <avprule id="Charging-Rule-Base-Name" type="Optional" qual="*"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Charging-Rule-Definition" code="1003" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Charging-Rule-Name" type="Mandatory"/>
-         <avprule id="Service-Identifier" type="Optional"/>
-         <avprule id="Rating-Group" type="Optional"/>
-         <avprule id="Flow-Information" type="Optional" qual="*"/>
-         <avprule id="Flow-Status" type="Optional"/>
-         <avprule id="QoS-Information" type="Optional"/>
-         <avprule id="Reporting-Level" type="Optional"/>
-         <avprule id="Online" type="Optional"/>
-         <avprule id="Offline" type="Optional"/>
-         <avprule id="Metering-Method" type="Optional"/>
-         <avprule id="Precedence" type="Optional"/>
-         <avprule id="AF-Charging-Identifier" type="Optional"/>
-         <avprule id="Flows" type="Optional" qual="*"/>
-         <avprule id="Monitoring-Key" type="Optional"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Charging-Rule-Base-Name" code="1004" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Charging-Rule-Name" code="1005" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Event-Trigger" code="1006" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-2,4-4,7-7,12-13,15-17,20-22,25-27,29-29,33-34">
-         <label data="0" alias="SGSN_CHANGE"/>
-         <label data="1" alias="QOS_CHANGE"/>
-         <label data="2" alias="RAT_CHANGE"/>
-         <label data="4" alias="PLMN_CHANGE"/>
-         <label data="7" alias="IP-CAN-CHANGE"/>
-         <label data="12" alias="RAI_CHANGE"/>
-         <label data="13" alias="USER_LOCATION_CHANGE"/>
-         <label data="15" alias="OUT_OF_CREDIT"/>
-         <label data="16" alias="REALLOCATION_OF_CREDIT"/>
-         <label data="17" alias="REVALIDATION_TIMEOUT"/>
-         <label data="20" alias="DEFAULT_EPS_BEARER_QOS_CHANGE"/>
-         <label data="21" alias="AN_GW_CHANGE"/>
-         <label data="22" alias="SUCCESSFUL_RESOURCE_ALLOCATION"/>
-         <label data="25" alias="UE_TIME_ZONE_CHANGE"/>
-         <label data="26" alias="TAI_CHANGE"/>
-         <label data="27" alias="ECGI_CHANGE"/>
-         <label data="29" alias="APN-AMBR_MODIFICATION_FAILURE"/>
-         <label data="33" alias="USAGE_REPORT"/>
-         <label data="34" alias="DEFAULT-EPS-BEARER-QOS_MODIFICATION_FAILURE"/>
-      </single>
-   </avp>
-   <avp name="Metering-Method" code="1007" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-2">
-         <label data="0" alias="DURATION"/>
-         <label data="1" alias="VOLUME"/>
-         <label data="2" alias="DURATION_VOLUME"/>
-      </single>
-   </avp>
-   <avp name="Offline" code="1008" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="DISABLE_OFFLINE"/>
-         <label data="1" alias="ENABLE_OFFLINE"/>
-      </single>
-   </avp>
-   <avp name="Online" code="1009" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="DISABLE_ONLINE"/>
-         <label data="1" alias="ENABLE_ONLINE"/>
-      </single>
-   </avp>
-   <avp name="Precedence" code="1010" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Reporting-Level" code="1011" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="SERVICE_IDENTIFIER_LEVEL"/>
-         <label data="1" alias="RATING_GROUP_LEVEL"/>
-      </single>
-   </avp>
-   <avp name="ToS-Traffic-Class" code="1014" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="QoS-Information" code="1016" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="QoS-Class-Identifier" type="Optional"/>
-         <avprule id="Max-Requested-Bandwidth-UL" type="Optional"/>
-         <avprule id="Max-Requested-Bandwidth-DL" type="Optional"/>
-         <avprule id="Guaranteed-Bitrate-UL" type="Optional"/>
-         <avprule id="Guaranteed-Bitrate-DL" type="Optional"/>
-         <avprule id="Bearer-Identifier" type="Optional"/>
-         <avprule id="Allocation-Retention-Priority" type="Optional"/>
-         <avprule id="APN-Aggregate-Max-Bitrate-UL" type="Optional"/>
-         <avprule id="APN-Aggregate-Max-Bitrate-DL" type="Optional"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Charging-Rule-Report" code="1018" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Charging-Rule-Name" type="Optional" qual="*"/>
-         <avprule id="Charging-Rule-Base-Name" type="Optional" qual="*"/>
-         <avprule id="PCC-Rule-Status" type="Optional"/>
-         <avprule id="Rule-Failure-Code" type="Optional"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="PCC-Rule-Status" code="1019" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-2">
-         <label data="0" alias="ACTIVE"/>
-         <label data="1" alias="INACTIVE"/>
-         <label data="2" alias="TEMPORARILY_INACTIVE"/>
-      </single>
-   </avp>
-   <avp name="Bearer-Identifier" code="1020" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Bearer-Operation" code="1021" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-2">
-         <label data="0" alias="TERMINATION"/>
-         <label data="1" alias="ESTABLISHMENT"/>
-         <label data="2" alias="MODIFICATION"/>
-      </single>
-   </avp>
-   <avp name="Access-Network-Charging-Identifier-Gx" code="1022" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Access-Network-Charging-Identifier-Value" type="Mandatory"/>
-         <avprule id="Charging-Rule-Base-Name" type="Optional" qual="*"/>
-         <avprule id="Charging-Rule-Name" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Bearer-Control-Mode" code="1023" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-2">
-         <label data="0" alias="UE_ONLY"/>
-         <label data="1" alias="RESERVED"/>
-         <label data="2" alias="UE_NW"/>
-      </single>
-   </avp>
-   <avp name="Network-Request-Support" code="1024" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="NETWORK_REQUEST_NOT_SUPPORTED"/>
-         <label data="1" alias="NETWORK_REQUEST_SUPPORTED"/>
-      </single>
-   </avp>
-   <avp name="Guaranteed-Bitrate-DL" code="1025" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Guaranteed-Bitrate-UL" code="1026" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="IP-CAN-Type" code="1027" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-6">
-         <label data="0" alias="3GPP-GPRS"/>
-         <label data="1" alias="DOCSIS"/>
-         <label data="2" alias="xDSL"/>
-         <label data="3" alias="WiMAX"/>
-         <label data="4" alias="3GPP2"/>
-         <label data="5" alias="3GPP-EPS"/>
-         <label data="6" alias="Non-3GPP-EPS"/>
-      </single>
-   </avp>
-   <avp name="QoS-Class-Identifier" code="1028" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-9,128-254">
-         <label data="1" alias="QCI_1"/>
-         <label data="2" alias="QCI_2"/>
-         <label data="3" alias="QCI_3"/>
-         <label data="4" alias="QCI_4"/>
-         <label data="5" alias="QCI_5"/>
-         <label data="6" alias="QCI_6"/>
-         <label data="7" alias="QCI_7"/>
-         <label data="8" alias="QCI_8"/>
-         <label data="9" alias="QCI_9"/>
-         <label data="128" alias="QCI_128"/>
-         <label data="129" alias="QCI_129"/>
-         <label data="130" alias="QCI_130"/>
-         <label data="131" alias="QCI_131"/>
-         <label data="132" alias="QCI_132"/>
-         <label data="133" alias="QCI_133"/>
-         <label data="134" alias="QCI_134"/>
-         <label data="135" alias="QCI_135"/>
-         <label data="136" alias="QCI_136"/>
-         <label data="137" alias="QCI_137"/>
-         <label data="138" alias="QCI_138"/>
-         <label data="139" alias="QCI_139"/>
-         <label data="140" alias="QCI_140"/>
-         <label data="141" alias="QCI_141"/>
-         <label data="142" alias="QCI_142"/>
-         <label data="143" alias="QCI_143"/>
-         <label data="144" alias="QCI_144"/>
-         <label data="145" alias="QCI_145"/>
-         <label data="146" alias="QCI_146"/>
-         <label data="147" alias="QCI_147"/>
-         <label data="148" alias="QCI_148"/>
-         <label data="149" alias="QCI_149"/>
-         <label data="150" alias="QCI_150"/>
-         <label data="151" alias="QCI_151"/>
-         <label data="152" alias="QCI_152"/>
-         <label data="153" alias="QCI_153"/>
-         <label data="154" alias="QCI_154"/>
-         <label data="155" alias="QCI_155"/>
-         <label data="156" alias="QCI_156"/>
-         <label data="157" alias="QCI_157"/>
-         <label data="158" alias="QCI_158"/>
-         <label data="159" alias="QCI_159"/>
-         <label data="160" alias="QCI_160"/>
-         <label data="161" alias="QCI_161"/>
-         <label data="162" alias="QCI_162"/>
-         <label data="163" alias="QCI_163"/>
-         <label data="164" alias="QCI_164"/>
-         <label data="165" alias="QCI_165"/>
-         <label data="166" alias="QCI_166"/>
-         <label data="167" alias="QCI_167"/>
-         <label data="168" alias="QCI_168"/>
-         <label data="169" alias="QCI_169"/>
-         <label data="170" alias="QCI_170"/>
-         <label data="171" alias="QCI_171"/>
-         <label data="172" alias="QCI_172"/>
-         <label data="173" alias="QCI_173"/>
-         <label data="174" alias="QCI_174"/>
-         <label data="175" alias="QCI_175"/>
-         <label data="176" alias="QCI_176"/>
-         <label data="177" alias="QCI_177"/>
-         <label data="178" alias="QCI_178"/>
-         <label data="179" alias="QCI_179"/>
-         <label data="180" alias="QCI_180"/>
-         <label data="181" alias="QCI_181"/>
-         <label data="182" alias="QCI_182"/>
-         <label data="183" alias="QCI_183"/>
-         <label data="184" alias="QCI_184"/>
-         <label data="185" alias="QCI_185"/>
-         <label data="186" alias="QCI_186"/>
-         <label data="187" alias="QCI_187"/>
-         <label data="188" alias="QCI_188"/>
-         <label data="189" alias="QCI_189"/>
-         <label data="190" alias="QCI_190"/>
-         <label data="191" alias="QCI_191"/>
-         <label data="192" alias="QCI_192"/>
-         <label data="193" alias="QCI_193"/>
-         <label data="194" alias="QCI_194"/>
-         <label data="195" alias="QCI_195"/>
-         <label data="196" alias="QCI_196"/>
-         <label data="197" alias="QCI_197"/>
-         <label data="198" alias="QCI_198"/>
-         <label data="199" alias="QCI_199"/>
-         <label data="200" alias="QCI_200"/>
-         <label data="201" alias="QCI_201"/>
-         <label data="202" alias="QCI_202"/>
-         <label data="203" alias="QCI_203"/>
-         <label data="204" alias="QCI_204"/>
-         <label data="205" alias="QCI_205"/>
-         <label data="206" alias="QCI_206"/>
-         <label data="207" alias="QCI_207"/>
-         <label data="208" alias="QCI_208"/>
-         <label data="209" alias="QCI_209"/>
-         <label data="210" alias="QCI_210"/>
-         <label data="211" alias="QCI_211"/>
-         <label data="212" alias="QCI_212"/>
-         <label data="213" alias="QCI_213"/>
-         <label data="214" alias="QCI_214"/>
-         <label data="215" alias="QCI_215"/>
-         <label data="216" alias="QCI_216"/>
-         <label data="217" alias="QCI_217"/>
-         <label data="218" alias="QCI_218"/>
-         <label data="219" alias="QCI_219"/>
-         <label data="220" alias="QCI_220"/>
-         <label data="221" alias="QCI_221"/>
-         <label data="222" alias="QCI_222"/>
-         <label data="223" alias="QCI_223"/>
-         <label data="224" alias="QCI_224"/>
-         <label data="225" alias="QCI_225"/>
-         <label data="226" alias="QCI_226"/>
-         <label data="227" alias="QCI_227"/>
-         <label data="228" alias="QCI_228"/>
-         <label data="229" alias="QCI_229"/>
-         <label data="230" alias="QCI_230"/>
-         <label data="231" alias="QCI_231"/>
-         <label data="232" alias="QCI_232"/>
-         <label data="233" alias="QCI_233"/>
-         <label data="234" alias="QCI_234"/>
-         <label data="235" alias="QCI_235"/>
-         <label data="236" alias="QCI_236"/>
-         <label data="237" alias="QCI_237"/>
-         <label data="238" alias="QCI_238"/>
-         <label data="239" alias="QCI_239"/>
-         <label data="240" alias="QCI_240"/>
-         <label data="241" alias="QCI_241"/>
-         <label data="242" alias="QCI_242"/>
-         <label data="243" alias="QCI_243"/>
-         <label data="244" alias="QCI_244"/>
-         <label data="245" alias="QCI_245"/>
-         <label data="246" alias="QCI_246"/>
-         <label data="247" alias="QCI_247"/>
-         <label data="248" alias="QCI_248"/>
-         <label data="249" alias="QCI_249"/>
-         <label data="250" alias="QCI_250"/>
-         <label data="251" alias="QCI_251"/>
-         <label data="252" alias="QCI_252"/>
-         <label data="253" alias="QCI_253"/>
-         <label data="254" alias="QCI_254"/>
-      </single>
-   </avp>
-   <avp name="QoS-Negotiation" code="1029" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="NO_QoS_NEGOTIATION"/>
-         <label data="1" alias="QoS_NEGOTIATION_SUPPORTED"/>
-      </single>
-   </avp>
-   <avp name="QoS-Upgrade" code="1030" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="QoS_UPGRADE_NOT_SUPPORTED"/>
-         <label data="1" alias="QoS_UPGRADE_SUPPORTED"/>
-      </single>
-   </avp>
-   <avp name="Rule-Failure-Code" code="1031" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-13,15">
-         <label data="1" alias="UNKNOWN_RULE_NAME"/>
-         <label data="2" alias="RATING_GROUP_ERROR"/>
-         <label data="3" alias="SERVICE_IDENTIFIER_ERROR"/>
-         <label data="4" alias="GWPCEF_MALFUNCTION"/>
-         <label data="5" alias="RESOURCES_LIMITATION"/>
-         <label data="6" alias="MAX_NR_BEARERS_REACHED"/>
-         <label data="7" alias="UNKNOWN_BEARER_ID"/>
-         <label data="8" alias="MISSING_BEARER_ID"/>
-         <label data="9" alias="MISSING_FLOW_INFORMATION"/>
-         <label data="10" alias="RESOURCE_ALLOCATION_FAILURE"/>
-         <label data="11" alias="UNSUCCESSFUL_QOS_VALIDATION"/>
-         <label data="12" alias="INCORRECT_FLOW_INFORMATION"/>
-         <label data="13" alias="PS_TO_CS_HANDOVER"/>
-         <label data="15" alias="NO_BEARER_BOUND"/>
-      </single>
-   </avp>
-   <avp name="RAT-Type" code="1032" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1,1000-1004,2000-2003">
-         <label data="0" alias="WLAN"/>
-         <label data="1" alias="VIRTUAL"/>
-         <label data="1000" alias="UTRAN"/>
-         <label data="1001" alias="GERAN"/>
-         <label data="1002" alias="GAN"/>
-         <label data="1003" alias="HSPA_EVOLUTION"/>
-         <label data="1004" alias="EUTRAN"/>
-         <label data="2000" alias="CDMA2000_1X"/>
-         <label data="2001" alias="HRPD"/>
-         <label data="2002" alias="UMB"/>
-         <label data="2003" alias="EHRPD"/>
-      </single>
-   </avp>
-   <avp name="Allocation-Retention-Priority" code="1034" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <grouped>
-         <avprule id="Priority-Level" type="Mandatory"/>
-         <avprule id="Pre-emption-Capability" type="Optional"/>
-         <avprule id="Pre-emption-Vulnerability" type="Optional"/>
-      </grouped>
-   </avp>
-   <avp name="APN-Aggregate-Max-Bitrate-DL" code="1040" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="APN-Aggregate-Max-Bitrate-UL" code="1041" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Revalidation-Time" code="1042" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Rule-Activation-Time" code="1043" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Rule-DeActivation-Time" code="1044" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Session-Release-Cause" code="1045" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="UNSPECIFIED_REASON"/>
-         <label data="1" alias="UE_SUBSCRIPTION_REASON"/>
-      </single>
-   </avp>
-   <avp name="Priority-Level" code="1046" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Pre-emption-Capability" code="1047" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="PRE-EMPTION_CAPABILITY_ENABLED"/>
-         <label data="1" alias="PRE-EMPTION_CAPABILITY_DISABLED"/>
-      </single>
-   </avp>
-   <avp name="Pre-emption-Vulnerability" code="1048" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="PRE-EMPTION_VULNERABILITY_ENABLED"/>
-         <label data="1" alias="PRE-EMPTION_VULNERABILITY_DISABLED"/>
-      </single>
-   </avp>
-   <avp name="Default-EPS-Bearer-QoS" code="1049" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <grouped>
-         <avprule id="QoS-Class-Identifier" type="Optional"/>
-         <avprule id="Allocation-Retention-Priority" type="Optional"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="AN-GW-Address" code="1050" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Address"/>
-   </avp>
-   <avp name="Authorization-State-Change-Time" code="1057" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Time"/>
-   </avp>
-   <avp name="Flow-Information" code="1058" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <grouped>
-         <avprule id="Flow-Description" type="Optional"/>
-         <avprule id="Flow-Direction" type="Optional"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Next-Authorization-State" code="1059" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="AUTHORIZED"/>
-         <label data="1" alias="DENIED_CALENDAR_TIME"/>
-      </single>
-   </avp>
-   <avp name="Resource-Allocation-Notification" code="1063" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0">
-         <label data="0" alias="ENABLE_NOTIFICATION"/>
-      </single>
-   </avp>
-   <avp name="Monitoring-Key" code="1066" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Usage-Monitoring-Information" code="1067" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <grouped>
-         <avprule id="Monitoring-Key" type="Optional"/>
-         <avprule id="Granted-Service-Unit" type="Optional"/>
-         <avprule id="Used-Service-Unit" type="Optional"/>
-         <avprule id="Usage-Monitoring-Level" type="Optional"/>
-         <avprule id="Usage-Monitoring-Report" type="Optional"/>
-         <avprule id="Usage-Monitoring-Support" type="Optional"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Usage-Monitoring-Level" code="1068" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="SESSION_LEVEL"/>
-         <label data="1" alias="PCC_RULE_LEVEL"/>
-      </single>
-   </avp>
-   <avp name="Usage-Monitoring-Report" code="1069" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0">
-         <label data="0" alias="USAGE_MONITORING_REPORT_REQUIRED"/>
-      </single>
-   </avp>
-   <avp name="Usage-Monitoring-Support" code="1070" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0">
-         <label data="0" alias="USAGE_MONITORING_DISABLED"/>
-      </single>
-   </avp>
-   <avp name="Flow-Direction" code="1080" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-3">
-         <label data="0" alias="UNSPECIFIED"/>
-         <label data="1" alias="DOWNLINK"/>
-         <label data="2" alias="UPLINK"/>
-         <label data="3" alias="BIDIRECTIONAL"/>
-      </single>
-   </avp>
-   <avp name="Rule-Space-Decision" code="291" vendor-name="ERICSSON" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Charging-Rule-Authorization" code="1055" vendor-name="ERICSSON" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Authorization-State" type="Mandatory"/>
-         <avprule id="Authorization-State-Change-Time" type="Optional"/>
-         <avprule id="Next-Authorization-State" type="Optional"/>
-         <avprule id="One-Time-Redirect-Control" type="Optional"/>
-      </grouped>
-   </avp>
-   <avp name="Customer-Id" code="1146" vendor-name="ERICSSON" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="One-Time-Redirect-Control" code="1193" vendor-name="ERICSSON" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-10">
-         <label data="0" alias="INACTIVE"/>
-         <label data="1" alias="DEFAULT"/>
-         <label data="2" alias="ROAMING"/>
-         <label data="3" alias="QBAU"/>
-         <label data="4" alias="TIME"/>
-         <label data="5" alias="OPERATOR_REASON_ONE"/>
-         <label data="6" alias="OPERATOR_REASON_TWO"/>
-         <label data="7" alias="OPERATOR_REASON_THREE"/>
-         <label data="8" alias="OPERATOR_REASON_FOUR"/>
-         <label data="9" alias="OPERATOR_REASON_FIVE"/>
-         <label data="10" alias="OPERATOR_REASON_SIX"/>
-      </single>
-   </avp>
-   <command name="CER" code="257" type="Request">
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Host-IP-Address" type="Mandatory" qual="1*"/>
-      <avprule id="Vendor-Id" type="Mandatory"/>
-      <avprule id="Product-Name" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Supported-Vendor-Id" type="Optional" qual="*"/>
-      <avprule id="Auth-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Inband-Security-Id" type="Optional" qual="*"/>
-      <avprule id="Acct-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Firmware-Revision" type="Optional"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="CEA" code="257" type="Answer">
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Host-IP-Address" type="Mandatory" qual="1*"/>
-      <avprule id="Vendor-Id" type="Mandatory"/>
-      <avprule id="Product-Name" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Supported-Vendor-Id" type="Optional" qual="*"/>
-      <avprule id="Auth-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Inband-Security-Id" type="Optional" qual="*"/>
-      <avprule id="Acct-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Firmware-Revision" type="Optional"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="RA-Request" code="258" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Mandatory"/>
-      <avprule id="Re-Auth-Request-Type" type="Mandatory"/>
-      <avprule id="Session-Release-Cause" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Event-Trigger" type="Optional" qual="*"/>
-      <avprule id="Charging-Rule-Remove" type="Optional" qual="*"/>
-      <avprule id="Charging-Rule-Install" type="Optional" qual="*"/>
-      <avprule id="Default-EPS-Bearer-QoS" type="Optional"/>
-      <avprule id="QoS-Information" type="Optional"/>
-      <avprule id="Revalidation-Time" type="Optional"/>
-      <avprule id="Content-Filtering-Profile-Id" type="Optional"/>
-      <avprule id="Usage-Monitoring-Information" type="Optional" qual="*"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="RA-Answer" code="258" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Result-Code" type="Optional"/>
-      <avprule id="Experimental-Result" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="IP-CAN-Type" type="Optional"/>
-      <avprule id="RAT-Type" type="Optional"/>
-      <avprule id="AN-GW-Address" type="Optional" qual="0*2"/>
-      <avprule id="3GPP-SGSN-MCC-MNC" type="Optional"/>
-      <avprule id="3GPP-SGSN-Address" type="Optional"/>
-      <avprule id="3GPP-SGSN-IPv6-Address" type="Optional"/>
-      <avprule id="RAI" type="Optional"/>
-      <avprule id="3GPP-User-Location-Info" type="Optional"/>
-      <avprule id="3GPP-MS-TimeZone" type="Optional"/>
-      <avprule id="Charging-Rule-Report" type="Optional" qual="*"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ACR" code="271" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Accounting-Record-Type" type="Mandatory"/>
-      <avprule id="Accounting-Record-Number" type="Mandatory"/>
-      <avprule id="Acct-Application-Id" type="Optional"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Accounting-Sub-Session-Id" type="Optional"/>
-      <avprule id="Acct-Session-Id" type="Optional"/>
-      <avprule id="Acct-Multi-Session-Id" type="Optional"/>
-      <avprule id="Acct-Interim-Interval" type="Optional"/>
-      <avprule id="Accounting-Realtime-Required" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Event-Timestamp" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ACA" code="271" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Accounting-Record-Type" type="Mandatory"/>
-      <avprule id="Accounting-Record-Number" type="Mandatory"/>
-      <avprule id="Acct-Application-Id" type="Optional"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Accounting-Sub-Session-Id" type="Optional"/>
-      <avprule id="Acct-Session-Id" type="Optional"/>
-      <avprule id="Acct-Multi-Session-Id" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Acct-Interim-Interval" type="Optional"/>
-      <avprule id="Accounting-Realtime-Required" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Event-Timestamp" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="CC-Request" code="272" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="CC-Request-Type" type="Mandatory"/>
-      <avprule id="CC-Request-Number" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Subscription-Id" type="Optional" qual="*"/>
-      <avprule id="Supported-Features" type="Optional" qual="*"/>
-      <avprule id="Network-Request-Support" type="Optional"/>
-      <avprule id="Bearer-Identifier" type="Optional"/>
-      <avprule id="Bearer-Operation" type="Optional"/>
-      <avprule id="Framed-IP-Address" type="Optional"/>
-      <avprule id="Framed-IPv6-Prefix" type="Optional"/>
-      <avprule id="IP-CAN-Type" type="Optional"/>
-      <avprule id="3GPP-RAT-Type" type="Optional"/>
-      <avprule id="RAT-Type" type="Optional"/>
-      <avprule id="Termination-Cause" type="Optional"/>
-      <avprule id="User-Equipment-Info" type="Optional"/>
-      <avprule id="QoS-Information" type="Optional"/>
-      <avprule id="QoS-Negotiation" type="Optional"/>
-      <avprule id="QoS-Upgrade" type="Optional"/>
-      <avprule id="Default-EPS-Bearer-QoS" type="Optional"/>
-      <avprule id="AN-GW-Address" type="Optional" qual="0*2"/>
-      <avprule id="3GPP-SGSN-MCC-MNC" type="Optional"/>
-      <avprule id="3GPP-SGSN-Address" type="Optional"/>
-      <avprule id="3GPP-SGSN-IPv6-Address" type="Optional"/>
-      <avprule id="RAI" type="Optional"/>
-      <avprule id="3GPP-User-Location-Info" type="Optional"/>
-      <avprule id="3GPP-MS-TimeZone" type="Optional"/>
-      <avprule id="Called-Station-Id" type="Optional"/>
-      <avprule id="Bearer-Usage" type="Optional"/>
-      <avprule id="Online" type="Optional"/>
-      <avprule id="Offline" type="Optional"/>
-      <avprule id="3GPP-Charging-Characteristics" type="Optional"/>
-      <avprule id="Gx-Capability-List" type="Optional"/>
-      <avprule id="Rule-Space-Decision" type="Optional"/>
-      <avprule id="Rule-Space-Suggestion" type="Optional"/>
-      <avprule id="Charging-Rule-Report" type="Optional" qual="*"/>
-      <avprule id="Event-Trigger" type="Optional" qual="*"/>
-      <avprule id="Access-Network-Charging-Address" type="Optional"/>
-      <avprule id="Access-Network-Charging-Identifier-Gx" type="Optional" qual="*"/>
-      <avprule id="Usage-Monitoring-Information" type="Optional" qual="*"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="CC-Answer" code="272" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="CC-Request-Type" type="Mandatory"/>
-      <avprule id="CC-Request-Number" type="Mandatory"/>
-      <avprule id="Result-Code" type="Optional"/>
-      <avprule id="Experimental-Result" type="Optional"/>
-      <avprule id="Supported-Features" type="Optional" qual="*"/>
-      <avprule id="Bearer-Control-Mode" type="Optional"/>
-      <avprule id="Event-Trigger" type="Optional" qual="*"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Redirect-Host" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host-Usage" type="Optional"/>
-      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
-      <avprule id="Charging-Rule-Remove" type="Optional" qual="*"/>
-      <avprule id="Charging-Rule-Install" type="Optional" qual="*"/>
-      <avprule id="Charging-Information" type="Optional"/>
-      <avprule id="Online" type="Optional"/>
-      <avprule id="Offline" type="Optional"/>
-      <avprule id="Content-Filtering-Profile-Id" type="Optional"/>
-      <avprule id="3GPP-Charging-Characteristics" type="Optional"/>
-      <avprule id="Gx-Capability-List" type="Optional"/>
-      <avprule id="QoS-Information" type="Optional"/>
-      <avprule id="Revalidation-Time" type="Optional"/>
-      <avprule id="Default-EPS-Bearer-QoS" type="Optional"/>
-      <avprule id="Customer-Id" type="Optional"/>
-      <avprule id="Usage-Monitoring-Information" type="Optional" qual="*"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ASR" code="274" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Mandatory"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ASA" code="274" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host-Usage" type="Optional"/>
-      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="STR" code="275" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Termination-Cause" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Destination-Host" type="Optional"/>
-      <avprule id="Class" type="Optional" qual="*"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="STA" code="275" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Class" type="Optional" qual="*"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Redirect-Host" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host-Usage" type="Optional"/>
-      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="DWR" code="280" type="Request">
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-   </command>
-   <command name="DWA" code="280" type="Answer">
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-   </command>
-   <command name="DPR" code="282" type="Request">
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Disconnect-Cause" type="Mandatory"/>
-   </command>
-   <command name="DPA" code="282" type="Answer">
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-   </command>
-</dictionary>
diff --git a/example/diameter/launcher/resources/stack_examples/16777302.xml b/example/diameter/launcher/resources/stack_examples/16777302.xml
deleted file mode 100644 (file)
index ce4e22d..0000000
+++ /dev/null
@@ -1,553 +0,0 @@
-<dictionary name="DictionarySy | Application-Id: 16777302">
-   <vendor name="IETF" code="0"/>
-   <vendor name="3GPP" code="10415"/>
-   <avp name="User-Name" code="1" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Class" code="25" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Session-Timeout" code="27" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Proxy-State" code="33" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Acct-Session-Id" code="44" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Acct-Multi-Session-Id" code="50" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Event-Timestamp" code="55" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Time"/>
-   </avp>
-   <avp name="Acct-Interim-Interval" code="85" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Host-IP-Address" code="257" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Address"/>
-   </avp>
-   <avp name="Auth-Application-Id" code="258" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Acct-Application-Id" code="259" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Vendor-Specific-Application-Id" code="260" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Vendor-Id" type="Mandatory" qual="1*"/>
-         <avprule id="Auth-Application-Id" type="Optional"/>
-         <avprule id="Acct-Application-Id" type="Optional"/>
-      </grouped>
-   </avp>
-   <avp name="Redirect-Host-Usage" code="261" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-6">
-         <label data="0" alias="DONT_CACHE"/>
-         <label data="1" alias="ALL_SESSION"/>
-         <label data="2" alias="ALL_REALM"/>
-         <label data="3" alias="REALM_AND_APPLICATION"/>
-         <label data="4" alias="ALL_APPLICATION"/>
-         <label data="5" alias="ALL_HOST"/>
-         <label data="6" alias="ALL_USER"/>
-      </single>
-   </avp>
-   <avp name="Redirect-Max-Cache-Time" code="262" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Session-Id" code="263" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Origin-Host" code="264" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Supported-Vendor-Id" code="265" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Vendor-Id" code="266" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Firmware-Revision" code="267" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Result-Code" code="268" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32">
-         <label data="1001" alias="DIAMETER_MULTI_ROUND_AUTH"/>
-         <label data="2001" alias="DIAMETER_SUCCESS"/>
-         <label data="2002" alias="DIAMETER_LIMITED_SUCCESS"/>
-         <label data="3001" alias="DIAMETER_COMMAND_UNSUPPORTED"/>
-         <label data="3002" alias="DIAMETER_UNABLE_TO_DELIVER"/>
-         <label data="3003" alias="DIAMETER_REALM_NOT_SERVED"/>
-         <label data="3004" alias="DIAMETER_TOO_BUSY"/>
-         <label data="3005" alias="DIAMETER_LOOP_DETECTED"/>
-         <label data="3006" alias="DIAMETER_REDIRECT_INDICATION"/>
-         <label data="3007" alias="DIAMETER_APPLICATION_UNSUPPORTED"/>
-         <label data="3008" alias="DIAMETER_INVALID_HDR_BITS"/>
-         <label data="3009" alias="DIAMETER_INVALID_AVP_BITS"/>
-         <label data="3010" alias="DIAMETER_UNKNOWN_PEER"/>
-         <label data="4001" alias="DIAMETER_AUTHENTICATION_REJECTED"/>
-         <label data="4002" alias="DIAMETER_OUT_OF_SPACE"/>
-         <label data="4003" alias="DIAMETER_ELECTION_LOST"/>
-         <label data="5001" alias="DIAMETER_AVP_UNSUPPORTED"/>
-         <label data="5002" alias="DIAMETER_UNKNOWN_SESSION_ID"/>
-         <label data="5003" alias="DIAMETER_AUTHORIZATION_REJECTED"/>
-         <label data="5004" alias="DIAMETER_INVALID_AVP_VALUE"/>
-         <label data="5005" alias="DIAMETER_MISSING_AVP"/>
-         <label data="5006" alias="DIAMETER_RESOURCES_EXCEEDED"/>
-         <label data="5007" alias="DIAMETER_CONTRADICTING_AVPS"/>
-         <label data="5008" alias="DIAMETER_AVP_NOT_ALLOWED"/>
-         <label data="5009" alias="DIAMETER_AVP_OCCURS_TOO_MANY_TIMES"/>
-         <label data="5010" alias="DIAMETER_NO_COMMON_APPLICATION"/>
-         <label data="5011" alias="DIAMETER_UNSUPPORTED_VERSION"/>
-         <label data="5012" alias="DIAMETER_UNABLE_TO_COMPLY"/>
-         <label data="5013" alias="DIAMETER_INVALID_BIT_IN_HEADER"/>
-         <label data="5014" alias="DIAMETER_INVALID_AVP_LENGTH"/>
-         <label data="5015" alias="DIAMETER_INVALID_MESSAGE_LENGTH"/>
-         <label data="5016" alias="DIAMETER_INVALID_AVP_BIT_COMBO"/>
-         <label data="5017" alias="DIAMETER_NO_COMMON_SECURITY"/>
-         <label data="5030" alias="DIAMETER_USER_UNKNOWN"/>
-         <label data="5063" alias="REQUESTED_SERVICE_NOT_AUTHORIZED"/>
-         <label data="5065" alias="IP_CAN_SESSION_NOT_AVAILABLE"/>
-      </single>
-   </avp>
-   <avp name="Product-Name" code="269" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Session-Binding" code="270" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Session-Server-Failover" code="271" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-3">
-         <label data="0" alias="REFUSE_SERVICE"/>
-         <label data="1" alias="TRY_AGAIN"/>
-         <label data="2" alias="ALLOW_SERVICE"/>
-         <label data="3" alias="TRY_AGAIN_ALLOW_SERVICE"/>
-      </single>
-   </avp>
-   <avp name="Multi-Round-Time-Out" code="272" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Disconnect-Cause" code="273" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-2">
-         <label data="0" alias="REBOOTING"/>
-         <label data="1" alias="BUSY"/>
-         <label data="2" alias="DO_NOT_WANT_TO_TALK_TO_YOU"/>
-      </single>
-   </avp>
-   <avp name="Auth-Request-Type" code="274" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-3">
-         <label data="1" alias="AUTHENTICATE_ONLY"/>
-         <label data="2" alias="AUTHORIZE_ONLY"/>
-         <label data="3" alias="AUTHORIZE_AUTHENTICATE"/>
-      </single>
-   </avp>
-   <avp name="Auth-Grace-Period" code="276" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Auth-Session-State" code="277" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="STATE_MAINTAINED"/>
-         <label data="1" alias="NO_STATE_MAINTAINED"/>
-      </single>
-   </avp>
-   <avp name="Origin-State-Id" code="278" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Failed-AVP" code="279" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="AVP" type="Mandatory" qual="1*"/>
-      </grouped>
-   </avp>
-   <avp name="Proxy-Host" code="280" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Error-Message" code="281" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Route-Record" code="282" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Destination-Realm" code="283" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Proxy-Info" code="284" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Proxy-Host" type="Mandatory"/>
-         <avprule id="Proxy-State" type="Mandatory"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Re-Auth-Request-Type" code="285" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="AUTHORIZE_ONLY"/>
-         <label data="1" alias="AUTHORIZE_AUTHENTICATE"/>
-      </single>
-   </avp>
-   <avp name="Accounting-Sub-Session-Id" code="287" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned64"/>
-   </avp>
-   <avp name="Redirect-Host" code="292" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterURI"/>
-   </avp>
-   <avp name="Destination-Host" code="293" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Error-Reporting-Host" code="294" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Termination-Cause" code="295" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-8">
-         <label data="1" alias="LOGOUT"/>
-         <label data="2" alias="SERVICE_NOT_PROVIDED"/>
-         <label data="3" alias="BAD_ANSWER"/>
-         <label data="4" alias="ADMINISTRATIVE"/>
-         <label data="5" alias="LINK_BROKEN"/>
-         <label data="6" alias="AUTH_EXPIRED"/>
-         <label data="7" alias="USER_MOVED"/>
-         <label data="8" alias="SESSION_TIMEOUT"/>
-      </single>
-   </avp>
-   <avp name="Origin-Realm" code="296" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="DiameterIdentity"/>
-   </avp>
-   <avp name="Experimental-Result" code="297" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Vendor-Id" type="Mandatory"/>
-         <avprule id="Experimental-Result-Code" type="Mandatory"/>
-      </grouped>
-   </avp>
-   <avp name="Experimental-Result-Code" code="298" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Inband-Security-Id" code="299" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="E2E-Sequence" code="300" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="AVP" type="Mandatory" qual="2*"/>
-      </grouped>
-   </avp>
-   <avp name="Logical-Access-ID" code="302" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="OctetString"/>
-   </avp>
-   <avp name="Physical-Access-ID" code="313" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Subscription-Id" code="443" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Subscription-Id-Type" type="Mandatory"/>
-         <avprule id="Subscription-Id-Data" type="Mandatory"/>
-      </grouped>
-   </avp>
-   <avp name="Subscription-Id-Data" code="444" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Subscription-Id-Type" code="450" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-4">
-         <label data="0" alias="END_USER_E164"/>
-         <label data="1" alias="END_USER_IMSI"/>
-         <label data="2" alias="END_USER_SIP_URI"/>
-         <label data="3" alias="END_USER_NAI"/>
-         <label data="4" alias="END_USER_PRIVATE"/>
-      </single>
-   </avp>
-   <avp name="Accounting-Record-Type" code="480" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-4">
-         <label data="1" alias="EVENT_RECORD"/>
-         <label data="2" alias="START_RECORD"/>
-         <label data="3" alias="INTERIM_RECORD"/>
-         <label data="4" alias="STOP_RECORD"/>
-      </single>
-   </avp>
-   <avp name="Accounting-Realtime-Required" code="483" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="1-3">
-         <label data="1" alias="DELIVER_AND_GRANT"/>
-         <label data="2" alias="GRANT_AND_STORE"/>
-         <label data="3" alias="GRANT_AND_LOSE"/>
-      </single>
-   </avp>
-   <avp name="Accounting-Record-Number" code="485" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
-      <single format-name="Unsigned32"/>
-   </avp>
-   <avp name="Policy-Counter-Identifier" code="2901" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Policy-Counter-Status" code="2902" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="UTF8String"/>
-   </avp>
-   <avp name="Policy-Counter-Status-Report" code="2903" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Policy-Counter-Identifier" type="Mandatory"/>
-         <avprule id="Policy-Counter-Status" type="Mandatory"/>
-         <avprule id="Pending-Policy-Counter-Information" type="Optional" qual="*"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="SL-Request-Type" code="2904" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Enumerated" enum="0-1">
-         <label data="0" alias="INITIAL_REQUEST"/>
-         <label data="1" alias="INTERMEDIATE_REQUEST"/>
-      </single>
-   </avp>
-   <avp name="Pending-Policy-Counter-Information" code="2905" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <grouped>
-         <avprule id="Policy-Counter-Status" type="Mandatory"/>
-         <avprule id="Pending-Policy-Counter-Change-Time" type="Mandatory"/>
-         <avprule id="AVP" type="Optional" qual="*"/>
-      </grouped>
-   </avp>
-   <avp name="Pending-Policy-Counter-Change-Time" code="2906" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
-      <single format-name="Time"/>
-   </avp>
-   <command name="CER" code="257" type="Request">
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Host-IP-Address" type="Mandatory" qual="1*"/>
-      <avprule id="Vendor-Id" type="Mandatory"/>
-      <avprule id="Product-Name" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Supported-Vendor-Id" type="Optional" qual="*"/>
-      <avprule id="Auth-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Inband-Security-Id" type="Optional" qual="*"/>
-      <avprule id="Acct-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Firmware-Revision" type="Optional"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="CEA" code="257" type="Answer">
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Host-IP-Address" type="Mandatory" qual="1*"/>
-      <avprule id="Vendor-Id" type="Mandatory"/>
-      <avprule id="Product-Name" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Supported-Vendor-Id" type="Optional" qual="*"/>
-      <avprule id="Auth-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Inband-Security-Id" type="Optional" qual="*"/>
-      <avprule id="Acct-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional" qual="*"/>
-      <avprule id="Firmware-Revision" type="Optional"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="RAR" code="258" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Mandatory"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Re-Auth-Request-Type" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="RAA" code="258" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host-Usage" type="Optional"/>
-      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ACR" code="271" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Accounting-Record-Type" type="Mandatory"/>
-      <avprule id="Accounting-Record-Number" type="Mandatory"/>
-      <avprule id="Acct-Application-Id" type="Optional"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Accounting-Sub-Session-Id" type="Optional"/>
-      <avprule id="Acct-Session-Id" type="Optional"/>
-      <avprule id="Acct-Multi-Session-Id" type="Optional"/>
-      <avprule id="Acct-Interim-Interval" type="Optional"/>
-      <avprule id="Accounting-Realtime-Required" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Event-Timestamp" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ACA" code="271" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Accounting-Record-Type" type="Mandatory"/>
-      <avprule id="Accounting-Record-Number" type="Mandatory"/>
-      <avprule id="Acct-Application-Id" type="Optional"/>
-      <avprule id="Vendor-Specific-Application-Id" type="Optional"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Accounting-Sub-Session-Id" type="Optional"/>
-      <avprule id="Acct-Session-Id" type="Optional"/>
-      <avprule id="Acct-Multi-Session-Id" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Acct-Interim-Interval" type="Optional"/>
-      <avprule id="Accounting-Realtime-Required" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Event-Timestamp" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ASR" code="274" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Mandatory"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ASA" code="274" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="User-Name" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host-Usage" type="Optional"/>
-      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ST-Request" code="275" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Termination-Cause" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="ST-Answer" code="275" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Result-Code" type="Optional"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Redirect-Host" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host-Usage" type="Optional"/>
-      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="DWR" code="280" type="Request">
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-   </command>
-   <command name="DWA" code="280" type="Answer">
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-   </command>
-   <command name="DPR" code="282" type="Request">
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Disconnect-Cause" type="Mandatory"/>
-   </command>
-   <command name="DPA" code="282" type="Answer">
-      <avprule id="Result-Code" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="SL-Request" code="8388635" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="SL-Request-Type" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Subscription-Id" type="Optional" qual="*"/>
-      <avprule id="Policy-Counter-Identifier" type="Optional" qual="*"/>
-      <avprule id="Logical-Access-ID" type="Optional"/>
-      <avprule id="Physical-Access-ID" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="SL-Answer" code="8388635" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Result-Code" type="Optional"/>
-      <avprule id="Experimental-Result" type="Optional"/>
-      <avprule id="Policy-Counter-Status-Report" type="Optional" qual="*"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Redirect-Host" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host-Usage" type="Optional"/>
-      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="SN-Request" code="8388636" type="Request">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Destination-Realm" type="Mandatory"/>
-      <avprule id="Destination-Host" type="Mandatory"/>
-      <avprule id="Auth-Application-Id" type="Mandatory"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Policy-Counter-Status-Report" type="Optional" qual="*"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="Route-Record" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-   <command name="SN-Answer" code="8388636" type="Answer">
-      <avprule id="Session-Id" type="Fixed"/>
-      <avprule id="Origin-Host" type="Mandatory"/>
-      <avprule id="Origin-Realm" type="Mandatory"/>
-      <avprule id="Result-Code" type="Optional"/>
-      <avprule id="Experimental-Result" type="Optional"/>
-      <avprule id="Origin-State-Id" type="Optional"/>
-      <avprule id="Error-Message" type="Optional"/>
-      <avprule id="Error-Reporting-Host" type="Optional"/>
-      <avprule id="Redirect-Host" type="Optional" qual="*"/>
-      <avprule id="Redirect-Host-Usage" type="Optional"/>
-      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
-      <avprule id="Failed-AVP" type="Optional" qual="*"/>
-      <avprule id="Proxy-Info" type="Optional" qual="*"/>
-      <avprule id="AVP" type="Optional" qual="*"/>
-   </command>
-</dictionary>
diff --git a/example/diameter/launcher/resources/stack_examples/DictionaryGx.16777238.xml b/example/diameter/launcher/resources/stack_examples/DictionaryGx.16777238.xml
new file mode 100755 (executable)
index 0000000..5922ae7
--- /dev/null
@@ -0,0 +1,1477 @@
+<dictionary name="DictionaryGx | Application-Id: 16777238">
+   <vendor name="IETF" code="0"/>
+   <vendor name="ERICSSON" code="193"/>
+   <vendor name="3GPP2" code="5535"/>
+   <vendor name="3GPP" code="10415"/>
+   <avp name="User-Name" code="1" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Framed-IP-Address" code="8" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Class" code="25" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Session-Timeout" code="27" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Called-Station-Id" code="30" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Proxy-State" code="33" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Acct-Session-Id" code="44" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Acct-Multi-Session-Id" code="50" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Event-Timestamp" code="55" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Time"/>
+   </avp>
+   <avp name="Acct-Interim-Interval" code="85" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Framed-IPv6-Prefix" code="97" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Host-IP-Address" code="257" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Address"/>
+   </avp>
+   <avp name="Auth-Application-Id" code="258" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Acct-Application-Id" code="259" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Vendor-Specific-Application-Id" code="260" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Vendor-Id" type="Mandatory" qual="1*"/>
+         <avprule id="Auth-Application-Id" type="Optional"/>
+         <avprule id="Acct-Application-Id" type="Optional"/>
+      </grouped>
+   </avp>
+   <avp name="Redirect-Host-Usage" code="261" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-6">
+         <label data="0" alias="DONT_CACHE"/>
+         <label data="1" alias="ALL_SESSION"/>
+         <label data="2" alias="ALL_REALM"/>
+         <label data="3" alias="REALM_AND_APPLICATION"/>
+         <label data="4" alias="ALL_APPLICATION"/>
+         <label data="5" alias="ALL_HOST"/>
+         <label data="6" alias="ALL_USER"/>
+      </single>
+   </avp>
+   <avp name="Redirect-Max-Cache-Time" code="262" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Session-Id" code="263" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Origin-Host" code="264" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Supported-Vendor-Id" code="265" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Vendor-Id" code="266" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Firmware-Revision" code="267" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Result-Code" code="268" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32">
+         <label data="1001" alias="DIAMETER_MULTI_ROUND_AUTH"/>
+         <label data="2001" alias="DIAMETER_SUCCESS"/>
+         <label data="2002" alias="DIAMETER_LIMITED_SUCCESS"/>
+         <label data="3001" alias="DIAMETER_COMMAND_UNSUPPORTED"/>
+         <label data="3002" alias="DIAMETER_UNABLE_TO_DELIVER"/>
+         <label data="3003" alias="DIAMETER_REALM_NOT_SERVED"/>
+         <label data="3004" alias="DIAMETER_TOO_BUSY"/>
+         <label data="3005" alias="DIAMETER_LOOP_DETECTED"/>
+         <label data="3006" alias="DIAMETER_REDIRECT_INDICATION"/>
+         <label data="3007" alias="DIAMETER_APPLICATION_UNSUPPORTED"/>
+         <label data="3008" alias="DIAMETER_INVALID_HDR_BITS"/>
+         <label data="3009" alias="DIAMETER_INVALID_AVP_BITS"/>
+         <label data="3010" alias="DIAMETER_UNKNOWN_PEER"/>
+         <label data="4001" alias="DIAMETER_AUTHENTICATION_REJECTED"/>
+         <label data="4002" alias="DIAMETER_OUT_OF_SPACE"/>
+         <label data="4003" alias="DIAMETER_ELECTION_LOST"/>
+         <label data="4241" alias="DIAMETER_NO_AVAILABLE_POLICY_COUNTERS"/>
+         <label data="5001" alias="DIAMETER_AVP_UNSUPPORTED"/>
+         <label data="5002" alias="DIAMETER_UNKNOWN_SESSION_ID"/>
+         <label data="5003" alias="DIAMETER_AUTHORIZATION_REJECTED"/>
+         <label data="5004" alias="DIAMETER_INVALID_AVP_VALUE"/>
+         <label data="5005" alias="DIAMETER_MISSING_AVP"/>
+         <label data="5006" alias="DIAMETER_RESOURCES_EXCEEDED"/>
+         <label data="5007" alias="DIAMETER_CONTRADICTING_AVPS"/>
+         <label data="5008" alias="DIAMETER_AVP_NOT_ALLOWED"/>
+         <label data="5009" alias="DIAMETER_AVP_OCCURS_TOO_MANY_TIMES"/>
+         <label data="5010" alias="DIAMETER_NO_COMMON_APPLICATION"/>
+         <label data="5011" alias="DIAMETER_UNSUPPORTED_VERSION"/>
+         <label data="5012" alias="DIAMETER_UNABLE_TO_COMPLY"/>
+         <label data="5013" alias="DIAMETER_INVALID_BIT_IN_HEADER"/>
+         <label data="5014" alias="DIAMETER_INVALID_AVP_LENGTH"/>
+         <label data="5015" alias="DIAMETER_INVALID_MESSAGE_LENGTH"/>
+         <label data="5016" alias="DIAMETER_INVALID_AVP_BIT_COMBO"/>
+         <label data="5017" alias="DIAMETER_NO_COMMON_SECURITY"/>
+         <label data="5030" alias="DIAMETER_USER_UNKNOWN"/>
+         <label data="5063" alias="REQUESTED_SERVICE_NOT_AUTHORIZED"/>
+         <label data="5065" alias="IP_CAN_SESSION_NOT_AVAILABLE"/>
+      </single>
+   </avp>
+   <avp name="Product-Name" code="269" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Session-Binding" code="270" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Session-Server-Failover" code="271" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-3">
+         <label data="0" alias="REFUSE_SERVICE"/>
+         <label data="1" alias="TRY_AGAIN"/>
+         <label data="2" alias="ALLOW_SERVICE"/>
+         <label data="3" alias="TRY_AGAIN_ALLOW_SERVICE"/>
+      </single>
+   </avp>
+   <avp name="Multi-Round-Time-Out" code="272" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Disconnect-Cause" code="273" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-2">
+         <label data="0" alias="REBOOTING"/>
+         <label data="1" alias="BUSY"/>
+         <label data="2" alias="DO_NOT_WANT_TO_TALK_TO_YOU"/>
+      </single>
+   </avp>
+   <avp name="Auth-Request-Type" code="274" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="1-3">
+         <label data="1" alias="AUTHENTICATE_ONLY"/>
+         <label data="2" alias="AUTHORIZE_ONLY"/>
+         <label data="3" alias="AUTHORIZE_AUTHENTICATE"/>
+      </single>
+   </avp>
+   <avp name="Auth-Grace-Period" code="276" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Auth-Session-State" code="277" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="STATE_MAINTAINED"/>
+         <label data="1" alias="NO_STATE_MAINTAINED"/>
+      </single>
+   </avp>
+   <avp name="Origin-State-Id" code="278" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Failed-AVP" code="279" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="AVP" type="Mandatory" qual="1*"/>
+      </grouped>
+   </avp>
+   <avp name="Proxy-Host" code="280" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Error-Message" code="281" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Route-Record" code="282" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Destination-Realm" code="283" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Proxy-Info" code="284" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Proxy-Host" type="Mandatory"/>
+         <avprule id="Proxy-State" type="Mandatory"/>
+         <avprule id="AVP" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="Re-Auth-Request-Type" code="285" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="AUTHORIZE_ONLY"/>
+         <label data="1" alias="AUTHORIZE_AUTHENTICATE"/>
+      </single>
+   </avp>
+   <avp name="Accounting-Sub-Session-Id" code="287" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned64"/>
+   </avp>
+   <avp name="Redirect-Host" code="292" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterURI"/>
+   </avp>
+   <avp name="Destination-Host" code="293" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Error-Reporting-Host" code="294" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Termination-Cause" code="295" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="1-8">
+         <label data="1" alias="LOGOUT"/>
+         <label data="2" alias="SERVICE_NOT_PROVIDED"/>
+         <label data="3" alias="BAD_ANSWER"/>
+         <label data="4" alias="ADMINISTRATIVE"/>
+         <label data="5" alias="LINK_BROKEN"/>
+         <label data="6" alias="AUTH_EXPIRED"/>
+         <label data="7" alias="USER_MOVED"/>
+         <label data="8" alias="SESSION_TIMEOUT"/>
+      </single>
+   </avp>
+   <avp name="Origin-Realm" code="296" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Experimental-Result" code="297" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Vendor-Id" type="Mandatory"/>
+         <avprule id="Experimental-Result-Code" type="Mandatory"/>
+      </grouped>
+   </avp>
+   <avp name="Experimental-Result-Code" code="298" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Inband-Security-Id" code="299" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="E2E-Sequence" code="300" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="AVP" type="Mandatory" qual="2*"/>
+      </grouped>
+   </avp>
+   <avp name="CC-Input-Octets" code="412" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Unsigned64"/>
+   </avp>
+   <avp name="CC-Output-Octets" code="414" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Unsigned64"/>
+   </avp>
+   <avp name="CC-Request-Number" code="415" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="CC-Request-Type" code="416" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="1-4">
+         <label data="1" alias="INITIAL_REQUEST"/>
+         <label data="2" alias="UPDATE_REQUEST"/>
+         <label data="3" alias="TERMINATION_REQUEST"/>
+         <label data="4" alias="EVENT_REQUEST"/>
+      </single>
+   </avp>
+   <avp name="CC-Time" code="420" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="CC-Total-Octets" code="421" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Unsigned64"/>
+   </avp>
+   <avp name="Granted-Service-Unit" code="431" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
+      <grouped>
+         <avprule id="CC-Total-Octets" type="Optional"/>
+         <avprule id="CC-Time" type="Optional"/>
+         <avprule id="CC-Input-Octets" type="Optional"/>
+         <avprule id="CC-Output-Octets" type="Optional"/>
+         <avprule id="AVP" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="Rating-Group" code="432" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Redirect-Address-Type" code="433" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-3">
+         <label data="0" alias="IPv4"/>
+         <label data="1" alias="IPv6Addr"/>
+         <label data="2" alias="URL"/>
+         <label data="3" alias="SIP"/>
+      </single>
+   </avp>
+   <avp name="Redirect-Server-Address" code="435" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Service-Identifier" code="439" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Subscription-Id" code="443" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Subscription-Id-Type" type="Mandatory"/>
+         <avprule id="Subscription-Id-Data" type="Mandatory"/>
+      </grouped>
+   </avp>
+   <avp name="Subscription-Id-Data" code="444" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Used-Service-Unit" code="446" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
+      <grouped>
+         <avprule id="CC-Total-Octets" type="Optional"/>
+         <avprule id="CC-Time" type="Optional"/>
+         <avprule id="CC-Input-Octets" type="Optional"/>
+         <avprule id="CC-Output-Octets" type="Optional"/>
+         <avprule id="AVP" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="Subscription-Id-Type" code="450" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-4">
+         <label data="0" alias="END_USER_E164"/>
+         <label data="1" alias="END_USER_IMSI"/>
+         <label data="2" alias="END_USER_SIP_URI"/>
+         <label data="3" alias="END_USER_NAI"/>
+         <label data="4" alias="END_USER_PRIVATE"/>
+      </single>
+   </avp>
+   <avp name="User-Equipment-Info" code="458" may-encrypt="yes" v-bit="mustnot" m-bit="may" p-bit="mustnot">
+      <grouped>
+         <avprule id="User-Equipment-Info-Type" type="Mandatory"/>
+         <avprule id="User-Equipment-Info-Value" type="Mandatory"/>
+      </grouped>
+   </avp>
+   <avp name="User-Equipment-Info-Type" code="459" may-encrypt="yes" v-bit="mustnot" m-bit="may" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-3">
+         <label data="0" alias="IMEISV"/>
+         <label data="1" alias="MAC"/>
+         <label data="2" alias="EUI64"/>
+         <label data="3" alias="MODIFIED_EUI64"/>
+      </single>
+   </avp>
+   <avp name="User-Equipment-Info-Value" code="460" may-encrypt="yes" v-bit="mustnot" m-bit="may" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Accounting-Record-Type" code="480" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="1-4">
+         <label data="1" alias="EVENT_RECORD"/>
+         <label data="2" alias="START_RECORD"/>
+         <label data="3" alias="INTERIM_RECORD"/>
+         <label data="4" alias="STOP_RECORD"/>
+      </single>
+   </avp>
+   <avp name="Accounting-Realtime-Required" code="483" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="1-3">
+         <label data="1" alias="DELIVER_AND_GRANT"/>
+         <label data="2" alias="GRANT_AND_STORE"/>
+         <label data="3" alias="GRANT_AND_LOSE"/>
+      </single>
+   </avp>
+   <avp name="Accounting-Record-Number" code="485" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Rule-Space-Suggestion" code="290" vendor-name="ERICSSON" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Rule-Space-Decision" code="291" vendor-name="ERICSSON" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Charging-Rule-Authorization" code="1055" vendor-name="ERICSSON" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Authorization-State" type="Mandatory"/>
+         <avprule id="Authorization-State-Change-Time" type="Optional"/>
+         <avprule id="Next-Authorization-State" type="Optional"/>
+         <avprule id="One-Time-Redirect-Control" type="Optional"/>
+      </grouped>
+   </avp>
+   <avp name="Authorization-State" code="1056" vendor-name="ERICSSON" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-12">
+         <label data="0" alias="AUTHORIZED"/>
+         <label data="1" alias="DENIED_CALENDAR_TIME"/>
+         <label data="2" alias="DENIED_ROAMING"/>
+         <label data="3" alias="DENIED_QUALITY_OF_SERVICE"/>
+         <label data="4" alias="DENIED_BLACKLISTED"/>
+         <label data="5" alias="DENIED_TERMINAL"/>
+         <label data="6" alias="DENIED_OPERATOR_REASON_ONE"/>
+         <label data="7" alias="DENIED_OPERATOR_REASON_TWO"/>
+         <label data="8" alias="DENIED_OPERATOR_REASON_THREE"/>
+         <label data="9" alias="DENIED_OPERATOR_REASON_FOUR"/>
+         <label data="10" alias="DENIED_OPERATOR_REASON_FIVE"/>
+         <label data="11" alias="DENIED_UNKNOWN_REASON"/>
+         <label data="12" alias="DENIED_USAGE_CONTROL"/>
+      </single>
+   </avp>
+   <avp name="Gx-Capability-List" code="1060" vendor-name="ERICSSON" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Content-Filtering-Profile-Id" code="1138" vendor-name="ERICSSON" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Customer-Id" code="1146" vendor-name="ERICSSON" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="One-Time-Redirect-Control" code="1193" vendor-name="ERICSSON" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-10">
+         <label data="0" alias="INACTIVE"/>
+         <label data="1" alias="DEFAULT"/>
+         <label data="2" alias="ROAMING"/>
+         <label data="3" alias="QBAU"/>
+         <label data="4" alias="TIME"/>
+         <label data="5" alias="OPERATOR_REASON_ONE"/>
+         <label data="6" alias="OPERATOR_REASON_TWO"/>
+         <label data="7" alias="OPERATOR_REASON_THREE"/>
+         <label data="8" alias="OPERATOR_REASON_FOUR"/>
+         <label data="9" alias="OPERATOR_REASON_FIVE"/>
+         <label data="10" alias="OPERATOR_REASON_SIX"/>
+      </single>
+   </avp>
+   <avp name="3GPP2-BSID" code="9010" vendor-name="3GPP2" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="3GPP-SGSN-Address" code="6" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="3GPP-Charging-Characteristics" code="13" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="3GPP-SGSN-IPv6-Address" code="15" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="3GPP-SGSN-MCC-MNC" code="18" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="3GPP-RAT-Type" code="21" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="3GPP-User-Location-Info" code="22" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="3GPP-MS-TimeZone" code="23" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Access-Network-Charging-Address" code="501" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Address"/>
+   </avp>
+   <avp name="Access-Network-Charging-Identifier-Value" code="503" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="AF-Charging-Identifier" code="505" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Flow-Description" code="507" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="IPFilterRule"/>
+   </avp>
+   <avp name="Flow-Number" code="509" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Flows" code="510" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Media-Component-Number" type="Mandatory"/>
+         <avprule id="Flow-Number" type="Optional" qual="*"/>
+         <avprule id="AVP" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="Flow-Status" code="511" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-4">
+         <label data="0" alias="ENABLED-UPLINK"/>
+         <label data="1" alias="ENABLED-DOWNLINK"/>
+         <label data="2" alias="ENABLED"/>
+         <label data="3" alias="DISABLED"/>
+         <label data="4" alias="REMOVED"/>
+      </single>
+   </avp>
+   <avp name="Max-Requested-Bandwidth-DL" code="515" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Max-Requested-Bandwidth-UL" code="516" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Media-Component-Number" code="518" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Required-Access-Info" code="536" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="USER_LOCATION"/>
+         <label data="1" alias="MS_TIME_ZONE"/>
+      </single>
+   </avp>
+   <avp name="Charging-Information" code="618" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Primary-Event-Charging-Function-Name" type="Optional"/>
+         <avprule id="Secondary-Event-Charging-Function-Name" type="Optional"/>
+         <avprule id="Primary-Charging-Collection-Function-Name" type="Optional"/>
+         <avprule id="Secondary-Charging-Collection-Function-Name" type="Optional"/>
+         <avprule id="AVP" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="Primary-Event-Charging-Function-Name" code="619" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterURI"/>
+   </avp>
+   <avp name="Secondary-Event-Charging-Function-Name" code="620" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterURI"/>
+   </avp>
+   <avp name="Primary-Charging-Collection-Function-Name" code="621" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterURI"/>
+   </avp>
+   <avp name="Secondary-Charging-Collection-Function-Name" code="622" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterURI"/>
+   </avp>
+   <avp name="Supported-Features" code="628" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="may" p-bit="mustnot">
+      <grouped>
+         <avprule id="Vendor-Id" type="Mandatory"/>
+         <avprule id="Feature-List-ID" type="Mandatory"/>
+         <avprule id="Feature-List" type="Mandatory"/>
+         <avprule id="AVP" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="Feature-List-ID" code="629" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Feature-List" code="630" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="RAI" code="909" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Bearer-Usage" code="1000" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="GENERAL"/>
+         <label data="1" alias="IMS_SIGNALLING"/>
+      </single>
+   </avp>
+   <avp name="Charging-Rule-Install" code="1001" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Charging-Rule-Definition" type="Optional" qual="*"/>
+         <avprule id="Charging-Rule-Name" type="Optional" qual="*"/>
+         <avprule id="Charging-Rule-Base-Name" type="Optional" qual="*"/>
+         <avprule id="Charging-Rule-Authorization" type="Optional" qual="*"/>
+         <avprule id="Bearer-Identifier" type="Optional"/>
+         <avprule id="Rule-Activation-Time" type="Optional"/>
+         <avprule id="Rule-DeActivation-Time" type="Optional"/>
+         <avprule id="Resource-Allocation-Notification" type="Optional"/>
+         <avprule id="AVP" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="Charging-Rule-Remove" code="1002" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Charging-Rule-Name" type="Optional" qual="*"/>
+         <avprule id="Charging-Rule-Base-Name" type="Optional" qual="*"/>
+         <avprule id="Required-Access-Info" type="Optional" qual="*"/>
+         <avprule id="AVP" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="Charging-Rule-Definition" code="1003" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Charging-Rule-Name" type="Mandatory"/>
+         <avprule id="Service-Identifier" type="Optional"/>
+         <avprule id="Rating-Group" type="Optional"/>
+         <avprule id="Flow-Information" type="Optional" qual="*"/>
+         <avprule id="Flow-Status" type="Optional"/>
+         <avprule id="QoS-Information" type="Optional"/>
+         <avprule id="Reporting-Level" type="Optional"/>
+         <avprule id="Online" type="Optional"/>
+         <avprule id="Offline" type="Optional"/>
+         <avprule id="Metering-Method" type="Optional"/>
+         <avprule id="Precedence" type="Optional"/>
+         <avprule id="AF-Charging-Identifier" type="Optional"/>
+         <avprule id="Flows" type="Optional" qual="*"/>
+         <avprule id="Monitoring-Key" type="Optional"/>
+         <avprule id="Required-Access-Info" type="Optional" qual="*"/>
+         <avprule id="TDF-Application-Identifier" type="Optional"/>
+         <avprule id="Redirect-Information" type="Optional"/>
+         <avprule id="Mute-Notification" type="Optional"/>
+         <avprule id="AVP" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="Charging-Rule-Base-Name" code="1004" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Charging-Rule-Name" code="1005" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Event-Trigger" code="1006" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-2,4-4,7-7,12-13,15-17,20-22,25-27,29-29,33-34,39-40,45-45,48">
+         <label data="0" alias="SGSN_CHANGE"/>
+         <label data="1" alias="QOS_CHANGE"/>
+         <label data="2" alias="RAT_CHANGE"/>
+         <label data="4" alias="PLMN_CHANGE"/>
+         <label data="7" alias="IP-CAN-CHANGE"/>
+         <label data="12" alias="RAI_CHANGE"/>
+         <label data="13" alias="USER_LOCATION_CHANGE"/>
+         <label data="15" alias="OUT_OF_CREDIT"/>
+         <label data="16" alias="REALLOCATION_OF_CREDIT"/>
+         <label data="17" alias="REVALIDATION_TIMEOUT"/>
+         <label data="20" alias="DEFAULT_EPS_BEARER_QOS_CHANGE"/>
+         <label data="21" alias="AN_GW_CHANGE"/>
+         <label data="22" alias="SUCCESSFUL_RESOURCE_ALLOCATION"/>
+         <label data="25" alias="UE_TIME_ZONE_CHANGE"/>
+         <label data="26" alias="TAI_CHANGE"/>
+         <label data="27" alias="ECGI_CHANGE"/>
+         <label data="29" alias="APN-AMBR_MODIFICATION_FAILURE"/>
+         <label data="33" alias="USAGE_REPORT"/>
+         <label data="34" alias="DEFAULT-EPS-BEARER-QOS_MODIFICATION_FAILURE"/>
+         <label data="39" alias="APPLICATION_START"/>
+         <label data="40" alias="APPLICATION_STOP"/>
+         <label data="45" alias="ACCESS_NETWORK_INFO_REPORT"/>
+         <label data="48" alias="CHANGE_OF_UE_PRESENCE_IN_PRESENCE_REPORTING_AREA_REPORT"/>
+      </single>
+   </avp>
+   <avp name="Metering-Method" code="1007" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-2">
+         <label data="0" alias="DURATION"/>
+         <label data="1" alias="VOLUME"/>
+         <label data="2" alias="DURATION_VOLUME"/>
+      </single>
+   </avp>
+   <avp name="Offline" code="1008" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="DISABLE_OFFLINE"/>
+         <label data="1" alias="ENABLE_OFFLINE"/>
+      </single>
+   </avp>
+   <avp name="Online" code="1009" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="DISABLE_ONLINE"/>
+         <label data="1" alias="ENABLE_ONLINE"/>
+      </single>
+   </avp>
+   <avp name="Precedence" code="1010" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Reporting-Level" code="1011" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="SERVICE_IDENTIFIER_LEVEL"/>
+         <label data="1" alias="RATING_GROUP_LEVEL"/>
+      </single>
+   </avp>
+   <avp name="ToS-Traffic-Class" code="1014" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="QoS-Information" code="1016" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="QoS-Class-Identifier" type="Optional"/>
+         <avprule id="Max-Requested-Bandwidth-UL" type="Optional"/>
+         <avprule id="Max-Requested-Bandwidth-DL" type="Optional"/>
+         <avprule id="Guaranteed-Bitrate-UL" type="Optional"/>
+         <avprule id="Guaranteed-Bitrate-DL" type="Optional"/>
+         <avprule id="Bearer-Identifier" type="Optional"/>
+         <avprule id="Allocation-Retention-Priority" type="Optional"/>
+         <avprule id="APN-Aggregate-Max-Bitrate-UL" type="Optional"/>
+         <avprule id="APN-Aggregate-Max-Bitrate-DL" type="Optional"/>
+         <avprule id="AVP" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="Charging-Rule-Report" code="1018" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Charging-Rule-Name" type="Optional" qual="*"/>
+         <avprule id="Charging-Rule-Base-Name" type="Optional" qual="*"/>
+         <avprule id="PCC-Rule-Status" type="Optional"/>
+         <avprule id="Rule-Failure-Code" type="Optional"/>
+         <avprule id="AVP" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="PCC-Rule-Status" code="1019" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-2">
+         <label data="0" alias="ACTIVE"/>
+         <label data="1" alias="INACTIVE"/>
+         <label data="2" alias="TEMPORARILY_INACTIVE"/>
+      </single>
+   </avp>
+   <avp name="Bearer-Identifier" code="1020" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Bearer-Operation" code="1021" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-2">
+         <label data="0" alias="TERMINATION"/>
+         <label data="1" alias="ESTABLISHMENT"/>
+         <label data="2" alias="MODIFICATION"/>
+      </single>
+   </avp>
+   <avp name="Access-Network-Charging-Identifier-Gx" code="1022" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Access-Network-Charging-Identifier-Value" type="Mandatory"/>
+         <avprule id="Charging-Rule-Base-Name" type="Optional" qual="*"/>
+         <avprule id="Charging-Rule-Name" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="Bearer-Control-Mode" code="1023" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-2">
+         <label data="0" alias="UE_ONLY"/>
+         <label data="1" alias="RESERVED"/>
+         <label data="2" alias="UE_NW"/>
+      </single>
+   </avp>
+   <avp name="Network-Request-Support" code="1024" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="NETWORK_REQUEST_NOT_SUPPORTED"/>
+         <label data="1" alias="NETWORK_REQUEST_SUPPORTED"/>
+      </single>
+   </avp>
+   <avp name="Guaranteed-Bitrate-DL" code="1025" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Guaranteed-Bitrate-UL" code="1026" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="IP-CAN-Type" code="1027" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-7">
+         <label data="0" alias="3GPP-GPRS"/>
+         <label data="1" alias="DOCSIS"/>
+         <label data="2" alias="xDSL"/>
+         <label data="3" alias="WiMAX"/>
+         <label data="4" alias="3GPP2"/>
+         <label data="5" alias="3GPP-EPS"/>
+         <label data="6" alias="Non-3GPP-EPS"/>
+         <label data="7" alias="FBA"/>
+      </single>
+   </avp>
+   <avp name="QoS-Class-Identifier" code="1028" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="1-254">
+         <label data="1" alias="QCI_1"/>
+         <label data="2" alias="QCI_2"/>
+         <label data="3" alias="QCI_3"/>
+         <label data="4" alias="QCI_4"/>
+         <label data="5" alias="QCI_5"/>
+         <label data="6" alias="QCI_6"/>
+         <label data="7" alias="QCI_7"/>
+         <label data="8" alias="QCI_8"/>
+         <label data="9" alias="QCI_9"/>
+         <label data="10" alias="QCI_10"/>
+         <label data="11" alias="QCI_11"/>
+         <label data="12" alias="QCI_12"/>
+         <label data="13" alias="QCI_13"/>
+         <label data="14" alias="QCI_14"/>
+         <label data="15" alias="QCI_15"/>
+         <label data="16" alias="QCI_16"/>
+         <label data="17" alias="QCI_17"/>
+         <label data="18" alias="QCI_18"/>
+         <label data="19" alias="QCI_19"/>
+         <label data="20" alias="QCI_20"/>
+         <label data="21" alias="QCI_21"/>
+         <label data="22" alias="QCI_22"/>
+         <label data="23" alias="QCI_23"/>
+         <label data="24" alias="QCI_24"/>
+         <label data="25" alias="QCI_25"/>
+         <label data="26" alias="QCI_26"/>
+         <label data="27" alias="QCI_27"/>
+         <label data="28" alias="QCI_28"/>
+         <label data="29" alias="QCI_29"/>
+         <label data="30" alias="QCI_30"/>
+         <label data="31" alias="QCI_31"/>
+         <label data="32" alias="QCI_32"/>
+         <label data="33" alias="QCI_33"/>
+         <label data="34" alias="QCI_34"/>
+         <label data="35" alias="QCI_35"/>
+         <label data="36" alias="QCI_36"/>
+         <label data="37" alias="QCI_37"/>
+         <label data="38" alias="QCI_38"/>
+         <label data="39" alias="QCI_39"/>
+         <label data="40" alias="QCI_40"/>
+         <label data="41" alias="QCI_41"/>
+         <label data="42" alias="QCI_42"/>
+         <label data="43" alias="QCI_43"/>
+         <label data="44" alias="QCI_44"/>
+         <label data="45" alias="QCI_45"/>
+         <label data="46" alias="QCI_46"/>
+         <label data="47" alias="QCI_47"/>
+         <label data="48" alias="QCI_48"/>
+         <label data="49" alias="QCI_49"/>
+         <label data="50" alias="QCI_50"/>
+         <label data="51" alias="QCI_51"/>
+         <label data="52" alias="QCI_52"/>
+         <label data="53" alias="QCI_53"/>
+         <label data="54" alias="QCI_54"/>
+         <label data="55" alias="QCI_55"/>
+         <label data="56" alias="QCI_56"/>
+         <label data="57" alias="QCI_57"/>
+         <label data="58" alias="QCI_58"/>
+         <label data="59" alias="QCI_59"/>
+         <label data="60" alias="QCI_60"/>
+         <label data="61" alias="QCI_61"/>
+         <label data="62" alias="QCI_62"/>
+         <label data="63" alias="QCI_63"/>
+         <label data="64" alias="QCI_64"/>
+         <label data="65" alias="QCI_65"/>
+         <label data="66" alias="QCI_66"/>
+         <label data="67" alias="QCI_67"/>
+         <label data="68" alias="QCI_68"/>
+         <label data="69" alias="QCI_69"/>
+         <label data="70" alias="QCI_70"/>
+         <label data="71" alias="QCI_71"/>
+         <label data="72" alias="QCI_72"/>
+         <label data="73" alias="QCI_73"/>
+         <label data="74" alias="QCI_74"/>
+         <label data="75" alias="QCI_75"/>
+         <label data="76" alias="QCI_76"/>
+         <label data="77" alias="QCI_77"/>
+         <label data="78" alias="QCI_78"/>
+         <label data="79" alias="QCI_79"/>
+         <label data="80" alias="QCI_80"/>
+         <label data="81" alias="QCI_81"/>
+         <label data="82" alias="QCI_82"/>
+         <label data="83" alias="QCI_83"/>
+         <label data="84" alias="QCI_84"/>
+         <label data="85" alias="QCI_85"/>
+         <label data="86" alias="QCI_86"/>
+         <label data="87" alias="QCI_87"/>
+         <label data="88" alias="QCI_88"/>
+         <label data="89" alias="QCI_89"/>
+         <label data="90" alias="QCI_90"/>
+         <label data="91" alias="QCI_91"/>
+         <label data="92" alias="QCI_92"/>
+         <label data="93" alias="QCI_93"/>
+         <label data="94" alias="QCI_94"/>
+         <label data="95" alias="QCI_95"/>
+         <label data="96" alias="QCI_96"/>
+         <label data="97" alias="QCI_97"/>
+         <label data="98" alias="QCI_98"/>
+         <label data="99" alias="QCI_99"/>
+         <label data="100" alias="QCI_100"/>
+         <label data="101" alias="QCI_101"/>
+         <label data="102" alias="QCI_102"/>
+         <label data="103" alias="QCI_103"/>
+         <label data="104" alias="QCI_104"/>
+         <label data="105" alias="QCI_105"/>
+         <label data="106" alias="QCI_106"/>
+         <label data="107" alias="QCI_107"/>
+         <label data="108" alias="QCI_108"/>
+         <label data="109" alias="QCI_109"/>
+         <label data="110" alias="QCI_110"/>
+         <label data="111" alias="QCI_111"/>
+         <label data="112" alias="QCI_112"/>
+         <label data="113" alias="QCI_113"/>
+         <label data="114" alias="QCI_114"/>
+         <label data="115" alias="QCI_115"/>
+         <label data="116" alias="QCI_116"/>
+         <label data="117" alias="QCI_117"/>
+         <label data="118" alias="QCI_118"/>
+         <label data="119" alias="QCI_119"/>
+         <label data="120" alias="QCI_120"/>
+         <label data="121" alias="QCI_121"/>
+         <label data="122" alias="QCI_122"/>
+         <label data="123" alias="QCI_123"/>
+         <label data="124" alias="QCI_124"/>
+         <label data="125" alias="QCI_125"/>
+         <label data="126" alias="QCI_126"/>
+         <label data="127" alias="QCI_127"/>
+         <label data="128" alias="QCI_128"/>
+         <label data="129" alias="QCI_129"/>
+         <label data="130" alias="QCI_130"/>
+         <label data="131" alias="QCI_131"/>
+         <label data="132" alias="QCI_132"/>
+         <label data="133" alias="QCI_133"/>
+         <label data="134" alias="QCI_134"/>
+         <label data="135" alias="QCI_135"/>
+         <label data="136" alias="QCI_136"/>
+         <label data="137" alias="QCI_137"/>
+         <label data="138" alias="QCI_138"/>
+         <label data="139" alias="QCI_139"/>
+         <label data="140" alias="QCI_140"/>
+         <label data="141" alias="QCI_141"/>
+         <label data="142" alias="QCI_142"/>
+         <label data="143" alias="QCI_143"/>
+         <label data="144" alias="QCI_144"/>
+         <label data="145" alias="QCI_145"/>
+         <label data="146" alias="QCI_146"/>
+         <label data="147" alias="QCI_147"/>
+         <label data="148" alias="QCI_148"/>
+         <label data="149" alias="QCI_149"/>
+         <label data="150" alias="QCI_150"/>
+         <label data="151" alias="QCI_151"/>
+         <label data="152" alias="QCI_152"/>
+         <label data="153" alias="QCI_153"/>
+         <label data="154" alias="QCI_154"/>
+         <label data="155" alias="QCI_155"/>
+         <label data="156" alias="QCI_156"/>
+         <label data="157" alias="QCI_157"/>
+         <label data="158" alias="QCI_158"/>
+         <label data="159" alias="QCI_159"/>
+         <label data="160" alias="QCI_160"/>
+         <label data="161" alias="QCI_161"/>
+         <label data="162" alias="QCI_162"/>
+         <label data="163" alias="QCI_163"/>
+         <label data="164" alias="QCI_164"/>
+         <label data="165" alias="QCI_165"/>
+         <label data="166" alias="QCI_166"/>
+         <label data="167" alias="QCI_167"/>
+         <label data="168" alias="QCI_168"/>
+         <label data="169" alias="QCI_169"/>
+         <label data="170" alias="QCI_170"/>
+         <label data="171" alias="QCI_171"/>
+         <label data="172" alias="QCI_172"/>
+         <label data="173" alias="QCI_173"/>
+         <label data="174" alias="QCI_174"/>
+         <label data="175" alias="QCI_175"/>
+         <label data="176" alias="QCI_176"/>
+         <label data="177" alias="QCI_177"/>
+         <label data="178" alias="QCI_178"/>
+         <label data="179" alias="QCI_179"/>
+         <label data="180" alias="QCI_180"/>
+         <label data="181" alias="QCI_181"/>
+         <label data="182" alias="QCI_182"/>
+         <label data="183" alias="QCI_183"/>
+         <label data="184" alias="QCI_184"/>
+         <label data="185" alias="QCI_185"/>
+         <label data="186" alias="QCI_186"/>
+         <label data="187" alias="QCI_187"/>
+         <label data="188" alias="QCI_188"/>
+         <label data="189" alias="QCI_189"/>
+         <label data="190" alias="QCI_190"/>
+         <label data="191" alias="QCI_191"/>
+         <label data="192" alias="QCI_192"/>
+         <label data="193" alias="QCI_193"/>
+         <label data="194" alias="QCI_194"/>
+         <label data="195" alias="QCI_195"/>
+         <label data="196" alias="QCI_196"/>
+         <label data="197" alias="QCI_197"/>
+         <label data="198" alias="QCI_198"/>
+         <label data="199" alias="QCI_199"/>
+         <label data="200" alias="QCI_200"/>
+         <label data="201" alias="QCI_201"/>
+         <label data="202" alias="QCI_202"/>
+         <label data="203" alias="QCI_203"/>
+         <label data="204" alias="QCI_204"/>
+         <label data="205" alias="QCI_205"/>
+         <label data="206" alias="QCI_206"/>
+         <label data="207" alias="QCI_207"/>
+         <label data="208" alias="QCI_208"/>
+         <label data="209" alias="QCI_209"/>
+         <label data="210" alias="QCI_210"/>
+         <label data="211" alias="QCI_211"/>
+         <label data="212" alias="QCI_212"/>
+         <label data="213" alias="QCI_213"/>
+         <label data="214" alias="QCI_214"/>
+         <label data="215" alias="QCI_215"/>
+         <label data="216" alias="QCI_216"/>
+         <label data="217" alias="QCI_217"/>
+         <label data="218" alias="QCI_218"/>
+         <label data="219" alias="QCI_219"/>
+         <label data="220" alias="QCI_220"/>
+         <label data="221" alias="QCI_221"/>
+         <label data="222" alias="QCI_222"/>
+         <label data="223" alias="QCI_223"/>
+         <label data="224" alias="QCI_224"/>
+         <label data="225" alias="QCI_225"/>
+         <label data="226" alias="QCI_226"/>
+         <label data="227" alias="QCI_227"/>
+         <label data="228" alias="QCI_228"/>
+         <label data="229" alias="QCI_229"/>
+         <label data="230" alias="QCI_230"/>
+         <label data="231" alias="QCI_231"/>
+         <label data="232" alias="QCI_232"/>
+         <label data="233" alias="QCI_233"/>
+         <label data="234" alias="QCI_234"/>
+         <label data="235" alias="QCI_235"/>
+         <label data="236" alias="QCI_236"/>
+         <label data="237" alias="QCI_237"/>
+         <label data="238" alias="QCI_238"/>
+         <label data="239" alias="QCI_239"/>
+         <label data="240" alias="QCI_240"/>
+         <label data="241" alias="QCI_241"/>
+         <label data="242" alias="QCI_242"/>
+         <label data="243" alias="QCI_243"/>
+         <label data="244" alias="QCI_244"/>
+         <label data="245" alias="QCI_245"/>
+         <label data="246" alias="QCI_246"/>
+         <label data="247" alias="QCI_247"/>
+         <label data="248" alias="QCI_248"/>
+         <label data="249" alias="QCI_249"/>
+         <label data="250" alias="QCI_250"/>
+         <label data="251" alias="QCI_251"/>
+         <label data="252" alias="QCI_252"/>
+         <label data="253" alias="QCI_253"/>
+         <label data="254" alias="QCI_254"/>
+      </single>
+   </avp>
+   <avp name="QoS-Negotiation" code="1029" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="NO_QoS_NEGOTIATION"/>
+         <label data="1" alias="QoS_NEGOTIATION_SUPPORTED"/>
+      </single>
+   </avp>
+   <avp name="QoS-Upgrade" code="1030" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="QoS_UPGRADE_NOT_SUPPORTED"/>
+         <label data="1" alias="QoS_UPGRADE_SUPPORTED"/>
+      </single>
+   </avp>
+   <avp name="Rule-Failure-Code" code="1031" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="1-15,18">
+         <label data="1" alias="UNKNOWN_RULE_NAME"/>
+         <label data="2" alias="RATING_GROUP_ERROR"/>
+         <label data="3" alias="SERVICE_IDENTIFIER_ERROR"/>
+         <label data="4" alias="GWPCEF_MALFUNCTION"/>
+         <label data="5" alias="RESOURCES_LIMITATION"/>
+         <label data="6" alias="MAX_NR_BEARERS_REACHED"/>
+         <label data="7" alias="UNKNOWN_BEARER_ID"/>
+         <label data="8" alias="MISSING_BEARER_ID"/>
+         <label data="9" alias="MISSING_FLOW_INFORMATION"/>
+         <label data="10" alias="RESOURCE_ALLOCATION_FAILURE"/>
+         <label data="11" alias="UNSUCCESSFUL_QOS_VALIDATION"/>
+         <label data="12" alias="INCORRECT_FLOW_INFORMATION"/>
+         <label data="13" alias="PS_TO_CS_HANDOVER"/>
+         <label data="14" alias="TDF_APPLICATION_IDENTIFIER_ERROR"/>
+         <label data="15" alias="NO_BEARER_BOUND"/>
+         <label data="18" alias="MISSING_REDIRECT_SERVER_ADDRESS"/>
+      </single>
+   </avp>
+   <avp name="RAT-Type" code="1032" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1,1000-1004,2000-2003">
+         <label data="0" alias="WLAN"/>
+         <label data="1" alias="VIRTUAL"/>
+         <label data="1000" alias="UTRAN"/>
+         <label data="1001" alias="GERAN"/>
+         <label data="1002" alias="GAN"/>
+         <label data="1003" alias="HSPA_EVOLUTION"/>
+         <label data="1004" alias="EUTRAN"/>
+         <label data="2000" alias="CDMA2000_1X"/>
+         <label data="2001" alias="HRPD"/>
+         <label data="2002" alias="UMB"/>
+         <label data="2003" alias="EHRPD"/>
+      </single>
+   </avp>
+   <avp name="Allocation-Retention-Priority" code="1034" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <grouped>
+         <avprule id="Priority-Level" type="Mandatory"/>
+         <avprule id="Pre-emption-Capability" type="Optional"/>
+         <avprule id="Pre-emption-Vulnerability" type="Optional"/>
+      </grouped>
+   </avp>
+   <avp name="APN-Aggregate-Max-Bitrate-DL" code="1040" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="APN-Aggregate-Max-Bitrate-UL" code="1041" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Revalidation-Time" code="1042" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Rule-Activation-Time" code="1043" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Rule-DeActivation-Time" code="1044" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Session-Release-Cause" code="1045" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="UNSPECIFIED_REASON"/>
+         <label data="1" alias="UE_SUBSCRIPTION_REASON"/>
+      </single>
+   </avp>
+   <avp name="Priority-Level" code="1046" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Pre-emption-Capability" code="1047" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="PRE-EMPTION_CAPABILITY_ENABLED"/>
+         <label data="1" alias="PRE-EMPTION_CAPABILITY_DISABLED"/>
+      </single>
+   </avp>
+   <avp name="Pre-emption-Vulnerability" code="1048" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="PRE-EMPTION_VULNERABILITY_ENABLED"/>
+         <label data="1" alias="PRE-EMPTION_VULNERABILITY_DISABLED"/>
+      </single>
+   </avp>
+   <avp name="Default-EPS-Bearer-QoS" code="1049" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <grouped>
+         <avprule id="QoS-Class-Identifier" type="Optional"/>
+         <avprule id="Allocation-Retention-Priority" type="Optional"/>
+         <avprule id="AVP" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="AN-GW-Address" code="1050" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Address"/>
+   </avp>
+   <avp name="Authorization-State-Change-Time" code="1057" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Time"/>
+   </avp>
+   <avp name="Flow-Information" code="1058" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <grouped>
+         <avprule id="Flow-Description" type="Optional"/>
+         <avprule id="Flow-Direction" type="Optional"/>
+         <avprule id="AVP" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="Next-Authorization-State" code="1059" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="AUTHORIZED"/>
+         <label data="1" alias="DENIED_CALENDAR_TIME"/>
+      </single>
+   </avp>
+   <avp name="Resource-Allocation-Notification" code="1063" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0">
+         <label data="0" alias="ENABLE_NOTIFICATION"/>
+      </single>
+   </avp>
+   <avp name="Monitoring-Key" code="1066" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Usage-Monitoring-Information" code="1067" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <grouped>
+         <avprule id="Monitoring-Key" type="Optional"/>
+         <avprule id="Granted-Service-Unit" type="Optional"/>
+         <avprule id="Used-Service-Unit" type="Optional"/>
+         <avprule id="Usage-Monitoring-Level" type="Optional"/>
+         <avprule id="Usage-Monitoring-Report" type="Optional"/>
+         <avprule id="Usage-Monitoring-Support" type="Optional"/>
+         <avprule id="AVP" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="Usage-Monitoring-Level" code="1068" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="SESSION_LEVEL"/>
+         <label data="1" alias="PCC_RULE_LEVEL"/>
+      </single>
+   </avp>
+   <avp name="Usage-Monitoring-Report" code="1069" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0">
+         <label data="0" alias="USAGE_MONITORING_REPORT_REQUIRED"/>
+      </single>
+   </avp>
+   <avp name="Usage-Monitoring-Support" code="1070" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0">
+         <label data="0" alias="USAGE_MONITORING_DISABLED"/>
+      </single>
+   </avp>
+   <avp name="Flow-Direction" code="1080" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-3">
+         <label data="0" alias="UNSPECIFIED"/>
+         <label data="1" alias="DOWNLINK"/>
+         <label data="2" alias="UPLINK"/>
+         <label data="3" alias="BIDIRECTIONAL"/>
+      </single>
+   </avp>
+   <avp name="Redirect-Information" code="1085" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <grouped>
+         <avprule id="Redirect-Support" type="Optional"/>
+         <avprule id="Redirect-Address-Type" type="Optional"/>
+         <avprule id="Redirect-Server-Address" type="Optional"/>
+         <avprule id="AVP" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="Redirect-Support" code="1086" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="REDIRECTION_DISABLED"/>
+         <label data="1" alias="REDIRECTION_ENABLED"/>
+      </single>
+   </avp>
+   <avp name="TDF-Application-Identifier" code="1088" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Application-Detection-Information" code="1098" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <grouped>
+         <avprule id="TDF-Application-Identifier" type="Mandatory"/>
+         <avprule id="TDF-Application-Instance-Identifier" type="Optional"/>
+         <avprule id="Flow-Information" type="Optional" qual="*"/>
+         <avprule id="AVP" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="TDF-Application-Instance-Identifier" code="2802" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Mute-Notification" code="2809" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0">
+         <label data="0" alias="MUTE_REQUIRED"/>
+      </single>
+   </avp>
+   <avp name="User-Location-Info-Time" code="2812" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Time"/>
+   </avp>
+   <avp name="Presence-Reporting-Area-Elements-List" code="2820" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Presence-Reporting-Area-Identifier" code="2821" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Presence-Reporting-Area-Information" code="2822" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <grouped>
+         <avprule id="Presence-Reporting-Area-Identifier" type="Optional"/>
+         <avprule id="Presence-Reporting-Area-Status" type="Optional"/>
+         <avprule id="Presence-Reporting-Area-Elements-List" type="Optional"/>
+         <avprule id="AVP" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="Presence-Reporting-Area-Status" code="2823" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="NetLoc-Access-Support" code="2824" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <command name="CER" code="257" type="Request">
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Host-IP-Address" type="Mandatory" qual="1*"/>
+      <avprule id="Vendor-Id" type="Mandatory"/>
+      <avprule id="Product-Name" type="Mandatory"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Supported-Vendor-Id" type="Optional" qual="*"/>
+      <avprule id="Auth-Application-Id" type="Optional" qual="*"/>
+      <avprule id="Inband-Security-Id" type="Optional" qual="*"/>
+      <avprule id="Acct-Application-Id" type="Optional" qual="*"/>
+      <avprule id="Vendor-Specific-Application-Id" type="Optional" qual="*"/>
+      <avprule id="Firmware-Revision" type="Optional"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="CEA" code="257" type="Answer">
+      <avprule id="Result-Code" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Host-IP-Address" type="Mandatory" qual="1*"/>
+      <avprule id="Vendor-Id" type="Mandatory"/>
+      <avprule id="Product-Name" type="Mandatory"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Error-Message" type="Optional"/>
+      <avprule id="Failed-AVP" type="Optional" qual="*"/>
+      <avprule id="Supported-Vendor-Id" type="Optional" qual="*"/>
+      <avprule id="Auth-Application-Id" type="Optional" qual="*"/>
+      <avprule id="Inband-Security-Id" type="Optional" qual="*"/>
+      <avprule id="Acct-Application-Id" type="Optional" qual="*"/>
+      <avprule id="Vendor-Specific-Application-Id" type="Optional" qual="*"/>
+      <avprule id="Firmware-Revision" type="Optional"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="RA-Request" code="258" type="Request">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Auth-Application-Id" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Destination-Realm" type="Mandatory"/>
+      <avprule id="Destination-Host" type="Mandatory"/>
+      <avprule id="Re-Auth-Request-Type" type="Mandatory"/>
+      <avprule id="Session-Release-Cause" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Event-Trigger" type="Optional" qual="*"/>
+      <avprule id="Charging-Rule-Remove" type="Optional" qual="*"/>
+      <avprule id="Charging-Rule-Install" type="Optional" qual="*"/>
+      <avprule id="Default-EPS-Bearer-QoS" type="Optional"/>
+      <avprule id="QoS-Information" type="Optional"/>
+      <avprule id="Revalidation-Time" type="Optional"/>
+      <avprule id="Content-Filtering-Profile-Id" type="Optional"/>
+      <avprule id="Usage-Monitoring-Information" type="Optional" qual="*"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="Route-Record" type="Optional" qual="*"/>
+      <avprule id="Presence-Reporting-Area-Information" type="Optional"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="RA-Answer" code="258" type="Answer">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Result-Code" type="Optional"/>
+      <avprule id="Experimental-Result" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="IP-CAN-Type" type="Optional"/>
+      <avprule id="RAT-Type" type="Optional"/>
+      <avprule id="AN-GW-Address" type="Optional" qual="0*2"/>
+      <avprule id="3GPP-SGSN-MCC-MNC" type="Optional"/>
+      <avprule id="3GPP-SGSN-Address" type="Optional"/>
+      <avprule id="3GPP-SGSN-IPv6-Address" type="Optional"/>
+      <avprule id="RAI" type="Optional"/>
+      <avprule id="3GPP-User-Location-Info" type="Optional"/>
+      <avprule id="3GPP-MS-TimeZone" type="Optional"/>
+      <avprule id="Charging-Rule-Report" type="Optional" qual="*"/>
+      <avprule id="Error-Message" type="Optional"/>
+      <avprule id="Error-Reporting-Host" type="Optional"/>
+      <avprule id="Failed-AVP" type="Optional" qual="*"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="NetLoc-Access-Support" type="Optional"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="ACR" code="271" type="Request">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Destination-Realm" type="Mandatory"/>
+      <avprule id="Accounting-Record-Type" type="Mandatory"/>
+      <avprule id="Accounting-Record-Number" type="Mandatory"/>
+      <avprule id="Acct-Application-Id" type="Optional"/>
+      <avprule id="Vendor-Specific-Application-Id" type="Optional"/>
+      <avprule id="User-Name" type="Optional"/>
+      <avprule id="Accounting-Sub-Session-Id" type="Optional"/>
+      <avprule id="Acct-Session-Id" type="Optional"/>
+      <avprule id="Acct-Multi-Session-Id" type="Optional"/>
+      <avprule id="Acct-Interim-Interval" type="Optional"/>
+      <avprule id="Accounting-Realtime-Required" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Event-Timestamp" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="Route-Record" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="ACA" code="271" type="Answer">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Result-Code" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Accounting-Record-Type" type="Mandatory"/>
+      <avprule id="Accounting-Record-Number" type="Mandatory"/>
+      <avprule id="Acct-Application-Id" type="Optional"/>
+      <avprule id="Vendor-Specific-Application-Id" type="Optional"/>
+      <avprule id="User-Name" type="Optional"/>
+      <avprule id="Accounting-Sub-Session-Id" type="Optional"/>
+      <avprule id="Acct-Session-Id" type="Optional"/>
+      <avprule id="Acct-Multi-Session-Id" type="Optional"/>
+      <avprule id="Error-Reporting-Host" type="Optional"/>
+      <avprule id="Acct-Interim-Interval" type="Optional"/>
+      <avprule id="Accounting-Realtime-Required" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Event-Timestamp" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="CC-Request" code="272" type="Request">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Auth-Application-Id" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Destination-Realm" type="Mandatory"/>
+      <avprule id="CC-Request-Type" type="Mandatory"/>
+      <avprule id="CC-Request-Number" type="Mandatory"/>
+      <avprule id="Destination-Host" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Subscription-Id" type="Optional" qual="*"/>
+      <avprule id="Supported-Features" type="Optional" qual="*"/>
+      <avprule id="Network-Request-Support" type="Optional"/>
+      <avprule id="Bearer-Identifier" type="Optional"/>
+      <avprule id="Bearer-Operation" type="Optional"/>
+      <avprule id="Framed-IP-Address" type="Optional"/>
+      <avprule id="Framed-IPv6-Prefix" type="Optional"/>
+      <avprule id="IP-CAN-Type" type="Optional"/>
+      <avprule id="3GPP-RAT-Type" type="Optional"/>
+      <avprule id="RAT-Type" type="Optional"/>
+      <avprule id="Termination-Cause" type="Optional"/>
+      <avprule id="User-Equipment-Info" type="Optional"/>
+      <avprule id="QoS-Information" type="Optional"/>
+      <avprule id="QoS-Negotiation" type="Optional"/>
+      <avprule id="QoS-Upgrade" type="Optional"/>
+      <avprule id="Default-EPS-Bearer-QoS" type="Optional"/>
+      <avprule id="AN-GW-Address" type="Optional" qual="0*2"/>
+      <avprule id="3GPP-SGSN-MCC-MNC" type="Optional"/>
+      <avprule id="3GPP-SGSN-Address" type="Optional"/>
+      <avprule id="3GPP-SGSN-IPv6-Address" type="Optional"/>
+      <avprule id="RAI" type="Optional"/>
+      <avprule id="3GPP-User-Location-Info" type="Optional"/>
+      <avprule id="3GPP-MS-TimeZone" type="Optional"/>
+      <avprule id="User-Location-Info-Time" type="Optional"/>
+      <avprule id="Called-Station-Id" type="Optional"/>
+      <avprule id="Bearer-Usage" type="Optional"/>
+      <avprule id="Online" type="Optional"/>
+      <avprule id="Offline" type="Optional"/>
+      <avprule id="3GPP-Charging-Characteristics" type="Optional"/>
+      <avprule id="Gx-Capability-List" type="Optional"/>
+      <avprule id="Rule-Space-Decision" type="Optional"/>
+      <avprule id="Rule-Space-Suggestion" type="Optional"/>
+      <avprule id="Charging-Rule-Report" type="Optional" qual="*"/>
+      <avprule id="Event-Trigger" type="Optional" qual="*"/>
+      <avprule id="Access-Network-Charging-Address" type="Optional"/>
+      <avprule id="Application-Detection-Information" type="Optional" qual="*"/>
+      <avprule id="Access-Network-Charging-Identifier-Gx" type="Optional" qual="*"/>
+      <avprule id="Usage-Monitoring-Information" type="Optional" qual="*"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="Route-Record" type="Optional" qual="*"/>
+      <avprule id="Presence-Reporting-Area-Information" type="Optional"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="CC-Answer" code="272" type="Answer">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Auth-Application-Id" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="CC-Request-Type" type="Mandatory"/>
+      <avprule id="CC-Request-Number" type="Mandatory"/>
+      <avprule id="Result-Code" type="Optional"/>
+      <avprule id="Experimental-Result" type="Optional"/>
+      <avprule id="Supported-Features" type="Optional" qual="*"/>
+      <avprule id="Bearer-Control-Mode" type="Optional"/>
+      <avprule id="Event-Trigger" type="Optional" qual="*"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Redirect-Host" type="Optional" qual="*"/>
+      <avprule id="Redirect-Host-Usage" type="Optional"/>
+      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
+      <avprule id="Charging-Rule-Remove" type="Optional" qual="*"/>
+      <avprule id="Charging-Rule-Install" type="Optional" qual="*"/>
+      <avprule id="Charging-Information" type="Optional"/>
+      <avprule id="Online" type="Optional"/>
+      <avprule id="Offline" type="Optional"/>
+      <avprule id="Content-Filtering-Profile-Id" type="Optional"/>
+      <avprule id="3GPP-Charging-Characteristics" type="Optional"/>
+      <avprule id="Gx-Capability-List" type="Optional"/>
+      <avprule id="QoS-Information" type="Optional"/>
+      <avprule id="Revalidation-Time" type="Optional"/>
+      <avprule id="Default-EPS-Bearer-QoS" type="Optional"/>
+      <avprule id="Customer-Id" type="Optional"/>
+      <avprule id="Usage-Monitoring-Information" type="Optional" qual="*"/>
+      <avprule id="Failed-AVP" type="Optional" qual="*"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="Route-Record" type="Optional" qual="*"/>
+      <avprule id="Presence-Reporting-Area-Information" type="Optional"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="ASR" code="274" type="Request">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Destination-Realm" type="Mandatory"/>
+      <avprule id="Destination-Host" type="Mandatory"/>
+      <avprule id="Auth-Application-Id" type="Mandatory"/>
+      <avprule id="User-Name" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="Route-Record" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="ASA" code="274" type="Answer">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Result-Code" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="User-Name" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Error-Message" type="Optional"/>
+      <avprule id="Error-Reporting-Host" type="Optional"/>
+      <avprule id="Failed-AVP" type="Optional" qual="*"/>
+      <avprule id="Redirect-Host" type="Optional" qual="*"/>
+      <avprule id="Redirect-Host-Usage" type="Optional"/>
+      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="STR" code="275" type="Request">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Destination-Realm" type="Mandatory"/>
+      <avprule id="Auth-Application-Id" type="Mandatory"/>
+      <avprule id="Termination-Cause" type="Mandatory"/>
+      <avprule id="User-Name" type="Optional"/>
+      <avprule id="Destination-Host" type="Optional"/>
+      <avprule id="Class" type="Optional" qual="*"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="Route-Record" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="STA" code="275" type="Answer">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Result-Code" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="User-Name" type="Optional"/>
+      <avprule id="Class" type="Optional" qual="*"/>
+      <avprule id="Error-Message" type="Optional"/>
+      <avprule id="Error-Reporting-Host" type="Optional"/>
+      <avprule id="Failed-AVP" type="Optional" qual="*"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Redirect-Host" type="Optional" qual="*"/>
+      <avprule id="Redirect-Host-Usage" type="Optional"/>
+      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="DWR" code="280" type="Request">
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+   </command>
+   <command name="DWA" code="280" type="Answer">
+      <avprule id="Result-Code" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Error-Message" type="Optional"/>
+      <avprule id="Failed-AVP" type="Optional" qual="*"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+   </command>
+   <command name="DPR" code="282" type="Request">
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Disconnect-Cause" type="Mandatory"/>
+   </command>
+   <command name="DPA" code="282" type="Answer">
+      <avprule id="Result-Code" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Error-Message" type="Optional"/>
+      <avprule id="Failed-AVP" type="Optional" qual="*"/>
+   </command>
+</dictionary>
diff --git a/example/diameter/launcher/resources/stack_examples/DictionaryRx.16777236.xml b/example/diameter/launcher/resources/stack_examples/DictionaryRx.16777236.xml
new file mode 100755 (executable)
index 0000000..bfd6c3c
--- /dev/null
@@ -0,0 +1,835 @@
+<dictionary name="DictionaryRx | Application-Id: 16777236">
+   <vendor name="IETF" code="0"/>
+   <vendor name="3GPP" code="10415"/>
+   <vendor name="ETSI" code="13019"/>
+   <avp name="User-Name" code="1" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Framed-IP-Address" code="8" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Class" code="25" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Session-Timeout" code="27" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Called-Station-Id" code="30" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Proxy-State" code="33" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Acct-Session-Id" code="44" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Acct-Multi-Session-Id" code="50" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Event-Timestamp" code="55" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Time"/>
+   </avp>
+   <avp name="Acct-Interim-Interval" code="85" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Framed-IPv6-Prefix" code="97" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Host-IP-Address" code="257" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Address"/>
+   </avp>
+   <avp name="Auth-Application-Id" code="258" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Acct-Application-Id" code="259" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Vendor-Specific-Application-Id" code="260" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Vendor-Id" type="Mandatory" qual="1*"/>
+         <avprule id="Auth-Application-Id" type="Optional"/>
+         <avprule id="Acct-Application-Id" type="Optional"/>
+      </grouped>
+   </avp>
+   <avp name="Redirect-Host-Usage" code="261" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-6">
+         <label data="0" alias="DONT_CACHE"/>
+         <label data="1" alias="ALL_SESSION"/>
+         <label data="2" alias="ALL_REALM"/>
+         <label data="3" alias="REALM_AND_APPLICATION"/>
+         <label data="4" alias="ALL_APPLICATION"/>
+         <label data="5" alias="ALL_HOST"/>
+         <label data="6" alias="ALL_USER"/>
+      </single>
+   </avp>
+   <avp name="Redirect-Max-Cache-Time" code="262" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Session-Id" code="263" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Origin-Host" code="264" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Supported-Vendor-Id" code="265" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Vendor-Id" code="266" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Firmware-Revision" code="267" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Result-Code" code="268" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32">
+         <label data="1001" alias="DIAMETER_MULTI_ROUND_AUTH"/>
+         <label data="2001" alias="DIAMETER_SUCCESS"/>
+         <label data="2002" alias="DIAMETER_LIMITED_SUCCESS"/>
+         <label data="3001" alias="DIAMETER_COMMAND_UNSUPPORTED"/>
+         <label data="3002" alias="DIAMETER_UNABLE_TO_DELIVER"/>
+         <label data="3003" alias="DIAMETER_REALM_NOT_SERVED"/>
+         <label data="3004" alias="DIAMETER_TOO_BUSY"/>
+         <label data="3005" alias="DIAMETER_LOOP_DETECTED"/>
+         <label data="3006" alias="DIAMETER_REDIRECT_INDICATION"/>
+         <label data="3007" alias="DIAMETER_APPLICATION_UNSUPPORTED"/>
+         <label data="3008" alias="DIAMETER_INVALID_HDR_BITS"/>
+         <label data="3009" alias="DIAMETER_INVALID_AVP_BITS"/>
+         <label data="3010" alias="DIAMETER_UNKNOWN_PEER"/>
+         <label data="4001" alias="DIAMETER_AUTHENTICATION_REJECTED"/>
+         <label data="4002" alias="DIAMETER_OUT_OF_SPACE"/>
+         <label data="4003" alias="DIAMETER_ELECTION_LOST"/>
+         <label data="4241" alias="DIAMETER_NO_AVAILABLE_POLICY_COUNTERS"/>
+         <label data="5001" alias="DIAMETER_AVP_UNSUPPORTED"/>
+         <label data="5002" alias="DIAMETER_UNKNOWN_SESSION_ID"/>
+         <label data="5003" alias="DIAMETER_AUTHORIZATION_REJECTED"/>
+         <label data="5004" alias="DIAMETER_INVALID_AVP_VALUE"/>
+         <label data="5005" alias="DIAMETER_MISSING_AVP"/>
+         <label data="5006" alias="DIAMETER_RESOURCES_EXCEEDED"/>
+         <label data="5007" alias="DIAMETER_CONTRADICTING_AVPS"/>
+         <label data="5008" alias="DIAMETER_AVP_NOT_ALLOWED"/>
+         <label data="5009" alias="DIAMETER_AVP_OCCURS_TOO_MANY_TIMES"/>
+         <label data="5010" alias="DIAMETER_NO_COMMON_APPLICATION"/>
+         <label data="5011" alias="DIAMETER_UNSUPPORTED_VERSION"/>
+         <label data="5012" alias="DIAMETER_UNABLE_TO_COMPLY"/>
+         <label data="5013" alias="DIAMETER_INVALID_BIT_IN_HEADER"/>
+         <label data="5014" alias="DIAMETER_INVALID_AVP_LENGTH"/>
+         <label data="5015" alias="DIAMETER_INVALID_MESSAGE_LENGTH"/>
+         <label data="5016" alias="DIAMETER_INVALID_AVP_BIT_COMBO"/>
+         <label data="5017" alias="DIAMETER_NO_COMMON_SECURITY"/>
+         <label data="5030" alias="DIAMETER_USER_UNKNOWN"/>
+         <label data="5063" alias="REQUESTED_SERVICE_NOT_AUTHORIZED"/>
+         <label data="5065" alias="IP_CAN_SESSION_NOT_AVAILABLE"/>
+      </single>
+   </avp>
+   <avp name="Product-Name" code="269" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Session-Binding" code="270" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Session-Server-Failover" code="271" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-3">
+         <label data="0" alias="REFUSE_SERVICE"/>
+         <label data="1" alias="TRY_AGAIN"/>
+         <label data="2" alias="ALLOW_SERVICE"/>
+         <label data="3" alias="TRY_AGAIN_ALLOW_SERVICE"/>
+      </single>
+   </avp>
+   <avp name="Multi-Round-Time-Out" code="272" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Disconnect-Cause" code="273" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-2">
+         <label data="0" alias="REBOOTING"/>
+         <label data="1" alias="BUSY"/>
+         <label data="2" alias="DO_NOT_WANT_TO_TALK_TO_YOU"/>
+      </single>
+   </avp>
+   <avp name="Auth-Request-Type" code="274" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="1-3">
+         <label data="1" alias="AUTHENTICATE_ONLY"/>
+         <label data="2" alias="AUTHORIZE_ONLY"/>
+         <label data="3" alias="AUTHORIZE_AUTHENTICATE"/>
+      </single>
+   </avp>
+   <avp name="Auth-Grace-Period" code="276" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Auth-Session-State" code="277" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="STATE_MAINTAINED"/>
+         <label data="1" alias="NO_STATE_MAINTAINED"/>
+      </single>
+   </avp>
+   <avp name="Origin-State-Id" code="278" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Failed-AVP" code="279" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="AVP" type="Mandatory" qual="1*"/>
+      </grouped>
+   </avp>
+   <avp name="Proxy-Host" code="280" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Error-Message" code="281" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Route-Record" code="282" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Destination-Realm" code="283" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Proxy-Info" code="284" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Proxy-Host" type="Mandatory"/>
+         <avprule id="Proxy-State" type="Mandatory"/>
+         <avprule id="AVP" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="Re-Auth-Request-Type" code="285" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="AUTHORIZE_ONLY"/>
+         <label data="1" alias="AUTHORIZE_AUTHENTICATE"/>
+      </single>
+   </avp>
+   <avp name="Accounting-Sub-Session-Id" code="287" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned64"/>
+   </avp>
+   <avp name="Redirect-Host" code="292" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterURI"/>
+   </avp>
+   <avp name="Destination-Host" code="293" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Error-Reporting-Host" code="294" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Termination-Cause" code="295" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="1-8">
+         <label data="1" alias="LOGOUT"/>
+         <label data="2" alias="SERVICE_NOT_PROVIDED"/>
+         <label data="3" alias="BAD_ANSWER"/>
+         <label data="4" alias="ADMINISTRATIVE"/>
+         <label data="5" alias="LINK_BROKEN"/>
+         <label data="6" alias="AUTH_EXPIRED"/>
+         <label data="7" alias="USER_MOVED"/>
+         <label data="8" alias="SESSION_TIMEOUT"/>
+      </single>
+   </avp>
+   <avp name="Origin-Realm" code="296" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Experimental-Result" code="297" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Vendor-Id" type="Mandatory"/>
+         <avprule id="Experimental-Result-Code" type="Mandatory"/>
+      </grouped>
+   </avp>
+   <avp name="Experimental-Result-Code" code="298" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Inband-Security-Id" code="299" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="E2E-Sequence" code="300" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="AVP" type="Mandatory" qual="2*"/>
+      </grouped>
+   </avp>
+   <avp name="Subscription-Id" code="443" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Subscription-Id-Type" type="Mandatory"/>
+         <avprule id="Subscription-Id-Data" type="Mandatory"/>
+      </grouped>
+   </avp>
+   <avp name="Subscription-Id-Data" code="444" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Subscription-Id-Type" code="450" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-4">
+         <label data="0" alias="END_USER_E164"/>
+         <label data="1" alias="END_USER_IMSI"/>
+         <label data="2" alias="END_USER_SIP_URI"/>
+         <label data="3" alias="END_USER_NAI"/>
+         <label data="4" alias="END_USER_PRIVATE"/>
+      </single>
+   </avp>
+   <avp name="User-Equipment-Info" code="458" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
+      <grouped>
+         <avprule id="User-Equipment-Info-Type" type="Mandatory"/>
+         <avprule id="User-Equipment-Info-Value" type="Mandatory"/>
+      </grouped>
+   </avp>
+   <avp name="User-Equipment-Info-Type" code="459" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-3">
+         <label data="0" alias="IMEISV"/>
+         <label data="1" alias="MAC"/>
+         <label data="2" alias="EUI64"/>
+         <label data="3" alias="MODIFIED_EUI64"/>
+      </single>
+   </avp>
+   <avp name="User-Equipment-Info-Value" code="460" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Accounting-Record-Type" code="480" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="1-4">
+         <label data="1" alias="EVENT_RECORD"/>
+         <label data="2" alias="START_RECORD"/>
+         <label data="3" alias="INTERIM_RECORD"/>
+         <label data="4" alias="STOP_RECORD"/>
+      </single>
+   </avp>
+   <avp name="Accounting-Realtime-Required" code="483" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="1-3">
+         <label data="1" alias="DELIVER_AND_GRANT"/>
+         <label data="2" alias="GRANT_AND_STORE"/>
+         <label data="3" alias="GRANT_AND_LOSE"/>
+      </single>
+   </avp>
+   <avp name="Accounting-Record-Number" code="485" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="3GPP-SGSN-MCC-MNC" code="18" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="3GPP-User-Location-Info" code="22" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="3GPP-MS-TimeZone" code="23" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="TWAN-Identifier" code="29" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Abort-Cause" code="500" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-4">
+         <label data="0" alias="BEARER_RELEASED"/>
+         <label data="1" alias="INSUFFICIENT_SERVER_RESOURCES"/>
+         <label data="2" alias="INSUFFICIENT_BEARER_RESOURCES"/>
+         <label data="3" alias="PS_TO_CS_HANDOVER"/>
+         <label data="4" alias="SPONSORED_DATA_CONNECTIVITY_DISALLOWED"/>
+      </single>
+   </avp>
+   <avp name="Access-Network-Charging-Identifier" code="502" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Access-Network-Charging-Identifier-Value" type="Mandatory"/>
+         <avprule id="Flows" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="Access-Network-Charging-Identifier-Value" code="503" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="AF-Application-Identifier" code="504" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="AF-Charging-Identifier" code="505" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Flow-Description" code="507" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="IPFilterRule"/>
+   </avp>
+   <avp name="Flow-Number" code="509" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Flows" code="510" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Media-Component-Number" type="Mandatory"/>
+         <avprule id="Flow-Number" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="Flow-Status" code="511" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-4">
+         <label data="0" alias="ENABLED-UPLINK"/>
+         <label data="1" alias="ENABLED-DOWNLINK"/>
+         <label data="2" alias="ENABLED"/>
+         <label data="3" alias="DISABLED"/>
+         <label data="4" alias="REMOVED"/>
+      </single>
+   </avp>
+   <avp name="Flow-Usage" code="512" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-2">
+         <label data="0" alias="NO_INFORMATION"/>
+         <label data="1" alias="RTCP"/>
+         <label data="2" alias="AF_SIGNALLING"/>
+      </single>
+   </avp>
+   <avp name="Specific-Action" code="513" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="1-4,6-14,16">
+         <label data="1" alias="CHARGING_CORRELATION_EXCHANGE"/>
+         <label data="2" alias="INDICATION_OF_LOSS_OF_BEARER"/>
+         <label data="3" alias="INDICATION_OF_RECOVERY_OF_BEARER"/>
+         <label data="4" alias="INDICATION_OF_RELEASE_OF_BEARER"/>
+         <label data="6" alias="IP-CAN_CHANGE"/>
+         <label data="7" alias="INDICATION_OF_OUT_OF_CREDIT"/>
+         <label data="8" alias="INDICATION_OF_SUCCESSFUL_RESOURCES_ALLOCATION"/>
+         <label data="9" alias="INDICATION_OF_FAILED_RESOURCES_ALLOCATION"/>
+         <label data="10" alias="INDICATION_OF_LIMITED_PCC_DEPLOYMENT"/>
+         <label data="11" alias="USAGE_REPORT"/>
+         <label data="12" alias="ACCESS_NETWORK_INFO_REPORT"/>
+         <label data="13" alias="INDICATION_OF_RECOVERY_FROM_LIMITED_PCC_DEPLOYMENT"/>
+         <label data="14" alias="INDICATION_OF_ACCESS_NETWORK_INFO_REPORTING_FAILURE"/>
+         <label data="16" alias="PLMN_CHANGE"/>
+      </single>
+   </avp>
+   <avp name="Max-Requested-Bandwidth-DL" code="515" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Max-Requested-Bandwidth-UL" code="516" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Media-Component-Description" code="517" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Media-Component-Number" type="Mandatory"/>
+         <avprule id="Media-Sub-Component" type="Optional" qual="*"/>
+         <avprule id="AF-Application-Identifier" type="Optional"/>
+         <avprule id="Media-Type" type="Optional"/>
+         <avprule id="Max-Requested-Bandwidth-UL" type="Optional"/>
+         <avprule id="Max-Requested-Bandwidth-DL" type="Optional"/>
+         <avprule id="Min-Requested-Bandwidth-UL" type="Optional"/>
+         <avprule id="Min-Requested-Bandwidth-DL" type="Optional"/>
+         <avprule id="Extended-Max-Requested-BW-UL" type="Optional"/>
+         <avprule id="Extended-Max-Requested-BW-DL" type="Optional"/>
+         <avprule id="Flow-Status" type="Optional"/>
+         <avprule id="Reservation-Priority" type="Optional"/>
+         <avprule id="RS-Bandwidth" type="Optional"/>
+         <avprule id="RR-Bandwidth" type="Optional"/>
+         <avprule id="Codec-Data" type="Optional" qual="*"/>
+         <avprule id="AVP" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="Media-Component-Number" code="518" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Media-Sub-Component" code="519" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Flow-Number" type="Mandatory"/>
+         <avprule id="Flow-Description" type="Optional" qual="0*2"/>
+         <avprule id="Flow-Status" type="Optional"/>
+         <avprule id="Flow-Usage" type="Optional"/>
+         <avprule id="AF-Signalling-Protocol" type="Optional"/>
+         <avprule id="Max-Requested-Bandwidth-UL" type="Optional"/>
+         <avprule id="Max-Requested-Bandwidth-DL" type="Optional"/>
+         <avprule id="Extended-Max-Requested-BW-UL" type="Optional"/>
+         <avprule id="Extended-Max-Requested-BW-DL" type="Optional"/>
+         <avprule id="AVP" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="Media-Type" code="520" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-6">
+         <label data="0" alias="OTHER"/>
+         <label data="1" alias="VIDEO"/>
+         <label data="2" alias="DATA"/>
+         <label data="3" alias="APPLICATION"/>
+         <label data="4" alias="CONTROL"/>
+         <label data="5" alias="TEXT"/>
+         <label data="6" alias="MESSAGE"/>
+      </single>
+   </avp>
+   <avp name="RR-Bandwidth" code="521" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="RS-Bandwidth" code="522" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="SIP-Forking-Indication" code="523" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="SINGLE_DIALOGUE"/>
+         <label data="1" alias="SEVERAL_DIALOGUES"/>
+      </single>
+   </avp>
+   <avp name="Codec-Data" code="524" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Service-URN" code="525" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Service-Info-Status" code="527" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="FINAL_SERVICE_INFORMATION"/>
+         <label data="1" alias="PRELIMINARY_SERVICE_INFORMATION"/>
+      </single>
+   </avp>
+   <avp name="MPS-Identifier" code="528" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="AF-Signalling-Protocol" code="529" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="NO_INFORMATION"/>
+         <label data="1" alias="SIP"/>
+      </single>
+   </avp>
+   <avp name="Rx-Request-Type" code="533" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-2">
+         <label data="0" alias="INITIAL_REQUEST"/>
+         <label data="1" alias="UPDATE_REQUEST"/>
+         <label data="2" alias="PCSCF_RESTORATION"/>
+      </single>
+   </avp>
+   <avp name="Min-Requested-Bandwidth-DL" code="534" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Min-Requested-Bandwidth-UL" code="535" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Required-Access-Info" code="536" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="USER_LOCATION"/>
+         <label data="1" alias="MS_TIME_ZONE"/>
+      </single>
+   </avp>
+   <avp name="IP-Domain-Id" code="537" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="AF-Requested-Data" code="551" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Extended-Max-Requested-BW-DL" code="554" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Extended-Max-Requested-BW-UL" code="555" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Supported-Features" code="628" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Vendor-Id" type="Mandatory"/>
+         <avprule id="Feature-List-ID" type="Mandatory"/>
+         <avprule id="Feature-List" type="Mandatory"/>
+         <avprule id="AVP" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="Feature-List-ID" code="629" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Feature-List" code="630" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="IP-CAN-Type" code="1027" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-7">
+         <label data="0" alias="3GPP-GPRS"/>
+         <label data="1" alias="DOCSIS"/>
+         <label data="2" alias="xDSL"/>
+         <label data="3" alias="WiMAX"/>
+         <label data="4" alias="3GPP2"/>
+         <label data="5" alias="3GPP-EPS"/>
+         <label data="6" alias="Non-3GPP-EPS"/>
+         <label data="7" alias="FBA"/>
+      </single>
+   </avp>
+   <avp name="RAT-Type" code="1032" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1,1000-1005,2000-2003">
+         <label data="0" alias="WLAN"/>
+         <label data="1" alias="VIRTUAL"/>
+         <label data="1000" alias="UTRAN"/>
+         <label data="1001" alias="GERAN"/>
+         <label data="1002" alias="GAN"/>
+         <label data="1003" alias="HSPA_EVOLUTION"/>
+         <label data="1004" alias="EUTRAN"/>
+         <label data="1005" alias="EUTRAN-NB-IoT"/>
+         <label data="2000" alias="CDMA2000_1X"/>
+         <label data="2001" alias="HRPD"/>
+         <label data="2002" alias="UMB"/>
+         <label data="2003" alias="EHRPD"/>
+      </single>
+   </avp>
+   <avp name="AN-GW-Address" code="1050" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Address"/>
+   </avp>
+   <avp name="AN-Trusted" code="1503" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="TRUSTED"/>
+         <label data="1" alias="UNTRUSTED"/>
+      </single>
+   </avp>
+   <avp name="User-Equipment-Local-IP-Address" code="2805" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="UDP-Source-Port" code="2806" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="User-Location-Info-Time" code="2812" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Time"/>
+   </avp>
+   <avp name="NetLoc-Access-Support" code="2824" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="TCP-Source-Port" code="2843" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Reservation-Priority" code="458" vendor-name="ETSI" may-encrypt="yes" v-bit="must" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-15">
+         <label data="0" alias="DEFAULT"/>
+         <label data="1" alias="PRIORITY-ONE"/>
+         <label data="2" alias="PRIORITY-TWO"/>
+         <label data="3" alias="PRIORITY-THREE"/>
+         <label data="4" alias="PRIORITY-FOUR"/>
+         <label data="5" alias="PRIORITY-FIVE"/>
+         <label data="6" alias="PRIORITY-SIX"/>
+         <label data="7" alias="PRIORITY-SEVEN"/>
+         <label data="8" alias="PRIORITY-EIGHT"/>
+         <label data="9" alias="PRIORITY-NINE"/>
+         <label data="10" alias="PRIORITY-TEN"/>
+         <label data="11" alias="PRIORITY-ELEVEN"/>
+         <label data="12" alias="PRIORITY-TWELVE"/>
+         <label data="13" alias="PRIORITY-THIRTEEN"/>
+         <label data="14" alias="PRIORITY-FOURTEEN"/>
+         <label data="15" alias="PRIORITY-FIFTEEN"/>
+      </single>
+   </avp>
+   <command name="CER" code="257" type="Request">
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Host-IP-Address" type="Mandatory" qual="1*"/>
+      <avprule id="Vendor-Id" type="Mandatory"/>
+      <avprule id="Product-Name" type="Mandatory"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Supported-Vendor-Id" type="Optional" qual="*"/>
+      <avprule id="Auth-Application-Id" type="Optional" qual="*"/>
+      <avprule id="Inband-Security-Id" type="Optional" qual="*"/>
+      <avprule id="Acct-Application-Id" type="Optional" qual="*"/>
+      <avprule id="Vendor-Specific-Application-Id" type="Optional" qual="*"/>
+      <avprule id="Firmware-Revision" type="Optional"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="CEA" code="257" type="Answer">
+      <avprule id="Result-Code" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Host-IP-Address" type="Mandatory" qual="1*"/>
+      <avprule id="Vendor-Id" type="Mandatory"/>
+      <avprule id="Product-Name" type="Mandatory"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Error-Message" type="Optional"/>
+      <avprule id="Failed-AVP" type="Optional" qual="*"/>
+      <avprule id="Supported-Vendor-Id" type="Optional" qual="*"/>
+      <avprule id="Auth-Application-Id" type="Optional" qual="*"/>
+      <avprule id="Inband-Security-Id" type="Optional" qual="*"/>
+      <avprule id="Acct-Application-Id" type="Optional" qual="*"/>
+      <avprule id="Vendor-Specific-Application-Id" type="Optional" qual="*"/>
+      <avprule id="Firmware-Revision" type="Optional"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="RA-Request" code="258" type="Request">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Destination-Realm" type="Mandatory"/>
+      <avprule id="Destination-Host" type="Mandatory"/>
+      <avprule id="Auth-Application-Id" type="Mandatory"/>
+      <avprule id="Specific-Action" type="Mandatory" qual="*"/>
+      <avprule id="Access-Network-Charging-Identifier" type="Optional" qual="*"/>
+      <avprule id="Flows" type="Optional" qual="*"/>
+      <avprule id="Abort-Cause" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="Route-Record" type="Optional" qual="*"/>
+      <avprule id="3GPP-MS-TimeZone" type="Optional"/>
+      <avprule id="3GPP-User-Location-Info" type="Optional"/>
+      <avprule id="User-Equipment-Local-IP-Address" type="Optional"/>
+      <avprule id="TCP-Source-Port" type="Optional"/>
+      <avprule id="UDP-Source-Port" type="Optional"/>
+      <avprule id="TWAN-Identifier" type="Optional"/>
+      <avprule id="3GPP-SGSN-MCC-MNC" type="Optional"/>
+      <avprule id="NetLoc-Access-Support" type="Optional"/>
+      <avprule id="User-Location-Info-Time" type="Optional"/>
+      <avprule id="IP-CAN-Type" type="Optional"/>
+      <avprule id="RAT-Type" type="Optional"/>
+      <avprule id="AN-Trusted" type="Optional"/>
+      <avprule id="AN-GW-Address" type="Optional" qual="0*2"/>
+   </command>
+   <command name="RA-Answer" code="258" type="Answer">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Result-Code" type="Optional"/>
+      <avprule id="Experimental-Result" type="Optional"/>
+      <avprule id="Media-Component-Description" type="Optional" qual="*"/>
+      <avprule id="Service-URN" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Class" type="Optional" qual="*"/>
+      <avprule id="Error-Message" type="Optional"/>
+      <avprule id="Error-Reporting-Host" type="Optional"/>
+      <avprule id="Redirect-Host" type="Optional" qual="*"/>
+      <avprule id="Redirect-Host-Usage" type="Optional"/>
+      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
+      <avprule id="Failed-AVP" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="AA-Request" code="265" type="Request">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Auth-Application-Id" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Destination-Realm" type="Mandatory"/>
+      <avprule id="Destination-Host" type="Optional"/>
+      <avprule id="IP-Domain-Id" type="Optional"/>
+      <avprule id="AF-Application-Identifier" type="Optional"/>
+      <avprule id="Media-Component-Description" type="Optional" qual="*"/>
+      <avprule id="Service-Info-Status" type="Optional"/>
+      <avprule id="AF-Charging-Identifier" type="Optional"/>
+      <avprule id="SIP-Forking-Indication" type="Optional"/>
+      <avprule id="Specific-Action" type="Optional" qual="*"/>
+      <avprule id="Subscription-Id" type="Optional" qual="*"/>
+      <avprule id="Supported-Features" type="Optional" qual="*"/>
+      <avprule id="Reservation-Priority" type="Optional"/>
+      <avprule id="Framed-IP-Address" type="Optional"/>
+      <avprule id="Framed-IPv6-Prefix" type="Optional"/>
+      <avprule id="Called-Station-Id" type="Optional"/>
+      <avprule id="Service-URN" type="Optional"/>
+      <avprule id="MPS-Identifier" type="Optional"/>
+      <avprule id="Rx-Request-Type" type="Optional"/>
+      <avprule id="Required-Access-Info" type="Optional" qual="*"/>
+      <avprule id="AF-Requested-Data" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="Route-Record" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="AA-Answer" code="265" type="Answer">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Auth-Application-Id" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Result-Code" type="Optional"/>
+      <avprule id="Experimental-Result" type="Optional"/>
+      <avprule id="AN-Trusted" type="Optional"/>
+      <avprule id="IP-CAN-Type" type="Optional"/>
+      <avprule id="RAT-Type" type="Optional"/>
+      <avprule id="Supported-Features" type="Optional" qual="*"/>
+      <avprule id="Subscription-Id" type="Optional" qual="*"/>
+      <avprule id="User-Equipment-Info" type="Optional"/>
+      <avprule id="3GPP-SGSN-MCC-MNC" type="Optional"/>
+      <avprule id="Failed-AVP" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+   </command>
+   <command name="ACR" code="271" type="Request">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Destination-Realm" type="Mandatory"/>
+      <avprule id="Accounting-Record-Type" type="Mandatory"/>
+      <avprule id="Accounting-Record-Number" type="Mandatory"/>
+      <avprule id="Acct-Application-Id" type="Optional"/>
+      <avprule id="Vendor-Specific-Application-Id" type="Optional"/>
+      <avprule id="User-Name" type="Optional"/>
+      <avprule id="Accounting-Sub-Session-Id" type="Optional"/>
+      <avprule id="Acct-Session-Id" type="Optional"/>
+      <avprule id="Acct-Multi-Session-Id" type="Optional"/>
+      <avprule id="Acct-Interim-Interval" type="Optional"/>
+      <avprule id="Accounting-Realtime-Required" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Event-Timestamp" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="Route-Record" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="ACA" code="271" type="Answer">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Result-Code" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Accounting-Record-Type" type="Mandatory"/>
+      <avprule id="Accounting-Record-Number" type="Mandatory"/>
+      <avprule id="Acct-Application-Id" type="Optional"/>
+      <avprule id="Vendor-Specific-Application-Id" type="Optional"/>
+      <avprule id="User-Name" type="Optional"/>
+      <avprule id="Accounting-Sub-Session-Id" type="Optional"/>
+      <avprule id="Acct-Session-Id" type="Optional"/>
+      <avprule id="Acct-Multi-Session-Id" type="Optional"/>
+      <avprule id="Error-Reporting-Host" type="Optional"/>
+      <avprule id="Acct-Interim-Interval" type="Optional"/>
+      <avprule id="Accounting-Realtime-Required" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Event-Timestamp" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="AS-Request" code="274" type="Request">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Destination-Realm" type="Mandatory"/>
+      <avprule id="Destination-Host" type="Mandatory"/>
+      <avprule id="Auth-Application-Id" type="Mandatory"/>
+      <avprule id="Abort-Cause" type="Mandatory"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="Route-Record" type="Optional" qual="*"/>
+   </command>
+   <command name="AS-Answer" code="274" type="Answer">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Result-Code" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Error-Message" type="Optional"/>
+      <avprule id="Error-Reporting-Host" type="Optional"/>
+      <avprule id="Failed-AVP" type="Optional"/>
+      <avprule id="Redirect-Host" type="Optional" qual="*"/>
+      <avprule id="Redirect-Host-Usage" type="Optional"/>
+      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="ST-Request" code="275" type="Request">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Destination-Realm" type="Mandatory"/>
+      <avprule id="Auth-Application-Id" type="Mandatory"/>
+      <avprule id="Termination-Cause" type="Mandatory"/>
+      <avprule id="Destination-Host" type="Optional"/>
+      <avprule id="Required-Access-Info" type="Optional" qual="*"/>
+      <avprule id="Class" type="Optional" qual="*"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="Route-Record" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="ST-Answer" code="275" type="Answer">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Result-Code" type="Optional"/>
+      <avprule id="Failed-AVP" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="3GPP-MS-TimeZone" type="Optional"/>
+      <avprule id="3GPP-User-Location-Info" type="Optional"/>
+      <avprule id="User-Equipment-Local-IP-Address" type="Optional"/>
+      <avprule id="TCP-Source-Port" type="Optional"/>
+      <avprule id="UDP-Source-Port" type="Optional"/>
+      <avprule id="TWAN-Identifier" type="Optional"/>
+      <avprule id="3GPP-SGSN-MCC-MNC" type="Optional"/>
+      <avprule id="NetLoc-Access-Support" type="Optional"/>
+      <avprule id="User-Location-Info-Time" type="Optional"/>
+   </command>
+   <command name="DWR" code="280" type="Request">
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+   </command>
+   <command name="DWA" code="280" type="Answer">
+      <avprule id="Result-Code" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Error-Message" type="Optional"/>
+      <avprule id="Failed-AVP" type="Optional" qual="*"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+   </command>
+   <command name="DPR" code="282" type="Request">
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Disconnect-Cause" type="Mandatory"/>
+   </command>
+   <command name="DPA" code="282" type="Answer">
+      <avprule id="Result-Code" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Error-Message" type="Optional"/>
+      <avprule id="Failed-AVP" type="Optional" qual="*"/>
+   </command>
+</dictionary>
diff --git a/example/diameter/launcher/resources/stack_examples/DictionarySy.16777302.xml b/example/diameter/launcher/resources/stack_examples/DictionarySy.16777302.xml
new file mode 100755 (executable)
index 0000000..0817e8e
--- /dev/null
@@ -0,0 +1,554 @@
+<dictionary name="DictionarySy | Application-Id: 16777302">
+   <vendor name="IETF" code="0"/>
+   <vendor name="3GPP" code="10415"/>
+   <avp name="User-Name" code="1" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Class" code="25" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Session-Timeout" code="27" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Proxy-State" code="33" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Acct-Session-Id" code="44" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Acct-Multi-Session-Id" code="50" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Event-Timestamp" code="55" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Time"/>
+   </avp>
+   <avp name="Acct-Interim-Interval" code="85" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Host-IP-Address" code="257" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Address"/>
+   </avp>
+   <avp name="Auth-Application-Id" code="258" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Acct-Application-Id" code="259" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Vendor-Specific-Application-Id" code="260" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Vendor-Id" type="Mandatory" qual="1*"/>
+         <avprule id="Auth-Application-Id" type="Optional"/>
+         <avprule id="Acct-Application-Id" type="Optional"/>
+      </grouped>
+   </avp>
+   <avp name="Redirect-Host-Usage" code="261" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-6">
+         <label data="0" alias="DONT_CACHE"/>
+         <label data="1" alias="ALL_SESSION"/>
+         <label data="2" alias="ALL_REALM"/>
+         <label data="3" alias="REALM_AND_APPLICATION"/>
+         <label data="4" alias="ALL_APPLICATION"/>
+         <label data="5" alias="ALL_HOST"/>
+         <label data="6" alias="ALL_USER"/>
+      </single>
+   </avp>
+   <avp name="Redirect-Max-Cache-Time" code="262" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Session-Id" code="263" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Origin-Host" code="264" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Supported-Vendor-Id" code="265" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Vendor-Id" code="266" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Firmware-Revision" code="267" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Result-Code" code="268" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32">
+         <label data="1001" alias="DIAMETER_MULTI_ROUND_AUTH"/>
+         <label data="2001" alias="DIAMETER_SUCCESS"/>
+         <label data="2002" alias="DIAMETER_LIMITED_SUCCESS"/>
+         <label data="3001" alias="DIAMETER_COMMAND_UNSUPPORTED"/>
+         <label data="3002" alias="DIAMETER_UNABLE_TO_DELIVER"/>
+         <label data="3003" alias="DIAMETER_REALM_NOT_SERVED"/>
+         <label data="3004" alias="DIAMETER_TOO_BUSY"/>
+         <label data="3005" alias="DIAMETER_LOOP_DETECTED"/>
+         <label data="3006" alias="DIAMETER_REDIRECT_INDICATION"/>
+         <label data="3007" alias="DIAMETER_APPLICATION_UNSUPPORTED"/>
+         <label data="3008" alias="DIAMETER_INVALID_HDR_BITS"/>
+         <label data="3009" alias="DIAMETER_INVALID_AVP_BITS"/>
+         <label data="3010" alias="DIAMETER_UNKNOWN_PEER"/>
+         <label data="4001" alias="DIAMETER_AUTHENTICATION_REJECTED"/>
+         <label data="4002" alias="DIAMETER_OUT_OF_SPACE"/>
+         <label data="4003" alias="DIAMETER_ELECTION_LOST"/>
+         <label data="4241" alias="DIAMETER_NO_AVAILABLE_POLICY_COUNTERS"/>
+         <label data="5001" alias="DIAMETER_AVP_UNSUPPORTED"/>
+         <label data="5002" alias="DIAMETER_UNKNOWN_SESSION_ID"/>
+         <label data="5003" alias="DIAMETER_AUTHORIZATION_REJECTED"/>
+         <label data="5004" alias="DIAMETER_INVALID_AVP_VALUE"/>
+         <label data="5005" alias="DIAMETER_MISSING_AVP"/>
+         <label data="5006" alias="DIAMETER_RESOURCES_EXCEEDED"/>
+         <label data="5007" alias="DIAMETER_CONTRADICTING_AVPS"/>
+         <label data="5008" alias="DIAMETER_AVP_NOT_ALLOWED"/>
+         <label data="5009" alias="DIAMETER_AVP_OCCURS_TOO_MANY_TIMES"/>
+         <label data="5010" alias="DIAMETER_NO_COMMON_APPLICATION"/>
+         <label data="5011" alias="DIAMETER_UNSUPPORTED_VERSION"/>
+         <label data="5012" alias="DIAMETER_UNABLE_TO_COMPLY"/>
+         <label data="5013" alias="DIAMETER_INVALID_BIT_IN_HEADER"/>
+         <label data="5014" alias="DIAMETER_INVALID_AVP_LENGTH"/>
+         <label data="5015" alias="DIAMETER_INVALID_MESSAGE_LENGTH"/>
+         <label data="5016" alias="DIAMETER_INVALID_AVP_BIT_COMBO"/>
+         <label data="5017" alias="DIAMETER_NO_COMMON_SECURITY"/>
+         <label data="5030" alias="DIAMETER_USER_UNKNOWN"/>
+         <label data="5063" alias="REQUESTED_SERVICE_NOT_AUTHORIZED"/>
+         <label data="5065" alias="IP_CAN_SESSION_NOT_AVAILABLE"/>
+      </single>
+   </avp>
+   <avp name="Product-Name" code="269" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Session-Binding" code="270" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Session-Server-Failover" code="271" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-3">
+         <label data="0" alias="REFUSE_SERVICE"/>
+         <label data="1" alias="TRY_AGAIN"/>
+         <label data="2" alias="ALLOW_SERVICE"/>
+         <label data="3" alias="TRY_AGAIN_ALLOW_SERVICE"/>
+      </single>
+   </avp>
+   <avp name="Multi-Round-Time-Out" code="272" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Disconnect-Cause" code="273" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-2">
+         <label data="0" alias="REBOOTING"/>
+         <label data="1" alias="BUSY"/>
+         <label data="2" alias="DO_NOT_WANT_TO_TALK_TO_YOU"/>
+      </single>
+   </avp>
+   <avp name="Auth-Request-Type" code="274" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="1-3">
+         <label data="1" alias="AUTHENTICATE_ONLY"/>
+         <label data="2" alias="AUTHORIZE_ONLY"/>
+         <label data="3" alias="AUTHORIZE_AUTHENTICATE"/>
+      </single>
+   </avp>
+   <avp name="Auth-Grace-Period" code="276" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Auth-Session-State" code="277" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="STATE_MAINTAINED"/>
+         <label data="1" alias="NO_STATE_MAINTAINED"/>
+      </single>
+   </avp>
+   <avp name="Origin-State-Id" code="278" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Failed-AVP" code="279" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="AVP" type="Mandatory" qual="1*"/>
+      </grouped>
+   </avp>
+   <avp name="Proxy-Host" code="280" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Error-Message" code="281" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Route-Record" code="282" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Destination-Realm" code="283" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Proxy-Info" code="284" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Proxy-Host" type="Mandatory"/>
+         <avprule id="Proxy-State" type="Mandatory"/>
+         <avprule id="AVP" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="Re-Auth-Request-Type" code="285" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="AUTHORIZE_ONLY"/>
+         <label data="1" alias="AUTHORIZE_AUTHENTICATE"/>
+      </single>
+   </avp>
+   <avp name="Accounting-Sub-Session-Id" code="287" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned64"/>
+   </avp>
+   <avp name="Redirect-Host" code="292" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterURI"/>
+   </avp>
+   <avp name="Destination-Host" code="293" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Error-Reporting-Host" code="294" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Termination-Cause" code="295" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="1-8">
+         <label data="1" alias="LOGOUT"/>
+         <label data="2" alias="SERVICE_NOT_PROVIDED"/>
+         <label data="3" alias="BAD_ANSWER"/>
+         <label data="4" alias="ADMINISTRATIVE"/>
+         <label data="5" alias="LINK_BROKEN"/>
+         <label data="6" alias="AUTH_EXPIRED"/>
+         <label data="7" alias="USER_MOVED"/>
+         <label data="8" alias="SESSION_TIMEOUT"/>
+      </single>
+   </avp>
+   <avp name="Origin-Realm" code="296" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Experimental-Result" code="297" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Vendor-Id" type="Mandatory"/>
+         <avprule id="Experimental-Result-Code" type="Mandatory"/>
+      </grouped>
+   </avp>
+   <avp name="Experimental-Result-Code" code="298" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Inband-Security-Id" code="299" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="E2E-Sequence" code="300" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="AVP" type="Mandatory" qual="2*"/>
+      </grouped>
+   </avp>
+   <avp name="Logical-Access-ID" code="302" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Physical-Access-ID" code="313" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Subscription-Id" code="443" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Subscription-Id-Type" type="Mandatory"/>
+         <avprule id="Subscription-Id-Data" type="Mandatory"/>
+      </grouped>
+   </avp>
+   <avp name="Subscription-Id-Data" code="444" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Subscription-Id-Type" code="450" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-4">
+         <label data="0" alias="END_USER_E164"/>
+         <label data="1" alias="END_USER_IMSI"/>
+         <label data="2" alias="END_USER_SIP_URI"/>
+         <label data="3" alias="END_USER_NAI"/>
+         <label data="4" alias="END_USER_PRIVATE"/>
+      </single>
+   </avp>
+   <avp name="Accounting-Record-Type" code="480" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="1-4">
+         <label data="1" alias="EVENT_RECORD"/>
+         <label data="2" alias="START_RECORD"/>
+         <label data="3" alias="INTERIM_RECORD"/>
+         <label data="4" alias="STOP_RECORD"/>
+      </single>
+   </avp>
+   <avp name="Accounting-Realtime-Required" code="483" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="1-3">
+         <label data="1" alias="DELIVER_AND_GRANT"/>
+         <label data="2" alias="GRANT_AND_STORE"/>
+         <label data="3" alias="GRANT_AND_LOSE"/>
+      </single>
+   </avp>
+   <avp name="Accounting-Record-Number" code="485" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Policy-Counter-Identifier" code="2901" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Policy-Counter-Status" code="2902" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Policy-Counter-Status-Report" code="2903" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Policy-Counter-Identifier" type="Mandatory"/>
+         <avprule id="Policy-Counter-Status" type="Mandatory"/>
+         <avprule id="Pending-Policy-Counter-Information" type="Optional" qual="*"/>
+         <avprule id="AVP" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="SL-Request-Type" code="2904" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="INITIAL_REQUEST"/>
+         <label data="1" alias="INTERMEDIATE_REQUEST"/>
+      </single>
+   </avp>
+   <avp name="Pending-Policy-Counter-Information" code="2905" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Policy-Counter-Status" type="Mandatory"/>
+         <avprule id="Pending-Policy-Counter-Change-Time" type="Mandatory"/>
+         <avprule id="AVP" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="Pending-Policy-Counter-Change-Time" code="2906" vendor-name="3GPP" may-encrypt="yes" v-bit="must" m-bit="must" p-bit="mustnot">
+      <single format-name="Time"/>
+   </avp>
+   <command name="CER" code="257" type="Request">
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Host-IP-Address" type="Mandatory" qual="1*"/>
+      <avprule id="Vendor-Id" type="Mandatory"/>
+      <avprule id="Product-Name" type="Mandatory"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Supported-Vendor-Id" type="Optional" qual="*"/>
+      <avprule id="Auth-Application-Id" type="Optional" qual="*"/>
+      <avprule id="Inband-Security-Id" type="Optional" qual="*"/>
+      <avprule id="Acct-Application-Id" type="Optional" qual="*"/>
+      <avprule id="Vendor-Specific-Application-Id" type="Optional" qual="*"/>
+      <avprule id="Firmware-Revision" type="Optional"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="CEA" code="257" type="Answer">
+      <avprule id="Result-Code" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Host-IP-Address" type="Mandatory" qual="1*"/>
+      <avprule id="Vendor-Id" type="Mandatory"/>
+      <avprule id="Product-Name" type="Mandatory"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Error-Message" type="Optional"/>
+      <avprule id="Failed-AVP" type="Optional" qual="*"/>
+      <avprule id="Supported-Vendor-Id" type="Optional" qual="*"/>
+      <avprule id="Auth-Application-Id" type="Optional" qual="*"/>
+      <avprule id="Inband-Security-Id" type="Optional" qual="*"/>
+      <avprule id="Acct-Application-Id" type="Optional" qual="*"/>
+      <avprule id="Vendor-Specific-Application-Id" type="Optional" qual="*"/>
+      <avprule id="Firmware-Revision" type="Optional"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="RAR" code="258" type="Request">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Destination-Realm" type="Mandatory"/>
+      <avprule id="Destination-Host" type="Mandatory"/>
+      <avprule id="Auth-Application-Id" type="Mandatory"/>
+      <avprule id="Re-Auth-Request-Type" type="Mandatory"/>
+      <avprule id="User-Name" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="Route-Record" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="RAA" code="258" type="Answer">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Result-Code" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="User-Name" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Error-Message" type="Optional"/>
+      <avprule id="Error-Reporting-Host" type="Optional"/>
+      <avprule id="Failed-AVP" type="Optional" qual="*"/>
+      <avprule id="Redirect-Host" type="Optional" qual="*"/>
+      <avprule id="Redirect-Host-Usage" type="Optional"/>
+      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="ACR" code="271" type="Request">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Destination-Realm" type="Mandatory"/>
+      <avprule id="Accounting-Record-Type" type="Mandatory"/>
+      <avprule id="Accounting-Record-Number" type="Mandatory"/>
+      <avprule id="Acct-Application-Id" type="Optional"/>
+      <avprule id="Vendor-Specific-Application-Id" type="Optional"/>
+      <avprule id="User-Name" type="Optional"/>
+      <avprule id="Accounting-Sub-Session-Id" type="Optional"/>
+      <avprule id="Acct-Session-Id" type="Optional"/>
+      <avprule id="Acct-Multi-Session-Id" type="Optional"/>
+      <avprule id="Acct-Interim-Interval" type="Optional"/>
+      <avprule id="Accounting-Realtime-Required" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Event-Timestamp" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="Route-Record" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="ACA" code="271" type="Answer">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Result-Code" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Accounting-Record-Type" type="Mandatory"/>
+      <avprule id="Accounting-Record-Number" type="Mandatory"/>
+      <avprule id="Acct-Application-Id" type="Optional"/>
+      <avprule id="Vendor-Specific-Application-Id" type="Optional"/>
+      <avprule id="User-Name" type="Optional"/>
+      <avprule id="Accounting-Sub-Session-Id" type="Optional"/>
+      <avprule id="Acct-Session-Id" type="Optional"/>
+      <avprule id="Acct-Multi-Session-Id" type="Optional"/>
+      <avprule id="Error-Reporting-Host" type="Optional"/>
+      <avprule id="Acct-Interim-Interval" type="Optional"/>
+      <avprule id="Accounting-Realtime-Required" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Event-Timestamp" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="ASR" code="274" type="Request">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Destination-Realm" type="Mandatory"/>
+      <avprule id="Destination-Host" type="Mandatory"/>
+      <avprule id="Auth-Application-Id" type="Mandatory"/>
+      <avprule id="User-Name" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="Route-Record" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="ASA" code="274" type="Answer">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Result-Code" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="User-Name" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Error-Message" type="Optional"/>
+      <avprule id="Error-Reporting-Host" type="Optional"/>
+      <avprule id="Failed-AVP" type="Optional" qual="*"/>
+      <avprule id="Redirect-Host" type="Optional" qual="*"/>
+      <avprule id="Redirect-Host-Usage" type="Optional"/>
+      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="ST-Request" code="275" type="Request">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Destination-Realm" type="Mandatory"/>
+      <avprule id="Auth-Application-Id" type="Mandatory"/>
+      <avprule id="Termination-Cause" type="Mandatory"/>
+      <avprule id="Destination-Host" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="Route-Record" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="ST-Answer" code="275" type="Answer">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Result-Code" type="Optional"/>
+      <avprule id="Error-Message" type="Optional"/>
+      <avprule id="Error-Reporting-Host" type="Optional"/>
+      <avprule id="Failed-AVP" type="Optional" qual="*"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Redirect-Host" type="Optional" qual="*"/>
+      <avprule id="Redirect-Host-Usage" type="Optional"/>
+      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="DWR" code="280" type="Request">
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+   </command>
+   <command name="DWA" code="280" type="Answer">
+      <avprule id="Result-Code" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Error-Message" type="Optional"/>
+      <avprule id="Failed-AVP" type="Optional" qual="*"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+   </command>
+   <command name="DPR" code="282" type="Request">
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Disconnect-Cause" type="Mandatory"/>
+   </command>
+   <command name="DPA" code="282" type="Answer">
+      <avprule id="Result-Code" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Error-Message" type="Optional"/>
+      <avprule id="Failed-AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="SL-Request" code="8388635" type="Request">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Auth-Application-Id" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Destination-Realm" type="Mandatory"/>
+      <avprule id="SL-Request-Type" type="Mandatory"/>
+      <avprule id="Destination-Host" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Subscription-Id" type="Optional" qual="*"/>
+      <avprule id="Policy-Counter-Identifier" type="Optional" qual="*"/>
+      <avprule id="Logical-Access-ID" type="Optional"/>
+      <avprule id="Physical-Access-ID" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="Route-Record" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="SL-Answer" code="8388635" type="Answer">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Auth-Application-Id" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Result-Code" type="Optional"/>
+      <avprule id="Experimental-Result" type="Optional"/>
+      <avprule id="Policy-Counter-Status-Report" type="Optional" qual="*"/>
+      <avprule id="Error-Message" type="Optional"/>
+      <avprule id="Error-Reporting-Host" type="Optional"/>
+      <avprule id="Failed-AVP" type="Optional" qual="*"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Redirect-Host" type="Optional" qual="*"/>
+      <avprule id="Redirect-Host-Usage" type="Optional"/>
+      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="SN-Request" code="8388636" type="Request">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Destination-Realm" type="Mandatory"/>
+      <avprule id="Destination-Host" type="Mandatory"/>
+      <avprule id="Auth-Application-Id" type="Mandatory"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Policy-Counter-Status-Report" type="Optional" qual="*"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="Route-Record" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="SN-Answer" code="8388636" type="Answer">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Result-Code" type="Optional"/>
+      <avprule id="Experimental-Result" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Error-Message" type="Optional"/>
+      <avprule id="Error-Reporting-Host" type="Optional"/>
+      <avprule id="Redirect-Host" type="Optional" qual="*"/>
+      <avprule id="Redirect-Host-Usage" type="Optional"/>
+      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
+      <avprule id="Failed-AVP" type="Optional" qual="*"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+</dictionary>
diff --git a/example/diameter/launcher/resources/stack_examples/diameter_base.0.xml b/example/diameter/launcher/resources/stack_examples/diameter_base.0.xml
new file mode 100755 (executable)
index 0000000..0724bec
--- /dev/null
@@ -0,0 +1,439 @@
+<dictionary name="diameter_gen_base_rfc3588 | Application-Id: 0">
+   <vendor name="IETF" code="0"/>
+   <avp name="User-Name" code="1" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Class" code="25" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Session-Timeout" code="27" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Proxy-State" code="33" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Acct-Session-Id" code="44" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="OctetString"/>
+   </avp>
+   <avp name="Acct-Multi-Session-Id" code="50" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Event-Timestamp" code="55" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Time"/>
+   </avp>
+   <avp name="Acct-Interim-Interval" code="85" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Host-IP-Address" code="257" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Address"/>
+   </avp>
+   <avp name="Auth-Application-Id" code="258" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Acct-Application-Id" code="259" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Vendor-Specific-Application-Id" code="260" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Vendor-Id" type="Mandatory" qual="1*"/>
+         <avprule id="Auth-Application-Id" type="Optional"/>
+         <avprule id="Acct-Application-Id" type="Optional"/>
+      </grouped>
+   </avp>
+   <avp name="Redirect-Host-Usage" code="261" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-6">
+         <label data="0" alias="DONT_CACHE"/>
+         <label data="1" alias="ALL_SESSION"/>
+         <label data="2" alias="ALL_REALM"/>
+         <label data="3" alias="REALM_AND_APPLICATION"/>
+         <label data="4" alias="ALL_APPLICATION"/>
+         <label data="5" alias="ALL_HOST"/>
+         <label data="6" alias="ALL_USER"/>
+      </single>
+   </avp>
+   <avp name="Redirect-Max-Cache-Time" code="262" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Session-Id" code="263" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Origin-Host" code="264" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Supported-Vendor-Id" code="265" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Vendor-Id" code="266" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Firmware-Revision" code="267" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Result-Code" code="268" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32">
+         <label data="1001" alias="DIAMETER_MULTI_ROUND_AUTH"/>
+         <label data="2001" alias="DIAMETER_SUCCESS"/>
+         <label data="2002" alias="DIAMETER_LIMITED_SUCCESS"/>
+         <label data="3001" alias="DIAMETER_COMMAND_UNSUPPORTED"/>
+         <label data="3002" alias="DIAMETER_UNABLE_TO_DELIVER"/>
+         <label data="3003" alias="DIAMETER_REALM_NOT_SERVED"/>
+         <label data="3004" alias="DIAMETER_TOO_BUSY"/>
+         <label data="3005" alias="DIAMETER_LOOP_DETECTED"/>
+         <label data="3006" alias="DIAMETER_REDIRECT_INDICATION"/>
+         <label data="3007" alias="DIAMETER_APPLICATION_UNSUPPORTED"/>
+         <label data="3008" alias="DIAMETER_INVALID_HDR_BITS"/>
+         <label data="3009" alias="DIAMETER_INVALID_AVP_BITS"/>
+         <label data="3010" alias="DIAMETER_UNKNOWN_PEER"/>
+         <label data="4001" alias="DIAMETER_AUTHENTICATION_REJECTED"/>
+         <label data="4002" alias="DIAMETER_OUT_OF_SPACE"/>
+         <label data="4003" alias="DIAMETER_ELECTION_LOST"/>
+         <label data="4241" alias="DIAMETER_NO_AVAILABLE_POLICY_COUNTERS"/>
+         <label data="5001" alias="DIAMETER_AVP_UNSUPPORTED"/>
+         <label data="5002" alias="DIAMETER_UNKNOWN_SESSION_ID"/>
+         <label data="5003" alias="DIAMETER_AUTHORIZATION_REJECTED"/>
+         <label data="5004" alias="DIAMETER_INVALID_AVP_VALUE"/>
+         <label data="5005" alias="DIAMETER_MISSING_AVP"/>
+         <label data="5006" alias="DIAMETER_RESOURCES_EXCEEDED"/>
+         <label data="5007" alias="DIAMETER_CONTRADICTING_AVPS"/>
+         <label data="5008" alias="DIAMETER_AVP_NOT_ALLOWED"/>
+         <label data="5009" alias="DIAMETER_AVP_OCCURS_TOO_MANY_TIMES"/>
+         <label data="5010" alias="DIAMETER_NO_COMMON_APPLICATION"/>
+         <label data="5011" alias="DIAMETER_UNSUPPORTED_VERSION"/>
+         <label data="5012" alias="DIAMETER_UNABLE_TO_COMPLY"/>
+         <label data="5013" alias="DIAMETER_INVALID_BIT_IN_HEADER"/>
+         <label data="5014" alias="DIAMETER_INVALID_AVP_LENGTH"/>
+         <label data="5015" alias="DIAMETER_INVALID_MESSAGE_LENGTH"/>
+         <label data="5016" alias="DIAMETER_INVALID_AVP_BIT_COMBO"/>
+         <label data="5017" alias="DIAMETER_NO_COMMON_SECURITY"/>
+         <label data="5030" alias="DIAMETER_USER_UNKNOWN"/>
+         <label data="5063" alias="REQUESTED_SERVICE_NOT_AUTHORIZED"/>
+         <label data="5065" alias="IP_CAN_SESSION_NOT_AVAILABLE"/>
+      </single>
+   </avp>
+   <avp name="Product-Name" code="269" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Session-Binding" code="270" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Session-Server-Failover" code="271" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-3">
+         <label data="0" alias="REFUSE_SERVICE"/>
+         <label data="1" alias="TRY_AGAIN"/>
+         <label data="2" alias="ALLOW_SERVICE"/>
+         <label data="3" alias="TRY_AGAIN_ALLOW_SERVICE"/>
+      </single>
+   </avp>
+   <avp name="Multi-Round-Time-Out" code="272" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Disconnect-Cause" code="273" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-2">
+         <label data="0" alias="REBOOTING"/>
+         <label data="1" alias="BUSY"/>
+         <label data="2" alias="DO_NOT_WANT_TO_TALK_TO_YOU"/>
+      </single>
+   </avp>
+   <avp name="Auth-Request-Type" code="274" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="1-3">
+         <label data="1" alias="AUTHENTICATE_ONLY"/>
+         <label data="2" alias="AUTHORIZE_ONLY"/>
+         <label data="3" alias="AUTHORIZE_AUTHENTICATE"/>
+      </single>
+   </avp>
+   <avp name="Auth-Grace-Period" code="276" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Auth-Session-State" code="277" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="STATE_MAINTAINED"/>
+         <label data="1" alias="NO_STATE_MAINTAINED"/>
+      </single>
+   </avp>
+   <avp name="Origin-State-Id" code="278" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Failed-AVP" code="279" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="AVP" type="Mandatory" qual="1*"/>
+      </grouped>
+   </avp>
+   <avp name="Proxy-Host" code="280" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Error-Message" code="281" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="UTF8String"/>
+   </avp>
+   <avp name="Route-Record" code="282" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Destination-Realm" code="283" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Proxy-Info" code="284" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Proxy-Host" type="Mandatory"/>
+         <avprule id="Proxy-State" type="Mandatory"/>
+         <avprule id="AVP" type="Optional" qual="*"/>
+      </grouped>
+   </avp>
+   <avp name="Re-Auth-Request-Type" code="285" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="0-1">
+         <label data="0" alias="AUTHORIZE_ONLY"/>
+         <label data="1" alias="AUTHORIZE_AUTHENTICATE"/>
+      </single>
+   </avp>
+   <avp name="Accounting-Sub-Session-Id" code="287" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned64"/>
+   </avp>
+   <avp name="Redirect-Host" code="292" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterURI"/>
+   </avp>
+   <avp name="Destination-Host" code="293" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Error-Reporting-Host" code="294" may-encrypt="yes" v-bit="mustnot" m-bit="mustnot" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Termination-Cause" code="295" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="1-8">
+         <label data="1" alias="LOGOUT"/>
+         <label data="2" alias="SERVICE_NOT_PROVIDED"/>
+         <label data="3" alias="BAD_ANSWER"/>
+         <label data="4" alias="ADMINISTRATIVE"/>
+         <label data="5" alias="LINK_BROKEN"/>
+         <label data="6" alias="AUTH_EXPIRED"/>
+         <label data="7" alias="USER_MOVED"/>
+         <label data="8" alias="SESSION_TIMEOUT"/>
+      </single>
+   </avp>
+   <avp name="Origin-Realm" code="296" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="DiameterIdentity"/>
+   </avp>
+   <avp name="Experimental-Result" code="297" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="Vendor-Id" type="Mandatory"/>
+         <avprule id="Experimental-Result-Code" type="Mandatory"/>
+      </grouped>
+   </avp>
+   <avp name="Experimental-Result-Code" code="298" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="Inband-Security-Id" code="299" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <avp name="E2E-Sequence" code="300" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <grouped>
+         <avprule id="AVP" type="Mandatory" qual="2*"/>
+      </grouped>
+   </avp>
+   <avp name="Accounting-Record-Type" code="480" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="1-4">
+         <label data="1" alias="EVENT_RECORD"/>
+         <label data="2" alias="START_RECORD"/>
+         <label data="3" alias="INTERIM_RECORD"/>
+         <label data="4" alias="STOP_RECORD"/>
+      </single>
+   </avp>
+   <avp name="Accounting-Realtime-Required" code="483" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Enumerated" enum="1-3">
+         <label data="1" alias="DELIVER_AND_GRANT"/>
+         <label data="2" alias="GRANT_AND_STORE"/>
+         <label data="3" alias="GRANT_AND_LOSE"/>
+      </single>
+   </avp>
+   <avp name="Accounting-Record-Number" code="485" may-encrypt="yes" v-bit="mustnot" m-bit="must" p-bit="mustnot">
+      <single format-name="Unsigned32"/>
+   </avp>
+   <command name="CER" code="257" type="Request">
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Host-IP-Address" type="Mandatory" qual="1*"/>
+      <avprule id="Vendor-Id" type="Mandatory"/>
+      <avprule id="Product-Name" type="Mandatory"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Supported-Vendor-Id" type="Optional" qual="*"/>
+      <avprule id="Auth-Application-Id" type="Optional" qual="*"/>
+      <avprule id="Inband-Security-Id" type="Optional" qual="*"/>
+      <avprule id="Acct-Application-Id" type="Optional" qual="*"/>
+      <avprule id="Vendor-Specific-Application-Id" type="Optional" qual="*"/>
+      <avprule id="Firmware-Revision" type="Optional"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="CEA" code="257" type="Answer">
+      <avprule id="Result-Code" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Host-IP-Address" type="Mandatory" qual="1*"/>
+      <avprule id="Vendor-Id" type="Mandatory"/>
+      <avprule id="Product-Name" type="Mandatory"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Error-Message" type="Optional"/>
+      <avprule id="Failed-AVP" type="Optional" qual="*"/>
+      <avprule id="Supported-Vendor-Id" type="Optional" qual="*"/>
+      <avprule id="Auth-Application-Id" type="Optional" qual="*"/>
+      <avprule id="Inband-Security-Id" type="Optional" qual="*"/>
+      <avprule id="Acct-Application-Id" type="Optional" qual="*"/>
+      <avprule id="Vendor-Specific-Application-Id" type="Optional" qual="*"/>
+      <avprule id="Firmware-Revision" type="Optional"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="RAR" code="258" type="Request">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Destination-Realm" type="Mandatory"/>
+      <avprule id="Destination-Host" type="Mandatory"/>
+      <avprule id="Auth-Application-Id" type="Mandatory"/>
+      <avprule id="Re-Auth-Request-Type" type="Mandatory"/>
+      <avprule id="User-Name" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="Route-Record" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="RAA" code="258" type="Answer">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Result-Code" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="User-Name" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Error-Message" type="Optional"/>
+      <avprule id="Error-Reporting-Host" type="Optional"/>
+      <avprule id="Failed-AVP" type="Optional" qual="*"/>
+      <avprule id="Redirect-Host" type="Optional" qual="*"/>
+      <avprule id="Redirect-Host-Usage" type="Optional"/>
+      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="ACR" code="271" type="Request">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Destination-Realm" type="Mandatory"/>
+      <avprule id="Accounting-Record-Type" type="Mandatory"/>
+      <avprule id="Accounting-Record-Number" type="Mandatory"/>
+      <avprule id="Acct-Application-Id" type="Optional"/>
+      <avprule id="Vendor-Specific-Application-Id" type="Optional"/>
+      <avprule id="User-Name" type="Optional"/>
+      <avprule id="Accounting-Sub-Session-Id" type="Optional"/>
+      <avprule id="Acct-Session-Id" type="Optional"/>
+      <avprule id="Acct-Multi-Session-Id" type="Optional"/>
+      <avprule id="Acct-Interim-Interval" type="Optional"/>
+      <avprule id="Accounting-Realtime-Required" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Event-Timestamp" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="Route-Record" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="ACA" code="271" type="Answer">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Result-Code" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Accounting-Record-Type" type="Mandatory"/>
+      <avprule id="Accounting-Record-Number" type="Mandatory"/>
+      <avprule id="Acct-Application-Id" type="Optional"/>
+      <avprule id="Vendor-Specific-Application-Id" type="Optional"/>
+      <avprule id="User-Name" type="Optional"/>
+      <avprule id="Accounting-Sub-Session-Id" type="Optional"/>
+      <avprule id="Acct-Session-Id" type="Optional"/>
+      <avprule id="Acct-Multi-Session-Id" type="Optional"/>
+      <avprule id="Error-Reporting-Host" type="Optional"/>
+      <avprule id="Acct-Interim-Interval" type="Optional"/>
+      <avprule id="Accounting-Realtime-Required" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Event-Timestamp" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="ASR" code="274" type="Request">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Destination-Realm" type="Mandatory"/>
+      <avprule id="Destination-Host" type="Mandatory"/>
+      <avprule id="Auth-Application-Id" type="Mandatory"/>
+      <avprule id="User-Name" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="Route-Record" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="ASA" code="274" type="Answer">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Result-Code" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="User-Name" type="Optional"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Error-Message" type="Optional"/>
+      <avprule id="Error-Reporting-Host" type="Optional"/>
+      <avprule id="Failed-AVP" type="Optional" qual="*"/>
+      <avprule id="Redirect-Host" type="Optional" qual="*"/>
+      <avprule id="Redirect-Host-Usage" type="Optional"/>
+      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="STR" code="275" type="Request">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Destination-Realm" type="Mandatory"/>
+      <avprule id="Auth-Application-Id" type="Mandatory"/>
+      <avprule id="Termination-Cause" type="Mandatory"/>
+      <avprule id="User-Name" type="Optional"/>
+      <avprule id="Destination-Host" type="Optional"/>
+      <avprule id="Class" type="Optional" qual="*"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="Route-Record" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="STA" code="275" type="Answer">
+      <avprule id="Session-Id" type="Fixed"/>
+      <avprule id="Result-Code" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="User-Name" type="Optional"/>
+      <avprule id="Class" type="Optional" qual="*"/>
+      <avprule id="Error-Message" type="Optional"/>
+      <avprule id="Error-Reporting-Host" type="Optional"/>
+      <avprule id="Failed-AVP" type="Optional" qual="*"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+      <avprule id="Redirect-Host" type="Optional" qual="*"/>
+      <avprule id="Redirect-Host-Usage" type="Optional"/>
+      <avprule id="Redirect-Max-Cache-Time" type="Optional"/>
+      <avprule id="Proxy-Info" type="Optional" qual="*"/>
+      <avprule id="AVP" type="Optional" qual="*"/>
+   </command>
+   <command name="DWR" code="280" type="Request">
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+   </command>
+   <command name="DWA" code="280" type="Answer">
+      <avprule id="Result-Code" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Error-Message" type="Optional"/>
+      <avprule id="Failed-AVP" type="Optional" qual="*"/>
+      <avprule id="Origin-State-Id" type="Optional"/>
+   </command>
+   <command name="DPR" code="282" type="Request">
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Disconnect-Cause" type="Mandatory"/>
+   </command>
+   <command name="DPA" code="282" type="Answer">
+      <avprule id="Result-Code" type="Mandatory"/>
+      <avprule id="Origin-Host" type="Mandatory"/>
+      <avprule id="Origin-Realm" type="Mandatory"/>
+      <avprule id="Error-Message" type="Optional"/>
+      <avprule id="Failed-AVP" type="Optional" qual="*"/>
+   </command>
+</dictionary>
index 6ec64ad..e87750c 100644 (file)
@@ -78,6 +78,7 @@ public:
   bool isFinished() const throw() { return (getState() == State::Failed || getState() == State::Success); }
   bool inProgress() const throw() { return (getState() == State::InProgress); }
   bool isFailed() const throw() { return (getState() == State::Failed); }
+  bool isSuccess() const throw() { return (getState() == State::Success); }
   bool hasSameCondition(const TestDiameterCondition &condition) const throw();
   const DebugSummary & getDebugSummary() const throw() { return a_debugSummary; }