changeset 1349:73b9f2aefb75 1.3.0

Merged new extensions and improvements from Thomas, with approval from Effortel Technologies SA -- thank you.
author Sebastien Decugis <sdecugis@freediameter.net>
date Sun, 12 May 2019 23:15:40 +0800
parents 229ecec59ff5 (current diff) 2adac053aac4 (diff)
children 0f226d35501e
files LICENSE
diffstat 51 files changed, 23093 insertions(+), 327 deletions(-) [+]
line wrap: on
line diff
--- a/INSTALL.pkgsrc	Sun Jan 21 22:25:07 2018 +0800
+++ b/INSTALL.pkgsrc	Sun May 12 23:15:40 2019 +0800
@@ -11,11 +11,7 @@
 	pkg_add bison pkg-config libidn gnutls libgcrypt mercurial
 and follow the usual installation note.
 
-NetBSD does not support SCTP, so you have to add
-	-DDISABLE_SCTP:BOOL=ON
-to the cmake command line.
+For the optional extensions, you need mysql*-client, postgres*-client,
+libxml2, jsoncpp, and json-schema.  For the debugging extensions,
+you also need swig and a python -- install as usual.
 
-For the optional extensions, you need mysql*-client, postgres*-client,
-libxml2.  For the debugging extensions, you also need swig and a
-python -- install as usual.
-
--- a/LICENSE	Sun Jan 21 22:25:07 2018 +0800
+++ b/LICENSE	Sun May 12 23:15:40 2019 +0800
@@ -2,7 +2,7 @@
 
 Software License Agreement (BSD License)
 
-Copyright (c) 2008-2018, WIDE Project and NICT
+Copyright (c) 2008-2019, WIDE Project and NICT
 All rights reserved.
 
 Redistribution and use of this software in source and binary forms, with or without modification, are 
@@ -52,6 +52,3 @@
 
  * Thomas Klausner:
   several extensions and numerous fixes / improvements.
-  
-  
- 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contrib/dict_json/dictionary_dcca.json	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,1208 @@
+{
+   "AVPRules" : [
+      {
+         "AVP" : "CC-Money",
+         "Content" : [
+            {
+               "AVP" : "Currency-Code",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Unit-Value",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "AVP" : "Cost-Information",
+         "Content" : [
+            {
+               "AVP" : "Cost-Unit",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Currency-Code",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Unit-Value",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "AVP" : "Final-Unit-Indication",
+         "Content" : [
+            {
+               "AVP" : "Filter-Id"
+            },
+            {
+               "AVP" : "Redirect-Server",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Restriction-Filter-Rule"
+            },
+            {
+               "AVP" : "Final-Unit-Action",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "AVP" : "Granted-Service-Unit",
+         "Content" : [
+            {
+               "AVP" : "CC-Input-Octets",
+               "Max" : 1
+            },
+            {
+               "AVP" : "CC-Money",
+               "Max" : 1
+            },
+            {
+               "AVP" : "CC-Output-Octets",
+               "Max" : 1
+            },
+            {
+               "AVP" : "CC-Service-Specific-Units",
+               "Max" : 1
+            },
+            {
+               "AVP" : "CC-Time",
+               "Max" : 1
+            },
+            {
+               "AVP" : "CC-Total-Octets",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Tariff-Time-Change",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "AVP" : "Redirect-Server",
+         "Content" : [
+            {
+               "AVP" : "Redirect-Address-Type",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Redirect-Server-Address",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "AVP" : "Requested-Service-Unit",
+         "Content" : [
+            {
+               "AVP" : "CC-Input-Octets",
+               "Max" : 1
+            },
+            {
+               "AVP" : "CC-Money",
+               "Max" : 1
+            },
+            {
+               "AVP" : "CC-Output-Octets",
+               "Max" : 1
+            },
+            {
+               "AVP" : "CC-Service-Specific-Units",
+               "Max" : 1
+            },
+            {
+               "AVP" : "CC-Time",
+               "Max" : 1
+            },
+            {
+               "AVP" : "CC-Total-Octets",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "AVP" : "Service-Parameter-Info",
+         "Content" : [
+            {
+               "AVP" : "Service-Parameter-Type",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Service-Parameter-Value",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "AVP" : "Subscription-Id",
+         "Content" : [
+            {
+               "AVP" : "Subscription-Id-Data",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Subscription-Id-Type",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "AVP" : "Unit-Value",
+         "Content" : [
+            {
+               "AVP" : "Exponent",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Value-Digits",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "AVP" : "Used-Service-Unit",
+         "Content" : [
+            {
+               "AVP" : "CC-Input-Octets",
+               "Max" : 1
+            },
+            {
+               "AVP" : "CC-Money",
+               "Max" : 1
+            },
+            {
+               "AVP" : "CC-Output-Octets",
+               "Max" : 1
+            },
+            {
+               "AVP" : "CC-Service-Specific-Units",
+               "Max" : 1
+            },
+            {
+               "AVP" : "CC-Time",
+               "Max" : 1
+            },
+            {
+               "AVP" : "CC-Total-Octets",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Tariff-Change-Usage",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "AVP" : "Multiple-Services-Credit-Control",
+         "Content" : [
+            {
+               "AVP" : "Result-Code",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Final-Unit-Indication",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Granted-Service-Unit",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Rating-Group",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Requested-Service-Unit",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Service-Identifier"
+            },
+            {
+               "AVP" : "Used-Service-Unit"
+            },
+            {
+               "AVP" : "Validity-Time",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Tariff-Change-Usage",
+               "Max" : 1
+            },
+            {
+               "AVP" : "G-S-U-Pool-Reference"
+            }
+         ]
+      },
+      {
+         "AVP" : "G-S-U-Pool-Reference",
+         "Content" : [
+            {
+               "AVP" : "Unit-Value",
+               "Max" : 1
+            },
+            {
+               "AVP" : "G-S-U-Pool-Identifier",
+               "Max" : 1
+            },
+            {
+               "AVP" : "CC-Unit-Type",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "AVP" : "User-Equipment-Info",
+         "Content" : [
+            {
+               "AVP" : "User-Equipment-Info-Type",
+               "Max" : 1
+            },
+            {
+               "AVP" : "User-Equipment-Info-Value",
+               "Max" : 1
+            }
+         ]
+      }
+   ],
+   "AVPs" : [
+      {
+         "Code" : 268,
+         "EnumValues" : [
+            {
+               "Code" : 5030,
+               "Name" : "USER_UNKNOWN"
+            },
+            {
+               "Code" : 5031,
+               "Name" : "RATING_FAILED"
+            },
+            {
+               "Code" : 4012,
+               "Name" : "CREDIT_LIMIT_REACHED"
+            },
+            {
+               "Code" : 4010,
+               "Name" : "END_USER_SERVICE_DENIED"
+            },
+            {
+               "Code" : 4011,
+               "Name" : "CREDIT_CONTROL_NOT_APPLICABLE"
+            }
+         ],
+         "Name" : "Result-Code",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 411,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "CC-Correlation-Id",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 412,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "CC-Input-Octets",
+         "Type" : "Unsigned64"
+      },
+      {
+         "Code" : 413,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "CC-Money",
+         "Type" : "Grouped"
+      },
+      {
+         "Code" : 414,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "CC-Output-Octets",
+         "Type" : "Unsigned64"
+      },
+      {
+         "Code" : 415,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "CC-Request-Number",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 416,
+         "EnumValues" : [
+            {
+               "Code" : 4,
+               "Name" : "EVENT_REQUEST"
+            },
+            {
+               "Code" : 2,
+               "Name" : "UPDATE_REQUEST"
+            },
+            {
+               "Code" : 1,
+               "Name" : "INITIAL_REQUEST"
+            },
+            {
+               "Code" : 3,
+               "Name" : "TERMINATION_REQUEST"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "CC-Request-Type",
+         "Type" : "Enumerated"
+      },
+      {
+         "Code" : 417,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "CC-Service-Specific-Units",
+         "Type" : "Unsigned64"
+      },
+      {
+         "Code" : 418,
+         "EnumValues" : [
+            {
+               "Code" : 1,
+               "Name" : "FAILOVER_SUPPORTED"
+            },
+            {
+               "Code" : 0,
+               "Name" : "FAILOVER_NOT_SUPPORTED"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "CC-Session-Failover",
+         "Type" : "Enumerated"
+      },
+      {
+         "Code" : 419,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "CC-Sub-Session-Id",
+         "Type" : "Unsigned64"
+      },
+      {
+         "Code" : 420,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "CC-Time",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 421,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "CC-Total-Octets",
+         "Type" : "Unsigned64"
+      },
+      {
+         "Code" : 422,
+         "EnumValues" : [
+            {
+               "Code" : 1,
+               "Name" : "NO_CREDIT"
+            },
+            {
+               "Code" : 0,
+               "Name" : "ENOUGH_CREDIT"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Check-Balance-Result",
+         "Type" : "Enumerated"
+      },
+      {
+         "Code" : 423,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Cost-Information",
+         "Type" : "Grouped"
+      },
+      {
+         "Code" : 424,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Cost-Unit",
+         "Type" : "UTF8String"
+      },
+      {
+         "Code" : 425,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Currency-Code",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 426,
+         "EnumValues" : [
+            {
+               "Code" : 1,
+               "Name" : "RE_AUTHORIZATION"
+            },
+            {
+               "Code" : 0,
+               "Name" : "CREDIT_AUTHORIZATION"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Credit-Control",
+         "Type" : "Enumerated"
+      },
+      {
+         "Code" : 427,
+         "EnumValues" : [
+            {
+               "Code" : 1,
+               "Name" : "CONTINUE"
+            },
+            {
+               "Code" : 0,
+               "Name" : "TERMINATE"
+            },
+            {
+               "Code" : 2,
+               "Name" : "RETRY_AND_TERMINATE"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Credit-Control-Failure-Handling",
+         "Type" : "Enumerated"
+      },
+      {
+         "Code" : 428,
+         "EnumValues" : [
+            {
+               "Code" : 1,
+               "Name" : "CONTINUE"
+            },
+            {
+               "Code" : 0,
+               "Name" : "TERMINATE_OR_BUFFER"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Direct-Debiting-Failure-Handling",
+         "Type" : "Enumerated"
+      },
+      {
+         "Code" : 429,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Exponent",
+         "Type" : "Integer32"
+      },
+      {
+         "Code" : 430,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Final-Unit-Indication",
+         "Type" : "Grouped"
+      },
+      {
+         "Code" : 431,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Granted-Service-Unit",
+         "Type" : "Grouped"
+      },
+      {
+         "Code" : 432,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Rating-Group",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 433,
+         "EnumValues" : [
+            {
+               "Code" : 2,
+               "Name" : "URL"
+            },
+            {
+               "Code" : 3,
+               "Name" : "SIP_URI"
+            },
+            {
+               "Code" : 0,
+               "Name" : "IPV4_ADDRESS"
+            },
+            {
+               "Code" : 1,
+               "Name" : "IPV6_ADDRESS"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Redirect-Address-Type",
+         "Type" : "Enumerated"
+      },
+      {
+         "Code" : 434,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Redirect-Server",
+         "Type" : "Grouped"
+      },
+      {
+         "Code" : 435,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Redirect-Server-Address",
+         "Type" : "UTF8String"
+      },
+      {
+         "Code" : 436,
+         "EnumValues" : [
+            {
+               "Code" : 2,
+               "Name" : "CHECK_BALANCE"
+            },
+            {
+               "Code" : 3,
+               "Name" : "PRICE_ENQUIRY"
+            },
+            {
+               "Code" : 1,
+               "Name" : "REFUND_ACCOUNT"
+            },
+            {
+               "Code" : 0,
+               "Name" : "DIRECT_DEBITING"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Requested-Action",
+         "Type" : "Enumerated"
+      },
+      {
+         "Code" : 437,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Requested-Service-Unit",
+         "Type" : "Grouped"
+      },
+      {
+         "Code" : 438,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Restriction-Filter-Rule",
+         "Type" : "IPFilterRule"
+      },
+      {
+         "Code" : 439,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Service-Identifier",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 440,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Service-Parameter-Info",
+         "Type" : "Grouped"
+      },
+      {
+         "Code" : 441,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Service-Parameter-Type",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 442,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Service-Parameter-Value",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 443,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Subscription-Id",
+         "Type" : "Grouped"
+      },
+      {
+         "Code" : 444,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Subscription-Id-Data",
+         "Type" : "UTF8String"
+      },
+      {
+         "Code" : 445,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Unit-Value",
+         "Type" : "Grouped"
+      },
+      {
+         "Code" : 446,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Used-Service-Unit",
+         "Type" : "Grouped"
+      },
+      {
+         "Code" : 447,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Value-Digits",
+         "Type" : "Integer64"
+      },
+      {
+         "Code" : 448,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Validity-Time",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 449,
+         "EnumValues" : [
+            {
+               "Code" : 1,
+               "Name" : "REDIRECT"
+            },
+            {
+               "Code" : 0,
+               "Name" : "TERMINATE"
+            },
+            {
+               "Code" : 2,
+               "Name" : "RESTRICT_ACCESS"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Final-Unit-Action",
+         "Type" : "Enumerated"
+      },
+      {
+         "Code" : 450,
+         "EnumValues" : [
+            {
+               "Code" : 3,
+               "Name" : "END_USER_NAI"
+            },
+            {
+               "Code" : 0,
+               "Name" : "END_USER_E164"
+            },
+            {
+               "Code" : 1,
+               "Name" : "END_USER_IMSI"
+            },
+            {
+               "Code" : 2,
+               "Name" : "END_USER_SIP_URI"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Subscription-Id-Type",
+         "Type" : "Enumerated"
+      },
+      {
+         "Code" : 451,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Tariff-Time-Change",
+         "Type" : "Time"
+      },
+      {
+         "Code" : 452,
+         "EnumValues" : [
+            {
+               "Code" : 2,
+               "Name" : "UNIT_INDETERMINATE"
+            },
+            {
+               "Code" : 1,
+               "Name" : "UNIT_AFTER_TARIFF_CHANGE"
+            },
+            {
+               "Code" : 0,
+               "Name" : "UNIT_BEFORE_TARIFF_CHANGE"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Tariff-Change-Usage",
+         "Type" : "Enumerated"
+      },
+      {
+         "Code" : 453,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "G-S-U-Pool-Identifier",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 454,
+         "EnumValues" : [
+            {
+               "Code" : 0,
+               "Name" : "TIME"
+            },
+            {
+               "Code" : 1,
+               "Name" : "MONEY"
+            },
+            {
+               "Code" : 3,
+               "Name" : "INPUT-OCTETS"
+            },
+            {
+               "Code" : 2,
+               "Name" : "TOTAL-OCTETS"
+            },
+            {
+               "Code" : 4,
+               "Name" : "OUTPUT-OCTETS"
+            },
+            {
+               "Code" : 5,
+               "Name" : "SERVICE-SPECIFIC-UNITS"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "CC-Unit-Type",
+         "Type" : "Enumerated"
+      },
+      {
+         "Code" : 455,
+         "EnumValues" : [
+            {
+               "Code" : 1,
+               "Name" : "MULTIPLE_SERVICES_SUPPORTED"
+            },
+            {
+               "Code" : 0,
+               "Name" : "MULTIPLE_SERVICES_NOT_SUPPORTED"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Multiple-Services-Indicator",
+         "Type" : "Enumerated"
+      },
+      {
+         "Code" : 456,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Multiple-Services-Credit-Control",
+         "Type" : "Grouped"
+      },
+      {
+         "Code" : 457,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "G-S-U-Pool-Reference",
+         "Type" : "Grouped"
+      },
+      {
+         "Code" : 458,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "User-Equipment-Info",
+         "Type" : "Grouped"
+      },
+      {
+         "Code" : 459,
+         "EnumValues" : [
+            {
+               "Code" : 1,
+               "Name" : "MAC"
+            },
+            {
+               "Code" : 2,
+               "Name" : "EUI64"
+            },
+            {
+               "Code" : 0,
+               "Name" : "IMEISV"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "User-Equipment-Info-Type",
+         "Type" : "Enumerated"
+      },
+      {
+         "Code" : 460,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "User-Equipment-Info-Value",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 461,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Service-Context-Id",
+         "Type" : "UTF8String"
+      }
+   ],
+   "Applications" : [
+      {
+         "Code" : 4,
+         "Name" : "Diameter Credit Control Application"
+      }
+   ],
+   "CommandRules" : [
+      {
+         "Command" : "Credit-Control-Request",
+         "Content" : [
+            {
+               "AVP" : "User-Name",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Acct-Multi-Session-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Event-Timestamp",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Auth-Application-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Session-Id",
+               "First" : true,
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-State-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Route-Record"
+            },
+            {
+               "AVP" : "Destination-Realm",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Proxy-Info"
+            },
+            {
+               "AVP" : "Destination-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Termination-Cause",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Realm",
+               "Max" : 1
+            },
+            {
+               "AVP" : "CC-Correlation-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "CC-Request-Number",
+               "Max" : 1
+            },
+            {
+               "AVP" : "CC-Request-Type",
+               "Max" : 1
+            },
+            {
+               "AVP" : "CC-Sub-Session-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Requested-Action",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Requested-Service-Unit",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Service-Identifier",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Service-Parameter-Info"
+            },
+            {
+               "AVP" : "Subscription-Id"
+            },
+            {
+               "AVP" : "Used-Service-Unit"
+            },
+            {
+               "AVP" : "Multiple-Services-Indicator",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Multiple-Services-Credit-Control"
+            },
+            {
+               "AVP" : "User-Equipment-Info",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Service-Context-Id",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "Command" : "Credit-Control-Answer",
+         "Content" : [
+            {
+               "AVP" : "User-Name",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Acct-Multi-Session-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Event-Timestamp",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Auth-Application-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Redirect-Host-Usage",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Redirect-Max-Cache-Time",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Session-Id",
+               "First" : true,
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Result-Code",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-State-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Failed-AVP"
+            },
+            {
+               "AVP" : "Route-Record"
+            },
+            {
+               "AVP" : "Proxy-Info"
+            },
+            {
+               "AVP" : "Redirect-Host"
+            },
+            {
+               "AVP" : "Origin-Realm",
+               "Max" : 1
+            },
+            {
+               "AVP" : "CC-Request-Number",
+               "Max" : 1
+            },
+            {
+               "AVP" : "CC-Request-Type",
+               "Max" : 1
+            },
+            {
+               "AVP" : "CC-Session-Failover",
+               "Max" : 1
+            },
+            {
+               "AVP" : "CC-Sub-Session-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Check-Balance-Result",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Cost-Information",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Credit-Control-Failure-Handling",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Direct-Debiting-Failure-Handling",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Final-Unit-Indication",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Granted-Service-Unit",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Validity-Time",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Multiple-Services-Credit-Control"
+            }
+         ]
+      }
+   ],
+   "Commands" : [
+      {
+         "Code" : 272,
+         "Flags" : {
+            "Must" : "RP",
+            "MustNot" : ""
+         },
+         "Name" : "Credit-Control-Request"
+      },
+      {
+         "Code" : 272,
+         "Flags" : {
+            "Must" : "P",
+            "MustNot" : "RE"
+         },
+         "Name" : "Credit-Control-Answer"
+      }
+   ]
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contrib/dict_json/dictionary_dcca_3gpp.json	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,12867 @@
+{
+  "AVPRules": [
+    {
+      "AVP": "ISUP-Cause",
+      "Content": [
+        {
+          "AVP": "ISUP-Cause-Location",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "ISUP-Cause-Value",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "ISUP-Cause-Diagnostics",
+          "Vendor": 10415,
+          "Max": 1
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Multiple-Services-Credit-Control",
+      "Content": [
+        {
+          "AVP": "Granted-Service-Unit",
+          "Max": 1
+        },
+        {
+          "AVP": "Requested-Service-Unit",
+          "Max": 1
+        },
+        {
+          "AVP": "Used-Service-Unit",
+        },
+        {
+          "AVP": "Tariff-Change-Usage",
+          "Max": 1
+        },
+        {
+          "AVP": "Service-Identifier",
+        },
+        {
+          "AVP": "Rating-Group",
+          "Max": 1
+        },
+        {
+          "AVP": "G-S-U-Pool-Reference",
+        },
+        {
+          "AVP": "Validity-Time",
+          "Max": 1
+        },
+        {
+          "AVP": "Result-Code",
+          "Max": 1
+        },
+        {
+          "AVP": "Final-Unit-Indication",
+          "Max": 1
+        },
+        {
+          "AVP": "Time-Quota-Threshold",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Volume-Quota-Threshold",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Unit-Quota-Threshold",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Quota-Holding-Time",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Quota-Consumption-Time",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Reporting-Reason",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Trigger",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "PS-Furnish-Charging-Information",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Refund-Information",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "AF-Correlation-Information",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Envelope",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Envelope-Reporting",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Time-Quota-Mechanism",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Service-Specific-Info",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "QoS-Information",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Announcement-Information",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "3GPP-RAT-Type",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Related-Trigger",
+          "Vendor": 10415,
+          "Max": 1
+        }
+      ]
+    },
+    {
+      "AVP": "Service-Specific-Info",
+      "Content": [
+        {
+          "AVP": "Service-Specific-Data",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Service-Specific-Type",
+          "Vendor": 10415,
+          "Max": 1
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Used-Service-Unit",
+      "Content": [
+        {
+          "AVP": "Reporting-Reason",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Tariff-Change-Usage",
+          "Max": 1
+        },
+        {
+          "AVP": "CC-Time",
+          "Max": 1
+        },
+        {
+          "AVP": "CC-Money",
+          "Max": 1
+        },
+        {
+          "AVP": "CC-Total-Octets",
+          "Max": 1
+        },
+        {
+          "AVP": "CC-Input-Octets",
+          "Max": 1
+        },
+        {
+          "AVP": "CC-Output-Octets",
+          "Max": 1
+        },
+        {
+          "AVP": "CC-Service-Specific-Units",
+          "Max": 1
+        },
+        {
+          "AVP": "Event-Charging-TimeStamp",
+          "Vendor": 10415
+        }
+      ]
+    },
+    {
+      "AVP": "Event-Type",
+      "Content": [
+        {
+          "AVP": "SIP-Method",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Event",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Expires",
+          "Max": 1,
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Time-Stamps",
+      "Content": [
+        {
+          "AVP": "SIP-Request-Timestamp",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "SIP-Response-Timestamp",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "SIP-Request-Timestamp-Fraction",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "SIP-Response-Timestamp-Fraction",
+          "Vendor": 10415,
+          "Max": 1
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "SDP-Media-Component",
+      "Content": [
+        {
+          "AVP": "SDP-Media-Name",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "SDP-Media-Description",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Local-GW-Inserted-Indication",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "IP-Realm-Default-Indication",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Transcoder-Inserted-Indication",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Media-Initiator-Flag",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Media-Initiator-Party",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "3GPP-Charging-Id",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Access-Network-Charging-Identifier-Value",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "SDP-Type",
+          "Vendor": 10415,
+          "Max": 1
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Application-Server-Information",
+      "Content": [
+        {
+          "AVP": "Application-Server",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Application-Provided-Called-Party-Address",
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "PS-Furnish-Charging-Information",
+      "Content": [
+        {
+          "AVP": "3GPP-Charging-Id",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "PS-Free-Format-Data",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "PS-Append-Free-Format-Data",
+          "Max": 1,
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Service-Information",
+      "Content": [
+        {
+          "AVP": "Subscription-Id"
+        },
+        {
+          "AVP": "PS-Information",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "IMS-Information",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "MMS-Information",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "LCS-Information",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "PoC-Information",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "MBMS-Information",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "SMS-Information",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "MMTel-Information",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "AoC-Information",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "IM-Information",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "DCD-Information",
+          "Max": 1,
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "PS-Information",
+      "Content": [
+        {
+          "AVP": "Called-Station-Id",
+          "Max": 1
+        },
+        {
+          "AVP": "User-Equipment-Info",
+          "Max": 1
+        },
+        {
+          "AVP": "3GPP2-BSID",
+          "Max": 1,
+          "Vendor": 5535
+        },
+        {
+          "AVP": "3GPP-Charging-Id",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "3GPP-PDP-Type",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "3GPP-IMSI-MCC-MNC",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "3GPP-GGSN-MCC-MNC",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "3GPP-NSAPI",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "3GPP-Session-Stop-Indicator",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "3GPP-Selection-Mode",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "3GPP-Charging-Characteristics",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "3GPP-SGSN-MCC-MNC",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "3GPP-RAT-Type",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "3GPP-User-Location-Info",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "3GPP-MS-TimeZone",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "CG-Address",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "GGSN-Address",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "PS-Furnish-Charging-Information",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Charging-Rule-Base-Name",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "QoS-Information",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "PDP-Address",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "SGSN-Address",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "PDP-Context-Type",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Offline-Charging",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Terminal-Information",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "MME-Number-for-MT-SMS",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Change-Condition",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Diagnostics",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Service-Data-Container",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Start-Time",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Stop-Time",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Traffic-Data-Volumes",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Serving-Node-Type",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "PDN-Connection-Charging-ID",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Dynamic-Address-Flag",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Node-Id",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "SGW-Change",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Charging-Characteristics-Selection-Mode",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "SGW-Address",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Dynamic-Address-Flag-Extension",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "IMSI-Unauthenticated-Flag",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "User-CSG-Information",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "MME-Name",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "MME-Realm",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Low-Priority-Indicator",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "PDP-Address-Prefix-Length",
+          "Max": 1,
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "IMS-Information",
+      "Content": [
+        {
+          "AVP": "Server-Capabilities",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Session-Priority",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Event-Type",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Role-Of-Node",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "User-Session-Id",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Calling-Party-Address",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Called-Party-Address",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Time-Stamps",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Inter-Operator-Identifier",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "IMS-Charging-Identifier",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "SDP-Session-Description",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "SDP-Media-Component",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Served-Party-IP-Address",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Application-Server-Information",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Trunk-Group-Id",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Bearer-Service",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Service-Id",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Associated-URI",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Cause-Code",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Node-Functionality",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Message-Body",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Service-Specific-Info",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Called-Asserted-Identity",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Requested-Party-Address",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Access-Network-Information",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Early-Media-Description",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Alternate-Charged-Party-Address",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "IMS-Communication-Service-Identifier",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Carrier-Select-Routing-Information",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Number-Portability-Routing-Information",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Online-Charging-Flag",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Real-Time-Tariff-Information",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Account-Expiration",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Outgoing-Session-Id",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Initial-IMS-Charging-Identifier",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "IMS-Emergency-Indicator",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "IMS-Application-Reference-Identifier",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Transit-IOI-List",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "NNI-Information",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "From-Address",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Access-Transfer-Information",
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "MMS-Information",
+      "Content": [
+        {
+          "AVP": "Originator-Address",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "VASP-ID",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "VAS-ID",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Recipient-Address",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Submission-Time",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "MM-Content-Type",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Priority",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Message-ID",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Message-Type",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Message-Size",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Message-Class",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Delivery-Report-Requested",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Adaptations",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Applic-ID",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Aux-Applic-Info",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Content-Class",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "DRM-Content",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Read-Reply-Report-Requested",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Reply-Applic-ID",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "MMBox-Storage-Requested",
+          "Max": 1,
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Originator-Address",
+      "Content": [
+        {
+          "AVP": "Address-Data",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Address-Domain",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Address-Type",
+          "Max": 1,
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Address-Domain",
+      "Content": [
+        {
+          "AVP": "3GPP-IMSI-MCC-MNC",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Domain-Name",
+          "Max": 1,
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "QoS-Information",
+      "Content": [
+        {
+          "AVP": "Max-Requested-Bandwidth-DL",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Max-Requested-Bandwidth-UL",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Bearer-Identifier",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Guaranteed-Bitrate-DL",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Guaranteed-Bitrate-UL",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "QoS-Class-Identifier",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Allocation-Retention-Priority",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "APN-Aggregate-Max-Bitrate-DL",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "APN-Aggregate-Max-Bitrate-UL",
+          "Max": 1,
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Recipient-Address",
+      "Content": [
+        {
+          "AVP": "Address-Data",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Address-Domain",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Address-Type",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Addressee-Type",
+          "Max": 1,
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Message-Class",
+      "Content": [
+        {
+          "AVP": "Class-Identifier",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Token-Text",
+          "Max": 1,
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Envelope",
+      "Content": [
+        {
+          "AVP": "CC-Input-Octets",
+          "Max": 1
+        },
+        {
+          "AVP": "CC-Output-Octets",
+          "Max": 1
+        },
+        {
+          "AVP": "CC-Service-Specific-Units",
+          "Max": 1
+        },
+        {
+          "AVP": "CC-Total-Octets",
+          "Max": 1
+        },
+        {
+          "AVP": "Envelope-End-Time",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Envelope-Start-Time",
+          "Max": 1,
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Time-Quota-Mechanism",
+      "Content": [
+        {
+          "AVP": "Time-Quota-Type",
+          "Vendor": 10415,
+          "Min": 1,
+          "Max": 1
+        },
+        {
+          "AVP": "Base-Time-Interval",
+          "Vendor": 10415,
+          "Min": 1,
+          "Max": 1
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Offline-Charging",
+      "Content": [
+        {
+          "AVP": "Multiple-Services-Credit-Control"
+        },
+        {
+          "AVP": "Quota-Consumption-Time",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Envelope-Reporting",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Time-Quota-Mechanism",
+          "Max": 1,
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "SMS-Information",
+      "Content": [
+        {
+          "AVP": "Data-Coding-Scheme",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "SM-Message-Type",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Originator-SCCP-Address",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Originator-Interface",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Reply-Path-Requested",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "SM-Discharge-Time",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "SM-Protocol-ID",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "SM-Status",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "SM-User-Data-Header",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "SMS-Node",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "SMSC-Address",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Client-Address",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Number-Of-Messages-Sent",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Recipient-Info",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Originator-Received-Address",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "SM-Service-Type",
+          "Max": 1,
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Destination-Interface",
+      "Content": [
+        {
+          "AVP": "Interface-Id",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Interface-Port",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Interface-Text",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Interface-Type",
+          "Max": 1,
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Originator-Interface",
+      "Content": [
+        {
+          "AVP": "Interface-Id",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Interface-Port",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Interface-Text",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Interface-Type",
+          "Max": 1,
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Recipient-Info",
+      "Content": [
+        {
+          "AVP": "Recipient-Address",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Destination-Interface",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Recipient-SCCP-Address",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "SM-Protocol-ID",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Recipient-Received-Address",
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Recipient-Received-Address",
+      "Content": [
+        {
+          "AVP": "Address-Data",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Address-Domain",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Address-Type",
+          "Max": 1,
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "IM-Information",
+      "Content": [
+        {
+          "AVP": "Number-Of-Messages-Successfully-Exploded",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Number-Of-Messages-Successfully-Sent",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Total-Number-Of-Messages-Exploded",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Total-Number-Of-Messages-Sent",
+          "Max": 1,
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "DCD-Information",
+      "Content": [
+        {
+          "AVP": "Content-ID",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Content-provider-ID",
+          "Max": 1,
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Charging-Rule-Install",
+      "Content": [
+        {
+          "AVP": "Charging-Rule-Definition",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Charging-Rule-Name",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Charging-Rule-Base-Name",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Bearer-Identifier",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Monitoring-Flags",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Rule-Activation-Time",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Rule-Deactivation-Time",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Resource-Allocation-Notification",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Charging-Correlation-Indicator",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "IP-CAN-Type",
+          "Vendor": 10415,
+          "Max": 1
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Charging-Rule-Remove",
+      "Content": [
+        {
+          "AVP": "Charging-Rule-Name",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Charging-Rule-Base-Name",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Required-Access-Info",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Resource-Release-Notification",
+          "Vendor": 10415,
+          "Max": 1
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Charging-Rule-Definition",
+      "Content": [
+        {
+          "AVP": "Charging-Rule-Name",
+          "Vendor": 10415,
+          "Min": 1,
+          "Max": 1
+        },
+        {
+          "AVP": "Service-Identifier",
+          "Max": 1
+        },
+        {
+          "AVP": "Rating-Group",
+          "Max": 1
+        },
+        {
+          "AVP": "Flow-Information",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Default-Bearer-Indication",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "TDF-Application-Identifier",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Flow-Status",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "QoS-Information",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "PS-to-CS-Session-Continuity",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Reporting-Level",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Online",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Offline",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Metering-Method",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Precedence",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "AF-Charging-Identifier",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Flows",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Monitoring-Key",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Redirect-Information",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Mute-Notification",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "AF-Signalling-Protocol",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Sponsor-Identity",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Application-Service-Provider-Identity",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Required-Access-Info",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Sharing-Key-DL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Sharing-Key-UL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Traffic-Steering-Policy-Identifier-DL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Traffic-Steering-Policy-Identifier-UL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Content-Version",
+          "Vendor": 10415,
+          "Max": 1
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "TFT-Packet-Filter-Information",
+      "Content": [
+        {
+          "AVP": "Precedence",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "TFT-Filter",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "ToS-Traffic-Class",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Security-Parameter-Index",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Flow-Label",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Flow-Direction",
+          "Vendor": 10415,
+          "Max": 1
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "QoS-Information",
+      "Content": [
+        {
+          "AVP": "QoS-Class-Identifier",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Max-Requested-Bandwidth-UL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Max-Requested-Bandwidth-DL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Extended-Max-Requested-BW-UL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Extended-Max-Requested-BW-DL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Guaranteed-Bitrate-UL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Guaranteed-Bitrate-DL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Extended-GBR-UL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Extended-GBR-DL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Bearer-Identifier",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Allocation-Retention-Priority",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "APN-Aggregate-Max-Bitrate-UL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "APN-Aggregate-Max-Bitrate-DL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Extended-APN-AMBR-UL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Extended-APN-AMBR-DL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Conditional-APN-Aggregate-Max-Bitrate",
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Charging-Rule-Report",
+      "Content": [
+        {
+          "AVP": "Charging-Rule-Name",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Charging-Rule-Base-Name",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Bearer-Identifier",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "PCC-Rule-Status",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Rule-Failure-Code",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Final-Unit-Indication",
+          "Max": 1
+        },
+        {
+          "AVP": "RAN-NAS-Release-Cause",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Content-Version",
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Access-Network-Charging-Identifier-Gx",
+      "Content": [
+        {
+          "AVP": "Access-Network-Charging-Identifier-Value",
+          "Vendor": 10415,
+          "Min": 1,
+          "Max": 1
+        },
+        {
+          "AVP": "Charging-Rule-Base-Name",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Charging-Rule-Name",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "IP-CAN-Session-Charging-Scope",
+          "Vendor": 10415,
+          "Max": 1
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Event-Report-Indication",
+      "Content": [
+        {
+          "AVP": "AN-Trusted",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Event-Trigger",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "User-CSG-Information",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "IP-CAN-Type",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "AN-GW-Address",
+          "Vendor": 10415,
+          "Max": 2
+        },
+        {
+          "AVP": "3GPP-SGSN-Address",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "3GPP-SGSN-IPv6-Address",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "3GPP-SGSN-MCC-MNC",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Framed-IP-Address",
+          "Max": 1
+        },
+        {
+          "AVP": "RAT-Type",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "RAI",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "3GPP-User-Location-Info",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Trace-Data",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Trace-Reference",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "3GPP2-BSID",
+          "Vendor": 5535,
+          "Max": 1
+        },
+        {
+          "AVP": "3GPP-MS-TimeZone",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Routing-IP-Address",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "UE-Local-IP-Address",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "HeNB-Local-IP-Address",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "UDP-Source-Port",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Presence-Reporting-Area-Information",
+          "Vendor": 10415,
+          "Max": 1
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Allocation-Retention-Priority",
+      "Content": [
+        {
+          "AVP": "Priority-Level",
+          "Vendor": 10415,
+          "Min": 1,
+          "Max": 1
+        },
+        {
+          "AVP": "Pre-emption-Capability",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Pre-emption-Vulnerability",
+          "Vendor": 10415,
+          "Max": 1
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Tunnel-Information",
+      "Content": [
+        {
+          "AVP": "Tunnel-Header-Length",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Tunnel-Header-Filter",
+          "Vendor": 10415,
+          "Min": 2,
+          "Max": 2
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "CoA-Information",
+      "Content": [
+        {
+          "AVP": "Tunnel-Information",
+          "Vendor": 10415,
+          "Min": 1,
+          "Max": 1
+        },
+        {
+          "AVP": "CoA-IP-Address",
+          "Vendor": 10415,
+          "Min": 1,
+          "Max": 1
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Flow-Information",
+      "Content": [
+        {
+          "AVP": "Flow-Description",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Packet-Filter-Identifier",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Packet-Filter-Usage",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "ToS-Traffic-Class",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Security-Parameter-Index",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Flow-Label",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Flow-Direction",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Routing-Rule-Identifier",
+          "Vendor": 10415,
+          "Max": 1
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Packet-Filter-Information",
+      "Content": [
+        {
+          "AVP": "Packet-Filter-Identifier",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Precedence",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Packet-Filter-Content",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "ToS-Traffic-Class",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Security-Parameter-Index",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Flow-Label",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Flow-Direction",
+          "Vendor": 10415,
+          "Max": 1
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Routing-Rule-Install",
+      "Content": [
+        {
+          "AVP": "Routing-Rule-Definition",
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Routing-Rule-Remove",
+      "Content": [
+        {
+          "AVP": "Routing-Rule-Identifier",
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Routing-Rule-Definition",
+      "Content": [
+        {
+          "AVP": "Routing-Rule-Identifier",
+          "Vendor": 10415,
+          "Min": 1,
+          "Max": 1
+        },
+        {
+          "AVP": "Routing-Filter",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Precedence",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Routing-IP-Address",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "IP-CAN-Type",
+          "Vendor": 10415,
+          "Max": 1
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Routing-Filter",
+      "Content": [
+        {
+          "AVP": "Flow-Description",
+          "Vendor": 10415,
+          "Min": 1,
+          "Max": 1
+        },
+        {
+          "AVP": "Flow-Direction",
+          "Vendor": 10415,
+          "Min": 1,
+          "Max": 1
+        },
+        {
+          "AVP": "ToS-Traffic-Class",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Security-Parameter-Index",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Flow-Label",
+          "Vendor": 10415,
+          "Max": 1
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Redirect-Information",
+      "Content": [
+        {
+          "AVP": "Redirect-Support",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Redirect-Address-Type",
+          "Max": 1
+        },
+        {
+          "AVP": "Redirect-Server-Address",
+          "Max": 1
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Application-Detection-Information",
+      "Content": [
+        {
+          "AVP": "TDF-Application-Identifier",
+          "Vendor": 10415,
+          "Min": 1,
+          "Max": 1
+        },
+        {
+          "AVP": "TDF-Application-Instance-Identifier",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Flow-Information",
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Default-QoS-Information",
+      "Content": [
+        {
+          "AVP": "QoS-Class-Identifier",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Max-Requested-Bandwidth-UL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Max-Requested-Bandwidth-DL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Default-QoS-Name",
+          "Vendor": 10415,
+          "Max": 1
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Conditional-APN-Aggregate-Max-Bitrate",
+      "Content": [
+        {
+          "AVP": "APN-Aggregate-Max-Bitrate-UL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "APN-Aggregate-Max-Bitrate-DL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Extended-APN-AMBR-UL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Extended-APN-AMBR-DL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "IP-CAN-Type",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "RAT-Type",
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Presence-Reporting-Area-Information",
+      "Content": [
+        {
+          "AVP": "Presence-Reporting-Area-Identifier",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Presence-Reporting-Area-Status",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Presence-Reporting-Area-Elements-List",
+          "Vendor": 10415,
+          "Max": 1
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Routing-Rule-Report",
+      "Content": [
+        {
+          "AVP": "Routing-Rule-Identifier",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "PCC-Rule-Status",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Routing-Rule-Failure-Code",
+          "Vendor": 10415,
+          "Max": 1
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "Conditional-Policy-Information",
+      "Content": [
+        {
+          "AVP": "Execution-Time",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Default-EPS-Bearer-QoS",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "APN-Aggregate-Max-Bitrate-UL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "APN-Aggregate-Max-Bitrate-DL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Conditional-APN-Aggregate-Max-Bitrate",
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "PRA-Install",
+      "Content": [
+        {
+          "AVP": "Presence-Reporting-Area-Information",
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "PRA-Remove",
+      "Content": [
+        {
+          "AVP": "Presence-Reporting-Area-Identifier",
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "QoS-Rule-Install",
+      "Content": [
+        {
+          "AVP": "QoS-Rule-Definition",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "QoS-Rule-Name",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "QoS-Rule-Base-Name",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Tunnel-Information",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Access-Network-Charging-Identifier-Value",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Resource-Allocation-Notification",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Rule-Activation-Time",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Rule-Deactivation-Time",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "3GPP-GGSN-Address",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "3GPP-GGSN-IPv6-Address",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "AN-GW-Address",
+          "Vendor": 10415,
+          "Max": 2
+        },
+        {
+          "AVP": "UDP-Source-Port",
+          "Vendor": 10415,
+          "Max": 1
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "QoS-Rule-Remove",
+      "Content": [
+        {
+          "AVP": "QoS-Rule-Name",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "QoS-Rule-Base-Name",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Required-Access-Info",
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "QoS-Rule-Definition",
+      "Content": [
+        {
+          "AVP": "QoS-Rule-Name",
+          "Vendor": 10415,
+          "Min": 1,
+          "Max": 1
+        },
+        {
+          "AVP": "Flow-Information",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "QoS-Information",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Precedence",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Required-Access-Info",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Sharing-Key-DL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Sharing-Key-UL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Content-Version",
+          "Vendor": 10415,
+          "Max": 1
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "QoS-Rule-Report",
+      "Content": [
+        {
+          "AVP": "QoS-Rule-Name",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "QoS-Rule-Base-Name",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "PCC-Rule-Status",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Rule-Failure-Code",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Content-Version",
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "ADC-Rule-Install",
+      "Content": [
+        {
+          "AVP": "ADC-Rule-Definition",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "ADC-Rule-Name",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "ADC-Rule-Base-Name",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Monitoring-Flags",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Rule-Activation-Time",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Rule-Deactivation-Time",
+          "Vendor": 10415,
+          "Max": 1
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "ADC-Rule-Remove",
+      "Content": [
+        {
+          "AVP": "ADC-Rule-Name",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "ADC-Rule-Base-Name",
+          "Vendor": 10415
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "ADC-Rule-Definition",
+      "Content": [
+        {
+          "AVP": "ADC-Rule-Name",
+          "Vendor": 10415,
+          "Min": 1,
+          "Max": 1
+        },
+        {
+          "AVP": "TDF-Application-Identifier",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Flow-Information",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Service-Identifier",
+          "Max": 1
+        },
+        {
+          "AVP": "Rating-Group",
+          "Max": 1
+        },
+        {
+          "AVP": "Reporting-Level",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Online",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Offline",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Metering-Method",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Precedence",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Flow-Status",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "QoS-Information",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Monitoring-Key",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Sponsor-Identity",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Application-Service-Provider-Identity",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Redirect-Information",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Mute-Notification",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Traffic-Steering-Policy-Identifier-DL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Traffic-Steering-Policy-Identifier-UL",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "ToS-Traffic-Class",
+          "Vendor": 10415,
+          "Max": 1
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "ADC-Rule-Report",
+      "Content": [
+        {
+          "AVP": "ADC-Rule-Name",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "ADC-Rule-Base-Name",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "PCC-Rule-Status",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Rule-Failure-Code",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Final-Unit-Indication",
+          "Max": 1
+        }
+      ],
+      "Vendor": 10415
+    },
+    {
+      "AVP": "CS-Service-Resource-Report",
+      "Content": [
+        {
+          "AVP": "CS-Service-QoS-Request-Identifier",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "CS-Service-Resource-Result-Operation",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "CS-Service-Resource-Failure-Cause",
+          "Vendor": 10415,
+          "Max": 1
+        }
+      ],
+      "Vendor": 10415
+    }
+  ],
+  "AVPs": [
+    {
+      "Code": 9010,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "3GPP2-BSID",
+      "Type": "OctetString",
+      "Vendor": 5535
+    },
+    {
+      "Code": 1,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "3GPP-IMSI",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "3GPP-Charging-Id",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "3GPP-PDP-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 4,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "3GPP-CG-Address",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 5,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "3GPP-GPRS-Negotiated-QoS-Profile",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 6,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "3GPP-SGSN-Address",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 7,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "3GPP-GGSN-Address",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 8,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "3GPP-IMSI-MCC-MNC",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 9,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "3GPP-GGSN-MCC-MNC",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 10,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "3GPP-NSAPI",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 11,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "3GPP-Session-Stop-Indicator",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 12,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "3GPP-Selection-Mode",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 13,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "3GPP-Charging-Characteristics",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 14,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "3GPP-CG-IPv6-Address",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 15,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "3GPP-SGSN-IPv6-Address",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 16,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "3GPP-GGSN-IPv6-Address",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 17,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "3GPP-IPv6-DNS-Servers",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 18,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "3GPP-SGSN-MCC-MNC",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 20,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "3GPP-IMEISV",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 21,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "3GPP-RAT-Type",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 22,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "3GPP-User-Location-Info",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 23,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "3GPP-MS-TimeZone",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 24,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "3GPP-CAMEL-Charging-Info",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 25,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "3GPP-Packet-Filter",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 26,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "3GPP-Negotiated-DSCP",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 27,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "3GPP-Allocate-IP-Type",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 28,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "External-Identifier",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 124,
+      "Flags": {
+        "Must": "M",
+        "MustNot": "VP"
+      },
+      "Name": "MIP6-Feature-Vector",
+      "Type": "Unsigned64",
+      "Vendor": 10415
+    },
+    {
+      "Code": 493,
+      "Flags": {
+        "Must": "M",
+        "MustNot": "VP"
+      },
+      "Name": "Service-Selection",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 500,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Abort-Cause",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 501,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Access-Network-Charging-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 502,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Access-Network-Charging-Identifier",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 503,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Access-Network-Charging-Identifier-Value",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 504,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "AF-Application-Identifier",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 505,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "AF-Charging-Identifier",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 506,
+      "Flags": {
+        "Must": "M",
+        "MustNot": "VP"
+      },
+      "Name": "Mobile-Node-Identifier",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 507,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Flow-Description",
+      "Type": "IPFilterRule",
+      "Vendor": 10415
+    },
+    {
+      "Code": 509,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Flow-Number",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 510,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Flows",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 511,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Flow-Status",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 512,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Flow-Usage",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 513,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Specific-Action",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 515,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Max-Requested-Bandwidth-DL",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 516,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Max-Requested-Bandwidth-UL",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 517,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Media-Component-Description",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 518,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Media-Component-Number",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 519,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Media-Sub-Component",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 520,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Media-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 521,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "RR-Bandwidth",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 522,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "RS-Bandwidth",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 523,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SIP-Forking-Indication",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 524,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Codec-Data",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 525,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Service-URN",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 526,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Acceptable-Service-Info",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 527,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Service-Info-Status",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 528,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "MPS-Identifier",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 529,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "AF-Signalling-Protocol",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 530,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Sponsored-Connectivity-Data",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 531,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Sponsor-Identity",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 532,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Application-Service-Provider-Identity",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 533,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Rx-Request-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 534,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Min-Requested-Bandwidth-DL",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 535,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Min-Requested-Bandwidth-UL",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 536,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Required-Access-Info",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 537,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "IP-Domain-Id",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 538,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "GCS-Identifier",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 539,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Sharing-Key-DL",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 540,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Sharing-Key-UL",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 541,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Retry-Interval",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 542,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Sponsoring-Action",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 543,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Max-Supported-Bandwidth-DL",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 544,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Max-Supported-Bandwidth-UL",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 545,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Min-Desired-Bandwidth-DL",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 546,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Min-Desired-Bandwidth-UL",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 547,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "MCPTT-Identifier",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 548,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Service-Authorization-Info",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 549,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Media-Component-Status",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 550,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Priority-Sharing-Indicator",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 551,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "AF-Requested-Data",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 552,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Content-Version",
+      "Type": "Unsigned64",
+      "Vendor": 10415
+    },
+    {
+      "Code": 553,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Pre-emption-Control-Info",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 554,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Extended-Max-Requested-BW-DL",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 555,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Extended-Max-Requested-BW-UL",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 556,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Extended-Max-Supported-BW-DL",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 557,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Extended-Max-Supported-BW-UL",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 558,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Extended-Min-Desired-BW-DL",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 559,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Extended-Min-Desired-BW-UL",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 560,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Extended-Min-Requested-BW-DL",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 561,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Extended-Min-Requested-BW-UL",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 578,
+      "Flags": {
+        "Must": "M",
+        "MustNot": "VP"
+      },
+      "Name": "QoS-Capability",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 600,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Visited-Network-Identifier",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 601,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Public-Identity",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 602,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Server-Name",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 603,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Server-Capabilities",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 604,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Mandatory-Capability",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 605,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Optional-Capability",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 606,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "User-Data",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 607,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SIP-Number-Auth-Items",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 608,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SIP-Authentication-Scheme",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 609,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SIP-Authenticate",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 610,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SIP-Authorization",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 611,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SIP-Authentication-Context",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 612,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SIP-Auth-Data-Item",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 613,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SIP-Item-Number",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 614,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Server-Assignment-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 615,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Deregistration-Reason",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 616,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Reason-Code",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 617,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Reason-Info",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 618,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Charging-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 619,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Primary-Event-Charging-Function-Name",
+      "Type": "DiameterURI",
+      "Vendor": 10415
+    },
+    {
+      "Code": 620,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Secondary-Event-Charging-Function-Name",
+      "Type": "DiameterURI",
+      "Vendor": 10415
+    },
+    {
+      "Code": 621,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Primary-Charging-Collection-Function-Name",
+      "Type": "DiameterURI",
+      "Vendor": 10415
+    },
+    {
+      "Code": 622,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Secondary-Charging-Collection-Function-Name",
+      "Type": "DiameterURI",
+      "Vendor": 10415
+    },
+    {
+      "Code": 623,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "User-Authorization-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 624,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "User-Data-Already-Available",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 625,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Confidentiality-Key",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 626,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Integrity-Key",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 628,
+      "Flags": {
+        "Must": "V",
+        "MustNot": ""
+      },
+      "Name": "Supported-Features",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 629,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Feature-List-ID",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 630,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Feature-List",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 631,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Supported-Applications",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 632,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Associated-Identities",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 633,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Originating-Request",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 634,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Wildcarded-Public-Identity",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 635,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "SIP-Digest-Authenticate",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 636,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Wildcarded-IMPU",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 637,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "UAR-Flags",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 638,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Loose-Route-Indication",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 639,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "SCSCF-Restoration-Info",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 640,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Path",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 641,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Contact",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 642,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Subscription-Info",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 643,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Call-ID-SIP-Header",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 644,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "From-SIP-Header",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 645,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "To-SIP-Header",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 646,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Record-Route",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 647,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Associated-Registered-Identities",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 648,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Multiple-Registration-Indication",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 649,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Restoration-Info",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 650,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Session-Priority",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 651,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Identity-with-Emergency-Registration",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 652,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Priviledged-Sender-Indication",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 653,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "LIA-Flags",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 700,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "User-Identity",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 701,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MSISDN",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 702,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "User-Data-29.329",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 703,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Data-Reference",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 704,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Service-Indication",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 705,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Subs-Req-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 706,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Requested-Domain",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 707,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Current-Location",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 708,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Identity-Set",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 709,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Expiry-Time",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 710,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Send-Data-Indication",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 711,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "DSAI-Tag",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 712,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "One-Time-Notification",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 713,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Requested-Nodes",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 714,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Serving-Node-Indication",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 715,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Repository-Data-ID",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 716,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Sequence-Number",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 719,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "UDR-Flags",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 823,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Event-Type",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 824,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SIP-Method",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 825,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Event",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 826,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Content-Type",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 827,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Content-Length",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 828,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Content-Disposition",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 829,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Role-Of-Node",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 830,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "User-Session-Id",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 831,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Calling-Party-Address",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 832,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Called-Party-Address",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 833,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Time-Stamps",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 834,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SIP-Request-Timestamp",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 835,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SIP-Response-Timestamp",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 836,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Application-Server",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 837,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Application-Provided-Called-Party-Address",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 838,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Inter-Operator-Identifier",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 839,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Originating-IOI",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 840,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Terminating-IOI",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 841,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "IMS-Charging-Identifier",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 842,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SDP-Session-Description",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 843,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SDP-Media-Component",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 844,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SDP-Media-Name",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 845,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SDP-Media-Description",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 846,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "CG-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 847,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "GGSN-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 848,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Served-Party-IP-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 849,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Authorised-QoS",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 850,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Application-Server-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 851,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Trunk-Group-Id",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 852,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Incoming-Trunk-Group-Id",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 853,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Outgoing-Trunk-Group-Id",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 854,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Bearer-Service",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 855,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Service-Id",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 856,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Associated-URI",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 857,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Charged-Party",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 858,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PoC-Controlling-Address",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 859,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PoC-Group-Name",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 861,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Cause-Code",
+      "Type": "Integer32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 862,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Node-Functionality",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 863,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Service-Specific-Data",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 864,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Originator",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 865,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PS-Furnish-Charging-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 866,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PS-Free-Format-Data",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 867,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PS-Append-Free-Format-Data",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 868,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Time-Quota-Threshold",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 869,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Volume-Quota-Threshold",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 870,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Trigger-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 871,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Quota-Holding-Time",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 872,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Reporting-Reason",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 873,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Service-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 874,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PS-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 876,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "IMS-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 877,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MMS-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 878,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "LCS-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 879,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PoC-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 880,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MBMS-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 881,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Quota-Consumption-Time",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 882,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Media-Initiator-Flag",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 883,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PoC-Server-Role",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 884,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PoC-Session-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 885,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Number-Of-Participants",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 886,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Originator-Address",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 887,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Participants-Involved",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 888,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Expires",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 889,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Message-Body",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 897,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Address-Data",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 898,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Address-Domain",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 899,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Address-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 900,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "TMGI",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 901,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Required-MBMS-Bearer-Capabilities",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 902,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MBMS-StartStop-Indication",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 903,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MBMS-Service-Area",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 904,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MBMS-Session-Duration",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 905,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Alternative-APN",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 906,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MBMS-Service-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 907,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MBMS-2G-3G-Indicator",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 908,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MBMS-Session-Identity",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 909,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "RAI",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 910,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Additional-MBMS-Trace-Info",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 911,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MBMS-Time-To-Data-Transfer",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 912,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MBMS-Session-Repetition-Number",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 913,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MBMS-Required-QoS",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 914,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MBMS-Counting-Information",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 915,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MBMS-User-Data-Mode-Indication",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 916,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MBMS-GGSN-Address",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 917,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MBMS-GGSN-IPv6-Address",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 918,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MBMS-BMSC-SSM-IP-Address",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 919,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MBMS-BMSC-SSM-IPv6-Address",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 920,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MBMS-Flow-Identifier",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 921,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "CN-IP-Multicast-Distribution",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 922,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MBMS-HC-Indicator",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1000,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Bearer-Usage",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1001,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Charging-Rule-Install",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1002,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Charging-Rule-Remove",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1003,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Charging-Rule-Definition",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1004,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Charging-Rule-Base-Name",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1005,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Charging-Rule-Name",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1006,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Event-Trigger",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1007,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Metering-Method",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1008,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Offline",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1009,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Online",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1010,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Precedence",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1011,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Reporting-Level",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1012,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "TFT-Filter",
+      "Type": "IPFilterRule",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1013,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "TFT-Packet-Filter-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1014,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ToS-Traffic-Class",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1016,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "QoS-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1018,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Charging-Rule-Report",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1019,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PCC-Rule-Status",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1020,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Bearer-Identifier",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1021,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Bearer-Operation",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1022,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Access-Network-Charging-Identifier-Gx",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1023,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Bearer-Control-Mode",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1024,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Network-Request-Support",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1025,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Guaranteed-Bitrate-DL",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1026,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Guaranteed-Bitrate-UL",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1027,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "IP-CAN-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1028,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "QoS-Class-Identifier",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1029,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "QoS-Negotiation",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1030,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "QoS-Upgrade",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1031,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Rule-Failure-Code",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1032,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "RAT-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1033,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Event-Report-Indication",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1034,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Allocation-Retention-Priority",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1035,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "CoA-IP-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1036,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Tunnel-Header-Filter",
+      "Type": "IPFilterRule",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1037,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Tunnel-Header-Length",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1038,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Tunnel-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1039,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "CoA-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1040,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "APN-Aggregate-Max-Bitrate-DL",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1041,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "APN-Aggregate-Max-Bitrate-UL",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1042,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Revalidation-Time",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1043,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Rule-Activation-Time",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1044,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Rule-Deactivation-Time",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1045,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Session-Release-Cause",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1046,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Priority-Level",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1047,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Pre-emption-Capability",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1048,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Pre-emption-Vulnerability",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1049,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Default-EPS-Bearer-QoS",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1050,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "AN-GW-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1051,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "QoS-Rule-Install",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1052,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "QoS-Rule-Remove",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1053,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "QoS-Rule-Definition",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1054,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "QoS-Rule-Name",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1055,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "QoS-Rule-Report",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1056,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Security-Parameter-Index",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1057,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Flow-Label",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1058,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Flow-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1059,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Packet-Filter-Content",
+      "Type": "IPFilterRule",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1060,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Packet-Filter-Identifier",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1061,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Packet-Filter-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1062,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Packet-Filter-Operation",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1063,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Resource-Allocation-Notification",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1064,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Session-Linking-Indicator",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1065,
+      "Flags": {
+        "Must": "V",
+        "MustNot": ""
+      },
+      "Name": "PDN-Connection-ID",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1066,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Monitoring-Key",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1067,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Usage-Monitoring-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1068,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Usage-Monitoring-Level",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1069,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Usage-Monitoring-Report",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1070,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Usage-Monitoring-Support",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1071,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "CSG-Information-Reporting",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1072,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Packet-Filter-Usage",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1073,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Charging-Correlation-Indicator",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1074,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "QoS-Rule-Base-Name",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1075,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Routing-Rule-Remove",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1076,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Routing-Rule-Definition",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1077,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Routing-Rule-Identifier",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1078,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Routing-Filter",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1079,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Routing-IP-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1080,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Flow-Direction",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1081,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Routing-Rule-Install",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1082,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Credit-Management-Status",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1085,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Redirect-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1086,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Redirect-Support",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1087,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "TDF-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1088,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "TDF-Application-Identifier",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1089,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "TDF-Destination-Host",
+      "Type": "DiameterIdentity",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1090,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "TDF-Destination-Realm",
+      "Type": "DiameterIdentity",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1091,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "TDF-IP-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1092,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ADC-Rule-Install",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1093,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ADC-Rule-Remove",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1094,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ADC-Rule-Definition",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1095,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ADC-Rule-Base-Name",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1096,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ADC-Rule-Name",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1097,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ADC-Rule-Report",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1098,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Application-Detection-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1099,
+      "Flags": {
+        "Must": "V",
+        "MustNot": ""
+      },
+      "Name": "PS-to-CS-Session-Continuity",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1100,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Served-User-Identity",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1101,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "VASP-ID",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1102,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "VAS-ID",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1103,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Trigger-Event",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1104,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Sender-Address",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1105,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Initial-Recipient-Address",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1106,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Result-Recipient-Address",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1107,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Sequence-Number-29.140",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1108,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Recipient-Address-29.140",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1109,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Routeing-Address",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1110,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Originating-Interface",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1111,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Delivery-Report",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1112,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Read-Reply",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1113,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Sender-Visibility",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1114,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Service-Key",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1115,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Billing-Information",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1116,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Status-29.140",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1117,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Status-Code",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1118,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Status-Text",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1119,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Routeing-Address-Resolution",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1200,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Domain-Name",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1201,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Recipient-Address",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1202,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Submission-Time",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1203,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MM-Content-Type",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1204,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Type-Number",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1205,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Additional-Type-Information",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1206,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Content-Size",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1207,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Additional-Content-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1208,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Addressee-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1209,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Priority",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1210,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Message-ID",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1211,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Message-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1212,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Message-Size",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1213,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Message-Class",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1214,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Class-Identifier",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1215,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Token-Text",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1216,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Delivery-Report-Requested",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1217,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Adaptations",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1218,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Applic-ID",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1219,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Aux-Applic-Info",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1220,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Content-Class",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1221,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "DRM-Content",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1222,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Read-Reply-Report-Requested",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1223,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Reply-Applic-ID",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1224,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "File-Repair-Supported",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1225,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MBMS-User-Service-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1226,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Unit-Quota-Threshold",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1227,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PDP-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1228,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SGSN-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1229,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PoC-Session-Id",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1230,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Deferred-Location-Event-Type",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1231,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "LCS-APN",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1232,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "LCS-Client-Id",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1233,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "LCS-Client-Dialed-By-MS",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1234,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "LCS-Client-External-ID",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1235,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "LCS-Client-Name",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1236,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "LCS-Data-Coding-Scheme",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1237,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "LCS-Format-Indicator",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1238,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "LCS-Name-String",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1239,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "LCS-Requestor-ID",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1240,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "LCS-Requestor-ID-String",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1241,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "LCS-Client-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1242,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Location-Estimate",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1243,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Location-Estimate-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1244,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Location-Type",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1245,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Positioning-Data",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1247,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PDP-Context-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1248,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MMBox-Storage-Requested",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1249,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Service-Specific-Info",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1250,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Called-Asserted-Identity",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1251,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Requested-Party-Address",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1252,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PoC-User-Role",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1253,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PoC-User-Role-IDs",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1254,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PoC-User-Role-Info-Units",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1255,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Talk-Burst-Exchange",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1257,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Service-Specific-Type",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1258,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Event-Charging-TimeStamp",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1259,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Participant-Access-Priority",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1260,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Participant-Group",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1261,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PoC-Change-Condition",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1262,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PoC-Change-Time",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1263,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Access-Network-Information",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1264,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Trigger",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1265,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Base-Time-Interval",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1266,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Envelope",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1267,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Envelope-End-Time",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1268,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Envelope-Reporting",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1269,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Envelope-Start-Time",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1270,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Time-Quota-Mechanism",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1271,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Time-Quota-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1272,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Early-Media-Description",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1273,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SDP-TimeStamps",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1274,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SDP-Offer-Timestamp",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1275,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SDP-Answer-Timestamp",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1276,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "AF-Correlation-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1277,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PoC-Session-Initiation-type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1278,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Offline-Charging",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1279,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "User-Participating-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1280,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Alternate-Charged-Party-Address",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1281,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "IMS-Communication-Service-Identifier",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1282,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Number-Of-Received-Talk-Bursts",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1283,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Number-Of-Talk-Bursts",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1284,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Received-Talk-Burst-Time",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1285,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Received-Talk-Burst-Volume",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1286,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Talk-Burst-Time",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1287,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Talk-Burst-Volume",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1288,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Media-Initiator-Party",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1400,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Subscription-Data",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1401,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Terminal-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1402,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "IMEI",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1403,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Software-Version",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1404,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "QoS-Subscribed",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1405,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ULR-Flags",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1406,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ULA-Flags",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1407,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Visited-PLMN-Id",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1408,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Requested-EUTRAN-Authentication-Info",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1409,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Requested-UTRAN-GERAN-Authentication-Info",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1410,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Number-Of-Requested-Vectors",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1411,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Re-Synchronization-Info",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1412,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Immediate-Response-Preferred",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1413,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Authentication-Info",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1414,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "E-UTRAN-Vector",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1415,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "UTRAN-Vector",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1416,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "GERAN-Vector",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1417,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Network-Access-Mode",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1418,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "HPLMN-ODB",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1419,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Item-Number",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1420,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Cancellation-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1421,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "DSR-Flags",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1422,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "DSA-Flags",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1423,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Context-Identifier",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1424,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Subscriber-Status",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1425,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Operator-Determined-Barring",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1426,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Access-Restriction-Data",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1427,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "APN-OI-Replacement",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1428,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "All-APN-Configurations-Included-Indicator",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1429,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "APN-Configuration-Profile",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1430,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "APN-Configuration",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1431,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "EPS-Subscribed-QoS-Profile",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1432,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "VPLMN-Dynamic-Address-Allowed",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1433,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "STN-SR",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1434,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Alert-Reason",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1435,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "AMBR",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1436,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "CSG-Subscription-Data",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1437,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "CSG-Id",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1438,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PDN-GW-Allocation-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1439,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Expiration-Date",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1440,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "RAT-Frequency-Selection-Priority-ID",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1441,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "IDA-Flags",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1442,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PUA-Flags",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1443,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "NOR-Flags",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1444,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "User-Id",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1445,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Equipment-Status",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1446,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Regional-Subscription-Zone-Code",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1447,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "RAND",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1448,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "XRES",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1449,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "AUTN",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1450,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "KASME",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1452,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Trace-Collection-Entity",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1453,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Kc",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1454,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SRES",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1456,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PDN-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1457,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Roaming-Restricted-Due-To-Unsupported-Feature",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1458,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Trace-Data",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1459,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Trace-Reference",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1462,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Trace-Depth",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1463,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Trace-NE-Type-List",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1464,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Trace-Interface-List",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1465,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Trace-Event-List",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1466,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "OMC-Id",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1467,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "GPRS-Subscription-Data",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1468,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Complete-Data-List-Included-Indicator",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1469,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PDP-Context",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1470,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PDP-Type",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1471,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "3GPP2-MEID",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1472,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Specific-APN-Info",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1473,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "LCS-Info",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1474,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "GMLC-Number",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1475,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "LCS-PrivacyException",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1476,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SS-Code",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1477,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SS-Status",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1478,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Notification-To-UE-User",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1479,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "External-Client",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1480,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Client-Identity",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1481,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "GMLC-Restriction",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1482,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PLMN-Client",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1483,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Service-Type",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1484,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ServiceTypeIdentity",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1485,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MO-LR",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1486,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Teleservice-List",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1487,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "TS-Code",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1488,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Call-Barring-Infor-List",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1489,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SGSN-Number",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1490,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "IDR-Flags",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1491,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "ICS-Indicator",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1492,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "IMS-Voice-Over-PS-Sessions-Supported",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1493,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Homogeneous-Support-of-IMS-Voice-Over-PS-Sessions",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1494,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Last-UE-Activity-Time",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1495,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "EPS-User-State",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1496,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "EPS-Location-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1497,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "MME-User-State",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1498,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "SGSN-User-State",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1499,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "User-State",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1503,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": "P"
+      },
+      "Name": "AN-Trusted",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1504,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": "P"
+      },
+      "Name": "ANID",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1506,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": "P"
+      },
+      "Name": "MIP-FA-RK",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1507,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": "P"
+      },
+      "Name": "MIP-FA-RK-SPI",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1509,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "MP"
+      },
+      "Name": "WLAN-Identifier",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1516,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "MP"
+      },
+      "Name": "Full-Network-Name",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1517,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "MP"
+      },
+      "Name": "Short-Network-Name",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1518,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "MP"
+      },
+      "Name": "AAA-Failure-Indication",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1519,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "MP"
+      },
+      "Name": "Transport-Access-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1520,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "MP"
+      },
+      "Name": "DER-Flags",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1521,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "MP"
+      },
+      "Name": "DEA-Flags",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1524,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "MP"
+      },
+      "Name": "SSID",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1525,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "MP"
+      },
+      "Name": "HESSID",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1526,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "MP"
+      },
+      "Name": "Access-Network-Info",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1527,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "MP"
+      },
+      "Name": "TWAN-Connection-Mode",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1528,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "MP"
+      },
+      "Name": "TWAN-Connectivity-Parameters",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1529,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "MP"
+      },
+      "Name": "Connectivity-Flags",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1530,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "MP"
+      },
+      "Name": "TWAN-PCO",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1531,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "MP"
+      },
+      "Name": "TWAG-CP-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1532,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "MP"
+      },
+      "Name": "TWAG-UP-Address",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1533,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "MP"
+      },
+      "Name": "TWAN-S2a-Failure-Cause",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1534,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "MP"
+      },
+      "Name": "SM-Back-Off-Timer",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1535,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "MP"
+      },
+      "Name": "WLCP-Key",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1538,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "MP"
+      },
+      "Name": "Emergency-Services",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1540,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "MP"
+      },
+      "Name": "IMEI-Check-In-VPLMN-Result",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1600,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "MME-LocationInformation",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1601,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "SGSN-Location-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1602,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "E-UTRAN-Cell-Global-Identity",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1603,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Tracking-Area-Identity",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1604,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Cell-Global-Identity",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1605,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Routing-Area-Identity",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1606,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Location-Area-Identity",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1607,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Service-Area-Identity",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1608,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Geographical-Information",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1609,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Geodetic-Information",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1610,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Current-Location-Retrieved",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1611,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Age-Of-Location-Information",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1612,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Active-APN",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1613,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "SIPTO-Permission",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1614,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Error-Diagnostic",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1615,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "UE-SRVCC-Capability",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1616,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "MPS-Priority",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1617,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "VPLMN-LIPA-Allowed",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1618,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "LIPA-Permission",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1619,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Subscribed-Periodic-RAU-TAU-Timer",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1620,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Ext-PDP-Type",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1621,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Ext-PDP-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1622,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "MDT-Configuration",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1623,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Job-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1624,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Area-Scope",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1625,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "List-Of-Measurements",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1626,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Reporting-Trigger",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1627,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Report-Interval",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1628,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Report-Amount",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1629,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Event-Threshold-RSRP",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1630,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Event-Threshold-RSRQ",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1631,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Logging-Interval",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1632,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Logging-Duration",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1633,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Relay-Node-Indicator",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1634,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "MDT-User-Consent",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1635,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "PUR-Flags",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1636,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Subscribed-VSRVCC",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1637,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Equivalent-PLMN-List",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1638,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "CLR-Flags",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1639,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "UVR-Flags",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1640,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "UVA-Flags",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1641,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "VPLMN-CSG-Subscription-Data",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1642,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Time-Zone",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1643,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "A-MSISDN",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1645,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "MME-Number-for-MT-SMS",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1648,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "SMS-Register-Request",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1649,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Local-Time-Zone",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1650,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Daylight-Saving-Time",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1654,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Subscription-Data-Flags",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1655,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Measurement-Period-UMTS",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1656,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Measurement-Period-LTE",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1657,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Collection-Period-RRM-LTE",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1658,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Collection-Period-RRM-UMTS",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1659,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Positioning-Method",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1660,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Measurement-Quantity",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1661,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Event-Threshold-Event-1F",
+      "Type": "Integer32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 1662,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Event-Threshold-Event-1I",
+      "Type": "Integer32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2000,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SMS-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2001,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Data-Coding-Scheme",
+      "Type": "Integer32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2002,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Destination-Interface",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2003,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Interface-Id",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2004,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Interface-Port",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2005,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Interface-Text",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2006,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Interface-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2007,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SM-Message-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2008,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Originator-SCCP-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2009,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Originator-Interface",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2010,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Recipient-SCCP-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2011,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Reply-Path-Requested",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2012,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SM-Discharge-Time",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2013,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SM-Protocol-ID",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2014,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SM-Status",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2015,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SM-User-Data-Header",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2016,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SMS-Node",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2017,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SMSC-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2018,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Client-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2019,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Number-Of-Messages-Sent",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2020,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Low-Balance-Indication",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2021,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Remaining-Balance",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2022,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Refund-Information",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2023,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Carrier-Select-Routing-Information",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2024,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Number-Portability-Routing-Information",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2025,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PoC-Event-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2026,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Recipient-Info",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2027,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Originator-Received-Address",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2028,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Recipient-Received-Address",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2029,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SM-Service-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2030,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MMTel-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2031,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MMTel-SService-Type",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2032,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Service-Mode",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2033,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Subscriber-Role",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2034,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Number-Of-Diversions",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2035,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Associated-Party-Address",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2036,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SDP-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2037,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Change-Condition",
+      "Type": "Integer32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2038,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Change-Time",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2039,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Diagnostics",
+      "Type": "Integer32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2040,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Service-Data-Container",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2041,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Start-Time",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2042,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Stop-Time",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2043,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Time-First-Usage",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2044,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Time-Last-Usage",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2045,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Time-Usage",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2046,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Traffic-Data-Volumes",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2047,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Serving-Node-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2048,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Supplementary-Service",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2049,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Participant-Action-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2050,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PDN-Connection-Charging-ID",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2051,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Dynamic-Address-Flag",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2052,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Accumulated-Cost",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2053,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "AoC-Cost-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2054,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "AoC-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2055,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "AoC-Request-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2056,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Current-Tariff",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2057,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Next-Tariff",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2058,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Rate-Element",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2059,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Scale-Factor",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2060,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Tariff-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2061,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Unit-Cost",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2062,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Incremental-Cost",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2063,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Local-Sequence-Number",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2064,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Node-Id",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2065,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SGW-Change",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2066,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Charging-Characteristics-Selection-Mode",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2067,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SGW-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2068,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Dynamic-Address-Flag-Extension",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2101,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Application-Server-Id",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2102,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Application-Service-Type",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2103,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Application-Session-Id",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2104,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Delivery-Status",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2110,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "IM-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2111,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Number-Of-Messages-Successfully-Exploded",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2112,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Number-Of-Messages-Successfully-Sent",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2113,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Total-Number-Of-Messages-Exploded",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2114,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Total-Number-Of-Messages-Sent",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2115,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "DCD-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2116,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Content-ID",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2117,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Content-provider-ID",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2118,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Charge-Reason-Code",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2301,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SIP-Request-Timestamp-Fraction",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2302,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SIP-Response-Timestamp-Fraction",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2303,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Online-Charging-Flag",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2304,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "CUG-Information",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2305,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Real-Time-Tariff-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2306,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Tariff-XML",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2307,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MBMS-GW-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2308,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "IMSI-Unauthenticated-Flag",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2309,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Account-Expiration",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2310,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "AoC-Format",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2311,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "AoC-Service",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2312,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "AoC-Service-Obligatory-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2313,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "AoC-Service-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2314,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "AoC-Subscription-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2317,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "CSG-Access-Mode",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2318,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "CSG-Membership-Indication",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2319,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "User-CSG-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2320,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Outgoing-Session-Id",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2321,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Initial-IMS-Charging-Identifier",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2322,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "IMS-Emergency-Indicator",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2323,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MBMS-Charged-Party",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2400,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "LMSI",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2401,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Serving-Node",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2402,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MME-Name",
+      "Type": "DiameterIdentity",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2403,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MSC-Number",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2404,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "LCS-Capabilities-Sets",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2405,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "GMLC-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2406,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Additional-Serving-Node",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2407,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PPR-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2408,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "MME-Realm",
+      "Type": "DiameterIdentity",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2409,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "SGSN-Name",
+      "Type": "DiameterIdentity",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2410,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "SGSN-Realm",
+      "Type": "DiameterIdentity",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2601,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "IMS-Application-Reference-Identifier",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2602,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Low-Priority-Indicator",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2603,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "IP-Realm-Default-Indication",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2604,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Local-GW-Inserted-Indication",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2605,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Transcoder-Inserted-Indication",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2606,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PDP-Address-Prefix-Length",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2701,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Transit-IOI-List",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2702,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Status-AS-Code",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2703,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "NNI-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2704,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "NNI-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2705,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Neighbour-Node-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2706,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Relationship-Mode",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2707,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Session-Direction",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2708,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "From-Address",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2709,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Access-Transfer-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2710,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Access-Transfer-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2711,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Related-IMS-Charging-Identifier",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2712,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Related-IMS-Charging-Identifier-Node",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2713,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "IMS-Visited-Network-Identifier",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2714,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "TWAN-User-Location-Info",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2716,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "BSSID",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2717,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "TAD-Identifier",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2802,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "TDF-Application-Instance-Identifier",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2804,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "HeNB-Local-IP-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2805,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "UE-Local-IP-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2806,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "UDP-Source-Port",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2807,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "CS-Service-QoS-Request-Identifier",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2808,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "CS-Service-QoS-Request-Operation",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2809,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Mute-Notification",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2810,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Monitoring-Time",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2811,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "AN-GW-Status",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2812,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "User-Location-Info-Time",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2813,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "CS-Service-Resource-Report",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2814,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "CS-Service-Resource-Failure-Cause",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2815,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "CS-Service-Resource-Result-Operation",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2816,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Default-QoS-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2817,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Default-QoS-Name",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2818,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Conditional-APN-Aggregate-Max-Bitrate",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2819,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "RAN-NAS-Release-Cause",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2820,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Presence-Reporting-Area-Elements-List",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2821,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Presence-Reporting-Area-Identifier",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2822,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Presence-Reporting-Area-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2823,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Presence-Reporting-Area-Status",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2824,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "NetLoc-Access-Support",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2825,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Fixed-User-Location-Info",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2826,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "PCSCF-Restoration-Indication",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2827,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "IP-CAN-Session-Charging-Scope",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2828,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Monitoring-Flags",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2829,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Default-Access",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2830,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "NBIFOM-Mode",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2831,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "NBIFOM-Support",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2832,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "RAN-Rule-Support",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2833,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Access-Availability-Change-Reason",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2834,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Routing-Rule-Failure-Code",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2835,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Routing-Rule-Report",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2836,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Traffic-Steering-Policy-Identifier-DL",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2837,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Traffic-Steering-Policy-Identifier-UL",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2838,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Request-Type",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2839,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Execution-Time",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2840,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Conditional-Policy-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2841,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Resource-Release-Notification",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2842,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Removal-Of-Access",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2843,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "TCP-Source-Port",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2844,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Default-Bearer-Indication",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2845,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "PRA-Install",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2846,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "PRA-Remove",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2847,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "3GPP-PS-Data-Off-Status",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2848,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Extended-APN-AMBR-DL",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2849,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Extended-APN-AMBR-UL",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2850,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Extended-GBR-DL",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 2851,
+      "Flags": {
+        "Must": "V",
+        "MustNot": "M"
+      },
+      "Name": "Extended-GBR-UL",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3401,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Reason-Header",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3402,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Instance-Id",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3403,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Route-Header-Received",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3404,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Route-Header-Transmitted",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3405,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SM-Device-Trigger-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3406,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MTC-IWF-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3407,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SM-Device-Trigger-Indicator",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3408,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SM-Sequence-Number",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3409,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SMS-Result",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3410,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "VCS-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3411,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Basic-Service-Code",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3412,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Bearer-Capability",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3413,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Teleservice",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3414,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ISUP-Location-Number",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3415,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Forwarding-Pending",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3416,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ISUP-Cause",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3417,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "MSC-Address",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3418,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Network-Call-Reference-Number",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3419,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Start-of-Charging",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3420,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "VLR-Number",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3421,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "CN-Operator-Selection-Entity",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3422,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ISUP-Cause-Diagnostics",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3423,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ISUP-Cause-Location",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3424,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ISUP-Cause-Value",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3425,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "EPDG-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3426,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Announcing-UE-HPLMN-Identifier",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3427,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Announcing-UE-VPLMN-Identifier",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3428,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Coverage-Status",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3429,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Layer-2-Group-ID",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3430,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Monitored-PLMN-Identifier",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3431,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Monitoring-UE-HPLMN-Identifier",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3432,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Monitoring-UE-Identifier",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3433,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Monitoring-UE-VPLMN-Identifier",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3434,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PC3-Control-Protocol-Cause",
+      "Type": "Integer32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3435,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "PC3-EPC-Control-Protocol-Cause",
+      "Type": "Integer32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3436,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Requested-PLMN-Identifier",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3437,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Requestor-PLMN-Identifier",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3438,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Role-Of-ProSe-Function",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3439,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Usage-Information-Report-Sequence-Number",
+      "Type": "Integer32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3440,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ProSe-3rd-Party-Application-ID",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3441,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ProSe-Direct-Communication-Transmission-Data-Container",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3442,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ProSe-Direct-Discovery-Model",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3443,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ProSe-Event-Type",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3444,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ProSe-Function-IP-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3445,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ProSe-Functionality",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3446,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ProSe-Group-IP-Multicast-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3447,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ProSe-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3448,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ProSe-Range-Class",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3449,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ProSe-Reason-For-Cancellation",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3450,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ProSe-Request-Timestamp",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3451,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ProSe-Role-Of-UE",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3452,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ProSe-Source-IP-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3453,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ProSe-UE-ID",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3454,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Proximity-Alert-Indication",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3455,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Proximity-Alert-Timestamp",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3456,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Proximity-Cancellation-Timestamp",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3457,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ProSe-Function-PLMN-Identifier",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3458,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Application-Specific-Data",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3459,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Coverage-Info",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3460,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Location-Info",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3461,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ProSe-Direct-Communication-Reception-Data-Container",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3462,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Radio-Frequency",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3463,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Radio-Parameter-Set-Info",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3464,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Radio-Parameter-Set-Values",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3465,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Radio-Resources-Indicator",
+      "Type": "Integer32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3466,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Time-First-Reception",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3467,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Time-First-Transmission",
+      "Type": "Time",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3468,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Transmitter-Info",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3901,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Enhanced-Diagnostics",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3902,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Inter-UE-Transfer",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3903,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "TWAG-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3904,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Announcement-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3905,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Announcement-Identifier",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3906,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Announcement-Order",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3907,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Variable-Part",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3908,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Variable-Part-Order",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3909,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Variable-Part-Type",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3910,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Variable-Part-Value",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3911,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Time-Indicator",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3912,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Quota-Indicator",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3913,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Play-Alternative",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3914,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Language",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3915,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Privacy-Indicator",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3916,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Called-Identity",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3917,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Called-Identity-Change",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3918,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "UWAN-User-Location-Info",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3919,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Monitoring-Event-Configuration-Activity",
+      "Type": "Integer32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3920,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Monitoring-Event-Report-Data",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3921,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Monitoring-Event-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3922,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Monitoring-Event-Functionality",
+      "Type": "Integer32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3923,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Monitoring-Event-Report-Number",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3924,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Cellular-Network-Information",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3925,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Related-Change-Condition-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3926,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Related-Trigger",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3927,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "CPDT-Information",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3928,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "NIDD-Submission",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3929,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Serving-Node-Identity",
+      "Type": "DiameterIdentity",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3930,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "CP-CIoT-EPS-Optimisation-Indicator",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3931,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SGi-PtP-Tunnelling-Method",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3932,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "UNI-PDU-CP-Only-Flag",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3933,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "APN-Rate-Control",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3934,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "APN-Rate-Control-Downlink",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3935,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "APN-Rate-Control-Uplink",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3936,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Additional-Exception-Reports",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3937,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Rate-Control-Max-Message-Size",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3938,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Rate-Control-Max-Rate",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3939,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Rate-Control-Time-Unit",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3940,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SCS-AS-Address",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3941,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SCS-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 3942,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "SCS-Realm",
+      "Type": "DiameterIdentity",
+      "Vendor": 10415
+    },
+    {
+      "Code": 4400,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Charging-Per-IP-CAN-Session-Indicator",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 4401,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Access-Network-Info-Change",
+      "Type": "Grouped",
+      "Vendor": 10415
+    },
+    {
+      "Code": 4402,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Discoveree-UE-HPLMN-Identifier",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 4403,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Discoveree-UE-VPLMN-Identifier",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 4404,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Discoverer-UE-HPLMN-Identifier",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 4405,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Discoverer-UE-VPLMN-Identifier",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 4406,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "3GPP-PS-Data-Off-Status-32.299",
+      "Type": "Enumerated",
+      "Vendor": 10415
+    },
+    {
+      "Code": 4407,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Unused-Quota-Timer",
+      "Type": "Unsigned32",
+      "Vendor": 10415
+    },
+    {
+      "Code": 4408,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Announcing-PLMN-ID",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    },
+    {
+      "Code": 4409,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ProSe-UE-to-Network-Relay-UE-ID",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 4410,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "ProSe-Target-Layer-2-ID",
+      "Type": "OctetString",
+      "Vendor": 10415
+    },
+    {
+      "Code": 4411,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Relay-IP-address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 4412,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "Target-IP-Address",
+      "Type": "Address",
+      "Vendor": 10415
+    },
+    {
+      "Code": 4413,
+      "Flags": {
+        "Must": "VM",
+        "MustNot": ""
+      },
+      "Name": "FE-Identifier-List",
+      "Type": "UTF8String",
+      "Vendor": 10415
+    }
+  ],
+  "CommandRules": [
+    {
+      "Command": "Credit-Control-Request",
+      "Content": [
+        {
+          "AVP": "Credit-Management-Status",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Supported-Features",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "TDF-Information",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Network-Request-Support",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Packet-Filter-Information",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Packet-Filter-Operation",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Bearer-Identifier",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Bearer-Operation",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Dynamic-Address-Flag",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Dynamic-Address-Flag-Extension",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "PDN-Connection-Charging-ID",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Framed-IP-Address",
+          "Max": 1
+        },
+        {
+          "AVP": "IP-CAN-Type",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "3GPP-RAT-Type",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "AN-Trusted",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "RAT-Type",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "QoS-Information",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "QoS-Negotiation",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "QoS-Upgrade",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Default-EPS-Bearer-QoS",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Default-QoS-Information",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "AN-GW-Address",
+          "Vendor": 10415,
+          "Max": 2
+        },
+        {
+          "AVP": "AN-GW-Status",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "3GPP-SGSN-MCC-MNC",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "3GPP-SGSN-Address",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "3GPP-SGSN-IPv6-Address",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "3GPP-GGSN-Address",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "3GPP-GGSN-IPv6-Address",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "3GPP-Selection-Mode",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "RAI",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "3GPP-User-Location-Info",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Fixed-User-Location-Info",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "User-Location-Info-Time",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "User-CSG-Information",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "3GPP-MS-TimeZone",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "RAN-NAS-Release-Cause",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "3GPP-Charging-Characteristics",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Called-Station-Id",
+          "Max": 1
+        },
+        {
+          "AVP": "PDN-Connection-ID",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Bearer-Usage",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Online",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Offline",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "TFT-Packet-Filter-Information",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Charging-Rule-Report",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Application-Detection-Information",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Event-Trigger",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Event-Report-Indication",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Access-Network-Charging-Address",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Access-Network-Charging-Identifier-Gx",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "CoA-Information",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Usage-Monitoring-Information",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "NBIFOM-Support",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "NBIFOM-Mode",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Default-Access",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Access-Availability-Change-Reason",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Routing-Rule-Install",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Routing-Rule-Remove",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "HeNB-Local-IP-Address",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "UE-Local-IP-Address",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "UDP-Source-Port",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "TCP-Source-Port",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Presence-Reporting-Area-Information",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "3GPP-PS-Data-Off-Status",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Service-Information",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "AoC-Request-Type",
+          "Max": 1,
+          "Vendor": 10415
+        }
+
+      ]
+    },
+    {
+      "Command": "Credit-Control-Answer",
+      "Content": [
+        {
+          "AVP": "Experimental-Result",
+          "Max": 1
+        },
+        {
+          "AVP": "Supported-Features",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Bearer-Control-Mode",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Event-Trigger",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Event-Report-Indication",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Charging-Rule-Remove",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Charging-Rule-Install",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Charging-Information",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Online",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Offline",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "QoS-Information",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Revalidation-Time",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Default-EPS-Bearer-QoS",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Default-QoS-Information",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Bearer-Usage",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Usage-Monitoring-Information",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "CSG-Information-Reporting",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "User-CSG-Information",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "PRA-Install",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "PRA-Remove",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Presence-Reporting-Area-Information",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Session-Release-Cause",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "NBIFOM-Support",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "NBIFOM-Mode",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Default-Access",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "RAN-Rule-Support",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Routing-Rule-Report",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Conditional-Policy-Information",
+          "Vendor": 10415,
+          "Max": 4
+        },
+        {
+          "AVP": "Removal-Of-Access",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "IP-CAN-Type",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Error-Message",
+          "Max": 1
+        },
+        {
+          "AVP": "Error-Reporting-Host",
+          "Max": 1
+        },
+        {
+          "AVP": "Service-Information",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Low-Balance-Indication",
+          "Max": 1,
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Remaining-Balance",
+          "Max": 1,
+          "Vendor": 10415
+        }
+      ]
+    },
+    {
+      "Command": "Re-Auth-Request",
+      "Content": [
+        {
+          "AVP": "Session-Release-Cause",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Event-Trigger",
+          "Vendor": 10415,
+        },
+        {
+          "AVP": "Event-Report-Indication",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Charging-Rule-Remove",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Charging-Rule-Install",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Default-EPS-Bearer-QoS",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "QoS-Information",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Default-QoS-Information",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Revalidation-Time",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Usage-Monitoring-Information",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "PCSCF-Restoration-Indication",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Conditional-Policy-Information",
+          "Vendor": 10415,
+          "Max": 4
+        },
+        {
+          "AVP": "Removal-Of-Access",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "IP-CAN-Type",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "PRA-Install",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "PRA-Remove",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Specific-Action",
+          "Vendor": 10415,
+          "Min": 1,
+          "Max": 1
+        },
+        {
+          "AVP": "Access-Network-Charging-Identifier",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Access-Network-Charging-Address",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "AN-GW-Address",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "AN-Trusted",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Flows",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Subscription-Id",
+        },
+        {
+          "AVP": "Abort-Cause",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "IP-CAN-Type",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "NetLoc-Access-Support",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "RAT-Type",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Sponsored-Connectivity-Data",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "3GPP-User-Location-Info",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "User-Location-Info-Time",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "3GPP-MS-TimeZone",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "RAN-NAS-Release-Cause",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "3GPP-SGSN-MCC-MNC",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "TCP-Source-Port",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "UDP-Source-Port",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "UE-Local-IP-Address",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Class",
+        }
+      ]
+    },
+    {
+      "Command": "Re-Auth-Answer",
+      "Content": [
+        {
+          "AVP": "Experimental-Result",
+          "Max": 1
+        },
+        {
+          "AVP": "IP-CAN-Type",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "RAT-Type",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "AN-Trusted",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "AN-GW-Address",
+          "Vendor": 10415,
+          "Max": 2
+        },
+        {
+          "AVP": "3GPP-SGSN-MCC-MNC",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "3GPP-SGSN-Address",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "3GPP-SGSN-IPv6-Address",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "RAI",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "3GPP-User-Location-Info",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "User-Location-Info-Time",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "NetLoc-Access-Support",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "User-CSG-Information",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "3GPP-MS-TimeZone",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Default-QoS-Information",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Charging-Rule-Report",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Media-Component-Description",
+          "Vendor": 10415
+        },
+        {
+          "AVP": "Service-URN",
+          "Vendor": 10415,
+          "Max": 1
+        },
+        {
+          "AVP": "Class",
+        },
+
+      ]
+    },
+  ],
+  "Vendors": [
+    {
+      "Code": 5535,
+      "Name": "3GPP2"
+    },
+    {
+      "Code": 10415,
+      "Name": "3GPP"
+    }
+  ]
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contrib/dict_json/dictionary_dcca_3gpp_sy.json	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,377 @@
+{
+   "AVPRules" : [
+      {
+         "AVP" : "Policy-Counter-Status-Report",
+         "Content" : [
+            {
+               "AVP" : "Policy-Counter-Identifier",
+               "Vendor" : 10415
+            },
+            {
+               "AVP" : "Policy-Counter-Status",
+               "Vendor" : 10415
+            }
+         ],
+         "Vendor" : 10415
+      }
+   ],
+   "AVPs" : [
+      {
+         "Code" : 2901,
+         "Flags" : {
+            "Must" : "VM",
+            "MustNot" : ""
+         },
+         "Name" : "Policy-Counter-Identifier",
+         "Type" : "UTF8String",
+         "Vendor" : 10415
+      },
+      {
+         "Code" : 2902,
+         "Flags" : {
+            "Must" : "VM",
+            "MustNot" : ""
+         },
+         "Name" : "Policy-Counter-Status",
+         "Type" : "UTF8String",
+         "Vendor" : 10415
+      },
+      {
+         "Code" : 2903,
+         "Flags" : {
+            "Must" : "VM",
+            "MustNot" : ""
+         },
+         "Name" : "Policy-Counter-Status-Report",
+         "Type" : "Grouped",
+         "Vendor" : 10415
+      },
+      {
+         "Code" : 2904,
+         "EnumValues" : [
+            {
+               "Code" : 0,
+               "Name" : "INITIAL_REQUEST"
+            },
+            {
+               "Code" : 1,
+               "Name" : "INTERMEDIATE_REQUEST"
+            }
+         ],
+         "Flags" : {
+            "Must" : "VM",
+            "MustNot" : ""
+         },
+         "Name" : "SL-Request-Type",
+         "Type" : "Enumerated",
+         "Vendor" : 10415
+      }
+   ],
+   "Applications" : [
+      {
+         "Code" : 16777302,
+         "Name" : "Sy"
+      }
+   ],
+   "CommandRules" : [
+      {
+         "Command" : "Spending-Limit-Request",
+         "Content" : [
+            {
+               "AVP" : "Auth-Application-Id",
+               "Max" : 1,
+               "Min" : 1
+            },
+            {
+               "AVP" : "Session-Id",
+               "First" : true,
+               "Max" : 1,
+               "Min" : 1
+            },
+            {
+               "AVP" : "Origin-Host",
+               "Max" : 1,
+               "Min" : 1
+            },
+            {
+               "AVP" : "Origin-State-Id",
+               "Max" : 1,
+               "Min" : 0
+            },
+            {
+               "AVP" : "Route-Record",
+               "Min" : 0
+            },
+            {
+               "AVP" : "Destination-Realm",
+               "Max" : 1,
+               "Min" : 1
+            },
+            {
+               "AVP" : "Proxy-Info",
+               "Min" : 0
+            },
+            {
+               "AVP" : "Destination-Host",
+               "Max" : 1,
+               "Min" : 0
+            },
+            {
+               "AVP" : "Origin-Realm",
+               "Max" : 1,
+               "Min" : 1
+            },
+            {
+               "AVP" : "Subscription-Id",
+               "Min" : 0
+            },
+            {
+               "AVP" : "Policy-Counter-Identifier",
+               "Min" : 0,
+               "Vendor" : 10415
+            },
+            {
+               "AVP" : "SL-Request-Type",
+               "Max" : 1,
+               "Min" : 1,
+               "Vendor" : 10415
+            }
+         ]
+      },
+      {
+         "Command" : "Spending-Limit-Answer",
+         "Content" : [
+            {
+               "AVP" : "Auth-Application-Id",
+               "Max" : 1,
+               "Min" : 1
+            },
+            {
+               "AVP" : "Redirect-Host-Usage",
+               "Max" : 1,
+               "Min" : 0
+            },
+            {
+               "AVP" : "Redirect-Max-Cache-Time",
+               "Max" : 1,
+               "Min" : 0
+            },
+            {
+               "AVP" : "Session-Id",
+               "First" : true,
+               "Max" : 1,
+               "Min" : 1
+            },
+            {
+               "AVP" : "Origin-Host",
+               "Max" : 1,
+               "Min" : 1
+            },
+            {
+               "AVP" : "Result-Code",
+               "Max" : 1,
+               "Min" : 0
+            },
+            {
+               "AVP" : "Origin-State-Id",
+               "Max" : 1,
+               "Min" : 0
+            },
+            {
+               "AVP" : "Failed-AVP",
+               "Min" : 0
+            },
+            {
+               "AVP" : "Error-Message",
+               "Max" : 1,
+               "Min" : 0
+            },
+            {
+               "AVP" : "Proxy-Info",
+               "Min" : 0
+            },
+            {
+               "AVP" : "Redirect-Host",
+               "Min" : 0
+            },
+            {
+               "AVP" : "Error-Reporting-Host",
+               "Max" : 1,
+               "Min" : 0
+            },
+            {
+               "AVP" : "Origin-Realm",
+               "Max" : 1,
+               "Min" : 1
+            },
+            {
+               "AVP" : "Experimental-Result",
+               "Max" : 1,
+               "Min" : 0
+            },
+            {
+               "AVP" : "Policy-Counter-Status-Report",
+               "Min" : 0,
+               "Vendor" : 10415
+            }
+         ]
+      },
+      {
+         "Command" : "Spending-Status-Notification-Request",
+         "Content" : [
+            {
+               "AVP" : "Auth-Application-Id",
+               "Max" : 1,
+               "Min" : 1
+            },
+            {
+               "AVP" : "Session-Id",
+               "First" : true,
+               "Max" : 1,
+               "Min" : 1
+            },
+            {
+               "AVP" : "Origin-Host",
+               "Max" : 1,
+               "Min" : 1
+            },
+            {
+               "AVP" : "Origin-State-Id",
+               "Max" : 1,
+               "Min" : 0
+            },
+            {
+               "AVP" : "Route-Record",
+               "Min" : 0
+            },
+            {
+               "AVP" : "Destination-Realm",
+               "Max" : 1,
+               "Min" : 1
+            },
+            {
+               "AVP" : "Proxy-Info",
+               "Min" : 0
+            },
+            {
+               "AVP" : "Destination-Host",
+               "Max" : 1,
+               "Min" : 0
+            },
+            {
+               "AVP" : "Origin-Realm",
+               "Max" : 1,
+               "Min" : 1
+            },
+            {
+               "AVP" : "Policy-Counter-Status-Report",
+               "Min" : 0,
+               "Vendor" : 10415
+            }
+         ]
+      },
+      {
+         "Command" : "Spending-Status-Notification-Answer",
+         "Content" : [
+            {
+               "AVP" : "Redirect-Host-Usage",
+               "Max" : 1,
+               "Min" : 0
+            },
+            {
+               "AVP" : "Redirect-Max-Cache-Time",
+               "Max" : 1,
+               "Min" : 0
+            },
+            {
+               "AVP" : "Session-Id",
+               "First" : true,
+               "Max" : 1,
+               "Min" : 1
+            },
+            {
+               "AVP" : "Origin-Host",
+               "Max" : 1,
+               "Min" : 1
+            },
+            {
+               "AVP" : "Result-Code",
+               "Max" : 1,
+               "Min" : 0
+            },
+            {
+               "AVP" : "Origin-State-Id",
+               "Max" : 1,
+               "Min" : 0
+            },
+            {
+               "AVP" : "Failed-AVP",
+               "Min" : 0
+            },
+            {
+               "AVP" : "Error-Message",
+               "Max" : 1,
+               "Min" : 0
+            },
+            {
+               "AVP" : "Proxy-Info",
+               "Min" : 0
+            },
+            {
+               "AVP" : "Redirect-Host",
+               "Min" : 0
+            },
+            {
+               "AVP" : "Error-Reporting-Host",
+               "Max" : 1,
+               "Min" : 0
+            },
+            {
+               "AVP" : "Origin-Realm",
+               "Max" : 1,
+               "Min" : 1
+            },
+            {
+               "AVP" : "Experimental-Result",
+               "Max" : 1,
+               "Min" : 0
+            }
+         ]
+      }
+   ],
+   "Commands" : [
+      {
+         "Code" : 8388635,
+         "Flags" : {
+            "Must" : "R",
+            "MustNot" : ""
+         },
+         "Name" : "Spending-Limit-Request"
+      },
+      {
+         "Code" : 8388635,
+         "Flags" : {
+            "Must" : "",
+            "MustNot" : "R"
+         },
+         "Name" : "Spending-Limit-Answer"
+      },
+      {
+         "Code" : 8388636,
+         "Flags" : {
+            "Must" : "R",
+            "MustNot" : ""
+         },
+         "Name" : "Spending-Status-Notification-Request"
+      },
+      {
+         "Code" : 8388636,
+         "Flags" : {
+            "Must" : "",
+            "MustNot" : "R"
+         },
+         "Name" : "Spending-Status-Notification-Answer"
+      }
+   ]
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contrib/dict_json/dictionary_freediameter_base.json	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,1632 @@
+{
+   "AVPRules" : [
+      {
+         "AVP" : "Vendor-Specific-Application-Id",
+         "Content" : [
+            {
+               "AVP" : "Auth-Application-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Acct-Application-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Vendor-Id"
+            }
+         ]
+      },
+      {
+         "AVP" : "Proxy-Info",
+         "Content" : [
+            {
+               "AVP" : "Proxy-State",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Proxy-Host",
+               "Max" : 1
+            }
+         ]
+      }
+   ],
+   "AVPs" : [
+      {
+         "Code" : 1,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "User-Name",
+         "Type" : "UTF8String"
+      },
+      {
+         "Code" : 25,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Class",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 27,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Session-Timeout",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 33,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Proxy-State",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 44,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Acct-Session-Id",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 50,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Acct-Multi-Session-Id",
+         "Type" : "UTF8String"
+      },
+      {
+         "Code" : 55,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Event-Timestamp",
+         "Type" : "Time"
+      },
+      {
+         "Code" : 85,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Acct-Interim-Interval",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 257,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Host-IP-Address",
+         "Type" : "Address"
+      },
+      {
+         "Code" : 258,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Auth-Application-Id",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 259,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Acct-Application-Id",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 260,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Vendor-Specific-Application-Id",
+         "Type" : "Grouped"
+      },
+      {
+         "Code" : 261,
+         "EnumValues" : [
+            {
+               "Code" : 5,
+               "Name" : "ALL_HOST"
+            },
+            {
+               "Code" : 6,
+               "Name" : "ALL_USER"
+            },
+            {
+               "Code" : 2,
+               "Name" : "ALL_REALM"
+            },
+            {
+               "Code" : 0,
+               "Name" : "DONT_CACHE"
+            },
+            {
+               "Code" : 1,
+               "Name" : "ALL_SESSION"
+            },
+            {
+               "Code" : 4,
+               "Name" : "ALL_APPLICATION"
+            },
+            {
+               "Code" : 3,
+               "Name" : "REALM_AND_APPLICATION"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Redirect-Host-Usage",
+         "Type" : "Enumerated"
+      },
+      {
+         "Code" : 262,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Redirect-Max-Cache-Time",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 263,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Session-Id",
+         "Type" : "UTF8String"
+      },
+      {
+         "Code" : 264,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Origin-Host",
+         "Type" : "DiameterIdentity"
+      },
+      {
+         "Code" : 265,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Supported-Vendor-Id",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 266,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Vendor-Id",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 267,
+         "Flags" : {
+            "Must" : "",
+            "MustNot" : "VM"
+         },
+         "Name" : "Firmware-Revision",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 268,
+         "EnumValues" : [
+            {
+               "Code" : 4003,
+               "Name" : "ELECTION_LOST"
+            },
+            {
+               "Code" : 2001,
+               "Name" : "DIAMETER_SUCCESS"
+            },
+            {
+               "Code" : 3004,
+               "Name" : "DIAMETER_TOO_BUSY"
+            },
+            {
+               "Code" : 5005,
+               "Name" : "DIAMETER_MISSING_AVP"
+            },
+            {
+               "Code" : 4002,
+               "Name" : "DIAMETER_OUT_OF_SPACE"
+            },
+            {
+               "Code" : 3010,
+               "Name" : "DIAMETER_UNKNOWN_PEER"
+            },
+            {
+               "Code" : 3005,
+               "Name" : "DIAMETER_LOOP_DETECTED"
+            },
+            {
+               "Code" : 5008,
+               "Name" : "DIAMETER_AVP_NOT_ALLOWED"
+            },
+            {
+               "Code" : 5001,
+               "Name" : "DIAMETER_AVP_UNSUPPORTED"
+            },
+            {
+               "Code" : 2002,
+               "Name" : "DIAMETER_LIMITED_SUCCESS"
+            },
+            {
+               "Code" : 3009,
+               "Name" : "DIAMETER_INVALID_AVP_BITS"
+            },
+            {
+               "Code" : 3008,
+               "Name" : "DIAMETER_INVALID_HDR_BITS"
+            },
+            {
+               "Code" : 1001,
+               "Name" : "DIAMETER_MULTI_ROUND_AUTH"
+            },
+            {
+               "Code" : 3003,
+               "Name" : "DIAMETER_REALM_NOT_SERVED"
+            },
+            {
+               "Code" : 5012,
+               "Name" : "DIAMETER_UNABLE_TO_COMPLY"
+            },
+            {
+               "Code" : 5004,
+               "Name" : "DIAMETER_INVALID_AVP_VALUE"
+            },
+            {
+               "Code" : 3002,
+               "Name" : "DIAMETER_UNABLE_TO_DELIVER"
+            },
+            {
+               "Code" : 5007,
+               "Name" : "DIAMETER_CONTRADICTING_AVPS"
+            },
+            {
+               "Code" : 5014,
+               "Name" : "DIAMETER_INVALID_AVP_LENGTH"
+            },
+            {
+               "Code" : 5017,
+               "Name" : "DIAMETER_NO_COMMON_SECURITY"
+            },
+            {
+               "Code" : 5006,
+               "Name" : "DIAMETER_RESOURCES_EXCEEDED"
+            },
+            {
+               "Code" : 5002,
+               "Name" : "DIAMETER_UNKNOWN_SESSION_ID"
+            },
+            {
+               "Code" : 3001,
+               "Name" : "DIAMETER_COMMAND_UNSUPPORTED"
+            },
+            {
+               "Code" : 3006,
+               "Name" : "DIAMETER_REDIRECT_INDICATION"
+            },
+            {
+               "Code" : 5011,
+               "Name" : "DIAMETER_UNSUPPORTED_VERSION"
+            },
+            {
+               "Code" : 5016,
+               "Name" : "DIAMETER_INVALID_AVP_BIT_COMBO"
+            },
+            {
+               "Code" : 5013,
+               "Name" : "DIAMETER_INVALID_BIT_IN_HEADER"
+            },
+            {
+               "Code" : 5010,
+               "Name" : "DIAMETER_NO_COMMON_APPLICATION"
+            },
+            {
+               "Code" : 5003,
+               "Name" : "DIAMETER_AUTHORIZATION_REJECTED"
+            },
+            {
+               "Code" : 5015,
+               "Name" : "DIAMETER_INVALID_MESSAGE_LENGTH"
+            },
+            {
+               "Code" : 3007,
+               "Name" : "DIAMETER_APPLICATION_UNSUPPORTED"
+            },
+            {
+               "Code" : 4001,
+               "Name" : "DIAMETER_AUTHENTICATION_REJECTED"
+            },
+            {
+               "Code" : 5009,
+               "Name" : "DIAMETER_AVP_OCCURS_TOO_MANY_TIMES"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Result-Code",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 269,
+         "Flags" : {
+            "Must" : "",
+            "MustNot" : "VM"
+         },
+         "Name" : "Product-Name",
+         "Type" : "UTF8String"
+      },
+      {
+         "Code" : 270,
+         "EnumValues" : [
+            {
+               "Code" : 2,
+               "Name" : "STR"
+            },
+            {
+               "Code" : 1,
+               "Name" : "RE_AUTH"
+            },
+            {
+               "Code" : 4,
+               "Name" : "ACCOUNTING"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Session-Binding",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 271,
+         "EnumValues" : [
+            {
+               "Code" : 1,
+               "Name" : "TRY_AGAIN"
+            },
+            {
+               "Code" : 2,
+               "Name" : "ALLOW_SERVICE"
+            },
+            {
+               "Code" : 0,
+               "Name" : "REFUSE_SERVICE"
+            },
+            {
+               "Code" : 3,
+               "Name" : "TRY_AGAIN_ALLOW_SERVICE"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Session-Server-Failover",
+         "Type" : "Enumerated"
+      },
+      {
+         "Code" : 272,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Multi-Round-Time-Out",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 273,
+         "EnumValues" : [
+            {
+               "Code" : 1,
+               "Name" : "BUSY"
+            },
+            {
+               "Code" : 0,
+               "Name" : "REBOOTING"
+            },
+            {
+               "Code" : 2,
+               "Name" : "DO_NOT_WANT_TO_TALK_TO_YOU"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Disconnect-Cause",
+         "Type" : "Enumerated"
+      },
+      {
+         "Code" : 274,
+         "EnumValues" : [
+            {
+               "Code" : 2,
+               "Name" : "AUTHORIZE_ONLY"
+            },
+            {
+               "Code" : 1,
+               "Name" : "AUTHENTICATE_ONLY"
+            },
+            {
+               "Code" : 3,
+               "Name" : "AUTHORIZE_AUTHENTICATE"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Auth-Request-Type",
+         "Type" : "Enumerated"
+      },
+      {
+         "Code" : 276,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Auth-Grace-Period",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 277,
+         "EnumValues" : [
+            {
+               "Code" : 0,
+               "Name" : "STATE_MAINTAINED"
+            },
+            {
+               "Code" : 1,
+               "Name" : "NO_STATE_MAINTAINED"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Auth-Session-State",
+         "Type" : "Enumerated"
+      },
+      {
+         "Code" : 278,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Origin-State-Id",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 279,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Failed-AVP",
+         "Type" : "Grouped"
+      },
+      {
+         "Code" : 280,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Proxy-Host",
+         "Type" : "DiameterIdentity"
+      },
+      {
+         "Code" : 281,
+         "Flags" : {
+            "Must" : "",
+            "MustNot" : "VM"
+         },
+         "Name" : "Error-Message",
+         "Type" : "UTF8String"
+      },
+      {
+         "Code" : 282,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Route-Record",
+         "Type" : "DiameterIdentity"
+      },
+      {
+         "Code" : 283,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Destination-Realm",
+         "Type" : "DiameterIdentity"
+      },
+      {
+         "Code" : 284,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Proxy-Info",
+         "Type" : "Grouped"
+      },
+      {
+         "Code" : 285,
+         "EnumValues" : [
+            {
+               "Code" : 0,
+               "Name" : "AUTHORIZE_ONLY"
+            },
+            {
+               "Code" : 1,
+               "Name" : "AUTHORIZE_AUTHENTICATE"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Re-Auth-Request-Type",
+         "Type" : "Enumerated"
+      },
+      {
+         "Code" : 287,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Accounting-Sub-Session-Id",
+         "Type" : "Unsigned64"
+      },
+      {
+         "Code" : 291,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Authorization-Lifetime",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 292,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Redirect-Host",
+         "Type" : "DiameterURI"
+      },
+      {
+         "Code" : 293,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Destination-Host",
+         "Type" : "DiameterIdentity"
+      },
+      {
+         "Code" : 294,
+         "Flags" : {
+            "Must" : "",
+            "MustNot" : "VM"
+         },
+         "Name" : "Error-Reporting-Host",
+         "Type" : "DiameterIdentity"
+      },
+      {
+         "Code" : 295,
+         "EnumValues" : [
+            {
+               "Code" : 1,
+               "Name" : "DIAMETER_LOGOUT"
+            },
+            {
+               "Code" : 3,
+               "Name" : "DIAMETER_BAD_ANSWER"
+            },
+            {
+               "Code" : 7,
+               "Name" : "DIAMETER_USER_MOVED"
+            },
+            {
+               "Code" : 5,
+               "Name" : "DIAMETER_LINK_BROKEN"
+            },
+            {
+               "Code" : 6,
+               "Name" : "DIAMETER_AUTH_EXPIRED"
+            },
+            {
+               "Code" : 4,
+               "Name" : "DIAMETER_ADMINISTRATIVE"
+            },
+            {
+               "Code" : 8,
+               "Name" : "DIAMETER_SESSION_TIMEOUT"
+            },
+            {
+               "Code" : 2,
+               "Name" : "DIAMETER_SERVICE_NOT_PROVIDED"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Termination-Cause",
+         "Type" : "Enumerated"
+      },
+      {
+         "Code" : 296,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Origin-Realm",
+         "Type" : "DiameterIdentity"
+      },
+      {
+         "Code" : 297,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Experimental-Result",
+         "Type" : "Grouped"
+      },
+      {
+         "Code" : 298,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Experimental-Result-Code",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 299,
+         "EnumValues" : [
+            {
+               "Code" : 1,
+               "Name" : "TLS"
+            },
+            {
+               "Code" : 0,
+               "Name" : "NO_INBAND_SECURITY"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Inband-Security-Id",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 480,
+         "EnumValues" : [
+            {
+               "Code" : 4,
+               "Name" : "STOP_RECORD"
+            },
+            {
+               "Code" : 1,
+               "Name" : "EVENT_RECORD"
+            },
+            {
+               "Code" : 2,
+               "Name" : "START_RECORD"
+            },
+            {
+               "Code" : 3,
+               "Name" : "INTERIM_RECORD"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Accounting-Record-Type",
+         "Type" : "Enumerated"
+      },
+      {
+         "Code" : 483,
+         "EnumValues" : [
+            {
+               "Code" : 3,
+               "Name" : "GRANT_AND_LOSE"
+            },
+            {
+               "Code" : 2,
+               "Name" : "GRANT_AND_STORE"
+            },
+            {
+               "Code" : 1,
+               "Name" : "DELIVER_AND_GRANT"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Accounting-Realtime-Required",
+         "Type" : "Enumerated"
+      },
+      {
+         "Code" : 485,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Accounting-Record-Number",
+         "Type" : "Unsigned32"
+      }
+   ],
+   "Applications" : [
+      {
+         "Code" : 0,
+         "Name" : "Diameter Common Messages"
+      },
+      {
+         "Code" : 3,
+         "Name" : "Diameter Base Accounting"
+      },
+      {
+         "Code" : 4294967295,
+         "Name" : "Relay"
+      }
+   ],
+   "CommandRules" : [
+      {
+         "Command" : "Capabilities-Exchange-Request",
+         "Content" : [
+            {
+               "AVP" : "Host-IP-Address"
+            },
+            {
+               "AVP" : "Auth-Application-Id"
+            },
+            {
+               "AVP" : "Acct-Application-Id"
+            },
+            {
+               "AVP" : "Vendor-Specific-Application-Id"
+            },
+            {
+               "AVP" : "Origin-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Supported-Vendor-Id"
+            },
+            {
+               "AVP" : "Vendor-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Firmware-Revision",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Product-Name",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-State-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Realm",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Inband-Security-Id"
+            }
+         ]
+      },
+      {
+         "Command" : "Capabilities-Exchange-Answer",
+         "Content" : [
+            {
+               "AVP" : "Host-IP-Address"
+            },
+            {
+               "AVP" : "Auth-Application-Id"
+            },
+            {
+               "AVP" : "Acct-Application-Id"
+            },
+            {
+               "AVP" : "Vendor-Specific-Application-Id"
+            },
+            {
+               "AVP" : "Origin-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Supported-Vendor-Id"
+            },
+            {
+               "AVP" : "Vendor-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Firmware-Revision",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Result-Code",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Product-Name",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-State-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Failed-AVP",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Error-Message",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Realm",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Inband-Security-Id"
+            }
+         ]
+      },
+      {
+         "Command" : "Re-Auth-Request",
+         "Content" : [
+            {
+               "AVP" : "User-Name",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Auth-Application-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Session-Id",
+               "First" : true,
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-State-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Route-Record"
+            },
+            {
+               "AVP" : "Destination-Realm",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Proxy-Info"
+            },
+            {
+               "AVP" : "Re-Auth-Request-Type",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Destination-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Realm",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "Command" : "Re-Auth-Answer",
+         "Content" : [
+            {
+               "AVP" : "User-Name",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Redirect-Host-Usage",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Redirect-Max-Cache-Time",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Session-Id",
+               "First" : true,
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Result-Code",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-State-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Failed-AVP",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Error-Message",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Proxy-Info"
+            },
+            {
+               "AVP" : "Redirect-Host"
+            },
+            {
+               "AVP" : "Error-Reporting-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Realm",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "Command" : "Accounting-Request",
+         "Content" : [
+            {
+               "AVP" : "User-Name",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Acct-Session-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Acct-Multi-Session-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Event-Timestamp",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Acct-Interim-Interval",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Acct-Application-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Vendor-Specific-Application-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Session-Id",
+               "First" : true,
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-State-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Route-Record"
+            },
+            {
+               "AVP" : "Destination-Realm",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Proxy-Info"
+            },
+            {
+               "AVP" : "Accounting-Sub-Session-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Destination-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Realm",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Accounting-Record-Type",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Accounting-Realtime-Required",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Accounting-Record-Number",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "Command" : "Accounting-Answer",
+         "Content" : [
+            {
+               "AVP" : "User-Name",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Acct-Session-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Acct-Multi-Session-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Event-Timestamp",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Acct-Interim-Interval",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Acct-Application-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Vendor-Specific-Application-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Session-Id",
+               "First" : true,
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Result-Code",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-State-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Failed-AVP",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Error-Message",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Proxy-Info"
+            },
+            {
+               "AVP" : "Accounting-Sub-Session-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Error-Reporting-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Realm",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Accounting-Record-Type",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Accounting-Realtime-Required",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Accounting-Record-Number",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "Command" : "Abort-Session-Request",
+         "Content" : [
+            {
+               "AVP" : "User-Name",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Auth-Application-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Session-Id",
+               "First" : true,
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-State-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Route-Record"
+            },
+            {
+               "AVP" : "Destination-Realm",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Proxy-Info"
+            },
+            {
+               "AVP" : "Destination-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Realm",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "Command" : "Abort-Session-Answer",
+         "Content" : [
+            {
+               "AVP" : "User-Name",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Redirect-Host-Usage",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Redirect-Max-Cache-Time",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Session-Id",
+               "First" : true,
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Result-Code",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-State-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Failed-AVP",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Error-Message",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Proxy-Info"
+            },
+            {
+               "AVP" : "Redirect-Host"
+            },
+            {
+               "AVP" : "Error-Reporting-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Realm",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "Command" : "Session-Termination-Request",
+         "Content" : [
+            {
+               "AVP" : "User-Name",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Class"
+            },
+            {
+               "AVP" : "Auth-Application-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Session-Id",
+               "First" : true,
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-State-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Route-Record"
+            },
+            {
+               "AVP" : "Destination-Realm",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Proxy-Info"
+            },
+            {
+               "AVP" : "Destination-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Termination-Cause",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Realm",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "Command" : "Session-Termination-Answer",
+         "Content" : [
+            {
+               "AVP" : "User-Name",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Class"
+            },
+            {
+               "AVP" : "Redirect-Host-Usage",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Redirect-Max-Cache-Time",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Session-Id",
+               "First" : true,
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Result-Code",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-State-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Failed-AVP",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Error-Message",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Proxy-Info"
+            },
+            {
+               "AVP" : "Redirect-Host"
+            },
+            {
+               "AVP" : "Error-Reporting-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Realm",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "Command" : "Device-Watchdog-Request",
+         "Content" : [
+            {
+               "AVP" : "Origin-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-State-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Realm",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "Command" : "Device-Watchdog-Answer",
+         "Content" : [
+            {
+               "AVP" : "Origin-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Result-Code",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-State-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Failed-AVP",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Error-Message",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Realm",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "Command" : "Disconnect-Peer-Request",
+         "Content" : [
+            {
+               "AVP" : "Origin-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Disconnect-Cause",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Realm",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "Command" : "Disconnect-Peer-Answer",
+         "Content" : [
+            {
+               "AVP" : "Origin-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Result-Code",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Failed-AVP",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Error-Message",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Realm",
+               "Max" : 1
+            }
+         ]
+      }
+   ],
+   "Commands" : [
+      {
+         "Code" : 257,
+         "Flags" : {
+            "Must" : "R",
+            "MustNot" : "PET"
+         },
+         "Name" : "Capabilities-Exchange-Request"
+      },
+      {
+         "Code" : 257,
+         "Flags" : {
+            "Must" : "",
+            "MustNot" : "RPT"
+         },
+         "Name" : "Capabilities-Exchange-Answer"
+      },
+      {
+         "Code" : 258,
+         "Flags" : {
+            "Must" : "RP",
+            "MustNot" : "E"
+         },
+         "Name" : "Re-Auth-Request"
+      },
+      {
+         "Code" : 258,
+         "Flags" : {
+            "Must" : "P",
+            "MustNot" : "R"
+         },
+         "Name" : "Re-Auth-Answer"
+      },
+      {
+         "Code" : 271,
+         "Flags" : {
+            "Must" : "RP",
+            "MustNot" : "E"
+         },
+         "Name" : "Accounting-Request"
+      },
+      {
+         "Code" : 271,
+         "Flags" : {
+            "Must" : "P",
+            "MustNot" : "R"
+         },
+         "Name" : "Accounting-Answer"
+      },
+      {
+         "Code" : 274,
+         "Flags" : {
+            "Must" : "RP",
+            "MustNot" : "E"
+         },
+         "Name" : "Abort-Session-Request"
+      },
+      {
+         "Code" : 274,
+         "Flags" : {
+            "Must" : "P",
+            "MustNot" : "R"
+         },
+         "Name" : "Abort-Session-Answer"
+      },
+      {
+         "Code" : 275,
+         "Flags" : {
+            "Must" : "RP",
+            "MustNot" : "E"
+         },
+         "Name" : "Session-Termination-Request"
+      },
+      {
+         "Code" : 275,
+         "Flags" : {
+            "Must" : "P",
+            "MustNot" : "R"
+         },
+         "Name" : "Session-Termination-Answer"
+      },
+      {
+         "Code" : 280,
+         "Flags" : {
+            "Must" : "R",
+            "MustNot" : "PET"
+         },
+         "Name" : "Device-Watchdog-Request"
+      },
+      {
+         "Code" : 280,
+         "Flags" : {
+            "Must" : "",
+            "MustNot" : "RPT"
+         },
+         "Name" : "Device-Watchdog-Answer"
+      },
+      {
+         "Code" : 282,
+         "Flags" : {
+            "Must" : "R",
+            "MustNot" : "PET"
+         },
+         "Name" : "Disconnect-Peer-Request"
+      },
+      {
+         "Code" : 282,
+         "Flags" : {
+            "Must" : "",
+            "MustNot" : "RPT"
+         },
+         "Name" : "Disconnect-Peer-Answer"
+      }
+   ],
+   "Types" : [
+      {
+         "Base" : "OctetString",
+         "Name" : "Address"
+      },
+      {
+         "Base" : "OctetString",
+         "Name" : "DiameterIdentity"
+      },
+      {
+         "Base" : "OctetString",
+         "Name" : "DiameterURI"
+      },
+      {
+         "Base" : "OctetString",
+         "Name" : "IPFilterRule"
+      },
+      {
+         "Base" : "OctetString",
+         "Name" : "Time"
+      },
+      {
+         "Base" : "OctetString",
+         "Name" : "UTF8String"
+      }
+   ],
+   "Vendors" : [
+      {
+         "Code" : 0,
+         "Name" : "(no vendor)"
+      }
+   ]
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contrib/dict_json/dictionary_nasreq.json	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,2522 @@
+{
+   "AVPRules" : [
+      {
+         "AVP" : "Tunneling",
+         "Content" : [
+            {
+               "AVP" : "Tunnel-Type",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Tunnel-Medium-Type",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Tunnel-Client-Endpoint",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Tunnel-Server-Endpoint",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Tunnel-Password",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Tunnel-Private-Group-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Tunnel-Assignment-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Tunnel-Preference",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Tunnel-Client-Auth-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Tunnel-Server-Auth-Id",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "AVP" : "CHAP-Auth",
+         "Content" : [
+            {
+               "AVP" : "CHAP-Algorithm",
+               "Max" : 1
+            },
+            {
+               "AVP" : "CHAP-Ident",
+               "Max" : 1
+            },
+            {
+               "AVP" : "CHAP-Response",
+               "Max" : 1
+            }
+         ]
+      }
+   ],
+   "AVPs" : [
+      {
+         "Code" : 2,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "User-Password",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 4,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "NAS-IP-Address",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 5,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "NAS-Port",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 6,
+         "EnumValues" : [
+            {
+               "Code" : 1,
+               "Name" : "Login"
+            },
+            {
+               "Code" : 2,
+               "Name" : "Framed"
+            },
+            {
+               "Code" : 5,
+               "Name" : "Outbound"
+            },
+            {
+               "Code" : 10,
+               "Name" : "Call Check"
+            },
+            {
+               "Code" : 7,
+               "Name" : "NAS Prompt"
+            },
+            {
+               "Code" : 13,
+               "Name" : "Fax [Chiba]"
+            },
+            {
+               "Code" : 12,
+               "Name" : "Voice [Chiba]"
+            },
+            {
+               "Code" : 6,
+               "Name" : "Administrative"
+            },
+            {
+               "Code" : 3,
+               "Name" : "Callback Login"
+            },
+            {
+               "Code" : 4,
+               "Name" : "Callback Framed"
+            },
+            {
+               "Code" : 8,
+               "Name" : "Authenticate Only"
+            },
+            {
+               "Code" : 9,
+               "Name" : "Callback NAS Prompt"
+            },
+            {
+               "Code" : 14,
+               "Name" : "Modem Relay [Chiba]"
+            },
+            {
+               "Code" : 11,
+               "Name" : "Callback Administrative"
+            },
+            {
+               "Code" : 17,
+               "Name" : "Authorize Only [RFC3576]"
+            },
+            {
+               "Code" : 16,
+               "Name" : "IAPP-AP-Check [IEEE 802.11f][Kerry]"
+            },
+            {
+               "Code" : 15,
+               "Name" : "IAPP-Register [IEEE 802.11f][Kerry]"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Service-Type",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 7,
+         "EnumValues" : [
+            {
+               "Code" : 1,
+               "Name" : "PPP"
+            },
+            {
+               "Code" : 2,
+               "Name" : "SLIP"
+            },
+            {
+               "Code" : 6,
+               "Name" : "X.75 Synchronous"
+            },
+            {
+               "Code" : 7,
+               "Name" : "GPRS PDP Context [Moore]"
+            },
+            {
+               "Code" : 5,
+               "Name" : "Xylogics proprietary IPX/SLIP"
+            },
+            {
+               "Code" : 3,
+               "Name" : "AppleTalk Remote Access Protocol (ARAP)"
+            },
+            {
+               "Code" : 4,
+               "Name" : "Gandalf proprietary SingleLink/MultiLink protocol"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Framed-Protocol",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 8,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Framed-IP-Address",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 9,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Framed-IP-Netmask",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 10,
+         "EnumValues" : [
+            {
+               "Code" : 0,
+               "Name" : "None"
+            },
+            {
+               "Code" : 3,
+               "Name" : "Send and Listen"
+            },
+            {
+               "Code" : 1,
+               "Name" : "Send routing packets"
+            },
+            {
+               "Code" : 2,
+               "Name" : "Listen for routing packets"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Framed-Routing",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 11,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Filter-Id",
+         "Type" : "UTF8String"
+      },
+      {
+         "Code" : 12,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Framed-MTU",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 13,
+         "EnumValues" : [
+            {
+               "Code" : 0,
+               "Name" : "None"
+            },
+            {
+               "Code" : 3,
+               "Name" : "Stac-LZS compression"
+            },
+            {
+               "Code" : 2,
+               "Name" : "IPX header compression"
+            },
+            {
+               "Code" : 1,
+               "Name" : "VJ TCP/IP header compression"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Framed-Compression",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 14,
+         "EnumValues" : [
+            {
+               "Code" : "<00000000>",
+               "Name" : "(0) NAS selects the host"
+            },
+            {
+               "Code" : "<ffffffff>",
+               "Name" : "(1) User selects the address"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Login-IP-Host",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 15,
+         "EnumValues" : [
+            {
+               "Code" : 4,
+               "Name" : "LAT"
+            },
+            {
+               "Code" : 1,
+               "Name" : "Rlogin"
+            },
+            {
+               "Code" : 0,
+               "Name" : "Telnet"
+            },
+            {
+               "Code" : 5,
+               "Name" : "X25-PAD"
+            },
+            {
+               "Code" : 2,
+               "Name" : "TCP Clear"
+            },
+            {
+               "Code" : 6,
+               "Name" : "X25-T3POS"
+            },
+            {
+               "Code" : 3,
+               "Name" : "PortMaster (proprietary)"
+            },
+            {
+               "Code" : 8,
+               "Name" : "TCP Clear Quiet (suppresses any NAS-generated connect string)"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Login-Service",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 16,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Login-TCP-Port",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 18,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Reply-Message",
+         "Type" : "UTF8String"
+      },
+      {
+         "Code" : 19,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Callback-Number",
+         "Type" : "UTF8String"
+      },
+      {
+         "Code" : 20,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Callback-Id",
+         "Type" : "UTF8String"
+      },
+      {
+         "Code" : 22,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Framed-Route",
+         "Type" : "UTF8String"
+      },
+      {
+         "Code" : 23,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Framed-IPX-Network",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 24,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "State",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 28,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Idle-Timeout",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 30,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Called-Station-Id",
+         "Type" : "UTF8String"
+      },
+      {
+         "Code" : 31,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Calling-Station-Id",
+         "Type" : "UTF8String"
+      },
+      {
+         "Code" : 32,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "NAS-Identifier",
+         "Type" : "UTF8String"
+      },
+      {
+         "Code" : 34,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Login-LAT-Service",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 35,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Login-LAT-Node",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 36,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Login-LAT-Group",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 37,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Framed-AppleTalk-Link",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 38,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Framed-AppleTalk-Network",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 39,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Framed-AppleTalk-Zone",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 41,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Acct-Delay-Time",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 45,
+         "EnumValues" : [
+            {
+               "Code" : 2,
+               "Name" : "Local"
+            },
+            {
+               "Code" : 1,
+               "Name" : "RADIUS"
+            },
+            {
+               "Code" : 3,
+               "Name" : "Remote"
+            },
+            {
+               "Code" : 4,
+               "Name" : "Diameter"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Acct-Authentic",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 46,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Acct-Session-Time",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 51,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Acct-Link-Count",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 60,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "CHAP-Challenge",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 61,
+         "EnumValues" : [
+            {
+               "Code" : 21,
+               "Name" : "FDDI [RFC3580]"
+            },
+            {
+               "Code" : 1,
+               "Name" : "Sync [RFC2865]"
+            },
+            {
+               "Code" : 8,
+               "Name" : "X.25 [RFC2865]"
+            },
+            {
+               "Code" : 9,
+               "Name" : "X.75 [RFC2865]"
+            },
+            {
+               "Code" : 0,
+               "Name" : "Async [RFC2865]"
+            },
+            {
+               "Code" : 17,
+               "Name" : "Cable [RFC2865]"
+            },
+            {
+               "Code" : 6,
+               "Name" : "PIAFS [RFC2865]"
+            },
+            {
+               "Code" : 10,
+               "Name" : "G.3 Fax [RFC2865]"
+            },
+            {
+               "Code" : 5,
+               "Name" : "Virtual [RFC2865]"
+            },
+            {
+               "Code" : 15,
+               "Name" : "Ethernet [RFC2865]"
+            },
+            {
+               "Code" : 2,
+               "Name" : "ISDN Sync [RFC2865]"
+            },
+            {
+               "Code" : 20,
+               "Name" : "Token-Ring [RFC3580]"
+            },
+            {
+               "Code" : 23,
+               "Name" : "Wireless - UMTS [McCann]"
+            },
+            {
+               "Code" : 24,
+               "Name" : "Wireless - 1X-EV [McCann]"
+            },
+            {
+               "Code" : 25,
+               "Name" : "IAPP [IEEE 802.11F][Kerry]"
+            },
+            {
+               "Code" : 4,
+               "Name" : "ISDN Async V.110 [RFC2865]"
+            },
+            {
+               "Code" : 3,
+               "Name" : "ISDN Async V.120 [RFC2865]"
+            },
+            {
+               "Code" : 18,
+               "Name" : "Wireless - Other [RFC2865]"
+            },
+            {
+               "Code" : 7,
+               "Name" : "HDLC Clear Channel [RFC2865]"
+            },
+            {
+               "Code" : 22,
+               "Name" : "Wireless - CDMA2000 [McCann]"
+            },
+            {
+               "Code" : 30,
+               "Name" : "PPPoA - PPP over ATM [RFC4603]"
+            },
+            {
+               "Code" : 11,
+               "Name" : "SDSL - Symmetric DSL [RFC2865]"
+            },
+            {
+               "Code" : 19,
+               "Name" : "Wireless - IEEE 802.11 [RFC2865]"
+            },
+            {
+               "Code" : 26,
+               "Name" : "FTTP - Fiber to the Premises [Nyce]"
+            },
+            {
+               "Code" : 27,
+               "Name" : "Wireless - IEEE 802.16 [IEEE 802.16]"
+            },
+            {
+               "Code" : 28,
+               "Name" : "Wireless - IEEE 802.20 [IEEE 802.20]"
+            },
+            {
+               "Code" : 29,
+               "Name" : "Wireless - IEEE 802.22 [IEEE 802.22]"
+            },
+            {
+               "Code" : 35,
+               "Name" : "xPON - Passive Optical Network [Hublet][Yan]"
+            },
+            {
+               "Code" : 14,
+               "Name" : "IDSL - ISDN Digital Subscriber Line [RFC2865]"
+            },
+            {
+               "Code" : 31,
+               "Name" : "PPPoEoA - PPP over Ethernet over ATM [RFC4603]"
+            },
+            {
+               "Code" : 33,
+               "Name" : "PPPoEoVLAN - PPP over Ethernet over VLAN [RFC4603]"
+            },
+            {
+               "Code" : 32,
+               "Name" : "PPPoEoE - PPP over Ethernet over Ethernet [RFC4603]"
+            },
+            {
+               "Code" : 13,
+               "Name" : "ADSL-DMT - Asymmetric DSL, Discrete Multi-Tone [RFC2865]"
+            },
+            {
+               "Code" : 16,
+               "Name" : "xDSL - Digital Subscriber Line of unknown type [RFC2865]"
+            },
+            {
+               "Code" : 34,
+               "Name" : "PPPoEoQinQ - PPP over Ethernet over IEEE 802.1QinQ [RFC4603]"
+            },
+            {
+               "Code" : 12,
+               "Name" : "ADSL-CAP - Asymmetric DSL, Carrierless Amplitude Phase Modulation [RFC2865]"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "NAS-Port-Type",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 62,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Port-Limit",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 63,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Login-LAT-Port",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 64,
+         "EnumValues" : [
+            {
+               "Code" : 12,
+               "Name" : "IP-in-IP Tunneling [RFC2868]"
+            },
+            {
+               "Code" : 13,
+               "Name" : "Virtual LANs (VLAN) [RFC3580]"
+            },
+            {
+               "Code" : 2,
+               "Name" : "Layer Two Forwarding (L2F) [RFC2868]"
+            },
+            {
+               "Code" : 7,
+               "Name" : "IP-in-IP Encapsulation (IP-IP) [RFC2868]"
+            },
+            {
+               "Code" : 11,
+               "Name" : "Bay Dial Virtual Services (DVS) [RFC2868]"
+            },
+            {
+               "Code" : 5,
+               "Name" : "Virtual Tunneling Protocol (VTP) [RFC2868]"
+            },
+            {
+               "Code" : 10,
+               "Name" : "Generic Route Encapsulation (GRE) [RFC2868]"
+            },
+            {
+               "Code" : 3,
+               "Name" : "Layer Two Tunneling Protocol (L2TP) [RFC2868]"
+            },
+            {
+               "Code" : 4,
+               "Name" : "Ascend Tunnel Management Protocol (ATMP) [RFC2868]"
+            },
+            {
+               "Code" : 1,
+               "Name" : "Point-to-Point Tunneling Protocol (PPTP) [RFC2868]"
+            },
+            {
+               "Code" : 8,
+               "Name" : "Minimal IP-in-IP Encapsulation (MIN-IP-IP) [RFC2868]"
+            },
+            {
+               "Code" : 6,
+               "Name" : "IP Authentication Header in the Tunnel-mode (AH) [RFC2868]"
+            },
+            {
+               "Code" : 9,
+               "Name" : "IP Encapsulating Security Payload in the Tunnel-mode (ESP) [RFC2868]"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Tunnel-Type",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 65,
+         "EnumValues" : [
+            {
+               "Code" : 11,
+               "Name" : "IPX [RFC2868]"
+            },
+            {
+               "Code" : 3,
+               "Name" : "NSAP [RFC2868]"
+            },
+            {
+               "Code" : 5,
+               "Name" : "BBN 1822 [RFC2868]"
+            },
+            {
+               "Code" : 12,
+               "Name" : "Appletalk [RFC2868]"
+            },
+            {
+               "Code" : 13,
+               "Name" : "Decnet IV [RFC2868]"
+            },
+            {
+               "Code" : 14,
+               "Name" : "Banyan Vines [RFC2868]"
+            },
+            {
+               "Code" : 7,
+               "Name" : "E.163 (POTS) [RFC2868]"
+            },
+            {
+               "Code" : 9,
+               "Name" : "F.69 (Telex) [RFC2868]"
+            },
+            {
+               "Code" : 1,
+               "Name" : "IPv4 (IP version 4) [RFC2868]"
+            },
+            {
+               "Code" : 2,
+               "Name" : "IPv6 (IP version 6) [RFC2868]"
+            },
+            {
+               "Code" : 4,
+               "Name" : "HDLC (8-bit multidrop) [RFC2868]"
+            },
+            {
+               "Code" : 10,
+               "Name" : "X.121 (X.25, Frame Relay) [RFC2868]"
+            },
+            {
+               "Code" : 8,
+               "Name" : "E.164 (SMDS, Frame Relay, ATM) [RFC2868]"
+            },
+            {
+               "Code" : 15,
+               "Name" : "E.164 with NSAP format subaddress [RFC2868]"
+            },
+            {
+               "Code" : 6,
+               "Name" : "802 (includes all 802 media plus Ethernet \"canonical format\") [RFC2868]"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Tunnel-Medium-Type",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 66,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Tunnel-Client-Endpoint",
+         "Type" : "UTF8String"
+      },
+      {
+         "Code" : 67,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Tunnel-Server-Endpoint",
+         "Type" : "UTF8String"
+      },
+      {
+         "Code" : 68,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Acct-Tunnel-Connection",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 69,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Tunnel-Password",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 70,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "ARAP-Password",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 71,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "ARAP-Features",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 72,
+         "EnumValues" : [
+            {
+               "Code" : 3,
+               "Name" : "Not used [RFC2869]"
+            },
+            {
+               "Code" : 4,
+               "Name" : "Use zone filter exclusively [RFC2869]"
+            },
+            {
+               "Code" : 2,
+               "Name" : "Use zone filter inclusively [RFC2869]"
+            },
+            {
+               "Code" : 1,
+               "Name" : "Only allow access to default zone [RFC2869]"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "ARAP-Zone-Access",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 73,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "ARAP-Security",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 74,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "ARAP-Security-Data",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 75,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Password-Retry",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 76,
+         "EnumValues" : [
+            {
+               "Code" : 1,
+               "Name" : "Echo [RFC2869]"
+            },
+            {
+               "Code" : 0,
+               "Name" : "No Echo [RFC2869]"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Prompt",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 77,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Connect-Info",
+         "Type" : "UTF8String"
+      },
+      {
+         "Code" : 78,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Configuration-Token",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 81,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Tunnel-Private-Group-Id",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 82,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Tunnel-Assignment-Id",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 83,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Tunnel-Preference",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 84,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "ARAP-Challenge-Response",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 86,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Acct-Tunnel-Packets-Lost",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 87,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "NAS-Port-Id",
+         "Type" : "UTF8String"
+      },
+      {
+         "Code" : 88,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Framed-Pool",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 90,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Tunnel-Client-Auth-Id",
+         "Type" : "UTF8String"
+      },
+      {
+         "Code" : 91,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Tunnel-Server-Auth-Id",
+         "Type" : "UTF8String"
+      },
+      {
+         "Code" : 94,
+         "EnumValues" : [
+            {
+               "Code" : "02",
+               "Name" : "ANI Failure"
+            },
+            {
+               "Code" : "66",
+               "Name" : "TRS (Hotel)"
+            },
+            {
+               "Code" : "23",
+               "Name" : "Coin or Non-Coin"
+            },
+            {
+               "Code" : "67",
+               "Name" : "TRS (Restricted)"
+            },
+            {
+               "Code" : "30",
+               "Name" : "Intercept (Blank)"
+            },
+            {
+               "Code" : "32",
+               "Name" : "Intercept (Regular)"
+            },
+            {
+               "Code" : "31",
+               "Name" : "Intercept (Trouble)"
+            },
+            {
+               "Code" : "06",
+               "Name" : "Station Level Rating"
+            },
+            {
+               "Code" : "29",
+               "Name" : "Prison/Inmate Service"
+            },
+            {
+               "Code" : "34",
+               "Name" : "Telco Operator Handled Call"
+            },
+            {
+               "Code" : "70",
+               "Name" : "Pay Station, No Coin Control"
+            },
+            {
+               "Code" : "01",
+               "Name" : "Multiparty Line (more than 2)"
+            },
+            {
+               "Code" : "61",
+               "Name" : "Cellular/Wireless PCS (Type 1)"
+            },
+            {
+               "Code" : "62",
+               "Name" : "Cellular/Wireless PCS (Type 2)"
+            },
+            {
+               "Code" : "63",
+               "Name" : "Cellular/Wireless PCS (Roaming)"
+            },
+            {
+               "Code" : "00",
+               "Name" : "Plain Old Telephone Service (POTS)"
+            },
+            {
+               "Code" : "07",
+               "Name" : "Special Operator Handling Required"
+            },
+            {
+               "Code" : "25",
+               "Name" : "Toll Free Service (Pay Origination)"
+            },
+            {
+               "Code" : "24",
+               "Name" : "Toll Free Service (Non-Pay Origination)"
+            },
+            {
+               "Code" : "93",
+               "Name" : "Access for Private Virtual Network Service"
+            },
+            {
+               "Code" : "20",
+               "Name" : "Automatic Identified Outward Dialing (AIOD)"
+            },
+            {
+               "Code" : "27",
+               "Name" : "Toll Free Service (Coin Control Origination)"
+            },
+            {
+               "Code" : "60",
+               "Name" : "Telecommunications Relay Service (TRS)(Unrestricted)"
+            },
+            {
+               "Code" : "52",
+               "Name" : "Outward Wide Area Telecommunications Service (OUTWATS)"
+            }
+         ],
+         "Flags" : {
+            "Must" : "",
+            "MustNot" : "V"
+         },
+         "Name" : "Originating-Line-Info",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 95,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "NAS-IPv6-Address",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 96,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Framed-Interface-Id",
+         "Type" : "Unsigned64"
+      },
+      {
+         "Code" : 97,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Framed-IPv6-Prefix",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 98,
+         "EnumValues" : [
+            {
+               "Code" : "<00000000000000000000000000000000>",
+               "Name" : "(0) NAS selects the host"
+            },
+            {
+               "Code" : "<ffffffffffffffffffffffffffffffff>",
+               "Name" : "(1) User selects the address"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Login-IPv6-Host",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 99,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Framed-IPv6-Route",
+         "Type" : "UTF8String"
+      },
+      {
+         "Code" : 100,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Framed-IPv6-Pool",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 295,
+         "EnumValues" : [
+            {
+               "Code" : 26,
+               "Name" : "[RADIUS] Callback"
+            },
+            {
+               "Code" : 19,
+               "Name" : "[RADIUS] NAS Error"
+            },
+            {
+               "Code" : 21,
+               "Name" : "[RADIUS] NAS Reboot"
+            },
+            {
+               "Code" : 18,
+               "Name" : "[RADIUS] Port Error"
+            },
+            {
+               "Code" : 27,
+               "Name" : "[RADIUS] User Error"
+            },
+            {
+               "Code" : 16,
+               "Name" : "[RADIUS] Admin Reset"
+            },
+            {
+               "Code" : 20,
+               "Name" : "[RADIUS] NAS Request"
+            },
+            {
+               "Code" : 31,
+               "Name" : "[RADIUS] Port Reinit"
+            },
+            {
+               "Code" : 17,
+               "Name" : "[RADIUS] Admin Reboot"
+            },
+            {
+               "Code" : 28,
+               "Name" : "[RADIUS] Host Request"
+            },
+            {
+               "Code" : 14,
+               "Name" : "[RADIUS] Idle Timeout"
+            },
+            {
+               "Code" : 12,
+               "Name" : "[RADIUS] Lost Carrier"
+            },
+            {
+               "Code" : 13,
+               "Name" : "[RADIUS] Lost Service"
+            },
+            {
+               "Code" : 11,
+               "Name" : "[RADIUS] User Request"
+            },
+            {
+               "Code" : 32,
+               "Name" : "[RADIUS] Port Disabled"
+            },
+            {
+               "Code" : 22,
+               "Name" : "[RADIUS] Port Unneeded"
+            },
+            {
+               "Code" : 23,
+               "Name" : "[RADIUS] Port Preempted"
+            },
+            {
+               "Code" : 24,
+               "Name" : "[RADIUS] Port Suspended"
+            },
+            {
+               "Code" : 15,
+               "Name" : "[RADIUS] Session Timeout"
+            },
+            {
+               "Code" : 29,
+               "Name" : "[RADIUS] Supplicant Restart"
+            },
+            {
+               "Code" : 25,
+               "Name" : "[RADIUS] Service Unavailable"
+            },
+            {
+               "Code" : 30,
+               "Name" : "[RADIUS] Reauthentication Failure"
+            }
+         ],
+         "Name" : "Termination-Cause",
+         "Type" : "Enumerated"
+      },
+      {
+         "Code" : 363,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Accounting-Input-Octets",
+         "Type" : "Unsigned64"
+      },
+      {
+         "Code" : 364,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Accounting-Output-Octets",
+         "Type" : "Unsigned64"
+      },
+      {
+         "Code" : 365,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Accounting-Input-Packets",
+         "Type" : "Unsigned64"
+      },
+      {
+         "Code" : 366,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Accounting-Output-Packets",
+         "Type" : "Unsigned64"
+      },
+      {
+         "Code" : 400,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "NAS-Filter-Rule",
+         "Type" : "IPFilterRule"
+      },
+      {
+         "Code" : 401,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Tunneling",
+         "Type" : "Grouped"
+      },
+      {
+         "Code" : 402,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "CHAP-Auth",
+         "Type" : "Grouped"
+      },
+      {
+         "Code" : 403,
+         "EnumValues" : [
+            {
+               "Code" : 5,
+               "Name" : "CHAP with MD5"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "CHAP-Algorithm",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 404,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "CHAP-Ident",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 405,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "CHAP-Response",
+         "Type" : "OctetString"
+      },
+      {
+         "Code" : 406,
+         "EnumValues" : [
+            {
+               "Code" : 5,
+               "Name" : "EAP"
+            },
+            {
+               "Code" : 1,
+               "Name" : "PAP"
+            },
+            {
+               "Code" : 2,
+               "Name" : "CHAP"
+            },
+            {
+               "Code" : 7,
+               "Name" : "None"
+            },
+            {
+               "Code" : 3,
+               "Name" : "MS-CHAP-1"
+            },
+            {
+               "Code" : 4,
+               "Name" : "MS-CHAP-2"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Accounting-Auth-Method",
+         "Type" : "Unsigned32"
+      },
+      {
+         "Code" : 407,
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "QoS-Filter-Rule",
+         "Type" : "QoSFilterRule"
+      },
+      {
+         "Code" : 408,
+         "EnumValues" : [
+            {
+               "Code" : 1,
+               "Name" : "RADIUS"
+            }
+         ],
+         "Flags" : {
+            "Must" : "M",
+            "MustNot" : "V"
+         },
+         "Name" : "Origin-AAA-Protocol",
+         "Type" : "Unsigned32"
+      }
+   ],
+   "Applications" : [
+      {
+         "Code" : 1,
+         "Name" : "Diameter Network Access Server Application"
+      }
+   ],
+   "CommandRules" : [
+      {
+         "Command" : "Re-Auth-Request",
+         "Content" : [
+            {
+               "AVP" : "NAS-IP-Address",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-Port",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Service-Type",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-IP-Address",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Reply-Message"
+            },
+            {
+               "AVP" : "State",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Class"
+            },
+            {
+               "AVP" : "Called-Station-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Calling-Station-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-Identifier",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Acct-Session-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Acct-Multi-Session-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-Port-Type",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-Port-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Originating-Line-Info",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-IPv6-Address",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-Interface-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-IPv6-Prefix",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-AAA-Protocol",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "Command" : "Re-Auth-Answer",
+         "Content" : [
+            {
+               "AVP" : "Service-Type",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Reply-Message"
+            },
+            {
+               "AVP" : "State",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Class"
+            },
+            {
+               "AVP" : "Idle-Timeout",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Prompt",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Configuration-Token"
+            },
+            {
+               "AVP" : "Auth-Grace-Period",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Re-Auth-Request-Type",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Authorization-Lifetime",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-AAA-Protocol",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "Command" : "AA-Request",
+         "Content" : [
+            {
+               "AVP" : "User-Name",
+               "Max" : 1
+            },
+            {
+               "AVP" : "User-Password",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-IP-Address",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-Port",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Service-Type",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-Protocol",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-IP-Address",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-IP-Netmask",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-MTU",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-Compression"
+            },
+            {
+               "AVP" : "Login-IP-Host"
+            },
+            {
+               "AVP" : "Callback-Number",
+               "Max" : 1
+            },
+            {
+               "AVP" : "State",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Called-Station-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Calling-Station-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-Identifier",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Login-LAT-Service",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Login-LAT-Node",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Login-LAT-Group",
+               "Max" : 1
+            },
+            {
+               "AVP" : "CHAP-Challenge",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-Port-Type",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Port-Limit",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Login-LAT-Port",
+               "Max" : 1
+            },
+            {
+               "AVP" : "ARAP-Password",
+               "Max" : 1
+            },
+            {
+               "AVP" : "ARAP-Security",
+               "Max" : 1
+            },
+            {
+               "AVP" : "ARAP-Security-Data"
+            },
+            {
+               "AVP" : "Connect-Info",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-Port-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Originating-Line-Info",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-IPv6-Address",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-Interface-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-IPv6-Prefix"
+            },
+            {
+               "AVP" : "Login-IPv6-Host"
+            },
+            {
+               "AVP" : "Auth-Application-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Session-Id",
+               "First" : true,
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Auth-Request-Type",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Auth-Grace-Period",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Auth-Session-State",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-State-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Route-Record"
+            },
+            {
+               "AVP" : "Destination-Realm",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Proxy-Info"
+            },
+            {
+               "AVP" : "Authorization-Lifetime",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Destination-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Realm",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Tunneling"
+            },
+            {
+               "AVP" : "CHAP-Auth",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-AAA-Protocol",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "Command" : "AA-Answer",
+         "Content" : [
+            {
+               "AVP" : "User-Name",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Service-Type",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-Protocol",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-IP-Address",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-IP-Netmask"
+            },
+            {
+               "AVP" : "Framed-Routing",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Filter-Id"
+            },
+            {
+               "AVP" : "Framed-MTU",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-Compression"
+            },
+            {
+               "AVP" : "Login-IP-Host"
+            },
+            {
+               "AVP" : "Login-Service",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Login-TCP-Port",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Reply-Message"
+            },
+            {
+               "AVP" : "Callback-Number",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Callback-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-Route"
+            },
+            {
+               "AVP" : "Framed-IPX-Network",
+               "Max" : 1
+            },
+            {
+               "AVP" : "State",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Class"
+            },
+            {
+               "AVP" : "Session-Timeout",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Idle-Timeout",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Login-LAT-Service",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Login-LAT-Node",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Login-LAT-Group",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-AppleTalk-Link",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-AppleTalk-Network"
+            },
+            {
+               "AVP" : "Framed-AppleTalk-Zone",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Port-Limit",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Login-LAT-Port",
+               "Max" : 1
+            },
+            {
+               "AVP" : "ARAP-Features",
+               "Max" : 1
+            },
+            {
+               "AVP" : "ARAP-Zone-Access",
+               "Max" : 1
+            },
+            {
+               "AVP" : "ARAP-Security",
+               "Max" : 1
+            },
+            {
+               "AVP" : "ARAP-Security-Data"
+            },
+            {
+               "AVP" : "Password-Retry",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Prompt",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Configuration-Token"
+            },
+            {
+               "AVP" : "ARAP-Challenge-Response",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Acct-Interim-Interval",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-Pool",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-Interface-Id"
+            },
+            {
+               "AVP" : "Framed-IPv6-Prefix"
+            },
+            {
+               "AVP" : "Login-IPv6-Host"
+            },
+            {
+               "AVP" : "Framed-IPv6-Route"
+            },
+            {
+               "AVP" : "Framed-IPv6-Pool",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Auth-Application-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Redirect-Host-Usage",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Redirect-Max-Cache-Time",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Session-Id",
+               "First" : true,
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Result-Code",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Multi-Round-Time-Out",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Auth-Request-Type",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Auth-Grace-Period",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Auth-Session-State",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-State-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Failed-AVP"
+            },
+            {
+               "AVP" : "Error-Message",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Proxy-Info"
+            },
+            {
+               "AVP" : "Re-Auth-Request-Type",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Authorization-Lifetime",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Redirect-Host"
+            },
+            {
+               "AVP" : "Error-Reporting-Host",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-Realm",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-Filter-Rule"
+            },
+            {
+               "AVP" : "Tunneling"
+            },
+            {
+               "AVP" : "QoS-Filter-Rule"
+            },
+            {
+               "AVP" : "Origin-AAA-Protocol",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "Command" : "Accounting-Request",
+         "Content" : [
+            {
+               "AVP" : "NAS-IP-Address",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-Port",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Service-Type",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-Protocol",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-IP-Address",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-IP-Netmask",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-Routing",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Filter-Id"
+            },
+            {
+               "AVP" : "Framed-MTU",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-Compression",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Login-IP-Host"
+            },
+            {
+               "AVP" : "Login-Service",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Login-TCP-Port",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Callback-Number",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Callback-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-Route"
+            },
+            {
+               "AVP" : "Framed-IPX-Network",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Class"
+            },
+            {
+               "AVP" : "Session-Timeout",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Idle-Timeout",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Called-Station-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Calling-Station-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-Identifier",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Login-LAT-Service",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Login-LAT-Node",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Login-LAT-Group",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-AppleTalk-Link",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-AppleTalk-Network",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-AppleTalk-Zone",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Acct-Delay-Time",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Acct-Authentic",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Acct-Session-Time",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Acct-Link-Count",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-Port-Type",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Port-Limit",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Login-LAT-Port",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Acct-Tunnel-Connection",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Connect-Info"
+            },
+            {
+               "AVP" : "Acct-Tunnel-Packets-Lost",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-Port-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-Pool",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Originating-Line-Info",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-IPv6-Address",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-Interface-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-IPv6-Prefix"
+            },
+            {
+               "AVP" : "Login-IPv6-Host"
+            },
+            {
+               "AVP" : "Framed-IPv6-Route"
+            },
+            {
+               "AVP" : "Framed-IPv6-Pool",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Authorization-Lifetime",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Termination-Cause",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Accounting-Input-Octets",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Accounting-Output-Octets",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Accounting-Input-Packets",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Accounting-Output-Packets",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-Filter-Rule"
+            },
+            {
+               "AVP" : "Tunneling"
+            },
+            {
+               "AVP" : "Accounting-Auth-Method",
+               "Max" : 1
+            },
+            {
+               "AVP" : "QoS-Filter-Rule"
+            },
+            {
+               "AVP" : "Origin-AAA-Protocol",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "Command" : "Accounting-Answer",
+         "Content" : [
+            {
+               "AVP" : "NAS-IP-Address",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-Port",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Service-Type",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-Identifier",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-Port-Type",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-Port-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-IPv6-Address",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Termination-Cause",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-AAA-Protocol",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "Command" : "Abort-Session-Request",
+         "Content" : [
+            {
+               "AVP" : "NAS-IP-Address",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-Port",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Service-Type",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-IP-Address",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Reply-Message"
+            },
+            {
+               "AVP" : "State",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Class"
+            },
+            {
+               "AVP" : "Called-Station-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Calling-Station-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-Identifier",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Acct-Session-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Acct-Multi-Session-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-Port-Type",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-Port-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Originating-Line-Info",
+               "Max" : 1
+            },
+            {
+               "AVP" : "NAS-IPv6-Address",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-Interface-Id",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Framed-IPv6-Prefix",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-AAA-Protocol",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "Command" : "Abort-Session-Answer",
+         "Content" : [
+            {
+               "AVP" : "State",
+               "Max" : 1
+            },
+            {
+               "AVP" : "Origin-AAA-Protocol",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "Command" : "Session-Termination-Request",
+         "Content" : [
+            {
+               "AVP" : "Origin-AAA-Protocol",
+               "Max" : 1
+            }
+         ]
+      },
+      {
+         "Command" : "Session-Termination-Answer",
+         "Content" : [
+            {
+               "AVP" : "Origin-AAA-Protocol",
+               "Max" : 1
+            }
+         ]
+      }
+   ],
+   "Commands" : [
+      {
+         "Code" : 265,
+         "Flags" : {
+            "Must" : "RP",
+            "MustNot" : "E"
+         },
+         "Name" : "AA-Request"
+      },
+      {
+         "Code" : 265,
+         "Flags" : {
+            "Must" : "P",
+            "MustNot" : "R"
+         },
+         "Name" : "AA-Answer"
+      }
+   ],
+   "Types" : [
+      {
+         "Base" : "OctetString",
+         "Name" : "QoSFilterRule"
+      }
+   ]
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/dbg_loglevel.conf.sample	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,13 @@
+# This file contains information for configuring the dbg_loglevel extension.
+#
+# The dbg_loglevel extension allows changing the logging level at startup,
+# and then changing it at runtime.
+#
+# This extension supports configuration reload at runtime. Send
+# signal SIGUSR1 to the process to cause the process to reload its
+# config.
+#
+# 3 is the default log level (FD_LOG_NOTICE)
+# smaller values increase the logging
+# bigger values reduce the logging
+LogLevel=3;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/dict_json.json.sample	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,17 @@
+# Configuration for the JSON dictionary extension (no config file needed)
+#
+# This extension allows configuration of diameter dictionaries
+# in JSON format.
+#
+# To load the JSON dictionaries, list their paths, separated with a semicolon (';')
+# as argument when loading the extension in the freeDiameter config file, i.e.:
+#
+# LoadExtension = "dict_json.so":"/path/to/dictionary.json;/path/to/another/dictionary_2.json";
+#
+# Relative paths work but are hard to get right because they are
+# relative to where you started the freeDiameter daemon.
+#
+# The dictionaries must conform to the JSON schema in
+# extensions/dict_json/dict_json_dict_schema.json
+#
+# Example dictionaries are in contrib/dict_json.
--- a/doc/rt_default.conf.sample	Sun Jan 21 22:25:07 2018 +0800
+++ b/doc/rt_default.conf.sample	Sun May 12 23:15:40 2019 +0800
@@ -2,6 +2,10 @@
 #
 # This extension provides configurable routing properties for freeDiameter.
 
+# This extension supports configuration reload at runtime. Send
+# signal SIGUSR1 to the process to cause the process to reload its
+# config.
+
 # Lines starting with a # are comments and ignored.
 
 ##############################################################################
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/rt_deny_by_size.conf.sample	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,11 @@
+# This file contains information for configuring the rt_deny_by_size extension.
+#
+# The rt_deny_by_size extension returns errors for messages above a particular size.
+#
+# This extension supports configuration reload at runtime. Send
+# signal SIGUSR1 to the process to cause the process to reload its
+# config.
+#
+# Configure the maximum allowed message size to still pass through;
+# defaults to 4096, if config file is empty
+#MaximumSize=4096;
--- a/doc/rt_ereg.conf.sample	Sun Jan 21 22:25:07 2018 +0800
+++ b/doc/rt_ereg.conf.sample	Sun May 12 23:15:40 2019 +0800
@@ -3,9 +3,15 @@
 #
 # The rt_ereg extension allows creation of routing rules based on AVP value matching regular expressions.
 
+# This extension supports configuration reload at runtime. Send
+# signal SIGUSR1 to the process to cause the process to reload its
+# config.
+
 # First, one must indicate which AVP should be used for matching. 
 # At the moment, only AVP with OCTETSTRING types are valid.
 #  AVP = "User-Name";
+# It is possible to specify AVPs below GROUPED AVPs with the by separating AVPs with a colon (':'):
+#  AVP = "Grouped-AVP1" : "Grouped-AVP2" : "Octetstring-AVP";
 # This parameter is mandatory. There is no default value.
 
 # Then a list of rules follow. A rule has this format:
@@ -19,3 +25,7 @@
 #    means that if the AVP value is only numeric, the ServerA will have its score decreased by 3 points.
 #    (reminder: the server with the peer with the highest score gets the message)
 # Note that all rules are tested for each message that contain the AVP, not only the first match.
+
+# There can be multiple blocks of AVPs and rules; just start the next one with another AVP line:
+#  AVP = "Other-AVP";
+# and continue with rules as above.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/rt_rewrite.conf.sample	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,23 @@
+# This file contains information for configuring the rt_rewrite extension
+# To find how to have freeDiameter load this extension, please refer to the freeDiameter documentation.
+#
+# The rt_rewrite extension allows moving data from one AVP into another one, or dropping AVPs altogether.
+
+# This extension supports configuration reload at runtime. Send
+# signal SIGUSR1 to the process to cause the process to reload its
+# config.
+
+# The config consists of MAP for AVP pairs of source/target, or DROP for a source.
+#
+#  MAP = "Source-AVP" > "Destination-AVP";
+#
+# It is possible to specify AVPs below GROUPED AVPs with the by separating AVPs with a colon (':'):
+#  MAP = "Grouped-AVP1" : "Octetstring-AVP1" > "Grouped-AVP2" : "Grouped-AVP3" : "Octetstring-AVP2";
+# Intermediate destination grouped AVPs will be created automatically.
+#
+# NOTE: you can not move grouped AVPs as a unit, you have to move each separate AVP.
+# i.e., this will not work:
+#  MAP = "Grouped-AVP1" > "Grouped-AVP2";
+#
+# For removing AVPs, use DROP:
+#  DROP = "Grouped-AVP1" : "Octetstring-AVP1";
--- a/extensions/CMakeLists.txt	Sun Jan 21 22:25:07 2018 +0800
+++ b/extensions/CMakeLists.txt	Sun May 12 23:15:40 2019 +0800
@@ -12,7 +12,7 @@
   SET_TARGET_PROPERTIES(${EXTNAME} PROPERTIES SUFFIX ".fdx" )
 ENDMACRO(FD_ADD_EXTENSION)
 
-# Use the macro FD_EXTENSION_SUBDIR(extmacroname subdir descr default) to 
+# Use the macro FD_EXTENSION_SUBDIR(extmacroname subdir descr default) to
 # add a new extension subdirectory.
 MACRO(FD_EXTENSION_SUBDIR EXTSUBDIR EXTDESCR EXTDEFAULT)
    STRING(TOUPPER ${EXTSUBDIR} EXTMACRONAME)
@@ -39,9 +39,9 @@
 FD_EXTENSION_SUBDIR(dict_nasreq "NASREQ (RFC4005) Dictionary definitions"       ON)
 FD_EXTENSION_SUBDIR(dict_eap    "Diameter EAP (RFC4072) Dictionary definitions" ON)
 
-FD_EXTENSION_SUBDIR(dict_dcca   "Diameter CC (RFC4006) Dictionary definitions [incomplete]" ON)
-FD_EXTENSION_SUBDIR(dict_dcca_3gpp   "Diameter CC 3GPP Dictionary definitions [incomplete]" ON)
-FD_EXTENSION_SUBDIR(dict_dcca_starent   "Diameter CC Starent Dictionary definitions" ON)
+FD_EXTENSION_SUBDIR(dict_dcca         "Diameter CC (RFC4006) Dictionary definitions [incomplete]" ON)
+FD_EXTENSION_SUBDIR(dict_dcca_3gpp    "Diameter CC 3GPP Dictionary definitions [incomplete]" ON)
+FD_EXTENSION_SUBDIR(dict_dcca_starent "Diameter CC Starent Dictionary definitions" ON)
 
 FD_EXTENSION_SUBDIR(dict_sip    "Diameter SIP (RFC4740) Dictionary definitions" ON)
 
@@ -50,6 +50,7 @@
 FD_EXTENSION_SUBDIR(dict_nas_mipv6 "Diameter NAS-to-HAAA Interaction Dictionary definitions"  ON)
 FD_EXTENSION_SUBDIR(dict_rfc5777   "Classification and QoS (RFC 5777) Dictionary definitions" ON)
 
+FD_EXTENSION_SUBDIR(dict_json       "Load Diameter dictionary definitions from JSON files."   OFF)
 FD_EXTENSION_SUBDIR(dict_legacy_xml "Load Diameter dictionary definitions from XML files."    OFF)
 
 
@@ -67,13 +68,15 @@
 ####
 # Routing extensions
 
-FD_EXTENSION_SUBDIR(rt_busypeers "Handling of Diameter TOO_BUSY messages and relay timeouts"	ON)
-FD_EXTENSION_SUBDIR(rt_default   "Configurable routing rules for freeDiameter" 		     	ON)
-FD_EXTENSION_SUBDIR(rt_ereg      "Configurable routing based on regexp matching of AVP values" OFF)
-FD_EXTENSION_SUBDIR(rt_ignore_dh "Stow Destination-Host in Proxy-Info, restore to Origin-Host for answers"	ON)
+FD_EXTENSION_SUBDIR(rt_busypeers    "Handling of Diameter TOO_BUSY messages and relay timeouts"	ON)
+FD_EXTENSION_SUBDIR(rt_default      "Configurable routing rules for freeDiameter" 		     	ON)
+FD_EXTENSION_SUBDIR(rt_deny_by_size "Deny messages that are larger than a configured size" 		     	ON)
+FD_EXTENSION_SUBDIR(rt_ereg         "Configurable routing based on regexp matching of AVP values" OFF)
+FD_EXTENSION_SUBDIR(rt_ignore_dh    "Stow Destination-Host in Proxy-Info, restore to Origin-Host for answers"	ON)
 FD_EXTENSION_SUBDIR(rt_load_balance "Balance load over multiple equal hosts, based on outstanding requests"	ON)
-FD_EXTENSION_SUBDIR(rt_randomize "Randomly choose one of the highest scored hosts and increase its score by one"	ON)
-FD_EXTENSION_SUBDIR(rt_redirect  "Handling of Diameter Redirect messages" 			ON)
+FD_EXTENSION_SUBDIR(rt_randomize    "Randomly choose one of the highest scored hosts and increase its score by one"	ON)
+FD_EXTENSION_SUBDIR(rt_redirect     "Handling of Diameter Redirect messages" 			ON)
+FD_EXTENSION_SUBDIR(rt_rewrite      "Convert/remove AVP data in messages" 			ON)
 
 
 ####
@@ -85,14 +88,17 @@
 ####
 # Debug & test extensions
 
-FD_EXTENSION_SUBDIR(dbg_monitor "Outputs periodical status information"              ON)
+FD_EXTENSION_SUBDIR(dbg_loglevel "Read loglevel from file -- allows runtime change"  ON)
+FD_EXTENSION_SUBDIR(dbg_monitor     "Outputs periodical status information"              ON)
 FD_EXTENSION_SUBDIR(dbg_msg_timings "Show some timing information for messages"      ON)
-FD_EXTENSION_SUBDIR(dbg_msg_dumps "Show human-readable content of the received & sent messages"      ON)
-FD_EXTENSION_SUBDIR(dbg_rt      "Routing extension for debugging the routing module" ON)
-FD_EXTENSION_SUBDIR(test_app    "Testing application to send dummy message to another peer, like a Diameter 'ping'" OFF)
-FD_EXTENSION_SUBDIR(test_sip    "Testing application to simulate Diameter-SIP client (RFC4740)" OFF)
+FD_EXTENSION_SUBDIR(dbg_msg_dumps   "Show human-readable content of the received & sent messages"      ON)
+FD_EXTENSION_SUBDIR(dbg_rt          "Routing extension for debugging the routing module" ON)
+FD_EXTENSION_SUBDIR(test_app        "Testing application to send dummy message to another peer, like a Diameter 'ping'" OFF)
+FD_EXTENSION_SUBDIR(test_as     "Receive Abort-Session-Requests and display the data" OFF)
+FD_EXTENSION_SUBDIR(test_cc     "Receive Credit-Control-Requests and display the data" OFF)
+FD_EXTENSION_SUBDIR(test_sip        "Testing application to simulate Diameter-SIP client (RFC4740)" OFF)
 FD_EXTENSION_SUBDIR(dbg_interactive "Python-interpreter based module"                OFF)
-FD_EXTENSION_SUBDIR(test_netemul "Simple Diameter network emulator proxy extension (latency, PDV, duplicates)" OFF)
+FD_EXTENSION_SUBDIR(test_netemul    "Simple Diameter network emulator proxy extension (latency, PDV, duplicates)" OFF)
 
 
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/dbg_loglevel/CMakeLists.txt	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,28 @@
+# The dbg_loglevel extension
+PROJECT("Debugging extension that allows changing the log level at runtime" C)
+
+# Parser files
+BISON_FILE(dbg_loglevel_conf.y)
+FLEX_FILE(dbg_loglevel_conf.l)
+SET_SOURCE_FILES_PROPERTIES(lex.dbg_loglevel_conf.c dbg_loglevel_conf.tab.c PROPERTIES COMPILE_FLAGS "-I ${CMAKE_CURRENT_SOURCE_DIR}")
+
+# List of source files
+SET(DBG_LOGLEVEL_SRC
+	dbg_loglevel.c
+	dbg_loglevel.h
+	lex.dbg_loglevel_conf.c
+	dbg_loglevel_conf.tab.c
+	dbg_loglevel_conf.tab.h
+)
+
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
+
+# Compile these files as a freeDiameter extension
+FD_ADD_EXTENSION(dbg_loglevel ${DBG_LOGLEVEL_SRC})
+
+####
+## INSTALL section ##
+
+INSTALL(TARGETS dbg_loglevel
+	LIBRARY DESTINATION ${INSTALL_EXTENSIONS_SUFFIX}
+	COMPONENT freeDiameter-debug-tools)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/dbg_loglevel/dbg_loglevel.c	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,89 @@
+/*********************************************************************************************************
+* Software License Agreement (BSD License)                                                               *
+* Author: Thomas Klausner <tk@giga.or.at>								 *
+*													 *
+* Copyright (c) 2019, Thomas Klausner									 *
+* All rights reserved.											 *
+* 													 *
+* Written under contract by Effortel Technologies SA, http://effortel.com/                               *
+* 													 *
+* Redistribution and use of this software in source and binary forms, with or without modification, are  *
+* permitted provided that the following conditions are met:						 *
+* 													 *
+* * Redistributions of source code must retain the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer.										 *
+*    													 *
+* * Redistributions in binary form must reproduce the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer in the documentation and/or other						 *
+*   materials provided with the distribution.								 *
+* 													 *
+* * Neither the name of the WIDE Project or NICT nor the 						 *
+*   names of its contributors may be used to endorse or 						 *
+*   promote products derived from this software without 						 *
+*   specific prior written permission of WIDE Project and 						 *
+*   NICT.												 *
+* 													 *
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
+* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
+* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 	 *
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 	 *
+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
+* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   *
+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.								 *
+*********************************************************************************************************/
+
+#include <signal.h>
+
+/* See doc/dbg_loglevel.conf.sample for more details about the features of this extension */
+#include "dbg_loglevel.h"
+
+static char *config_file = NULL;
+#define MODULE_NAME "dbg_loglevel"
+
+static void sig_hdlr(void)
+{
+	int old_log_level;
+
+	old_log_level = fd_g_debug_lvl;
+	if (dbg_loglevel_conf_handle(config_file) != 0) {
+		fd_log_error("%s: error during config file reload, restoring previous value", MODULE_NAME);
+		fd_g_debug_lvl = old_log_level;
+	}
+	fd_log_notice("%s: reloaded configuration, log level now %d", MODULE_NAME, fd_g_debug_lvl);
+}
+
+/* entry point */
+static int dbg_loglevel_entry(char * conffile)
+{
+	TRACE_ENTRY("%p", conffile);
+
+	config_file = conffile;
+
+	/* default set by main program */
+	/* fd_g_debug_lvl = FD_LOG_NOTICE; */
+
+	/* Parse the configuration file */
+	CHECK_FCT(dbg_loglevel_conf_handle(config_file));
+
+	/* Register reload callback */
+	CHECK_FCT(fd_event_trig_regcb(SIGUSR1, MODULE_NAME, sig_hdlr));
+
+	fd_log_notice("Extension 'Loglevel' initialized with log level %d", fd_g_debug_lvl);
+
+	/* We're done */
+	return 0;
+}
+
+/* Unload */
+void fd_ext_fini(void)
+{
+	TRACE_ENTRY();
+
+	/* Nothing to do */
+	return ;
+}
+
+EXTENSION_ENTRY(MODULE_NAME, dbg_loglevel_entry);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/dbg_loglevel/dbg_loglevel.h	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,47 @@
+/*********************************************************************************************************
+* Software License Agreement (BSD License)                                                               *
+* Author: Thomas Klausner <tk@giga.or.at>								 *
+*													 *
+* Copyright (c) 2019, Thomas Klausner									 *
+* All rights reserved.											 *
+* 													 *
+* Written under contract by Effortel Technologies SA, http://effortel.com/                               *
+* 													 *
+* Redistribution and use of this software in source and binary forms, with or without modification, are  *
+* permitted provided that the following conditions are met:						 *
+* 													 *
+* * Redistributions of source code must retain the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer.										 *
+*    													 *
+* * Redistributions in binary form must reproduce the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer in the documentation and/or other						 *
+*   materials provided with the distribution.								 *
+* 													 *
+* * Neither the name of the WIDE Project or NICT nor the 						 *
+*   names of its contributors may be used to endorse or 						 *
+*   promote products derived from this software without 						 *
+*   specific prior written permission of WIDE Project and 						 *
+*   NICT.												 *
+* 													 *
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
+* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
+* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 	 *
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 	 *
+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
+* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   *
+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.								 *
+*********************************************************************************************************/
+
+/*
+ *  See the dbg_loglevel.conf.sample file for the format of the configuration file.
+ */
+
+/* FreeDiameter's common include file */
+#include <freeDiameter/extension.h>
+
+/* Parse the configuration file */
+int dbg_loglevel_conf_handle(char *);
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/dbg_loglevel/dbg_loglevel_conf.l	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,107 @@
+/*********************************************************************************************************
+* Software License Agreement (BSD License)                                                               *
+* Authors: Thomas Klausner <tk@giga.or.at> based on code by Sebastien Decugis <sdecugis@freediameter.net>*
+*													 *
+* Copyright (c) 2019, Thomas Klausner									 *
+* Copyright (c) 2013, WIDE Project and NICT								 *
+* All rights reserved.											 *
+* 													 *
+* Written under contract by Effortel Technologies SA, http://effortel.com/                               *
+* 													 *
+* Redistribution and use of this software in source and binary forms, with or without modification, are  *
+* permitted provided that the following conditions are met:						 *
+* 													 *
+* * Redistributions of source code must retain the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer.										 *
+*    													 *
+* * Redistributions in binary form must reproduce the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer in the documentation and/or other						 *
+*   materials provided with the distribution.								 *
+* 													 *
+* * Neither the name of the WIDE Project or NICT nor the 						 *
+*   names of its contributors may be used to endorse or 						 *
+*   promote products derived from this software without 						 *
+*   specific prior written permission of WIDE Project and 						 *
+*   NICT.												 *
+* 													 *
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
+* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
+* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 	 *
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 	 *
+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
+* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   *
+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.								 *
+*********************************************************************************************************/
+
+/* Tokenizer
+ *
+ */
+
+%{
+#include "dbg_loglevel.h"
+#include "dbg_loglevel_conf.tab.h"
+
+/* Update the column information */
+#define YY_USER_ACTION { 						\
+	yylloc->first_column = yylloc->last_column + 1; 		\
+	yylloc->last_column = yylloc->first_column + yyleng - 1;	\
+}
+
+/* Avoid warning with newer flex */
+#define YY_NO_INPUT
+
+%}
+
+qstring		\"[^\"\n]*\"
+
+
+%option bison-bridge bison-locations
+%option noyywrap
+%option nounput
+
+%%
+
+	/* Update the line count */
+\n			{
+				yylloc->first_line++;
+				yylloc->last_line++;
+				yylloc->last_column=0;
+			}
+
+	/* Eat all spaces but not new lines */
+([[:space:]]{-}[\n])+	;
+	/* Eat all comments */
+#.*$			;
+
+	/* Recognize any integer */
+[-]?[[:digit:]]+	{
+				/* Convert this to an integer value */
+				int ret=0;
+				ret = sscanf(yytext, "%i", &yylval->integer);
+				if (ret != 1) {
+					/* No matching: an error occurred */
+					TRACE_ERROR("Unable to convert the value '%s' to a valid number: %s", yytext, strerror(errno));
+					return LEX_ERROR; /* trig an error in yacc parser */
+					/* Maybe we could REJECT instead of failing here? */
+				}
+				return INTEGER;
+			}
+
+
+
+	/* The key words */
+(?i:"LogLevel")	 	{	return LOGLEVEL;	}
+
+	/* Valid single characters for yyparse */
+[=;]			{ return yytext[0]; }
+
+	/* Unrecognized sequence, if it did not match any previous pattern */
+[^[:space:]=;\n]+	{
+				TRACE_ERROR("Unrecognized text on line %d col %d: '%s'.", yylloc->first_line, yylloc->first_column, yytext);
+			 	return LEX_ERROR;
+			}
+
+%%
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/dbg_loglevel/dbg_loglevel_conf.y	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,147 @@
+/*********************************************************************************************************
+* Software License Agreement (BSD License)                                                               *
+* Author: Thomas Klausner <tk@giga.or.at>								 *
+*													 *
+* Copyright (c) 2019, Thomas Klausner									 *
+* All rights reserved.											 *
+* 													 *
+* Written under contract by Effortel Technologies SA, http://effortel.com/                               *
+* 													 *
+* Redistribution and use of this software in source and binary forms, with or without modification, are  *
+* permitted provided that the following conditions are met:						 *
+* 													 *
+* * Redistributions of source code must retain the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer.										 *
+*    													 *
+* * Redistributions in binary form must reproduce the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer in the documentation and/or other						 *
+*   materials provided with the distribution.								 *
+* 													 *
+* * Neither the name of the WIDE Project or NICT nor the 						 *
+*   names of its contributors may be used to endorse or 						 *
+*   promote products derived from this software without 						 *
+*   specific prior written permission of WIDE Project and 						 *
+*   NICT.												 *
+* 													 *
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
+* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
+* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 	 *
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 	 *
+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
+* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   *
+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.								 *
+*********************************************************************************************************/
+
+/* Yacc extension's configuration parser.
+ */
+
+/* For development only : */
+%debug
+%error-verbose
+
+/* The parser receives the configuration file filename as parameter */
+%parse-param {char * conffile}
+
+/* Keep track of location */
+%locations
+%pure-parser
+
+%{
+#include "dbg_loglevel.h"
+#include "dbg_loglevel_conf.tab.h"
+
+/* Forward declaration */
+int dbg_loglevel_confparse(char *conffile);
+void dbg_loglevel_confrestart(FILE *input_file);
+
+/* Parse the configuration file */
+int dbg_loglevel_conf_handle(char * conffile)
+{
+	extern FILE *dbg_loglevel_confin;
+	int ret;
+
+	TRACE_ENTRY("%p", conffile);
+
+	TRACE_DEBUG(FULL, "Parsing configuration file: %s...", conffile);
+
+	dbg_loglevel_confin = fopen(conffile, "r");
+	if (dbg_loglevel_confin == NULL) {
+		ret = errno;
+		TRACE_ERROR("Unable to open extension configuration file %s for reading: %s", conffile, strerror(ret));
+		return ret;
+	}
+
+	dbg_loglevel_confrestart(dbg_loglevel_confin);
+	ret = dbg_loglevel_confparse(conffile);
+
+	fclose(dbg_loglevel_confin);
+
+	if (ret != 0) {
+		TRACE_ERROR( "Unable to parse the configuration file %s.", conffile);
+		return EINVAL;
+	} else {
+		TRACE_DEBUG(FULL, "[dbg_loglevel] LogLevel: %d.", fd_g_debug_lvl);
+	}
+
+	return 0;
+}
+
+/* The Lex parser prototype */
+int dbg_loglevel_conflex(YYSTYPE *lvalp, YYLTYPE *llocp);
+
+/* Function to report the errors */
+void yyerror (YYLTYPE *ploc, char * conffile, char const *s)
+{
+	TRACE_DEBUG(INFO, "Error in configuration parsing");
+
+	if (ploc->first_line != ploc->last_line)
+		fd_log_error("%s:%d.%d-%d.%d : %s", conffile, ploc->first_line, ploc->first_column, ploc->last_line, ploc->last_column, s);
+	else if (ploc->first_column != ploc->last_column)
+		fd_log_error("%s:%d.%d-%d : %s", conffile, ploc->first_line, ploc->first_column, ploc->last_column, s);
+	else
+		fd_log_error("%s:%d.%d : %s", conffile, ploc->first_line, ploc->first_column, s);
+}
+
+%}
+
+/* Values returned by lex for token */
+%union {
+	int		integer;
+}
+
+/* In case of error in the lexical analysis */
+%token 		LEX_ERROR
+
+/* A (de)quoted string (malloc'd in lex parser; it must be freed after use) */
+%token <integer> INTEGER
+
+/* Tokens */
+%token 		LOGLEVEL
+
+
+/* -------------------------------------- */
+%%
+
+	/* The grammar definition */
+conffile:		/* empty is OK */
+			| conffile size
+			| conffile errors
+			{
+				yyerror(&yylloc, conffile, "An error occurred while parsing the configuration file");
+				YYABORT;
+			}
+			;
+
+			/* Lexical or syntax error */
+errors:			LEX_ERROR
+			| error
+			;
+
+size:		LOGLEVEL '=' INTEGER ';'
+			{
+				fd_g_debug_lvl=$3;
+			}
+			;
--- a/extensions/dict_dcca_3gpp/dict_dcca_3gpp.c	Sun Jan 21 22:25:07 2018 +0800
+++ b/extensions/dict_dcca_3gpp/dict_dcca_3gpp.c	Sun May 12 23:15:40 2019 +0800
@@ -10587,6 +10587,21 @@
 		struct dict_object *rule_avp;
 		struct dict_avp_request vpa;
 		vpa.avp_vendor = 10415;
+		vpa.avp_name = "Originator-Received-Address";
+		CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp);
+		struct local_rules_definition rules[] =
+			{
+				{ { .avp_vendor = 10415, .avp_name = "Address-Type" }, RULE_OPTIONAL, -1, 1 },
+				{ { .avp_vendor = 10415, .avp_name = "Address-Data" }, RULE_OPTIONAL, -1, 1 },
+				{ { .avp_vendor = 10415, .avp_name = "Address-Domain" }, RULE_OPTIONAL, -1, 1 },
+			};
+			PARSE_loc_rules(rules, rule_avp);
+        }
+
+	{
+		struct dict_object *rule_avp;
+		struct dict_avp_request vpa;
+		vpa.avp_vendor = 10415;
 		vpa.avp_name = "PS-Furnish-Charging-Information";
 		CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp);
 		struct local_rules_definition rules[] =
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/dict_json/CMakeLists.txt	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,43 @@
+# The dict_json extension
+PROJECT("JSON dictionary files support" C)
+
+INCLUDE(FindPkgConfig)
+
+# We use JSONCPP and JSON-Schema to parse and validate JSON files
+PKG_CHECK_MODULES(JSONCPP REQUIRED jsoncpp)
+PKG_CHECK_MODULES(JSON_SCHEMA REQUIRED json-schema)
+
+# List of source files
+SET(DICT_JSON_SRC
+	dict_json.cc
+	dict_json_dict_schema.cc
+)
+
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
+INCLUDE_DIRECTORIES(${JSONCPP_INCLUDE_DIR})
+INCLUDE_DIRECTORIES(${JSON_SCHEMA_INCLUDE_DIR})
+
+LINK_DIRECTORIES(${JSONCPP_LIBDIR})
+LINK_DIRECTORIES(${JSON_SCHEMA_LIBDIR})
+
+# Compile these files as a freeDiameter extension
+FD_ADD_EXTENSION(dict_json ${DICT_JSON_SRC})
+
+TARGET_LINK_LIBRARIES(dict_json ${JSONCPP_LIBRARIES} ${JSON_SCHEMA_STATIC_LIBRARIES})
+
+ADD_EXECUTABLE(dict-json-diff dict-json-diff.cc)
+TARGET_LINK_LIBRARIES(dict-json-diff ${JSONCPP_LIBRARIES} ${JSON_SCHEMA_STATIC_LIBRARIES})
+
+
+####
+## INSTALL section ##
+
+INSTALL(TARGETS dict_json
+	LIBRARY DESTINATION ${INSTALL_EXTENSIONS_SUFFIX}
+	COMPONENT freeDiameter-dictionary-json)
+INSTALL(TARGETS dict-json-diff
+	RUNTIME DESTINATION ${INSTALL_DAEMON_SUFFIX}
+	COMPONENT freeDiameter-dictionary-json)
+
+# dict_json_dict_schema.cc is created from dict_json_dict_schema.json
+# the tool for that is not yet open source, but the conversion is straightforward
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/dict_json/dict-json-diff.cc	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,352 @@
+/**********************************************************************************************************
+ * Software License Agreement (BSD License)                                                               *
+ * Author: Thomas Klausner <tk@giga.or.at>                                                                *
+ *                                                                                                        *
+ * Copyright (c) 2016, 2017, 2019 Thomas Klausner                                                         *
+ * All rights reserved.                                                                                   *
+ *                                                                                                        *
+ * Written under contract by nfotex IT GmbH, http://nfotex.com/                                           *
+ *                                                                                                        *
+ * Redistribution and use of this software in source and binary forms, with or without modification, are  *
+ * permitted provided that the following conditions are met:                                              *
+ *                                                                                                        *
+ * * Redistributions of source code must retain the above                                                 *
+ *   copyright notice, this list of conditions and the                                                    *
+ *   following disclaimer.                                                                                *
+ *                                                                                                        *
+ * * Redistributions in binary form must reproduce the above                                              *
+ *   copyright notice, this list of conditions and the                                                    *
+ *   following disclaimer in the documentation and/or other                                               *
+ *   materials provided with the distribution.                                                            *
+ *                                                                                                        *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT     *
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS    *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   *
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                                                             *
+ **********************************************************************************************************/
+
+/*
+ * Show what was added from one dictionary dump JSON file compared to a second one
+ */
+#include <json/json.h>
+
+#include <fstream>
+#include <iostream>
+#include <sstream>
+
+using namespace std;
+
+void json_compare_arrays(Json::Value &base, Json::Value &big, Json::Value &diff, string name, string key, string key2);
+
+void
+json_compare_objects(Json::Value &base, Json::Value &big, Json::Value &diff, string name)
+{
+    Json::Value::Members members = big[name].getMemberNames();
+    for (auto it = members.begin() ; it != members.end(); ++it) {
+        if (!base[name].isMember(*it) ||
+            (base[name][*it] != big[name][*it])) {
+            diff[name][*it] = big[name][*it];
+        }
+    }
+}
+
+void
+json_compare_avps(Json::Value &base, Json::Value &big, Json::Value &diff, string name)
+{
+    Json::Value left = base[name];
+    Json::Value right = big[name];
+
+    if (left.type() != right.type() || left.empty()) {
+        if (!right.empty()) {
+            diff[name] = right;
+        }
+        return;
+    }
+
+    if (!left.isArray()) {
+        cerr << name << " member not an array\n";
+        return;
+    }
+
+    for (unsigned int i=0; i<right.size(); i++) {
+        bool found = false;
+        /* find matching entry in base */
+        for (unsigned int j=0; j<left.size(); j++) {
+            Json::Value temp = Json::Value::null;
+            if (left[j]["Code"] != right[i]["Code"] ||
+                (left[j]["Vendor"] != right[i]["Vendor"])) {
+                continue;
+            }
+            Json::Value::Members members = right[i].getMemberNames();
+            for (auto it = members.begin() ; it != members.end(); ++it) {
+                if (*it == "Flags") {
+                    json_compare_objects(left[j], right[i], temp, *it);
+                    continue;
+                }
+                if (*it == "EnumValues") {
+                    std::string none;
+                    json_compare_arrays(left[j], right[i], temp, *it, "Code", none);
+                    continue;
+                }
+                if (left[j].isMember(*it)) {
+                    if (left[j][*it] != right[i][*it]) {
+                        temp[*it] = right[i][*it];
+                    }
+                } else {
+                    temp[*it] = right[i][*it];
+                }
+            }
+            if (!temp.isNull()) {
+                temp["Code"] = right[i]["Code"];
+                if (!right[i]["Vendor"].isNull()) {
+                    temp["Vendor"] = right[i]["Vendor"];
+                }
+                if (temp.isMember("EnumValues")) {
+                    temp["Name"] = right[i]["Name"];
+                    temp["Type"] = right[i]["Type"];
+                }
+                diff[name].append(temp);
+            }
+            found = true;
+            break;
+        }
+        if (!found) {
+            diff[name].append(right[i]);
+        }
+    }
+
+
+}
+
+void
+json_compare_commands(Json::Value &base, Json::Value &big, Json::Value &diff, string name)
+{
+    Json::Value left = base[name];
+    Json::Value right = big[name];
+
+    if (left.type() != right.type() || left.empty()) {
+        if (!right.empty()) {
+            diff[name] = right;
+        }
+        return;
+    }
+
+    if (!left.isArray()) {
+        cerr << name << " member not an array\n";
+        return;
+    }
+
+    for (unsigned int i=0; i<right.size(); i++) {
+        bool found = false;
+        /* find matching entry in base */
+        for (unsigned int j=0; j<left.size(); j++) {
+            Json::Value temp = Json::Value::null;
+            if (left[j]["Code"] != right[i]["Code"] ||
+                left[j]["Flags"]["Must"] != right[i]["Flags"]["Must"]) {
+                continue;
+            }
+            Json::Value::Members members = right[i].getMemberNames();
+            for (auto it = members.begin() ; it != members.end(); ++it) {
+                if (*it == "Flags") {
+                    json_compare_objects(left[j], right[i], temp, *it);
+                    continue;
+                }
+                if (left[j].isMember(*it)) {
+                    if (left[j][*it] != right[i][*it]) {
+                        temp[*it] = right[i][*it];
+                    }
+                } else {
+                    temp[*it] = right[i][*it];
+                }
+            }
+            if (!temp.isNull()) {
+                temp["Code"] = right[i]["Code"];
+                if (!right[i]["Flags"]["Must"].isNull()) {
+                    temp["Flags"]["Must"] = right[i]["Flags"]["Must"];
+                }
+                diff[name].append(temp);
+            }
+            found = true;
+            break;
+        }
+        if (!found) {
+            diff[name].append(right[i]);
+        }
+    }
+
+
+}
+
+void
+json_compare_rules(Json::Value &base, Json::Value &big, Json::Value &diff, string name)
+{
+    Json::Value left = base[name];
+    Json::Value right = big[name];
+
+    if (left.type() != right.type() || left.empty()) {
+        if (!right.empty()) {
+            diff[name] = right;
+        }
+        return;
+    }
+
+    if (!left.isArray()) {
+        cerr << name << " member not an array\n";
+        return;
+    }
+
+    for (unsigned int i=0; i<right.size(); i++) {
+        bool found = false;
+        /* find matching entry in base */
+        for (unsigned int j=0; j<left.size(); j++) {
+            Json::Value temp = Json::Value::null;
+            if (name == "AVPRules") {
+                if (left[j]["AVP"] != right[i]["AVP"]
+                    || left[j]["Vendor"] != right[i]["Vendor"]) {
+                    continue;
+                }
+            } else {
+                if (left[j]["Command"] != right[i]["Command"]) {
+                    continue;
+                }
+            }
+            json_compare_arrays(left[j], right[i], temp, "Content", "AVP", "Vendor");
+            if (!temp.isNull()) {
+                if (name == "AVPRules") {
+                    temp["AVP"] = right[i]["AVP"];
+                    if (!right[i]["Vendor"].isNull()) {
+                        temp["Vendor"] = right[i]["Vendor"];
+                    }
+                } else {
+                    temp["Command"] = right[i]["Command"];
+                    if (!right[i]["Flags"]["Must"].isNull()) {
+                        temp["Flags"]["Must"] = right[i]["Flags"]["Must"];
+                    }
+                }
+                diff[name].append(temp);
+            }
+            found = true;
+            break;
+        }
+        if (!found) {
+            diff[name].append(right[i]);
+        }
+    }
+}
+
+void
+json_compare_arrays(Json::Value &base, Json::Value &big, Json::Value &diff, string name, string key, string key2)
+{
+    Json::Value left = base[name];
+    Json::Value right = big[name];
+
+    if (left.type() != right.type() || left.empty()) {
+        if (!right.empty()) {
+            diff[name] = right;
+        }
+        return;
+    }
+
+    if (!left.isArray()) {
+        cerr << name << " member not an array\n";
+        return;
+    }
+
+    for (unsigned int i=0; i<right.size(); i++) {
+        bool found = false;
+        /* find matching entry in base */
+        for (unsigned int j=0; j<left.size(); j++) {
+            Json::Value temp = Json::Value::null;
+            if (left[j][key] != right[i][key]) {
+                continue;
+            }
+            if (!key2.empty() && left[j][key2] != right[i][key2]) {
+                continue;
+            }
+            Json::Value::Members members = right[i].getMemberNames();
+            for (auto it = members.begin() ; it != members.end(); ++it) {
+                if (left[j].isMember(*it)) {
+                    if (left[j][*it] != right[i][*it]) {
+                        temp[*it] = right[i][*it];
+                    }
+                } else {
+                    temp[*it] = right[i][*it];
+                }
+            }
+            if (!temp.isNull()) {
+                temp[key] = right[i][key];
+                if (key == "AVP" && !right[i]["Vendor"].isNull()) {
+                    temp["Vendor"] = right[i]["Vendor"];
+                }
+                diff[name].append(temp);
+            }
+            found = true;
+            break;
+        }
+        if (!found) {
+            diff[name].append(right[i]);
+        }
+    }
+}
+
+void
+compare_all(Json::Value &base, Json::Value &big, Json::Value &diff)
+{
+        std::string none;
+        json_compare_arrays(base, big, diff, "Applications", "Code", none);
+        json_compare_avps(base, big, diff, "AVPs");
+        json_compare_rules(base, big, diff, "AVPRules");
+        json_compare_commands(base, big, diff, "Commands");
+        json_compare_rules(base, big, diff, "CommandRules");
+        json_compare_arrays(base, big, diff, "Types", "Name", none);
+        json_compare_arrays(base, big, diff, "Vendors", "Code", none);
+}
+
+int
+main(int argc, char *argv[])
+{
+        Json::Value base = Json::Value::null;
+        Json::Value big = Json::Value::null;
+        Json::Value diff = Json::Value::null;
+        Json::Value reverse_diff = Json::Value::null;
+        Json::Reader reader;
+        Json::StyledWriter writer;
+        ifstream input;
+
+        if (argc != 3) {
+                cout << "usage: " << argv[0] << " small big" << endl; 
+                cout << endl << "Prints added and changed entries that are in 'big' but not in 'small'," << endl << "or have changed between the two." << endl;
+                exit(1);
+        }
+
+        input.open(argv[1]);
+        if (!reader.parse(input, base)) {
+                cerr << "error parsing JSON file '" << argv[1] << "'\n";
+                exit(1);
+        }
+        input.close();
+
+        input.open(argv[2]);
+        if (!reader.parse(input, big)) {
+                cerr << "error parsing JSON file '" << argv[2] << "'\n";
+                exit(1);
+        }
+        input.close();
+
+        compare_all(base, big, diff);
+        if (diff != Json::Value::null) {
+                std::string value_str = writer.write(diff);
+                cout << value_str << endl;
+        }
+
+        compare_all(big, base, reverse_diff);
+        if (reverse_diff != Json::Value::null) {
+                cerr << argv[2] << " is missing entries that are in " << argv[1] << " -- please call " << argv[0] << " with swapped arguments" << endl;
+        }
+
+	return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/dict_json/dict_json.cc	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,820 @@
+/**********************************************************************************************************
+ * Software License Agreement (BSD License)                                                               *
+ * Author: Thomas Klausner <tk@giga.or.at>                                                                *
+ *                                                                                                        *
+ * Copyright (c) 2016, 2017, 2019 Thomas Klausner                                                         *
+ * All rights reserved.                                                                                   *
+ *                                                                                                        *
+ * Written under contract by nfotex IT GmbH, http://nfotex.com/                                           *
+ *                                                                                                        *
+ * Redistribution and use of this software in source and binary forms, with or without modification, are  *
+ * permitted provided that the following conditions are met:                                              *
+ *                                                                                                        *
+ * * Redistributions of source code must retain the above                                                 *
+ *   copyright notice, this list of conditions and the                                                    *
+ *   following disclaimer.                                                                                *
+ *                                                                                                        *
+ * * Redistributions in binary form must reproduce the above                                              *
+ *   copyright notice, this list of conditions and the                                                    *
+ *   following disclaimer in the documentation and/or other                                               *
+ *   materials provided with the distribution.                                                            *
+ *                                                                                                        *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT     *
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS    *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   *
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                                                             *
+ **********************************************************************************************************/
+
+/*
+ * Extend a dictionary using data from a JSON file.
+ *
+ */
+#include <freeDiameter/extension.h>
+#include <json/json.h>
+#include <json/SchemaValidator.h>
+#include <sys/stat.h>
+
+extern const char *dict_json_dict_schema;
+
+static int
+make_type(const char *typestring, struct dict_object **type)
+{
+        *type = NULL;
+
+        if (strcmp("Unsigned32", typestring) == 0)
+                return AVP_TYPE_UNSIGNED32;
+        else if (strcmp("Enumerated", typestring) == 0 || strcmp("Integer32", typestring) == 0)
+                return AVP_TYPE_INTEGER32;
+        else if (strcmp("OctetString", typestring) == 0)
+                return AVP_TYPE_OCTETSTRING;
+        else if (strcmp("Grouped", typestring) == 0)
+                return AVP_TYPE_GROUPED;
+        else if (strcmp("Integer64", typestring) == 0)
+                return AVP_TYPE_INTEGER64;
+        else if (strcmp("Unsigned64", typestring) == 0)
+                return AVP_TYPE_UNSIGNED64;
+        else if (strcmp("Float32", typestring) == 0)
+                return AVP_TYPE_FLOAT32;
+        else if (strcmp("Float64", typestring) == 0)
+                return AVP_TYPE_FLOAT64;
+        else {
+                if (fd_dict_search(fd_g_config->cnf_dict, DICT_TYPE, TYPE_BY_NAME, typestring, type, ENOENT) != 0) {
+                        LOG_E("Unknown type '%s'", typestring);
+                        return -1;
+                }
+                return AVP_TYPE_OCTETSTRING;
+        }
+
+        return -1;
+}
+
+
+static uint8_t
+make_avp_flags(const char *flagstring)
+{
+        uint8_t flags = 0;
+
+        if (strchr(flagstring, 'M') != NULL)
+                flags |= AVP_FLAG_MANDATORY;
+        if (strchr(flagstring, 'V') != NULL)
+                flags |= AVP_FLAG_VENDOR;
+
+        return flags;
+}
+
+static uint8_t
+make_command_flags(const char *flagstring)
+{
+        uint8_t flags = 0;
+
+        if (strchr(flagstring, 'E') != NULL)
+                flags |= CMD_FLAG_ERROR;
+        if (strchr(flagstring, 'P') != NULL)
+                flags |= CMD_FLAG_PROXIABLE;
+        if (strchr(flagstring, 'R') != NULL)
+                flags |= CMD_FLAG_REQUEST;
+
+        return flags;
+}
+
+
+static bool
+add_applications(const Json::Value &config)
+{
+        Json::Value applications = config["Applications"];
+        if (applications == Json::Value::null)
+                return true;
+        for (Json::ArrayIndex i=0; i<applications.size(); i++) {
+                int ret;
+                struct dict_application_data application_data;
+                application_data.application_id = applications[i]["Code"].asUInt();
+                application_data.application_name = (char *)(void *)applications[i]["Name"].asCString();
+                if ((ret=fd_dict_new(fd_g_config->cnf_dict, DICT_APPLICATION, &application_data, NULL, NULL)) != 0) {
+                        LOG_E("error adding Application '%s' to dictionary: %s", applications[i]["Name"].asCString(), strerror(ret));
+                        return false;
+                }
+                LOG_D("Added Application '%s' to dictionary", applications[i]["Name"].asCString());
+        }
+
+        return true;
+}
+
+static bool
+add_enumtype(const char *enumtypename, enum dict_avp_basetype basetype, struct dict_object **enumtype)
+{
+        struct dict_type_data data;
+        int ret;
+
+        memset(&data, 0, sizeof(data));
+        data.type_base = basetype;
+        data.type_name = (char *)(void *)enumtypename;
+        data.type_interpret = NULL;
+        data.type_encode = NULL;
+        data.type_dump = NULL;
+        if ((ret=fd_dict_new(fd_g_config->cnf_dict, DICT_TYPE, &data, NULL, enumtype)) != 0) {
+                /* TODO: allow ret == EEXIST? */
+                LOG_E("error defining type '%s': %s", enumtypename, strerror(ret));
+                return false;
+        }
+        LOG_D("Added enumerated type '%s' to dictionary", enumtypename);
+
+        return true;
+}
+
+static unsigned int
+hexchar(char input) {
+        if (input >= '0' and input <= '9')
+                return input - '0';
+        if (input >= 'a' and input <= 'f')
+                return input - 'a' + 10;
+        if (input >= 'A' and input <= 'F')
+                return input - 'a' + 10;
+
+        return 0;
+}
+
+static char
+hexdecode(const char *input) {
+        return (char)(hexchar(input[0])*16 + hexchar(input[1]));
+}
+
+static char *
+unpack_enumval_os(const Json::Value &enumvalue, unsigned int &len)
+{
+        if (!enumvalue.isString()) {
+                len = 0;
+                return NULL;
+        }
+        len = enumvalue.asString().size();
+        if (enumvalue.asString()[0] == '<' && enumvalue.asString()[len-1] == '>') {
+                char *retstr;
+                len = len/2 - 1;
+                if ((retstr = (char *)malloc(len)) == NULL) {
+                        return retstr;
+                }
+                for (size_t i=0; i<len; i++) {
+                        retstr[i] = hexdecode(enumvalue.asCString()+2*i+1);
+                }
+                return retstr;
+        }
+
+        return strdup(enumvalue.asCString());
+}
+
+static bool
+add_enumvalue(const Json::Value &enumvalue, enum dict_avp_basetype basetype, struct dict_object *enumtype, const char *avpname)
+{
+        struct dict_enumval_data data;
+        int ret;
+        bool free_os = false;
+
+        memset(&data, 0, sizeof(data));
+        data.enum_name = (char *)(void *)enumvalue["Name"].asCString();
+        switch (basetype) {
+        case AVP_TYPE_INTEGER32:
+                if (enumvalue["Code"].isInt()) {
+                        data.enum_value.i32 = enumvalue["Code"].asInt();
+                } else {
+                        LOG_E("unsupported EnumValue '%s' for AVP '%s', base type Integer32", enumvalue["Name"].asCString(), avpname);
+                        return false;
+                }
+                break;
+        case AVP_TYPE_UNSIGNED32:
+                if (enumvalue["Code"].isInt()) {
+                        data.enum_value.u32 = enumvalue["Code"].asInt();
+                } else {
+                        LOG_E("unsupported EnumValue '%s' for AVP '%s', base type Unsigned32", enumvalue["Name"].asCString(), avpname);
+                        return false;
+                }
+                break;
+        case AVP_TYPE_OCTETSTRING:
+                if (enumvalue["Code"].isString()) {
+                        unsigned int len;
+                        data.enum_value.os.data = (unsigned char *)unpack_enumval_os(enumvalue["Code"], len);
+                        data.enum_value.os.len = len;
+                        free_os = true;
+                } else {
+                        LOG_E("unsupported EnumValue '%s' for AVP '%s', base type OctetString", enumvalue["Name"].asCString(), avpname);
+                        return false;
+                }
+                break;
+        /* TODO: add other cases when we find that they occur */
+        default:
+                LOG_E("unsupported EnumValue type '%s' for AVP '%s', type %d", enumvalue["Name"].asCString(), avpname, (int)basetype);
+                return false;
+        }
+
+        if ((ret=fd_dict_new(fd_g_config->cnf_dict, DICT_ENUMVAL, &data, enumtype, NULL)) != 0) {
+                LOG_E("error adding EnumValue '%s' for AVP '%s' to dictionary: %s", enumvalue["Name"].asCString(), avpname, strerror(errno));
+                return false;
+        }
+        LOG_D("Added enumerated value '%s' to dictionary", enumvalue["Name"].asCString());
+
+        if (free_os) {
+                free(data.enum_value.os.data);
+        }
+
+        return true;
+}
+
+static bool
+add_avp(const Json::Value &avp)
+{
+        int bt;
+        struct dict_avp_data data;
+        struct dict_object *type = NULL;
+        struct dict_avp_request dar;
+        struct dict_object *existing_avp_obj;
+        int fds_ret;
+
+        if (!avp["Code"] || !avp["Name"] || !avp["Type"]) {
+                LOG_E("invalid AVP, need Code, Name, and Type");
+                return false;
+        }
+
+        memset(&data, 0, sizeof(data));
+
+        data.avp_code = avp["Code"].asUInt();
+        data.avp_vendor = 0;
+        data.avp_name = (char *)(void *)avp["Name"].asCString();
+        data.avp_flag_mask = 0;
+        if (avp["Flags"]["Must"] != Json::Value::null) {
+                data.avp_flag_mask = data.avp_flag_val = make_avp_flags(avp["Flags"]["Must"].asCString());
+        }
+        if (avp["Flags"]["MustNot"] != Json::Value::null) {
+                data.avp_flag_mask |= make_avp_flags(avp["Flags"]["MustNot"].asCString());
+        }
+        if (avp["Vendor"] != Json::Value::null) {
+                data.avp_vendor = avp["Vendor"].asUInt();
+                if ((data.avp_flag_mask & AVP_FLAG_VENDOR) == 0) {
+                        LOG_D("Vendor flag not set for AVP '%s'", data.avp_name);
+                        // error out?
+                }
+                data.avp_flag_mask |= AVP_FLAG_VENDOR;
+                data.avp_flag_val |= AVP_FLAG_VENDOR;
+        }
+        bt = make_type(avp["Type"].asCString(), &type);
+        if (bt == -1) {
+                LOG_E("Unknown AVP type %s", avp["Type"].asCString());
+                return false;
+        }
+        data.avp_basetype = (enum dict_avp_basetype)bt;
+
+        if (avp["EnumValues"] != Json::Value::null || avp["Type"] == "Enumerated") {
+                if (avp["Type"] != "Enumerated") {
+                        LOG_D("AVP '%s': EnumValues defined for non-Enumerated type (freeDiameter extension); type is '%s'", avp["Name"].asCString(), avp["Type"].asCString());
+                }
+                Json::Value enumvalues = avp["EnumValues"];
+                std::string enumtypename = "Enumerated(" + avp["Name"].asString() + ")";
+                if (!add_enumtype(enumtypename.c_str(), data.avp_basetype, &type)) {
+                        LOG_E("Unknown AVP Enum: %s", enumtypename.c_str());
+                        return false;
+                }
+                for (Json::ArrayIndex i=0; i<enumvalues.size(); i++) {
+                        if (!add_enumvalue(enumvalues[i], data.avp_basetype, type, avp["Name"].asCString())) {
+                                LOG_E("Unknown AVP Enum Value: %s", avp["Name"].asCString());
+                                return false;
+                        }
+                }
+        }
+
+        dar.avp_vendor = data.avp_vendor;
+        // dar.avp_code = data.avp_code;
+        dar.avp_name = data.avp_name;
+
+        fds_ret = fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME_AND_VENDOR, &dar, &existing_avp_obj, ENOENT);
+        if (fds_ret == 0) {
+                struct dict_avp_data existing_avp;
+                if (fd_dict_getval(existing_avp_obj, &existing_avp) < 0) {
+                        LOG_E("Cannot get information for AVP '%s' from dictionary", data.avp_name);
+                        return false;
+                }
+                if (data.avp_code != existing_avp.avp_code
+//                    || data.avp_vendor != existing_avp.avp_vendor
+//                    || strcmp(data.avp_name, existing_avp.avp_name) != 0
+//                    || data.avp_flag_mask != existing_avp.avp_flag_mask
+                    || data.avp_vendor != existing_avp.avp_vendor
+                    || data.avp_basetype != existing_avp.avp_basetype) {
+                        LOG_E("AVP with name '%s' but different properties already exists in dictionary (existing vs. new: Code: %d/%d, Flags: %x/%x, Vendor Id: %d/%d, Basetype: %d/%d)", data.avp_name, data.avp_code, existing_avp.avp_code, data.avp_flag_mask, existing_avp.avp_flag_mask, data.avp_vendor, existing_avp.avp_vendor, data.avp_basetype, existing_avp.avp_basetype);
+                        return false;
+                }
+        } else if (fds_ret == ENOENT) {
+                switch(fd_dict_new(fd_g_config->cnf_dict, DICT_AVP, &data, type, NULL)) {
+                case 0:
+                        LOG_D("Added AVP '%s' to dictionary", data.avp_name);
+                        break;
+                case EINVAL:
+                        LOG_E("error adding AVP '%s' to dictionary: invalid data", data.avp_name);
+                        return false;
+                case EEXIST:
+                        LOG_E("error adding AVP '%s' to dictionary: duplicate entry", data.avp_name);
+                        return false;
+                default:
+                        LOG_E("error adding AVP '%s' to dictionary: %s", data.avp_name, strerror(errno));
+                        return false;
+                }
+        } else {
+                LOG_E("error looking up AVP '%s' in dictionary: %s", data.avp_name, strerror(errno));
+                return false;
+        }
+            
+        return true;
+}
+
+static bool
+add_avps(const Json::Value &config)
+{
+        Json::Value avps = config["AVPs"];
+        if (avps == Json::Value::null)
+                return true;
+        for (Json::ArrayIndex i=0; i<avps.size(); i++) {
+                if (!add_avp(avps[i])) {
+                        LOG_E("error adding AVP to dictionary");
+                        return false;
+                }
+        }
+
+        return true;
+}
+
+static bool
+look_up_application(const Json::Value &application, struct dict_object **application_object)
+{
+        fd_dict_search(fd_g_config->cnf_dict, DICT_APPLICATION, APPLICATION_BY_NAME, (void *)application.asCString(), application_object, 0);
+        if (*application_object == NULL) {
+                LOG_E("Application '%s' not found", application.asCString());
+                return false;
+        }
+        return true;
+}
+
+static bool
+add_commands(const Json::Value &config)
+{
+        Json::Value commands = config["Commands"];
+        if (commands == Json::Value::null)
+                return true;
+        for (Json::ArrayIndex i=0; i<commands.size(); i++) {
+                int ret;
+                struct dict_cmd_data command_data;
+                command_data.cmd_code = commands[i]["Code"].asUInt();
+                command_data.cmd_name = (char *)(void *)commands[i]["Name"].asCString();
+                command_data.cmd_flag_mask = 0;
+                command_data.cmd_flag_val = 0;
+                if (commands[i]["Flags"]["Must"] != Json::Value::null) {
+                        command_data.cmd_flag_mask = command_data.cmd_flag_val = make_command_flags(commands[i]["Flags"]["Must"].asCString());
+                }
+                if (commands[i]["Flags"]["MustNot"] != Json::Value::null) {
+                        command_data.cmd_flag_mask |= make_command_flags(commands[i]["Flags"]["MustNot"].asCString());
+                }
+                if (commands[i]["Application"] != Json::Value::null) {
+                        struct dict_object *application_object;
+                        if (!look_up_application(commands[i]["Application"], &application_object)) {
+                                LOG_E("Application not found in dictionary");
+                                return false;
+                        }
+                        if ((ret=fd_dict_new(fd_g_config->cnf_dict, DICT_COMMAND, &command_data, application_object, NULL)) != 0) {
+                                LOG_E("error adding Command '%s' to dictionary: %s", commands[i]["Name"].asCString(), strerror(ret));
+                                return false;
+                        }
+                } else {
+                        if ((ret=fd_dict_new(fd_g_config->cnf_dict, DICT_COMMAND, &command_data, NULL, NULL)) != 0) {
+                                LOG_E("error adding Command '%s' to dictionary: %s", commands[i]["Name"].asCString(), strerror(ret));
+                                return false;
+                        }
+                }
+                LOG_D("Added Command '%s' to dictionary", commands[i]["Name"].asCString());
+        }
+
+        return true;
+}
+
+static bool
+look_up_avp(const Json::Value &avp, const Json::Value &vendor, struct dict_object **avp_object)
+{
+        if (vendor != Json::Value::null) {
+                struct dict_avp_request_ex dare;
+                memset(&dare, 0, sizeof(dare));
+                if (vendor.isInt()) {
+                        LOG_D("Looking for AVP '%s', Vendor %d", avp.asCString(), vendor.asInt());
+                        dare.avp_vendor.vendor_id = vendor.asUInt();
+                } else if (vendor.isString()) {
+                        LOG_D("Looking for AVP '%s', Vendor '%s'", avp.asCString(), vendor.asCString());
+                        dare.avp_vendor.vendor_name = vendor.asCString();
+                } else {
+                        LOG_E("error finding AVP '%s', invalid value for Vendor", avp.asCString());
+                        return false;
+                }
+                dare.avp_data.avp_name = avp.asCString();
+                fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_STRUCT, &dare, avp_object, 0);
+        } else {
+                fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, (void *)avp.asCString(), avp_object, 0);
+        }
+        if (*avp_object == NULL) {
+                LOG_E("AVP '%s' not found", avp.asCString());
+                return false;
+        }
+        return true;
+}
+
+static bool
+add_rule_entry(const Json::Value &rule, struct dict_object *parent)
+{
+        struct dict_rule_data data;
+        int ret;
+
+        memset(&data, 0, sizeof(data));
+        data.rule_min = -1;
+        if (rule["Min"] != Json::Value::null) {
+                if (rule["Min"].isInt())
+                        data.rule_min = rule["Min"].asInt();
+                else if (rule["Min"].isString() && strcmp(rule["Min"].asCString(), "unbounded") == 0)
+                        data.rule_min = -1;
+                else {
+                        LOG_E("error adding rule with AVP '%s', invalid value for Min", rule["AVP"].asCString());
+                }
+                data.rule_min = rule["Min"].asInt();
+        }
+        if (data.rule_min > 0) {
+                data.rule_position = RULE_REQUIRED;
+        } else {
+                data.rule_position = RULE_OPTIONAL;
+        }
+        data.rule_max = -1;
+        if (rule["Max"] != Json::Value::null) {
+                if (rule["Max"].isInt())
+                        data.rule_max = rule["Max"].asInt();
+                else if (rule["Max"].isString() && strcmp(rule["Max"].asCString(), "unbounded") == 0)
+                        data.rule_max = -1;
+                else {
+                        LOG_E("error adding rule with AVP '%s', invalid value for Max", rule["AVP"].asCString());
+                        return false;
+                }
+        }
+        if (rule["First"] == true) {
+                data.rule_position = RULE_FIXED_HEAD;
+                data.rule_order = 1;
+        }
+
+        LOG_D("Looking up AVP '%s' for rule", rule["AVP"].asCString());
+        if (!look_up_avp(rule["AVP"], rule["Vendor"], &data.rule_avp)) {
+                LOG_E("Adding rule: AVP '%s' not found", rule["AVP"].asCString());
+                return false;
+        }
+        LOG_D("Found AVP '%s' for rule", rule["AVP"].asCString());
+        if ((ret=fd_dict_new(fd_g_config->cnf_dict, DICT_RULE, &data, parent, NULL)) < 0) {
+                LOG_E("error adding rule with AVP '%s': %s", rule["AVP"].asCString(), strerror(ret));
+                return false;
+        }
+        LOG_D("Added AVP '%s' to rule", rule["AVP"].asCString());
+        return true;
+}
+
+
+static bool
+add_command_rule(const Json::Value &rule)
+{
+        int ret;
+        struct dict_object *command;
+
+        if ((ret=fd_dict_search(fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, rule["Command"].asCString(), &command, ENOENT)) < 0) {
+                LOG_E("Command '%s' not found in dictionary: %s", rule["Command"].asCString(), strerror(ret));
+                return false;
+        }
+
+        Json::Value content = rule["Content"];
+        if (content == Json::Value::null) {
+                LOG_E("No rules for Command '%s'", rule["Command"].asCString());
+                return false;
+        }
+        for (Json::ArrayIndex i=0; i<content.size(); i++) {
+                if (!add_rule_entry(content[i], command)) {
+                        LOG_E("error adding command rule to dictionary");
+                        return false;
+                }
+        }
+        LOG_D("Added rules for Command '%s'", rule["Command"].asCString());
+
+        return true;
+}
+
+static bool
+add_avp_rule(const Json::Value &rule)
+{
+        struct dict_object *avp;
+        struct dict_avp_data user_name_data;
+
+        if (!look_up_avp(rule["AVP"], rule["Vendor"], &avp)) {
+                LOG_E("AVP '%s' not found in dictionary", rule["AVP"].asCString());
+                return false;
+        }
+
+        if (fd_dict_getval(avp, &user_name_data) < 0) {
+                LOG_E("Cannot get information for AVP '%s' from dictionary", rule["AVP"].asCString());
+                return false;
+        }
+        if (user_name_data.avp_basetype != AVP_TYPE_GROUPED) {
+                LOG_E("Invalid type for AVP '%s': cannot define rule for non-Grouped AVP", rule["AVP"].asCString());
+                return false;
+        }
+
+        Json::Value content = rule["Content"];
+        if (content == Json::Value::null) {
+                LOG_E("No rules for AVP '%s'", rule["AVP"].asCString());
+                return false;
+        }
+        for (Json::ArrayIndex i=0; i<content.size(); i++) {
+                if (!add_rule_entry(content[i], avp)) {
+                        LOG_E("error adding AVP rule to dictionary");
+                        return false;
+                }
+        }
+        LOG_D("Added rules for AVP '%s'", rule["AVP"].asCString());
+
+        return true;
+}
+
+static bool
+add_command_rules(const Json::Value &config)
+{
+        Json::Value commandrules = config["CommandRules"];
+        if (commandrules == Json::Value::null)
+                return true;
+        for (Json::ArrayIndex i=0; i<commandrules.size(); i++) {
+                if (!add_command_rule(commandrules[i])) {
+                        LOG_E("error adding command rules to dictionary");
+                        return false;
+                }
+        }
+
+        return true;
+}
+
+static bool
+add_avp_rules(const Json::Value &config)
+{
+        Json::Value avprules = config["AVPRules"];
+        if (avprules == Json::Value::null)
+                return true;
+        for (Json::ArrayIndex i=0; i<avprules.size(); i++) {
+                if (!add_avp_rule(avprules[i])) {
+                        LOG_E("error adding AVP rules to dictionary");
+                        return false;
+                }
+        }
+
+        return true;
+}
+
+struct base_types_map {
+        std::string name;
+        enum dict_avp_basetype value;
+};
+struct base_types_map base_types[] = {
+        { "OctetString", AVP_TYPE_OCTETSTRING },
+        { "Integer32", AVP_TYPE_INTEGER32 },
+        { "Integer64", AVP_TYPE_INTEGER64 },
+        { "Unsigned32", AVP_TYPE_UNSIGNED32 },
+        { "Enumerated", AVP_TYPE_INTEGER32 },
+        { "Unsigned64", AVP_TYPE_UNSIGNED64 },
+        { "Float32", AVP_TYPE_FLOAT32 },
+        { "Float64", AVP_TYPE_FLOAT64 }
+};
+
+static int
+basic_type(std::string name) {
+        for (unsigned int i=0; i<sizeof(base_types)/sizeof(base_types[0]); i++) {
+                if (name == base_types[i].name)
+                        return base_types[i].value;
+        }
+        return -1;
+}
+
+static bool
+add_types(const Json::Value &config)
+{
+        Json::Value types = config["Types"];
+        if (types == Json::Value::null)
+                return true;
+        for (Json::ArrayIndex i=0; i<types.size(); i++) {
+                int ret;
+                struct dict_type_data type_data;
+                struct dict_object *base_type;
+                struct dict_type_data base_data;
+
+                ret = fd_dict_search(fd_g_config->cnf_dict, DICT_TYPE, TYPE_BY_NAME, types[i]["Base"].asCString(), &base_type, ENOENT);
+                switch (ret) {
+                case 0:
+                        if (fd_dict_getval(base_type, &base_data) < 0) {
+                                LOG_E("Error looking up base type '%s' for type '%s'", types[i]["Base"].asCString(), types[i]["Name"].asCString());
+                                return false;
+                        }
+                        type_data.type_base = base_data.type_base;
+                        break;
+
+                case ENOENT:
+                        /* not an extended type, perhaps a basic one? */
+                        ret = basic_type(types[i]["Base"].asString());
+                        if (ret != -1) {
+                                type_data.type_base = (enum dict_avp_basetype)ret;
+                                break;
+                        }
+                        /* fallthrough */
+
+                default:
+                        /* not found, or error */
+                        LOG_E("Base type '%s' for type '%s' not found", types[i]["Base"].asCString(), types[i]["Name"].asCString());
+                        return false;
+                }
+
+                type_data.type_name = (char *)(void *)types[i]["Name"].asCString();
+                if ((ret=fd_dict_new(fd_g_config->cnf_dict, DICT_TYPE, &type_data, NULL, NULL)) != 0) {
+                        LOG_E("error adding Type '%s' to dictionary: %s", types[i]["Name"].asCString(), strerror(ret));
+                        return false;
+                }
+                LOG_D("Added Type '%s' to dictionary", types[i]["Name"].asCString());
+        }
+
+        return true;
+}
+
+static bool
+add_vendors(const Json::Value &config)
+{
+        Json::Value vendors = config["Vendors"];
+        if (vendors == Json::Value::null)
+                return true;
+        for (Json::ArrayIndex i=0; i<vendors.size(); i++) {
+                int ret;
+                struct dict_vendor_data vendor_data;
+                vendor_data.vendor_id = vendors[i]["Code"].asUInt();
+                vendor_data.vendor_name = (char *)(void *)vendors[i]["Name"].asCString();
+                if ((ret=fd_dict_new(fd_g_config->cnf_dict, DICT_VENDOR, &vendor_data, NULL, NULL)) != 0) {
+                        LOG_E("error adding Vendor '%s' to dictionary: %s", vendors[i]["Name"].asCString(), strerror(ret));
+                        return false;
+                }
+                LOG_D("Added Vendor '%s' to dictionary", vendors[i]["Name"].asCString());
+        }
+
+        return true;
+}
+
+static bool
+parse_json_from_file(const char *conffile, Json::Value &jv)
+{
+        struct stat sb;
+        char *buf;
+        FILE *fp;
+        Json::Reader reader;
+        static Json::SchemaValidator *validator = NULL;
+
+        if (conffile == NULL || stat(conffile, &sb) < 0 || !S_ISREG(sb.st_mode)) {
+                LOG_E("invalid or missing configuration: %s", conffile ?: "(null)");
+                return false;
+        }
+        if ((buf=(char *)malloc(static_cast<size_t>(sb.st_size + 1))) == NULL) {
+                LOG_E("malloc failure of %zu bytes", static_cast<size_t>(sb.st_size));
+                return false;
+        }
+        if ((fp=fopen(conffile, "r")) == NULL) {
+                LOG_E("error opening file '%s': %s", conffile, strerror(errno));
+                return false;
+        }
+        if (fread(buf, static_cast<size_t>(sb.st_size), 1, fp) != 1) {
+                LOG_E("error reading from file '%s': %s", conffile, strerror(errno));
+                return false;
+        }
+        (void)fclose(fp);
+
+        buf[sb.st_size] = '\0';
+
+        if (!reader.parse (buf, jv)) {
+                LOG_E("error parsing JSON data from file '%s': %s", conffile, reader.getFormattedErrorMessages().c_str());
+                return false;
+        }
+        free(buf);
+
+        if (validator == NULL) {
+                try {
+                        validator = new Json::SchemaValidator(std::string(dict_json_dict_schema));
+                } catch (Json::SchemaValidator::Exception &e) {
+                        LOG_E("error creating JSON schema validator: %s", e.type_message().c_str());
+                        return false;
+                }
+        }
+
+        if (!validator->validate(jv)) {
+                LOG_E("error validating config file %s:", conffile);
+                const std::vector<Json::SchemaValidator::Error> &errors = validator->errors();
+                for (std::vector<Json::SchemaValidator::Error>::const_iterator it = errors.begin(); it != errors.end(); ++it) {
+                        LOG_E("  %s:%s", it->path.c_str(), it->message.c_str());
+                }
+                return false;
+        }
+
+#if 0
+        Json::StyledWriter styledWriter;
+        std::cout << styledWriter.write(jv);
+#endif
+
+        return true;
+}
+
+static bool
+read_dictionary(const char *filename)
+{
+        Json::Value config = Json::Value::null;
+        if (!parse_json_from_file (filename, config)) {
+                LOG_E("error parsing JSON file");
+                return false;
+        }
+
+        if (!add_vendors(config)) {
+                LOG_E("error adding vendors");
+                return false;
+        }
+        if (!add_types(config)) {
+                LOG_E("error adding types");
+                return false;
+        }
+        if (!add_avps(config)) {
+                LOG_E("error adding AVPs");
+                return false;
+        }
+        if (!add_applications(config)) {
+                LOG_E("error adding applications");
+                return false;
+        }
+        if (!add_commands(config)) {
+                LOG_E("error adding commands");
+                return false;
+        }
+        if (!add_command_rules(config)) {
+                LOG_E("error adding command rules");
+                return false;
+        }
+        if (!add_avp_rules(config)) {
+                LOG_E("error adding AVP rules");
+                return false;
+        }
+
+        return true;
+}
+
+static int
+dict_json_entry(char * conffile)
+{
+        Json::Value main_config = Json::Value::null;
+        char *filename, *filename_base, *p;
+
+        TRACE_ENTRY("%p", conffile);
+
+        filename_base = strdup(conffile);
+        if (filename_base == NULL) {
+                LOG_E("error initialising JSON dictionary extension: %s", strerror(errno));
+                return 1;
+        }
+        filename = filename_base;
+        while ((p=strsep(&filename, ";")) != NULL) {
+                LOG_D("parsing dictionary '%s'", p);
+                if (!read_dictionary(p)) {
+                        LOG_E("error reading JSON dictionary '%s'", p);
+                        return EINVAL;
+                }
+                LOG_N("loaded JSON dictionary '%s'", p);
+                if (filename == NULL)
+                        break;
+        }
+
+        free(filename_base);
+        LOG_N("Extension 'Dictionary definitions from JSON dictionaries' initialized");
+        return 0;
+}
+
+extern "C" {
+        EXTENSION_ENTRY("dict_json", dict_json_entry);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/dict_json/dict_json_dict_schema.cc	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,164 @@
+const char * dict_json_dict_schema = "\
+{ \n\
+    \"definitions\": { \n\
+        \"content\": { \n\
+            \"type\": \"array\", \n\
+            \"items\": { \n\
+                \"type\": \"object\", \n\
+                \"additionalProperties\": false, \n\
+                \"required\": [ \"AVP\" ], \n\
+                \"properties\": { \n\
+                    \"AVP\": { \"type\": \"string\" }, \n\
+                    \"Vendor\": { \"$ref\": \"#/definitions/unsigned-integer\" }, \n\
+                    \"First\": { \"type\": \"boolean\" }, \n\
+                    \"Min\": { \"$ref\": \"#/definitions/unsigned-integer\" }, \n\
+                    \"Max\": { \"anyOf\": [ { \"type\": \"integer\" }, { \"enum\": [ \"unbounded\" ] } ] } \n\
+                } \n\
+            } \n\
+        }, \n\
+ \n\
+        \"identifier\": { \"type\": \"string\", \"pattern\": \"^[[:print:]]+$\" }, \n\
+        \"type\": { \n\
+            \"enum\": [ \n\
+                \"Address\", \n\
+                \"DiameterIdentity\", \n\
+                \"DiameterURI\", \n\
+                \"Enumerated\", \n\
+                \"Float32\", \n\
+                \"Float64\", \n\
+                \"Grouped\", \n\
+                \"Integer32\", \n\
+                \"Integer64\", \n\
+                \"IPFilterRule\", \n\
+                \"OctetString\", \n\
+                \"Time\", \n\
+                \"Unsigned32\", \n\
+                \"Unsigned64\", \n\
+                \"UTF8String\" \n\
+            ] \n\
+        }, \n\
+        \"unsigned-integer\": { \"type\": \"integer\", \"minimum\": 0 } \n\
+    }, \n\
+     \n\
+    \"type\": \"object\", \n\
+    \"additionalProperties\": false, \n\
+    \"properties\": { \n\
+        \"Vendors\": { \n\
+            \"type\": \"array\", \n\
+            \"items\": { \n\
+                \"type\": \"object\", \n\
+                \"additionalProperties\": false, \n\
+                \"required\": [ \"Code\", \"Name\" ], \n\
+                \"properties\": { \n\
+                    \"Code\": { \"$ref\": \"#/definitions/unsigned-integer\" }, \n\
+                    \"Name\": { \"$ref\": \"#/definitions/identifier\" } \n\
+                } \n\
+            } \n\
+        }, \n\
+        \"Types\": { \n\
+            \"type\": \"array\", \n\
+            \"items\": { \n\
+                \"type\": \"object\", \n\
+                \"additionalProperties\": false, \n\
+                \"required\": [ \"Name\", \"Base\" ], \n\
+                \"properties\": { \n\
+                    \"Name\": { \"type\": \"string\" }, \n\
+                    \"Base\": { \"type\": \"string\" } \n\
+                } \n\
+            } \n\
+        }, \n\
+        \"AVPs\": { \n\
+            \"type\": \"array\", \n\
+            \"items\": { \n\
+                \"type\": \"object\", \n\
+                \"additionalProperties\": false, \n\
+                \"required\": [ \"Code\", \"Name\", \"Type\" ], \n\
+                \"properties\": { \n\
+                    \"Code\": { \"$ref\": \"#/definitions/unsigned-integer\" }, \n\
+                    \"Vendor\": { \"$ref\": \"#/definitions/unsigned-integer\" }, \n\
+                    \"Name\": { \"$ref\": \"#/definitions/identifier\" }, \n\
+                    \"Flags\": { \n\
+                        \"type\": \"object\", \n\
+                        \"additionalProperties\": false, \n\
+                        \"properties\": { \n\
+                            \"Must\": { \"type\": \"string\", \"pattern\": \"^[VMP]*$\" }, \n\
+                            \"MustNot\": { \"type\": \"string\", \"pattern\": \"^[VMP]*$\" } \n\
+                        } \n\
+                    }, \n\
+                    \"Type\": { \"$ref\": \"#/definitions/identifier\" }, \n\
+                    \"EnumValues\": { \n\
+                        \"type\": \"array\", \n\
+                        \"items\": { \n\
+                            \"type\": \"object\", \n\
+                            \"additionalProperties\": false, \n\
+                            \"required\": [ \"Code\", \"Name\" ], \n\
+                            \"properties\": { \n\
+                                \"Code\": { \"anyOf\": [ { \"type\": \"integer\" }, { \"type\": \"number\" }, { \"type\": \"string\" } ] }, \n\
+                                \"Name\": { \"type\": \"string\", \"pattern\": \"^[[:print:]]*$\" } \n\
+                            } \n\
+                        } \n\
+                    } \n\
+                } \n\
+            } \n\
+        }, \n\
+        \"Applications\": { \n\
+            \"type\": \"array\", \n\
+            \"items\": { \n\
+                \"type\": \"object\", \n\
+                \"additionalProperties\": false, \n\
+                \"required\": [ \"Code\", \"Name\" ], \n\
+                \"properties\": { \n\
+                    \"Code\": { \"$ref\": \"#/definitions/unsigned-integer\" }, \n\
+                    \"Name\": { \"$ref\": \"#/definitions/identifier\" } \n\
+                } \n\
+            } \n\
+        }, \n\
+        \"Commands\": { \n\
+            \"type\": \"array\", \n\
+            \"items\": { \n\
+                \"type\": \"object\", \n\
+                \"additionalProperties\": false, \n\
+                \"required\": [ \"Code\", \"Name\" ], \n\
+                \"properties\": { \n\
+                    \"Code\": { \"$ref\": \"#/definitions/unsigned-integer\" }, \n\
+                    \"Name\": { \"$ref\": \"#/definitions/identifier\" }, \n\
+                    \"Application\": { \"$ref\": \"#/definitions/identifier\" }, \n\
+                    \"Flags\": { \n\
+                        \"type\": \"object\", \n\
+                        \"additionalProperties\": false, \n\
+                        \"properties\": { \n\
+                            \"Must\": { \"type\": \"string\", \"pattern\": \"^[RPE]*$\" }, \n\
+                            \"MustNot\": { \"type\": \"string\", \"pattern\": \"^[RPET]*$\" } \n\
+                        } \n\
+                    } \n\
+                } \n\
+            } \n\
+        }, \n\
+        \"CommandRules\": { \n\
+            \"type\": \"array\", \n\
+            \"items\": { \n\
+                \"type\": \"object\", \n\
+                \"additionalProperties\": false, \n\
+                \"required\": [ \"Command\", \"Content\" ], \n\
+                \"properties\": { \n\
+                    \"Command\": { \"type\": \"string\", \"minimum\": 0 }, \n\
+                    \"Content\": { \"$ref\": \"#/definitions/content\" } \n\
+                } \n\
+            } \n\
+        }, \n\
+        \"AVPRules\": { \n\
+            \"type\": \"array\", \n\
+            \"items\": { \n\
+                \"type\": \"object\", \n\
+                \"additionalProperties\": false, \n\
+                \"required\": [ \"AVP\", \"Content\" ], \n\
+                \"properties\": { \n\
+                    \"AVP\": { \"type\": \"string\" }, \n\
+                    \"Vendor\": { \"type\": \"integer\", \"minimum\" : 0 }, \n\
+                    \"Content\": { \"$ref\": \"#/definitions/content\" } \n\
+                } \n\
+            } \n\
+        } \n\
+    } \n\
+} \n\
+";
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/dict_json/dict_json_dict_schema.json	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,162 @@
+{
+    "definitions": {
+        "content": {
+            "type": "array",
+            "items": {
+                "type": "object",
+                "additionalProperties": false,
+                "required": [ "AVP" ],
+                "properties": {
+                    "AVP": { "type": "string" },
+                    "Vendor": { "$ref": "#/definitions/unsigned-integer" },
+                    "First": { "type": "boolean" },
+                    "Min": { "$ref": "#/definitions/unsigned-integer" },
+                    "Max": { "anyOf": [ { "type": "integer" }, { "enum": [ "unbounded" ] } ] }
+                }
+            }
+        },
+
+        "identifier": { "type": "string", "pattern": "^[[:print:]]+$" },
+        "type": {
+            "enum": [
+                "Address",
+                "DiameterIdentity",
+                "DiameterURI",
+                "Enumerated",
+                "Float32",
+                "Float64",
+                "Grouped",
+                "Integer32",
+                "Integer64",
+                "IPFilterRule",
+                "OctetString",
+                "Time",
+                "Unsigned32",
+                "Unsigned64",
+                "UTF8String"
+            ]
+        },
+        "unsigned-integer": { "type": "integer", "minimum": 0 }
+    },
+    
+    "type": "object",
+    "additionalProperties": false,
+    "properties": {
+        "Vendors": {
+            "type": "array",
+            "items": {
+                "type": "object",
+                "additionalProperties": false,
+                "required": [ "Code", "Name" ],
+                "properties": {
+                    "Code": { "$ref": "#/definitions/unsigned-integer" },
+                    "Name": { "$ref": "#/definitions/identifier" }
+                }
+            }
+        },
+        "Types": {
+            "type": "array",
+            "items": {
+                "type": "object",
+                "additionalProperties": false,
+                "required": [ "Name", "Base" ],
+                "properties": {
+                    "Name": { "type": "string" },
+                    "Base": { "type": "string" }
+                }
+            }
+        },
+        "AVPs": {
+            "type": "array",
+            "items": {
+                "type": "object",
+                "additionalProperties": false,
+                "required": [ "Code", "Name", "Type" ],
+                "properties": {
+                    "Code": { "$ref": "#/definitions/unsigned-integer" },
+                    "Vendor": { "$ref": "#/definitions/unsigned-integer" },
+                    "Name": { "$ref": "#/definitions/identifier" },
+                    "Flags": {
+                        "type": "object",
+                        "additionalProperties": false,
+                        "properties": {
+                            "Must": { "type": "string", "pattern": "^[VMP]*$" },
+                            "MustNot": { "type": "string", "pattern": "^[VMP]*$" }
+                        }
+                    },
+                    "Type": { "$ref": "#/definitions/identifier" },
+                    "EnumValues": {
+                        "type": "array",
+                        "items": {
+                            "type": "object",
+                            "additionalProperties": false,
+                            "required": [ "Code", "Name" ],
+                            "properties": {
+                                "Code": { "anyOf": [ { "type": "integer" }, { "type": "number" }, { "type": "string" } ] },
+                                "Name": { "type": "string", "pattern": "^[[:print:]]*$" }
+                            }
+                        }
+                    }
+                }
+            }
+        },
+        "Applications": {
+            "type": "array",
+            "items": {
+                "type": "object",
+                "additionalProperties": false,
+                "required": [ "Code", "Name" ],
+                "properties": {
+                    "Code": { "$ref": "#/definitions/unsigned-integer" },
+                    "Name": { "$ref": "#/definitions/identifier" }
+                }
+            }
+        },
+        "Commands": {
+            "type": "array",
+            "items": {
+                "type": "object",
+                "additionalProperties": false,
+                "required": [ "Code", "Name" ],
+                "properties": {
+                    "Code": { "$ref": "#/definitions/unsigned-integer" },
+                    "Name": { "$ref": "#/definitions/identifier" },
+                    "Application": { "$ref": "#/definitions/identifier" },
+                    "Flags": {
+                        "type": "object",
+                        "additionalProperties": false,
+                        "properties": {
+                            "Must": { "type": "string", "pattern": "^[RPE]*$" },
+                            "MustNot": { "type": "string", "pattern": "^[RPET]*$" }
+                        }
+                    }
+                }
+            }
+        },
+        "CommandRules": {
+            "type": "array",
+            "items": {
+                "type": "object",
+                "additionalProperties": false,
+                "required": [ "Command", "Content" ],
+                "properties": {
+                    "Command": { "type": "string", "minimum": 0 },
+                    "Content": { "$ref": "#/definitions/content" }
+                }
+            }
+        },
+        "AVPRules": {
+            "type": "array",
+            "items": {
+                "type": "object",
+                "additionalProperties": false,
+                "required": [ "AVP", "Content" ],
+                "properties": {
+                    "AVP": { "type": "string" },
+                    "Vendor": { "type": "integer", "minimum" : 0 },
+                    "Content": { "$ref": "#/definitions/content" }
+                }
+            }
+        }
+    }
+}
--- a/extensions/rt_default/rt_default.c	Sun Jan 21 22:25:07 2018 +0800
+++ b/extensions/rt_default/rt_default.c	Sun May 12 23:15:40 2019 +0800
@@ -37,38 +37,101 @@
  * Configurable routing of messages for freeDiameter.
  */
 
+#include <signal.h>
+
 #include "rt_default.h"
 
+#define MODULE_NAME "rt_default"
+
+#include <pthread.h>
+
+static pthread_rwlock_t rtd_lock;
+
+static char *rtd_config_file;
+
 /* The callback called on new messages */
 static int rtd_out(void * cbdata, struct msg ** pmsg, struct fd_list * candidates)
 {
 	struct msg * msg = *pmsg;
 	TRACE_ENTRY("%p %p %p", cbdata, msg, candidates);
+	int ret;
 	
 	CHECK_PARAMS(msg && candidates);
-	
+
+	if (pthread_rwlock_rdlock(&rtd_lock) != 0) {
+		fd_log_notice("%s: read-lock failed, skipping handler", MODULE_NAME);
+		return 0;
+	}
 	/* Simply pass it to the appropriate function */
 	if (FD_IS_LIST_EMPTY(candidates)) {
-		return 0;
+		ret = 0;
 	} else {
-		return rtd_process( msg, candidates );
+		ret = rtd_process( msg, candidates );
 	}
+	if (pthread_rwlock_unlock(&rtd_lock) != 0) {
+		fd_log_notice("%s: read-unlock failed after rtd_out, exiting", MODULE_NAME);
+		exit(1);
+	}
+	return ret;
 }
 
 /* handler */
 static struct fd_rt_out_hdl * rtd_hdl = NULL;
 
+static volatile int in_signal_handler = 0;
+
+/* signal handler */
+static void sig_hdlr(void)
+{
+	if (in_signal_handler) {
+		fd_log_error("%s: already handling a signal, ignoring new one", MODULE_NAME);
+		return;
+	}
+	in_signal_handler = 1;
+
+	if (pthread_rwlock_wrlock(&rtd_lock) != 0) {
+		fd_log_error("%s: locking failed, aborting config reload", MODULE_NAME);
+		return;
+	}
+	rtd_conf_reload(rtd_config_file);
+	if (pthread_rwlock_unlock(&rtd_lock) != 0) {
+		fd_log_error("%s: unlocking failed after config reload, exiting", MODULE_NAME);
+		exit(1);
+	}		
+
+	fd_log_notice("%s: reloaded configuration", MODULE_NAME);
+
+	in_signal_handler = 0;
+}
+
+
 /* entry point */
 static int rtd_entry(char * conffile)
 {
 	TRACE_ENTRY("%p", conffile);
-	
+
+	rtd_config_file = conffile;
+	pthread_rwlock_init(&rtd_lock, NULL);
+
+	if (pthread_rwlock_wrlock(&rtd_lock) != 0) {
+		fd_log_notice("%s: write-lock failed, aborting", MODULE_NAME);
+		return EDEADLK;
+	}
+
 	/* Initialize the repo */
 	CHECK_FCT( rtd_init() );
 	
 	/* Parse the configuration file */
 	CHECK_FCT( rtd_conf_handle(conffile) );
-	
+
+	if (pthread_rwlock_unlock(&rtd_lock) != 0) {
+		fd_log_notice("%s: write-unlock failed, aborting", MODULE_NAME);
+		return EDEADLK;
+	}
+
+	/* Register reload callback */
+	CHECK_FCT(fd_event_trig_regcb(SIGUSR1, MODULE_NAME, sig_hdlr));
+
 #if 0
 	/* Dump the rules */
 	rtd_dump();
@@ -91,9 +154,11 @@
 	
 	/* Destroy the data */
 	rtd_fini();
-	
+
+	pthread_rwlock_destroy(&rtd_lock);
+
 	/* Done */
 	return ;
 }
 
-EXTENSION_ENTRY("rt_default", rtd_entry);
+EXTENSION_ENTRY(MODULE_NAME, rtd_entry);
--- a/extensions/rt_default/rt_default.h	Sun Jan 21 22:25:07 2018 +0800
+++ b/extensions/rt_default/rt_default.h	Sun May 12 23:15:40 2019 +0800
@@ -82,5 +82,8 @@
 /* Process a message & peer list through the rules repository, updating the scores */
 int rtd_process( struct msg * msg, struct fd_list * candidates );
 
+/* Reload the config file */
+void rtd_conf_reload(char *config_file);
+
 /* For debug: dump the rule repository */
 void rtd_dump(void);
--- a/extensions/rt_default/rtd_conf.y	Sun Jan 21 22:25:07 2018 +0800
+++ b/extensions/rt_default/rtd_conf.y	Sun May 12 23:15:40 2019 +0800
@@ -54,6 +54,7 @@
 
 /* Forward declaration */
 int yyparse(char * conffile);
+void rtd_confrestart(FILE *input_file);
 
 static int rules_added = 0;
 
@@ -65,25 +66,27 @@
 	
 	TRACE_ENTRY("%p", conffile);
 	
-	TRACE_DEBUG (FULL, "Parsing configuration file: %s...", conffile);
-	
+	TRACE_DEBUG (FULL, "rt_default: Parsing configuration file: %s...", conffile);
+
+	rules_added = 0;
 	rtd_confin = fopen(conffile, "r");
 	if (rtd_confin == NULL) {
 		ret = errno;
 		fd_log_debug("Unable to open extension configuration file %s for reading: %s", conffile, strerror(ret));
-		TRACE_DEBUG (INFO, "Error occurred, message logged -- configuration file.");
+		TRACE_DEBUG (INFO, "rt_default: Error occurred, message logged -- configuration file.");
 		return ret;
 	}
 
+	rtd_confrestart(rtd_confin);
 	ret = yyparse(conffile);
 
 	fclose(rtd_confin);
 
 	if (ret != 0) {
-		TRACE_DEBUG (INFO, "Unable to parse the configuration file.");
+		TRACE_DEBUG (INFO, "rt_default: Unable to parse the configuration file.");
 		return EINVAL;
 	} else {
-		TRACE_DEBUG(FULL, "Added %d RULES routing entries successfully.", rules_added);
+		TRACE_DEBUG(INFO, "rt_default: Added %d RULES routing entries successfully.", rules_added);
 	}
 	
 	return 0;
@@ -95,7 +98,7 @@
 /* Function to report the errors */
 void yyerror (YYLTYPE *ploc, char * conffile, char const *s)
 {
-	TRACE_DEBUG(INFO, "Error in configuration parsing");
+	TRACE_DEBUG(INFO, "rt_default: Error in configuration parsing");
 	
 	if (ploc->first_line != ploc->last_line)
 		fd_log_debug("%s:%d.%d-%d.%d : %s", conffile, ploc->first_line, ploc->first_column, ploc->last_line, ploc->last_column, s);
--- a/extensions/rt_default/rtd_rules.c	Sun Jan 21 22:25:07 2018 +0800
+++ b/extensions/rt_default/rtd_rules.c	Sun May 12 23:15:40 2019 +0800
@@ -46,7 +46,7 @@
  *
  *  Under each TARGET element, we have the list of RULES that are defined for this target, ordered by CRITERIA type, then is_regex, then string value.
  *
- * Note: Except during configuration parsing and module termination, the lists are only ever accessed read-only, so we do not need a lock.
+ * Note: Access these only when holding rtd_lock; config reload may change the underlying data.
  */
 
 /* Structure to hold the data that is used for matching. */
@@ -389,19 +389,23 @@
 	return 0;
 }
 
-/* Destroy the module's data */
-void rtd_fini(void)
+static void free_targets(void)
 {
 	int i;
-	
-	TRACE_ENTRY();
 
 	for (i = 0; i < RTD_TAR_MAX; i++) {
 		while (!FD_IS_LIST_EMPTY(&TARGETS[i])) {
 			del_target((struct target *) TARGETS[i].next);
 		}
 	}
-	
+}
+
+/* Destroy the module's data */
+void rtd_fini(void)
+{
+	TRACE_ENTRY();
+
+	free_targets();
 }
 
 /* Add a new rule in the repository. this is called when the configuration file is being parsed */
@@ -494,6 +498,40 @@
 	return 0;
 }
 
+void rtd_conf_reload(char *config_file)
+{
+	/* save old config in case reload goes wrong */
+	struct fd_list old_config[RTD_TAR_MAX];
+	int i;
+
+	for (i = 0; i < RTD_TAR_MAX; i++) {
+		old_config[i] = TARGETS[i];
+	}
+	memset(TARGETS, 0, sizeof(*TARGETS) * RTD_TAR_MAX);
+	for (i = 0; i < RTD_TAR_MAX; i++) {
+		fd_list_init(&TARGETS[i], NULL);
+	}
+
+	if (rtd_conf_handle(config_file) != 0) {
+		fd_log_notice("rt_default: error reloading configuration, restoring previous configuration");
+		free_targets();
+		for (i = 0; i < RTD_TAR_MAX; i++) {
+			TARGETS[i] = old_config[i];
+		}
+	} else {
+		/* this has to be done in this weird way because the items contain back pointers referencing TARGETS */
+		struct fd_list save_config[RTD_TAR_MAX];
+		for (i = 0; i < RTD_TAR_MAX; i++) {
+			save_config[i] = TARGETS[i];
+			TARGETS[i] = old_config[i];
+		}
+		free_targets();
+		for (i = 0; i < RTD_TAR_MAX; i++) {
+			TARGETS[i] = save_config[i];
+		}
+	}
+}
+
 /* Check if a message and list of eligible candidate match any of our rules, and update its score according to it. */
 int rtd_process( struct msg * msg, struct fd_list * candidates )
 {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/rt_deny_by_size/CMakeLists.txt	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,29 @@
+# The rt_deny_by_size extension
+PROJECT("Routing extension to deny messages that are over a particular size" C)
+
+# Parser files
+BISON_FILE(rt_deny_by_size_conf.y)
+FLEX_FILE(rt_deny_by_size_conf.l)
+SET_SOURCE_FILES_PROPERTIES(lex.rt_deny_by_size_conf.c rt_deny_by_size_conf.tab.c PROPERTIES COMPILE_FLAGS "-I ${CMAKE_CURRENT_SOURCE_DIR}")
+
+# List of source files
+SET( RT_DENY_BY_SIZE_SRC
+	rt_deny_by_size.c
+	rt_deny_by_size.h
+	lex.rt_deny_by_size_conf.c
+	rt_deny_by_size_conf.tab.c
+	rt_deny_by_size_conf.tab.h
+)
+
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
+
+# Compile these files as a freeDiameter extension
+FD_ADD_EXTENSION(rt_deny_by_size ${RT_DENY_BY_SIZE_SRC})
+
+####
+## INSTALL section ##
+
+# We install with the daemon component because it is a base feature.
+INSTALL(TARGETS rt_deny_by_size
+	LIBRARY DESTINATION ${INSTALL_EXTENSIONS_SUFFIX}
+	COMPONENT freeDiameter-daemon)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/rt_deny_by_size/rt_deny_by_size.c	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,122 @@
+/*********************************************************************************************************
+* Software License Agreement (BSD License)                                                               *
+* Author: Thomas Klausner <tk@giga.or.at>								 *
+*													 *
+* Copyright (c) 2018, Thomas Klausner									 *
+* All rights reserved.											 *
+* 													 *
+* Written under contract by Effortel Technologies SA, http://effortel.com/                               *
+* 													 *
+* Redistribution and use of this software in source and binary forms, with or without modification, are  *
+* permitted provided that the following conditions are met:						 *
+* 													 *
+* * Redistributions of source code must retain the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer.										 *
+*    													 *
+* * Redistributions in binary form must reproduce the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer in the documentation and/or other						 *
+*   materials provided with the distribution.								 *
+* 													 *
+* * Neither the name of the WIDE Project or NICT nor the 						 *
+*   names of its contributors may be used to endorse or 						 *
+*   promote products derived from this software without 						 *
+*   specific prior written permission of WIDE Project and 						 *
+*   NICT.												 *
+* 													 *
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
+* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
+* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 	 *
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 	 *
+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
+* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   *
+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.								 *
+*********************************************************************************************************/
+
+#include <signal.h>
+
+/* See doc/rt_deny_by_size.conf.sample for more details about the features of this extension */
+#include "rt_deny_by_size.h"
+
+/* The configuration structure */
+struct rt_deny_by_size_conf rt_deny_by_size_conf;
+
+static struct fd_rt_fwd_hdl * rt__deny_by_size_hdl = NULL;
+static char *config_file = NULL;
+#define MODULE_NAME "rt_deny_by_size"
+#define DEFAULT_MAX_SIZE 4096;
+
+/* the routing callback that handles all the tasks of this extension */
+static int rt_deny_by_size_fwd_cb(void * cbdata, struct msg ** pmsg)
+{
+	struct msg_hdr * hdr;
+
+	/* Get the header of the message */
+	CHECK_FCT(fd_msg_hdr(*pmsg, &hdr));
+
+	if (hdr->msg_length > rt_deny_by_size_conf.maximum_size) {
+		if (hdr->msg_flags & CMD_FLAG_REQUEST) {
+			/* Create an answer */
+			CHECK_FCT(fd_msg_new_answer_from_req(fd_g_config->cnf_dict, pmsg, MSGFL_ANSW_ERROR));
+			CHECK_FCT(fd_msg_rescode_set(*pmsg, "DIAMETER_UNABLE_TO_COMPLY", "[rt_deny_by_size] Message is too big", NULL, 2));
+			CHECK_FCT( fd_msg_send(pmsg, NULL, NULL) );
+		}
+	}
+
+	return 0;
+}
+
+static void sig_hdlr(void)
+{
+	int old_maximum_size;
+
+	old_maximum_size = rt_deny_by_size_conf.maximum_size;
+	if (rt_deny_by_size_conf_handle(config_file) != 0) {
+		fd_log_error("%s: error during config file reload, restoring previous value", MODULE_NAME);
+		rt_deny_by_size_conf.maximum_size = old_maximum_size;
+	}
+	fd_log_notice("%s: reloaded configuration, maximum size now %d", MODULE_NAME, rt_deny_by_size_conf.maximum_size);
+}
+
+/* entry point */
+static int rt_deny_by_size_entry(char * conffile)
+{
+	TRACE_ENTRY("%p", conffile);
+
+	config_file = conffile;
+	/* Initialize the configuration */
+	memset(&rt_deny_by_size_conf, 0, sizeof(rt_deny_by_size_conf));
+	rt_deny_by_size_conf.maximum_size = DEFAULT_MAX_SIZE;
+
+	/* Parse the configuration file */
+	CHECK_FCT(rt_deny_by_size_conf_handle(config_file));
+
+	/* Register the callback */
+	CHECK_FCT(fd_rt_fwd_register(rt_deny_by_size_fwd_cb, NULL, RT_FWD_REQ, &rt__deny_by_size_hdl));
+
+	/* Register reload callback */
+	CHECK_FCT(fd_event_trig_regcb(SIGUSR1, MODULE_NAME, sig_hdlr));
+
+	fd_log_notice("Extension 'Deny by size' initialized with maximum size %d", rt_deny_by_size_conf.maximum_size);
+
+	/* We're done */
+	return 0;
+}
+
+/* Unload */
+void fd_ext_fini(void)
+{
+	TRACE_ENTRY();
+
+	/* Unregister the cb */
+	if (rt__deny_by_size_hdl) {
+		CHECK_FCT_DO(fd_rt_fwd_unregister(rt__deny_by_size_hdl, NULL), /* continue */);
+	}
+
+	/* Done */
+	return ;
+}
+
+EXTENSION_ENTRY(MODULE_NAME, rt_deny_by_size_entry);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/rt_deny_by_size/rt_deny_by_size.h	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,53 @@
+/*********************************************************************************************************
+* Software License Agreement (BSD License)                                                               *
+* Author: Thomas Klausner <tk@giga.or.at>								 *
+*													 *
+* Copyright (c) 2018, Thomas Klausner									 *
+* All rights reserved.											 *
+* 													 *
+* Written under contract by Effortel Technologies SA, http://effortel.com/                               *
+* 													 *
+* Redistribution and use of this software in source and binary forms, with or without modification, are  *
+* permitted provided that the following conditions are met:						 *
+* 													 *
+* * Redistributions of source code must retain the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer.										 *
+*    													 *
+* * Redistributions in binary form must reproduce the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer in the documentation and/or other						 *
+*   materials provided with the distribution.								 *
+* 													 *
+* * Neither the name of the WIDE Project or NICT nor the 						 *
+*   names of its contributors may be used to endorse or 						 *
+*   promote products derived from this software without 						 *
+*   specific prior written permission of WIDE Project and 						 *
+*   NICT.												 *
+* 													 *
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
+* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
+* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 	 *
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 	 *
+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
+* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   *
+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.								 *
+*********************************************************************************************************/
+
+/*
+ *  See the rt_deny_by_size.conf.sample file for the format of the configuration file.
+ */
+
+/* FreeDiameter's common include file */
+#include <freeDiameter/extension.h>
+
+
+/* Parse the configuration file */
+int rt_deny_by_size_conf_handle(char * conffile);
+
+/* The configuration structure */
+extern struct rt_deny_by_size_conf {
+	int maximum_size;
+} rt_deny_by_size_conf;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/rt_deny_by_size/rt_deny_by_size_conf.l	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,107 @@
+/*********************************************************************************************************
+* Software License Agreement (BSD License)                                                               *
+* Authors: Thomas Klausner <tk@giga.or.at> based on code by Sebastien Decugis <sdecugis@freediameter.net>*
+*													 *
+* Copyright (c) 2018, Thomas Klausner									 *
+* Copyright (c) 2013, WIDE Project and NICT								 *
+* All rights reserved.											 *
+* 													 *
+* Written under contract by Effortel Technologies SA, http://effortel.com/                               *
+* 													 *
+* Redistribution and use of this software in source and binary forms, with or without modification, are  *
+* permitted provided that the following conditions are met:						 *
+* 													 *
+* * Redistributions of source code must retain the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer.										 *
+*    													 *
+* * Redistributions in binary form must reproduce the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer in the documentation and/or other						 *
+*   materials provided with the distribution.								 *
+* 													 *
+* * Neither the name of the WIDE Project or NICT nor the 						 *
+*   names of its contributors may be used to endorse or 						 *
+*   promote products derived from this software without 						 *
+*   specific prior written permission of WIDE Project and 						 *
+*   NICT.												 *
+* 													 *
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
+* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
+* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 	 *
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 	 *
+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
+* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   *
+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.								 *
+*********************************************************************************************************/
+
+/* Tokenizer
+ *
+ */
+
+%{
+#include "rt_deny_by_size.h"
+#include "rt_deny_by_size_conf.tab.h"
+
+/* Update the column information */
+#define YY_USER_ACTION { 						\
+	yylloc->first_column = yylloc->last_column + 1; 		\
+	yylloc->last_column = yylloc->first_column + yyleng - 1;	\
+}
+
+/* Avoid warning with newer flex */
+#define YY_NO_INPUT
+
+%}
+
+qstring		\"[^\"\n]*\"
+
+
+%option bison-bridge bison-locations
+%option noyywrap
+%option nounput
+
+%%
+
+	/* Update the line count */
+\n			{
+				yylloc->first_line++;
+				yylloc->last_line++;
+				yylloc->last_column=0;
+			}
+
+	/* Eat all spaces but not new lines */
+([[:space:]]{-}[\n])+	;
+	/* Eat all comments */
+#.*$			;
+
+	/* Recognize any integer */
+[-]?[[:digit:]]+	{
+				/* Convert this to an integer value */
+				int ret=0;
+				ret = sscanf(yytext, "%i", &yylval->integer);
+				if (ret != 1) {
+					/* No matching: an error occurred */
+					TRACE_ERROR("Unable to convert the value '%s' to a valid number: %s", yytext, strerror(errno));
+					return LEX_ERROR; /* trig an error in yacc parser */
+					/* Maybe we could REJECT instead of failing here? */
+				}
+				return INTEGER;
+			}
+
+
+
+	/* The key words */
+(?i:"MaximumSize")	 	{	return MAXIMUMSIZE;	}
+
+	/* Valid single characters for yyparse */
+[=;]			{ return yytext[0]; }
+
+	/* Unrecognized sequence, if it did not match any previous pattern */
+[^[:space:]=;\n]+	{
+				TRACE_ERROR("Unrecognized text on line %d col %d: '%s'.", yylloc->first_line, yylloc->first_column, yytext);
+			 	return LEX_ERROR;
+			}
+
+%%
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/rt_deny_by_size/rt_deny_by_size_conf.y	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,147 @@
+/*********************************************************************************************************
+* Software License Agreement (BSD License)                                                               *
+* Author: Thomas Klausner <tk@giga.or.at>								 *
+*													 *
+* Copyright (c) 2018, Thomas Klausner									 *
+* All rights reserved.											 *
+* 													 *
+* Written under contract by Effortel Technologies SA, http://effortel.com/                               *
+* 													 *
+* Redistribution and use of this software in source and binary forms, with or without modification, are  *
+* permitted provided that the following conditions are met:						 *
+* 													 *
+* * Redistributions of source code must retain the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer.										 *
+*    													 *
+* * Redistributions in binary form must reproduce the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer in the documentation and/or other						 *
+*   materials provided with the distribution.								 *
+* 													 *
+* * Neither the name of the WIDE Project or NICT nor the 						 *
+*   names of its contributors may be used to endorse or 						 *
+*   promote products derived from this software without 						 *
+*   specific prior written permission of WIDE Project and 						 *
+*   NICT.												 *
+* 													 *
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
+* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
+* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 	 *
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 	 *
+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
+* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   *
+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.								 *
+*********************************************************************************************************/
+
+/* Yacc extension's configuration parser.
+ */
+
+/* For development only : */
+%debug
+%error-verbose
+
+/* The parser receives the configuration file filename as parameter */
+%parse-param {char * conffile}
+
+/* Keep track of location */
+%locations
+%pure-parser
+
+%{
+#include "rt_deny_by_size.h"
+#include "rt_deny_by_size_conf.tab.h"
+
+/* Forward declaration */
+int rt_deny_by_size_confparse(char *conffile);
+void rt_deny_by_size_confrestart(FILE *input_file);
+
+/* Parse the configuration file */
+int rt_deny_by_size_conf_handle(char * conffile)
+{
+	extern FILE *rt_deny_by_size_confin;
+	int ret;
+
+	TRACE_ENTRY("%p", conffile);
+
+	TRACE_DEBUG(FULL, "Parsing configuration file: %s...", conffile);
+
+	rt_deny_by_size_confin = fopen(conffile, "r");
+	if (rt_deny_by_size_confin == NULL) {
+		ret = errno;
+		TRACE_ERROR("Unable to open extension configuration file %s for reading: %s", conffile, strerror(ret));
+		return ret;
+	}
+
+	rt_deny_by_size_confrestart(rt_deny_by_size_confin);
+	ret = rt_deny_by_size_confparse(conffile);
+
+	fclose(rt_deny_by_size_confin);
+
+	if (ret != 0) {
+		TRACE_ERROR( "Unable to parse the configuration file %s.", conffile);
+		return EINVAL;
+	} else {
+		TRACE_DEBUG(FULL, "[rt__deny_by_size] MaximumSize: %d.", rt_deny_by_size_conf.maximum_size);
+	}
+
+	return 0;
+}
+
+/* The Lex parser prototype */
+int rt_deny_by_size_conflex(YYSTYPE *lvalp, YYLTYPE *llocp);
+
+/* Function to report the errors */
+void yyerror (YYLTYPE *ploc, char * conffile, char const *s)
+{
+	TRACE_DEBUG(INFO, "Error in configuration parsing");
+
+	if (ploc->first_line != ploc->last_line)
+		fd_log_error("%s:%d.%d-%d.%d : %s", conffile, ploc->first_line, ploc->first_column, ploc->last_line, ploc->last_column, s);
+	else if (ploc->first_column != ploc->last_column)
+		fd_log_error("%s:%d.%d-%d : %s", conffile, ploc->first_line, ploc->first_column, ploc->last_column, s);
+	else
+		fd_log_error("%s:%d.%d : %s", conffile, ploc->first_line, ploc->first_column, s);
+}
+
+%}
+
+/* Values returned by lex for token */
+%union {
+	int		integer;
+}
+
+/* In case of error in the lexical analysis */
+%token 		LEX_ERROR
+
+/* A (de)quoted string (malloc'd in lex parser; it must be freed after use) */
+%token <integer> INTEGER
+
+/* Tokens */
+%token 		MAXIMUMSIZE
+
+
+/* -------------------------------------- */
+%%
+
+	/* The grammar definition */
+conffile:		/* empty is OK */
+			| conffile size
+			| conffile errors
+			{
+				yyerror(&yylloc, conffile, "An error occurred while parsing the configuration file");
+				YYABORT;
+			}
+			;
+
+			/* Lexical or syntax error */
+errors:			LEX_ERROR
+			| error
+			;
+
+size:		MAXIMUMSIZE '=' INTEGER ';'
+			{
+				rt_deny_by_size_conf.maximum_size=$3;
+			}
+			;
--- a/extensions/rt_ereg/rtereg.c	Sun Jan 21 22:25:07 2018 +0800
+++ b/extensions/rt_ereg/rtereg.c	Sun May 12 23:15:40 2019 +0800
@@ -33,16 +33,26 @@
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.								 *
 *********************************************************************************************************/
 
-/* 
+/*
  * This extension allows to perform some pattern-matching on an AVP
  * and send the message to a server accordingly.
  * See rt_ereg.conf.sample file for the format of the configuration file.
  */
 
+#include <pthread.h>
+#include <signal.h>
+
 #include "rtereg.h"
 
+static pthread_rwlock_t rte_lock;
+
+#define MODULE_NAME "rt_ereg"
+
+static char *rt_ereg_config_file;
+
 /* The configuration structure */
-struct rtereg_conf rtereg_conf;
+struct rtereg_conf *rtereg_conf;
+int rtereg_conf_size;
 
 #ifndef HAVE_REG_STARTEND
 static char * buf = NULL;
@@ -50,18 +60,41 @@
 static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
 #endif /* HAVE_REG_STARTEND */
 
-static int proceed(char * value, size_t len, struct fd_list * candidates)
+static int rtereg_init(void);
+static int rtereg_init_config(void);
+static void rtereg_fini(void);
+
+void rtereg_conf_free(struct rtereg_conf *config_struct, int config_size)
+{
+	int i, j;
+
+    	/* Destroy the data */
+	for (j=0; j<config_size; j++) {
+		if (config_struct[j].rules) {
+			for (i = 0; i < config_struct[j].rules_nb; i++) {
+				free(config_struct[j].rules[i].pattern);
+				free(config_struct[j].rules[i].server);
+				regfree(&config_struct[j].rules[i].preg);
+			}
+		}
+		free(config_struct[j].avps);
+		free(config_struct[j].rules);
+	}
+	free(config_struct);
+}
+
+static int proceed(char * value, size_t len, struct fd_list * candidates, int conf)
 {
 	int i;
-	
-	for (i = 0; i < rtereg_conf.rules_nb; i++) {
+
+	for (i = 0; i < rtereg_conf[conf].rules_nb; i++) {
 		/* Does this pattern match the value? */
-		struct rtereg_rule * r = &rtereg_conf.rules[i];
+		struct rtereg_rule * r = &rtereg_conf[conf].rules[i];
 		int err = 0;
 		struct fd_list * c;
-		
+
 		TRACE_DEBUG(ANNOYING, "Attempt pattern matching of '%.*s' with rule '%s'", (int)len, value, r->pattern);
-		
+
 		#ifdef HAVE_REG_STARTEND
 		{
 			regmatch_t pmatch[1];
@@ -76,10 +109,10 @@
 			err = regexec(&r->preg, value, 0, NULL, 0);
 		}
 		#endif /* HAVE_REG_STARTEND */
-		
+
 		if (err == REG_NOMATCH)
 			continue;
-			
+
 		if (err != 0) {
 			char * errstr;
 			size_t bl;
@@ -99,10 +132,10 @@
 
 			/* Free the buffer, return the error */
 			free(errstr);
-			
+
 			return (err == REG_ESPACE) ? ENOMEM : EINVAL;
 		}
-		
+
 		/* From this point, the expression matched the AVP value */
 		TRACE_DEBUG(FULL, "[rt_ereg] Match: '%s' to value '%.*s' => '%s' += %d",
 					r->pattern,
@@ -110,7 +143,7 @@
 					value,
 					r->server,
 					r->score);
-		
+
 		for (c = candidates->next; c != candidates; c = c->next) {
 			struct rtd_candidate * cand = (struct rtd_candidate *)c;
 
@@ -120,106 +153,240 @@
 			}
 		}
 	};
-	
+
+	return 0;
+}
+
+static int find_avp(msg_or_avp *where, int conf_index, int level, struct fd_list * candidates)
+{
+	struct dict_object *what;
+	struct dict_avp_data dictdata;
+	struct avp *nextavp = NULL;
+	struct avp_hdr *avp_hdr = NULL;
+
+	/* iterate over all AVPs and try to find a match */
+//	for (i = 0; i<rtereg_conf[j].level; i++) {
+	if (level > rtereg_conf[conf_index].level) {
+		TRACE_DEBUG(INFO, "internal error, dug too deep");
+		return 1;
+	}
+	what = rtereg_conf[conf_index].avps[level];
+
+	CHECK_FCT(fd_dict_getval(what, &dictdata));
+	CHECK_FCT(fd_msg_browse(where, MSG_BRW_FIRST_CHILD, (void *)&nextavp, NULL));
+	while (nextavp) {
+		CHECK_FCT(fd_msg_avp_hdr(nextavp, &avp_hdr));
+		if ((avp_hdr->avp_code == dictdata.avp_code) && (avp_hdr->avp_vendor == dictdata.avp_vendor)) {
+			if (level != rtereg_conf[conf_index].level - 1) {
+				TRACE_DEBUG(INFO, "[rt_ereg] found grouped AVP %d (vendor %d), digging deeper", avp_hdr->avp_code, avp_hdr->avp_vendor);
+				CHECK_FCT(find_avp(nextavp, conf_index, level+1, candidates));
+			} else {
+				TRACE_DEBUG(INFO, "[rt_ereg] found AVP %d (vendor %d)", avp_hdr->avp_code, avp_hdr->avp_vendor);
+				if (avp_hdr->avp_value != NULL) {
+#ifndef HAVE_REG_STARTEND
+					int ret;
+
+					/* Lock the buffer */
+					CHECK_POSIX( pthread_mutex_lock(&mtx) );
+
+					/* Augment the buffer if needed */
+					if (avp_hdr->avp_value->os.len >= bufsz) {
+						CHECK_MALLOC_DO( buf = realloc(buf, avp_hdr->avp_value->os.len + 1),
+							{ pthread_mutex_unlock(&mtx); return ENOMEM; } );
+					}
+
+					/* Copy the AVP value */
+					memcpy(buf, avp_hdr->avp_value->os.data, avp_hdr->avp_value->os.len);
+					buf[avp_hdr->avp_value->os.len] = '\0';
+
+					/* Now apply the rules */
+					ret = proceed(buf, avp_hdr->avp_value->os.len, candidates, conf_index);
+
+					CHECK_POSIX(pthread_mutex_unlock(&mtx));
+
+					CHECK_FCT(ret);
+#else /* HAVE_REG_STARTEND */
+					CHECK_FCT( proceed((char *) avp_hdr->avp_value->os.data, avp_hdr->avp_value->os.len, candidates, conf_index) );
+#endif /* HAVE_REG_STARTEND */
+				}
+			}
+		}
+		CHECK_FCT(fd_msg_browse(nextavp, MSG_BRW_NEXT, (void *)&nextavp, NULL));
+	}
+
 	return 0;
 }
 
 /* The callback called on new messages */
 static int rtereg_out(void * cbdata, struct msg ** pmsg, struct fd_list * candidates)
 {
-	struct msg * msg = *pmsg;
-	struct avp * avp = NULL;
-	
-	TRACE_ENTRY("%p %p %p", cbdata, msg, candidates);
-	
-	CHECK_PARAMS(msg && candidates);
-	
-	/* Check if it is worth processing the message */
-	if (FD_IS_LIST_EMPTY(candidates)) {
+	msg_or_avp *where;
+	int j, ret;
+
+	TRACE_ENTRY("%p %p %p", cbdata, *pmsg, candidates);
+
+	CHECK_PARAMS(pmsg && *pmsg && candidates);
+
+	if (pthread_rwlock_rdlock(&rte_lock) != 0) {
+		fd_log_notice("%s: read-lock failed, skipping handler", MODULE_NAME);
 		return 0;
 	}
-	
-	/* Now search the AVP in the message */
-	CHECK_FCT( fd_msg_search_avp ( msg, rtereg_conf.avp, &avp ) );
-	if (avp != NULL) {
-		struct avp_hdr * ahdr = NULL;
-		CHECK_FCT( fd_msg_avp_hdr ( avp, &ahdr ) );
-		if (ahdr->avp_value != NULL) {
-#ifndef HAVE_REG_STARTEND
-			int ret;
-		
-			/* Lock the buffer */
-			CHECK_POSIX( pthread_mutex_lock(&mtx) );
-			
-			/* Augment the buffer if needed */
-			if (ahdr->avp_value->os.len >= bufsz) {
-				CHECK_MALLOC_DO( buf = realloc(buf, ahdr->avp_value->os.len + 1), 
-					{ pthread_mutex_unlock(&mtx); return ENOMEM; } );
+	ret = 0;
+	/* Check if it is worth processing the message */
+	if (!FD_IS_LIST_EMPTY(candidates)) {
+		/* Now search the AVPs in the message */
+
+		for (j=0; j<rtereg_conf_size; j++) {
+			where = *pmsg;
+			TRACE_DEBUG(INFO, "[rt_ereg] iterating over AVP group %d", j);
+			if ((ret=find_avp(where, j, 0, candidates)) != 0) {
+				break;
 			}
-			
-			/* Copy the AVP value */
-			memcpy(buf, ahdr->avp_value->os.data, ahdr->avp_value->os.len);
-			buf[ahdr->avp_value->os.len] = '\0';
-			
-			/* Now apply the rules */
-			ret = proceed(buf, ahdr->avp_value->os.len, candidates);
-			
-			CHECK_POSIX(pthread_mutex_unlock(&mtx));
-			
-			CHECK_FCT(ret);
-#else /* HAVE_REG_STARTEND */
-			CHECK_FCT( proceed((char *) ahdr->avp_value->os.data, ahdr->avp_value->os.len, candidates) );
-#endif /* HAVE_REG_STARTEND */
 		}
 	}
-	
-	return 0;
+	if (pthread_rwlock_unlock(&rte_lock) != 0) {
+		fd_log_notice("%s: read-unlock failed after rtereg_out, exiting", MODULE_NAME);
+		exit(1);
+	}
+
+	return ret;
 }
 
 /* handler */
 static struct fd_rt_out_hdl * rtereg_hdl = NULL;
 
+static volatile int in_signal_handler = 0;
+
+/* signal handler */
+static void sig_hdlr(void)
+{
+	struct rtereg_conf *old_config;
+	int old_config_size;
+
+	if (in_signal_handler) {
+		fd_log_error("%s: already handling a signal, ignoring new one", MODULE_NAME);
+		return;
+	}
+	in_signal_handler = 1;
+
+	if (pthread_rwlock_wrlock(&rte_lock) != 0) {
+		fd_log_error("%s: locking failed, aborting config reload", MODULE_NAME);
+		return;
+	}
+
+	/* save old config in case reload goes wrong */
+	old_config = rtereg_conf;
+	old_config_size = rtereg_conf_size;
+	rtereg_conf = NULL;
+	rtereg_conf_size = 0;
+
+	if (rtereg_init_config() != 0) {
+		fd_log_notice("%s: error reloading configuration, restoring previous configuration", MODULE_NAME);
+		rtereg_conf = old_config;
+		rtereg_conf_size = old_config_size;
+	} else {
+		rtereg_conf_free(old_config, old_config_size);
+	}
+
+	if (pthread_rwlock_unlock(&rte_lock) != 0) {
+		fd_log_error("%s: unlocking failed after config reload, exiting", MODULE_NAME);
+		exit(1);
+	}
+
+	fd_log_notice("%s: reloaded configuration, %d AVP group%s defined", MODULE_NAME, rtereg_conf_size, rtereg_conf_size != 1 ? "s" : "");
+
+	in_signal_handler = 0;
+}
+
 /* entry point */
 static int rtereg_entry(char * conffile)
 {
 	TRACE_ENTRY("%p", conffile);
-	
+
+	rt_ereg_config_file = conffile;
+
+	if (rtereg_init() != 0) {
+	    return 1;
+	}
+
+	/* Register reload callback */
+	CHECK_FCT(fd_event_trig_regcb(SIGUSR1, MODULE_NAME, sig_hdlr));
+
+	fd_log_notice("%s: configured, %d AVP group%s defined", MODULE_NAME, rtereg_conf_size, rtereg_conf_size != 1 ? "s" : "");
+
+	return 0;
+}
+
+static int rtereg_init_config(void)
+{
 	/* Initialize the configuration */
-	memset(&rtereg_conf, 0, sizeof(rtereg_conf));
-	
+	if ((rtereg_conf=malloc(sizeof(*rtereg_conf))) == NULL) {
+	    TRACE_DEBUG(INFO, "malloc failured");
+	    return 1;
+	}
+	rtereg_conf_size = 1;
+	memset(rtereg_conf, 0, sizeof(*rtereg_conf));
+
 	/* Parse the configuration file */
-	CHECK_FCT( rtereg_conf_handle(conffile) );
-	
+	CHECK_FCT( rtereg_conf_handle(rt_ereg_config_file) );
+
+	return 0;
+}
+
+
+/* Load */
+static int rtereg_init(void)
+{
+	int ret;
+
+	pthread_rwlock_init(&rte_lock, NULL);
+
+	if (pthread_rwlock_wrlock(&rte_lock) != 0) {
+		fd_log_notice("%s: write-lock failed, aborting", MODULE_NAME);
+		return EDEADLK;
+	}
+
+	if ((ret=rtereg_init_config()) != 0) {
+		pthread_rwlock_unlock(&rte_lock);
+		return ret;
+	}
+
+	if (pthread_rwlock_unlock(&rte_lock) != 0) {
+		fd_log_notice("%s: write-unlock failed, aborting", MODULE_NAME);
+		return EDEADLK;
+	}
+
 	/* Register the callback */
 	CHECK_FCT( fd_rt_out_register( rtereg_out, NULL, 1, &rtereg_hdl ) );
-	
+
 	/* We're done */
 	return 0;
 }
 
 /* Unload */
-void fd_ext_fini(void)
+static void rtereg_fini(void)
 {
-	int i;
 	TRACE_ENTRY();
-	
+
 	/* Unregister the cb */
 	CHECK_FCT_DO( fd_rt_out_unregister ( rtereg_hdl, NULL ), /* continue */ );
-	
+
 	/* Destroy the data */
-	if (rtereg_conf.rules) 
-		for (i = 0; i < rtereg_conf.rules_nb; i++) {
-			free(rtereg_conf.rules[i].pattern);
-			free(rtereg_conf.rules[i].server);
-			regfree(&rtereg_conf.rules[i].preg);
-		}
-	free(rtereg_conf.rules);
+	rtereg_conf_free(rtereg_conf, rtereg_conf_size);
+	rtereg_conf = NULL;
+	rtereg_conf_size = 0;
 #ifndef HAVE_REG_STARTEND
 	free(buf);
+	buf = NULL;
 #endif /* HAVE_REG_STARTEND */
-	
+
 	/* Done */
 	return ;
 }
 
-EXTENSION_ENTRY("rt_ereg", rtereg_entry);
+void fd_ext_fini(void)
+{
+	rtereg_fini();
+}
+
+EXTENSION_ENTRY(MODULE_NAME, rtereg_entry);
--- a/extensions/rt_ereg/rtereg.h	Sun Jan 21 22:25:07 2018 +0800
+++ b/extensions/rt_ereg/rtereg.h	Sun May 12 23:15:40 2019 +0800
@@ -57,8 +57,11 @@
 extern struct rtereg_conf {
 	int			rules_nb; /* Number of rules in the configuration */
 	struct rtereg_rule 	*rules;   /* The array of rules */
-	
-	struct dict_object * avp; /* cache the dictionary object that we are searching */
+
+	int                     level;    /* how many levels of AVPs we have to dig down into */
+	int			finished; /* AVP fully configured, for configuration file reading */
+	struct dict_object      **avps;   /* cache the dictionary objects that we are searching */
 	
-} rtereg_conf;
+} *rtereg_conf;
 
+extern int rtereg_conf_size;
--- a/extensions/rt_ereg/rtereg_conf.y	Sun Jan 21 22:25:07 2018 +0800
+++ b/extensions/rt_ereg/rtereg_conf.y	Sun May 12 23:15:40 2019 +0800
@@ -37,14 +37,14 @@
  */
 
 /* For development only : */
-%debug 
+%debug
 %error-verbose
 
 /* The parser receives the configuration file filename as parameter */
 %parse-param {char * conffile}
 
 /* Keep track of location */
-%locations 
+%locations
 %pure-parser
 
 %{
@@ -53,36 +53,91 @@
 
 /* Forward declaration */
 int yyparse(char * conffile);
+void rtereg_confrestart(FILE *input_file);
 
 /* Parse the configuration file */
 int rtereg_conf_handle(char * conffile)
 {
 	extern FILE * rtereg_confin;
 	int ret;
-	
+
 	TRACE_ENTRY("%p", conffile);
-	
+
 	TRACE_DEBUG (FULL, "Parsing configuration file: %s...", conffile);
-	
+
 	rtereg_confin = fopen(conffile, "r");
 	if (rtereg_confin == NULL) {
 		ret = errno;
 		fd_log_debug("Unable to open extension configuration file %s for reading: %s", conffile, strerror(ret));
-		TRACE_DEBUG (INFO, "Error occurred, message logged -- configuration file.");
+		TRACE_DEBUG (INFO, "rt_ereg: error occurred, message logged -- configuration file.");
 		return ret;
 	}
 
+	rtereg_confrestart(rtereg_confin);
 	ret = yyparse(conffile);
 
 	fclose(rtereg_confin);
 
+	if (rtereg_conf[rtereg_conf_size-1].finished == 0) {
+		TRACE_DEBUG(INFO, "rt_ereg: configuration invalid, AVP ended without OCTETSTRING AVP");
+		return EINVAL;
+	}
+
 	if (ret != 0) {
-		TRACE_DEBUG (INFO, "Unable to parse the configuration file.");
+		TRACE_DEBUG(INFO, "rt_ereg: unable to parse the configuration file.");
 		return EINVAL;
 	} else {
-		TRACE_DEBUG(FULL, "[rt-ereg] Added %d rules successfully.", rtereg_conf.rules_nb);
+		int i, sum = 0;
+		for (i=0; i<rtereg_conf_size; i++) {
+			sum += rtereg_conf[i].rules_nb;
+		}
+		TRACE_DEBUG(FULL, "[rt-ereg] Added %d rules successfully.", sum);
+	}
+
+	return 0;
+}
+
+int avp_add(const char *name)
+{
+	void *ret;
+	int level;
+
+	if (rtereg_conf[rtereg_conf_size-1].finished) {
+		if ((ret = realloc(rtereg_conf, sizeof(*rtereg_conf)*(rtereg_conf_size+1))) == NULL) {
+			TRACE_DEBUG(INFO, "rt_ereg: realloc failed");
+			return -1;
+		}
+		rtereg_conf_size++;
+		rtereg_conf = ret;
+		memset(&rtereg_conf[rtereg_conf_size-1], 0, sizeof(*rtereg_conf));
+		TRACE_DEBUG(INFO, "rt_ereg: New AVP group found starting with %s", name);
 	}
-	
+	level = rtereg_conf[rtereg_conf_size-1].level + 1;
+
+	if ((ret = realloc(rtereg_conf[rtereg_conf_size-1].avps, sizeof(*rtereg_conf[rtereg_conf_size-1].avps)*level)) == NULL) {
+		TRACE_DEBUG(INFO, "rt_ereg: realloc failed");
+		return -1;
+	}
+	rtereg_conf[rtereg_conf_size-1].avps = ret;
+
+	CHECK_FCT_DO( fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME_ALL_VENDORS, name, &rtereg_conf[rtereg_conf_size-1].avps[level-1], ENOENT ),
+		      {
+			      TRACE_DEBUG(INFO, "rt_ereg: Unable to find '%s' AVP in the loaded dictionaries.", name);
+			      return -1;
+		      } );
+
+	/* Now check the type */
+	{
+		struct dict_avp_data data;
+		CHECK_FCT( fd_dict_getval( rtereg_conf[rtereg_conf_size-1].avps[level-1], &data) );
+		if (data.avp_basetype == AVP_TYPE_OCTETSTRING) {
+			rtereg_conf[rtereg_conf_size-1].finished = 1;
+		} else if (data.avp_basetype != AVP_TYPE_GROUPED) {
+			TRACE_DEBUG(INFO, "rt_ereg: '%s' AVP is not an OCTETSTRING nor GROUPED AVP (%d).", name, data.avp_basetype);
+			return -1;
+		}
+	}
+	rtereg_conf[rtereg_conf_size-1].level = level;
 	return 0;
 }
 
@@ -92,8 +147,8 @@
 /* Function to report the errors */
 void yyerror (YYLTYPE *ploc, char * conffile, char const *s)
 {
-	TRACE_DEBUG(INFO, "Error in configuration parsing");
-	
+	TRACE_DEBUG(INFO, "rt_ereg: error in configuration parsing");
+
 	if (ploc->first_line != ploc->last_line)
 		fd_log_debug("%s:%d.%d-%d.%d : %s", conffile, ploc->first_line, ploc->first_column, ploc->last_line, ploc->last_column, s);
 	else if (ploc->first_column != ploc->last_column)
@@ -125,61 +180,41 @@
 %%
 
 	/* The grammar definition */
-conffile:		rules avp rules
+conffile:		avp rules
+			| conffile avp rules
 			;
-			
+
 	/* a server entry */
-avp:			AVP '=' QSTRING ';'
-			{
-				if (rtereg_conf.avp != NULL) {
-					yyerror(&yylloc, conffile, "Only one AVP can be specified");
-					YYERROR;
-				}
-				
-				CHECK_FCT_DO( fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, $3, &rtereg_conf.avp, ENOENT ),
-					{
-						TRACE_DEBUG(INFO, "Unable to find '%s' AVP in the loaded dictionaries.", $3);
-						yyerror (&yylloc, conffile, "Invalid AVP value.");
-						YYERROR;
-					} );
-				
-				/* Now check the type */
-				{
-					struct dict_avp_data data;
-					CHECK_FCT( fd_dict_getval( rtereg_conf.avp, &data) );
-					CHECK_PARAMS_DO (data.avp_basetype == AVP_TYPE_OCTETSTRING, 
-						{
-							TRACE_DEBUG(INFO, "'%s' AVP in not an OCTETSTRING AVP (%d).", $3, data.avp_basetype);
-							yyerror (&yylloc, conffile, "AVP in not an OCTETSTRING type.");
-							YYERROR;
-						} );
-				}
-			}
+avp:			AVP '=' avp_part ';'
 			;
-			
+
+avp_part: 		avp_part ':' QSTRING { if (avp_add($3) < 0) { YYERROR; } }
+			| QSTRING { if (avp_add($1) < 0) { YYERROR; } }
+			;
+
 rules:			/* empty OK */
 			| rules rule
 			;
-			
+
 rule:			QSTRING ':' QSTRING '+' '=' INTEGER ';'
 			{
 				struct rtereg_rule * new;
 				int err;
-				
+
 				/* Add new rule in the array */
-				rtereg_conf.rules_nb += 1;
-				CHECK_MALLOC_DO(rtereg_conf.rules = realloc(rtereg_conf.rules, rtereg_conf.rules_nb * sizeof(struct rtereg_rule)),
+				rtereg_conf[rtereg_conf_size-1].rules_nb += 1;
+				CHECK_MALLOC_DO(rtereg_conf[rtereg_conf_size-1].rules = realloc(rtereg_conf[rtereg_conf_size-1].rules, rtereg_conf[rtereg_conf_size-1].rules_nb * sizeof(struct rtereg_rule)),
 					{
 						yyerror (&yylloc, conffile, "Not enough memory to store the configuration...");
 						YYERROR;
 					} );
-				
-				new = &rtereg_conf.rules[rtereg_conf.rules_nb - 1];
-				
+
+				new = &rtereg_conf[rtereg_conf_size-1].rules[rtereg_conf[rtereg_conf_size-1].rules_nb - 1];
+
 				new->pattern = $1;
 				new->server  = $3;
 				new->score   = $6;
-				
+
 				/* Attempt to compile the regex */
 				CHECK_FCT_DO( err=regcomp(&new->preg, new->pattern, REG_EXTENDED | REG_NOSUB),
 					{
@@ -187,7 +222,7 @@
 						size_t bl;
 
 						/* Error while compiling the regex */
-						TRACE_DEBUG(INFO, "Error while compiling the regular expression '%s':", new->pattern);
+						TRACE_DEBUG(INFO, "rt_ereg: error while compiling the regular expression '%s':", new->pattern);
 
 						/* Get the error message size */
 						bl = regerror(err, &new->preg, NULL, 0);
@@ -198,10 +233,10 @@
 						/* Get the error message content */
 						regerror(err, &new->preg, buf, bl);
 						TRACE_DEBUG(INFO, "\t%s", buf);
-						
+
 						/* Free the buffer, return the error */
 						free(buf);
-						
+
 						yyerror (&yylloc, conffile, "Invalid regular expression.");
 						YYERROR;
 					} );
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/rt_rewrite/CMakeLists.txt	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,27 @@
+# The rt_rewrite extension
+PROJECT("Routing extension that rewrites messages, replacing and removing AVPs" C)
+
+# List of source files
+SET(RT_REWRITE_SRC
+	rt_rewrite.c
+	lex.rt_rewrite_conf.c
+	rt_rewrite_conf.tab.c
+	rt_rewrite_conf.tab.h
+)
+
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
+
+BISON_FILE(rt_rewrite_conf.y)
+FLEX_FILE(rt_rewrite_conf.l)
+SET_SOURCE_FILES_PROPERTIES(lex.rt_rewrite_conf.c rt_rewrite_conf.tab.c PROPERTIES COMPILE_FLAGS "-I ${CMAKE_CURRENT_SOURCE_DIR}")
+
+# Compile these files as a freeDiameter extension
+FD_ADD_EXTENSION(rt_rewrite ${RT_REWRITE_SRC})
+
+####
+## INSTALL section ##
+
+# We install with the daemon component because it is a base feature.
+INSTALL(TARGETS rt_rewrite
+	LIBRARY DESTINATION ${INSTALL_EXTENSIONS_SUFFIX}
+	COMPONENT freeDiameter-daemon)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/rt_rewrite/rt_rewrite.c	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,461 @@
+/*********************************************************************************************************
+ * Software License Agreement (BSD License)                                                               *
+ * Author: Thomas Klausner <tk@giga.or.at>                                                                *
+ *                                                                                                        *
+ * Copyright (c) 2018, Thomas Klausner                                                                    *
+ * All rights reserved.                                                                                   *
+ *                                                                                                        *
+ * Written under contract by Effortel Technologies SA, http://effortel.com/                               *
+ *                                                                                                        *
+ * Redistribution and use of this software in source and binary forms, with or without modification, are  *
+ * permitted provided that the following conditions are met:                                              *
+ *                                                                                                        *
+ * * Redistributions of source code must retain the above                                                 *
+ *   copyright notice, this list of conditions and the                                                    *
+ *   following disclaimer.                                                                                *
+ *                                                                                                        *
+ * * Redistributions in binary form must reproduce the above                                              *
+ *   copyright notice, this list of conditions and the                                                    *
+ *   following disclaimer in the documentation and/or other                                               *
+ *   materials provided with the distribution.                                                            *
+ *                                                                                                        *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT     *
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS    *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   *
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                                                             *
+ *********************************************************************************************************/
+
+#include <freeDiameter/extension.h>
+#include "rt_rewrite.h"
+
+#include <pthread.h>
+#include <signal.h>
+
+/*
+ * Replace AVPs: put their values into other AVPs
+ * Remove AVPs: drop them from a message
+ */
+
+/* handler */
+static struct fd_rt_fwd_hdl * rt_rewrite_handle = NULL;
+
+static char *config_file;
+
+struct avp_match *avp_match_start = NULL;
+
+static pthread_rwlock_t rt_rewrite_lock;
+
+#define MODULE_NAME "rt_rewrite"
+
+struct store {
+	struct avp *avp;
+	struct avp_target *target;
+	struct store *next;
+};
+
+static struct store *store_new(void) {
+	struct store *ret;
+
+	if ((ret=malloc(sizeof(*ret))) == NULL) {
+		fd_log_error("%s: malloc failure", MODULE_NAME);
+		return NULL;
+	}
+	ret->avp = NULL;
+	ret->target = NULL;
+	ret->next = NULL;
+
+	return ret;
+}
+
+static void store_free(struct store *store)
+{
+	while (store) {
+		struct store *next;
+		if (store->avp) {
+			fd_msg_free((msg_or_avp *)store->avp);
+		}
+		store->target = NULL;
+		next = store->next;
+		free(store);
+		store = next;
+	}
+	return;
+}
+
+static int fd_avp_search_avp(msg_or_avp *where, struct dict_object *what, struct avp **avp)
+{
+	struct avp *nextavp;
+	struct dict_avp_data dictdata;
+	enum dict_object_type dicttype;
+
+	CHECK_PARAMS((fd_dict_gettype(what, &dicttype) == 0) && (dicttype == DICT_AVP));
+	CHECK_FCT(fd_dict_getval(what, &dictdata));
+
+	/* Loop on all top AVPs */
+	CHECK_FCT(fd_msg_browse(where, MSG_BRW_FIRST_CHILD, (void *)&nextavp, NULL));
+	while (nextavp) {
+		struct avp_hdr *header = NULL;
+		struct dict_object *model = NULL;
+		if (fd_msg_avp_hdr(nextavp, &header) != 0) {
+			fd_log_notice("%s: unable to get header for AVP", MODULE_NAME);
+			return -1;
+		}
+		if (fd_msg_model(nextavp, &model) != 0) {
+			fd_log_notice("%s: unable to get model for AVP (%d, vendor %d)", MODULE_NAME, header->avp_code, header->avp_vendor);
+			return 0;
+		}
+		if (model == NULL) {
+			fd_log_notice("%s: unknown AVP (%d, vendor %d) (not in dictionary), skipping", MODULE_NAME, header->avp_code, header->avp_vendor);
+		} else {
+			if ((header->avp_code == dictdata.avp_code) && (header->avp_vendor == dictdata.avp_vendor)) {
+				break;
+			}
+		}
+
+		/* Otherwise move to next AVP in the message */
+		CHECK_FCT(fd_msg_browse(nextavp, MSG_BRW_NEXT, (void *)&nextavp, NULL) );
+	}
+
+	if (avp)
+		*avp = nextavp;
+
+	if (*avp || nextavp) {
+		return 0;
+	} else {
+		return ENOENT;
+	}
+}
+
+
+
+static msg_or_avp *find_container(msg_or_avp *msg, struct avp_target *target)
+{
+	msg_or_avp *location = msg;
+	while (target->child) {
+		struct dict_object *avp_do;
+		msg_or_avp *new_location = NULL;
+		int ret;
+
+		fd_log_debug("%s: looking for '%s'", MODULE_NAME, target->name);
+		if ((ret=fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME_ALL_VENDORS, target->name, &avp_do, ENOENT)) != 0) {
+			fd_log_error("%s: target AVP '%s' not in dictionary: %s", MODULE_NAME, target->name, strerror(ret));
+			return NULL;
+		}
+		if ((ret=fd_avp_search_avp(location, avp_do, (struct avp **)&new_location)) != 0) {
+			fd_log_debug("%s: did not find '%s', adding it", MODULE_NAME, target->name);
+			struct avp *avp = NULL;
+			if ((ret = fd_msg_avp_new(avp_do, 0, &avp)) != 0) {
+				fd_log_notice("%s: unable to create new '%s' AVP", MODULE_NAME, target->name);
+				return NULL;
+			}
+			if ((ret=fd_msg_avp_add(location, MSG_BRW_LAST_CHILD, avp)) != 0) {
+				fd_log_error("%s: cannot add AVP '%s' to message: %s", MODULE_NAME, target->name, strerror(ret));
+				return NULL;
+			}
+			fd_log_debug("%s: '%s' added", MODULE_NAME, target->name);
+			/* now find it in the new place */
+			continue;
+		} else {
+			location = new_location;
+			fd_log_debug("%s: found '%s'", MODULE_NAME, target->name);
+		}
+		target = target->child;
+	}
+	fd_log_debug("%s: returning AVP for '%s'", MODULE_NAME, target->name);
+	return location;
+}
+
+static int store_apply(msg_or_avp *msg, struct store **store)
+{
+	while (*store) {
+		msg_or_avp *container;
+		struct store *next;
+		if ((*store)->avp) {
+			int ret;
+			if ((container=find_container(msg, (*store)->target)) == NULL) {
+				fd_log_error("%s: internal error, container not found", MODULE_NAME);
+				return -1;
+			}
+
+			if ((ret=fd_msg_avp_add(container, MSG_BRW_LAST_CHILD, (*store)->avp)) != 0) {
+				fd_log_error("%s: cannot add AVP '%s' to message: %s", MODULE_NAME, (*store)->target->name, strerror(ret));
+				return -1;
+			}
+		}
+		next = (*store)->next;
+		free(*store);
+		*store = next;
+	}
+	return 0;
+}
+
+static int schedule_for_adding(struct avp *avp, struct avp_target *target, struct store *store)
+{
+	if (store->avp) {
+		struct store *new;
+		if ((new=store_new()) == NULL) {
+			return -1;
+		}
+		new->avp = avp;
+		new->target = target;
+		new->next = store->next;
+		store->next = new;
+	} else {
+		store->avp = avp;
+		store->target = target;
+	}
+	fd_log_debug("%s: noted %s for later adding", MODULE_NAME, target->name);
+	return 0;
+}
+
+static void move_avp_to_target(union avp_value *avp_value, struct avp_target *target, struct store *store)
+{
+	struct dict_object *avp_do;
+	struct avp *avp;
+	int ret;
+	struct avp_target *final = target;
+
+	while (final->child) {
+		final = final->child;
+	}
+	if ((ret=fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME_ALL_VENDORS, final->name, &avp_do, ENOENT)) != 0) {
+		fd_log_error("internal error, target AVP '%s' not in dictionary: %s", final->name, strerror(ret));
+		return;
+	}
+	if ((ret=fd_msg_avp_new(avp_do, 0, &avp)) != 0) {
+		fd_log_error("internal error, error creating structure for AVP '%s': %s", final->name, strerror(ret));
+		return;
+	}
+	if ((ret=fd_msg_avp_setvalue(avp, avp_value)) != 0) {
+		fd_log_error("internal error, cannot set value for AVP '%s': %s", final->name, strerror(ret));
+		return;
+	}
+	if (schedule_for_adding(avp, target, store) != 0) {
+		fd_log_error("internal error, cannot add AVP '%s' to message", final->name);
+		return;
+	}
+
+	return;
+}
+
+
+static struct avp_match *avp_to_be_replaced(const char *avp_name, struct avp_match *subtree)
+{
+	struct avp_match *ret;
+	for (ret=subtree; ret != NULL; ret=ret->next) {
+		if (strcmp(ret->name, avp_name) == 0) {
+			return ret;
+		}
+	}
+	return NULL;
+}
+
+/*
+ * msg: whole message
+ * avp: current AVP in message
+ * subtree: comparison subtree
+ */
+static int replace_avps(struct msg *msg, msg_or_avp *avp, struct avp_match *subtree, struct store *store)
+{
+	int nothing_left = 1;
+	/* for each AVP in message */
+	while (avp) {
+		struct avp_hdr *header = NULL;
+		struct dict_object *model = NULL;
+		const char *avp_name = NULL;
+		msg_or_avp *next;
+		int delete = 0;
+
+		if (fd_msg_avp_hdr(avp, &header) != 0) {
+			fd_log_notice("internal error: unable to get header for AVP");
+			return 0;
+		}
+		if (fd_msg_model(avp, &model) != 0) {
+			fd_log_notice("internal error: unable to get model for AVP (%d, vendor %d)", header->avp_code, header->avp_vendor);
+			return 0;
+		}
+		if (model == NULL) {
+			fd_log_notice("unknown AVP (%d, vendor %d) (not in dictionary), skipping", header->avp_code, header->avp_vendor);
+
+		} else {
+			struct dict_avp_data dictdata;
+			struct avp_match *subtree_match;
+			enum dict_avp_basetype basetype = AVP_TYPE_OCTETSTRING;
+
+			fd_dict_getval(model, &dictdata);
+			avp_name = dictdata.avp_name;
+			basetype = dictdata.avp_basetype;
+			/* check if it exists in the subtree */
+			if ((subtree_match = avp_to_be_replaced(avp_name, subtree))) {
+				/* if this should be deleted, mark as such */
+				if (subtree_match->drop) {
+					fd_log_notice("%s: dropping AVP '%s'", MODULE_NAME, avp_name);
+					delete = 1;
+				}
+				/* if grouped, dive down */
+				if (basetype == AVP_TYPE_GROUPED) {
+					msg_or_avp *child = NULL;
+
+					fd_log_debug("%s: grouped AVP '%s'", MODULE_NAME, avp_name);
+					if (fd_msg_browse(avp, MSG_BRW_FIRST_CHILD, &child, NULL) != 0) {
+						fd_log_notice("internal error: unable to browse message at AVP (%d, vendor %d)", header->avp_code, header->avp_vendor);
+						return 0;
+					}
+
+					/* replace_avps returns if the AVP was emptied out */
+					if (replace_avps(msg, child, subtree_match->children, store)) {
+						fd_log_notice("%s: removing empty grouped AVP '%s'", MODULE_NAME, avp_name);
+						delete = 1;
+					}
+				}
+				else {
+					/* if single, remove it and add replacement AVP in target structure */
+					if (subtree_match->target) {
+						struct avp_target *final = subtree_match->target;
+						while (final->child) {
+							final = final->child;
+						}
+						fd_log_notice("%s: moving AVP '%s' to '%s'", MODULE_NAME, avp_name, final->name);
+						move_avp_to_target(header->avp_value, subtree_match->target, store);
+						delete = 1;
+					}
+				}
+			}
+		}
+		fd_msg_browse(avp, MSG_BRW_NEXT, &next, NULL);
+		if (delete) {
+			/* remove AVP from message */
+			fd_msg_free((msg_or_avp *)avp);
+		} else {
+		    nothing_left = 0;
+		}
+
+		avp = next;
+	}
+
+	return nothing_left;
+}
+
+static volatile int in_signal_handler = 0;
+
+/* signal handler */
+static void sig_hdlr(void)
+{
+	struct avp_match *old_config;
+
+	if (in_signal_handler) {
+		fd_log_error("%s: already handling a signal, ignoring new one", MODULE_NAME);
+		return;
+	}
+	in_signal_handler = 1;
+
+	if (pthread_rwlock_wrlock(&rt_rewrite_lock) != 0) {
+		fd_log_error("%s: locking failed, aborting config reload", MODULE_NAME);
+		return;
+	}
+
+	/* save old config in case reload goes wrong */
+	old_config = avp_match_start;
+	avp_match_start = NULL;
+
+	if (rt_rewrite_conf_handle(config_file) != 0) {
+		fd_log_notice("%s: error reloading configuration, restoring previous configuration", MODULE_NAME);
+		avp_match_free(avp_match_start);
+		avp_match_start = old_config;
+	} else {
+		avp_match_free(old_config);
+	}
+
+	if (pthread_rwlock_unlock(&rt_rewrite_lock) != 0) {
+		fd_log_error("%s: unlocking failed after config reload, exiting", MODULE_NAME);
+		exit(1);
+	}
+
+	fd_log_notice("%s: reloaded configuration", MODULE_NAME);
+
+	in_signal_handler = 0;
+}
+
+static int rt_rewrite(void * cbdata, struct msg **msg)
+{
+	int ret;
+	msg_or_avp *avp = NULL;
+	struct store *store = NULL;
+
+	/* nothing configured */
+	if (avp_match_start == NULL) {
+		return 0;
+	}
+
+	if ((store=store_new()) == NULL) {
+		fd_log_error("%s: malloc failure");
+		return ENOMEM;
+	}
+	if ((ret = fd_msg_parse_dict(*msg, fd_g_config->cnf_dict, NULL)) != 0) {
+		fd_log_notice("%s: error parsing message", MODULE_NAME);
+		free(store);
+		return ret;
+	}
+	if ((ret=fd_msg_browse(*msg, MSG_BRW_FIRST_CHILD, &avp, NULL)) != 0) {
+		fd_log_notice("internal error: message has no child");
+		free(store);
+		return ret;
+	}
+	if (replace_avps(*msg, avp, avp_match_start->children, store) != 0) {
+		fd_log_error("%s: replace AVP function failed", MODULE_NAME);
+		store_free(store);
+		return -1;
+	}
+	return store_apply(*msg, &store);
+}
+
+/* entry point */
+static int rt_rewrite_entry(char * conffile)
+{
+	int ret;
+	config_file = conffile;
+
+	pthread_rwlock_init(&rt_rewrite_lock, NULL);
+
+	if (pthread_rwlock_wrlock(&rt_rewrite_lock) != 0) {
+		fd_log_notice("%s: write-lock failed, aborting", MODULE_NAME);
+		return EDEADLK;
+	}
+
+	/* Parse the configuration file */
+	if ((ret=rt_rewrite_conf_handle(config_file)) != 0) {
+		pthread_rwlock_unlock(&rt_rewrite_lock);
+		return ret;
+	}
+
+	if (pthread_rwlock_unlock(&rt_rewrite_lock) != 0) {
+		fd_log_notice("%s: write-unlock failed, aborting", MODULE_NAME);
+		return EDEADLK;
+	}
+
+	/* Register reload callback */
+	CHECK_FCT(fd_event_trig_regcb(SIGUSR1, MODULE_NAME, sig_hdlr));
+
+	/* Register the callback */
+	if ((ret=fd_rt_fwd_register(rt_rewrite, NULL, RT_FWD_ALL, &rt_rewrite_handle)) != 0) {
+		fd_log_error("Cannot register callback handler");
+		return ret;
+	}
+
+	fd_log_notice("Extension 'Rewrite' initialized");
+	return 0;
+}
+
+/* Unload */
+void fd_ext_fini(void)
+{
+	/* Unregister the callbacks */
+	fd_rt_fwd_unregister(rt_rewrite_handle, NULL);
+	return ;
+}
+
+EXTENSION_ENTRY("rt_rewrite", rt_rewrite_entry);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/rt_rewrite/rt_rewrite.h	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,57 @@
+/*********************************************************************************************************
+ * Software License Agreement (BSD License)                                                               *
+ * Author: Thomas Klausner <tk@giga.or.at>                                                                *
+ *                                                                                                        *
+ * Copyright (c) 2018, Thomas Klausner                                                                    *
+ * All rights reserved.                                                                                   *
+ *                                                                                                        *
+ * Written under contract by Effortel Technologies SA, http://effortel.com/                               *
+ *                                                                                                        *
+ * Redistribution and use of this software in source and binary forms, with or without modification, are  *
+ * permitted provided that the following conditions are met:                                              *
+ *                                                                                                        *
+ * * Redistributions of source code must retain the above                                                 *
+ *   copyright notice, this list of conditions and the                                                    *
+ *   following disclaimer.                                                                                *
+ *                                                                                                        *
+ * * Redistributions in binary form must reproduce the above                                              *
+ *   copyright notice, this list of conditions and the                                                    *
+ *   following disclaimer in the documentation and/or other                                               *
+ *   materials provided with the distribution.                                                            *
+ *                                                                                                        *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT     *
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS    *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   *
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                                                             *
+ *********************************************************************************************************/
+
+/* FreeDiameter's common include file */
+#include <freeDiameter/extension.h>
+
+/* Parse the configuration file */
+int rt_rewrite_conf_handle(char * conffile);
+
+extern struct avp_match *avp_match_start;
+struct avp_match {
+	char *name;
+
+	struct avp_match *next;
+
+	/* either avp_children_list OR avp_target can be used */
+	/* NULL avp_children_list AND NULL avp_target -> drop AVP */
+	struct avp_match *children;
+	struct avp_target *target;
+	int drop;
+};
+
+struct avp_target {
+	char *name;
+
+	struct avp_target *child;
+};
+
+void avp_match_free(struct avp_match *match);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/rt_rewrite/rt_rewrite_conf.l	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,100 @@
+/*********************************************************************************************************
+ * Software License Agreement (BSD License)                                                               *
+ * Author: Thomas Klausner <tk@giga.or.at>                                                                *
+ *                                                                                                        *
+ * Copyright (c) 2018, Thomas Klausner                                                                    *
+ * All rights reserved.                                                                                   *
+ *                                                                                                        *
+ * Written under contract by Effortel Technologies SA, http://effortel.com/                               *
+ *                                                                                                        *
+ * Redistribution and use of this software in source and binary forms, with or without modification, are  *
+ * permitted provided that the following conditions are met:                                              *
+ *                                                                                                        *
+ * * Redistributions of source code must retain the above                                                 *
+ *   copyright notice, this list of conditions and the                                                    *
+ *   following disclaimer.                                                                                *
+ *                                                                                                        *
+ * * Redistributions in binary form must reproduce the above                                              *
+ *   copyright notice, this list of conditions and the                                                    *
+ *   following disclaimer in the documentation and/or other                                               *
+ *   materials provided with the distribution.                                                            *
+ *                                                                                                        *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT     *
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS    *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   *
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                                                             *
+ *********************************************************************************************************/
+
+/* Tokenizer
+ *
+ */
+
+%{
+#include "rt_rewrite.h"
+/* Include yacc tokens definitions */
+#include "rt_rewrite_conf.tab.h"
+
+/* Update the column information */
+#define YY_USER_ACTION { 						\
+	yylloc->first_column = yylloc->last_column + 1; 		\
+	yylloc->last_column = yylloc->first_column + yyleng - 1;	\
+}
+
+/* Avoid warning with newer flex */
+#define YY_NO_INPUT
+
+%}
+
+qstring		\"[^\"\n]*\"
+
+
+%option bison-bridge bison-locations
+%option noyywrap
+%option nounput
+
+%%
+
+	/* Update the line count */
+\n			{
+				yylloc->first_line++;
+				yylloc->last_line++;
+				yylloc->last_column=0;
+			}
+
+	/* Eat all spaces but not new lines */
+([[:space:]]{-}[\n])+	;
+	/* Eat all comments */
+#.*$			;
+
+
+	/* Recognize quoted strings */
+{qstring}		{
+				/* Match a quoted string. */
+				CHECK_MALLOC_DO( yylval->string = strdup(yytext+1),
+				{
+					TRACE_DEBUG(INFO, "Unable to copy the string '%s': %s", yytext, strerror(errno));
+					return LEX_ERROR; /* trig an error in yacc parser */
+				} );
+				yylval->string[strlen(yytext) - 2] = '\0';
+				return QSTRING;
+			}
+
+
+	/* The key words */
+(?i:MAP)	 	{	return MAP;	}
+(?i:DROP)	 	{	return DROP;	}
+
+	/* Valid single characters for yyparse */
+[=:;>]			{ return yytext[0]; }
+
+	/* Unrecognized sequence, if it did not match any previous pattern */
+[^[:space:]\":=>;\n]+	{
+				fd_log_debug("Unrecognized text on line %d col %d: '%s'.", yylloc->first_line, yylloc->first_column, yytext);
+			 	return LEX_ERROR;
+			}
+
+%%
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/rt_rewrite/rt_rewrite_conf.y	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,421 @@
+/*********************************************************************************************************
+ * Software License Agreement (BSD License)                                                               *
+ * Author: Thomas Klausner <tk@giga.or.at>                                                                *
+ *                                                                                                        *
+ * Copyright (c) 2018, Thomas Klausner                                                                    *
+ * All rights reserved.                                                                                   *
+ *                                                                                                        *
+ * Written under contract by Effortel Technologies SA, http://effortel.com/                               *
+ *                                                                                                        *
+ * Redistribution and use of this software in source and binary forms, with or without modification, are  *
+ * permitted provided that the following conditions are met:                                              *
+ *                                                                                                        *
+ * * Redistributions of source code must retain the above                                                 *
+ *   copyright notice, this list of conditions and the                                                    *
+ *   following disclaimer.                                                                                *
+ *                                                                                                        *
+ * * Redistributions in binary form must reproduce the above                                              *
+ *   copyright notice, this list of conditions and the                                                    *
+ *   following disclaimer in the documentation and/or other                                               *
+ *   materials provided with the distribution.                                                            *
+ *                                                                                                        *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT     *
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS    *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   *
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                                                             *
+ *********************************************************************************************************/
+
+/* Yacc extension's configuration parser.
+ */
+
+/* For development only : */
+%debug
+%error-verbose
+
+/* The parser receives the configuration file filename as parameter */
+%parse-param {char * conffile}
+
+/* Keep track of location */
+%locations
+%pure-parser
+
+%{
+#include "rt_rewrite.h"
+#include "rt_rewrite_conf.tab.h"	/* bison is not smart enough to define the YYLTYPE before including this code, so... */
+
+/* Forward declaration */
+int yyparse(char * conffile);
+void rt_rewrite_confrestart(FILE *input_file);
+
+/* copied from libfdproto/dictionary.c because the symbol is not public */
+static const char * type_base_name[] = { /* must keep in sync with dict_avp_basetype */
+	"Grouped", 	/* AVP_TYPE_GROUPED */
+	"Octetstring", 	/* AVP_TYPE_OCTETSTRING */
+	"Integer32", 	/* AVP_TYPE_INTEGER32 */
+	"Integer64", 	/* AVP_TYPE_INTEGER64 */
+	"Unsigned32", 	/* AVP_TYPE_UNSIGNED32 */
+	"Unsigned64", 	/* AVP_TYPE_UNSIGNED64 */
+	"Float32", 	/* AVP_TYPE_FLOAT32 */
+	"Float64"	/* AVP_TYPE_FLOAT64 */
+	};
+
+static struct avp_match *avp_match_new(char *name);
+
+static struct avp_match *source_target = NULL, *drop_target = NULL;
+static struct avp_target *dest_target = NULL;
+
+static void print_target(struct avp_target *target, char *prefix)
+{
+	char *output = NULL;
+	if (asprintf(&output, "%s -> /TOP/%s", prefix, target->name) == -1) {
+		fd_log_error("rt_rewrite: print_target: setup:  asprintf failed: %s", strerror(errno));
+		return;
+	}
+	for (target=target->child; target != NULL; target=target->child) {
+		char *new_output = NULL;
+		if (asprintf(&new_output, "%s/%s", output, target->name) == -1) {
+			fd_log_error("rt_rewrite: print_target: asprintf failed: %s", strerror(errno));
+			free(output);
+			return;
+		}
+		free(output);
+		output = new_output;
+		new_output = NULL;
+	}
+	fd_log_debug(output);
+	free(output);
+	return;
+}
+
+static void compare_avp_type(const char *source, const char *dest)
+{
+	struct dict_object *model_source, *model_dest;
+	struct dict_avp_data dictdata_source, dictdata_dest;
+
+	if (fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME_ALL_VENDORS, source, &model_source, ENOENT) != 0) {
+		fd_log_error("Unable to find '%s' AVP in the loaded dictionaries", source);
+		return;
+	}
+	if (fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME_ALL_VENDORS, dest, &model_dest, ENOENT) != 0) {
+		fd_log_error("Unable to find '%s' AVP in the loaded dictionaries", dest);
+		return;
+	}
+	fd_dict_getval(model_source, &dictdata_source);
+	fd_dict_getval(model_dest, &dictdata_dest);
+	if (dictdata_source.avp_basetype != dictdata_dest.avp_basetype) {
+		fd_log_notice("rt_rewrite: type mismatch: %s (type %s) mapped to %s (type %s) (continuing anyway)", source, type_base_name[dictdata_source.avp_basetype], dest, type_base_name[dictdata_dest.avp_basetype]);
+	}
+	return;
+}
+
+static void compare_avp_types(struct avp_match *start)
+{
+	struct avp_match *iter;
+	for (iter=start; iter != NULL; iter=iter->next) {
+		compare_avp_types(iter->children);
+		if (iter->target) {
+			struct avp_target *final;
+			final = iter->target;
+			while (final->child) {
+				final = final->child;
+			}
+			compare_avp_type(iter->name, final->name);
+		}
+	}
+	return;
+}
+
+static void dump_config(struct avp_match *start, char *prefix)
+{
+	char *new_prefix = NULL;
+	struct avp_match *iter;
+	for (iter=start; iter != NULL; iter=iter->next) {
+		if (asprintf(&new_prefix, "%s/%s", prefix, iter->name) == -1) {
+			fd_log_error("rt_rewrite: dump_config: asprintf failed: %s", strerror(errno));
+			return;
+		}
+		dump_config(iter->children, new_prefix);
+		if (iter->target) {
+			print_target(iter->target, new_prefix);
+		}
+		if (iter->drop) {
+			fd_log_debug("%s -> DROP", new_prefix);
+		}
+		free(new_prefix);
+		new_prefix = NULL;
+	}
+	return;
+}
+
+/* Parse the configuration file */
+int rt_rewrite_conf_handle(char * conffile)
+{
+	extern FILE * rt_rewrite_confin;
+	int ret;
+	char *top;
+
+	TRACE_ENTRY("%p", conffile);
+
+	TRACE_DEBUG (FULL, "Parsing configuration file: '%s'", conffile);
+
+	/* to match other entries */
+	if ((top=strdup("TOP")) == NULL) {
+		fd_log_error("strdup error: %s", strerror(errno));
+		return EINVAL;
+	}
+	if ((avp_match_start=avp_match_new(top)) == NULL) {
+		fd_log_error("malloc error: %s", strerror(errno));
+		free(top);
+		return EINVAL;
+	}
+	rt_rewrite_confin = fopen(conffile, "r");
+	if (rt_rewrite_confin == NULL) {
+		ret = errno;
+		fd_log_debug("Unable to open extension configuration file '%s' for reading: %s", conffile, strerror(ret));
+		TRACE_DEBUG (INFO, "rt_rewrite: error occurred, message logged -- configuration file.");
+		avp_match_free(avp_match_start);
+		avp_match_start = NULL;
+		return ret;
+	}
+
+	rt_rewrite_confrestart(rt_rewrite_confin);
+	ret = yyparse(conffile);
+
+	fclose(rt_rewrite_confin);
+
+	if (ret != 0) {
+		TRACE_DEBUG(INFO, "rt_rewrite: unable to parse the configuration file.");
+		avp_match_free(avp_match_start);
+		avp_match_start = NULL;
+		return EINVAL;
+	}
+
+	compare_avp_types(avp_match_start);
+	dump_config(avp_match_start, "");
+
+	return 0;
+}
+
+static int verify_avp(const char *name)
+{
+	struct dict_object *model;
+	struct dict_avp_data dictdata;
+
+	if (fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME_ALL_VENDORS, name, &model, ENOENT) != 0) {
+		fd_log_error("Unable to find '%s' AVP in the loaded dictionaries", name);
+		return -1;
+	}
+	fd_dict_getval(model, &dictdata);
+	if (dictdata.avp_basetype == AVP_TYPE_GROUPED) {
+		return 1;
+	}
+	return 0;
+}
+
+static struct avp_match *avp_match_new(char *name) {
+	struct avp_match *ret;
+
+	if ((ret=malloc(sizeof(*ret))) == NULL) {
+		fd_log_error("malloc error");
+		return NULL;
+	}
+	ret->name = name;
+	ret->next = NULL;
+	ret->children = NULL;
+	ret->target = NULL;
+	ret->drop = 0;
+	return ret;
+}
+
+static void avp_target_free(struct avp_target *target) {
+	struct avp_target *iter;
+
+	for (iter=target; iter != NULL; ) {
+		struct avp_target *next;
+		free(iter->name);
+		next = iter->child;
+		free(iter);
+		iter = next;
+	}
+}
+
+void avp_match_free(struct avp_match *match) {
+	struct avp_match *iter;
+
+	for (iter=match; iter != NULL; ) {
+		struct avp_match *next;
+		free(iter->name);
+		next = iter->next;
+		avp_match_free(iter->children);
+		avp_target_free(iter->target);
+		free(iter);
+		iter = next;
+	}
+}
+
+static struct avp_target *target_new(char *name) {
+	struct avp_target *ret;
+
+	if ((ret=malloc(sizeof(*ret))) == NULL) {
+		fd_log_error("malloc error");
+		return NULL;
+	}
+	ret->name = name;
+	ret->child = NULL;
+	return ret;
+}
+
+static struct avp_match *add_avp_next_to(char *name, struct avp_match *target)
+{
+	struct avp_match *iter, *prev;
+
+	if (target == NULL) {
+		return avp_match_new(name);
+	}
+
+	for (prev=iter=target; iter != NULL; iter=iter->next) {
+		if (strcmp(iter->name, name) == 0) {
+			return iter;
+		}
+		prev = iter;
+	}
+	prev->next = avp_match_new(name);
+	return prev->next;
+}
+
+static int add(struct avp_match **target, char *name)
+{
+	struct avp_match *temp;
+	if (verify_avp(name) < 0) {
+		return -1;
+	}
+	temp = add_avp_next_to(name, (*target)->children);
+	if ((*target)->children == NULL) {
+		(*target)->children = temp;
+	}
+	*target = temp;
+	return 0;
+}
+
+/* build tree for source */
+static int source_add(char *name)
+{
+	if (source_target == NULL) {
+		source_target = avp_match_start;
+	}
+	return add(&source_target, name);
+}
+
+/* build tree for destination */
+static int dest_add(char *name)
+{
+	struct avp_target *temp;
+
+	if (verify_avp(name) < 0) {
+		return -1;
+	}
+	if ((temp=target_new(name)) == NULL) {
+		dest_target = NULL;
+		source_target = NULL;
+		return -1;
+	}
+	if (dest_target == NULL) {
+		dest_target = temp;
+		source_target->target = dest_target;
+		source_target = NULL;
+		return 0;
+	}
+	dest_target->child = temp;
+	dest_target = temp;
+	return 0;
+}
+
+static void dest_finish(void)
+{
+	dest_target = NULL;
+}
+
+/* same as source_add, but for drop */
+static int drop_add(char *name)
+{
+	if (drop_target == NULL) {
+		drop_target = avp_match_start;
+	}
+	return add(&drop_target, name);
+}
+
+/* mark as to-drop */
+static void drop_finish(void)
+{
+	drop_target->drop = 1;
+	drop_target = NULL;
+}
+
+/* The Lex parser prototype */
+int rt_rewrite_conflex(YYSTYPE *lvalp, YYLTYPE *llocp);
+
+/* Function to report the errors */
+void yyerror (YYLTYPE *ploc, char * conffile, char const *s)
+{
+	TRACE_DEBUG(INFO, "rt_rewrite: error in configuration parsing");
+
+	if (ploc->first_line != ploc->last_line)
+		fd_log_debug("%s:%d.%d-%d.%d : %s", conffile, ploc->first_line, ploc->first_column, ploc->last_line, ploc->last_column, s);
+	else if (ploc->first_column != ploc->last_column)
+		fd_log_debug("%s:%d.%d-%d : %s", conffile, ploc->first_line, ploc->first_column, ploc->last_column, s);
+	else
+		fd_log_debug("%s:%d.%d : %s", conffile, ploc->first_line, ploc->first_column, s);
+}
+
+%}
+
+/* Values returned by lex for token */
+%union {
+	char 		*string;	/* The string is allocated by strdup in lex.*/
+}
+
+/* In case of error in the lexical analysis */
+%token 		LEX_ERROR
+
+/* A (de)quoted string (malloc'd in lex parser; it must be freed after use) */
+%token <string>	 QSTRING
+
+/* Tokens */
+%token 		MAP
+%token 		DROP
+
+
+/* -------------------------------------- */
+%%
+
+ /* The grammar definition */
+rules:			/* empty ok */
+			| rules map
+			| rules drop
+			;
+
+/* source -> destination mapping */
+map:			MAP '=' source_part '>' dest_part { dest_finish(); }
+			';'
+			;
+
+source_part: 		source_part ':' QSTRING { if (source_add($3) < 0) { YYERROR; } }
+			| QSTRING { if (source_add($1) < 0) { YYERROR; } }
+			;
+
+dest_part: 		dest_part ':' QSTRING { if (dest_add($3) < 0) { YYERROR; } }
+			| QSTRING { if (dest_add($1) < 0) { YYERROR; } }
+			;
+
+/* for dropping an AVP */
+drop:			DROP '=' drop_part { drop_finish(); }
+			';'
+			;
+
+drop_part: 		drop_part ':' QSTRING { if (drop_add($3) < 0) { YYERROR; } }
+			| QSTRING { if (drop_add($1) < 0) { YYERROR; } }
+			;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/test_as/CMakeLists.txt	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,13 @@
+# The test_as extension
+PROJECT("Abort Session dummy server" C)
+
+FD_ADD_EXTENSION(test_as test_as.c)
+
+
+####
+## INSTALL section ##
+
+INSTALL(TARGETS test_as
+	LIBRARY DESTINATION ${INSTALL_EXTENSIONS_SUFFIX}
+	COMPONENT freeDiameter-debug-tools)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/test_as/test_as.c	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,101 @@
+/**********************************************************************************************************
+ * Software License Agreement(BSD License)                                                                *
+ * Author: Thomas Klausner <tk@giga.or.at>                                                                *
+ *                                                                                                        *
+ * Copyright(c) 2019, Thomas Klausner                                                                     *
+ * All rights reserved.                                                                                   *
+ *                                                                                                        *
+ * Written under contract by Effortel Technologies SA, http://effortel.com/                               *
+ *                                                                                                        *
+ * Redistribution and use of this software in source and binary forms, with or without modification, are  *
+ * permitted provided that the following conditions are met:                                              *
+ *                                                                                                        *
+ * * Redistributions of source code must retain the above                                                 *
+ *   copyright notice, this list of conditions and the                                                    *
+ *   following disclaimer.                                                                                *
+ *                                                                                                        *
+ * * Redistributions in binary form must reproduce the above                                              *
+ *   copyright notice, this list of conditions and the                                                    *
+ *   following disclaimer in the documentation and/or other                                               *
+ *   materials provided with the distribution.                                                            *
+ *                                                                                                        *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT      *
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS    *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
+ * TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF    *
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                                                             *
+ **********************************************************************************************************/
+
+/* This extension simply receives ASR and sends ASA after displaying the content, but does not store any data */
+
+#include <freeDiameter/extension.h>
+
+struct disp_hdl *asr_handler_hdl;
+
+static int asr_handler(struct msg ** msg, struct avp * avp, struct session * sess, void * data, enum disp_action * act)
+{
+	struct msg_hdr *hdr = NULL;
+
+	TRACE_ENTRY("%p %p %p %p", msg, avp, sess, act);
+
+	if(msg == NULL)
+		return EINVAL;
+
+	CHECK_FCT(fd_msg_hdr(*msg, &hdr));
+	if(hdr->msg_flags & CMD_FLAG_REQUEST) {
+		/* Request received, answer it */
+		struct msg *answer;
+		os0_t s;
+		size_t sl;
+
+		/* Create the answer message */
+		CHECK_FCT(fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0));
+		answer = *msg;
+
+		/* TODO copy/fill in AVPs into the answer */
+		/* TODO make result code configurable, depending on an AVP value? */
+		CHECK_FCT(fd_msg_rescode_set(answer, "DIAMETER_SUCCESS", NULL, NULL, 1));
+
+		fd_log_notice("--------------Received the following Abort Session Request:--------------");
+
+		CHECK_FCT(fd_sess_getsid(sess, &s, &sl));
+		fd_log_notice("Session: %.*s",(int)sl, s);
+
+		fd_log_notice("----------------------------------------------------------------------");
+
+		/* Send the answer */
+		CHECK_FCT(fd_msg_send(msg, NULL, NULL));
+
+	} else {
+		/* We received an answer message, just discard it */
+		CHECK_FCT(fd_msg_free(*msg));
+		*msg = NULL;
+	}
+
+	return 0;
+}
+
+/* entry hook: register callback */
+static int as_entry(char * conffile)
+{
+	struct disp_when data;
+
+	TRACE_ENTRY("%p", conffile);
+
+	memset(&data, 0, sizeof(data));
+
+        /* Advertise the support for the Diameter Abort Session application in the peer */
+        CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_APPLICATION, APPLICATION_BY_NAME, "Diameter Credit Control Application", &data.app, ENOENT) );
+        CHECK_FCT( fd_disp_app_support ( data.app, NULL, 1, 0 ) );
+
+        /* register handler for ASR */
+        CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Abort-Session-Request", &data.command, ENOENT) );
+        CHECK_FCT( fd_disp_register( asr_handler, DISP_HOW_CC, &data, NULL, &asr_handler_hdl ) );
+
+	return 0;
+}
+
+EXTENSION_ENTRY("test_as", as_entry);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/test_cc/CMakeLists.txt	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,13 @@
+# The test_cc extension
+PROJECT("Credit Control dummy server" C)
+
+FD_ADD_EXTENSION(test_cc test_cc.c)
+
+
+####
+## INSTALL section ##
+
+INSTALL(TARGETS test_cc
+	LIBRARY DESTINATION ${INSTALL_EXTENSIONS_SUFFIX}
+	COMPONENT freeDiameter-debug-tools)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/test_cc/test_cc.c	Sun May 12 23:15:40 2019 +0800
@@ -0,0 +1,100 @@
+/**********************************************************************************************************
+ * Software License Agreement(BSD License)                                                                *
+ * Author: Thomas Klausner <tk@giga.or.at>                                                                *
+ *                                                                                                        *
+ * Copyright(c) 2019, Thomas Klausner                                                                     *
+ * All rights reserved.                                                                                   *
+ *                                                                                                        *
+ * Written under contract by Effortel Technologies SA, http://effortel.com/                               *
+ *                                                                                                        *
+ * Redistribution and use of this software in source and binary forms, with or without modification, are  *
+ * permitted provided that the following conditions are met:                                              *
+ *                                                                                                        *
+ * * Redistributions of source code must retain the above                                                 *
+ *   copyright notice, this list of conditions and the                                                    *
+ *   following disclaimer.                                                                                *
+ *                                                                                                        *
+ * * Redistributions in binary form must reproduce the above                                              *
+ *   copyright notice, this list of conditions and the                                                    *
+ *   following disclaimer in the documentation and/or other                                               *
+ *   materials provided with the distribution.                                                            *
+ *                                                                                                        *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT      *
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS    *
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
+ * TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF    *
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                                                             *
+ **********************************************************************************************************/
+
+/* This extension simply receives CCR and sends CCA after displaying the content, but does not store any data */
+
+#include <freeDiameter/extension.h>
+
+struct disp_hdl *ccr_handler_hdl;
+
+static int ccr_handler(struct msg ** msg, struct avp * avp, struct session * sess, void * data, enum disp_action * act)
+{
+	struct msg_hdr *hdr = NULL;
+
+	TRACE_ENTRY("%p %p %p %p", msg, avp, sess, act);
+
+	if(msg == NULL)
+		return EINVAL;
+
+	CHECK_FCT(fd_msg_hdr(*msg, &hdr));
+	if(hdr->msg_flags & CMD_FLAG_REQUEST) {
+		/* Request received, answer it */
+		struct msg *answer;
+		os0_t s;
+		size_t sl;
+
+		/* Create the answer message */
+		CHECK_FCT(fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0));
+		answer = *msg;
+		/* TODO copy/fill in AVPs in the answer */
+		/* TODO make result configurable (depending on an AVP?) */
+		CHECK_FCT(fd_msg_rescode_set(answer, "DIAMETER_SUCCESS", NULL, NULL, 1));
+
+		fd_log_notice("--------------Received the following Credit Control Request:--------------");
+
+		CHECK_FCT(fd_sess_getsid(sess, &s, &sl));
+		fd_log_notice("Session: %.*s",(int)sl, s);
+
+		fd_log_notice("----------------------------------------------------------------------");
+
+		/* Send the answer */
+		CHECK_FCT(fd_msg_send(msg, NULL, NULL));
+
+	} else {
+		/* We received an answer message, just discard it */
+		CHECK_FCT(fd_msg_free(*msg));
+		*msg = NULL;
+	}
+
+	return 0;
+}
+
+/* entry hook: register callback */
+static int cc_entry(char * conffile)
+{
+	struct disp_when data;
+
+	TRACE_ENTRY("%p", conffile);
+
+	memset(&data, 0, sizeof(data));
+
+        /* Advertise the support for the Diameter Credit Control application in the peer */
+        CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_APPLICATION, APPLICATION_BY_NAME, "Diameter Credit Control Application", &data.app, ENOENT) );
+        CHECK_FCT( fd_disp_app_support ( data.app, NULL, 1, 0 ) );
+
+        /* register handler for CCR */
+        CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Credit-Control-Request", &data.command, ENOENT) );
+        CHECK_FCT( fd_disp_register( ccr_handler, DISP_HOW_CC, &data, NULL, &ccr_handler_hdl ) );
+
+	return 0;
+}
+
+EXTENSION_ENTRY("test_cc", cc_entry);
--- a/freeDiameterd/main.c	Sun Jan 21 22:25:07 2018 +0800
+++ b/freeDiameterd/main.c	Sun May 12 23:15:40 2019 +0800
@@ -33,13 +33,18 @@
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.								 *
 *********************************************************************************************************/
 
+#if defined(__GLIBC__)
+#define _BSD_SOURCE /* for vsyslog */
+#endif
+
 #include <freeDiameter/freeDiameter-host.h>
 #include <freeDiameter/libfdcore.h>
 
 #include <signal.h>
 #include <getopt.h>
 #include <locale.h>
-
+#include <syslog.h>
+#include <stdarg.h>
 
 /* forward declarations */
 static int main_cmdline(int argc, char *argv[]);
@@ -55,56 +60,86 @@
 }
 
 
+static void syslog_logger(int loglevel, const char * format, va_list args)
+{
+	int level;
+
+	switch (loglevel) {
+	case FD_LOG_NOTICE:
+		level = LOG_NOTICE;
+		break;
+	case FD_LOG_ERROR:
+		level = LOG_ERR;
+		break;
+	case FD_LOG_FATAL:
+		level = LOG_CRIT;
+		break;
+	default:
+		/* fallthrough */
+	case FD_LOG_DEBUG:
+		/* some systems log LOG_DEBUG to a file; but
+		 * freeDiameter debug output is too verbose */
+		return;
+#if 0
+		level = LOG_DEBUG;
+		break;
+#endif
+	}
+
+	vsyslog(level, format, args);
+}
+
+
 /* freeDiameter starting point */
 int main(int argc, char * argv[])
 {
 	int ret;
 	sigset_t sig_all;
-	
+
 	/* Block all signals from the current thread and all its future children -- we will catch everything in catch_signals */
 	sigfillset(&sig_all);
 	ret = pthread_sigmask(SIG_BLOCK, &sig_all, NULL);
 	ASSERT(ret == 0);
-	
+
 	/* Parse the command-line */
 	ret = main_cmdline(argc, argv);
 	if (ret != 0) {
 		return ret;
 	}
-	
+
 	/* Initialize the core library */
 	ret = fd_core_initialize();
 	if (ret != 0) {
 		fprintf(stderr, "An error occurred during freeDiameter core library initialization.\n");
 		return ret;
 	}
-	
+
 	/* Set gnutls debug level ? */
 	if (gnutls_debug) {
 		gnutls_global_set_log_function((gnutls_log_func)fd_gnutls_debug);
 		gnutls_global_set_log_level (gnutls_debug);
 		TRACE_DEBUG(INFO, "Enabled GNUTLS debug at level %d", gnutls_debug);
 	}
-	
+
 	/* Parse the configuration file */
 	CHECK_FCT_DO( fd_core_parseconf(conffile), goto error );
-	
+
 	/* Start the servers */
 	CHECK_FCT_DO( fd_core_start(), goto error );
-	
+
 	/* Allow SIGINT and SIGTERM from this point to terminate the application */
 	CHECK_POSIX_DO( pthread_create(&signals_thr, NULL, catch_signals, NULL), goto error );
-	
+
 	TRACE_DEBUG(INFO, FD_PROJECT_BINARY " daemon initialized.");
 
 	/* Now, just wait for termination */
 	CHECK_FCT( fd_core_wait_shutdown_complete() );
-	
+
 	/* Just in case it was not the result of a signal, we cancel signals_thr */
 	fd_thr_term(&signals_thr);
-	
+
 	return 0;
-error:	
+error:
 	CHECK_FCT_DO( fd_core_shutdown(),  );
 	CHECK_FCT( fd_core_wait_shutdown_complete() );
 	fd_thr_term(&signals_thr);
@@ -137,7 +172,8 @@
 	printf( "  -h, --help             Print help and exit\n"
   		"  -V, --version          Print version and exit\n"
   		"  -c, --config=filename  Read configuration from this file instead of the \n"
-		"                           default location (" DEFAULT_CONF_PATH "/" FD_DEFAULT_CONF_FILENAME ").\n");
+		"                           default location (" DEFAULT_CONF_PATH "/" FD_DEFAULT_CONF_FILENAME ").\n"
+		"  -s, --syslog            Write log output to syslog (instead of stdout)\n");
  	printf( "\nDebug:\n"
   		"  These options are mostly useful for developers\n"
   		"  -l, --dbglocale         Set the locale for error messages\n"
@@ -155,11 +191,12 @@
 	int c;
 	int option_index = 0;
 	char * locale;
-	
+
       	struct option long_options[] = {
 		{ "help",	no_argument, 		NULL, 'h' },
 		{ "version",	no_argument, 		NULL, 'V' },
 		{ "config",	required_argument, 	NULL, 'c' },
+		{ "syslog",     no_argument,            NULL, 's' },
 		{ "debug",	no_argument, 		NULL, 'd' },
 		{ "quiet",	no_argument, 		NULL, 'q' },
 		{ "dbglocale",	optional_argument, 	NULL, 'l' },
@@ -168,13 +205,13 @@
 		{ "dbg_gnutls",	required_argument, 	NULL, 'g' },
 		{ NULL,		0, 			NULL, 0 }
 	};
-	
+
 	/* Loop on arguments */
 	while (1) {
-		c = getopt_long (argc, argv, "hVc:dql:f:F:g:", long_options, &option_index);
-		if (c == -1) 
+		c = getopt_long (argc, argv, "hVc:dql:f:F:g:s", long_options, &option_index);
+		if (c == -1)
 			break;	/* Exit from the loop.  */
-		
+
 		switch (c) {
 			case 'h':	/* Print help and exit.  */
 				main_help();
@@ -199,11 +236,11 @@
 					return EINVAL;
 				}
 				break;
-				
+
 			case 'd':	/* Increase verbosity of debug messages.  */
 				fd_g_debug_lvl--;
 				break;
-				
+
 			case 'f':	/* Full debug for the function with this name.  */
 				#ifdef DEBUG
 				fd_debug_one_function = optarg;
@@ -213,7 +250,7 @@
 				return EINVAL;
 				#endif /* DEBUG */
 				break;
-				
+
 			case 'F':	/* Full debug for the file with this name.  */
 				#ifdef DEBUG
 				fd_debug_one_file = basename(optarg);
@@ -223,15 +260,22 @@
 				return EINVAL;
 				#endif /* DEBUG */
 				break;
-				
+
 			case 'g':	/* Set a debug level and function for GNU TLS calls.  */
 				gnutls_debug = (int)atoi(optarg);
 				break;
-				
+
 			case 'q':	/* Decrease verbosity then remove debug messages.  */
 				fd_g_debug_lvl++;
 				break;
 
+			case 's':	/* Write log data using syslog(3) */
+				if (fd_log_handler_register(syslog_logger) != 0) {
+					fprintf(stderr, "Cannot initialize syslog logger\n");
+					return EINVAL;
+				}
+				break;
+
 			case '?':	/* Invalid option.  */
 				/* `getopt_long' already printed an error message.  */
 				fprintf(stderr, "getopt_long found an invalid character\n");
@@ -243,7 +287,7 @@
 				return EINVAL;
 		}
 	}
-		
+
 	return 0;
 }
 
@@ -252,29 +296,29 @@
 {
 	sigset_t ss;
 	fd_log_threadname ( "signals catcher" );
-	
+
 	sigemptyset(&ss);
-	
+
 	/* Signals that terminate the daemon */
 	sigaddset(&ss, SIGTERM);
 	sigaddset(&ss, SIGINT);
-	
+
 	/* Signals that send an event */
 	sigaddset(&ss, SIGUSR1);
 	sigaddset(&ss, SIGUSR2);
-	
+
 	/* We unblock all other signals, so that their default handler is used (such as SIGTSTP) */
 	CHECK_SYS_DO( pthread_sigmask( SIG_SETMASK, &ss, NULL ), goto out );
-	
+
 	/* Now loop on the reception of the signal */
 	while (1) {
 		int sig, *ps;
-		
+
 		/* Wait to receive the next signal */
 		CHECK_POSIX_DO( sigwait(&ss, &sig), break );
-		
+
 		TRACE_DEBUG(FULL, "Signal %d caught", sig);
-		
+
 		switch (sig) {
 			case SIGUSR1:
 			case SIGUSR2:
@@ -282,14 +326,14 @@
 				*ps = sig;
 				CHECK_FCT_DO( fd_event_send(fd_g_config->cnf_main_ev, FDEV_TRIGGER, sizeof(int), ps), goto out );
 				break;
-				
+
 			case SIGINT:
 			case SIGTERM:
 				CHECK_FCT_DO( fd_core_shutdown(), goto out );
 
 		}
 	}
-out:	
+out:
 	/* Better way to handle this ? */
 	ASSERT(0);
 	return NULL;
--- a/include/freeDiameter/CMakeLists.txt	Sun Jan 21 22:25:07 2018 +0800
+++ b/include/freeDiameter/CMakeLists.txt	Sun May 12 23:15:40 2019 +0800
@@ -17,7 +17,7 @@
 
 # In DEBUG mode, each log can contain pid, calling function and file for easy debug. Set to ON to display this information.
 OPTION(DEBUG_WITH_META "Show calling location in logs?" OFF)
-	
+
 # Create the absolute path for searching extensions
 SET(DEFAULT_EXTENSIONS_PATH ${CMAKE_INSTALL_PREFIX}/${INSTALL_EXTENSIONS_SUFFIX})
 
@@ -31,8 +31,8 @@
 # Note: if someone needs, we could also make the delay configurable here...
 OPTION(DISABLE_PEER_EXPIRY "Disable RFC3539 Peers Connections Expiration after inactivity?" OFF)
 
-# The following workaround increases compatibility with some implementations without breaking anything in freeDiameter, 
-# so it can be enabled without risk. We keep it disabled by default anyway for those people who use freeDiameter to check the 
+# The following workaround increases compatibility with some implementations without breaking anything in freeDiameter,
+# so it can be enabled without risk. We keep it disabled by default anyway for those people who use freeDiameter to check the
 # compliancy of their implementation with the Diameter RFC...
 OPTION(WORKAROUND_ACCEPT_INVALID_VSAI "Do not reject a CER/CEA with a Vendor-Specific-Application-Id AVP containing both Auth- and Acct- application AVPs?" OFF)
 
@@ -44,7 +44,7 @@
 INCLUDE (CheckLibraryExists)
 INCLUDE (CheckFunctionExists)
 INCLUDE (CheckIncludeFiles)
-INCLUDE (CheckSymbolExists) 
+INCLUDE (CheckSymbolExists)
 INCLUDE (CheckCSourceCompiles)
 INCLUDE (TestBigEndian)
 
@@ -133,7 +133,7 @@
 SET(SCTP_LIBRARIES ${SCTP_LIBRARIES} PARENT_SCOPE)
 
 # IDNA process: we use libidn from GNU (unless the function & header files are included in libc)
-IF(NOT DIAMID_IDNA_IGNORE  AND NOT DIAMID_IDNA_REJECT)
+IF(NOT DIAMID_IDNA_IGNORE AND NOT DIAMID_IDNA_REJECT)
 	FIND_PACKAGE(IDNA)
    	SET(CHECK_IDNA_SOURCE_CODE "
 		#include <idna.h>
@@ -159,20 +159,20 @@
 SET(GNUTLS_INCLUDE_DIR ${GNUTLS_INCLUDE_DIR} PARENT_SCOPE)
 SET(GNUTLS_LIBRARIES ${GNUTLS_LIBRARIES} PARENT_SCOPE)
 
-find_path(GCRYPT_INCLUDE_DIR NAMES gcrypt.h)
-If ( NOT GCRYPT_INCLUDE_DIR )
+FIND_PATH(GCRYPT_INCLUDE_DIR NAMES gcrypt.h)
+IF(NOT GCRYPT_INCLUDE_DIR)
 	MESSAGE(SEND_ERROR "Unable to find gcrypt.h, please install libgcrypt-dev or equivalent")
-Endif ( NOT GCRYPT_INCLUDE_DIR )
+ENDIF(NOT GCRYPT_INCLUDE_DIR)
 MARK_AS_ADVANCED(GCRYPT_INCLUDE_DIR)
 SET(GCRYPT_INCLUDE_DIR ${GCRYPT_INCLUDE_DIR} PARENT_SCOPE)
 
 # Also we need libgcrypt to... display its version :(
-find_library(GCRYPT_LIBRARY 
+FIND_LIBRARY(GCRYPT_LIBRARY
   NAMES gcrypt
 )
-If ( NOT GCRYPT_LIBRARY )
+IF(NOT GCRYPT_LIBRARY)
 	MESSAGE(SEND_ERROR "Unable to find libgcrypt, please install libgcrypt or equivalent")
-Endif ( NOT GCRYPT_LIBRARY )
+ENDIF(NOT GCRYPT_LIBRARY)
 SET(GCRYPT_LIBRARY ${GCRYPT_LIBRARY} PARENT_SCOPE)
 
 
@@ -228,7 +228,7 @@
 # And includes paths
 SET(LFDCORE_INCLUDES ${SCTP_INCLUDE_DIR} ${GNUTLS_INCLUDE_DIR} ${GCRYPT_INCLUDE_DIR} PARENT_SCOPE)
 # And dependencies
-SET(LFDCORE_LINK_INTERFACES "" PARENT_SCOPE) 
+SET(LFDCORE_LINK_INTERFACES "" PARENT_SCOPE)
 		# We don't force other libraries, the programs will link with what it needs
                 # (such as libgnutls if it uses GNUTLS_DEBUG() macro
 		# or libfdproto if it uses some of its interfaces directly)
--- a/include/freeDiameter/libfdproto.h	Sun Jan 21 22:25:07 2018 +0800
+++ b/include/freeDiameter/libfdproto.h	Sun May 12 23:15:40 2019 +0800
@@ -800,7 +800,7 @@
 #define fd_os_cmp(_o1, _l1, _o2, _l2)  fd_os_cmp_int((os0_t)(_o1), _l1, (os0_t)(_o2), _l2)
 
 /* A roughly case-insensitive variant, which actually only compares ASCII chars (0-127) in a case-insentitive maneer 
-  -- it does not support locales where a lowercase letter uses more space than upper case, such as ß -> ss
+  -- it does not support locales where a lowercase letter uses more space than upper case, such as ß -> ss
  It is slower than fd_os_cmp.
  Note that the result is NOT the same as strcasecmp !!!
  
--- a/libfdcore/sctp.c	Sun Jan 21 22:25:07 2018 +0800
+++ b/libfdcore/sctp.c	Sun May 12 23:15:40 2019 +0800
@@ -400,7 +400,7 @@
 			fd_log_debug( "       	     sctp_peer_error_event       : %hhu", event.sctp_peer_error_event);
 			fd_log_debug( "       	     sctp_shutdown_event	 : %hhu", event.sctp_shutdown_event);
 			fd_log_debug( "       	     sctp_partial_delivery_event : %hhu", event.sctp_partial_delivery_event);
-			fd_log_debug( "       	     sctp_adaptation_layer_event : %hhu", event.sctp_adaptation_layer_event);
+			// fd_log_debug( "       	     sctp_adaptation_layer_event : %hhu", event.sctp_adaptation_layer_event);
 			// fd_log_debug( "             sctp_authentication_event    : %hhu", event.sctp_authentication_event);
 		}
 	}
--- a/libfdcore/sctp3436.c	Sun Jan 21 22:25:07 2018 +0800
+++ b/libfdcore/sctp3436.c	Sun May 12 23:15:40 2019 +0800
@@ -50,9 +50,9 @@
  - the pull function retrieves the data from the fifo queue corresponding to a stream #.
  - the push function sends the data on a certain stream.
  We also have a demux thread that reads the socket and store received data in the appropriate fifo
- 
+
  We have one gnutls_session per stream pair, and as many threads that read the gnutls records and save incoming data to the target queue.
- 
+
 This complexity is required because we cannot read a socket for a given stream only; we can only get the next message and find its stream.
 */
 
@@ -70,21 +70,21 @@
 	size_t    bufsz;
 	int	  event;
 	uint16_t  strid;
-	
+
 	TRACE_ENTRY("%p", arg);
 	CHECK_PARAMS_DO(conn && (conn->cc_socket > 0), goto out);
-	
+
 	/* Set the thread name */
 	{
-		char buf[48];
+		char buf[100];
 		snprintf(buf, sizeof(buf), "Demuxer (%d:%s)", conn->cc_socket, conn->cc_remid);
 		fd_log_threadname ( buf );
 	}
-	
+
 	ASSERT( conn->cc_proto == IPPROTO_SCTP );
 	ASSERT( fd_cnx_target_queue(conn) );
 	ASSERT( conn->cc_sctp3436_data.array );
-	
+
 	do {
 		CHECK_FCT_DO( fd_sctp_recvmeta(conn, &strid, &buf, &bufsz, &event), goto fatal );
 		switch (event) {
@@ -97,25 +97,25 @@
 					free(buf);
 				}
 				break;
-				
+
 			case FDEVP_CNX_EP_CHANGE:
 				/* Send this event to the target queue */
 				CHECK_FCT_DO( fd_event_send( fd_cnx_target_queue(conn), event, bufsz, buf), goto fatal );
 				break;
-			
+
 			case FDEVP_CNX_ERROR:
 				goto out;
-				
+
 			case FDEVP_CNX_SHUTDOWN:
 				/* Just ignore the notification for now, we will get another error later anyway */
 				continue;
-				
+
 			default:
 				goto fatal;
 		}
-		
+
 	} while (conn->cc_loop);
-	
+
 out:
 	/* Signal termination of the connection to all decipher threads */
 	for (strid = 0; strid < conn->cc_sctp_para.pairs; strid++) {
@@ -124,9 +124,9 @@
 		}
 	}
 	fd_cnx_markerror(conn);
-	TRACE_DEBUG(FULL, "Thread terminated");	
+	TRACE_DEBUG(FULL, "Thread terminated");
 	return NULL;
-	
+
 fatal:
 	/* An unrecoverable error occurred, stop the daemon */
 	CHECK_FCT_DO(fd_core_shutdown(), );
@@ -138,24 +138,24 @@
 {
 	struct sctp3436_ctx * ctx = arg;
 	struct cnxctx 	 *cnx;
-	
+
 	TRACE_ENTRY("%p", arg);
 	CHECK_PARAMS_DO(ctx && ctx->raw_recv && ctx->parent, goto error);
 	cnx = ctx->parent;
 	ASSERT( fd_cnx_target_queue(cnx) );
-	
+
 	/* Set the thread name */
 	{
-		char buf[48];
+		char buf[100];
 		snprintf(buf, sizeof(buf), "Decipher (%hu@%d:%s)", ctx->strid, cnx->cc_socket, cnx->cc_remid);
 		fd_log_threadname ( buf );
 	}
-	
+
 	/* The next function loops while there is no error */
 	CHECK_FCT_DO(fd_tls_rcvthr_core(cnx, ctx->strid ? ctx->session : cnx->cc_tls_para.session), /* continue */);
 error:
 	fd_cnx_markerror(cnx);
-	TRACE_DEBUG(FULL, "Thread terminated");	
+	TRACE_DEBUG(FULL, "Thread terminated");
 	return NULL;
 }
 
@@ -170,12 +170,12 @@
 	struct sctp3436_ctx * ctx = (struct sctp3436_ctx *) tr;
 	struct timespec tsstore, *ts = NULL;
 	int ret;
-	
+
 	TRACE_ENTRY("%p %d", tr, ms);
-	
+
 	if (ctx->partial.buf)
 		return 1; /* data is already available for pull */
-	
+
 	if (ms) {
 		CHECK_SYS_DO(  clock_gettime(CLOCK_REALTIME, &tsstore),  return -1  );
 		tsstore.tv_nsec += (long)ms * 1000000;
@@ -183,13 +183,13 @@
 		tsstore.tv_nsec %= 1000000000L;
 		ts = &tsstore;
 	}
-	
+
 	ret = fd_fifo_select ( ctx->raw_recv, ts );
 	if (ret < 0) {
 		errno = -ret;
 		ret = -1;
 	}
-		
+
 	return ret;
 }
 #endif /* GNUTLS_VERSION_300 */
@@ -200,23 +200,23 @@
 {
 	struct sctp3436_ctx * ctx = (struct sctp3436_ctx *) tr;
 	struct iovec iov;
-	
+
 	TRACE_ENTRY("%p %p %zd", tr, data, len);
 	CHECK_PARAMS_DO( tr && data, { errno = EINVAL; return -1; } );
-	
+
 	iov.iov_base = (void *)data;
 	iov.iov_len  = len;
-	
+
 	return fd_sctp_sendstrv(ctx->parent, ctx->strid, &iov, 1);
 }
 #else /*  GNUTLS_VERSION_212 */
 static ssize_t sctp3436_pushv(gnutls_transport_ptr_t tr, const giovec_t * iov, int iovcnt)
 {
 	struct sctp3436_ctx * ctx = (struct sctp3436_ctx *) tr;
-	
+
 	TRACE_ENTRY("%p %p %d", tr, iov, iovcnt);
 	CHECK_PARAMS_DO( tr && iov, { errno = EINVAL; return -1; } );
-	
+
 	return fd_sctp_sendstrv(ctx->parent, ctx->strid, (const struct iovec *)iov, iovcnt);
 }
 #endif /*  GNUTLS_VERSION_212 */
@@ -227,10 +227,10 @@
 	struct sctp3436_ctx * ctx = (struct sctp3436_ctx *) tr;
 	size_t pulled = 0;
 	int emptied;
-	
+
 	TRACE_ENTRY("%p %p %zd", tr, buf, len);
 	CHECK_PARAMS_DO( tr && buf, { errno = EINVAL; goto error; } );
-	
+
 	/* If we don't have data available now, pull new message from the fifo -- this is blocking (until the queue is destroyed) */
 	if (!ctx->partial.buf) {
 		int ev;
@@ -240,7 +240,7 @@
 			return -1;
 		}
 	}
-		
+
 	pulled = ctx->partial.bufsz - ctx->partial.offset;
 	if (pulled <= len) {
 		emptied = 1;
@@ -263,7 +263,7 @@
 
 	/* We are done */
 	return pulled;
-	
+
 error:
 	gnutls_transport_set_errno (ctx->session, errno);
 	return -1;
@@ -277,7 +277,7 @@
 {
 	/* Set the transport pointer passed to push & pull callbacks */
 	GNUTLS_TRACE( gnutls_transport_set_ptr( session, (gnutls_transport_ptr_t) ctx ) );
-	
+
 	/* Reset the low water value, since we don't use sockets */
 #ifndef GNUTLS_VERSION_300
 	/* starting version 2.12, this call is not needed */
@@ -286,7 +286,7 @@
 	/* but in 3.0 we have to provide the pull_timeout callback */
 	GNUTLS_TRACE( gnutls_transport_set_pull_timeout_function( session, sctp3436_pull_timeout ) );
 #endif /* GNUTLS_VERSION_300 */
-	
+
 	/* Set the push and pull callbacks */
 	GNUTLS_TRACE( gnutls_transport_set_pull_function(session, sctp3436_pull) );
 #ifndef GNUTLS_VERSION_212
@@ -324,14 +324,14 @@
 {
 	TRACE_ENTRY("%p", conn);
 	CHECK_PARAMS( conn && !conn->cc_sctp3436_data.sess_store );
-	
+
 	CHECK_MALLOC( conn->cc_sctp3436_data.sess_store = malloc(sizeof(struct sr_store)) );
 	memset(conn->cc_sctp3436_data.sess_store, 0, sizeof(struct sr_store));
-	
+
 	fd_list_init(&conn->cc_sctp3436_data.sess_store->list, NULL);
 	CHECK_POSIX( pthread_rwlock_init(&conn->cc_sctp3436_data.sess_store->lock, NULL) );
 	conn->cc_sctp3436_data.sess_store->parent = conn;
-	
+
 	return 0;
 }
 
@@ -341,12 +341,12 @@
 	/* Del all list entries */
 	TRACE_ENTRY("%p", conn);
 	CHECK_PARAMS_DO( conn, return );
-	
+
 	if (!conn->cc_sctp3436_data.sess_store)
 		return;
-	
+
 	CHECK_POSIX_DO( pthread_rwlock_destroy(&conn->cc_sctp3436_data.sess_store->lock), /* continue */ );
-	
+
 	while (!FD_IS_LIST_EMPTY(&conn->cc_sctp3436_data.sess_store->list)) {
 		struct sr_data * sr = (struct sr_data *) conn->cc_sctp3436_data.sess_store->list.next;
 		fd_list_unlink( &sr->chain );
@@ -354,7 +354,7 @@
 		free(sr->data.data);
 		free(sr);
 	}
-	
+
 	free(conn->cc_sctp3436_data.sess_store);
 	conn->cc_sctp3436_data.sess_store = NULL;
 	return;
@@ -365,21 +365,21 @@
 {
 	struct fd_list * ret;
 	*match = 0;
-	
+
 	for (ret = sto->list.next; ret != &sto->list; ret = ret->next) {
 		int cmp = 0;
 		struct sr_data * sr = (struct sr_data *)ret;
-		
+
 		cmp = fd_os_cmp(key.data, key.size, sr->key.data, sr->key.size);
 		if (cmp > 0)
 			continue;
-		
+
 		if (cmp == 0)
 			*match = 1;
-		
+
 		break;
 	}
-	
+
 	return ret;
 }
 
@@ -391,31 +391,31 @@
 	struct sr_data * sr;
 	int match = 0;
 	int ret = 0;
-	
+
 	TRACE_DEBUG( GNUTLS_DBG_LEVEL, "GNUTLS Callback: %s", __PRETTY_FUNCTION__ );
 	CHECK_PARAMS_DO( sto && key.data && data.data, return -1 );
-	
+
 	CHECK_POSIX_DO( pthread_rwlock_wrlock(&sto->lock), return -1 );
 	TRACE_BUFFER(FD_LOG_DEBUG, GNUTLS_DBG_LEVEL, "Session store [key ", key.data, key.size, "]");
-	
+
 	li = find_or_next(sto, key, &match);
 	if (match) {
 		sr = (struct sr_data *)li;
-		
+
 		/* Check the data is the same */
 		if ((data.size != sr->data.size) || memcmp(data.data, sr->data.data, data.size)) {
 			TRACE_DEBUG(INFO, "GnuTLS tried to store a session with same key and different data!");
 			TRACE_BUFFER(FD_LOG_DEBUG, INFO, "Session store [key ", key.data, key.size, "]");
 			TRACE_BUFFER(FD_LOG_DEBUG, INFO, "  -- old data [", sr->data.data, sr->data.size, "]");
 			TRACE_BUFFER(FD_LOG_DEBUG, INFO, "  -- new data [", data.data, data.size, "]");
-			
+
 			ret = -1;
 		} else {
 			TRACE_DEBUG(GNUTLS_DBG_LEVEL, "GnuTLS tried to store a session with same key and same data, skipped.");
 		}
 		goto out;
 	}
-	
+
 	/* Create a new entry */
 	CHECK_MALLOC_DO( sr = malloc(sizeof(struct sr_data)), { ret = -1; goto out; } );
 	memset(sr, 0, sizeof(struct sr_data));
@@ -429,11 +429,11 @@
 	CHECK_MALLOC_DO( sr->data.data = malloc(data.size), { ret = -1; goto out; } );
 	sr->data.size = data.size;
 	memcpy(sr->data.data, data.data, data.size);
-	
+
 	/* Save this new entry in the list, we are done */
 	fd_list_insert_before(li, &sr->chain);
 
-out:	
+out:
 	CHECK_POSIX_DO( pthread_rwlock_unlock(&sto->lock), return -1 );
 	return ret;
 }
@@ -445,17 +445,17 @@
 	struct sr_data * sr;
 	int match = 0;
 	int ret = 0;
-	
+
 	TRACE_DEBUG( GNUTLS_DBG_LEVEL, "GNUTLS Callback: %s", __PRETTY_FUNCTION__ );
 	CHECK_PARAMS_DO( sto && key.data, return -1 );
-	
+
 	CHECK_POSIX_DO( pthread_rwlock_wrlock(&sto->lock), return -1 );
 	TRACE_BUFFER(FD_LOG_DEBUG, GNUTLS_DBG_LEVEL, "Session delete [key ", key.data, key.size, "]");
-	
+
 	li = find_or_next(sto, key, &match);
 	if (match) {
 		sr = (struct sr_data *)li;
-		
+
 		/* Destroy this data */
 		fd_list_unlink(li);
 		free(sr->key.data);
@@ -465,7 +465,7 @@
 		/* It was not found */
 		ret = -1;
 	}
-	
+
 	CHECK_POSIX_DO( pthread_rwlock_unlock(&sto->lock), return -1 );
 	return ret;
 }
@@ -484,7 +484,7 @@
 
 	CHECK_POSIX_DO( pthread_rwlock_rdlock(&sto->lock), return error );
 	TRACE_BUFFER(FD_LOG_DEBUG, GNUTLS_DBG_LEVEL, "Session fetch [key ", key.data, key.size, "]");
-	
+
 	li = find_or_next(sto, key, &match);
 	if (match) {
 		sr = (struct sr_data *)li;
@@ -492,7 +492,7 @@
 		res.size = sr->data.size;
 		memcpy(res.data, sr->data.data, res.size);
 	}
-out:	
+out:
 	TRACE_DEBUG(GNUTLS_DBG_LEVEL, "Fetched (%p, %d) from store %p", res.data, res.size, sto);
 	CHECK_POSIX_DO( pthread_rwlock_unlock(&sto->lock), return error);
 	return res;
@@ -502,12 +502,12 @@
 static void set_resume_callbacks(gnutls_session_t session, struct cnxctx * conn)
 {
 	TRACE_ENTRY("%p", conn);
-	
+
 	GNUTLS_TRACE( gnutls_db_set_retrieve_function(session, sr_fetch));
 	GNUTLS_TRACE( gnutls_db_set_remove_function  (session, sr_remove));
 	GNUTLS_TRACE( gnutls_db_set_store_function   (session, sr_store));
 	GNUTLS_TRACE( gnutls_db_set_ptr              (session, conn->cc_sctp3436_data.sess_store));
-	
+
 	return;
 }
 
@@ -516,20 +516,20 @@
 {
 	struct sctp3436_ctx * ctx = (struct sctp3436_ctx *) arg;
 	int resumed;
-	
+
 	TRACE_ENTRY("%p", arg);
-	
+
 	/* Set the thread name */
 	{
 		char buf[48];
 		snprintf(buf, sizeof(buf), "Handshake resume (%hu@%d)", ctx->strid, ctx->parent->cc_socket);
 		fd_log_threadname ( buf );
 	}
-	
+
 	TRACE_DEBUG(FULL, "Starting TLS resumed handshake on stream %hu", ctx->strid);
 
 	CHECK_GNUTLS_DO( gnutls_handshake( ctx->session ), return NULL);
-			
+
 	GNUTLS_TRACE( resumed = gnutls_session_is_resumed(ctx->session) );
 	#ifndef GNUTLS_VERSION_300
 	if (!resumed) {
@@ -544,7 +544,7 @@
 			fd_log_debug("Session was NOT resumed on stream %hu  (full handshake) (conn: '%s')", ctx->strid, fd_cnx_getid(ctx->parent));
 		}
 	}
-			
+
 	/* Finished, OK */
 	return arg;
 }
@@ -558,10 +558,10 @@
 int fd_sctp3436_init(struct cnxctx * conn)
 {
 	uint16_t i;
-	
+
 	TRACE_ENTRY("%p", conn);
 	CHECK_PARAMS( conn && (conn->cc_sctp_para.pairs > 1) && (!conn->cc_sctp3436_data.array) );
-	
+
 	/* First, alloc the array and initialize the non-TLS data */
 	CHECK_MALLOC( conn->cc_sctp3436_data.array = calloc(conn->cc_sctp_para.pairs, sizeof(struct sctp3436_ctx))  );
 	for (i = 0; i < conn->cc_sctp_para.pairs; i++) {
@@ -569,23 +569,23 @@
 		conn->cc_sctp3436_data.array[i].strid  = i;
 		CHECK_FCT( fd_fifo_new(&conn->cc_sctp3436_data.array[i].raw_recv, 10) );
 	}
-	
+
 	/* Set push/pull functions in the master session, using fifo in array[0] */
 	set_sess_transport(conn->cc_tls_para.session, &conn->cc_sctp3436_data.array[0]);
-	
+
 	/* For server side, we also initialize the resuming capabilities */
 	if (conn->cc_tls_para.mode == GNUTLS_SERVER) {
-		
+
 		/* Prepare the store for sessions data */
 		CHECK_FCT( store_init(conn) );
-		
+
 		/* Set the callbacks for resuming in the master session */
 		set_resume_callbacks(conn->cc_tls_para.session, conn);
 	}
 
 	/* Start the demux thread */
 	CHECK_POSIX( pthread_create( &conn->cc_rcvthr, NULL, demuxer, conn ) );
-	
+
 	return 0;
 }
 
@@ -595,13 +595,13 @@
 	uint16_t i;
 	int errors = 0;
 	gnutls_datum_t 	master_data;
-	
+
 	TRACE_ENTRY("%p %p", conn, priority);
 	CHECK_PARAMS( conn && (conn->cc_sctp_para.pairs > 1) && conn->cc_sctp3436_data.array );
 
 	/* Server side: we set all the parameters, the resume callback will take care of resuming the session */
 	/* Client side: we duplicate the parameters of the master session, then set the transport pointer */
-	
+
 	/* For client side, retrieve the master session parameters */
 	if (conn->cc_tls_para.mode == GNUTLS_CLIENT) {
 		CHECK_GNUTLS_DO( gnutls_session_get_data2(conn->cc_tls_para.session, &master_data), return ENOMEM );
@@ -613,12 +613,12 @@
 			TRACE_BUFFER(FD_LOG_DEBUG, GNUTLS_DBG_LEVEL, "Master session id: [", id, ids, "]");
 		}
 	}
-	
+
 	/* Initialize the session objects and start the handshake in a separate thread */
 	for (i = 1; i < conn->cc_sctp_para.pairs; i++) {
 		/* Set credentials and priority */
 		CHECK_FCT( fd_tls_prepare(&conn->cc_sctp3436_data.array[i].session, conn->cc_tls_para.mode, 0, priority, alt_creds) );
-		
+
 		/* additional initialization for gnutls 3.x */
 		#ifdef GNUTLS_VERSION_300
 			/* the verify function has already been set in the global initialization in config.c */
@@ -643,19 +643,19 @@
 		} else {
 			set_resume_callbacks(conn->cc_sctp3436_data.array[i].session, conn);
 		}
-		
+
 		/* Set transport parameters */
 		set_sess_transport(conn->cc_sctp3436_data.array[i].session, &conn->cc_sctp3436_data.array[i]);
-		
+
 		/* Start the handshake thread */
 		CHECK_POSIX( pthread_create( &conn->cc_sctp3436_data.array[i].thr, NULL, handshake_resume_th, &conn->cc_sctp3436_data.array[i] ) );
 	}
-	
+
 	/* We can now release the memory of master session data if any */
 	if (conn->cc_tls_para.mode == GNUTLS_CLIENT) {
 		GNUTLS_TRACE( gnutls_free(master_data.data) );
 	}
-	
+
 	/* Now wait for all handshakes to finish */
 	for (i = 1; i < conn->cc_sctp_para.pairs; i++) {
 		void * ret;
@@ -665,13 +665,13 @@
 			errors++; /* Handshake failed on this stream */
 		}
 	}
-	
+
 	if (errors) {
 		TRACE_DEBUG(INFO, "Handshake failed on %d/%hd stream pairs", errors, conn->cc_sctp_para.pairs);
 		fd_cnx_markerror(conn);
 		return ENOTCONN;
 	}
-	
+
 	return 0;
 }
 
@@ -679,10 +679,10 @@
 int fd_sctp3436_startthreads(struct cnxctx * conn, int others)
 {
 	uint16_t i;
-	
+
 	TRACE_ENTRY("%p", conn);
 	CHECK_PARAMS( conn && conn->cc_sctp3436_data.array );
-	
+
 	if (others) {
 		for (i = 1; i < conn->cc_sctp_para.pairs; i++) {
 
@@ -699,9 +699,9 @@
 void fd_sctp3436_bye(struct cnxctx * conn)
 {
 	uint16_t i;
-	
+
 	CHECK_PARAMS_DO( conn && conn->cc_sctp3436_data.array, return );
-	
+
 	/* End all TLS sessions, in series (not as efficient as paralel, but simpler) */
 	for (i = 1; i < conn->cc_sctp_para.pairs; i++) {
 		if ( ! fd_cnx_teststate(conn, CC_STATUS_ERROR)) {
@@ -714,10 +714,10 @@
 void fd_sctp3436_waitthreadsterm(struct cnxctx * conn)
 {
 	uint16_t i;
-	
+
 	TRACE_ENTRY("%p", conn);
 	CHECK_PARAMS_DO( conn && conn->cc_sctp3436_data.array, return );
-	
+
 	for (i = 0; i < conn->cc_sctp_para.pairs; i++) {
 		if (conn->cc_sctp3436_data.array[i].thr != (pthread_t)NULL) {
 			CHECK_POSIX_DO( pthread_join(conn->cc_sctp3436_data.array[i].thr, NULL), /* continue */ );
@@ -731,10 +731,10 @@
 void fd_sctp3436_gnutls_deinit_others(struct cnxctx * conn)
 {
 	uint16_t i;
-	
+
 	TRACE_ENTRY("%p", conn);
 	CHECK_PARAMS_DO( conn && conn->cc_sctp3436_data.array, return );
-	
+
 	for (i = 1; i < conn->cc_sctp_para.pairs; i++) {
 		if (conn->cc_sctp3436_data.array[i].session) {
 			GNUTLS_TRACE( gnutls_deinit(conn->cc_sctp3436_data.array[i].session) );
@@ -748,10 +748,10 @@
 void fd_sctp3436_stopthreads(struct cnxctx * conn)
 {
 	uint16_t i;
-	
+
 	TRACE_ENTRY("%p", conn);
 	CHECK_PARAMS_DO( conn && conn->cc_sctp3436_data.array, return );
-	
+
 	for (i = 0; i < conn->cc_sctp_para.pairs; i++) {
 		CHECK_FCT_DO( fd_thr_term(&conn->cc_sctp3436_data.array[i].thr), /* continue */ );
 	}
@@ -762,15 +762,15 @@
 void fd_sctp3436_destroy(struct cnxctx * conn)
 {
 	uint16_t i;
-	
+
 	CHECK_PARAMS_DO( conn && conn->cc_sctp3436_data.array, return );
-	
+
 	/* Terminate all receiving threads in case we did not do it yet */
 	fd_sctp3436_stopthreads(conn);
-	
+
 	/* Now, stop the demux thread */
 	CHECK_FCT_DO( fd_thr_term(&conn->cc_rcvthr), /* continue */ );
-	
+
 	/* Free remaining data in the array */
 	for (i = 0; i < conn->cc_sctp_para.pairs; i++) {
 		if (conn->cc_sctp3436_data.array[i].raw_recv)
@@ -781,13 +781,13 @@
 			conn->cc_sctp3436_data.array[i].session = NULL;
 		}
 	}
-	
+
 	/* Free the array itself now */
 	free(conn->cc_sctp3436_data.array);
 	conn->cc_sctp3436_data.array = NULL;
-	
+
 	/* Delete the store of sessions */
 	store_destroy(conn);
-	
+
 	return ;
 }
"Welcome to our mercurial repository"